Search
Write a publication
Pull to refresh

Разработка своего компонента для Битрикс с классами и D7

С 12й версии 1С-Битрикс появилась возможность писать компоненты используя классы, но наиболее примечательной, на мой взгляд, стала возможность наследовать классы компонентов. Таким образом, можно написать стандартный компонент, а потом при необходимости наследоваться от него и добавлять новый необходимый функционал, не копипастя повторяющиеся и стандартные куски кода.
Так же с 12й версии ребята анонсировали появление нового ядра D7 (почему такое название я не знаю), они переписывают ядро, появились неймспейсы, ORM, в 14й версии стали появляться компоненты переписанные под новую идеологию, появился целый раздел в документации, посвященный D7.
Опираясь на эти нововведения попытаемся написать компонент по новому.

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

При работе с битриксом 90% это работа с инфоблкоми, поэтому можно выделить три основных компонента для работы инфоблоками:
  • компонент вывода списка элементов инфоблока (например, список новостей);
  • компонент вывода описания элемента инфоблока (например, детальное описание новости);
  • комплексный компонент (назовем его роутер, для работы ЧПУ)

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

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

Компонент должен выполнять следующие функции:
  • подключает языковой файл (для вывода языковых фраз) — данный метод является стандартным, мы его лишь переопределяем;
  • подготавливает параметры компонента — данный метод является стандартным, переопределяем. Важно, что бы все параметры компонента были подготовлены, по возможности приведены к ожидаемому типу, т.к. от этого зависит кеш компонента;
  • подключает необходмые модули;
  • подключает обязательные параметры;
  • выполняет действия перед кешированием;
  • кеширует работу компонента;
  • проводит выборку данных для отображения;
  • подключает шаблон вывода;
  • выполняет действия после кеширования (например, установка заголовков, выполнение отложенных функций, любые действия, которые необходимо выполнять постоянно «за кешем компонента»).

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

Отличительные особенности:
  • по новой идеологии, в случае появления нештатной ситуации необходимо выбросить исключение, поэтому в коде появились битриксовые исключения;
  • появились неймспейсы, поэтому работа с языковыми фразами осуществляется через класс Bitrix\Main\Localization\Loc, при этом необходимо явно подключать языковые файлы через метод Loc::getMessages(__FILE__), а получение языковой фразы — Loc::getMessage();
  • подключение модулей осуществляется через метод Bitrix\Main\Loader::includeModule();
  • в случае выбрасывания эксепшена Main\ArgumentNullException необходимо указать код поля, он подставится в шаблон вывода сообщения об ошибке.

Собственно результат на GitHub

Полезная информация:
Компоненты
Ядро D7
Tags:
Hubs:
You can’t comment this publication because its author is not yet a full member of the community. You will be able to contact the author only after he or she has been invited by someone in the community. Until then, author’s username will be hidden by an alias.