对于我们最新的项目,我们使用Django,其中可以指定文件夹列表,搜索模板,例如,名称为example.html
。现在,我们切换回Smarty(PHP)并且想知道,如果有类似的话。
Smarty版本:可以是最先进的。
行为:
$smarty->display()
或{include}
我看了Smarty resources,但是对于这个任务看起来有些过分,而且这个主题的文档有点稀疏。有什么想法可以做到吗?
另一个问题是,文件夹列表可能会根据请求的URL而更改。任何想法如何告诉Smarty,使用哪个编译模板?
干杯,
答案 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
属性)。但是,您可以在运行时更改此设置,这样可以获得您正在寻找的一些效果。