{"id":14279,"url":"\/distributions\/14279\/click?bit=1&hash=4408d97a995353c62a7353088166cda4ded361bf29df096e086ea0bbb9c1b2fc","title":"\u0427\u0442\u043e \u0432\u044b\u0431\u0435\u0440\u0435\u0442\u0435: \u0432\u044b\u0435\u0445\u0430\u0442\u044c \u043f\u043e\u0437\u0436\u0435 \u0438\u043b\u0438 \u0437\u0430\u0435\u0445\u0430\u0442\u044c \u0440\u0430\u043d\u044c\u0448\u0435?","buttonText":"","imageUuid":""}

Создание модуля на Bitrix D7

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

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

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

Итак начнем:

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

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

Admin

В этой директории создаем файл 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;

Install

Файл index.php:

<?php //подключаем основные классы для работы с модулем use Bitrix\Main\Application; use Bitrix\Main\Loader; use Bitrix\Main\Entity\Base; use Bitrix\Main\Localization\Loc; use Bitrix\Main\ModuleManager; //в данном модуле создадим адресную книгу, и здесь мы подключаем класс, который создаст нам эту таблицу use Module\Adress\AdressTable; Loc::loadMessages(__FILE__); //в названии класса пишем название директории нашего модуля, только вместо точки ставим нижнее подчеркивание class module_bitrix extends CModule { public function __construct() { $arModuleVersion = array(); //подключаем версию модуля (файл будет следующим в списке) include __DIR__ . '/version.php'; //присваиваем свойствам класса переменные из нашего файла if (is_array($arModuleVersion) && array_key_exists('VERSION', $arModuleVersion)) { $this->MODULE_VERSION = $arModuleVersion['VERSION']; $this->MODULE_VERSION_DATE = $arModuleVersion['VERSION_DATE']; } //пишем название нашего модуля как и директории $this->MODULE_ID = 'module_bitrix'; // название модуля $this->MODULE_NAME = Loc::getMessage('MYMODULE_MODULE_NAME'); //описание модуля $this->MODULE_DESCRIPTION = Loc::getMessage('MYMODULE_MODULE_DESCRIPTION'); //используем ли индивидуальную схему распределения прав доступа, мы ставим N, так как не используем ее $this->MODULE_GROUP_RIGHTS = 'N'; //название компании партнера предоставляющей модуль $this->PARTNER_NAME = Loc::getMessage('MYMODULE_MODULE_PARTNER_NAME'); $this->PARTNER_URI = 'https://вашсайт';//адрес вашего сайта } //здесь мы описываем все, что делаем до инсталляции модуля, мы добавляем наш модуль в регистр и вызываем метод создания таблицы public function doInstall() { ModuleManager::registerModule($this->MODULE_ID); $this->installDB(); } //вызываем метод удаления таблицы и удаляем модуль из регистра public function doUninstall() { $this->uninstallDB(); ModuleManager::unRegisterModule($this->MODULE_ID); } //вызываем метод создания таблицы из выше подключенного класса public function installDB() { if (Loader::includeModule($this->MODULE_ID)) { AdressTable::getEntity()->createDbTable(); } } //вызываем метод удаления таблицы, если она существует public function uninstallDB() { if (Loader::includeModule($this->MODULE_ID)) { if (Application::getConnection()->isTableExists(Base::getInstance('\Module\Adress\AdressTable')->getDBTableName())) { $connection = Application::getInstance()->getConnection(); $connection->dropTable(AdressTable::getTableName()); } } } }

файл install.php

<?php //версия релиза модуля и дата релиза $arModuleVersion = array( 'VERSION' => '0.0.1', 'VERSION_DATE' => '2020-10-11' );

Lang

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

ru

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

файл admin/menu.php

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

файл install/index.php

<?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

файл 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, а также модуль, который будет содержать интерфейс для работы с пользователем включающий возможность редактирования, обновления, создания и удаления записей в таблице.

0
6 комментариев
Написать комментарий...
Борис Хмелев

Наткнулся случайно. Отлично пишешь, думаю для начинающих стоящая статья. Лаконично, без лишнего и по делу. Если бы подобный цикл статей был тогда, когда сам осваивал работу с модулями, упростило бы жизнь :) Спасибо за труд.

Ответить
Развернуть ветку
Юрий Маратканов

Про lib/adress.php - не очень понятно. Так это языковой файл, или всё таки файл с классом?

Ответить
Развернуть ветку
Лёха Лапиков

Пересмотри еще раз внимательнее. Почему ты решил, что он языковой?
Папка lib - library, файл address. Никаких намеков на язык.
Язык в папке lang.

Ответить
Развернуть ветку
Лёха Лапиков

Спасибо, очень доходчиво объяснил. Сейчас, как нельзя кстати!

Ответить
Развернуть ветку
Лёха Лапиков

Жаль продолжения нет.

Ответить
Развернуть ветку
Evgenia Pazukhina

Вероятно, массив $arModuleVersion все же должен лежать по пути module.name/install/version.php, а не module.name/install/install.php

Ответить
Развернуть ветку
3 комментария
Раскрывать всегда