Как заставить smarty изменить имя ресурса (шаблона) на основе мобильного обнаружения

Я могу обнаружить мобильный. Когда мобильный телефон обнаружен, я устанавливаю константу 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 не позволит мне.


person danjfoley    schedule 10.10.2014    source источник


Ответы (1)


Я считаю, что нашел ответ. Переопределите функции отображения и выборки smarty, вызвав шаблон с кешем m или d и скомпилировав идентификатор... вот так:

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 для мобильных устройств без потребность в дублировании.

person danjfoley    schedule 10.10.2014