Bitrix D7 для инфоблоков

11737
Алексей,

Bitrix D7 это просто, просто нужно покопаться в исходниках :) На самом деле, если понять как работает, то дальше работать с ядром будет легче. Пример для инфоблоков.

Подключаем модуль. Не буду использовать сокращения для простоты кода.
\Bitrix\Main\Loader::includeModule('iblock');
Делаем запрос в таблицу элементов инфоблока.
$dbItems = \Bitrix\Iblock\ElementTable::getList(array(
	'order' => array('SORT' => 'ASC'), // сортировка
	'select' => array('ID', 'NAME', 'IBLOCK_ID', 'SORT', 'TAGS'), // выбираемые поля, без свойств. Свойства можно получать на старом ядре \CIBlockElement::getProperty
	'filter' => array('IBLOCK_ID' => 4), // фильтр только по полям элемента, свойства (PROPERTY) использовать нельзя
	'group' => array('TAGS'), // группировка по полю, order должен быть пустой
	'limit' => 1000, // целое число, ограничение выбираемого кол-ва
	'offset' => 0, // целое число, указывающее номер первого столбца в результате
	'count_total' => 1, // дает возможность получить кол-во элементов через метод getCount()
	'runtime' => array(), // массив полей сущности, создающихся динамически
	'data_doubling' => false, // разрешает получение нескольких одинаковых записей
	'cache' => array( // Кеш запроса, почему-то в офф. документации об этом умалчивают
		'ttl' => 3600,
		'cache_joins' => true
	),
));

Что можно сделать с $dbItems?

$dbItems->fetch(); // или $dbItems->fetchRaw() получение одной записи, можно перебрать в цикле while ($arItem = $dbItems->fetch())
$dbItems->fetchAll(); // получение всех записей
$dbItems->getCount(); // кол-во найденных записей без учета limit, доступно если при запросе было указано count_total = 1
$dbItems->getSelectedRowsCount(); // кол-во полученных записей с учетом limit

В какие таблицы инфоблоков можно делать запросы

\Bitrix\Iblock\TypeTable::getList(); // типы инфоблоков
\Bitrix\Iblock\IblockTable::getList(); // инфоблоки
\Bitrix\Iblock\PropertyTable::getList(); // свойства инфоблоков
\Bitrix\Iblock\PropertyEnumerationTable::getList(); // значения свойств, например списков
\Bitrix\Iblock\SectionTable::getList(); // Разделы инфоблоков
\Bitrix\Iblock\ElementTable::getList(); // Элементы инфоблоков 
\Bitrix\Iblock\InheritedPropertyTable::getList(); // Наследуемые свойства (seo шаблоны)
// и другие не особо используемые, таблицы свойств элементов нету

Помимо getList можно использовать другие методы

add(array $data) // добавление элемента
addMulti($rows, $ignoreEvents = false)
checkFields(Result $result, $primary, array $data) // метод проверяет поля данных перед записью в БД.
delete($primary) // удаление элемента по ID
getById($id) // получение элемента по ID
getByPrimary($primary, array $parameters = array()) // метод возвращает выборку по первичному ключу сущности и по опциональным параметрам \Bitrix\Main\Entity\DataManager::getList.
getConnectionName() // метод возвращает имя соединения для сущности. 12.0.9
getCount($filter = array(), array $cache = array()) // метод выполняет COUNT запрос к сущности и возвращает результат. 12.0.10
getEntity() // метод возвращает объект сущности.
getList(array $parameters = array()) // получение элементов, подробнее было выше
getMap() // метод возвращает описание карты сущностей. 12.0.7
getRow(array $parameters) // метод возвращает один столбец (или null) по параметрам для \Bitrix\Main\Entity\DataManager::getList.
getRowById($id) // метод возвращает один столбец (или null) по первичному ключу сущности. 14.0.0
getTableName() // метод возвращает имя таблицы БД для сущности. 12.0.7
query() // метод создаёт и возвращает объект запроса для сущности.
update($primary, array $data) // обновление элемента по ID
updateMulti($primaries, $data, $ignoreEvents = false)
enableCrypto($field, $table = null, $mode = true) // метод устанавливает флаг поддержки шифрования для поля. 17.5.14
cryptoEnabled($field, $table = null) // метод возвращает true если шифрование разрешено для поля. 17.5.14

Всё это применимо и к другим модулям, только названия таблиц другие. Многое можно почерпнуть из файла /bitrix/modules/main/lib/orm/data/datamanager.php

Примеры

Инфоблок и его свойства

$arIblock = \Bitrix\Iblock\IblockTable::getList(array(
	'filter' => array('CODE' => 'news'),
))->fetch();

$arProps = \Bitrix\Iblock\PropertyTable::getList(array(
	'select' => array('*'),
	'filter' => array('IBLOCK_ID' => $arIblock['ID'])
))->fetchAll();

Значения определенного свойства типа список

$dbEnums = \Bitrix\Iblock\PropertyEnumerationTable::getList(array(
	'order' => array('SORT' => 'asc'),
	'select' => array('*'),
	'filter' => array('PROPERTY_ID' => $arIblockProp['ID'])
));
while($arEnum = $dbEnums->fetch()) {
	$arIblockProp['ENUM_LIST'][$arEnum['ID']] = $arEnum;
}

Элементы инфоблока и их свойства

$dbItem = \Bitrix\Iblock\ElementTable::getList(array(
    'select' => array('ID', 'IBLOCK_ID', 'NAME'),
    'filter' => array('IBLOCK_ID' => $arIblock['ID']),
    'limit' => 100,
    'order' => array('TIMESTAMP_X' => 'ASC')
));
while ($arItem = $dbItem->fetch()) {
    $dbProperty = \CIBlockElement::getProperty($arItem['IBLOCK_ID'], $arItem['ID'], array("sort", "asc"), array('CODE' => 'LINK_ARTICLES'));
    while ($arProperty = $dbProperty->GetNext()) {
        if ($arProperty['VALUE']) {
            $arItem['LINK_ARTICLES'][] = $arProperty['VALUE'];
        }
    }
    $arItems[] = $arItem;
}

Количество заказов пользователя

$dbOrders = \Bitrix\Sale\Order::getList(array(
	'filter' => array('USER_ID' => $userId),
	'group' => array('COUNT' => 'USER_ID'),
	'select' => array('CNT'),
	'runtime' => array(
		new \Bitrix\Main\Entity\ExpressionField('CNT', 'COUNT(*)')
	)
));
if ($arOrders = $dbOrders->fetch()) {
	echo $arOrders['CNT'];
}

Другие примеры можно поискать по тегу примеры d7

Опубликовано 4 Октября 2019 | Обновлено 22 Декабря 2019
разработчику, примеры d7
Похожие статьи
Как деактивировать авторизацию пользователя на API 0
Даже если Вы заблокируете пользователя за спам, сняв галочку активность, то это не помешает пользователю...
Читать дальше »
Алексей,
Выводим выручку по заказам 0
Скидка, еще одна, плюс бесплатная доставка, а не переборщили ли мы и насколько выгодный получился за...
Читать дальше »
Алексей,
Комментарии
Gh0Ost
31 Май 2020
С новых версий, доступны и свойства инфоблока, все методы работают корректно. b24 по сути тот же фреймворк, а значит и развивается параллельно.
Иван
15 Май 2020
D7 это полная жоп*. Битрикс давно забил на новое ядро.
Прошло 5 лет, а официальной документации вообще нету. Ключевые методы отсутствуют вообще. Например сам автор статьи пишет, что на новом ядре нельзя получить свойства элемента инфоблока, нельзя фильтровать по свойствам. Так же на 2020 год уже не работают методы:
add(array $data) // добавление элемента
delete($primary) // удаление элемента по ID
update($primary, array $data) // обновление элемента по ID.
И многих других. Просто забили болт.
Алексей
Алексей
15 Май 2020
Иван, add, delete и update должны работать. То что забили, да согласен. Последнее время больше внимания Б24 уделяют. А так скоро orm для инфоблоков выкатят, там и посмотрим.
Алексей
16 Мар 2020
Вопрос: а как-то свои теги для тегированного кеша добавить можно? или только свой функционал писать нужно ?
Алексей
Алексей
17 Мар 2020
Алексей, используйте $CACHE_MANAGER.
$CACHE_MANAGER->StartTagCache($cache_dir);
$CACHE_MANAGER->RegisterTag("iblock_id_7");
$CACHE_MANAGER->EndTagCache();
Сброс: $CACHE_MANAGER->ClearByTag("iblock_id_7");
Подробнее есть в документации битрикс https://dev.1c-bitrix.ru/learning/course/index.php?COURSE_ID=43&LESSON_ID=2978&LESSON_PATH=3913.4565.4780.2978
Вовук
16 Дек 2019
fetchAll() в первом примере
Алексей
Алексей
22 Дек 2019
Вовук, поправил, спасибо