Пример регистрации источника
Пример
use \Bitrix\Main; // наш класс, который будет выбирать данные по элементам источника class MyLoader extends \Bitrix\Landing\Source\DataLoader { public function getElementListData() { // получения списка элементов из источника $this->seo->clear(); // должен присутствовать всегда в самом начале метода - очистка seo-параметров $select = $this->getPreparedSelectFields(); // получаем список полей и свойств, которые нужны для элементов if (empty($select)) { return []; // для ненастроенного блока ничего не будем выводить } $filter = $this->getPreparedFilter($this->getFilterFields()); // получаем фильтр для orm или GetList старого ядра $internalFilter = $this->getInternalFilter(); // получаем дополнительный фильтр (см SOURCE_FILTER в обработчике событий) if (!empty($internalFilter) && is_array($internalFilter)) { $filter = array_merge($filter, $internalFilter); // если дополнительный фильтр не пуст, он имеет приоритет } if (empty($filter)) { return []; // если фильтра нет, ничего не выводим } $order = []; // сортировка результата $rawOrder = $this->getOrder(); if (isset($rawOrder['by']) && isset($rawOrder['order'])) { $order[$rawOrder['by']] = $rawOrder['order']; if (!in_array($rawOrder['by'], $select) { $select[] = $rawOrder['by']; // учитываем, что код будет работать на mysql 5.7 и выше } } $limit = $this->getLimit(); // получаем максимальное число элементов, которое нужно выбрать if ($limit <= 0) { $limit = 50; // если лимит не задан, ограничиваемся какой-то разумной величиной } $result = []; $iterator = \MyModule::getList([ 'select' => $select, 'filter' => $filter, 'order' => $order, 'limit' => $limit ]); while ($row = $iterator->fetch()) { // данные каждого элемента необходимо привести к html-безопасному виду. вариант реализации - на выбор разработчика ... $result[] = $row; } return $result; } public function getElementData($element) { // получение конкретного элемента из источника $this->seo->clear(); // должен присутствовать всегда в самом начале метода - очистка seo-параметров $select = $this->getPreparedSelectFields(); // получаем список полей и свойств, которые нужны для элемента if (empty($select)) { return []; // для ненастроенного блока ничего не будем выводить } // предполагаем, что ID элемента - целое число if (!is_string($element) && !is_int($element)) { return []; } $element = (int)$element; if ($element <= 0) { return []; } // для детальной страницы проверяем фильтр, чтобы блокировать вывод элемента, не подпадающего под нашу выборку $filter = $this->getPreparedFilter($this->getFilterFields()); // получаем фильтр для orm или GetList старого ядра $internalFilter = $this->getInternalFilter(); // получаем дополнительный фильтр (см SOURCE_FILTER в обработчике событий) if (!empty($internalFilter) && is_array($internalFilter)) { $filter = array_merge($filter, $internalFilter); // если дополнительный фильтр не пуст, он имеет приоритет } if (empty($filter)) { return []; // если фильтра нет, ничего не выводим } $filter['ID'] = $element; // ограничиваем выборку одним элементом $iterator = \MyModule::getList([ 'select' => $select, 'filter' => $filter, ]); $row = $iterator->fetch(); if (empty($row)) { return []; } // данные необходимо привести к html-безопасному виду. вариант реализации - на выбор разработчика $this->seo->setTitle($row['NAME']); // задаем в качестве заголовка название элемента return [$row]; } /** * Описание полей для преобразования фильтра блока в orm фильтр * * @return array */ private function getFilterFields() { $result = []; // поле NAME типа строка $result['NAME'] = [ 'id' => 'NAME', // идентификатор (совпадает с ключом массива) 'type' => 'string', // тип поля Строка (main.ui.filter) 'operators' => [ // префиксы для условий 'default' => '%' // префикс по умолчанию ] ]; // поле ID типа число $result['ID'] = [ 'id' => 'ID', // идентификатор (совпадает с ключом массива) 'type' => 'number', // тип поля Число (main.ui.filter) 'operators' => [ // префиксы для условий 'default' => '=', // префикс по умолчанию 'exact' => '=', // точное совпадение (равно) (X === value) 'range' => '><', // фильтр по диапазону (min <= X <= max) 'more' => '>', // больше (X > value) 'less' => '<' // меньше (X < value) ] ]; // поле SECTION_ID типа список $result['SECTION_ID'] = [ 'id' => 'SECTION_ID', // идентификатор (совпадает с ключом массива) 'type' => 'list', // тип поля Список (main.ui.filter) 'operators' => [ // префиксы для условий 'default' => '=' // префикс по умолчанию ] ]; // поле INCLUDE_SUBSECTIONS типа чекбокс $result['INCLUDE_SUBSECTIONS'] = [ 'id' => 'INCLUDE_SUBSECTIONS', // идентификатор (совпадает с ключом массива) 'type' => 'checkbox', тип поля Чекбокс (main.ui.filter) 'operators' => [ // префиксы для условий 'default' => '' // префикс по умолчанию ] ]; return $result; } } // регистрация обработчика $eventManager = \Bitrix\Main\EventManager::getInstance(); $eventManager->registerEventHandler('landing', 'OnBuildSourceList', 'partner.mymodule', '\MySource', 'sourceBuildHandler'); // класс обработчика для передачи описания (регистрации) источника class MySource { public static function sourceBuildHandler(\Bitrix\Main\Event $event) { /** @var \Bitrix\Landing\Source\Selector $selector */ $selector = $event->getParameter('SELECTOR'); if (!$selector->checkSiteMode([\Bitrix\Landing\Source\Selector::SITE_MODE_PAGE])) // пример - источник только для сайтов 24 { return new Main\EventResult(Main\EventResult::ERROR, null, 'ИД_модуля'); } $restrictions = $selector->getModuleRestrictions('ИД_модуля'); // получение ограничений if (!empty($restrictions['SITE_ID']) && $restrictions['SITE_ID'] !== 's2') //пример - источник только для сайта с кодом s2 { return new Main\EventResult(Main\EventResult::ERROR, null, 'ИД_модуля'); } $path = $selector->getSourceFilterBaseUri('ИД_модуля', 'ИД_источника'); $baseUri = $path->getUri(); // путь, который необходимо использовать в качестве базового для формы настройки фильтра (постраничка и отбор элементов в форме) $componentParams = [ ... // параметры, необходимые компоненту 'BASE_LINK' => $baseUri // имя ключа - любое, лишь бы компонент его обрабатывал ]; $result = []; $result[] = [ 'SOURCE_ID' => 'ИД_источника', 'TITLE' => 'мой источник', 'TYPE' => \Bitrix\Landing\Source\Selector::SOURCE_TYPE_COMPONENT, 'SETTINGS' => [ 'COMPONENT_NAME' => 'my:selector.landing', // компонент настройки фильтра 'COMPONENT_TEMPLATE_NAME' => '.default', 'COMPONENT_PARAMS' => $componentParams, 'WRAPPER' => [ // необязательные настройки, передаваемые в bitrix:ui.sidepanel.wrapper 'USE_PADDING' => false, 'PLAIN_VIEW' => false, 'USE_UI_TOOLBAR' => 'N' ] ], 'SOURCE_FILTER' => [ // дополнительный фильтр '=ACTIVE' => 'Y' // выводим только активные элементы ], 'DATA_SETTINGS' => [ 'FIELDS' => [ // поля для вывода в блоке 0 => [ 'id' => 'ID', 'name' => 'Идентификатор', 'type' => \Bitrix\Landing\Node\Type::TEXT, ] 1 => [ 'id' => 'NAME', 'name' => 'Название', 'type' => \Bitrix\Landing\Node\Type::TEXT, ], 2 => [ 'id' => 'PICTURE', 'name' => 'Изображение', 'type' => \Bitrix\Landing\Node\Type::IMG, ], ... N => [ 'id' => 'QUANTITY', 'name' => 'Количество', 'type' => \Bitrix\Landing\Node\Type::TEXT, ], ], 'ORDER' => [ 0 => [ 'id' => 'ID', 'name' => 'Идентификатор', ], 1 => [ 'id' => 'NAME', 'name' => 'Название', ], ... N => [ 'id' => 'AVAILABLE', 'name' => 'Доступность', ], ] ], 'DATA_LOADER' => '\MyLoader' // класс-загрузчик данных ]; return new Main\EventResult(Main\EventResult::SUCCESS, $result, 'ИД_модуля'); } }
© «Битрикс», 2001-2024, «1С-Битрикс», 2024