Skip to content

Работа с элементами инфоблока средствами ORM в Битрикс D7

С выходом 20-й версии 1С Битрикс, появилась возможность работы с элементами инфоблока средствами ORM. Для того, чтобы начать использовать эту возможность вам необходимо зайти в настройки информационного блока и задать значения для поля «Символьный код API». Согласно документации, символьный код API это строка от 1 до 50 символов состоящая из букв и  цифр, начинающаяся с буквы. Я взял инфоблок «Одежда» из коробки БУС редакции «Бизнес» и задал код products.

Символьный код API

Для работы с элементами инфоблока средствами ORM, необходимо использовать класс \Bitrix\Iblock\Elements\Element_Символьный_код_API_инфоблока_Table, в моём случае это класс \Bitrix\Iblock\Elements\ElementProductsTable. Можно убедиться в этом вызвав следующий код:

Выведет строку \Bitrix\Iblock\Elements\ElementProductsTable. Давайте рассмотрим практические примеры работы, подберём аналоги уже привычных нам методов старого ядра.

Аналог CIBlockElement::GetById() в ORM

Для получения данных по элементу инфоблока, по ID этого элемента, используется метод getByPrimary() вашего «виртуального класса»:

В переменной $product будет примерно такая информация:

Обратите внимание, что ключи пользовательских свойств инфоблока, MANUFACTURER и MATERIAL указываются как есть, без префикса PROPERTY_. Чтобы избежать таких длинных ключей как IBLOCK_ELEMENTS_ELEMENT_PRODUCTS_MANUFACTURER_IBLOCK_ELEMENT_ID в результирующем массиве, можно использовать псевдонимы, вот так:

В таком случае, данные приходят в более удобном виде:

Элемент инфоблока как объект

С данными элемента инфоблока можно работать не только как с массивом, но и как с объектом. Для этого используйте метод fetchObject() вместо fetch() после вызова getByPrimary().

В данном случае, в $product будет получен объект класса Bitrix\Iblock\Elements\EO_ElementProducts с множеством методов для работы с ним. Например:

Как видите для получения значений элемента инфоблока используются так называемые геттеры (методы getXXXX где XXX — название поля в «верблюжьей нотации» или CamelCase). Существует так же общий метод get() который принимает наименование поля, значение которого вам нужно получить. Например:

Свойства элемента

Свойства элементов (когда мы работаем с ними в виде объекта) так же получаются при помощи геттеров (методов getXXXX где XXXX — код свойства записанный как CamelCase). У каждого свойства есть поле значения VALUE и описания DESCRIPTION и соответcnвующие методы для доступа к ним getValue() и getDescription().  Рассмотрим пример:

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

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

  • FILE — свойство типа файл
  • ITEM — свойство типа список,
  • ELEMENT — свойство типа привязка к элементу инфоблока
  • SECTION — свойство типа привязка к разделу инфоблока

Давайте рассмотрим это детальнее. У нашего элемента есть следующие свойства требуемых типов:

  • MORE_PHOTO — Картинки галереи (тип файл)
  • NEWPRODUCT — Новинка (тип список)
  • RECOMMEND — С этим товаром рекомендуем (тип привязка к элементу)
  • NEWS_SECTION — Показывать в рекламном блоке в новостях (тип привязка к разделу), это я создал для теста, в «коробке» такого нет 

Давайте получим их в ORM:

Свойство типа файл в ORM

Обратите внимание во первых на метод getAll(), т.к. свойство MORE_PHOTO — множественное, по сути оно представляет из себя коллекцию значений. Чтобы получить всю коллекцию и применяют метод getAll(). Далее при обходе элемента коллекции свойства типа файл мы получаем в распоряжение метод getFile() , который в свою очередь открывает нам доступ к методам getSubdir() и getFileName() для получения дополнительной информации о файле.

Свойство типа список в ORM

Как видите для свойств типа список (при использовании специального ключа .ITEM) добавляется метод getItem() который позволяет получить ID значения списка методом getId(), внешний код значения getXmlId() и само значение методом getValue().

Свойство типа привязка к элементам инфоблока в ORM

Т.е. рекомендуемые товары так же являются множественным свойством получаем коллекцию значений через getAll(). Далее мы видим, что элементу коллекции доступен метод getElement() через который мы можем узнать некоторую информацию об элементе, например ID getId() и наименование getName().

Свойство типа привязка к разделу инфоблока в ORM

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

Аналог CIBlockElement::GetList() в ORM

В качестве аналога к всем полюбившимся методу CIBlockElement::GetList() используется getList() из D7 который применялся к HL-блокам ранее. Приведу пример:

Тут всё как в HL блоках D7, поэтому детально разбирать этот вопрос я не стану.

Кеширование результата выборки данных

В Битрикс ORM несколько упростили процедуру кеширования результатов выборки из инфоблока. Для этого вам достаточно добавить в массив параметра метода getList() поле cache и указать параметры кеширования:

В одной из ближайших статей я напишу простой компонент в двух версиях, старой с использованием классических приёмов работы с ифноблокми и новой с использованием ORM и сравню производительность.

Надеюсь статья окажется для вас полезной, желаю удачи!

Понравилось? Поделись с друзьями:Share on VK
VK
Share on Facebook
Facebook
Tweet about this on Twitter
Twitter
ОпубликованоРазработка сайтов на 1С Битрикс

Оставьте первый комментарий!

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *

Защита от ботов *

Оставляя комментарий на сайте, вы даёте согласие на обработку персональных данных и соглашаетесь с политикой конфиденциальности
© it-svalka.ru 2013 - 2020 г. - Копирование материалов сайта запрещено.