Меню
RSS
Кеширование $res = CIBlockElement::GetList, Данные из result_modifier.php кешируются в template.php
 
Здравствуйте, подскажите пожалуйста.
В catalog.section.top в файле result_modifier.php есть код
Код
$elementId = $GLOBALS['current_news_id']; // ID элемента, к которому проверяем привязку

// ID инфоблока, к которому принадлежит элемент
$iblockId = 41;

// Получаем элементы из инфоблока, которые имеют привязку к элементу с указанным ID
$res = CIBlockElement::GetList(
   [],
   [
      'IBLOCK_ID' => $iblockId,
      'PROPERTY_SHOW_WHERE' => $elementId,
   ],
   false,
   false,
   ['ID'],
);

// Инициализируем массив для хранения ID привязанных элементов
$linkedElementIds = [];
if ($res->SelectedRowsCount() > 0) {
   while ($item = $res->Fetch()) {
      $linkedElementIds[] = $item['ID']; // Добавляем ID в массив
   }
}


$arResult['LINKED_ITEMS'] = $linkedElementIds;
Мы ищем в инфоблоке 41 элементы, у которых есть привязка к текущему элементу и выводим их в текущем элементе.
Но результат кешируется (в result_modifier.php же не должен)
В итоге есть две страницы, к ним привязаны разные элементы, но результат они показывают один и тот же.
Пока не сделать сброс кеша ?clear_cache=Y
Тогда результат обновляется, но опять на все страницы, показывает один результат, той, на которой мы сбросили кеш.

<?=// Выводим массив ID
print_r($arResult['LINKED_ITEMS']);
?>
На странице 1 есть ID 15 и 20
На странице 2 есть ID 30 и 45

Если мы на странице 1 сбросим кеш ?clear_cache=Y, то у нас и на второй будут ID 15 и 20, пока не сбросим кеш на второй странице.

Подскажите как решить можно проблему?

Заранее спасибо.
Изменено: Михаил Базаров - 01.10.2024 14:09:40
 
В result_modifier кеш работает. Но у вас скорее всего не в нем проблема, а в том что кешируется template.php

Попробуйте перенести этот участок (который выводит связанные элементы) в component_epilog.php - как раз в нем кеширование и не работает.
Изменено: Михаил Базаров - 01.10.2024 14:08:56
 
Пробовал, через него вообще ничего не выводится. Даже если у catalog.section.top отключить кэш - пустота.
Если отключить кэш в админке, тоже пусто
 
Как-то я не внимально прочитал первое сообщение. То есть у вас именно catalog.section.top выводит элементы и внутри карточек нужно вывести элементы связанные с ними?
Скиньте скрин (из дизайна) как это вообще должно выглядеть - для понимания
 
Блок такой. За вывод отвечает catalog.sections.top внутри news.detail
Этот блок создается в инфоблоке ID 41, там же у элементов, разбитым по разделам делается привязка к инфоблоку ID 1 и уже находясь в элементе из инфоблока ID 1, надо вывести элементы из ID 41, у которых есть привязка к тому, на котором мы находимся.

Т.е. по моей логике в данном случае, мы определяем ID текущего элемента, ищем есть ли у элементов из инфоблока 41 эти ID и выводим.


Сейчас я решил проблему другим способом, но честно хотелось бы узнать, почему с кешем так получается
Изменено: Михаил Базаров - 02.10.2024 11:48:42
 
извиняюсь, в редактор изображение вставилось, но в сообщении поломалось
 
Потому что нельзя вставлять компоненты с кешированием внутрь шаблона другого компонента с кешированием. Там не предсказуемые проблемы возникают.
Подобное, все таки надо делать через component_epilog, под типа так:
Код
result_modifier
$res = CIBlockElement::GetList(
   [],
   [
      'IBLOCK_ID' => 41,
      'PROPERTY_SHOW_WHERE' => $arResult['ID'],
   ],
   false,
   false,
   ['ID'],
);
$arResult['LINKED_ITEMS'] = [];
while($ob = $res->Fetch())
{
   $arResult['LINKED_ITEMS'][] = $ob['ID']
}


Код
component_epilog
if (count($arResult['LINKED_ITEMS']) > 0) {
   $GLOBALS['arrFilter'] = array('ID' => $arResult['LINKED_ITEMS']);
     $APPLICATION->IncludeComponent(
        "bitrix:catalog.section.top",
        "",
        array(
            .....
            "FILTER_NAME" => "arrFilter",
            .....
        ),
        false
    );
}

Как-то так, но написал не проверяя.
Изменено: Михаил Базаров - 02.10.2024 11:59:12
Читают тему
Форма ответов
 
Текст сообщения*
Перетащите файлы
Ничего не найдено
Файл
Загрузить картинки
 
Поблагодарить и поддержать:
Или подписаться на boosty канал: Видео на Bst
Сайт в режиме тех обслуживания

Сообщения форума и комментарии не сохраняются

Возвращайтесь после 12-го января

Блог-note: заметки разработчика

Адаптивное гамбургер меню для битрикс

Заметка коротенькая, но решил оставить ее - так как самому часто нужно нечто подобное. В архиве готовый шаблон для Битри...

ORM в инфоблоках, получение информации об элементах инфоблока на D7

Задача: собрать полные данные об элементах инфоблока, применяя ORM/D7, который пришел на смену устаревшему CIBlockEleme...

Если предложение SKU в корзине, поменять кнопку добавления на "В корзине"

Данная заметка является дополнением к ранее опубликованной: Если товар в корзине, поменять значение input на "В корзине"...

Добавление своих полей в почтовые шаблоны Битрикс

Иногда нужно внести свои поля в почтовые шаблоны битрикс. Например: добавить имя и номер телефона заказчика в почтовый ш...

Номера страниц в Title и Description при постраничной навигации каталога

Задача: Часто SEO-специалисты просят добавить номер страницы, из постраничной навигации, в заголовок и описание раздела ...

Быстрая отписка от всех рассылок модуля "E-mail маркетинг", в кабинете пользователя

Задача: дать пользователям возможность отписаться от всех рассылок "E-mail маркетинга", не только по ссылке из...

Спойлер в списке новостей 1С-Битрикс

Иногда нужно сделать спойлеры в копонентах 1C-Битрикс, в основном конечно, имеет смысл при очень больших обьемах контент...

Переключатель валюты в каталоге 1С-Битрикс

Задача: Дать пользователю возможность самостоятельно выбирать валюту, в которой он хочет видеть цены, в разделе каталога...

Удалить половину элементов инфоблока с помощью API

Задача: вот такая странная задача, нужно удалить из инфоблока половину элементов. Не важно каких, просто половину элемен...