Задача
Добавить дополнительные уровни сортировки в компонент вывода списка товаров.
Решение
Решить эту задачу без кастомизации компонента не получится.
Битрикс позволяет нам кастомизировать компонент двумя способами:
- Наследованием от нужного компонента (D7)
- Копированием и кастомизацией имеющегося кода
Кастомизация при помощи наследования компонента
Так же как и в варианте с копированием нам нужно создать папку для своего компонента в своем пространстве имен.
В нашем примере создадим папку: local/components/yournamespase/catalog.section
В созданой директории создадим файл class.php
с таким содержимым:
<?
if (!defined('B_PROLOG_INCLUDED') || B_PROLOG_INCLUDED !== true) die();
// подключаем класс компонента от которого хотим унаследовать наш компонент
CBitrixComponent::includeComponentClass("bitrix:catalog.section");
// расширяем класс компонента, пишем новые функции и/или переопределяем существующие
class DecCatalogSectionComponent extends \CatalogSectionComponent
{
protected function getSort()
{
$sortFields = [];
if (
(
$this->isIblockCatalog
|| (
$this->isMultiIblockMode()
|| (!$this->isMultiIblockMode() && $this->offerIblockExist($this->arParams['IBLOCK_ID']))
)
)
&& $this->arParams['HIDE_NOT_AVAILABLE'] === 'L'
)
{
$sortFields['CATALOG_AVAILABLE'] = 'desc,nulls';
}
if (is_array($this->arParams['ELEMENT_SORT_ARRAY']) && count($this->arParams['ELEMENT_SORT_ARRAY']) > 0) {
$sortFields = array_merge($sortFields, $this->arParams['ELEMENT_SORT_ARRAY']);
} else {
if (!isset($sortFields[$this->arParams['ELEMENT_SORT_FIELD']]))
{
$sortFields[$this->arParams['ELEMENT_SORT_FIELD']] = $this->arParams['ELEMENT_SORT_ORDER'];
}
if (!isset($sortFields[$this->arParams['ELEMENT_SORT_FIELD2']]))
{
$sortFields[$this->arParams['ELEMENT_SORT_FIELD2']] = $this->arParams['ELEMENT_SORT_ORDER2'];
}
}
return $sortFields;
}
}
Вызов компонента
<?
$intSectionID = $APPLICATION->IncludeComponent(
"yournamespase:catalog.section",
"",
array(
// тут обычный массив параметров, с добавлением нужного нам ELEMENT_SORT_ARRAY
),
$component
);
В подключении компонента нужно передать параметр ELEMENT_SORT_ARRAY, который жолжен быть массивом вида [“ИМЯ_ПОЛЯ_ИЛИ_СВОЙСТВА_ДЛЯ_СОРТИРОВКИ” => “НАПРАВЛЕНИЕ_СОРТИРОВКИ”, …]
Кастомизация копированием
Для этого копируем компонент bitrix:catalog.section в свое пространство имен. Например так: local/components/yournamespase/catalog.section
.
И вносим изменения в файл class.php компонента. Добавляем функцию, которая переопределит родительскую функцию сортировки:
<?
protected function getSort()
{
$sortFields = [];
if (
(
$this->isIblockCatalog
|| (
$this->isMultiIblockMode()
|| (!$this->isMultiIblockMode() && $this->offerIblockExist($this->arParams['IBLOCK_ID']))
)
)
&& $this->arParams['HIDE_NOT_AVAILABLE'] === 'L'
)
{
$sortFields['CATALOG_AVAILABLE'] = 'desc,nulls';
}
if (is_array($this->arParams['ELEMENT_SORT_ARRAY']) && count($this->arParams['ELEMENT_SORT_ARRAY']) > 0) {
$sortFields = array_merge($sortFields, $this->arParams['ELEMENT_SORT_ARRAY']);
} else {
if (!isset($sortFields[$this->arParams['ELEMENT_SORT_FIELD']]))
{
$sortFields[$this->arParams['ELEMENT_SORT_FIELD']] = $this->arParams['ELEMENT_SORT_ORDER'];
}
if (!isset($sortFields[$this->arParams['ELEMENT_SORT_FIELD2']]))
{
$sortFields[$this->arParams['ELEMENT_SORT_FIELD2']] = $this->arParams['ELEMENT_SORT_ORDER2'];
}
}
return $sortFields;
}
?>
Вызов компонента
<?
$intSectionID = $APPLICATION->IncludeComponent(
"yournamespase:catalog.section",
"",
array(
// тут обычный массив параметров, с добавлением нужного нам ELEMENT_SORT_ARRAY
),
$component
);
В подключении компонента нужно передать параметр ELEMENT_SORT_ARRAY, который жолжен быть массивом вида [“ИМЯ_ПОЛЯ_ИЛИ_СВОЙСТВА_ДЛЯ_СОРТИРОВКИ” => “НАПРАВЛЕНИЕ_СОРТИРОВКИ”, …]