Smarty и настройки кэширования, можно ли сделать такую штуку?

  • Автор темы Wingely Dog
  • Дата начала

Wingely Dog

Guest
Smarty и настройки кэширования, можно ли сделать такую штуку?

Хочу сдалеть такую вещь

PHP:
--- config.php ---
define( "USE_CACHING_DEF", true );
define( "CACHING_LIFETIME_DEF", 3600 );

--- MySmarty.php ---
/**
 * эта функция реализует синглетон
 * для шаблонного движка
 * шаблонный движок при
 * инициализации, получает
 * параметры
 * $tpl->caching = USE_CACHING_DEF;
 * $tpl->cache_lifetime = CACHING_LIFETIME_DEF;
 *
 * @return reference to Smarty
 * @access public
 */
function &getSmarty(){ ..... }


--- samefile_1.php ----
$tpl =& getSmarty();
// локальные настройки кэширования для этого блока
$tpl->caching = false;

$tpl->desplay( "same_1.tpl" );

// возврат к дефолтовым настройкам
$tpl->caching = USE_CACHING_DEF;


--- samefile_2.php ---
$tpl =& getSmarty();
// локальные настройки кэширования для этого файла
$tpl->caching = true;
$tpl->cache_lifetime = 123;

$tpl->display( "same_2.tpl" );

// возврат к дефолтовым настройкам
$tpl->caching = USE_CACHING_DEF;
$tpl->cache_lifetime = CACHE_LIFETIME_DEF;


--- index.php ---
include "config.php";
include "MySmarty.php"
include "samefile_1.php";
include "samefile_2.php";

// отработка с дефолтовыми настройками
$tpl =& getSmartyObj();
$tpl->display( "index.tpl" );
тоесть хочу чтобы в памяти был один экземпляр смарти с некими дефолтовыми настройками кэширования, при этом некоторые блоки могли бы их переопределять по своему усмотрению на время выполнения блока.

так нельзя или я что-то неправильно понял? потому как у меня почемуто не работает этот фокус.
 

Demiurg

Guest
То есть ты порядок следования блоков задаешь в php-скриптах ?
 

Wingely Dog

Guest
вообще говоря нет, но могу.
а есть разница?

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

тут index.php это чисто условная штука, чтобы показать логику.
тоесть я могу в блоках сделать и $out = $tpl->fetch( "same.tpl" ); а потом эту переменную как-то конкатировать с чемнить еще в главном сборщике страницы. Это не суть важно помоему
 

Demiurg

Guest
На мой взгляд, срипт должен отображать ровно один шаблон, а уже этот шаблон должен решать какие еще шаблоны подключить и в каком месте. Твоя проблема с кешированием, как я понимаю идет от того, что тебе надо запретить кеширование какого то шаблона, который инклудится в кешируемом шаблоне, для этого есть insert.
 

Wingely Dog

Guest
а на мой взгляд скрипт не должен вообще отображать шаблонов 8)
каждый может заблуждаться настолько насколько пожелает, не в том суть.

я хочу не просто запретить/разрешить кэширование отдельных блоков,
а иметь возможность управлять лайфтаймом. к тому же insert работает из шаблонов а мне нужно делать это из скриптов.
 

Demiurg

Guest
читаем про $caching

A value of 1 or 2 enables caching. 1 tells Smarty to use the current $cache_lifetime variable to determine if the cache has expired. A value of 2 tells Smarty to use the cache_lifetime value at the time the cache was generated. This way you can set the cache_lifetime just before fetching the template to have granular control over when that particular cache expires.
 

Wingely Dog

Guest
О, эт по делу. Только вот вопрос....

PHP:
$tpl =& new Smarty();
$tpl->caching = 2;

$tpl->cache_lifetime = 1;
$out1 =& $tpl->fetch( "file1.tpl" );


$tpl->cache_lifetime = 20;
$out2 =& $tpl->fetch( "file2.tpl" );


$tpl->cache_lifetime = 20000;
$tpl->assign_by_ref( "out1", $out1 );
$tpl->assign_by_ref( "out2", $out2 );

$tpl->display( "main.tpl" );
у основной (последней) сборки стоит лайфтайм больше чем у сборщиков блоков. теперь даже если я уменьшаю лайфтайм у сборщика блока до нуля, основная страница все равно выдаст блок из кэша.
Как с этим бороться?
 

Demiurg

Guest
Вот об этом я и говорил. Шаблон должен сам подключать к себе шаблоны, если при этом нужно управление кешированием, то insert.
 

Wingely Dog

Guest
у меня набор допонлнительных блоков вставляемых в основной шаблон определяется весьма нетривиально, я не могу засовывать эту логику в шаблон. даже если использовать внешнюю, определнную в пхп функцию, все равно, для каждого блока (а их может быть примерно десяток другой) придется вставлять конструкции по проверке, это неприемлемо.
И если даже я это всетаки сделаю, insert включает/выключает кэширование, я же хочу еще и лайфтаймом управлять.
 

Demiurg

Guest
Смарти кеширует на уровне шаблонов. Если шаблон запрашивается, то его результат и кешируется. Единственное исключение - insert.

Почему бы не передовать в шаблон включен ли определенный блок или выключен ? логику можно оставить в скриптах.
 

Wingely Dog

Guest
так, вроде доходит.
а если я пожертвую кэшированием последнего шаблона?

т.е. типа того

PHP:
$tpl =& new Smarty();
$tpl->caching = 2;

$tpl->cache_lifetime = 300;
$tpl->assign( "block1", $tpl->fetch( "block1.tpl" ) );

$tpl->cache_lifetime = 500;
$tpl->assign( "block2", $tpl->fetch( "block2.tpl" ) );

$tpl->cache_lifetime = 0;
$tpl->display( "main.tpl" );
то по идее блоки должны собраться с кэшированием а основная страница без. но на деле, если у основоного блока установить лайфтайм в нуль, почемуто и блоки начинают собираться без кэширования. Почему? они же вроде кэшируются каждый в своем файле? или я опять что не так понимаю?

вот в доках указано, что insert применяется к функции, а я могу применить его к переменной? типа

{insert $block1}
{insert $block2}

???
 

Demiurg

Guest
и где доказательства того, что блоки собираются заного а не беруться из кеша ?
Insert применяется не к функции, insert обращается к функции.
 

Wingely Dog

Guest
у меня на компьютере 8)
тоесть по идее, этот пример должен работать правильно?
 

Demiurg

Guest
по идее все далжно быть написано так, как в мануале, а что там написано я уже говорил.
 
Сверху