Статьи 1С-Битрикс

Решил задачу, рассказал об этом

\Bitrix\Iblock\ElementTable::getList получить свойства элементов используя новое ядро D7

\Bitrix\Iblock\ElementTable::getList получить свойства элементов используя новое ядро D7

В новом ядре 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/

Возврат к списку