1с битрикс создание модуля

Обновлено: 04.07.2024

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

Для нетерпиливых исходный код модуля можно скачать здесь.

Всю теоретическую информацию о D7, вы можете найти в документации для разработчиков на сайте 1С:Битрикс. А на практике я опишу как использовать: namespace, ORM, автозагрузку классов.

Структура модуля

Для начала создадим основную структуру модуля, состоящую из следующих папок, файлов, структура модуля D7 аналогична обычному модулю:

install.sql - запросы, которые выполняются при установке модуля uninstall. sql - запросы, которые выполняются при удалении модуля include.php - файл, который используется для подключения файлов модуля

далее по порядку разберём файлы модуля.

Файл /admin/menu.php

Данный файл создаёт пункты меню в административном интерфейсе 1С:Битрикс.

В нём небходимо создать массив $aMenu, в котором указываются параметры меню:

  • parent_menu - родительская группа меню
  • url - ссылка на страницу модуля

так как модуль без отдельной страницы, то ссылку укажем на таблицу модуля

Файл /install/db/install.sql

В данном файле напишем запрос на создание таблицы 'brainkit_test' помимо основных полей ID и TITLE, добавим поля SORT и CREATED, для сортировки и сохранения даты изменения записи в таблице соответственно:

Файл /install/db/uninstall.sql

А здесь sql запрос на удаление созданной базы:

Файл /install/index.php

Данный файл является классом, который наследуется от класса Cmodule, выполняется при установке или удалении модуля через административный интерфейс.

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

В методах класса должны обязатально присутствовать методы: DoInstall и DoUninstall, которые отрабатывают при установке и удалении модуля, а внутри них должны вызываться функции RegisterModule и UnRegisterModule для регистрации и удаления регистрации модуля в базе соответственно.

Внутри методов DoInstall/DoUninstall реализуем методы для: создания/удаления таблицы в базе, установки/удаления событий и дополнительных файлов модуля. Так как для нашего модуля не нужны события и дополнительные файлы, то эти методы просто оставим для будущего расширения возможностей модуля.

Исходный код файла:

Файл /lang/ru/lib/data.php

Данный файл служит для реализации переводов для файла /lib/data.php, в нём простой массив $MESS, в котором хранитяся пары ключ=>значение перевода. А часть ru в пути к файлу является указанимем на язык перевода.

После того как мы создали файл, в любой части кода модуля, для получения перевода, мы можем вызвать функцию Loc::getMessage('KEY'), где KEY - ключ перевода:

Файл /lib/test.php

В данном файле пристуствует namespace, который называется в соответвии будет храниться основная логика работы модуля, файл подключается в файле /include.php, для примера реализуем в данном файле получение одной записи из таблицы модуля с помощью ORM класса DataTable:

Файл /lib/data.php

Данный файл служит для организации доступа к таблице с помощью ORM, в нём создаётся класс DataTable, который наследуется от класса Entity\DataManager, который в свою очередь реализует парадигму ORM. Для того что бы подключить наш класс к ORM, мы должны указать имя таблицы и задать структуру, для этого есть 2 метода getTableName и getMap соответственно. Исходный код:

Наш модуль после установки добавляет на страницы сайта кнопку плавной прокрутки страницы вверх. Какие файлы и папки могут и должны быть, можно изучить в соответствующем разделе документации Битрикс. Модуль разместим в директории local/modules и создадим такую файловую структуру:

Как видите, внутри local/modules/scrollup у нас:

  • install — набор скриптов для установки и удаления модуля;
  • lang — набор языковых файлов модуля;
  • lib — набор файлов, в которых реализуется логика решения;
  • include.php — файл, подключаемый при вызове модуля в коде;
  • options.php — страница настроек, подключаемая в административной части.

Рассмотрим подробнее папку install :

  • assets — содержит JavaScript и CSS кнопки, которые будут подключаться в пользовательской части;
  • index.php — файл, в котором содержится описание модуля и реализуется его установка и удаление;
  • step.php и unstep.php — соответственно шаги установки и удаления, их может быть несколько;
  • version.php — файл содержит версию и время обновления нашего модуля.

Теперь нам нужно написать класс, в котором будет реализована установка и удаление модуля. Имя класса должно совпадать с директорией модуля и являться наследником от CModule . Метод doInstall() вызывается при установке модуля из панели управления, метод doUninstall() — при деинсталляции модуля. Метод doInstall() подключает файл step.php , а метод doUninstall() — файл unstep.php

