Обучаю битриксу программистов, интеграторов. Подробнee ⇒

Инфоблоки, элементы, разделы - orm d7 api



Другие статьи:
подключаем модуль
\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
выборку в массив в цикле
  • 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
$dbItems->getCount(); 
кол-во полученных записей с учетом 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);
}
Если блог был полезным, можете угостить меня "чашечкой кофе" :)

Сбер по номеру телефона +7 (953) 585-13-09 Вероника.
Спасибо!