Перейти к основному содержимому

ElementTrait

Трейт: Xpage\Core\Trait\Component\ElementTrait

Назначение: Унификация процесса выборки и подготовки данных элементов инфоблока. Позволяет компонентам «из коробки» поддерживать сложную ORM-выборку, интеграцию с торговым каталогом и современным роутингом.

Зависимости:

  • Модули: iblock, catalog.
  • Ядро: Bitrix\Main\ORM.
  • Используется в: Компонентах, наследующих Xpage\Core\Component.

itemToArray(object $element)

Основной метод для трансформации объекта элемента в массив данных (arResult).

  • Поля: Обрабатывает стандартные поля и связанные поля через точку (например, SECTION.NAME).
  • Даты: Автоматически конвертирует объекты DateTime в формат ISO 8601 (c).
  • SEO URL: Генерирует адрес страницы на основе системы роутинга, используя параметры из ROUTE_NAME.
  • Каталог: Если подключен модуль catalog, подтягивает данные о ценах и параметрах товара (вес, размеры).
  • Кнопки правки: Генерирует ссылки для «Режима правки» в публичной части сайта.

extractProperties(object $element)

Глубокая обработка свойств элемента.

  • Связи: Поддерживает получение данных из привязанных элементов, разделов или файлов через точку (например, BRAND.ELEMENT.NAME).
  • Типы данных: Корректно обрабатывает множественные свойства, возвращая их в виде простых массивов.
  • Описания: Если у значения свойства есть описание, оно сохраняется в ключе DESCRIPTION.

prepareSelectElement(&$query)

Модифицирует объект запроса ORM (Bitrix\Main\ORM\Query\Query) перед выполнением.

  • Select: Добавляет в выборку все поля и свойства, указанные в параметрах компонента.
  • Runtime Fields: Динамически присоединяет таблицу цен (PriceTable) и таблицу товаров (ProductTable) через Reference поля, если это необходимо.
  • Фильтрация цен: Автоматически фильтрует цены по указанному в параметрах PRICE_XML_ID.

normalizeProperties(array $properties)

Вспомогательный метод для очистки массивов свойств. Сбрасывает цифровые ключи (делает array_values), что критично для корректного преобразования в JSON на фронтенде.


Примеры использования

Подключение в компоненте

namespace Xpage\Core\Component;

class CatalogElement extends \Xpage\Core\Component
{
use \Xpage\Core\Trait\Component\ElementTrait;

public function executeComponent()
{
$query = \Bitrix\Iblock\Elements\ElementCatalogTable::query();

// 1. Подготавливаем выборку на основе параметров
$this->prepareSelectElement($query);

$element = $query->fetchObject();

// 2. Превращаем объект в массив для шаблона
$this->arResult = $this->itemToArray($element);

$this->includeComponentTemplate();
}
}

Технические особенности

  • PRICE_RELATION_NAME: Трейт использует константу для названия связи с таблицей цен, что позволяет избежать конфликтов имен при сложных JOIN-запросах.
  • Кэширование цен: Метод getPriceGroupIdByXmlId кэширует ID типа цены в рамках одного хита, чтобы не делать лишних запросов к GroupTable.
  • Умный Routing: Поддерживает вложенные параметры пути. Если в роуте нужен SECTION_CODE, трейт может достать его из данных элемента по цепочке ключей.