Теперь в панели управления на странице «Настройки • Настройки продукта • Модули» мы видим наш модуль:


И можем установить его:


Создадим страницу настроек для модуля. Через панель управления контент менеджер сможет:

  • Включать/выключать модуль;
  • Подключать библиотеку jQuery, если она еще не подключена;
  • Изменять ширину/высоту/радиус и цвет кнопки;
  • Менять положение кнопки и скорость анимации.



Когда мы описывали код установки модуля, то привязались к событию OnBeforeEndBufferContent и указали метод appendJavaScriptAndCSS() класса Main как обработчик. Теперь настало время его написать:

Осталось только написать js-код для прокрутки страницы наверх и задать css-стили для кнопки:

Совсем недавно, а точнее несколько месяцев назад, моя деятельность переплелась с системой управления содержимым 1С-Битрикс. И хотя в начале я был не восторге, а многие вещи мне казались запутанными и местами нелогичными, но чем дольше я работал с 1С-Битрикс, тем больше убеждался, что 1С-Битрикс – это система, которая позволяет реализовать проект любого уровня сложности. Если после установки одной из редакций движка, возникает необходимость в дополнительной функциональности, её можно расширить при помощи платных или бесплатных модулей. Сегодня же я расскажу, как написать такой модуль самому.

После прочтение документации, статей и просмотра видео уроков можно определено сказать, что после написания собственного модуля – степень понимания работы 1С-Битрикс вырастит на существенный уровень. По крайней мере, раньше я считал Битрикс просто CMS, но сейчас, он развивается как платформа для разработки веб-приложений - Bitrix Framework. Поработав определенное время с относительно крупными проектами на 1С-Битрикс, могу сказать, что как по мне, мало «это» напоминает фреймворк, больше мешанину (эта одна из причин по которой многие из моих знакомых отказываются работать с Битрикс), особенно, где код не переработан под новое ядро D7.

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

Что же написать? Тут я решил не мудрить и залез на маркетплейс и наткнулся:

marketplejs-1s-bitriks

Что интересно, казалось бы, добавить к себе кнопку наверх по сути пару минут, но есть платные решения и у некоторых из них более 300 скачек. В общем, говоря, выбор у меня для первого модуля пал именно на данную кнопку с набором настроек, которые можно будет менять через админку сайта.

Структура модуля

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

  • Пака модуля falbar.totop – название её в системе используется как индификатор, так что рекомендуется добавлять помимо названия и имя партнера. Соответственно falbar – имя партнера, totop – название модуля;
  • Внутри лежат три папки: install – набор скриптов для установки и удаления модуля, lang – набор языковых файлов, lib – набор файлов, в которых реализуется логика решения;
  • И осталось два файла: include.php – файл, подключаемый при вызове модуля в коде (его мы использовать не будем и оставим пустым), options.php – страница настроек, подключаемая в административной части.

Теперь рассмотрим папку install поподробнее:

  • assets – в этой папке я разместил JavaScript и CSS нашей кнопки, которые будут подключаться в пользовательской части;
  • index.php – файл в котором содержится описание модуля и реализуется установка и удаление его;
  • step.php и unset.php – соответственно шаги установки и удаления, их может быть сколько угодно, а также мы можем и не использовать их;
  • version.php – в нем указывается версия и время обновления нашего модуля.

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

struktura-modulya-bitriks-main

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

Установка и удаление модуля Битрикс

Вот мы и приступили непосредственно к написанию кода. Первое, что стоит заполнить это файл version.php:

Указываем в массиве два параметра версию и время обновление модуля и переходим к описанию главного файла index.php:

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

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

Имя класса должно соответствовать папке модуля и являться наследником от CModule, только вместо точки стоит прописать нижние подчеркивание, после чего в адмике мы увидим, что система определила наш модуль:

sistema-opredelila-nash-modul

Двигаемся дальше и сообщим системе больше информации, о нашем модуле, указав основные свойства, делать это я буду в конструкторе класса:

Рассмотрев несколько примеров решений, я пришел к выводу, что конструктор лучше всего подходит для выполнения такого рода задач. В нем мы подключили наш файл version.php и заполнили основные свойства для нашего класса. Перед тем, как посмотреть результат этих действий, нам нужно заполнить соответствующий языковой файл:

Вернемся в админку и посмотрим, как теперь выглядит модуль:

sistema-opredelila-nash-modul-s-parametrami

Следующий метод, который мы напишем, реализует процесс установки:

Добавим ещё несколько переменных в языковой файл:

Опишем три метода, к которым мы обратились из установочного DoInstall():

