Soft1c\OrmIblock - 1csoft/orm-iblock GitHub Wiki
ElementTable
Т.к. этот класс наследован от Bitrix\Main\Entity\DataManager, он имеет все возможности родителя.
ElementTable::getEntity() - построение сущности инфоблока. Если передать в нее ид инфоблока - соберет сущность со свойствами.
Soft1c\OrmIblock\ElementTable::getEntity($iblock_id);
В этом случае будет добавлено поле PROPERTY типа Reference на таблицу значений св-в ИБ. Причем, в зависимости от версии ИБ, связь будет либо на таблицы b_iblock_element_prop_s или на b_iblock_element_property.
ElementTable::query($iblock_id = null) - получение объекта Query, если передать ид ИБ, то действие будет аналогично ElementTable::getEntity.
ElementTable::getList(array $parameters = array()) - стандартный getList, принимает все теже параметры, что и Bitrix\Main\Entity\DataManager::getList.
Примеры:
$rs = OrmIblock\ElementTable::getList([
'filter' => [
'IBLOCK_ID' => $iblock,
'=ACTIVE'=>'Y'
],
'select' => [
'ID',
'ADDITIONAL_MIN' =>'PROPERTY.ADDITIONAL_MIN',
'PRICES' => 'PROPERTY.PRODUCT_PRICE_REF.PROPERTY.PRISE_FOR',
'DISTRIBUTION_TYPE' => 'PROPERTY.DISTRIBUTION_TYPE'
],
'limit' => 20
]);
Получение св-в в выборке идет через референс PROPERTY.CODE, где CODE - символьный код св-ва.
Если кода у св-ва нет, будет брошено исключение. Ибо, св-ва без кода - это полная хрень.
PROPERTY.ADDITIONAL_MIN - будет выбрано простое строковое или html значение.
Для получение полей и св-в привязанных элементов нужно использовать референс PROPERTY.CODE_REF
, где CODE - символьный код св-ва,
а приставка _REF показывает что это не просто значение а референс на таблицу с другим ИБ.
Т.о мы можем получить поля элемента PROPERTY.PRODUCT_PRICE_REF.NAME
и т.д., или св-ва PROPERTY.PRODUCT_PRICE_REF.PROPERTY.PRISE_FOR
Причем если PRISE_FOR - это тоже привязка на другой ИБ, то далее можно продолжать цепочку - PROPERTY.PRODUCT_PRICE_REF.PROPERTY.PRISE_FOR.NAME
Но строить совсем дикие длинные цепочки не стоит.
Св-ва типа список получаются таким же образом, только вместо приставки _REF надо использовать _ENUM.
PROPERTY.DISTRIBUTION_TYPE_ENUM.VALUE
или PROPERTY.DISTRIBUTION_TYPE_ENUM.XML_ID
.
Все эти правила доступны во всех параметрах getList.
Однако, при фильтрации по PROPERTY.DISTRIBUTION_TYPE_ENUM.VALUE
надо понимать, что поле VALUE - это строка и на ней нет индекса в БД.
Тоже касается и остальных полей привязок. Все выборки на страх и совесть программера.
ElementTable::getProperty(array $parameters) - внутренний метод получение одного или всех свойств элемента по параметрам
DataManager::getList. Этот метод выдирает Bitrix\Iblock\PropertyTable::getList($parameters)
, а перед этим собирает
Entity таблицы со значениеями конкретного инфоблока и элемента и пристегивает к PropertyTable. Посему, в $parameters обязательно должны быть ключи
$iblockId = (int)$parameters['filter']['IBLOCK_ID'];
$elementId = (int)$parameters['filter']['IBLOCK_ELEMENT_ID'];
Этот метод редко приходится юзать, я бы сказал в довольно экзотичных задачах. Более используются его обертки:
ElementTable::getPropertyByCode(int $elementId, int $iblockId, string $code, $select = false) - получение св-ва елемента по его символьному коду.
ElementTable::getPropertyById(int $elementId, int $iblockId, string $code, $select = false) - получение св-ва елемента по его ID.
В обоих методах есть параметр $select и в него можно указать какие поля дополнительно выдрать, если текущее св-во есть привязка к другому элементу, категории или списку значений. Множественное свойство будет показано как обычно, но если оно привязка и в $select указать какое-либо его поле, то вернется только одно значение. Это особенности построения множественной привязки к ИБ, как для выборки в getList, так и в этом случае. Может быть в будущем это поменяю. Синтаксис $select аналогичен синтаксису getList.
$result = OrmIblock\ElementTable::getPropertyByCode(20071776, $iblock, 'PUBLISHERS_RUS', [
'PUBLISHERS_RUS_NAME' => 'PUBLISHERS_RUS_REF.NAME'
]);
PUBLISHERS_RUS - св-во привязка к другому ИБ, и мы хотим получить не только его ИД, но и название PUBLISHERS_RUS_REF.NAME
$result = OrmIblock\ElementTable::getPropertyByCode(20071776, $iblock, 'PUBLISHERS_RUS');
Этот код вернет все поля таблицы описалова св-в и его значение