What is Smarty?
Why use it?
Use Cases and Work Flow
Syntax Comparison
Template Inheritance
Best Practices
Crash Course
You may use the Smarty logo according to the trademark notice.
For sponsorship, advertising, news or other inquiries, contact us at:
Начиная с плагинов Smarty-2.6.0, кэшируемость плагинов может быть объявлена
во время их регистрации. Третий аргумент у register_block,
register_compiler_function и register_function называется
$cacheable
и имеет значение по умолчанию true,
что соответствует поведению плагинов Smarty версии ранее 2.6.0
Если плагин регистрируется с $cacheable=false, плагин вызывается каждый раз, когда страница отображается, даже если сама страница кэширована. Поведение плагина немного похоже на функцию insert.
В отличие от {insert},
атрибуты плагина не кэшируются по умолчанию. Они могут быть
объявлены как кэшируемые при помощи четвертого параметра -
$cache_attrs
. $cache_attrs
это массив имен атрибутов, которые должны кэшироваться, чтобы
функция плагина брала значение в том виде, в котором оно было в момент
помещения страницы в кэш, каждый раз, когда страница запрашивается из кэша.
Example 14.10. Предотвращение кэширования результата работы плагина
<?php require('Smarty.class.php'); $smarty = new Smarty; $smarty->caching = true; function remaining_seconds($params, &$smarty) { $remain = $params['endtime'] - time(); if ($remain >=0) return $remain . " second(s)"; else return "done"; } $smarty->register_function('remaining', 'remaining_seconds', false, array('endtime')); if (!$smarty->is_cached('index.tpl')) { // извлекаем $obj из БД и присваиваем... $smarty->assign_by_ref('obj', $obj); } $smarty->display('index.tpl'); ?>
Шаблон index.tpl:
Оставшееся время: {remaining endtime=$obj->endtime}
Количество секунд до endtime объекта $obj изменяется при каждом обновлении страницы, даже если страница кэширована. Так как атрибут endtime кэширован, объект извлекается из базы данных в тот момент, когда страница помещается в кэш, но не во время последующих запросов к странице.
Example 14.11. Предотвращение кэширования части страницы
index.php: <?php require('Smarty.class.php'); $smarty = new Smarty; $smarty->caching = true; function smarty_block_dynamic($param, $content, &$smarty) { return $content; } $smarty->register_block('dynamic', 'smarty_block_dynamic', false); $smarty->display('index.tpl'); ?>
Шаблон index.tpl:
Страница кэширована: {"0"|date_format:"%D %H:%M:%S"} {dynamic} Текущее время: {"0"|date_format:"%D %H:%M:%S"} ... выполняем разные действия ... {/dynamic}
Во время обновления страницы вы заметите, что даты отличаются. Одна является "динамической", другая - "статической". Вы можете поместить в конструкцию {dynamic}...{/dynamic} любой код и быть уверенным, что он не будет помещён в кэш вместе с остальной частью страницы.