Копируем наши скрипты и стили в систему.

Так как мы не работаем с базой, оставляем этот метод пустым.

Регистрируем событие OnBeforeEndBufferContent. Перед тем, как страница будет отрисоваться, мы добавим свой HTML код, в котором сохраним настройки для нашей кнопки. Этот весь механизм далее напишем в файле Main.php.

С установкой мы закончили теперь опишем процесс удаления, заключаться он будет в нескольких методах:

Вызываем uninstall методы, удаляем регистрационную запись о модуле из базы данных и подключаем файл unstep.php, о котором мы выше уже говорили.

Мы описали ещё одну языковую переменную, добавим её в соответствующий файл:

А теперь поговорим о методах:

Удаляем добавленные скрипты и стили из системы.

Удаляем из базы настройки нашего модуля.

И в последнем методе удаляем регистрационную запись обработчика события OnBeforeEndBufferContent. Чтобы увидеть результат нам осталось описать два файла step.php и unstep.php так и сделаем.

И посмотрим, что получилось:

modul-ustanovlen

В принципе, он не сильно отличается от варианта в первом файле, добавим новые языковые переменные в соответствующий файл и проверим удаление модуля Битрикс:

modul-udalen

Пишем страницу настроек для модуля Битрикс

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

pustaya-stranitsa-nastroek

Первым делам подключим все необходимые классы, языковые файлы и получим id модуля.

Что теперь? Надо описать настройки модуля и поместить их в массив.

Через административную часть мы позволим пользователю изменять:

  • Включать/выключать модуль;
  • Изменять ширину/высоту/радиус кнопки;
  • Менять цвет;
  • Менять положение кнопки и скорость анимации.

Для примера думаю, этих параметров хватит с головой, напишем массив настроек:

Вот у нас получился такой массив, со значениями по умолчанию. Как его заполнять можно изучить в документации, но там информации мало. Из примеров чуть больше можно найти на этой странице . Добавим в соответствующий языковой файл новые элементы массива MESS:

Нам осталось отрисовать форму, для этого создадим новый экземпляр класса CAdminTabControl, куда и передаём массив с настройками:

И обозначим конец отрисовки формы:

У нас появилось ещё две языковые переменные, добавим и их:

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

stranitsa-nastroek

Как видите, получилось весьма годно, нам осталось только добавить код для сохранения настроек. Поместим его после массива с параметрами:

В обработчике мы также используем массив с параметрами для удобства сохранения, хотя это один из способов, в конце, конечно, нужно сделать редирект. Все настройки мы сохраняем при помощи статического метода set() у класса Option, который нужен именно для работы с настройками модуля. Вот мы и закончили со страницей настроек, теперь нам осталось подкинуть их в пользовательскую часть и обработать на стороне клиента.

Подключаем скрипты и стили кнопки, передаем настройки на страницу пользователя

Тут могут быть разные пути для решения этой задачи. В самом начале статьи, когда мы описывали код установки модуля, мы привязались к событию перед отрисовкой страницы и указали метод appendScriptsToPage() класса Main как обработчик. Теперь нам его нужно написать:

В методе мы определили, что он будет отрабатывать только на стороне клиента. Далее сформировали HTML код с набором настроек в json формате для удобства и добавили его в HEAD документа. В конце подключили скрипты и стили нашего Битрикс модуля кнопка наверх.

skripty-i-stili-bitriks-modulya-knopka-naverh

Вот и всё - параметры переданы, осталось их обработать на стороне клиента.

JavaScript и CSS кнопки наверх Битрикс модуля

Вот мы и подобрались к финальной части и осталось самое простое, на мой взгляд. Опишем стандартные стили нашей кнопки по умолчанию:

Незабываем код упаковать и добавить в style.min.css. Для работы кнопки нам нужна библиотека jQuery, качаем её с официального сайта и также добавляем её в соответствующий файл. Теперь напишем JavaScript, который и будет добавлять кнопку с учетом настроек:

В результате у нас получился такой код. Сам принцип написания кнопки я уже рассматривал в статье: Плавная кнопка прокрутки «Наверх», если вам интересен сам механизм. Осталось увидеть плоды нашей работы:

Перед тем, как смотреть, нужно удалить и заново установить модуль

modul-knopka-naverh

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

По созданию модулей для битрикс на функционале ядра D7 информации достаточно мало, за исключением видео с официального канала Битрикс в youtube и нескольких проектов на github.

