Bitrix D7 на примере инфоблоков

95k
Алексей,

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

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( // Кеш запроса. Сброс можно сделать методом \Bitrix\Iblock\ElementTable::getEntity()->cleanCache();
		'ttl' => 3600, // Время жизни кеша
		'cache_joins' => true // Кешировать ли выборки с JOIN
	),
));

Что можно сделать с $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\PropertyFeatureTable::getList(); // доп. параметры свойств (например "Показывать на детальной странице элемента")
\Bitrix\Iblock\SectionTable::getList(); // Разделы инфоблоков
\Bitrix\Iblock\ElementTable::getList(); // Элементы инфоблоков 
\Bitrix\Iblock\ElementPropertyTable::getList() // Значения свойств элементов
\Bitrix\Iblock\InheritedPropertyTable::getList(); // Наследуемые свойства (seo шаблоны)

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

checkFields(Result $result, $primary, array $data) // метод проверяет поля данных перед записью в БД.
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() // метод создаёт и возвращает объект запроса для сущности.
enableCrypto($field, $table = null, $mode = true) // метод устанавливает флаг поддержки шифрования для поля. 17.5.14
cryptoEnabled($field, $table = null) // метод возвращает true если шифрование разрешено для поля. 17.5.14
addMulti($rows, $ignoreEvents = false)
updateMulti($primaries, $data, $ignoreEvents = false)
// Следующий методы заблокированы у инфоблоков
add(array $data) // добавление элемента
delete($primary) // удаление элемента по ID
update($primary, array $data) // обновление элемента по ID

Для добавления, удаления и модификации элементов и разделов инфоблоков необходимо использовать api старого ядра.

Всё это применимо и к другим модулям, только названия таблиц другие. Многое можно почерпнуть из файла /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;
}

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

Есть вопросы или нашли ошибку? Напишите комментарий (можно без регистрации), отвечать стараюсь быстро.

Опубликовано 4 октября 2019 | Обновлено 18 декабря 2023
разработчику, примеры d7
Поделиться
Похожие статьи
Bitrix d7 фильтр по дате
Выбираем заказы в определённом статусе за последний месяц. Пример кода.
Читать дальше » 0
Алексей,
Ядро D7, примеры, документация
Важная тема для разработчиков, чем быстрее начнете использовать, тем лучше.
Читать дальше » 0
Алексей,
Комментарии
❮…❯
Авторизуйтесь чтобы получать уведомления об ответе
25 июл 2022
В getList можно добавить фильтр по свойству, если оно будет присутствовать в массиве select Пример: $arWorks = \Bitrix\Iblock\Elements\ElementWorksTable::getList([ 'select' => ['ID', 'STAGE_' => 'STAGE'], 'filter' => ['STAGE_VALUE' => $stage], ])->fetchAll();
Алексей
25 июл 2022
Александра, интересный способ, спасибо
26 янв 2022
Bitrix D7 это просто, просто нужно покопаться в исходниках :) На самом деле, если понять как работает, то дальше работать с ядром будет легче. - можно посльзоваться просто тем что уже описано в документации и гарантировано работает а не еб*ть мозг, это п*здец юблдяь битрикс как что то начинаешь делать как вычсняетсмя что с*ка нах*й них*я бл*дь не работает
30 янв 2022
Я, Надо вообще байкотировать админку bitrix, раз компания положила болт на программистов и отказалась делать подробную документацию с примерами. Я понимаю если админка была бы бесплатная, но она одна из самых дорогих в России. Это то же самое что взять человека совершенно ничего не знающего о самолетах и посадить за руль военного истребителя. И сказать бери отвертку, раскручивай его до винтика, разбирайся в платах, схемах, сервоприводах. И у тебя пару дней, так как клиент уже оплатил полет.
4 авг 2023
Иван, согласен и за то, что выпускают сырятину. Апофеоз смарт процессы, где есть метод, его описание, но он не работает с полями типа файл, вместо ошибки затирая его.
11 июл 2021
Де Семь это писец извращение и надругательство над здравым смыслом.
24 мар 2021
CIBlockElement::getProperty причем тут D7 ...
Алексей
24 мар 2021
tihij, в статье написано что это метод старого ядра и что без него свойства не получить. Где-то с 18-ой версии можно использовать Битрикс ORM, там уже есть и свойства.
14 сен 2021
Алексей, с 20 версии > С выходом 20-й версии 1С Битрикс, появилась возможность работы с элементами инфоблока средствами ORM. Для того, чтобы начать использовать эту возможность вам необходимо зайти в настройки информационного блока и задать значения для поля «Символьный код API».
30 янв 2022
Agmitas, Почему о наличии такой возможности мы узнаем не с официального сайта с названием "Документация по D7" dev 1c-bitrix ru api_d7, а только с левых сайтов? Почему в "Документация по D7" отсутствуют исчерпывающие примеры как этим пользоваться на практике. Вы думаете программистам делать нефиг, как сидеть ночами и дебажить это конче*ное ядро
6 авг 2020
спасибо, добрый человек)
31 мая 2020
С новых версий, доступны и свойства инфоблока, все методы работают корректно. b24 по сути тот же фреймворк, а значит и развивается параллельно.
14 сен 2021
Gh0Ost, с 20 версии, если точнее
15 мая 2020
D7 это полная жоп*. Битрикс давно забил на новое ядро. Прошло 5 лет, а официальной документации вообще нету. Ключевые методы отсутствуют вообще. Например сам автор статьи пишет, что на новом ядре нельзя получить свойства элемента инфоблока, нельзя фильтровать по свойствам. Так же на 2020 год уже не работают методы: add(array $data) // добавление элемента delete($primary) // удаление элемента по ID update($primary, array $data) // обновление элемента по ID. И многих других. Просто забили болт.
Алексей
15 мая 2020
Иван, add, delete и update должны работать. То что забили, да согласен. Последнее время больше внимания Б24 уделяют. А так скоро orm для инфоблоков выкатят, там и посмотрим.
Алексей
21 июл 2021
Иван, был не прав. Методы add, delete и update не должны работать, они заблокированы у инфоблоков и выдают ошибку вида: "Для изменения элементов инфоблоков используйте вызов CIBlockElement::Update()"
30 янв 2022
Алексей, Заблокированы и не работают это как бы одно и то же. Такое ощущение что разговариваю с ребенком. Или по вашему заблокированные методы все-таки способны работать?
Алексей
30 янв 2022
Василий, нет нет, методы не работают для инфоблоков.
14 сен 2021
Иван, > С выходом 20-й версии 1С Битрикс, появилась возможность работы с элементами инфоблока средствами ORM. Для того, чтобы начать использовать эту возможность вам необходимо зайти в настройки информационного блока и задать значения для поля «Символьный код API».
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
Вовук, поправил, спасибо
Bitrix D7 это просто, просто нужно покопаться в исходниках :) На самом деле, если понять как работает, то дальше работать с ядром будет легче. Пример для инфоблоков.