Abr@X@bra.ru

Битрикс D7, инфоблоки - ORM

28.07.2016
3486

Все знаю что у Битрикс появилась какая-никакая, но все-таки ORM.

И они даже модуль магазина полностью на него пересадили. И вот как было бы хорошо такую штуку да под модуль инфоблоков (ИБ).

На одной из конференций я как-то спросил разработчиков - будут ли они пересаживать модуль ИБ полностью на D7. На что они сказали, что даже в планах такого нет.

И это пИчалька.

Приходится для своих нужд изобретать. И вот родился модуль D7 для инфоблоков.

Что он умеет:

  • Делать основные выборки со свойствами
  • Фильтровать, группировать, сортировать по полям ИБ и его свойствам
  • Поддержка инфоблоков версии 1 и 2
  • Фильтрация и выборка по множественным св-ам
Что он пока не умеет:
  • Выборка в связке ИБ + каталог из коробки, пока только ручками пристегивать нужные сущности
  • Выборка ИБ + SKU со всеми вытекающими (опять же можно пристегнуть ручками ИБ с SKU)
  • Сохранять, удалять и обновлять записи.

Ну да лучше посмотреть на практике.

Качаем себе в local модуль ab.iblock https://github.com/StanislavDremin/ab.iblock

Устанавливаем в админке. При установке модуль добавляет обработчики на OnAfterIBlockPropertyAdd, OnAfterIBlockPropertyUpdate и OnBeforeIBlockPropertyDelete.

Далее подключаем модуль как обычно

use AB\Iblock\Element;
use Bitrix\Main\Loader;

Loader::includeModule('ab.iblock');

И поехали...

После подключения доступен класс AB\Iblock\Element - это основной класс для работы с инфоблоками. 

Простая выборка.


$res = Element::getList([
'select' => [
'ID','NAME',
'BARCODE' => 'PROPERTY.BARCODE',
'SHOP' => 'PROPERTY.SHOP_CITY',
'BRANDS' => 'PROPERTY.BRANDS',
'ART_NUMBER' => 'PROPERTY.ARTICLE'
],
'filter' => [
'IBLOCK_ID'=>4,
'ACTIVE' => 'Y',
],
'limit' => 10,
'order' => ['TIMESTAMP_X'=>'DESC']
]); $res->fetchAll();

Разбираем по косточкам. getList - стандартный битриксовый метод выборки. Т.к. класс Element наследуется от Entity\DataManager - то в нем доступны все методы датаманагера.

select - собссно то, что нужно выгребать из базы. ID и NAME - стандартные поля ИБ. А вот PROPERTY - это уже сущность св-в конкретного инфоблока, через которую и нужно фильтровать, выбирать и пр. по свойствам.

Внимание! Сущность PROPERTY доступна только если указан инфоблок в секции filter.
В этом примере мы выбираем ИД и название из ИБ, а так же вытягиваем св-ва SHOP_CITY - множественное, BRANDS - список, артикул ARTICLE - простую строку и сортируем это все по дате изменения товара.

В результате мы получим список вида

