Изменения

Контекст выполнения head


Важность: Низкая
Статус: Выполнена

Размещено: 2752 дня назад
Завершено: 2477 дней назад
Автор: Antony Gla (всего задал задач: 43)

При использовании команды head в кеше, содержимое этой команды сохраняется отдельно и исполняется в момент подгрузки кеша.

Допустим, есть части A и B. Часть A вызывает часть B. Часть A использует кеширование, а часть B вызывает команду [head] с таким содержимым: [glob.x=1][cpart.name].

В текущем варианте системы произойдёт вот что - вся эта команда выполнится при запуске части A (т.к. кеширующий механизм заложен в ней).

Присвоение [glob.x=1] сработает верно, а вот [cpart.name] выведет информацию о части A, вместо части B (что предполагалось, т.к. команда расположена в части B).

Можно не запускать содержимое head при старте шаблона, а компилировать его заранее, оставляя в нём только куски [#header] команд (которым в любом случае нужен запуск и которые нельзя кешировать). В этом случае [cpart.name] отработает нормально (т.к. оно просто закешируется в момент первого рендера), но не будет работать [glob.x=1] (что чревато такими вещами, как множественное присоединение какой-нибудь JQuery, т..к. глобальная переменная [use_jquery] может быть попросту не определена из-за кеша).

Как вариант, можно записывать в секцию [head] части B константы, вместо переменных окружения.

Например так: ['[head][glob.x=1]'++cpart.name++'[/head]'.shell]

В этом случае отработают обе команды.


Метки: кеширование (1) , шаблонизатор (13)

Комментарии

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

Единственное, что не будет работать в кеше в [head] это переменные текущей части (или глобальные переменные), т.к. их дамп не присутствует в контексте. Но при желании, можно его туда погрузить, если использование переменных в процессе исполнения этой секции зафиксировано (можно помещать только используемые переменные).

Также стоит помнить, что секция compile сохраняется для кеша в компилированном виде и не исполняется.

Войдите или пройдите регистрацию для возможности упрощённого добавления комментариев


Имя автора

Email автора

Комментарий

Контрольный вопрос:
Сколько будет: 11+16-6