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

З 12-ї версії 1С-Бітрікс з'явилася можливість писати компоненти використовуючи класи, але найбільш примітною, як на мене, стала можливість успадковувати класи компонентів. Таким чином, можна написати стандартний компонент, а потім при необхідності успадковуватися від нього і додавати новий необхідний функціонал, не копіпастя повторювані і стандартні шматки коду. Так само з 12-ї версії хлопці анонсували появу нового ядра D7 (чому таку назву я не знаю), вони переписують ядро, з'явилися неймспейси, ORM, у 14-й версії стали з'являтися компоненти, переписані під нову ідеологію, з'явився цілий розділ у документації. D7. Спираючись на ці нововведення, спробуємо написати компонент по новому. Відразу скажу, я не фанат компонентів, які налаштовуються цілком і повністю і виконують 100 500 завдань. У моєму розумінні компонент має мінімальну кількість налаштувань та виконує одну конкретну задачу.

Стандартні параметри для компонента:

  • вибір типу інфоблоку (список);
  • вибір інфоблоку (список);
  • показувати посторінкову навігацію (чекбокс);
  • кількість елементів (число; якщо 0, то показувати всі елементи; якщо не нуль та встановлений чекбокс посторінкової навігації, то це кількість елементів на сторінці; якщо не нуль та чекбокс посторінкової навігації не встановлений, то кількість елементів, вибраних зверху);
  • поле для сортування (сортувань зазвичай два);
  • напрямок сортування;
  • кешування (тип кешування, час кешування).
Компонент повинен виконувати такі функції:
  • підключає мовний файл (для виведення мовних фраз) - цей метод є стандартним, ми його лише перевизначаємо;
  • готує параметри компонента - даний методє стандартним, перевизначається. Важливо, що всі параметри компонента були підготовлені, наскільки можна приведені до очікуваного типу, т.к. від цього залежить кеш компонента;
  • підключає необхідні модулі;
  • підключає обов'язкові параметри;
  • виконує дії перед кешуванням;
  • кешує роботу компонента;
  • проводить вибірку даних для відображення;
  • підключає шаблон виведення;
  • виконує дії після кешування (наприклад, встановлення заголовків, виконання відкладених функцій, будь-які дії, які необхідно виконувати постійно за кешем компонента).
Таку структуру можна успадковувати і перевизначати лише ті методи, які необхідно (наприклад, для отримання списку розділів достатньо перевизначити метод вибірки, а не переписувати весь компонент).

Відмінні риси:

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