ShowViewContent - пример работы с отложенными функциями
Пример работы с отложенными функциями на странице каталога, когда надо вывести контент из умного фильтра выше по коду или в другом месте страницы.
Например, у вас на странице раздела каталога в левой колонке размещен умный фильтр bitrix:catalog.smart.filter, а еще вы хотите вывести над товарами Быстрый фильтр - кнопки-ссылки, например, на бренды.
Задача: объединить умный и быстрый фильтр, чтобы быстрый фильтр работал по аякс и можно было нажимать несколько кнопок.
В файле result_modifier.php нашего шаблона bitrix:catalog.smart.filter добавляем массив данных для быстрого фильтра:
$quick=array();
foreach($arResult['ITEMS'] as $key=>$arItem)
{
// берем нужное нам свойство
if($arItem['CODE'] == 'BRAND'){
$quick = $arItem['VALUES'];
}
}
$arResult["QUICK_FILTER"]=$quick;
В файле template.php нашего шаблона bitrix:catalog.smart.filter добавляем, например, такой код:
<?if(!empty($arResult["QUICK_FILTER"])){
?><?$this->SetViewTarget("brand_links");?>
<div class="c-links"><?
foreach($brands as $arItem){
?>
<a class="c-links__a <?if($arItem["CHECKED"]):?> selected<?endif;?>" href="<?=$arItem['FLT_URL']?>" data-propcode='BRAND' data-urlid='<?=$arItem['URL_ID']?>' onclick="return clinksFilter(this);"><?echo $arItem["VALUE"]?></a>
<?}
?></div>
<?$this->EndViewTarget();?><?
}?>
В файле section.php нашего шаблона каталога bitrix:catalog в нужном месте добавляем:
<?
if ($c_mobile): //можно вывести по условию
$APPLICATION->ShowViewContent('brand_links');
endif;
?>
Можно по условию вывести в разных местах страницы, например, для десктопа или мобильной версии.
В этом примере у меня за обработку кликов на кнопки быстрого фильтра отвечает js-функция clinksFilter, в которой проверяются нужные галочки в фильтре и вызывается обработчик фильтра.
function clinksFilter(obj){
if ($(obj).data("propcode")){
$(obj).toggleClass("selected");
$('.filtren').addClass('ajaxfilter');
if($(obj).data("urlid")){
let urlid = $(obj).data("urlid").split(',');
urlid.forEach(function(item, index, array) {
let input = $(".filtren [data-propcode='"+$(obj).data("propcode")+"']").find("[data-urlid='"+item+"']").attr("for");
if(input){
checkBoxes = $("#"+input);
let is_checked = checkBoxes.prop("checked");
checkBoxes.prop("checked", !is_checked);
}
});
}
// вызов обработчика фильтра
RSGoPro_FilterAjax();
return false;
}
return true;
}
12.01.2024