lenvendo/iblock-orm

Компонент для работы с Инфоблоками 1С-Битрикс через ORM

2.0.9 2020-11-25 19:06 UTC

This package is auto-updated.

Last update: 2025-06-25 15:44:24 UTC


README

Библиотека реализует выборку данных через D7 ORM 1С-Битрикс, предоставляя табличные классы для сущностей элементов, секций, свойств инфоблока с объявленными связями между ними. Инструментарий позволяет генерировать такие классы «на лету», а также объявлять их явно.

Важно: на текущий момент не поддерживаются операции изменения данных.

Структура данных

Инструментарий позволяет взаимодействовать с табличными классами для сущностей элементов, секций и свойств каждого инфоблока.

Элементы

Табличный класс элементов конкретного инфоблока наследуется от стандартного класса \Bitrix\Iblock\ElementTable и наследует все поля, объявленные в этом классе.

Помимо этого, добавляется поддержка следующих полей:

  • WF_LAST_HISTORY_ID — поле таблицы элементов инфоблоков, содержащее идентификатор последней версии элемента при задействовании функциональности документооборота.

  • PROPERTY — поле-связка с сущностью значений свойств элементов данного инфоблока, полученной из провайдера сущностей.

  • SECTION — поле-связка с сущностью секций данного инфоблока, полученной из провайдера сущностей, объединение производится по значению поля IBLOCK_SECTION_ID.

  • SECTION_ELEMENT_REFERENCE — поле-связка для сущности Bitrix\Iblock\SectionElement, содержащей данные о множественной привязке элементов к секциям.

  • ELEMENT_SECTIONS — поле-связка для сущности секций данного инфоблока, полученной из провайдера сущностей, объединение выполнено для множественной привязки элементов к секциям.

Секции

Табличный класс секций конкретного инфоблока наследуется от стандартного класса \Bitrix\Iblock\SectionTable и наследует все поля, объявленные в этом табличном классе.

Кроме того, табличный класс подключает пользовательские поля, созданные для сущности секций этого инфоблока. Доступ к этим полям осуществляется так, как описано в документации Bitrix.

Помимо этого доступны следующие дополнительные поля:

  • PARENT_SECTION — поле-связка для этой же сущности на строку родительской секции, выполенная по полю IBLOCK_SECTION_ID.

  • PARENT_SECTIONS — поле-связка для этой же сущности на строки всех родительских секций, выполненная по полям LEFT_MARGIN, RIGHT_MARGIN.

  • CHILDREN_SECTIONS — поле-связка для этой же сущности на строки всех дочерних секций, выполненная по полям LEFT_MARGIN, RIGHT_MARGIN.

  • CHILDREN_SECTIONS_SELF — поле-связка для этой же сущности на строки всех дочерних секций с включением данной секции, выполненная по полям LEFT_MARGIN, RIGHT_MARGIN.

  • CODE_PATH — поле содержит вычисленное значение пути к секции, выполенное при помощи конкатенации значений поля «Символьный код» родительских секций (если отсутствует — используется идентификатор секции) в иерархическом порядке с разделителем — символом слэша /.

Значения свойств элементов

Наиболее удобной фичей при работе с инфоблоками является возможность расширения структуры сохраняемых в них данных при помощи добавления свойств. Однако свойства не хранятся в таблице элементов инфоблоков, поэтому доступ к их значениям должен быть реализован через отдельную сущность.

Битрикс предоставляет два варианта хранения значений — в общей для всех инфоблоков таблице, а также в совокупности отдельных таблиц для значений единичных и множественных свойств.

К сожалению,пока что стандартный класс для доступа к значениям свойств элементов инфоблоков не предоставляется, поэтому инструментарийможет создавать табличные классы следующей структуры, одинаковой для режима хранения данных в общей или отдельных таблицах.

В табличном классе доступны следующие поля:

  • IBLOCK_ELEMENT_ID — идентификатор элемента инфоблока.

Для каждого из свойств инфоблока доступен следующий набор полей (<CODE> обозначает символьный код свойства):

  • <CODE> — значение свойства; если свойство не имеет объявленного символьного кода, данное поле будет иметь именование PROP_<ID>, где <ID> — числовой идентификатор свойства (не стоит использовать подобный метод адресации при продуктивной эксплуатации: все свойства должны иметь символьные коды).

  • <CODE>_VALUE_ID — идентификатор значения свойства элемента инфоблока; вычисляется так же, как это делает стандартное API: для значений множественных свойств, а также единичных свойств при хранении в общей таблице, — идентификатор строки значения, для единичных свойств при хранении в отдельной таблице — выражение <PROPERTY_ID>:<ELEMENT_ID>, где <PROPERTY_ID> — идентификатор свойства, <ELEMENT_ID> — идентификатор элемента.

  • <CODE>_DESCRIPTION — поле описания значения, доступно, если для свойства включен соответствующий режим в настройках.

  • <CODE>_REFERENCE — связь значения свойства с записью из таблицы, содержащей это значение. Для передачи данного поля необходимо зарегистрировать в менеджере полей-связей соответствующий обработчик. Если набор зарегистрированных обработчиков не вернули для свойства инфоблока объект поля-связки, данное поле не будет предоставляться. По умолчанию для следующих стандартных типов свойств будет объявлен reference на соответствующую сущность:

    • «Файл» — \Bitrix\Main\File,
    • «Пользователь» — \Bitrix\Main\User,
    • «Список» — \Bitrix\Iblock\PropertyEnumeration,
    • «Привязка к элементу инфоблока», «Привязка к элементу инфоблока по XML_ID» — сущность элементов соответствующего инфоблока, полученная из провайдера сущностей этого инфоблока.
    • «Привязка к секции» — сущность секций соответствующего инфоблока, полученная из провайдера сущностей этого инфоблока.

  • <CODE>_ROW — служебное поле-связка для строки таблицы-хранилища значений единичных свойств при хранении в общей таблицы и множественных свойств при хранении в отдельной таблице.

