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

Урок 6 из 10

40 мин

Легко

Немного теории

Инфоблоки

Один из главных модулей платформы — iblock или модуль “Информационные блоки” (сокращенно Инфоблоки). Модуль предоставляет возможность пользователям с соответствующими правами создавать в системе свои структуры данных, хранимые в БД по аналогии с созданием таблиц SQL. В состав модуля входят страницы административного раздела и набор компонентов для вывода данных из инфоблоков на сайте.

Модуль определяет следующие понятия:

  • Инфоблок

    Это справочник/таблица/реестр записей, аналог таблиц SQL.
  • Свойства элементов инфоблока

    Это настраиваемые свойства/поля/атрибуты записей, аналог колонок таблиц SQL.
  • Поля элементов инфоблока

    Это ненастраиваемый аналог свойств. Например, у каждого элемента обязаны быть ID и название, могут быть заданы текст для анонса, дата начала активности и т.п. Удалять поля нельзя.
  • Элементы инфоблока

    Это записи, аналог строк таблиц SQL.
  • Типы инфоблоков

    Верхнеуровневый инструмент группировки инфоблоков.
  • Разделы инфоблоков

    Инструмент группировки элементов внутри инфоблока.
  • UF-свойства разделов инфоблоков

    Формально они относятся к главному модулю, но применимы и в этом модуле.
  • Поля разделов инфоблоков

    Аналогичны полям элементов инфоблоков.

Таким образом, если требуется завести простой справочник местоположений, вам подойдет иерархия:

  • Тип инфоблока = Контент.
  • Инфоблок = Города и области.
  • Разделы = Области.
    • UF-свойства: население, площадь.
  • Элементы = Города.
    • Свойства: население, площадь, флаг административного центра области.

При создании инфоблока можно отключить возможность группировки элементов по разделам. Мы рекомендуем всегда ее оставлять, даже если разделы не будут самостоятельной сущностью БД, как в предыдущем примере. Их всегда могут использовать администратор и контент-редактор по прямому назначению, просто для группировки огромного числа элементов.

Создание инфоблока

Старайтесь максимально использовать стандартные поля элементов. Их нельзя удалить и они в любом случае будут занимать место в БД. В поле NAME (Название) можно хранить ФИО (если нужно хранить список людей), наименование (для товаров) или даже дату обращения (для хранения результатов формы).

Если вы отказываетесь от использования поля в работе сайта, то не забудьте скрыть его во всех интерфейсах, где администратор и контент-редактор могут его увидеть. Заметка в инструкции — это хорошо, но если поля не видно, то никто и не попытается его использовать. В системе можно настраивать формы редактирования элементов и разделов, а также списки и фильтры по элементам и разделам инфоблоков.

Для всех используемых полей задумайтесь об их переименовании, если это упрощает понимание для администратора и контент-редактора. Что, например, следует написать в поле “Название” для инфоблока “Менеджеры”? Имя? Фамилию? Фамилию и инициалы? А если поле переименовать в “ФИО полное”? Вопрос отпадет сам собой и без инструкции.

Не забывайте задавать подписи и настраивать права для инфоблоков. Хотя бы один раз пройдитесь по каждому полю ввода на форме создания инфоблока, чтобы разобраться с его возможностями.

Если вам не хватает системных предустановленных полей, вы можете добавить свои свойства. Для этого тщательно продумайте обязательность и тип свойства. Например, серия и номер паспорта — это строка или число? Два свойства или одно? Ответ будет крыться в вариантах использования этих данных в логике сайта.

Всегда создавайте свойства с символьным кодом латиницей и прописными буквами. Так вы не столкнетесь с неожиданным приведением символьного кода к верхнему регистру при работе через API модуля iblock.

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

Для непубличных служебных инфоблоков (например, списка договоров или использованных промокодов) следует отключать вкладку с SEO-полями.

Изменяя настройки отображения в панели администратора, не забывайте применять изменения “для всех”, иначе результатом ваших трудов не сможет воспользоваться никто другой.

Компоненты

В платформе представлен набор компонентов для работы с инфоблоками, который закрывает все базовые сценарии работы.

Название Код Назначение
Список новостей bitrix:news.list

Выводит элементы 1-го инфоблока с постраничной навигацией и фильтром. Вы будете им пользоваться чаще, чем думаете.

С его помощью можно реализовать не только список новостей, но и список отзывов, акций, слайдеры с анимацией, преимущества компании, чат, блог, простую CRM и еще множество вариантов.

Новость детально bitrix:news.detail

Выводит 1 конкретный элемент инфоблока.

Структура разделов bitrix:catalog.section.list

Выводит список разделов 1-го инфоблока

Элементы раздела bitrix:catalog.section

Расширяет возможности bitrix:news.list функциями интернет-магазина (цены, остатки, покупка).

Элемент каталога детально bitrix:catalog.element

Расширяет возможности bitrix:news.detail функциями интернет-магазина (цены, остатки, покупка).

Пункты меню bitrix:menu.sections

Подготавливает разделы 1-го инфоблока для добавления в меню.

Умный фильтр bitrix:catalog.smart.filter

