Имеется такой кейс.
Компонент news.list выводит список новостей из инфоблока. Внешний вид стандартный - ссылка на детальную, дата публикации, изображение, текст анонса. Компонент news.detail - это детальная новости.
Нужно сделать следующее: если пользователь заходил на детальную новости, то у этой новости в списке выводить не ссылку, а просто название. Т.е. второй раз пользователя на детальную не пускать (ну если будет прямой заход, то ничего страшного).
Задача подразделяется на две подзадачи:
1) Обработка захода пользователя на детальную новости.
2) Показ пользователю списка новостей.
Пользователь может быть как авторизованным, так и гостем.
В переменной $_SESSION['viewed_news'] будут лежать id просмотренных новостей.
1) component_epilog у news.detail. В него ложим код, который добавляет в $_SESSION['viewed_news'] id текущей новости. Если в component_epilog $arResult["ID"] не доступна (что наврятли, $arResult["ID"] по умолчанию сохранён в кэше), то протянуть её туда через SetResultCacheKeys
2) Тут сложнее.
Варианты:
1. Скормить $_SESSION['viewed_news'] как параметр компоненту news.list . С точки зрения трудозатрат это самый простой вариант, но кэш компонента рискует опухнуть до космических размеров.
2. В component_epilog у news.list достать из $_SESSION['viewed_news'] id -шники и чисто средствами js повырубать нужные ссылки. Очень некрасивый вариант, но рабочим может быть.
3. В component_epilog делать ajax запрос специально подготовленному скрипту, который будет выдавать нам html код блока со списком новостей с неактивными где нужно ссылками и заменять содержимое блока этим куском. Такой же корявый вариант, как и предыдущий.
4. Разбить список новостей на части следующим образом: каждый блок с новостью выводится компонентом типа news.detail , на вход компонент будет принимать ID новости, ID инфоблока и прочие необходимые параметры и + статус новости для текущего пользователя (просмотрено или не просмотрено). У news.detail кэширование будет включено, а в самом news.list кэширование можно отрубить. Этот вариант меня тоже немножко коробит, но я чувствую, что здесь истина где-то рядом.
Кстати, что-то подобное реализовано у blog.new_posts.list . У него в шаблоне вызывается rating.vote , ему из blog.new_posts.list скармливаются нужные параметры. В blog.new_posts.list работает обычный тегированный CPHPCache , который зависит от $arParams , id группы текущего пользователя и ещё пары доп. параметров. Но мне пока не совсем понятно, как это увязано в кэшированием в blog.new_posts.list .
Компонент news.list выводит список новостей из инфоблока. Внешний вид стандартный - ссылка на детальную, дата публикации, изображение, текст анонса. Компонент news.detail - это детальная новости.
Нужно сделать следующее: если пользователь заходил на детальную новости, то у этой новости в списке выводить не ссылку, а просто название. Т.е. второй раз пользователя на детальную не пускать (ну если будет прямой заход, то ничего страшного).
Задача подразделяется на две подзадачи:
1) Обработка захода пользователя на детальную новости.
2) Показ пользователю списка новостей.
Пользователь может быть как авторизованным, так и гостем.
В переменной $_SESSION['viewed_news'] будут лежать id просмотренных новостей.
1) component_epilog у news.detail. В него ложим код, который добавляет в $_SESSION['viewed_news'] id текущей новости. Если в component_epilog $arResult["ID"] не доступна (что наврятли, $arResult["ID"] по умолчанию сохранён в кэше), то протянуть её туда через SetResultCacheKeys
2) Тут сложнее.
Варианты:
1. Скормить $_SESSION['viewed_news'] как параметр компоненту news.list . С точки зрения трудозатрат это самый простой вариант, но кэш компонента рискует опухнуть до космических размеров.
2. В component_epilog у news.list достать из $_SESSION['viewed_news'] id -шники и чисто средствами js повырубать нужные ссылки. Очень некрасивый вариант, но рабочим может быть.
3. В component_epilog делать ajax запрос специально подготовленному скрипту, который будет выдавать нам html код блока со списком новостей с неактивными где нужно ссылками и заменять содержимое блока этим куском. Такой же корявый вариант, как и предыдущий.
4. Разбить список новостей на части следующим образом: каждый блок с новостью выводится компонентом типа news.detail , на вход компонент будет принимать ID новости, ID инфоблока и прочие необходимые параметры и + статус новости для текущего пользователя (просмотрено или не просмотрено). У news.detail кэширование будет включено, а в самом news.list кэширование можно отрубить. Этот вариант меня тоже немножко коробит, но я чувствую, что здесь истина где-то рядом.
Кстати, что-то подобное реализовано у blog.new_posts.list . У него в шаблоне вызывается rating.vote , ему из blog.new_posts.list скармливаются нужные параметры. В blog.new_posts.list работает обычный тегированный CPHPCache , который зависит от $arParams , id группы текущего пользователя и ещё пары доп. параметров. Но мне пока не совсем понятно, как это увязано в кэшированием в blog.new_posts.list .