В очередной раз столкнулся с тем что нужно выбрать свойства элементов, а хочется уже начать писать на D7 и ждать документацию нет сил.
Получился такой класс:
Думаю в классе ничего сверхъестественного нет — описываю ORM сущность со связями к сущностям PROPERTY(для получения параметров), ELEMENT(для получения данных элемента) и ENUM(для получения значений списков).
Дополнительно для себя пишу метод getProperties, который результатом похож на CIBlockElement::GetProperty — он принимает стандартный набор параметров для ORM GEtList и анонимную функцию для обработки результатов.
В результате можно работать со свойствами элементов как со всеми ORM сущностями.
Пример использования:
Необходимо получить свойство «SUBHEAD» (строка) для всех элементов указанных в свойстве «PROJECTS» (множественная привязка к элементам инфоблока)
Я вызываю свой метод «getProperties» с параметрами — ID необходимых элементов, кодом свойства и ID инфоблока для выборки данных. Так же в вызове анонимной функции я сохраняю в результирующий массив данные с ключом — ID элемента.
Код не претендует на новацию, но так ничего и не нашёл по работе с свойствами в D7.
Получился такой класс:
<?php use Bitrix\Main\Entity; class IblockElementPropertyTable extends Entity\DataManager{ public static function getFilePath(){ return __FILE__; } public static function getTableName(){ return 'b_iblock_element_property'; } public static function getMap(){ return array( 'ID' => array( 'data_type' => 'integer', 'primary' => true, 'autocomplete' => true, 'title' => "ID", ), 'IBLOCK_PROPERTY_ID' => array( 'data_type' => 'integer', 'primary' => true, ), 'IBLOCK_ELEMENT_ID' => array( 'data_type' => 'integer', 'primary' => true, ), 'VALUE' => array( 'data_type' => 'string', 'required' => true, ), 'VALUE_TYPE' => array( 'data_type' => 'string', 'required' => true, ), 'VALUE_ENUM' => array( 'data_type' => 'integer', ), 'VALUE_NUM' => array( 'data_type' => 'float', ), 'DESCRIPTION' => array( 'data_type' => 'string', ), 'PROPERTY' => array( 'data_type' => 'Bitrix\Iblock\Property', 'reference' => array('=this.IBLOCK_PROPERTY_ID' => 'ref.ID'), ), 'ELEMENT' => array( 'data_type' => 'Bitrix\Iblock\Element', 'reference' => array('=this.IBLOCK_ELEMENT_ID' => 'ref.ID'), ), 'ENUM' => array( 'data_type' => 'Bitrix\Iblock\PropertyEnumeration', 'reference' => array('=this.VALUE_ENUM' => 'ref.ID'), ) ); } public static function getProperties(array $parameters = array(), $funcFetch = false){ if(!isset($parameters["select"])) $parameters["select"] = array(); $defaultSelect = array( "PROPERTY_ID" => "PROPERTY.ID", "PROPERTY_CODE" => "PROPERTY.CODE", "PROPERTY_NAME" => "PROPERTY.NAME", "PROPERTY_IS_REQUIRED" => "PROPERTY.IS_REQUIRED", "PROPERTY_TYPE" => "PROPERTY.PROPERTY_TYPE", "PROPERTY_MULTIPLE" => "PROPERTY.MULTIPLE", "PROPERTY_DEFAULT_VALUE" => "PROPERTY.DEFAULT_VALUE", "PROPERTY_VALUE_ID" => "ID", "VALUE" => "VALUE", "VALUE_ENUM", "VALUE_XML_ID" => "ENUM.XML_ID", "VALUE_NUM", ); $parameters["select"] = array_merge($defaultSelect, $parameters["select"]); return is_callable($funcFetch)?$funcFetch(self::getList($parameters)):self::getList($parameters)->fetchAll(); } } |
Думаю в классе ничего сверхъестественного нет — описываю ORM сущность со связями к сущностям PROPERTY(для получения параметров), ELEMENT(для получения данных элемента) и ENUM(для получения значений списков).
Дополнительно для себя пишу метод getProperties, который результатом похож на CIBlockElement::GetProperty — он принимает стандартный набор параметров для ORM GEtList и анонимную функцию для обработки результатов.
В результате можно работать со свойствами элементов как со всеми ORM сущностями.
Пример использования:
Необходимо получить свойство «SUBHEAD» (строка) для всех элементов указанных в свойстве «PROJECTS» (множественная привязка к элементам инфоблока)
$arSubheadProp = IblockElementPropertyTable::getProperties( array( "filter" => array( "IBLOCK_ELEMENT_ID" => $arResult["PROPERTIES"]["PROJECTS"]["VALUE"], "=PROPERTY.CODE" => "SUBHEAD", "=ELEMENT.IBLOCK_ID" => 1 ), "select" => array( "ELEMENT_ID" => "ELEMENT.ID" ) ), function($res){ $resArr = array(); while($data = $res->fetch()) $resArr[$data["ELEMENT_ID"]] = $data; return $resArr; } ); |
Я вызываю свой метод «getProperties» с параметрами — ID необходимых элементов, кодом свойства и ID инфоблока для выборки данных. Так же в вызове анонимной функции я сохраняю в результирующий массив данные с ключом — ID элемента.
Код не претендует на новацию, но так ничего и не нашёл по работе с свойствами в D7.