k #Abstract Iblock Elements Layer
- Удобное использование классов в шаблонах компонент, все поля подсказываются
- Удобная выборка связанных полей связанных элементов в качестве неограниченной вложенности, естественно, тоже с подсказками по связанным элементам
1/ Выяснить соль, либо переопределить ее в dbconn.php
define('ABSTRACT_LAYER_SAULT', 'MY_SITE_RU');
Для удобства использования в нескольких проектах следует указать соль, используемая в имени генерированных классов, напр. подключить так
// напр. для сайта www.mysite.ru следует указать (разрешены только символы по маске: [0-9a-zA-Z_])
define('ABSTRACT_LAYER_SAULT', 'MY_SITE_RU');
/*
* Если не установлена, по-умолчанию константа ABSTRACT_LAYER_SAULT принимает значение
* трансформированного имени домена:
* Напр. www.good-site.wexpert.ru --> GOOD_SITE_WEXPERT_RU
*/
2/ Имя класса пишется следующим образом: __hiIblockElementItem_#ABSTRACT_LAYER_SAULT#_#IBLOCK_ID#
#ABSTRACT_LAYER_SAULT#
- соль заданная либо по домену
#IBLOCK_ID#
- номер инфоблока, итерацию по которому мы в данный момент делаем, см. 4.1.
/** @var __WeIblockElementItem_MY_SITE_RU_10 $oItem * /
3/ ВНИМАНИЕ!!! Естественно, чтобы вся эта система работала, у имен свойств нужно задавать корректные символьные имена (шаблон [A-Za-z0-9_]+), т.к. символьные коды свойств превращаются в поля объектов
4.1/ В шаблоне компонента hipot:iblock.list можем писать:
//template.php
use Hipot\IbAbstractLayer\Types\IblockElementItem;
foreach ($aResult['ITEMS'] as $arItem) {
// имя класса пишется следующим образом: __WeIblockElementItem_#ABSTRACT_LAYER_SAULT#_#IBLOCK_ID#,
// мы ведь знаем какого инфоблока список выводится, не так ли?
// в примере заполняем абстрактный уровень 10го инфоблока
// #ABSTRACT_LAYER_SAULT# - указанная нами соль, либо сгеренированная автоматически по имени домена
// шаблон подсказки по типам можно смело закидывать в SNIPPETS (в шаблоны вашего IDE)
/* @var $oItem __hiIblockElementItem_MY_SITE_RU_10 */
/** @var __hiIblockElementItem_MY_SITE_RU_10 $oItem */
$oItem = new IblockElementItem($arItem);
echo $oItem->NAME; // подсказывает все стандартные поля инфоблока
// предположим, что в 10м инфоблоке есть строковое свойство code1
echo $oItem->PROPERTIES->code1->VALUE; // подсказывает все свойства инфоблока и их поля
// code2 у нас множественное, давайте выведем первое значение:
$arMultiple = $oItem->PROPERTIES->code2;
echo $arMultiple[0]->VALUE;
// предположим, что у нас есть свойство типа "HTML/Text" с кодом opis, выведем его значение
echo $oItem->PROPERTIES->opis->VALUE['TEXT'];
// вывод пути к файлу в свойстве
echo $oItem->PROPERTIES->file->FILE_PARAMS->SRC;
}
4.2/ Выборка цепочек с кешем
// component.php
// QUERY 1 MAIN
$rsItems = \CIBlockElement::GetList($arOrder, $arFilter, false, $arNavParams, $arSelect);
// создаем объект, должен создаваться до цикла по элементам, т.к. в него складываются
// уже выбранные цепочки в качестве кеша
$obChainBuilder = new Hipot\IbAbstractLayer\IblockElemLinkedChains();
while ($arItem = $rsItems->GetNext()) {
// QUERY 2
$db_props = \CIBlockElement::GetProperty($arParams["IBLOCK_ID"], $arItem['ID'],
array("sort" => "asc"), array("EMPTY" => "N"));
while ($ar_props = $db_props->GetNext()) {
// довыборка цепочек глубиной 3
if ($ar_props['PROPERTY_TYPE'] == 'E') {
// инициализация должна происходить перед каждым вызовом getChains_r
// с указанием выбираемой вложенности
$obChainBuilder->init(3);
$ar_props['CHAIN'] = $obChainBuilder->getChains_r( $ar_props['VALUE'] );
}
if ($ar_props['PROPERTY_TYPE'] == 'F') {
$ar_props['FILE_PARAMS'] = \CFile::GetFileArray($ar_props['VALUE']);
}
if ($ar_props['MULTIPLE'] == "Y") {
$arItem['PROPERTIES'][ $ar_props['CODE'] ][] = $ar_props;
} else {
$arItem['PROPERTIES'][ $ar_props['CODE'] ] = $ar_props;
}
}
$arResult["ITEMS"][] = $arItem;
}
}
// освобождаем память от цепочек
unset($obChainBuilder);
// template.php
use Hipot\IbAbstractLayer\Types\IblockElementItem;
foreach ($aResult['ITEMS'] as $arItem) {
// имя класса пишется следующим образом: __hiIblockElementItem#IBLOCK_ID#,
// мы ведь знаем какого инфоблока список выводится, не так ли?
// в примере заполняем абстрактный уровень 10го инфоблока
// (возникло предложение сделать по символьному коду инфоблока, думаю резонное, т.е. __hiIblockElementItem#IBLOCK_CODE#)
$oItem = new IblockElementItem($arItem);
// допуспим link2 у нас привязка к инфоблоку, у которого есть еще одна привязка link3
// выводим имя привязанного элемента в привязанном
// те. у нас связь: текущий инфоблок связан по link2 с еще одним инфоблоком, тот в свою очередь еще с одним.
// задача вывести имя связанного элемента через один
// ПО ЭТОМУ ВСЕМУ ЕСТЬ АВТОКОМПЛИТ!! )))
echo $oItem->PROPERTIES->link2->CHAIN->PROPERTIES->link3->CHAIN->NAME;
// покажем имя первого автора книги
$arWriters = $oItem->PROPERTIES->writers;
// выводим имя первого (в CHAIN все поля связанного элемента)
echo $arWriters[0]->CHAIN->NAME;
}
5/ За заполненностью полей, естественно, должен следить сам разработчик, т.к. схема предоставляет просто удобный способ написания кода с автокомплитом. Т.е. класс - это абстрактный уровень для результатов работы компонента iblock.list
6/ Для обновления файла с классами нужно просто удалить файл
$_SERVER['DOCUMENT_ROOT'] . '/bitrix/cahce/generated_sxem.php'
открыть сайт, чтобы файл сгенерировался и открыть его в eclipse, чтобы проиндексировались классы
При изменении структуры инфоблоков схема также обновляется.
7/ В случае свойств привязок к инфоблокам, обязательно должно быть указано, к какому инфоблоку привязано свойство элемента, иначе как построить схему привязок?