Расширение функционала API готового решения Allcorp3

MediaMint добавил(а) 25 дн. назад
В рассмотрении

Доработка касается удобства выборки разделов и элементов с помощью метода

TSolution\Functions::getSectionsWithElementCount()
Такое пожелание возникло при доработке отображения разделов в зависимости от выбранного и привязанного к разделу региона.

В шаблоне blog компонента bitrix:news в файлах news.php, section.php, detail.php есть фрагмент кода, который получает разделы с количеством элементов в них и теги (листинг 1). Если почитать код этого метода, то там используется такая конструкция, которая поддерживает передачу дополнительных фильтров для разделов и элементов в них:

$arExtParams = array(
    'IBLOCK_ID' => $iblock_id,
    'MENU_PARAMS' => $arMenuParametrs,

       // custom filter for sections (through array_merge)
       'SECTION_FILTER' => $regionSectionFilter,

       'SECTION_SELECT' => array(), // custom select for sections (through array_merge)
    'ELEMENT_FILTER' => array(),   // custom filter for elements (through array_merge)
    'ELEMENT_SELECT' => array(),   // custom select for elements (through array_merge)
    'MENU_TYPE' => 'catalog',
);
CAllcorp3::getMenuChildsExt($arExtParams, $aMenuLinksExt);
Листинг 1 - Получение списка разделов в компоненте bitrix:news с шаблоном blog

Также, такая конструкция используется в файлах расширенного меню (например, .left.menu_ext.php). В дополнительный фильтр можно передать фильтр со сложной фильтрацией, который выберет только те разделы, которые доступны в выбранном регионе (Листинг 2):

global $arRegion;
/**
 * В defines.php шаблона глобальная переменная arRegionLink объявляется только тогда, когда включена региональность.
 * @author Leonid Bychkov
 */
$regionSectionFilter = [];
if (!empty($GLOBALS["arRegionLink"])) {
    $regionSectionFilter = array(
        array(
            "LOGIC" => "OR",
            array("UF_LINK_REGION" => $arRegion["ID"]),
            array("UF_LINK_REGION" => false)
        ),
    );
}
Листинг 2 - Сложный фильтр для выбора разделов только с текущим регионом, или к которым регион не привязан

Само предложение: давайте добавим в метод TSolution\Functions::getSectionsWithElementCount() передачу дополнительных фильтров для разделов и элементов, ведь у него внутри также вызывается метод CAllcorp3::getMenuChildsExt(), который поддерживает такие фильтры. Поддерживающий фильтры метод вызывается по цепочке getSectionsWithElementCount() -> getSectionsForMenu() -> getMenuChildsExt()

Комментировать
 
Прикрепить файлы