簡體   English   中英

Smarty緩存組件

[英]Smarty caching components

Smarty FAQ提出了一種處理可緩存片段的方法,但它需要每個頁面控制器先進行大量工作,而不是正確地封裝內容。

我們想進入一個階段,我們可以做類似的事情:

<div id="header">
  {our_categories}
  {our_subcategories category=$current_category}
</div>

our_前綴函數的輸出應該是完全可緩存的,僅依賴於命名參數(如果有)。如果我們在多個模板中引用{our_categories} ,則它們都應引用相同的緩存內容。

(可能值得一提的是,我們嘗試使用{insert name="..."}並編寫了我們自己的函數,但是結果不可緩存,因此我們最終手動重新設置了HTML,而不是從Smarty的代碼中受益模板處理。)

我們的第一個破解方法是使用自定義函數smarty_function_our_categories ,但是緩存的處理方式非常錯誤。 這是我們的函數:

function smarty_function_our_categories($params, &$smarty) {
  $smarty->caching = 2;
  $smarty->cache_lifetime = 3600; # 1 hour
  if (!$smarty->is_cached(...)) {
    // ... do db access to fetch data for template...
    $smarty->assign(....);
  }
  return $smarty->fetch(...);
}

問題是:在函數中調用$smarty->fetch()會使smarty困惑,使其無法跟蹤哪些模板具有插入標簽,哪些沒有。 最終結果是Smarty在提供緩存的內容時忘記替換某些標記(標記放置在上面說:“用一些非緩存的{insert ...}調用的結果替換它。)在我們的情況下,這表現為本身,我們的網站顯示了幾個md5校驗和和一個php序列化的備忘錄,我們的主菜單應該在其中-不好。

我們假設我們在構建組件方面犯了一個錯誤,所以問題最終變成:

如何使用Smarty安全地創建緩存組件以進行渲染?

您不應在Smarty函數內部更改緩存參數。 注冊插件時,將定義插件輸出的結果是否可緩存。

http://www.smarty.net/manual/zh/caching.cacheable.php

要在可緩存模板中創建不可緩存的內容,只需使用{dynamic}塊,如下所示:

//Registering dynamic non-caching block with Smarty
$template->register_block('dynamic', 'smarty_block_dynamic', false); 
function smarty_block_dynamic($param, $content, &$smarty) { 
    return $content; 
} 

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM