Все элементы из вложенных разделов на D7?

Есть раздел, в котором еще разделы с элементами. Нужно вывести все элементы по ID родительского элемента на D7.

$dbItems = \Bitrix\Iblock\ElementTable::getList(array(
	'select' => array('ID', 'NAME', 'IBLOCK_ID'),
	'filter' => array('IBLOCK_ID' => 8, 'IBLOCK_SECTION_ID ' => 5)
));

С родительским ID не работает, если поменять 5 на 17 (это ID дитя), то элементы выводить из раздела с ID 17
  • Вопрос задан
  • 3910 просмотров
Пригласить эксперта
Ответы на вопрос 2
serginhold
@serginhold
гуглишь что такое nested sets, разбираешься как получить раздел и все дочерние, пишешь запрос на чистом sql к b_iblock_section_element, джойнишь к результату элементы по IBLOCK_ELEMENT_ID,
как разберешься, переносишь свой запрос на orm D7
Ответ написан
Комментировать
@iFunction
PHP
Так можно:
$sectionId = 5;
$iblockId = 8;
$section = \Bitrix\Iblock\SectionTable::getByPrimary($sectionId, [
    'filter' => ['IBLOCK_ID' => $iblockId],
    'select' => ['LEFT_MARGIN', 'RIGHT_MARGIN'],
])->fetch();
$dbItems = \Bitrix\Iblock\ElementTable::getList([
    'select' => ['ID', 'NAME', 'IBLOCK_ID'],
    'filter' => [
        'IBLOCK_ID' => $iblockId,
        '>=IBLOCK_SECTION.LEFT_MARGIN' => $section['LEFT_MARGIN'],
        '<=IBLOCK_SECTION.RIGHT_MARGIN' => $section['RIGHT_MARGIN'],
    ],
]);


Еще так:
$sectionId = 5;
$iblockId = 8;

$sectionsIds = getSubsections($sectionId, $iblockId);
$dbItems = \Bitrix\Iblock\ElementTable::getList([
    'select' => ['ID', 'NAME', 'IBLOCK_ID'],
    'filter' => [
        'IBLOCK_ID' => $iblockId,
        'IBLOCK_SECTION_ID' => $sectionsIds,
    ],
]);

function getSubsections(int $sectionId, int $iblockId): array
{
    $sectionsIds = [];
    $connection = \Bitrix\Main\Application::getConnection();
    $sql = sprintf('SELECT cs.ID FROM %1$s AS ps
                        INNER JOIN %1$s AS cs 
                        ON ps.LEFT_MARGIN <= cs.LEFT_MARGIN AND ps.RIGHT_MARGIN >= cs.RIGHT_MARGIN AND ps.IBLOCK_ID = cs.IBLOCK_ID
                        WHERE ps.ID = %2$d AND ps.IBLOCK_ID = %3$d',
        \Bitrix\Iblock\SectionTable::getTableName(),
        $sectionId,
        $iblockId
    );
    $result = $connection->query($sql);
    while ($section = $result->fetch()) {
        $sectionsId[] = $section['ID'];
    }
    return $sectionsIds;
}
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы