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, трейт может достать его из данных элемента по цепочке ключей.