Pull to refresh

Создание модуля на 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)),//обязательное поле даты
        );
    }
}
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.