Меню
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

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

Бонус за выполненный заказ на внутренний счет пользователя

Задача: после того как заказ, в интернет-магазине, перешел в статус "Выполнен" начислить пользователю 5% от стоимости за...

Удалить всех пользователей которые не делали заказов в магазине 1С-Битрикс

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

Звездочки в рейтинге Битрикс статей и товаров каталога

Задача: изменить вывод рейтинга элемента на звездочки, с помощью шаблона iblock.vote в товарах и новостях.

Вывести минимальную цену самого дешевого торгового предложения

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

Обновить страницу Inapbrowser в приложении Apache Cordova, при выходе из фона

Задача: Мобильное приложение, созданное на Apache Cordova должно перезагрузить текущую страницу, открытую с помощью плаг...

Как вывести картинки к разделам на базе _ext меню

Просто для эстетической красоты, нужно вывести в меню разделов сайта картинки или иконки. Достаточно популярный метод, э...

Заполнить инфоблок брендов из свойства инфоблока с товарами

Задача: в интернет-магазине есть инфоблок с товарами, загружаемый из 1С, у которого заполнено свойство "Производите...

ORM: получение информации о разделах инфоблока на D7, использование Bitrix\Iblock\SectionTable и пользовательских полей

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

Добавить СЕО-метатеги в результаты поиска по каталогу

Задача: на странице с результатами поиска по каталогу нужно установить уникальные метатеги: keywords, description, canon...