如何根据移动检测制作智能更改资源(模板)名称

时间:2014-10-10 02:59:26

标签: php smarty smarty3

我能够检测到移动设备。当检测到移动设备时,我设置常量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不会让我。

1 个答案:

答案 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模板,无需复制。