Суть вопроса:
В каталоге на странице 20 элементов. Необходимо вместо одного элемента выводить рекламный баннер в случайном месте (каталог "плитка" 4х5).
мое решение:
Вывод в шаблоне компонента catalog.section
template.php
function randNumber() //вынес в init.php
{
return rand(1, 19);
};
<?$i=1?>
<?foreach ($arResult['ITEMS'] as $arItem) :?>
<article>/*контент*/</article>
<? if(randNumber() == $i): ?>//проблема с кэшем
<article>/*баннер $arResult["BANNER_LIST"]//проблема с кэшем*/</article>
<? endif; ?>
<?$i++;?>
<?endforeach?>
Код в result_modifier.php
Получаю привязанный элемент раздела, передаю в GetList, выбираю один случайный элемент, сохраняю в $arResult, скармливаю в шаблон
//Получаем баннер текущего раздела
$bannerItems = array();
$arSectionSelect = array("ID", "UF_BANNER");
$arSectionFilter = array("IBLOCK_ID"=>$arParams["IBLOCK_ID"], "ID"=>$arResult["ID"]);
$dbSectionList = CIBlockSection::GetList(array(), $arSectionFilter, false, $arSectionSelect);
while($arSection = $dbSectionList->GetNext()){
$bannerItems = $arSection["UF_BANNER"];
};
$bannerList = array();
$arSelect = Array("ID", "NAME", "PREVIEW_PICTURE", "PROPERTY_NAME");
$arFilter = Array("IBLOCK_ID"=>23, "ACTIVE"=>"Y", "SECTION_ID"=>$bannerItems, 'INCLUDE_SUBSECTIONS' =>'Y');
$res = CIBlockElement::GetList(array("RAND"=>"ASC"), $arFilter, false, Array ("nTopCount" => 1), $arSelect);
while($ob = $res->GetNextElement()){
$arFields = $ob->GetFields();
$bannerList = array(
"NAME" => $arFields["NAME"],
"BG" => $arFields["PREVIEW_PICTURE"],
"DESCR" => $arFields["PROPERTY_NAME_VALUE"]
);
};
//Сохраняем результат в кеш компонента
if($bannerList){
$arResult["BANNER_LIST"] = $bannerList;
$this->__component->setResultCacheKeys(array("BANNER_LIST"));
};
Все это отлично работает ТОЛЬКО с выключенным кэшем. Подскажите как заставить работать с кэшем???