lenvendo / iblock-orm
Компонент для работы с Инфоблоками 1С-Битрикс через ORM
Requires
- php: ^7.0.0
- lenvendo/orm-model: *
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();