2014-10-10 60 views
0

我能夠檢測到移動。當檢測到移動時,我將SD_IS_MOBILE設置爲true。如何使基於移動檢測的smarty更改資源(模板)名稱

在我的腳本我顯示smarty的模板,如下所示:

$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

我相信我找到了答案。覆蓋顯示器和取智者的功能,調用模板,用米或d緩存,請編譯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模板,而不需要重複。