По созданию модулей для битрикс на функционале ядра 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)),//обязательное поле даты
);
}
}