@vcherepko

Как сделать рандомную выдачу элемента в catalog.section?

Суть вопроса:
В каталоге на странице 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"));
};

Все это отлично работает ТОЛЬКО с выключенным кэшем. Подскажите как заставить работать с кэшем???
  • Вопрос задан
  • 387 просмотров
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

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