PHP,Smarty:检查不同文件夹中的模板

时间:2009-07-28 12:15:19

标签: php templates smarty

对于我们最新的项目,我们使用Django,其中可以指定文件夹列表,搜索模板,例如,名称为example.html。现在,我们切换回Smarty(PHP)并且想知道,如果有类似的话。

Smarty版本:可以是最先进的。

行为:

  1. 使用一系列文件夹提供Smarty。
  2. 使用$smarty->display(){include}
  3. 调用模板
  4. Smarty搜索文件夹并获取与名称匹配的第一个模板。
  5. 我看了Smarty resources,但是对于这个任务看起来有些过分,而且这个主题的文档有点稀疏。有什么想法可以做到吗?

    另一个问题是,文件夹列表可能会根据请求的URL而更改。任何想法如何告诉Smarty,使用哪个编译模板?

    干杯,

4 个答案:

答案 0 :(得分:4)

在Smarty.class.php中,方法Smarty::_parse_resource_name()

foreach ((array)$params['resource_base_path'] as $_curr_path) {
    $_fullpath = $_curr_path . DIRECTORY_SEPARATOR . $params['resource_name'];
    if (file_exists($_fullpath) && is_file($_fullpath)) {
        $params['resource_name'] = $_fullpath;
        return true;
    }
    // didn't find the file, try include_path
    $_params = array('file_path' => $_fullpath);
    require_once(SMARTY_CORE_DIR . 'core.get_include_path.php');
    if(smarty_core_get_include_path($_params, $this)) {
        $params['resource_name'] = $_params['new_file_path'];
        return true;
    }
}

$params['resource_base_path']默认为$this->template_dir中的Smarty::_fetch_resource_info()

所以看起来你可以将$smarty->template_dir设置为要查看的目录数组。请注意,这不会是递归的。这必须是未记录的功能。

答案 1 :(得分:2)

我知道这个问题被问到已经有一段时间了,但是为了记录,我想指出一个Smarty的特征,我认为OP会做什么。以下是我的应用程序代码的一部分。

基本上它的作用是首先在/ext/templates中查找模板。如果它没有找到它,它将使用/base/templates中的那个。我的代码只需要一个回退,但可以轻松添加更多代码。

class View extends Smarty {
    function __construct() {
        parent::Smarty();

        $this->template_dir = LOCAL_APP_ROOT.'/ext/templates';
        $this->compile_dir = LOCAL_APP_ROOT.'/cache/compile';

        $this->default_template_handler_func = '__default_template_handler';
    }
}


function __default_template_handler($resource_type, $resource_name, &$template_source, &$template_timestamp, &$smarty_obj) {
    if ($resource_type == 'file') {
        if (!is_readable($resource_name)) {
            $defaultPath = LOCAL_APP_ROOT."/base/templates/$resource_name";
            if (file_exists($defaultPath)) {
                $template_source = file_get_contents($defaultPath);
                $template_timestamp = filemtime($defaultPath);
                return true;
            }
        }
    }
    return false;
}

答案 2 :(得分:1)

Smarty template_dir值可以是目录数组。 Smarty将按顺序遍历目录,直到找到匹配的模板。

答案 3 :(得分:0)

不幸的是,Smarty旨在使用单个模板目录(Smarty对象的template_dir属性)。但是,您可以在运行时更改此设置,这样可以获得您正在寻找的一些效果。