Своя сущность на инфоблоках

Урок 2 из 9

8 мин

Инфоблоки

В фреймворке существует две версии информационных блоков:

  • Инфоблоки 1.0
  • Инфоблоки 2.0

Несмотря на нумерацию, не стоит совсем отказываться от какого-либо из вариантов. С точки зрения производительности инфоблоки 2.0 выигрывают на небольших справочниках с небольшим количеством (20-30) редко изменяемых свойств. Ленту новостей нет никакого смысла переводить на этот вид инфоблоков: вы выиграете в числе запросов, но проиграете во времени их исполнения.

В инфоблоках 2.0 существует физическое ограничение СУБД на количество свойств инфоблока. На данный момент это не отслеживается в системе, так как зависит от множества непрогнозируемых факторов: типа свойств, конфигурации MySQL и других. Изменение версии инфоблока можно выполнить в административном разделе. Перевод из инфоблоков 1.0 в инфоблоки 2.0 невозможен при числе свойств более 50.

Большое преимущество инфоблоков 2.0 — возможность использования составных индексов. Однако достаточно редка ситуация, когда выполняется фильтр по точному соответствию и по нескольким полям одновременно.

Фактически, разница — в хранении значений свойств элементов инфоблоков. Инфоблоки 1.0 хранят значения свойств в общей таблице b_iblock_element_property. Для каждого инфоблока 2.0 создается 2 отдельных таблицы: b_iblock_element_prop_m_ID для множественных свойств и b_iblock_element_prop_s_ID для одиночных. Каждое свойство хранится в отдельном столбце, поэтому SQL-индексы возможны только в этом варианте.

В остальном структура БД инфоблока не зависит от версии:

Таблица Что хранит
Количество полей ИБ 1.0: Без ограничений
ИБ 2.0: 50
b_iblock Инфоблоки
b_iblock_site Привязку инфоблоков к сайтам
b_iblock_property Свойства всех инфоблоков
b_iblock_section Разделы всех инфоблоков
b_iblock_element Элементы всех инфоблоков
b_iblock_section_element Привязку элементов к разделам

Особо отметим таблицу b_iblock_site — это простой способ разграничить данные при использовании многосайтовости. Разные инфоблоки могут быть привязаны к разным сайтам, это связь вида «многие-ко-многим».

Настройки

Разрабатывая проект, не забудьте настроить модуль «Информационные блоки» (Рабочий стол > Настройки > Настройки продукта > Настройки модулей > Информационные блоки). Полезные опции, о которых рекомендуем почитать в документации:

  • Показывать код загрузки из внешних источников.
  • Максимальный уровень глубины вложенности разделов для CSV-экспорта/импорта.
  • Сбрасывать кеш при наступлении даты начала/конца активности элементов инфоблоков.
  • Совместный просмотр разделов и элементов.

«Совместный просмотр разделов и элементов» — глобальная настройка, которая может быть переопределена на уровне инфоблока. Рекомендуем ставить по умолчанию «совместный режим», чтобы навигация по инфоблоку напоминала работу с файловой системой. Этот вариант удобен, но создает нагрузку на систему.

При большом количестве элементов или разделов (точное значение зависит от конфигурации сервера) скорость открытия страницы существенно снижается и могут происходить ошибки. В этом случае пора включить раздельный режим. Тогда у контент-менеджера будет отдельно перечень разделов инфоблока и отдельно — элементов.

Доступ

Администратор сайта может гибко настроить права для инфоблоков в двух режимах: обычное управление правами и расширенное. Режим прав доступа определяется в настройках инфоблока.

В обычном режиме настраивается доступ к инфоблоку в целом для каждой группы пользователей. В расширенном появляется возможность назначить права для разделов и элементов. Расширенное управление правами — одно из важных преимуществ инфоблоков по сравнению с HL-блоками и ORM-сущностями (см. предыдущий урок).

API+D7

Основные методы для управления данными инфоблоков:

  • Элементы
    • CIBlockElement::Add — создание элемента
    • CIBlockElement::GetList — получение элементов
    • CIBlockElement::Update — обновление элемента
    • CIBlockElement::Delete — удаление элемента
  • Разделы
    • CIBlockSection::Add — создание раздела
    • CIBlockSection::GetList — получение разделов
    • CIBlockSection::Update — обновление раздела
    • CIBlockSection::Delete — удаление раздела
  • D7
    • ElementTable — ORM-класс для таблицы b_iblock_element
    • SectionTable — ORM-класс для таблицы b_iblock_section
    • Iblock::wakeUp — метод для получения класса сущности
    • EO_ElementLink — класс для работы с элементами
    • EO_ElementLink::save — создание и обновление элемента
    • EO_ElementLink::delete — удаление элемента

Классы CIBlockElement и CIBlockSection появились в фреймворке до ядра D7 и по-прежнему актуальны. С их помощью можно выбрать поля связанных элементов по свойству типа «Привязка к элементам» и элементы вложенных разделов (см. документацию про параметр arSelectFields и фильтр INCLUDE_SUBSECTIONS).

Разделы можно выбирать с учетом вложенности по полям LEFT_MARGIN, RIGHT_MARGIN, DEPTH_LEVEL (используется модель хранения дерева разделов Nested sets).

Классы ElementTable и SectionTable предоставляют все возможности ORM API для выборки элементов и разделов инфоблока. Методы add, update, delete в них заблокированы, но можно использовать getList.

С версии 19.0.0 модуля iblock добавлена поддержка EO_ElementLink при работе с элементами инфоблоков. Чтобы начать использовать EO_ElementLink для конкретного инфоблока, ему необходимо задать через административный интерфейс Символьный код API. Далее объекты класса можно использовать для создания, обновления и удаления элементов.

Компоненты

Основные компоненты для работы с инфоблоками:

  1. news и catalog — комплексные компоненты списка и детальной страницы.
  2. news.list и catalog.section — выводит список элементов инфоблока.
  3. news.detail и catalog.element — выводит детальную страницу элемента инфоблока.
  4. catalog.section.list — выводит список разделов инфоблока.
  5. iblock.element.add.form — выводит форму создания элемента инфоблока.

Эти компоненты покрывают большинство стандартных задач при разработке сайта. Создавать собственные нужно, только если требуется нештатное поведение (например, вывод данных из нескольких инфоблоков одновременно с постраничной навигацией) или нужна тонкая оптимизация с учетом специфики проекта, когда на счету каждые 0,05 секунды.