Выводит форму фильтра по элементам 1-го инфоблока

Фильтрация

Можно сравнить компоненты bitrix:news.list, bitrix:catalog.section и bitrix:catalog.section.list с SELECT-запросом в языке SQL. У этих компонентов можно настроить:

  • список запрашиваемых из БД полей и свойств — прямо в интерфейсе сайта;
  • источник данных (1 инфоблок) — прямо в интерфейсе сайта;
  • фильтр — через глобальную переменную;
  • сортировку данных — прямо в интерфейсе сайта, до 2-ух полей для сортировки;
  • настройки постраничной навигации — прямо в интерфейсе сайта.

Сложности вызывает, как правило, только фильтр (параметр называется FILTER_NAME). Это строковый параметр, там должно быть задано название глобальной php-переменной типа “массив”.

Например, если вам нужно вывести список только важных сообщений текущему пользователю из инфоблока Уведомления, хорошим вариантом будет фильтр с названием importantUserMessagesFilter.

картинка

Тогда выше по коду нужно объявить глобальную переменную и инициализировать ее как массив с фильтром по двум свойствам: ID пользователя и флаг важности сообщения. Формат массива соответствует формату фильтра метода CIBlockElement::GetList.

global $importantUserMessagesFilter;
$importantUserMessagesFilter = [
    "PROPERTY_USER" => $USER->getId(),
    "PROPERTY_IMPORTANT" => "Y",
];

Список разделов

Следует разделять два случая, когда вам нужно выводить список разделов.

В первом случае вам нужно показать пользователю какое-то количество разделов. Все разделы при этом будут выглядеть однотипно. Это может быть список популярных разделов на главной странице интернет-магазина или перечень важных групп документов. В этом случае используйте bitrix:catalog.section.list.

Во втором случае вам нужно показывать разделы в зоне навигации по сайту. При этом тот раздел, в котором сейчас “находится” пользователь, должен быть выделен. В этом случае используйте связку bitrix:menu.sections и bitrix:menu.

Полезные инструменты

Компоненты для работы с инфоблоками лишь выводят данные, а хранятся они в БД и редактируются через интерфейс администратора. Но все стандартные компоненты в режиме правки позволяют редактировать, создавать и удалять элементы и разделы инфоблоков во всплывающем окне без необходимости куда-то уходить со страницы.

Задача разработчика — не нарушить работу этого механизма при доработке шаблонов сайта. Этот код размещается внутри цикла по $arResult[“ITEMS”] (для элементов) и выглядит примерно так:

картинка

А конкретно: методы addEditAction, addDeleteAction и getEditAreaID.

Культура кода в шаблонах компонентов *list

Если нет ни одной записи, компонент не должен выводить ничего, если по дизайну не требуется иного (весь шаблон должен быть обернут в if $arResult["ITEMS"] или foreach).

Компонент должен проверять любые данные перед выводом, чтобы не было пустых атрибутов href у ссылок или src у изображений, пустых кавычек или странных пустых тегов <div></div> или <span></span> в верстке.

Если компонент должен выводить свойство элемента, выберите это свойство в настройках компонента и используйте узел DISPLAY_PROPERTIES в $arResult. Если свойство у элемента заполнено и выбрано в настройках, то в DISPLAY_PROPERTIES оно будет. Так вы повысите управляемость компонента, и разработчик не будет нужен, если заказчику потребуется скрыть какое-то свойство.

картинка

Все поля должны быть выбраны в настройках компонента и в коде шаблона выводиться из узла FIELDS.

картинка

Все изображения перед выводом должны быть уменьшены до требуемых по верстке размеров. Почти всегда речь идет о сжатии картинок для анонса и детальных картинок “на лету” прямо в коде шаблона компонента до нужных размеров и/или пропорций. Но и при загрузке изображений в инфоблок рекомендуем настроить их сжатие, чтобы не хранить нечаянно загруженную ненужную фотографию сотрудника в UHD-качестве. Обычно хватает первичного сжатия до размера 2000 на 2000 пикселей, но все зависит от проекта.

Все ссылки из шаблона должны выводиться с использованием узлов DETAIL_PAGE_URL, SECTION_PAGE_URL или LIST_PAGE_URL

AJAX-режим

Многие компоненты системы могут работать в режиме без перезагрузки страницы. За это отвечает параметр AJAX_MODE. При установке этого флага любая попытка компонента увести пользователя со страницы будет перехвачена системой и запрос будет отправлен в режиме AJAX. Отправленный запрос будет в фоновом запросе браузера обработан сервером и в ответ будет отправлен итоговый html компонента.

Режим не отключает обычную работу компонента, посетители с отключенным javascript в браузере смогут пользоваться компонентом, как раньше.

Лучшее применение режим находит в комплексных компонентах, о которых будет рассказано в одной из следующих тем.

Практика

В этом видеоуроке мы научимся использовать инфоблоки и увидим стандартные компоненты для работы с ними.

В примере:

  • Создадим новый инфоблок для вывода отзывов на сайте.
  • Настроим созданный инфоблок.
  • Заполним данными и выведем на сайте.
  • Настроим вывод динамических элементов.

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

25 мин