我能够检测到移动设备。当检测到移动设备时,我设置常量SD_IS_MOBILE = true。
在我的脚本中,我会显示一个聪明的模板,如下所示:
$smarty->display("page.tpl.html");
在模板中直接存在2个模板文件:
page.tpl.html.d
page.tpl.html.m
d用于桌面,m更具移动性。
Smarty找不到我要求的模板(这是我期望的),然后它使用我的default_template_handler函数来加载正确的模板。
function __default_template_handler($resource_type, $resource_name, &$template_source, &$template_timestamp, $smarty_obj) {
if ($resource_type == 'file') {
if (SD_IS_MOBILE && file_exists(SD_TEMPLATE_ROOT.$resource_name.".m")) {
$template_source = file_get_contents(SD_TEMPLATE_ROOT.$resource_name.".m");
$template_timestamp = filemtime(SD_TEMPLATE_ROOT.$resource_name.".m");
$resource_name = $resource_name.".m";
return true;
} elseif (file_exists(SD_TEMPLATE_ROOT.$resource_name.".d")) {
$template_source = file_get_contents(SD_TEMPLATE_ROOT.$resource_name.".d");
$template_timestamp = filemtime(SD_TEMPLATE_ROOT.$resource_name.".d");
$resource_name = $resource_name.".d";
return true;
}
return false;
}
}
问题是smarty使用原始名称“page.html.tpl”进行编译。如何使用“.m”和“.d”扩展编译它?我以为我可以更改default_template_handler函数资源类型参数来传递值并更改资源名称(正如我上面所做的那样),但smarty不会让我。
答案 0 :(得分:0)
我相信我找到了答案。覆盖smarty的显示和获取功能,使用m或d缓存和complile id调用模板..像这样:
function display($var) {
if (SD_IS_MOBILE) {
parent::display($var, "m","m");
} else {
parent::display($var, "d","d");
}
}
function fetch($var) {
if (SD_IS_MOBILE) {
return parent::fetch($var, "m","m");
} else {
return parent::fetch($var, "d","d");
}
}
我还没有使用此代码运行整个应用程序..但它似乎工作到目前为止..并结合我上面的默认模板处理程序,我相信我已经找到了一种独特的方式来处理移动smarty模板,无需复制。