Нужен трюк, чтобы использовать кэшированное значение в разделе nocache

#smarty #smarty3

#умный #smarty3

Вопрос:

Я хочу выполнить итерацию по одному массиву и отключить кэширование только для некоторых элементов. Итак, моя идея заключалась в том, чтобы сохранить key и получить элемент по key в разделе nocache. К сожалению, я не нашел никакой возможности:

назначить кэш $rec@key в разделе nocache,

или сохранить key определение переменной в разделе cached.

Есть ли какой-либо способ (без модификации кода smarty) сделать это? вот мой тест.tpl:

 {foreach $array as $rec}
  {if $rec.dynamic}
    {assign var="key" value=$rec@key} 
    {nocache}
      {$array[$key].text}
    {/nocache}  
  {else}
    {$rec.text}
  {/if}
{/foreach}
  

и test.php:

 <?php 
include_once 'libs/Smarty.class.php';
$smarty=new smarty();
$smarty->caching=1;
$smarty->assign('array',array(
            'r1'=>array('dynamic'=>true,'text'=>'dynamic'),
            'r2'=>array('dynamic'=>false,'text'=>'static')
          ));
$smarty->display('test.tpl');
  

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

Комментарии:

1. Я не вижу, чтобы {foreach} {nocace} {$ rec @key} работал каким-либо образом. Что мешает вам обернуть весь {foreach} в {nocache}?

2. Я хочу получить как можно больше от кэширования smarty. Это было бы идеальным решением для моей CMS. На самом деле я буду включать разные шаблоны для каждого элемента. Но у меня может быть 2 экземпляра одного и того же модуля с разными данными, и я хочу иметь один экземпляр объекта «конфигурация».

Ответ №1:

Наконец, я нашел решение: используйте count в вашем цикле.

     {nocache}
        {counter start=0 skip=1 assign="count"}
    {/nocache}
    {section name="co" loop=$publication}
        {nocache}
            {$publication[$count].id}
            {counter}
        {/nocache}
    {/section}
  

Ответ №2:

То, что вы пытаетесь выполнить, начиная с Smarty 3.1.x, невозможно. С 3.2 Smarty позволит вам «экспортировать» значения в раздел {nocache}, чтобы убедиться, что они доступны при повторном выполнении шаблона.

Пока не будет выпущена версия 3.2 (не спрашивайте дату, я не знаю), вы можете сделать это самостоятельно, используя функцию компилятора.