Инфоблоки
В фреймворке существует две версии информационных блоков:
- Инфоблоки 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. Далее объекты класса можно использовать для создания, обновления и удаления элементов.
Компоненты
Основные компоненты для работы с инфоблоками:
- news и catalog — комплексные компоненты списка и детальной страницы.
- news.list и catalog.section — выводит список элементов инфоблока.
- news.detail и catalog.element — выводит детальную страницу элемента инфоблока.
- catalog.section.list — выводит список разделов инфоблока.
- iblock.element.add.form — выводит форму создания элемента инфоблока.
Эти компоненты покрывают большинство стандартных задач при разработке сайта. Создавать собственные нужно, только если требуется нештатное поведение (например, вывод данных из нескольких инфоблоков одновременно с постраничной навигацией) или нужна тонкая оптимизация с учетом специфики проекта, когда на счету каждые 0,05 секунды.