Добро пожаловать на сайт <БагБД>, где вы можете задавать вопросы о программировании и разработке на Битрикс и Битрикс24, и получать быстрые и квалифицированные ответы от профессионалов!

Как выполнить код в кэшированном шаблоне

00 голосов
7
Здравствуйте! Есть много материала "Как не кэшировать шаблон", но каждый из советов даёт ответ под узкую задачу.
У меня на сайте новости могут добавлять все пользователи. Надо в списке новостей сделать ссылку "редактировать" напротив новостей, автором которых является текущий пользователь. Но кэшировать список новостей хочется для всех пользователей одни кэшем. Тогда по логике, нужно чтобы в компоненте не кэшировалось условие:
Код
if($item&#91;"CREATED_BY"&#93; == $USER->GetID()) может редактировать

Как это реализовать? Не хочется изменять всё стандартное кэширование на CPHPCache, а с помощью файла component_epilog.php тоже ничего не получается.
спросил 14 Авг, 13 от KAKYWA (180 баллов)

7 Ответы

00 голосов
Точно такая же проблема получается при вызове функции $APPLICATION->GetCurPageParam(), запоминает параметры от "чужого" пользователя, которые мешаются.
ответил 14 Авг, 13 от KAKYWA (180 баллов)
00 голосов
Самый простой способ в component_epilog.php проверять равенство ид создателя новости и текущего пользователя и в случае совпадения выводить кнопку редактирования.
ответил 21 Окт, 13 от Dakost (580 баллов)
00 голосов
то есть использовать component_epilog.php полностью вместо template.php ? До этого я не додумался что-то...
ответил 24 Янв, 14 от KAKYWA (180 баллов)
00 голосов
Не та component_epilog.php это продолжение component.php там ты можешь модифицировать $arResult не кастомизируя компонент.
А template.php - это обязательный файл.

Я так понимаю в компонент допустим есть.
В нём пишет допустим
if(тут кеш)
{

1. бизнесс-ллогика
2. Вывод шаблона

}

а когда ты использовать файл component_epilog.php , то он как бы не подпадает под вот это кеширование в компоненте?
или как? я теоретически не проверяю. Пытаюсь понять как это работает.
ответил 12 Май, 14 от Wisp (220 баллов)
00 голосов
Цитата
Cool-Di пишет:
то есть использовать component_epilog.php полностью вместо template.php ? До этого я не додумался что-то...
Зачем полностью, в вашем случае будет достаточно в component_epilog.php дописать вывод кнопок редактирования. Или через js активировать их в списке выше, который сформирован в шаблоне.
ответил 09 Сен, 14 от Dakost (580 баллов)
00 голосов
component_epilog.php выполняется после отработки компонента. Он не кэшируется, поэтому его удобно использовать для вызова отложенных функций, которые несовместимы с кэшированием, например, чтобы задать какой-то свой заголовок страницы или чтобы подключить javascript-библиотечку, используемую в шаблоне.
Что касается основного вопроса, то я делаю так:
  1. Вывожу список без кнопок, один для всех пользователей. Где-то в атрибутах тегов прописываю id каждой новости.
  2. AJAX'ом делаю запрос на сервер, который проверяет по id, если ли среди новостей те, которые может редактировать текущий пользователь.
  3. Если такие новости есть, то javascript'ом выводим рядом с ними ссылку на редактирование.
  4. И не забываем на странице редактирования снова проверить права пользователя.
Метод прекрасно работает, особенно мне нравится его использовать с кнопками голосований и добавления в избранное. Однако требует обязательно включённого javascript'а.
ответил 14 Янв, 15 от randir (180 баллов)
00 голосов
Большое спасибо за помощь. На самом деле подобная проблема встречалась часто, раньше просто резал юзабилити, думал, что способ с яваскриптом будет "кривым", но раз другие программисты им пользуются, то я спокоен.
ответил 30 Апр, 15 от KAKYWA (180 баллов)

Похожие вопросы

0 голосов
4 ответов
спросил 19 Янв, 14 от Stom (160 баллов)
0 голосов
2 ответов
спросил 29 Янв, 14 от Gair (220 баллов)
0 голосов
4 ответов
спросил 22 Ноя, 13 от HeadDead (100 баллов)
0 голосов
4 ответов
0 голосов
1 ответ
спросил 07 Ноя, 13 от VaNessa (100 баллов)