tp官方使用的批量加载需要固定常量,或者固定的某个或多个变量,例:

{include file="$html_a,$html_b" /}
{include file="/view/book/a.html,/view/book/a.html" /}

tp官方代码中,标签解析函数(\thinkphp\library\think\Template.php):

/**
 * 分析加载的模板文件并读取内容 支持多个模板文件读取
 * @access private
 * @param  string $templateName 模板文件名
 * @return string
 */
private function parseTemplateName($templateName)
{
    $array    = explode(',', $templateName);
    $parseStr = '';
    foreach ($array as $templateName) {
        if (empty($templateName)) {
            continue;
        }
        if (0 === strpos($templateName, '$')) {
            //支持加载变量文件名
            $templateName = $this->get(substr($templateName, 1));
        }
        $template = $this->parseTemplateFile($templateName);
        if ($template) {
            // 获取模板文件内容
            $parseStr .= file_get_contents($template);
        }
    }
    return $parseStr;
}

我们可以看到,官方函数中,先把多个参数解释成数组再进行下一步加载。即使加入了变量参数,仍导致我们要事先确立好需要加载的文件数量。

优化:

/**
 * 分析加载的模板文件并读取内容 支持多个模板文件读取
 * @access private
 * @param  string $templateName 模板文件名
 * @return string
 */
private function parseTemplateName($templateName)
{
    if (0 === strpos($templateName, '$')) {
        //支持加载变量文件名
        $templateName = $this->get(substr($templateName, 1));
    }

    $array    = explode(',', $templateName);
    $parseStr = '';
    foreach ($array as $templateName) {
        if (empty($templateName)) {
            continue;
        }
        $template = $this->parseTemplateFile($templateName);
        if ($template) {
            // 获取模板文件内容
            $parseStr .= file_get_contents($template);
        }
    }
    return $parseStr;
}

把官方的自带变量识辨解析函数提前到循环外解析,这样你可在控制器中自定义你所需要加载的文件数量以及各自的文件路径。

最后,官方的模板解析函数传递的变量无法太过复杂,控制器事先把数组转换成排列字符串即可。