В очередной раз столкнулся с тем что нужно выбрать свойства элементов, а хочется уже начать писать на 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.