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

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

Пример

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-2021, «1С-Битрикс», 2021
Наверх