Возможно ли массив из Smarty сделать доступным для другого блока на странице?

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

1 вариант. Передавайте данные в контроллере

2 вариант. Используйте такой код

{$global_var=$my_var scope="global"}

  1. Сложно - там куча файлов функций и из коробки и пост.контроллеров из других модулей - я смотрел-смотрел, в итоге не понял что там за магия происходит.

  2. Спасибо, сейчас попробую! Скажите, а важен порядок отображения шаблонов на странице? Т.е. если в макете блок с этим массивом находится внизу, я смогу вывести данные из него в верхней части страницы в smarty-блоке? Если нет, возможно ли как-то изменить порядок их обработки не меняя расположения блоков в макете?

Для 2 варианта важен, для 1 - нет

Костылище, для второго варианта, из серии “если нельзя, но очень хочется”…
Есть где-то в верху div, где надо разместить содержимое, <div id="tut_ochen_nado"></div>

В макете можно создать блок с содержимым smarty, после блока в котором создается глобальная переменная. Обернуть его в блок<div id="peremestit"></div>.
И после переместить
{literal}
<sc_ript type=“text/javascript”>
$(’#peremestit’).appendTo(’#tut_ochen_nado’);
</sc_ript>
{/literal}
Внезапно, работает)

Что-то не хотело отображаться, пришлось в script воткнуть подчеркивание.

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

{capture name="tut_ochen_nado"}
... код...
{/capture}

и в нужно блоке уже использовать

{$smarty.capture.tut_ochen_nado nofilter}

Увы, так не работает :frowning:

А с яваскриптом не работает при включении кеширования. Без кеширования отлично. Странно.

попробуйте сам скрипт вынести в хук index/scripts.post.tpl, мне в похожем случае помогло

О, спасибо большое, помогло! Вот бы еще понимать, в чем разница.

Зависит от очерёдности рендера блоков, вообще работает, вы уверены что нужный блок вызывается после того как обьявлена капча?

Можно установить массив в Registry, а в нужном месте вытянуть (для этого нужны php функции-обертки для сэта и гэта)

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

Должно работать, часто используем. Либо я не совсем понял, в каком порядке у вас все вызывается

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

Вы можете в функции получения установить значение в статику и вызвать получение два раза, в принципе тоже вариант, будет без js

static $smth = [];
if (empty($smth)) {
    $smth = fn_get_smth();
}
return $smth;

что-то на подобии

1 лайк

Понял. Наш вариант тогда не сработает