Документация для разработчиков
Темная тема

Пример регистрации источника

Пример

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