подключаем модуль
\Bitrix\Main\Loader::includeModule('iblock'); |
Выборка элементов
Вариант 1.Выборка элементов, но только с полями без свойств, а чтобы выбрать свойства. то куча геммора.
$dbItems = \Bitrix\Iblock\ElementTable::getList([
'order' => ['SORT' => 'ASC'], // сортировка
'select' => ['ID', 'NAME', 'SORT', 'PREVIEW_TEXT'], // выбираемые поля (без свойств)
'filter' => ['IBLOCK_ID' => 4], // фильтр по полям (без свойств)
'group' => [], // группировка по полю, order должен быть пустой
'limit' => 5, // целое число, ограничение выбираемого кол-ва
'offset' => 40, //
'count_total' => 1, // дает возможность получить кол-во элементов через метод getCount()
'runtime' => [], // массив полей сущности, создающихся динамически
'data_doubling' => false, // разрешает получение нескольких одинаковых записей
'cache' => [
'ttl' => 360000, // Время жизни кеша
'cache_joins' => true // Кешировать ли выборки с JOIN
],
]); |
Вариант 2.Выборка элементов с полями, свойствами, более читабельный
Чтобы не указывать постоянно IBLOCK_ID и иметь доступ к свойствам
получить название класса
echo \Bitrix\Iblock\Iblock::wakeUp($iblockId)->getEntityDataClass());
|
выведет к примеру
\Bitrix\Iblock\Elements\ElementCountriesTable |
где Countries - символьный код API инфоблока (countries),
соответственно он должен быть заполнен у инфоблока (строка 1-50 симв., начинающаяся с буквы и состоящая из латинских букв и цифр)
и потом так
$item = \Bitrix\Iblock\Elements\ElementCountriesTable::getById($id)->fetch(); |
или так
$catalogTable = \Bitrix\Iblock\Iblock::wakeUp($iblockId)->getEntityDataClass();
$item = $catalogTable::getById($id)->fetch();
|
ключи getList как и у \Bitrix\Iblock\ElementTable::getList
$dbItems = \Bitrix\Iblock\Elements\ElementCountriesTable::getList([
'filter'=>["TESTPROP.VALUE"=>"test"], //в старом ядре "PROPERTY_TESTPROP"=>"test"
'select' => ['ID', 'NAME', 'SORT', 'PREVIEW_TEXT','ICON','B24_CONTACT_'=>'B24_CONTACT','LINK_'=>'LINK'], // выбираемые поля и свойства с кодами ICON (файл), B24_CONTACT (строка), LINK (привязка к элементу)
"cache" => ["ttl" => 360000]
]); |
print_r($dbItems->fetch());
[ID] => 3868736
[NAME] => Albania
[PREVIEW_TEXT] =>
[PREVIEW_PICTURE] =>
[IBLOCK_ELEMENTS_ELEMENT_COUNTRIES_ICON_IBLOCK_ELEMENT_ID] => 3868736
[IBLOCK_ELEMENTS_ELEMENT_COUNTRIES_ICON_VALUE] => 7687
[B24_CONTACT_IBLOCK_ELEMENT_ID] => 3868736
[B24_CONTACT_VALUE] => 2563
[LINK_ID] => 664732
[LINK_IBLOCK_ELEMENT_ID] => 143517
[LINK_IBLOCK_PROPERTY_ID] => 97
[LINK_VALUE] => 143497.0000
[LINK_IBLOCK_GENERIC_VALUE] => 143497 |
ключ значения свойства ICON не оч читаемый
[IBLOCK_ELEMENTS_ELEMENT_COUNTRIES_ICON_VALUE] => 7687 |
ключ значения свойства B24_CONTACT выглядит получше,
потому что в select заполнили так: 'B24_CONTACT_'=>'B24_CONTACT'
[B24_CONTACT_VALUE] => 2563 |
Получить элемент по id, только поля, без свойств
$item = \Bitrix\Iblock\Elements\ElementCountriesTable::getById($id)->fetch(); |
Получить элемент по id с нужными полями и свойствами
$dbItem = \Bitrix\Iblock\Elements\ElementCountriesTable::getByPrimary($id, [
'select' => ['NAME', 'ICON'],
"cache" => ["ttl" => 360000],
]);
|
Методы для $dbItems
количество записей
$cnt = $dbItems->getSelectedRowsCount(); |
выборку в массив в цикле
- BX_RESIZE_IMAGE_EXACT - масштабирует в прямоугольник $arSize c сохранением пропорций, обрезая лишнее;
- BX_RESIZE_IMAGE_PROPORTIONAL - масштабирует с сохранением пропорций, размер ограничивается $arSize;
- BX_RESIZE_IMAGE_PROPORTIONAL_ALT - масштабирует с сохранением пропорций за ширину при этом принимается максимальное значение из высоты/ширины, размер
|
while ($arItem = $dbItems->fetch()){
$fileSmall = CFile::ResizeImageGet($arItem["PREVIEW_PICTURE"], ['width'=>150, 'height'=>400], BX_RESIZE_IMAGE_PROPORTIONAL, false,false,false,300);
//$fileSm["src"] ?? false
$file = CFile::GetFileArray($arItem["PREVIEW_PICTURE"]);
//$file["SRC"] ?? false
} |
сразу всю выборку в массив
$arItems = $dbItems->fetchAll(); |
количество найденных записей без учета limit, если при запросе было указано count_total = 1
кол-во полученных записей с учетом limit
$dbItems->getSelectedRowsCount(); |
выборку в цикле в объект
while ($item = $dbItems->fetchObject()){
//
} |
а можно в коллекцию объектов
$items = $dbItems->fetchCollection();
foreach ($items as $item) {
} |
Работа с элементом как объектомполучить данные
$item->getId();
$item->getName();
$item->getDetailPicture();
$item->getDetailText();//выводит сразу значение без типа
$item->get('NAME'); //вместо NAME любое поле элемента
|
изменить элемент
$item->setName('newName');
$item->set('NAME','newName'); //вместо NAME любое поле
$item->save(); |
удалить элемент
\Bitrix\Iblock\Elements\ElementCountriesTable::delete($id); |
Раздел элемента'IBLOCK_SECTION' - основной раздел 'SECTIONS' - все разделы, в которых элемент |
$dbItem = \Bitrix\Iblock\Elements\ElementCountriesTable::getByPrimary( $id, [
'select' => ['NAME', 'ICON','IBLOCK_SECTION', 'SECTIONS' ],
"cache" => ["ttl" => 360000],
]);
$item = $dbItem->fetchObject();
$section = $item->getIblockSection(); //основной раздел
foreach ($item->getSections()->getAll() as $section) {//все разделы, в которых элемент
//
}
|
$section->getId();
$section->getName();
$section->getCode();
$section->get('NAME'); //вместо NAME любое поле раздела
$section->setName('new Name');
$section->save();
|
Работа со свойствами элементаесли выборка получена через \Bitrix\Iblock\Elements\ElementCountriesTable
$item->getIcon()->getValue(); //Icon код свойства в CamelCase (ICON)
$item->getB24Contact->getValue(); B24Contact код свойства в CamelCase (B24_CONTACT)
|
Свойство ICON типа
файл,
то в выборке в select удобно передать
ICON.FILE$file = $item->getIcon()->getFile();
$file->getId();
$file->getSubdir();
$file->getFileName();
$file->getContentType();
$file->getFileSize();
|
полный путь к файлу
'/upload/' . $file->getSubdir().'/'.$file->getFileName(); |
Свойство PARTNER типа
список,
тогда в выборке в select удобно указать
PARTNER.ITEM$partner = $item->getPartner()->getItem();
$partner->getId();
$partner->getXmlId();
$partner->getValue(); |
Свойство PRESIDENT типа
привязка к элементу,
тогда в выборке в select удобно указать
PRESIDENT.ELEMENT
Важно! символьный код и второго инфоблока, к которому привязано свойство, должен быть задан |
$president = $item->getPresident()->getElement(); //если не множественное
$president->getId();
$president->getName();
foreach($item->getPresident()->getAll() as $linkElement){ //если множественное
$president = $linkElement->getElement();
}
|
Свойство PARLAMENT типа
привязка к разделу,
тогда в выборке в select удобно указать
PARLAMENT.SECTION$parlament = $item->getParlament()->getSection();
$parlament->getId();
$parlament->getName();
|
Свой тип свойcтва HTML/Text на основе типа строки PATH_MAP
$pathMap = unserialize($item->getPathMap()->getValue());
$pathMap = $pathMap["TEXT"] ?? $pathMap; |
Прочееполучить текст sql запроса
\Bitrix\Main\Application::getConnection()->startTracker(); //подключить до запросов (разово)
\Bitrix\Iblock\Elements\ElementCountriesTable::getById($id);
echo $dbItems->getTrackerQuery()->getSql(); |
Сбросить кеш у инфоблоков
\Bitrix\Iblock\ElementTable::getEntity()->cleanCache(); |
получить инфоблок
$arIblock = \Bitrix\Iblock\IblockTable::getList([
'filter' => ['CODE' => 'catalog'],
])->fetch();
|
получить все свойства инфоблока
$arProps = \Bitrix\Iblock\PropertyTable::getList([
'select' => ['*'],
'filter' => ['IBLOCK_ID' => $iblockId]
])->fetchAll(); |
получить значения свойства типа список
$dbEnums = \Bitrix\Iblock\PropertyEnumerationTable::getList([
'order' => ['SORT' => 'asc'],
'select' => ['*'],
'filter' => ['PROPERTY_ID' => $propId]
));
while($arEnum = $dbEnums->fetch()) {
//
} |
$entity = \Bitrix\Iblock\Model\Section::compileEntityByIblock($iblockId);
$dbSect = $entity::getList([
"select" => ["UF_USER"], // пользовательские поля
"filter" => ['ID' => $sectionId],
"cache" => ['ttl' => 36000],
]);
if ($arSect = $dbSect->fetch()) {
print_r($arSect);
} |