Создаю новый пользовательский компонент
В каталоге bitrix/components создала папку klient для создания собственных компонентов.
Создала папку нового компонента filter.
В каталоге компонента:
файл .description.php
<?
if (!defined("B_PROLOG_INCLUDED") || B_PROLOG_INCLUDED!==true) die();
$arComponentDescription = array(
"CACHE_PATH" => "Y",
);
?>
файл .parameters.php
<?
if(!defined("B_PROLOG_INCLUDED")||B_PROLOG_INCLUDED!==true)die();
$arComponentParameters = array(
'PARAMETERS' => array(
'CACHE_TIME' => array('DEFAULT'=>3600),
),
);
?>
файл component.php
<?
if(CModule::IncludeModule("iblock"))
{
// в информационном блоке IBLOCK_ID=22 находятся названия брендов,
// получаю список существующих брендов.
// функция GetList получит все бренды, которые есть в справочнике.
$arFilter = Array("IBLOCK_ID"=>22, "ACTIVE_DATE"=>"Y", "ACTIVE"=>"Y", "INCLUDE_SUBSECTIONS"=>"Y");
$items = CIBlockElement::GetList(Array(), $arFilter, false, false,array("ID","NAME"));
while ($enum_fields = $items->GetNext())
$arResult['BREND'][] = array(
"ID" => $enum_fields["ID"],
"NAME" => $enum_fields["NAME"],
);
}
$arResult["FORM_ACTION"] = isset($_SERVER['REQUEST_URI'])? htmlspecialchars($_SERVER['REQUEST_URI']): "";
$this->IncludeComponentTemplate();
?>
<?
if (!defined("B_PROLOG_INCLUDED") || B_PROLOG_INCLUDED!==true) die();
$arComponentDescription = array(
"CACHE_PATH" => "Y",
);
?>
папка images - для картинок.
папка templates -
папка шаблона .default
файлы
style.css
.filter_name {margin: 10px;font-weight: bold;background-color: #F1F5FA;}
.filter_submit {margin: 20px 10px;}
template.php
<form action="<?$APPLICATION->GetCurDir();?>" method="GET">
<p class="filter_name">Бренд:</p>
<p class="filter_check">
<?foreach ($arResult['BREND'] as $key =>$brend):?>
<input type="checkbox" name="brend[]" value=<?=$brend['ID']?> <?if(@( in_array($brend['ID'], $_SESSION["brend"]))):?> checked <?endif?>><?=$brend['NAME']?><br>
<?endforeach;?>
</p>
<p class="filter_submit">
<input type="submit" value="Фильтр" name="set_f">
<input type="submit" value="Сбросить" name="del_f">
</p>
</form>
Компонент встраиваю в footer.php шаблона. Он будет работать в правой колонке
<?
$ttt = explode("/",$APPLICATION->GetCurDir());
$razdel = $ttt[1];
if ($razdel == "product_catalogue" || $razdel == "ready_catalogue"){
//фильтр по товарам
$APPLICATION->IncludeComponent("klient:filter", ".default", array(
"CACHE_TIME" => "3600"
),
false
);
}
?>
В разделе каталога товаров стоит комплексный компонент bitrix:catalog.
Мне нужно, чтобы фильтр сохранялся постоянно при переходе на страницы каталога.
Фильтр сохраняю в сессиях.
В настройках компонента указываю массив для сохранения фильтра arrFilterCat.
Если включен компонент фильтра в комплексном компоненте, он обнуляет глобальную переменную фильтра arrFilterCat.
Если отключить работу фильтра в комплексном компоненте, тогда массив $GLOBALS['arrFilterCat'] можно заполнять перед загрузкой комплексного компонента.
Если компонент фильтра включен, массив заполняю в файле section.php перед запуском компонента bitrix:catalog.section
if(!$GLOBALS['arrFilterCat']) GLOBAL $arrFilterCat;
if (isset($_GET["set_f"]))
{ $_SESSION["brend"] = $_GET['brend'];
}
if (isset($_SESSION["brend"])) $arrFilterCat['PROPERTY_BREND'] = $_SESSION['brend'];
if (isset($_GET["del_f"]))
{ unset($_SESSION["brend"]);
unset($arrFilterCat['PROPERTY_BREND']);
}