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

414
Алексей,

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 | Обновлено 4 Ноября 2019
разработчику, примеры d7

Возврат к списку

Похожие статьи
Проверить принадлежность пользователя к группе 0
Одним методом $USER->GetUserGroupArray() получаем группы пользователя, а с помощью \Bitri...
Читать дальше »
Алексей,
Ядро D7, примеры, документация 0
Важная тема для разработчиков, чем быстрее начнете использовать, тем лучше.
Читать дальше »
Алексей,
Комментарии