Array
(
    [0] => Array
        (
            [ID] => 2806
            [NAME] => Семена «КАБАЧОК Белоплодный КАБАЧОК»
            [BARCODE] => 4601431029187
            [SHOP] => Array
                (
                    [VALUE] => Array
                        (
                            [0] => 6634
                            [1] => 317
                        )

                    [DESCRIPTION] => Array
                        (
                            [0] => 
                            [1] => 
                        )

                    [ID] => Array
                        (
                            [0] => 1
                            [1] => 2
                        )

                )

            [BRANDS] => Array
                (
                    [ID] => 19
                    [VALUE] => Brend 5
                    [XML_ID] => c874efbb20512b893da9be0a14d89fb8
                )

            [ART_NUMBER] => 683950
        )

    [1] => Array
        (
            [ID] => 2807
            [NAME] => Семена «Горчица Лис волнушка»
            [BARCODE] => 4601431024953
            [SHOP] => 
            [BRANDS] => Array
                (
                    [ID] => 20
                    [VALUE] => Brend 6
                    [XML_ID] => 270e35793d2f7655c7e2d027c6d67243
                )

            [ART_NUMBER] => 683904
        ).....

Как видим, в результате у нас есть св-во SHOP - оно множественное, вернулся результат стандартного битриксового вида множ. свойств. Св-во BRANDS - в данном случае список и нам показан ИД варианта списка, его значение и внешний код.

Но это еще не все.

Фильтровать можно так же по всем св-ам, но если, к примеру, свойство BRANDS - это по факту число = ИД варианта списка, то в фильтре оно превратится в полноценную сущность привязки к таблице списков. И мы можем использовать поля этой сущности. 

$res = Element::getList([
'select' => [
'ID','NAME',
'BARCODE' => 'PROPERTY.BARCODE',
'SHOP' => 'PROPERTY.SHOP_CITY',
'BRANDS' => 'PROPERTY.BRANDS',
'ART_NUMBER' => 'PROPERTY.ARTICLE'
],
'filter' => [
'IBLOCK_ID'=>4,
'ACTIVE' => 'Y',
'PROPERTY.BRANDS.VALUE' => 'Brend 6' // добавляем в фильтр фильтрацию по значению списка
],
'limit' => 10,
'order' => ['TIMESTAMP_X'=>'DESC']
]);

Результат - все записи с установленным Brend 6

Array
(
    [0] => Array
        (
            [ID] => 2807
            [NAME] => Семена «Горчица Лис волнушка»
            [BARCODE] => 4601431024953
            [SHOP] => 
            [BRANDS] => Brend 6
            [ART_NUMBER] => 683904
        )

    [1] => Array
        (
            [ID] => 2848
            [NAME] => Семена «УКРОП Амбрелла», 2 г
            [BARCODE] => 4601431007628
            [SHOP] => 
            [BRANDS] => Brend 6
            [ART_NUMBER] => 432785
        )

    [2] => Array
        (
            [ID] => 2857
            [NAME] => Семена «НАПЕРСТЯНКА Глоксиние Цветная»
            [BARCODE] => 4601729068539
            [SHOP] => 
            [BRANDS] => Brend 6
            [ART_NUMBER] => 876369
        )
......

Связка с другими таблицами.

Товар мы вытащили на свет, а давайте присобачим к нему еще и цену.

$res = Element::getList([
'select' => [
'ID','CODE',
'PROPERTY.CML2_LINK.NAME',
'PRICE'=>'CATALOG.PRICE'
],
'filter' => [
'IBLOCK_ID'=>6,
'ACTIVE' => 'Y',
],
'runtime' => [
new \Bitrix\Main\Entity\ReferenceField(
'CATALOG',
\Bitrix\Catalog\PriceTable::getEntity(),
['=this.ID' => 'ref.PRODUCT_ID']
)
],
'limit' => 10
]); $res->fetchAll();

Привязываемся через секцию runtime на таблицу цен. Получаем:

Array
(
    [0] => Array
        (
            [ID] => 84465
            [CODE] => 469036303142|7
            [AB_IBLOCK_ORM_ELEMENT_PROPERTY_CML2_LINK_NAME] => Семена «КАБАЧОК белоплодный Умка», 2 г
            [PRICE] => 2.00
        )

    [1] => Array
        (
            [ID] => 84466
            [CODE] => 469036303336|26
            [AB_IBLOCK_ORM_ELEMENT_PROPERTY_CML2_LINK_NAME] => Семена «АРБУЗ Скорик»
            [PRICE] => 3.00
        )

    [2] => Array
        (
            [ID] => 84467
            [CODE] => 469036303143|28
            [AB_IBLOCK_ORM_ELEMENT_PROPERTY_CML2_LINK_NAME] => Семена «КОРИАНДР Стимул», 5 г
            [PRICE] => 4.00
        )
.....

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

А можно так же использовать PROPERTY.CML2_LINK.DETAIL_PICTURE или даже PROPERTY.CML2_LINK.PROPERTY.BRANDS

И у нас есть теперь цена товара. Так же через сущность CATALOG можно тащить валюту и все поля из таблицы b_catalog_price.

Так же можно работать через объект Query, но получать его экземпляр нужно через $Query = Element::query(); т.к. он унаследован от родного  Bitrix\Main\Entity\Query


На этом пока все. 

Следите за обновлениями.

В следующий раз заглянем под капот.





D7, PHP, Bitrix, ORM
Читайте также:
Интернет-магазин на «1С-Битрикс» и онлайн-кассы

Интернет-магазин на «1С-Битрикс» и онлайн-кассы

В данном посте хочу рассказать о том как подключить онлайн-кассы в новой редакции 1С-Битрикс. Чтобы избежать проблем...
Читать
Добавляем кнопку кода в визуальный редактор битрикса

Добавляем кнопку кода в визуальный редактор битрикса

Разберем как поставить кнопку оформления кода в редакторе битрикса и прикрутим нормальную подсветку.
Читать
Жизнь без смартфонов на фотографиях Эрика Пикерсгилла

Жизнь без смартфонов на фотографиях Эрика Пикерсгилла

Вооружившись камерой, Эрик Пикерсгилл (Eric Pickersgill) путешествует по Северной Калифорнии, создавая запоминающиеся чё...
Читать