Yandex Metrika
sanches.free 1 просмотр

Выборка инфоблоков через IblockTable и привязки к сайтам в Bitrix D7

Зачем смотреть именно на IblockTable

Глобальный список инфоблоков хранится в b_iblock; в D7 к нему обращаются через \Bitrix\Iblock\IblockTable. Отдельная сущность \Bitrix\Iblock\IblockSiteTable описывает, на каких сайтах (SITE_ID) разрешён каждый инфоблок — одна строка на пару «инфоблок–сайт». Для выпадающих списков в своих модулях и отладочных скриптов это удобнее, чем тянуть CIBlock::GetList, если вы уже в ORM-стиле.

Перед вызовами подключите модуль: \Bitrix\Main\Loader::includeModule('iblock');

Минимальный обход без фильтра

Достаточно перечислить строки и посмотреть структуру — пригодится при поиске «левого» типа или пустых ЧПУ.

use Bitrix\Iblock\IblockTable;
use Bitrix\Main\Loader;

Loader::includeModule('iblock');

$registry = IblockTable::getList();
while ($iblockRow = $registry->fetch()) {
    // ID, IBLOCK_TYPE_ID, NAME, ACTIVE, SORT, URL-шаблоны страниц и т.д.
    // TIMESTAMP_X приходит как Bitrix\Main\Type\DateTime
}

Сортировка «как в админке» и карта для select

Чтобы список читался предсказуемо, сортируют по типу, затем по сортировке, затем по убыванию ID (свежие сверху). Для каждого инфоблока отдельным запросом собирают привязанные сайты — для десятков записей это приемлемо; если инфоблоков сотни, имеет смысл один раз выгрузить IblockSiteTable с группировкой в PHP.

use Bitrix\Iblock\IblockSiteTable;
use Bitrix\Iblock\IblockTable;
use Bitrix\Main\Loader;

Loader::includeModule('iblock');

$optionsForSelect = [];

$listHandle = IblockTable::getList([
    'order' => [
        'IBLOCK_TYPE_ID' => 'ASC',
        'SORT' => 'ASC',
        'ID' => 'DESC',
    ],
]);

while ($iblockRow = $listHandle->fetch()) {
    $siteQuery = IblockSiteTable::getList([
        'filter' => ['=IBLOCK_ID' => (int) $iblockRow['ID']],
        'select' => ['SITE_ID'],
    ]);
    $siteLabels = [];
    while ($siteRow = $siteQuery->fetch()) {
        $siteLabels[] = $siteRow['SITE_ID'];
    }

    $hint = sprintf(
        '[%d, %s, %s] %s',
        (int) $iblockRow['ID'],
        $iblockRow['IBLOCK_TYPE_ID'],
        implode(', ', $siteLabels) ?: '—',
        $iblockRow['NAME']
    );

    $optionsForSelect[$iblockRow['ID']] = $hint;
}

Ключом массива остаётся числовой ID — такой формат сразу кладут в select HTML или в параметры своего административного интерфейса.

На что смотреть в строке инфоблока

  • VERSION — один или два хранилища свойств; влияет на миграции и тяжесть некоторых запросов.
  • RIGHTS_MODE — расширенные права по разделам или упрощённые; важно для диагностики «почему не видит инфоблок».
  • Шаблоны LIST_PAGE_URL, DETAIL_PAGE_URL, SECTION_PAGE_URL — могут быть пустыми, если ЧПУ задаётся только на уровне компонента.

Итог

IblockTable::getList даёт полный перечень инфоблоков с нужным order; IblockSiteTable — привязку к сайтам. Комбинируя оба запроса, собирают человекочитаемые подписи для админских форм и быстро проверяют конфигурацию мультисайта без прямого SQL к b_iblock_site.

Не хотите копаться сами?

Починю за 1-3 дня. Без предоплаты — оплата по результату.

15+ лет опыта с 1С-Битрикс · Без предоплаты · 7 дней гарантии