Как правильно вызвать отложенные функции в шаблоне компонента со включенным кэширование?
Здравствуйте!
Есть необходимость вызвать в шаблоне компонента отложенную функцию, например, <?=$APPLICATION->ShowTitle()?>.
Однако, если включить кэширование, то верстка ломается.
Вопрос: как грамотно вызвать данную функцию в шаблоне компонента?
Заранее спасибо!
Решение, спасибо @alexyarik
Один раз выше цикла получить значение и далее работать с ним <?$getTitle=$APPLICATION->GetTitle()?>.
- Покажите на скриншоте или примере страницы, что именно у вас ломается в верстке.
- В каком файле компонента вы задаете входные данные для отложенной функции?
Вам нужно, чтобы не ломалась верстка, в result_modifier.php делаете логику и получаете данные, а в component_epilog.php устанавливаете SetPageProperty
Ярослав Александров, Здравствуйте, Ярослав. Я с bitrix только знакомлюсь, поэтому некоторые моменты мне не ясны.
- Верстка ломается в шаблоне компонента bitrix.news.list, в шаблоне которого я использую отложенную функцию <?=$APPLICATION->ShowTitle()?>, то, что ломается из-за вызова функции - это точно, без нее все нормально. Можете у себя протестировать аналогичную ситуацию.
- Не совсем понял комментарий "задаете входные данные".
Можете написать пример, как бы вы сделали данную задачу? Нужно вызвать название раздела, на котором вызван компонент bitrix.news.list в шаблоне компонента bitrix.news.list.
Ярослав Александров, Не понял чем поможет result_modifier.php, если отработка данного файла идет до отложенной функции, т.е. result_modifier.php проблему не решит. А с component_epilog.php тоже адекватного примера я не нашел, к сожалению.
Если не трудно, отпишите порядок действий, с примером.
Спасибо.
Руслан, <?=$APPLICATION->ShowTitle()?> обычно используется для вывода в header.php шаблона, ни разу не видел чтобы это ломало верстку.
Вы в своем компоненте тупо выводите заголовок страницы с помощью ShowTitle? Или вы переопределяете заголовок страницы под свои данные?
Для начала проверьте ваши действия в системном шаблоне .default bitrix.news.list, скорее дело в вашей верстке, либо не правильно ее внедрили в компонент.
Тестировать не вижу смысла, поставьте демо сайт мебельный, там ShowTitle в H1 и ничего не ломает
Архив вашего шаблона компонента прикрепите ссылкой через Яндекс диск, если успею посмотрю.
Я не понял вашего вопроса "Вы в своем компоненте тупо выводите заголовок страницы с помощью ShowTitle? Или вы переопределяете заголовок страницы под свои данные?"
Я просто вывожу <?=$APPLICATION->ShowTitle()?> в шаблоне компонента bitrix.news.list. Смена шаблона не помогла, верстка ломается при любом случае.
"ShowTitle в H1" - не ломается, повторюсь, вызов именно в шаблоне компонента.
Я вам написал, что проблема именно в этом, а вы пытаетесь найти решение там, где проблемы нет =)
В любом случае, спасибо за помощь.
Ярослав Александров, Вы смогли повторить ошибку, если да, то какой вывод-то будет? Так нельзя делать, если нельзя, то почему и как об этом было узнать (я всего лишь вызвал заголовок раздела в шаблоне bitrix.news.list, это же крайне легко сделать)? А если так вызывать можно, то почему не получается.
Руслан, на демо сайте редакция Старт, в комплексном компоненте bitrix.news и bitrix.news.list в системных шаблонах такой проблемы не наблюдаю, ни с сбросом кеша, и без авторизации тоже не вижу изменений в верстке.
Ярослав Александров, А где вы, кстати, вызываете-то <?=$APPLICATION->ShowTitle()?>? В выводе новости я не вижу этого.
Добавьте в начало названия новости <?=$APPLICATION->ShowTitle()?>.
Т.е. в переборе массива, в шаблоне компонента (вывода превью новости), т.е. будет так:
<?=$APPLICATION->ShowTitle()?> / <?=$arItem["NAME"]?>
Вы вызываете в шаблоне страницы (раздела), а не шаблоне компонента.
Руслан, вы один раз выше цикла получите значение и далее работайте с ним <?$getTitle=$APPLICATION->GetTitle()?>, а так вы в цикле повторяете отложенную функцию, которая по идее должна один раз отработать.
Ярослав Александров, Огонь, спасибо! Работает, ниже был коммент похожий, но отдавал пустую строку, а $APPLICATION->GetTitle() работает как нужно. Буду знать.
вы один раз выше цикла получите значение и далее работайте с ним <?$getTitle=$APPLICATION->GetTitle()?>, а так вы в цикле повторяете отложенную функцию, которая по идее должна один раз отработать.
GetTitle() и GetProperty() не отложенные функции, т.е. если вы переопределяете заголовок ниже по коду, чем вызов GetTitle(), то вы получите старый заголовок, который установлен выше по коду, или false, если заголовок не установлен до вызова GetTitle().
Я верно понимаю, что можно вызвать так: <?=$APPLICATION->GetProperty("title")?>
т.к. данная функция не является отложенной и кэш с версткой будет нормально отрабатывать, в отличие от <?=$APPLICATION->ShowTitle()?>
?