Пример регистрации источника
Пример
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-2025, «1С-Битрикс», 2025