Но видео как всегда достаточно расплывчаты и имеют очень мало кода для возможности создания модуля с нуля. Проекты на Github содержат очень много лишнего кода, а также очень плохо документированы.

Сразу скажу, что отличий от модулей на старом ядре не так уж и много

Структура нашего модуля: создадим директорию и назовем ее "название модуля.ваша компания", например module.bitrix, откроем директорию и создадим внутри еще директории:

  • admin
  • install
  • lang
  • lib
  • README.md (в этом файле вы можете описать способ подключения или работы с вашим модулем)
  • include.php (оставим данный файл пустым, добавив лишь код "<?php")

В этой директории создаем файл menu.php:

<?php //подключаем класс и файлы локализации use Bitrix\Main\Localization\Loc; Loc::loadMessages(__FILE__); //добавляем пункт меню для нашего модуля $menu = array( array( 'parent_menu' => 'global_menu_content',//определяем место меню, в данном случае оно находится в главном меню 'sort' => 400,//сортировка, в каком месте будет находится наш пункт 'text' => Loc::getMessage('MYMODULE_MENU_TITLE'),//описание из файла локализации 'title' => Loc::getMessage('MYMODULE_MENU_TITLE'),//название из файла локализации 'url' => 'mymodule_index.php',//ссылка на страницу из меню 'items_id' => 'menu_references',//описание подпункта, то же, что и ранее, либо другое, можно вставить сколько угодно пунктов меню 'items' => array( array( 'text' => Loc::getMessage('MYMODULE_SUBMENU_TITLE'), 'url' => 'mymodule_index.php?lang=' . LANGUAGE_ID, 'more_url' => array('mymodule_index.php?lang=' . LANGUAGE_ID), 'title' => Loc::getMessage('MYMODULE_SUBMENU_TITLE'), ), ), ), ); return $menu; <?php //версия релиза модуля и дата релиза $arModuleVersion = array( 'VERSION' => '0.0.1', 'VERSION_DATE' => '2020-10-11' );

Создаем директорию ru для русского языка

Создадим директории admin,install,lib

<?php $MESS['MYMODULE_MENU_TITLE'] = 'Название компании'; $MESS['MYMODULE_SUBMENU_TITLE'] = 'Тестовый модуль'; <?php $MESS['MYMODULE_MODULE_NAME'] = 'название модуля'; $MESS['MYMODULE_MODULE_DESCRIPTION'] = 'описание модуля'; $MESS['MYMODULE_MODULE_PARTNER_NAME'] = 'название партнера';

файл lib/adress.php (для следующего файла)

<?php $MESS['MYMODULE_NAME'] = 'Название'; $MESS['MYMODULE_NAME_DEFAULT_VALUE'] = 'Безымянный элемент'; $MESS['MYMODULE_ADRESS'] = 'Адрес'; $MESS['MYMODULE_ADRESS_DEFAULT_VALUE'] = 'Нет адреса';

файл lib/adress.php (файл, который формирует таблицу для работы с ней)

<?php namespace Module\Adress; use Bitrix\Main\Entity\DataManager; use Bitrix\Main\Entity\IntegerField; use Bitrix\Main\Entity\StringField; use Bitrix\Main\Entity\DatetimeField; use Bitrix\Main\Entity\Validator; use Bitrix\Main\Localization\Loc; use Bitrix\Main\Type; Loc::loadMessages(__FILE__); class AdressTable extends DataManager < // название таблицы public static function getTableName() < return 'adressbook'; >// создаем поля таблицы public static function getMap() < return array( new IntegerField('ID', array( 'autocomplete' => true, 'primary' => true )),// autocomplite с первичным ключом new StringField('NAME', array( 'required' => true, 'title' => Loc::getMessage('MYMODULE_NAME'), 'default_value' => function () < return Loc::getMessage('MYMODULE_NAME_DEFAULT_VALUE'); >, 'validation' => function () < return array( new Validator\Length(null, 255), ); >, )),//обязательная строка с default значением и длиной не более 255 символов new StringField('ADRESS', array( 'required' => false, 'title' => Loc::getMessage('MYMODULE_ADRESS'), 'default_value' => function () < return Loc::getMessage('MYMODULE_ADRESS_DEFAULT_VALUE'); >, 'validation' => function () < return array( new Validator\Length(null, 255), ); >)),//обязательная строка с default значением и длиной не более 255 символов new DatetimeField('UPDATED_AT',array( 'required' => true)),//обязательное поле даты new DatetimeField('CREATED_AT',array( 'required' => true)),//обязательное поле даты ); > >

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

Читайте также: