Smarty 3 - передача "значения" переменной в параметры include()

Ihor

Новичок
В кешируемом базовом шаблоне есть инклуд:
Код:
{include file="vote.tpl" absnum=$absnum сache_id="block|vote_"|cat:$absnum}
$absnum =123, достается из базы в обработчике и доступно только при первом вызове базового шаблона, то есть когда он еще не в кеше.

Смарти в результате сохраняет инклуд как:
Код:
<?php echo $_smarty_tpl->getSubTemplate ("vote.tpl", ("block|vote_").($_smarty_tpl->tpl_vars['absnum']->value).....
но переменная $_smarty_tpl->tpl_vars['absnum']->value уже не доступна при следующем вызове страницы

как сделать, что бы в результате кешированый файл инклудился как
Код:
<?php echo $_smarty_tpl->getSubTemplate ("vote.tpl", "block|vote_123".....
то есть код
Код:
{include file="vote.tpl" absnum=123 сache_id="block|vote_123"}
работает правильно, как и ожидается

То есть как записать в сache_id значение, результат переменной а не ссылку на нее?
 

AnrDaemon

Продвинутый новичок
{include ... inline}
Тогда результат инклюда будет храниться в странице, заинклюдившей шаблон.
Хотя не видя, что именно вы делаете, сложно сказать, подойдёт ли этот вариант конкретно вам.
 

Ihor

Новичок
Если упрощенно логика то так: раздел Новостей. Есть обработчик страницы с новостью. На вход он получает ссылку вида /news/news-name.html а на выходе - ИД новости 123 и массив с данными новости (заголовок, текст, дата, фото.....).

article.php
$template = 'news|news-name';

$article = null;
if (!$smarty->isCached($template, $id)) {
$article = array( /*mysql*/ );
$smarty->assign('article', $article);
}

Далее ето все идет в шаблон article.tpl (выводиться новость)
в новости есть блок опросов. он привязан к новости по ИД 123

{include file="vote.tpl" absnum=123 сache_id="block|vote_123"}
в етом блоке есть возможность проголосовать. после голосования его контент меняется. (процент, результат).
соответственно мне надо почистить кеш только етого блока block|vote_123. чистить весь кеш страницы news|news-name не надо, так как изменилось содержимое только етого блока, кроме того, что более важно,
етот блок с опросом используется не только на етой странице, но и в сайдбаре по всему сайту, или в какой то другой новости, которая связана с текущей....

Описал упрощенно но смысл в том, что бы была возможность очищать кеш только одного етого блока block|vote_123 который инклудится по всему сайту.
 

AnrDaemon

Продвинутый новичок
Тогда ответ ещё проще - вы неправильно собираете шаблоны. Статичные (голосовалка) блоки не должны включаться в динамичные (новость) - кроме головной боли (которую вы уже успели прочувствовать), вам это ничего не принесёт.
 

Ihor

Новичок
Почему же. я вижу тут только одну проблему - ето при компиляции писать в файл значение переменной а не ее вызов. Помоему ето очевиное использование кешей блоков, раз уж они есть.

Кроме того я привел пример только одного блока, и то упрощенный. Почему такой подход не имеет права на жизнь.

например, блок последних новостей категории 123 в сайдбаре и блок вех новостей на главной. В каждой категории свой блок последних новостей.
{include file="news.tpl" absnum=123 сache_id="news|category_123"} на главной {include file="news.tpl" сache_id="news|all"}
при изменении/добавлении новой новости в категорию мне достаточно чистить один блок news|category_123 и блок news|all. все. но никак не все шаблоны категории и каждую новость етой категории и всю главную и остальные все страницы сайта, где есть блок "все новости" только потмоу что добавилась новая новость.

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

та же генерация меню, {include file="menu.tpl" category=123 сache_id="menu|category_123"} я мог бы закешировать по одному варианту меню на категорию (для подсветки активного) и чистить блок только при изменении категориии. (ну тут может не совсем верный пример, но например если генерация меню затратная, скажем выводится количество новостей возле пунктов и пункт надо подсвечивать, то есть накладно ето делать на каждой странице но в тоже время надо подсветить активную)

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

AnrDaemon

Продвинутый новичок
/facepalm
Вам не кажется, что вы "что-то не то" несёте?
Мне вот не просто кажется - у меня крыша едет от чтения вашей галиматьивашего сообщения.

Покажу на примере, раз вы сами не видите проблемы.

Нормальная структура инклюдов шаблона:
page.tpl <-[article.tpl, vote.tpl]
При изменении статьи, либо голосования, соответствующий кеш убивается и регенерится, не затрагивая соседние блоки.

Ваша структура (как я её понял):
page.tpl <- article.tpl <- vote.tpl
При изменении статьи, вам нужно перегенерировать голосование, даже если там ничего не изменялось.
При появлении изменений в голосовании, каждая статья на сайте будет иметь собственную версию того, в каком состоянии находится голосование, пока вы не убъёте нафиг весь кеш статей вообще полностью.

В общем, я уже сказал - вы пытаетесь сделать то, для чего шаблонизатор (особенно кеширующий) изначально не предназначен.
Постановка задачи у вас неправильная, проще говоря.
Разберитесь, какие у вас на странице есть блоки, выпишите на листочек себе структуру их подчинённости, если по-другому не понимаете.
 

Ihor

Новичок
нет, прочитайте еще раз пост выше и не переходите пожалуйста на оскорбления.

есть один файл шаблона статьи article.tpl в который инклудится vote.tpl. так же vote.tpl может исклюдится в другие файлы, в которых есть необходимость вызова опроса по полученому ИД. смотрите лучше пример с последними новостями, может так будетпонятнее.

При изменении статьи, либо голосования, соответствующий кеш убивается и регенерится, не затрагивая соседние блоки.
я ето и пытаюсь сделать. какой кеш я должен убить после голосования? кроме как vote.tpl сache_id="block|vote_123". зачем мне убивать кеш article.tpl и другие, в которых исклудится vote.tpl сache_id="block|vote_123"
прочитайте пожалуйста внимательнее пост
 

Adelf

Administrator
Команда форума
Не надо класть в одну корзину кеш шаблонов и кеш данных.
Чем скорее поймешь, тем лучше будешь жить :)
 

Ihor

Новичок
причем тут кеш данных. нужные данные кешируются успешно в мемкеше. вы же не предлагаете изза одной переменной. нужной по сути для генерации только сache_id совать ее в отдельный кеш.
или что по вашему данные? данные статьи - так они только в шаблоне и нужны. данные блока? так они только в блоке.
если я начну кешировать еще и данные ети же что я привел выше в примере отдельно то проблемы только возрастет на необходимость очистки данных (ну или использовать nocache и кешировать данные)
 

Тугай

Новичок
Замени {include ...} на переменную шаблона {$vote_block} и вычисляй ее в коде, там где и absnum
Код:
$smarty_news->assign('vote_block', $smarty_vote->fetch('vote.tpl', "block|vote_$absnum"));
 

Ihor

Новичок
Замени {include ...} на переменную шаблона {$vote_block} и вычисляй ее в коде, там где и absnum
Я об этом думал, но это не очень удобно. Это все таки блок, коих может быть много в разных местах, тогда надо уже делать автолоад обработчиков для получения контента етих блоков, что будет еще сложнее в итоге.
 

AnrDaemon

Продвинутый новичок
нет, прочитайте еще раз пост выше и не переходите пожалуйста на оскорбления.

есть один файл шаблона статьи article.tpl в который инклудится vote.tpl. так же vote.tpl может исклюдится в другие файлы, в которых есть необходимость вызова опроса по полученому ИД. смотрите лучше пример с последними новостями, может так будетпонятнее.


я ето и пытаюсь сделать. какой кеш я должен убить после голосования? кроме как vote.tpl сache_id="block|vote_123". зачем мне убивать кеш article.tpl и другие, в которых исклудится vote.tpl сache_id="block|vote_123"
прочитайте пожалуйста внимательнее пост
Это вы внимательно прочитайте, что пишете. Вы сами себе противоречите. Если вам приходится убивать новостной блок вместе с голосованием, у вас вся система шаблонизации хромает не только на обе ноги, но и на все остальные конечности.
 
Сверху