Развитие api для разделов инфоблоков

Рейтинг: 5.5324  
Новая
Предложил Николаев Андрей 09.10.2016 15:03:34

Развитие api для разделов инфоблоков

В версии инфоблоков 16.5.4 вышла прекрасная функциональность для работы с разделами на новом ядре D7.
Правда документации пока нет (но ничего страшного) и можно было бы существенно увеличить возможности новой реализации:

1) Метод compileEntityByIblock мог бы возвращать не полное название класса, а объект этого класса. При этом его работа была бы эффективнее. Сравните 2 подхода:
use \Bitrix\Main\Loader;
use \Bitrix\Iblock\Model\Section as SectionFactory;

Loader::IncludeModule('iblock');
$sSection = SectionFactory::compileEntityByIblock(1);
$oEntity = new $sSection;
var_dump($oEntity->getMap());

Против
use \Bitrix\Main\Loader;
use \Bitrix\Iblock\Model\Section as SectionFactory;

Loader::IncludeModule('iblock');
$oEntity = SectionFactory::compileEntityByIblock(1);
var_dump($oEntity->getMap());

Мне кажется решение под номером 2 выглядит практичнее.

2) Предлагаю расширить модель SectionTable (или ее производные типа Section1Table) на runtime параметр: ELEMENT_COUNT - который бы доставал активные элементы, привязанные к соответствующему разделу.

Кейс: нужно отобразить только те разделы, где есть активные элементы.
Решение предлагаемое из коробки - составление своего runtime-поля для каждого getList/getRow (где оно требуется).
Если добавить штатное решение как SELECT поле и просто передавать его в массиве полей или соответственно по условию, то код будет выглядеть элегантнее и проще, а другие подобные поля, можно будет посмотреть и сделать по аналогии.

Рейтинг: 0.2825  
Жиряков Дмитрий 01.11.2016 18:29:12
Метод compileEntityByIblock возвращает полное имя класса. Можно использовать так же:
$sectionClass = SectionFactory::compileEntityByIblock(1);
var_dump($sectionClass::getMap());
Рейтинг: 0  
Николаев Андрей 01.11.2016 19:10:09
Жиряков Дмитрий,  действительно, немного протупил. Первый вопрос снимается :)
Рейтинг: 0  
Николаев Андрей 23.12.2018 16:33:20
Дополнительно, было бы неплохо, если бы в getList'ах автоматически подставлялся IBLOCK_ID, чтобы не пришлось его указывать. Как-то глупо получается, вызывать Section1Table::getList и в параметрах ему указывать IBLOCK_ID = 1.