Решил задачу, рассказал об этом
В новом ядре D7 битрикс появилаcь новая технология ORM. Она заменяет привычный GetList и позволяет выбирать данные из таблиц битрикс не пользуясь прямыми запросами к базе данных. В итоге операции выборки и сохранения в БД получаются однотипными, с одинаковыми параметрами и фильтрам. Для выборки данных необходимо описать в виде класса некую сущность и поля этой сущности. Сущность это таблица базы данных, поля сущности - столбцы таблицы.
Для каждой сущности нужно создать описание. В битрикс уже есть некоторые описания таблиц(сущности), но вот для выборки своих свойств инфоблока, сущность не описана. Поэтому мы это сделаем самостоятельно.
Существует уже описанная сущность для выборки полей из таблицы b_iblock_element с помощью \Bitrix\Iblock\ElementTable::getList. Сущность описана в файле /bitrix/modules/iblock/lib/element.php
class ElementTable extends Main\Entity\DataManager { public static function getTableName() { return 'b_iblock_element'; } public static function getMap() { return array( ... 'IBLOCK_SECTION_ID' => array( // Основной раздел 'data_type' => 'integer', 'title' => Loc::getMessage('ELEMENT_ENTITY_IBLOCK_SECTION_ID_FIELD'), ), 'ACTIVE' => array( // Активность 'data_type' => 'boolean', 'values' => array('N', 'Y'), 'title' => Loc::getMessage('ELEMENT_ENTITY_ACTIVE_FIELD'), ), 'IBLOCK' => array( //связка с другой таблицей 'data_type' => 'Bitrix\Iblock\Iblock', 'reference' => array('=this.IBLOCK_ID' => 'ref.ID'), ), ); } }
Основные функции это
getTableName(), где возвращается название таблицы b_iblock_element
и
getMap(), где возвращаются описанные полей таблицы
В методе getMap() описываются поля таблицы и помимо этого описаны «ссылки» на другие сущности, для взаимосвязи. Например описана ссылка на таблицу IblockTable, чтобы можно было достать данные из таблицы b_iblock. Таблицы связываются по полю ID конструкцией представленной ниже и выбрать данные из таблице можно указав а параметре select параметр IBLOCK.CODE
'IBLOCK' => array( 'data_type' => 'Bitrix\Iblock\Iblock', 'reference' => array('=this.IBLOCK_ID' => 'ref.ID'), ),
Чтобы выбрать стандартные поля элементов, которые описаны в методе getMap() необходима запись вида
$rs = \Bitrix\Iblock\ElementTable::getList( 'filter' => array( "ID"=>$arId ), 'select' => array( 'ID', 'IBLOCK.CODE' )); while($r = $rs->fetch()) { $arResult[] = $r; }
Узнать какие можно получить свойства элементов, можно исполнить функцию \Bitrix\Iblock\ElementTable::getMap();
Но если нам нужно получить свои свойства элементов, нужно описать сущность другой таблицы. Если как у меня в настройках инфоблока значения свойств хранятся в отдельной таблице для данного информационного блока, то таблица будет называться b_iblock_element_prop_s3, где цифра 3 - это ID инфоблока. Вот для этой таблицы мы и будем описывать сущность b_iblock_element_prop_s3.
Привожу простой пример класса. Его мы назовем IblockElementPropertyTable и положим в файл elementproperty.php, подключив например в init.php При этом Table в конце названия обязательно. В классе опишем не все поля таблицы, а только те которые нам нужно. Сделаем это для свойства с названием Артикул. Его id равно 21
namespace Bitrix\Iblock; use Bitrix\Main\Entity; class IblockElementPropertyTable extends Entity\DataManager{ public static function getTableName(){ return 'b_iblock_element_prop_s3'; } public static function getMap(){ return array( new Entity\IntegerField( 'IBLOCK_ELEMENT_ID', array( 'primary' => true ) ), new Entity\StringField( 'PROPERTY_21', array( 'required' => true ) ) ); } }
Так, чтобы получить свойство с id 21 необходимо его описать в данном классе.
После всего необходимо связать две таблицы. Укажем отношение двух столбцов. Для этого обозначим в параметре runtime, что значение из столбца ID таблицы b_iblock_element является "ссылкой" на столбец IBLOCK_ELEMENT_ID таблицы b_iblock_element_prop_s3. И теперь можно в параметре select указать на выборку свойства ID=21.
$params = array( 'filter' => array( "ID"=>$arId ), 'select' => array( 'ID', 'PROPERTY_21' =>'PROPERTY.PROPERTY_21' ), ); $params['runtime'] = array( 'PROPERTY' => array( 'data_type' => 'Bitrix\Iblock\IblockElementProperty', 'reference' => array('=this.ID' => 'ref.IBLOCK_ELEMENT_ID'), ) ); $rs = \Bitrix\Iblock\ElementTable::getList($params); while($r = $rs->fetch()) { $arResult[] = $r; }
Подробнее как описываются поля здесь https://dev.1c-bitrix.ru/learning/course/index.php?COURSE_ID=43&LESSON_ID=4803
Так же хорошие статьи
https://tokmakov.msk.ru/blog/item/210
https://dev.1c-bitrix.ru/support/forum/forum6/topic88441/index.php
https://dev.1c-bitrix.ru/community/webdev/user/232354/blog/19113/