Smarty кеширующие компоненты

Smarty FAQ предлагает один из способов обработки Cacheable фрагментов, но для этого нужно каждый контроллер страницы , чтобы сделать тонны работы до фронта, вместо того, чтобы инкапсулировать вещи должным образом.

Мы хотим добраться до стадии, когда мы можем сделать что-то вроде:

<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 для рендеринга самого себя?

13.10.2009 13:24:44
1 ОТВЕТ

Вы не должны изменять параметры кэширования внутри функции Smarty. Независимо от того, является ли результат вывода плагина кэшируемым, определяется при регистрации плагина.

http://www.smarty.net/manual/en/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; 
} 
0
15.10.2009 09:21:55
Это имеет три недостатка, которые мы хотим избежать: (1) предварительная регистрация реализаций блоков вместо автоматической загрузки, (2) шаблон должен открывать и закрывать каждый блок, (3) реализация блоков создает HTML вручную, а не рендеринг с использованием smarty. Мы смотрим, сможем ли мы обойти каждую проблему и как это сделать, и будем рады некоторым предложениям.
searlea 9.11.2009 10:36:28
(1) вы можете поместить вашу функцию динамического блока в каталог smarty, и он будет загружать ее по требованию. (2) я не поняла (3) тоже не поняла. В чем проблема?
Vladislav Rastrusny 10.11.2009 10:26:03