Руководство по эксплуатации

Инициализация сервиса

Взаимодействие с функциональностью выполняется через объект класса Lenvendo\IblockOrm\Manager. В рамках одного проекта в программном интерфейса должен использоваться только один экземпляр этого объекта.

Предполагается, что объект будет инициализирован в виде сервиса в контейнере DI. Для инициализации достаточно вызвать конструктор:

<?php

$manager = new \Lenvendo\IblockOrm\Manager();

При отстутствии контейнера DI в програмном интерфейсе проекта, возможно использовать встроенный механизм получения единственного экземпляра объекта (метод является deprecated):

<?php

$manager = \Lenvendo\IblockOrm\Manager::getInstance();

При инициализации сервиса может потребоваться передача объектов кастомизированных сервисов для реализации специфической проектной логики, об этом — см. ниже.

Провайдер сущностей

Провайдер сущностей реализует доступ к именованию сущностей и табличных классов конкретного инфоблока.

Получение провайдера сущностей необходимо осуществить при помощи объекта менеджера.

Доступ возможен по идентификатору инфоблока:

<?php

$iblockId = 1;
$entityProvider = $manager->getProvider($iblockId);

... или по символьному коду и типу инфоблока (тип является опциональным аргументом):

<?php

$iblockType = 'product';
$iblockCode = 'catalog';
$entityProvider = $manager->getProviderByCode($iblockCode, $iblockType);

Результатом вызова этих методов будет являться объект, реализующий интерфейс \Lenvendo\IblockOrm\EntityProviderInterface, в котором доступны следующие методы, необходимые для выборки или привязки данных:

  • getElementEntityName — получение именования сущности элементов инфоблока,
  • getElementTableClassName — получение именования табличного класса сущности элементов инфоблока,
  • getSectionEntityName — получение именования сущности секций инфоблока,
  • getSectionTableClassName — получение именования табличного класса сущности элементов инфоблока,
  • getElementPropertyEntityName — получение именования сущности значений свойств элементов инфоблока,
  • getElementPropertyTableClassName — получение именования табличного класса сущности значений свойств элементов инфоблока,
  • getElementPropertyMultipleEntityName — получение именования сущности значений множественных свойств элементов инфоблока,
  • getElementPropertyMultipleTableClassName — получение именования табличного класса сущности значений множественных свойств элементов инфоблока.

По умолчанию для создания провайдеров сущностей используется класс \Lenvendo\IblockOrm\DefaultEntityProvider, реализующий генерацию табличных классов сущностей «на лету».

Выборка элементов инфоблока

Для выборки данных элементов инфоблока необходимо получить из провайдера сущностей наименование табличного класса элементов при помощи метода getElementTableClassName:

<?php

$elementTableClassName = $entityProvider->getElementTableClassName();
$query = $elementTableClassName::query()
    ->setFilter([
        '<=ACTIVE_FROM' => new Date(),
        '>=ACTIVE_TO' => new Date(),
        '@PROPERTY.BRAND' => $brands,
    ])
    ->setSelect(['ID', 'NAME', 'BRAND' => 'PROPERTY.BRAND']);
$result = $query->exec();
while($data = $result->fetch()) {
    var_dump($data);
}

Значение $elementTableClassName содержит имя табличного класса сущности элементов инфоблока. Сам этот класс расширяет стандартный \Bitrix\Main\Entity\DataManager, что позволяет использовать все методы, осуществляющие выборку данных.

Выборка по разделам инфоблока

Аналогично — для выборки по секциям необходимо получить имя табличного класса для сущности секций инфоблока при помощи метода getSectionTableClassName:

<?php
$sectionTableClassName = $entityProvider->getSectionTableClassName();

$sections = $sectionTableClassName::query()
    ->setFilter([
        '>DEPTH_LEVEL' => 1,
        '=UF_HEAD' => $this->user->getId(),
    ])
    ->setSelect(['ID', 'NAME'])
    ->exec()
    ->fetchAll();