Как стать автором
Обновить

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

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

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

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

Итак начнем:

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

  • admin

  • install

  • lang

  • lib

  • README.md (в этом файле вы можете описать способ подключения или работы с вашим модулем)

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/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)),//обязательное поле даты
        );
    }
}
Теги:
Хабы:
Данная статья не подлежит комментированию, поскольку её автор ещё не является полноправным участником сообщества. Вы сможете связаться с автором только после того, как он получит приглашение от кого-либо из участников сообщества. До этого момента его username будет скрыт псевдонимом.