Skip to content

Instantly share code, notes, and snippets.

@SeRGei93
Forked from sukhikh18/_attention.md
Created August 10, 2021 17:12
Show Gist options
  • Star 2 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save SeRGei93/2c989ab586b638dce8afe35e0dd219f3 to your computer and use it in GitHub Desktop.
Save SeRGei93/2c989ab586b638dce8afe35e0dd219f3 to your computer and use it in GitHub Desktop.
Получение списка элементов инфо-блока, их свойства и раздел (D7) #Bitrix #ORM

ElementTable

Заметка 1

При использовании множественных связей (1:N, M:N) параметр limit ограничивает количество связей.

Заметка 2

fetch и fetchAll получают все результаты, в то время как fetchObject может получать несколько результатов объекта (при множественныъ связях). При незнании этого conunt($rs->fetchAll()) - может возвращать неожиданный результат

Заметка 3

Метод getFieldname работает только для описанных в getMap полей. Используйте $rs->fetchObject()->get('FIELD_NAME') для runtime reference (или $entity->addField вместо runtime)

Заметка 4

Метод fetchObject возвращает коллекцию только если поле описано как OneToMany или ManyToMany. В случае с обычным Reference вернет последнее полученое значение

<?php
/** @var int $iblockId ИД Инфоблока каталога */
use Bitrix\Main;
use Bitrix\Iblock;
use Bitrix\Highloadblock as HL;
use Bitrix\Main\Entity\ReferenceField;
use Bitrix\Main\ORM\Query\Join;
Main\Loader::includeModule('iblock');
Main\Loader::includeModule('highloadblock');
function compileHighLoadEntities($entity, $hlFields)
{
$elementTableFields = array_flip($hlFields);
// Get High loads by name.
$hlEntities = HL\HighloadBlockTable::getList(['filter' => ['NAME' => $hlFields]])->fetchAll();
foreach ($hlEntities as $hlEntity) {
// Create Highload entity.
$referenceEntity = HL\HighloadBlockTable::compileEntity($hlEntity);
// Get reference field name
$elementTableField = $elementTableFields[$hlEntity['NAME']];
// Extract ref from ElementList entity
$refValueEntity = $entity->getField($elementTableField)->getRefEntity();
// Add HIGHLOAD link
$refValueEntity->addField(new ReferenceField(
'HIGHLOAD',
$referenceEntity,
Join::on('this.VALUE', 'ref.UF_XML_ID')
));
}
}
// API Code обязателен, иначе вернет false
$entityClassName = Iblock\Iblock::wakeUp($iblockId)->getEntityDataClass();
// Добавит LEFT JOIN связь с таблицей хайлоад блока и добавит значение свойства в BRAND_REF.HIGHLOAD
compileHighLoadEntities($entityClassName::getEntity(), [
// Property name => Highload block name
'BRAND_REF' => 'BrandReference',
]);
/**
* @var Main\ORM\Query\Result $rsElement
*/
$rsElement = $entityClassName::getList([
'select' => [
'ID',
'NAME',
'BRAND_REF.HIGHLOAD',
],
'filter' => [
'BRAND_REF.HIGHLOAD.UF_XML_ID' => 'BRAND_1',
],
'order' => ['ID' => 'ASC'],
]);
$arElements = [];
while ($obElement = $rsElement->fetchObject()) {
$brandNames = [];
// BRAND_REF множественное свойство, по этому необходимо получить все значения
foreach ($obElement->getBrandRef()->getAll() as $obBrandRef) {
$brandNames[] = $obBrandRef->getHighload()->getUfName();
}
$arElements[] = [
'ID' => $obElement->getId(),
'NAME' => $obElement->getName(),
'BRAND' => $brandNames,
];
}
<?php
use Bitrix\Main;
use Bitrix\Iblock;
Main\Loader::includeModule('iblock');
/**
* @var array $arElements
*/
$arElements = Iblock\ElementTable::getList([
'select' => ['*'],
// Отфильтровать по таблице инфоблоков Iblock\IblockTable где CODE === 'news'
'filter' => ['=IBLOCK.CODE' => 'news'],
'order' => ['DATE_CREATE' => 'DESC', 'NAME' => 'ASC'],
'limit' => 1, // Только один элемент
'offset' => 2, // Начиная с третьего
"cache" => ["ttl" => 3600, 'cache_joins' => true],
])->fetchAll();
<?php
use Bitrix\Main;
use Bitrix\Iblock;
Main\Loader::includeModule('iblock');
/**
* @var Main\ORM\Query\Result $rsElement
*/
$rsElement = Iblock\Elements\ElementCatalogTable::getList([
'select' => [
'ID',
'NAME',
// Свойство типа Строка
'ARTNUMBER_' => 'ARTNUMBER', // Значение строки
// Свойство типа Список
'NEWPRODUCT_' => 'NEWPRODUCT.ITEM', // ID элемента списка. .ITEM присоединяет элемент из таблицы (со значением)
// Множественное свойство типа Файл
'MORE_PHOTO.FILE',
],
]);
$arElements = [];
while ($obElement = $rsElement->fetchObject())
{
$arMorePhoto = [];
foreach ($obElement->getMorePhoto()->getAll() as $fileProperty) {
$arMorePhoto[] = getPropertyFileSrcUrl($fileProperty->getFile());
}
$arElements[] = [
'ID' => $obElement->getId(),
'NAME' => $obElement->getName(),
'ARTNUMBER' => $obElement->getArtnumber()->getValue(),
'NEWPRODUCT' => $obElement->getNewproduct() ? 1 === $obElement->getNewproduct()->getValue() ? 'Y' : 'N' : 'N',
'MORE_PHOTO' => $arMorePhoto,
];
}
function getPropertyFileSrcUrl($arPropertyFile) {
return '/upload/' . $arPropertyFile->getSubdir() . '/' . $arPropertyFile->getFileName();
}
<?php
use Bitrix\Main;
use Bitrix\Iblock;
Main\Loader::includeModule('iblock');
/**
* @var Main\ORM\Query\Result $rsElement
*/
$rsElement = Iblock\Elements\ElementCatalogTable::getList([
'select' => [
'ID',
'NAME',
// Присоединить таблицу инфоблоков Iblock\IblockTable и выбрать SECTION_PAGE_URL
'IBLOCK_SECTION_PAGE_URL' => 'IBLOCK.SECTION_PAGE_URL',
// Присоединить таблицу разделов (Iblock\SectionTable)
'IBLOCK_SECTION',
],
]);
$arElements = [];
while ($obElement = $rsElement->fetchObject())
{
$arElements[] = [
'ID' => $obElement->getId(),
'NAME' => $obElement->getName(),
'SECTION_NAME' => $obElement->getIblockSection()->getName(),
'SECTION_URL' => \CIBlock::ReplaceDetailUrl(
$obElement->getIblock()->getSectionPageUrl(),
$obElement->getIblockSection(), true, 'S'),
];
}
@Just-guy
Copy link

Спасибо, полезная информация!

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment