Войти

Что вас интересует?

Заготовка мудуля D7 для Bitrix

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

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

Виды модулей

Системные модули располагаются в папке /bitrix/modules/ и мы их не трогаем.

Собственные модули располагаются в папке /local/modules/. В качестве названия корневой папки модуля, может выступать любое не занятое название, но при этом есть свои особенности.

Расположение модуля в админке

Модуль может располагаться в двух местах:
  1. Системные модули
  2. Партнерские модули

Системные модули

Страница установки системных модулей находится в Настройки -> Настройки продукта -> Модули

1.png

В этом случае название корневой папки модуля пишется одним словом, например hmarketing.

В этом случае название класса в файле /local/modules/hmarketing/install/index.php будет class hmarketing extends CModule.

Партнерские модули

Если название вашего модуля написан через точку, модуль считается партнёрским и его местоположение будет другое Marketplace -> Установленные решения:

2.png

Такой модуль требует специфического названия состоящего из:

  • Кода партнера
  • Названия модуля
  • код_партнёра.название_модуля

    В этом случае название корневой папки модуля пишется двумя словами, например hmarketing.d7, название класса в файле /local/modules/hmarketing.d7/install/index.php будет class hmarketing_d7 extends CModule.

    Структура

    • Папка hmarketing.d7
    • Папка admin
      • Файл menu.php расположение модуля в меню админки Битрикс
      • Файл hmarketing.php админка для пользователей Битрикс без прав администратора, нужно самим создавать ORM для записи в БД
    • Папка install
      • Папка admin
        • Файл hmarketing.php файл который будет скопирован в дирикторию bitrix и будет инклудить админку для пользователей Битрикс без прав администратора
      • Папка components содержит свой компонент для установки в Битрих путем копирования
      • Папка files
        • Файл hmarketing.php файл который будет скопирован в дирикторию / для проверки обработчика событий
      • Файл index.php основной файл установки
      • Файл instalInfo-step1.php установка модуля в несколько шагов (1-й шаг)
      • Файл instalInfo-step2.php установка модуля в несколько шагов (2-й шаг)
      • Файл instalInfo.php установка модуля в один шаг
      • Файл deInstalInfo-step1.php удаление модуля в несколько шагов (1-й шаг)
      • Файл deInstalInfo-step2.php удаление модуля в несколько шагов (2-й шаг)
      • Файл deInstalInfo.php удаление модуля в один шаг
      • Файл version.php файл с версией и датой выхода модуля
    • Папка lang
      • Папка ru
        • Папка lib
          • Файл data.php языковой файл базы данных
        • Папка install
          • Файл index.php языковой файл установки
          • Файл instalInfo-step1.php языковой файл вывода сообщения в админке сайта при установке модуля в несколько шагов (1-й шаг)
          • Файл instalInfo-step2.php языковой файл вывода сообщения в админке сайта при установке модуля в несколько шагов (2-й шаг)
          • Файл instalInfo.php языковой файл вывода сообщения в админке сайта при установке модуля
          • Файл deInstalInfo-step1.php языковой файл вывода сообщения в админке сайта при удаление модуля в несколько шагов (1-й шаг)
          • Файл deInstalInfo-step2.php языковой файл вывода сообщения в админке сайта при удаление модуля в несколько шагов (2-й шаг)
          • Файл deInstalInfo.php языковой файл вывода сообщения в админке сайта при удалении модуля
    • Папка lib
      • Файл Agent.php класс агента
      • Файл Author.php вспомогательная таблица модуля написанная через ORM
      • Файл Data.php основная таблица модуля написанная через ORM
      • Файл Events.php класс события
      • Файл Main.php основной класс модуля
    • Файл include.php используется для подключения файлов модуля
    • Файл options.php настройки модуля в админке с правами администратора, Битрикс сам создает записи в БД

    Файл /admin/menu.php

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

    3.png

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

    //файл local/modules/hmarketing.d7/admin/menu.php
    <?
    defined('B_PROLOG_INCLUDED') and (B_PROLOG_INCLUDED === true) or die();
    // пространство имен для подключений ланговых файлов
    use Bitrix\Main\Localization\Loc;
    // подключение ланговых файлов
    Loc::loadMessages(__FILE__);
    // сформируем верхний пункт меню
    $aMenu = array(
        // пункт меню в разделе Контент
        'parent_menu' => 'global_menu_services',
        // сортировка
        'sort' => 1,
        // название пункта меню
        'text' => "Модули Эйч Маркетинг",
        // идентификатор ветви
        "items_id" => "menu_webforms",
        // иконка
        "icon" => "form_menu_icon",
    );
    // дочерния ветка меню
    $aMenu["items"][] =  array(
        // название подпункта меню
        'text' => 'Страница модуля',
        // ссылка для перехода
        'url' => 'hmarketing.php?lang=' . LANGUAGE_ID
    );
    // дочерния ветка меню
    $aMenu["items"][] =  array(
        // название подпункта меню
        'text' => 'Админка модуля',
        // ссылка для перехода
        'url' => 'settings.php?lang=ru&mid=hmarketing.d7'
    );
    // возвращаем основной массив $aMenu
    return $aMenu;

    Файл /admin/hmarketing.phpФайл /admin/hmarketing.php

    Файл добаввляется в дирикторию bitrix и вызывается при переходе в админки.Данный файл создаёт пункты меню в административном интерфейсе Битрикс, дефолтные настройки:

    4.png

    //файл local/modules/hmarketing.d7/admin/hmarketing.php
    <?
    require_once $_SERVER['DOCUMENT_ROOT'] . '/bitrix/modules/main/include/prolog_admin_before.php';
    // пространство имен для автозагрузки модулей
    use \Bitrix\Main\Loader;
    // получим права доступа текущего пользователя на модуль
    $POST_RIGHT = $APPLICATION->GetGroupRight("hmarketing.d7");
    // если нет прав - отправим к форме авторизации с сообщением об ошибке
    if ($POST_RIGHT == "D") {
        $APPLICATION->AuthForm(GetMessage("ACCESS_DENIED"));
    }
    // вывод заголовка
    $APPLICATION->SetTitle("Настройка Pop Up");
    // подключаем языковые файлы
    IncludeModuleLangFile(__FILE__);
    $aTabs = array(
        array(
            // название вкладки в табах 
            "TAB" => "Параметры",
            // заголовок и всплывающее сообщение вкладки
            "TITLE" => "Параметры вывода pop-up"
        )
    );
    // отрисовываем форму, для этого создаем новый экземпляр класса CAdminTabControl, куда и передаём массив с настройками
    $tabControl = new CAdminTabControl(
        "tabControl",
        $aTabs
    );
    // подключаем модуль для того что бы был видем класс ORM
    Loader::includeModule("hmarketing.d7");
    // Необходимость сохранения изменений мы определим по следующим параметрам: 1)Страница вызвана методом POST; 2)Среди входных данных есть идентификаторы кнопок "Сохранить" и "Применить". Если эти условия сооблюдены и пройдены проверки безопасности, можно сохранять переданные скрипту данные:
    if (
        // проверка метода вызова страницы
        $REQUEST_METHOD == "POST"
        &&
        // проверка нажатия кнопок Сохранить
        $save != ""
        &&
        // проверка наличия прав на запись для модуля
        $POST_RIGHT == "W"
        &&
        // проверка идентификатора сессии
        check_bitrix_sessid()
    ) {
        // класс таблицы в базе данных
        $bookTable = new \Hmarketing\d7\DataTable;
        // обработка данных формы
        $arFields = array(
            "ACTIVE" => ($ACTIVE == '') ? 'N' : 'Y',
            "SITE" => json_encode($SITE),
            "LINK" => htmlspecialchars($LINK),
            "LINK_PICTURE" => htmlspecialchars($LINK_PICTURE),
            "ALT_PICTURE" => htmlspecialchars($ALT_PICTURE),
            "EXCEPTIONS" => $EXCEPTIONS == "" ? "" : trim(htmlspecialchars($EXCEPTIONS)),
            "DATE" => new \Bitrix\Main\Type\DateTime(date("d.m.Y H:i:s")),
            "TARGET" => htmlspecialchars($TARGET),
        );
        // обновляем запись
        $res = $bookTable->Update(1, $arFields);
        // если обновление прошло успешно
        if ($res->isSuccess()) {
            // перенаправим на новую страницу, в целях защиты от повторной отправки формы нажатием кнопки Обновить в браузере
            if ($save != "") {
                // если была нажата кнопка Сохранить, отправляем обратно на форму
                LocalRedirect("/bitrix/admin/hmarketing.php?mess=ok&lang=" . LANG);
            }
        }
        // если обновление прошло не успешно 
        if (!$res->isSuccess()) {
            // если в процессе сохранения возникли ошибки - получаем текст ошибки
            if ($e = $APPLICATION->GetException())
                $message = new CAdminMessage("Ошибка сохранения: ", $e);
            else {
                $mess = print_r($res->getErrorMessages(), true);
                $message = new CAdminMessage("Ошибка сохранения: " . $mess);
            }
        }
    }
    // подготовка данных для формы, полученные из БД данные будем сохранять в переменные с префиксом str_
    $result = \Hmarketing\d7\DataTable::GetByID(1);
    if ($result->getSelectedRowsCount()) {
        $bookTable = $result->fetch();
        $str_ACTIVE = $bookTable["ACTIVE"];
        $str_SITE = json_decode($bookTable["SITE"]);
        $str_LINK = $bookTable["LINK"];
        $str_LINK_PICTURE = $bookTable["LINK_PICTURE"];
        $str_ALT_PICTURE = $bookTable["ALT_PICTURE"];
        $str_EXCEPTIONS = $bookTable["EXCEPTIONS"];
        $str_TARGET = $bookTable["TARGET"];
    }
    require_once $_SERVER['DOCUMENT_ROOT'] . '/bitrix/modules/main/include/prolog_admin_after.php';
    // eсли есть сообщения об успешном сохранении, выведем их
    if ($_REQUEST["mess"] == "ok") {
        CAdminMessage::ShowMessage(array("MESSAGE" => "Сохранено успешно", "TYPE" => "OK"));
    }
    // eсли есть сообщения об не успешном сохранении, выведем их
    if ($message) {
        echo $message->Show();
    }
    // eсли есть сообщения об не успешном сохранении от ORM, выведем их
    if ($bookTable->LAST_ERROR != "") {
        CAdminMessage::ShowMessage($bookTable->LAST_ERROR);
    }
    ?>
    <form method="POST" action="<?= $APPLICATION->GetCurPage() ?>" ENCTYPE="multipart/form-data" name="post_form">
    <?
    // проверка идентификатора сессии
    echo bitrix_sessid_post();
    // отобразим заголовки закладок
    $tabControl->Begin();
    $tabControl->BeginNextTab();
    ?>
    <tr>
        <td width="40%"><?= "Активность" ?></td>
        <td width="60%"><input type="checkbox" name="ACTIVE" value="Y" <? if ($str_ACTIVE == "Y") echo " checked" ?>></td>
    </tr>
    <tr>
        <td>
            <label for="SITE"><?= "Сайты" ?></label>
        </td>
        <td>
            <select name="SITE[]" multiple>
                <option value="s1" <?= in_array('s1', $str_SITE) ? 'selected' : '' ?>>Для России</option>
                <option value="kz" <?= in_array('kz', $str_SITE) ? 'selected' : '' ?>>Для Казахстана</option>
            </select>
        </td>
    </tr>
    <tr>
        <td width="40%"><?= "Ссылка для перехода" ?></td>
        <td width="60%"><input type="text" name="LINK" value="<?= $str_LINK ?>" /></td>
    </tr>
    <tr>
        <td width="40%"><?= "Ссылка на картинку" ?></td>
        <td width="60%"><input type="text" name="LINK_PICTURE" value="<?= $str_LINK_PICTURE ?>" /></td>
    </tr>
    <tr>
        <td width="40%"><?= "Alt картинки" ?></td>
        <td width="60%"><input type="text" name="ALT_PICTURE" value="<?= $str_ALT_PICTURE ?>" /></td>
    </tr>
    <tr>
        <td width="40%"><?= "Исключения" ?></td>
        <td width="60%"><textarea cols="50" rows="15" name="EXCEPTIONS"><?= $str_EXCEPTIONS ?></textarea></td>
    </tr>
    <tr>
        <td width="40%"><?= "Значение TARGET (self/blank)" ?></td>
        <td width="60%"><input type="text" name="TARGET" value="<?= $str_TARGET ?>" /></td>
    </tr>
    <?
    // выводит стандартные кнопки отправки формы
    $tabControl->Buttons();
    ?>
    <input class="adm-btn-save" type="submit" name="save" value="Сохранить настройки" />
    <?
    // завершаем интерфейс закладки
    $tabControl->End();
    require_once $_SERVER['DOCUMENT_ROOT'] . '/bitrix/modules/main/include/epilog_admin.php';
    ?>

    Файл /install/admin/hmarketing.php

    Файл будет скопирован в дирикторию bitrix и будет инклудить админку для пользователей Битрикс.

    //файл local/modules/hmarketing.d7/install/admin/hmarketing.php
    <?
    // определяем в какой папке находится модуль, если в bitrix, инклудим файл с меню из папки bitrix
    if (is_dir($_SERVER["DOCUMENT_ROOT"] . "/bitrix/modules/hmarketing.d7/")) {
        // присоединяем и копируем файл
        require_once($_SERVER["DOCUMENT_ROOT"] . "/bitrix/modules/hmarketing.d7/admin/hmarketing.php");
    }
    // определяем в какой папке находится модуль, если в local, инклудим файл с меню из папки local
    if (is_dir($_SERVER["DOCUMENT_ROOT"] . "/local/modules/hmarketing.d7/")) {
        // присоединяем и копируем файл
        require_once($_SERVER["DOCUMENT_ROOT"] . "/local/modules/hmarketing.d7/admin/hmarketing.php");
    }

    Файл /install/files/hmarketing.php

    Файл будет скопирован в дирикторию / для проверки обработчика событий.

    5.png


    //файл local/modules/hmarketing.d7/install/files/hmarketing.php
    <?
    require($_SERVER["DOCUMENT_ROOT"] . "/bitrix/modules/main/include/prolog_before.php");
    // собираем зарегистрированные через RegisterModuleDependences и AddEventHandler обработчики события OnSomeEvent
    $rsHandlers = GetModuleEvents("hmarketing.d7", "OnSomeEvent");
    // перебираем зарегистрированные в системы события
    while ($arHandler = $rsHandlers->Fetch()) {
        // выполняем каждое зарегистрированное событие по одному
        ExecuteModuleEventEx($arHandler, array(/* параметры которые нужно передать в модуль */));

    Файл /install/index.php

    Файл вызывается ядром Битрикс автоматически при установке модуля.

    Инсталлятор должен находиться в директории /install/index.php. Имя класса должно соответствовать названию папке модуля и являться наследником от CModule. Только вместо точки, если мы делаем партнерский модуль стоит прописать нижние подчеркивание, это нужно для определения модуля в системе. Файл выполняется при установке или удалении модуля через административный интерфейс.

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

    public $MODULE_NAME;
    public $MODULE_DESCRIPTION;
    public $MODULE_VERSION;
    public $MODULE_VERSION_DATE;
    public $MODULE_ID;
    public $MODULE_SORT;
    public $SHOW_SUPER_ADMIN_GROUP_RIGHTS;
    public $MODULE_GROUP_RIGHTS;
    public $PARTNER_NAME;
    public $PARTNER_URI;
    Тут все довольно тривиально, за исключением версии модуля. Номер версии модуля должен храниться в файле /install/version.php в виде массива. Плюс к этому нужно в классе модуля записывать эти значения.

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

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

    Кроме этого, заложены заранее предустановленный наборы методов, которые должны проинсталлировать файлы модуля, события и данные для БД — InstallFilesInstallEventsInstallDB в автоматическом режиме.

    local/modules/hmarketing.d7/install/index.php


    //файл local/modules/hmarketing.d7/install/index.php
    <?
    // пространство имен для подключений ланговых файлов
    use Bitrix\Main\Localization\Loc;
    // пространство имен для управления (регистрации/удалении) модуля в системе/базе
    use Bitrix\Main\ModuleManager;
    // пространство имен для работы с параметрами модулей хранимых в базе данных
    use Bitrix\Main\Config\Option;
    // пространство имен с абстрактным классом для любых приложений, любой конкретный класс приложения является наследником этого абстрактного класса
    use Bitrix\Main\Application;
    // пространство имен для работы c ORM
    use \Bitrix\Main\Entity\Base;
    // пространство имен для автозагрузки модулей
    use \Bitrix\Main\Loader;
    // пространство имен для событий
    use \Bitrix\Main\EventManager;
    // подключение ланговых файлов
    Loc::loadMessages(__FILE__);
    class Hmarketing_D7 extends CModule
    {
        // переменные модуля
        public  $MODULE_ID;
        public  $MODULE_VERSION;
        public  $MODULE_VERSION_DATE;
        public  $MODULE_NAME;
        public  $MODULE_DESCRIPTION;
        public  $PARTNER_NAME;
        public  $PARTNER_URI;
        public  $SHOW_SUPER_ADMIN_GROUP_RIGHTS;
        public  $MODULE_GROUP_RIGHTS;
        public  $errors;
        // конструктор класса, вызывается автоматически при обращение к классу
        function __construct()
        {
            // создаем пустой массив для файла version.php
            $arModuleVersion = array();
            // подключаем файл version.php
            include_once(__DIR__ . '/version.php');
            // версия модуля
            $this->MODULE_VERSION = $arModuleVersion['VERSION'];
            // дата релиза версии модуля
            $this->MODULE_VERSION_DATE = $arModuleVersion['VERSION_DATE'];
            // id модуля
            $this->MODULE_ID = "hmarketing.d7";
            // название модуля
            $this->MODULE_NAME = "Пример модуля D7";
            // описание модуля
            $this->MODULE_DESCRIPTION = "Тестовый модуль для разработчиков, можно использовать как основу для разработки новых модулей для Битрикс";
            // имя партнера выпустившего модуль
            $this->PARTNER_NAME = "Эйч Маркетинг";
            // ссылка на рисурс партнера выпустившего модуль
            $this->PARTNER_URI = "https://hmarketing.ru";
            // если указано, то на странице прав доступа будут показаны администраторы и группы
            $this->SHOW_SUPER_ADMIN_GROUP_RIGHTS = 'Y';
            // если указано, то на странице редактирования групп будет отображаться этот модуль
            $this->MODULE_GROUP_RIGHTS = 'Y';
        }
        // метод отрабатывает при установке модуля
        function DoInstall()
        {
            //*************************************//
            // Пример с установкой в один шаг      //
            //*************************************//
            // // глобальная переменная с обстрактным классом
            // global $APPLICATION;
            // // регистрируем модуль в системе
            // ModuleManager::RegisterModule("hmarketing.d7");
            // // создаем таблицы баз данных, необходимые для работы модуля
            // $this->InstallDB();
            // // создаем первую и единственную запись в БД
            // $this->addData();
            // // регистрируем обработчики событий
            // $this->InstallEvents();
            // // копируем файлы, необходимые для работы модуля
            // $this->InstallFiles();
            // // устанавливаем агента
            // $this->installAgents();
            // // подключаем скрипт с административным прологом и эпилогом
            // $APPLICATION->includeAdminFile(
            //     Loc::getMessage('INSTALL_TITLE'),
            //     __DIR__ . '/instalInfo.php'
            // );
            //*************************************//
            // Пример с установкой в два шага      //
            //*************************************//
            // получаем контекст и из него запросы
            $context = Application::getInstance()->getContext();
            $request = $context->getRequest();
            // глобальная переменная с обстрактным классом
            global $APPLICATION;
            // проверяем какой сейчас шаг, если он не существует или меньше 2, то выводим первый шаг установки
            if ($request["step"] < 2) {
                // подключаем скрипт с административным прологом и эпилогом
                $APPLICATION->IncludeAdminFile(
                    Loc::getMessage('INSTALL_TITLE_STEP_1'),
                    __DIR__ . '/instalInfo-step1.php'
                );
            }
            // проверяем какой сейчас шаг, усли 2, производим установку
            if ($request["step"] == 2) {
                // регистрируем модуль в системе
                ModuleManager::RegisterModule("hmarketing.d7");
                // создаем таблицы баз данных, необходимые для работы модуля
                $this->InstallDB();
                // регистрируем обработчики событий
                $this->InstallEvents();
                // копируем файлы, необходимые для работы модуля
                $this->InstallFiles();
                // устанавливаем агента
                $this->installAgents();
                // проверяим ответ формы введеный пользователем на первом шаге
                if ($request["add_data"] == "Y") {
                    // создаем первую и единственную запись в БД
                    $this->addData();
                }
                // подключаем скрипт с административным прологом и эпилогом
                $APPLICATION->IncludeAdminFile(
                    Loc::getMessage('INSTALL_TITLE_STEP_2'),
                    __DIR__ . '/instalInfo-step2.php'
                );
            }
            // для успешного завершения, метод должен вернуть true
            return true;
        }
        // метод отрабатывает при удалении модуля
        function DoUninstall()
        {
            //*************************************//
            // Пример с удалением в один шаг       //
            //*************************************//
            // // глобальная переменная с обстрактным классом
            // global $APPLICATION;
            // // удаляем таблицы баз данных, необходимые для работы модуля
            // $this->UnInstallDB();
            // // удаляем обработчики событий
            // $this->UnInstallEvents();
            // // удаляем файлы, необходимые для работы модуля
            // $this->UnInstallFiles();
            // // удаляем агента
            // $this->unInstallAgents();
            // // удаляем регистрацию модуля в системе
            // ModuleManager::UnRegisterModule("hmarketing.d7");
            // // подключаем скрипт с административным прологом и эпилогом
            // $APPLICATION->includeAdminFile(
            //     Loc::getMessage('DEINSTALL_TITLE'),
            //     __DIR__ . '/deInstalInfo.php'
            // );
            //*************************************//
            // Пример с удалением в два шага       //
            //*************************************//
            // получаем контекст и из него запросы
            $context = Application::getInstance()->getContext();
            $request = $context->getRequest();
            // глобальная переменная с обстрактным классом
            global $APPLICATION;
            // проверяем какой сейчас шаг, если он не существует или меньше 2, то выводим первый шаг удаления
            if ($request["step"] < 2) {
                // подключаем скрипт с административным прологом и эпилогом
                $APPLICATION->IncludeAdminFile(
                    Loc::getMessage('DEINSTALL_TITLE_1'),
                    __DIR__ . '/deInstalInfo-step1.php'
                );
            }
            // проверяем какой сейчас шаг, усли 2, производим удаление
            if ($request["step"] == 2) {
                // удаляем таблицы баз данных, необходимые для работы модуля
                //$this->UnInstallDB();
                // проверяим ответ формы введеный пользователем на первом шаге
                if ($request["save_data"] == "Y") {
                    // удаляем таблицы баз данных, необходимые для работы модуля
                    $this->UnInstallDB();
                }
                // удаляем обработчики событий
                $this->UnInstallEvents();
                // удаляем файлы, необходимые для работы модуля
                $this->UnInstallFiles();
                // удаляем агента
                $this->unInstallAgents();
                // удаляем регистрацию модуля в системе
                ModuleManager::UnRegisterModule("hmarketing.d7");
                // подключаем скрипт с административным прологом и эпилогом
                $APPLICATION->IncludeAdminFile(
                    Loc::getMessage('DEINSTALL_TITLE_2'),
                    __DIR__ . '/deInstalInfo-step2.php'
                );
            }
            // для успешного завершения, метод должен вернуть true
            return true;
        }
        // метод для создания таблицы баз данных
        function InstallDB()
        {
            // подключаем модуль для того что бы был видем класс ORM
            Loader::includeModule($this->MODULE_ID);
            // через класс Application получаем соединение по переданному параметру, параметр берем из ORM-сущности (он указывается, если необходим другой тип подключения, отличный от default), если тип подключения по умолчанию, то параметр можно не передавать. Далее по подключению вызываем метод isTableExists, в который передаем название таблицы полученное с помощью метода getDBTableName() класса Base
            if (!Application::getConnection(\Hmarketing\d7\DataTable::getConnectionName())->isTableExists(Base::getInstance("\Hmarketing\d7\DataTable")->getDBTableName())) {
                // eсли таблицы не существует, то создаем её по ORM сущности
                Base::getInstance("\Hmarketing\d7\DataTable")->createDbTable();
            }
            if (!Application::getConnection(\Hmarketing\d7\DataTable::getConnectionName())->isTableExists(Base::getInstance("\Hmarketing\d7\AuthorTable")->getDBTableName())) {
                // eсли таблицы не существует, то создаем её по ORM сущности
                Base::getInstance("\Hmarketing\d7\AuthorTable")->createDbTable();
            }
        }
        // метод для удаления таблицы баз данных
        function UnInstallDB()
        {
            // подключаем модуль для того что бы был видем класс ORM
            Loader::includeModule($this->MODULE_ID);
            // делаем запрос к бд на удаление таблицы, если она существует, по подключению к бд класса Application с параметром подключения ORM сущности
            Application::getConnection(\Hmarketing\d7\DataTable::getConnectionName())->queryExecute('DROP TABLE IF EXISTS ' . Base::getInstance("\Hmarketing\d7\DataTable")->getDBTableName());
            Application::getConnection(\Hmarketing\d7\DataTable::getConnectionName())->queryExecute('DROP TABLE IF EXISTS ' . Base::getInstance("\Hmarketing\d7\AuthorTable")->getDBTableName());
            // удаляем параметры модуля из базы данных битрикс
            Option::delete($this->MODULE_ID);
        }
        // метод для создания обработчика событий
        function InstallEvents()
        {
            // для произвольной работы
            EventManager::getInstance()->registerEventHandler(
                // идентификатор модуля-источника события
                $this->MODULE_ID,
                // событие на которое мы подписываемся, OnSomeEvent для произвольной работы
                "OnSomeEvent",
                // идентификатор модуля, который подписывается
                $this->MODULE_ID,
                // класс выполняющий обработку (для callback-обработчика, если файловый - пустая строка)
                "\Hmarketing\d7\Main",
                // метод класса выполняющий обработку (для callback-обработчика, если файловый - пустая строка)
                'get'
            );
            // для работы с ORM, есть три типа событий: onBefore<Action> - перед вызовом запроса (можно изменить входные параметры), после следуют валидаторы. on<Action> - уже нельзя изменить входные параметры, после выполняется SQL-запрос. onAfter<Action> - после выполнения операции, операция уже совершена
            // три события <Action> итого 9 событий: Add, Update, Delete
            EventManager::getInstance()->registerEventHandler(
                // идентификатор модуля, для которого регистрируется событие
                $this->MODULE_ID,
                // тип события, класс называется DataTable, но должно передаваться по имени файла, то есть просто Data
                "\Hmarketing\d7\Data::OnBeforeUpdate",
                // идентификатор модуля к которому относится регистрируемый обработчик, из какого модуля берется класс, нужно если необходимо связать 2 модуля, если используем один, то дублируем поле с первым
                $this->MODULE_ID,
                // класс обработчика
                "\Hmarketing\d7\Events",
                // метод обработчика
                'eventHandler'
            );
            // для успешного завершения, метод должен вернуть true
            return true;
        }
        // метод для удаления обработчика событий
        function UnInstallEvents()
        {
            // удаление событий, аналогично установке
            EventManager::getInstance()->unRegisterEventHandler(
                $this->MODULE_ID,
                "OnSomeEvent",
                $this->MODULE_ID,
                "\Hmarketing\d7\Main",
                'get'
            );
            // удаление событий, аналогично установке
            EventManager::getInstance()->unRegisterEventHandler(
                $this->MODULE_ID,
                "\Hmarketing\d7\Data::OnBeforeUpdate",
                $this->MODULE_ID,
                "\Hmarketing\d7\Events",
                'eventHandler'
            );
            // для успешного завершения, метод должен вернуть true
            return true;
        }
        // метод для копирования файлов модуля при установке
        function InstallFiles()
        {
            // скопируем файлы на страницы админки из папки в битрикс, копирует одноименные файлы из одной директории в другую директорию
            CopyDirFiles(
                __DIR__ . "/admin",
                $_SERVER["DOCUMENT_ROOT"] . "/bitrix/admin",
                true, // перезаписывает файлы
                true  // копирует рекурсивно
            );
            // скопируем компоненты из папки в битрикс, копирует одноименные файлы из одной директории в другую директорию
            CopyDirFiles(
                __DIR__ . "/components",
                $_SERVER["DOCUMENT_ROOT"] . "/bitrix/components",
                true, // перезаписывает файлы
                true  // копирует рекурсивно
            );
            // копируем файлы страниц, копирует одноименные файлы из одной директории в другую директорию
            CopyDirFiles(
                __DIR__ . '/files',
                $_SERVER["DOCUMENT_ROOT"] . '/',
                true, // перезаписывает файлы
                true  // копирует рекурсивно
            );
            // для успешного завершения, метод должен вернуть true
            return true;
        }
        // метод для удаления файлов модуля при удалении
        function UnInstallFiles()
        {
            // удалим файлы из папки в битрикс на страницы админки, удаляет одноименные файлы из одной директории, которые были найдены в другой директории, функция не работает рекурсивно
            DeleteDirFiles(
                __DIR__ . "/admin",
                $_SERVER["DOCUMENT_ROOT"] . "/bitrix/admin"
            );
            // удалим компонент из папки в битрикс 
            if (is_dir($_SERVER["DOCUMENT_ROOT"] . "/bitrix/components/" . $this->MODULE_ID)) {
                // удаляет папка из указанной директории, функция работает рекурсивно
                DeleteDirFilesEx(
                    "/bitrix/components/" . $this->MODULE_ID
                );
            }
            // удалим файлы страниц, удаляет одноименные файлы из одной директории, которые были найдены в другой директории, функция не работает рекурсивно
            DeleteDirFiles(
                __DIR__ . "/files",
                $_SERVER["DOCUMENT_ROOT"] . "/"
            );
            // для успешного завершения, метод должен вернуть true
            return true;
        }
        // заполнение таблиц тестовыми данными
        function addData()
        {
            // подключаем модуль для видимости ORM класса
            Loader::includeModule($this->MODULE_ID);
            // добавляем запись в таблицу БД
            \Hmarketing\d7\DataTable::add(
                array(
                    "ACTIVE" => "N",
                    "SITE" => '["s1"]',
                    "LINK" => " ",
                    "LINK_PICTURE" => "/bitrix/components/hmarketing.d7/popup.baner/templates/.default/img/banner.jpg",
                    "ALT_PICTURE" => " ",
                    "EXCEPTIONS" => " ",
                    "DATE" => new \Bitrix\Main\Type\DateTime(date("d.m.Y H:i:s")),
                    "TARGET" =>  "self",
                    "AUTHOR_ID" =>  "1",
                )
            );
            // добавляем запись в таблицу БД
            \Hmarketing\d7\AuthorTable::add(
                array(
                    "NAME" => "Иван",
                    "LAST_NAME" => "Иванов",
                )
            );
            // для успешного завершения, метод должен вернуть true
            return true;
        }
        // установка агентов
        function installAgents()
        {
            \CAgent::AddAgent(
                // строка PHP для запуска агента-функции
                "\Hmarketing\d7\Agent::superAgent();",
                // идентификатор модуля, необходим для подключения файлов модуля (необязательный) 
                $this->MODULE_ID,
                // период, нужен для агентов, которые должны выполняться точно в срок. Если агент пропустил запуск, то он сделает его столько раз, сколько он пропустил. Если значение N, то агент после первого запуска будет запускаться с заданным интервалам (необязательный, по умолчанию N)                   
                "N",
                // интервал в секундах (необязательный, по умолчанию 86400 (сутки))                                
                120,
                // дата первой проверки (необязательный, по умолчанию текущее время)
                "",
                // активность агента (необязательный, по умолчанию Y) 
                "Y",
                // дата первого запуска (необязательный, по умолчанию текущее время)
                "",
                // сортировка (влияет на порядок выполнения агентов (очередность), для тех, которые запускаются в одно время) (необязательный, по умолчанию 100)  
                100
            );
        }
        // удаление агентов
        function unInstallAgents()
        {
            \CAgent::RemoveModuleAgents($this->MODULE_ID);
        }
    }

    Файл /install/instalInfo-step1.php

    Файл вызывается при установки модуля из /install/index.php
    Установка модуля в несколько шагов (1-й шаг).

    // файл local/modules/hmarketing.d7/install/instalInfo-step1.php
    <?
    // пространство имен для подключений ланговых файлов
    use Bitrix\Main\Localization\Loc;
    // подключение ланговых файлов
    Loc::loadMessages(__FILE__);
    // проверка идентификатора сессии
    if (!check_bitrix_sessid()) {
        return;
    }
    ?>
    <!-- выводим кнопку для перехода на страницу модулей, мы и так находимся на этой странице но с выведенным файлом, значит просто получаем текущую директорию для перенаправления -->
    <form action="<?= $APPLICATION->GetCurPage() ?>">
        <!-- обязательное получение сессии -->
        <?= bitrix_sessid_post() ?>
        <!-- в форме обязательно должно быть поле lang, с айди языка, чтобы язык не сбросился -->
        <input type="hidden" name="lang" value="<?= LANGUAGE_ID ?>">
        <!-- айди модуля для установки -->
        <input type="hidden" name="id" value="hmarketing.d7">
        <!-- обязательно указывать поле install со значением Y, иначе просто перейдем на страницу модулей -->
        <input type="hidden" name="install" value="Y">
        <!-- определение шага установки модуля -->
        <input type="hidden" name="step" value="2">
        <!-- чекбокс для определния параметра -->
        <p><?= Loc::getMessage("MOD_ADD_DATA") ?></p>
        <p><input type="checkbox" name="add_data" id="add_data" value="Y" checked><label for="add_data"><?= Loc::getMessage("MOD_ADD_DATA_BUTTON") ?></label></p>
        <!-- MOD_INSTALL - системная языковая переменная для кнопки установки -->
        <input type="submit" name="" value="<?= Loc::getMessage("MOD_INSTALL") ?>">
    </form>

    Файл /install/instalInfo-step2.php

    Файл вызывается при установки модуля из /install/index.php
    Установка модуля в несколько шагов (2-й шаг).

    //файл local/modules/hmarketing.d7/install/instalInfo-step2.php
    <?
    // пространство имен для подключений ланговых файлов
    use Bitrix\Main\Localization\Loc;
    // подключение ланговых файлов
    Loc::loadMessages(__FILE__);
    // проверка идентификатора сессии
    if (!check_bitrix_sessid()) {
        return;
    }
    // проверяем была ли выброшена ошибка при установке, если да, то записываем её в переменную $errorException
    if ($errorException = $APPLICATION->getException()) {
        // вывод сообщения об ошибке при установке модуля
        CAdminMessage::showMessage(
            Loc::getMessage('INSTALL_FAILED') . ': ' . $errorException->GetString()
        );
    } else {
        // вывод уведомления при успешной установке модуля
        CAdminMessage::showNote(
            Loc::getMessage('INSTALL_SUCCESS')
        );
    }
    ?>
    <!-- выводим кнопку для перехода на страницу модулей, мы и так находимся на этой странице но с выведенным файлом, значит просто получаем текущую директорию для перенаправления -->
    <form action="<?= $APPLICATION->GetCurPage() ?>">
        <!-- в форме обязательно должно быть поле lang, с айди языка, чтобы язык не сбросился -->
        <input type="hidden" name="lang" value="<?= LANGUAGE_ID ?>">
        <!-- MOD_BACK - системная языковая переменная для возврата -->
        <input type="submit" name="" value="<?= Loc::getMessage("MOD_BACK") ?>">
    </form>

    Файл /install/instalInfo.php

    Файл вызывается при установки модуля из /install/index.php
    Установка модуля в один шаг.

    //файл local/modules/hmarketing.d7/install/instalInfo.php
    <?
    // пространство имен для подключений ланговых файлов
    use Bitrix\Main\Localization\Loc;
    // подключение ланговых файлов
    Loc::loadMessages(__FILE__);
    // проверка идентификатора сессии
    if (!check_bitrix_sessid()) {
        return;
    }
    // проверяем была ли выброшена ошибка при установке, если да, то записываем её в переменную $errorException
    if ($errorException = $APPLICATION->getException()) {
        // вывод сообщения об ошибке при установке модуля
        CAdminMessage::showMessage(
            Loc::getMessage('INSTALL_FAILED') . ': ' . $errorException->GetString()
        );
    } else {
        // вывод уведомления при успешной установке модуля
        CAdminMessage::showNote(
            Loc::getMessage('INSTALL_SUCCESS')
        );
    }
    ?>
    <!-- выводим кнопку для перехода на страницу модулей, мы и так находимся на этой странице но с выведенным файлом, значит просто получаем текущую директорию для перенаправления -->
    <form action="<?= $APPLICATION->GetCurPage() ?>">
        <!-- в форме обязательно должно быть поле lang, с айди языка, чтобы язык не сбросился -->
        <input type="hidden" name="lang" value="<?= LANGUAGE_ID ?>">
        <!-- MOD_BACK - системная языковая переменная для возврата -->
        <input type="submit" name="" value="<?= Loc::getMessage("MOD_BACK") ?>">
    </form>

    Файл /install/deInstalInfo-step1.php

    Файл вызывается при установки модуля из /install/index.php
    Удаление модуля в несколько шагов (1-й шаг).

    //файл local/modules/hmarketing.d7/install/deInstalInfo-step1.php
    <?
    // пространство имен для подключений ланговых файлов
    use \Bitrix\Main\Localization\Loc;
    // проверка идентификатора сессии
    if (!check_bitrix_sessid()) {
        return;
    }
    ?>
    <form action="<?= $APPLICATION->GetCurPage() ?>">
        <!-- обязательное получение сессии -->
        <?= bitrix_sessid_post() ?>
        <!-- в форме обязательно должно быть поле lang, с айди языка, чтобы язык не сбросился -->
        <input type="hidden" name="lang" value="<?= LANGUAGE_ID ?>">
        <!-- айди модуля для удаления -->
        <input type="hidden" name="id" value="hmarketing.d7">
        <!-- обязательно указывать поле uninstall со значением Y, иначе просто перейдем на страницу модулей -->
        <input type="hidden" name="uninstall" value="Y">
        <!-- определение шага удаления модуля -->
        <input type="hidden" name="step" value="2">
        <!-- предупреждение об удалении модуля, MOD_UNINST_WARN - системная языковая переменная -->
        <?= CAdminMessage::ShowMessage(Loc::getMessage("MOD_UNINST_WARN")) ?>
        <!-- чекбокс для определния параметра удаления, MOD_UNINST_SAVE - системная языковая переменная -->
        <p><?= Loc::getMessage("MOD_UNINST_SAVE") ?></p>
        <!-- MOD_UNINST_DATA - системная языковая переменная -->
        <p><input type="checkbox" name="save_data" id="save_data" value="Y" checked><label for="save_data"><?= Loc::getMessage("MOD_UNINST_DATA") ?></label></p>
        <!-- MOD_UNINST_DATA_BUTTON - системная языковая переменная -->
        <input type="submit" name="" value="<?= Loc::getMessage("MOD_UNINST_DATA_BUTTON") ?>">
    </form>

    Файл /install/deInstalInfo-step2.php

    Файл вызывается при установки модуля из /install/index.php
    Удаление модуля в несколько шагов (2-й шаг).

    //файл local/modules/hmarketing.d7/install/deInstalInfo-step1.php
    <?
    // пространство имен для подключений ланговых файлов
    use \Bitrix\Main\Localization\Loc;
    // подключение ланговых файлов
    Loc::loadMessages(__FILE__);
    // проверка идентификатора сессии
    if (!check_bitrix_sessid()) {
        return;
    }
    // метод возвращает объект класса CApplicationException, содержащий последнее исключение
    if ($errorException = $APPLICATION->getException()) {
        // вывод сообщения об ошибке при удалении модуля
        CAdminMessage::showMessage(
            Loc::getMessage('DEINSTALL_FAILED') . ': ' . $errorException->GetString()
        );
    } else {
        // вывод уведомления при успешном удалении модуля
        CAdminMessage::showNote(
            Loc::getMessage('DEINSTALL_SUCCESS')
        );
    }
    ?>
    <!-- выводим кнопку для перехода на страницу модулей, мы и так находимся на этой странице но с выведенным файлом, значит просто получаем текущую директорию для перенаправления -->
    <form action="<?= $APPLICATION->GetCurPage() ?>">
        <!-- в форме обязательно должно быть поле lang, с айди языка, чтобы язык не сбросился -->
        <input type="hidden" name="lang" value="<?= LANGUAGE_ID ?>">
        <!-- MOD_BACK - системная языковая переменная для возврата -->
        <input type="submit" name="" value="<?= Loc::getMessage("MOD_BACK") ?>">
    </form>

    Файл /install/deInstalInfo.php

    Файл вызывается при установки модуля из /install/index.php
    Удаление модуля в один шаг.


    //файл local/modules/hmarketing.d7/install/deInstalInfo.php
    <?
    // пространство имен для подключений ланговых файлов
    use \Bitrix\Main\Localization\Loc;
    // подключение ланговых файлов
    Loc::loadMessages(__FILE__);
    // проверка идентификатора сессии
    if (!check_bitrix_sessid()) {
        return;
    }
    // метод возвращает объект класса CApplicationException, содержащий последнее исключение
    if ($errorException = $APPLICATION->getException()) {
        // вывод сообщения об ошибке при удалении модуля
        CAdminMessage::showMessage(
            Loc::getMessage('DEINSTALL_FAILED') . ': ' . $errorException->GetString()
        );
    } else {
        // вывод уведомления при успешном удалении модуля
        CAdminMessage::showNote(
            Loc::getMessage('DEINSTALL_SUCCESS')
        );
    }
    ?>
    <!-- выводим кнопку для перехода на страницу модулей, мы и так находимся на этой странице но с выведенным файлом, значит просто получаем текущую директорию для перенаправления -->
    <form action="<?= $APPLICATION->GetCurPage() ?>">
        <!-- в форме обязательно должно быть поле lang, с айди языка, чтобы язык не сбросился -->
        <input type="hidden" name="lang" value="<?= LANGUAGE_ID ?>">
        <!-- MOD_BACK - системная языковая переменная для возврата -->
        <input type="submit" name="" value="<?= Loc::getMessage("MOD_BACK") ?>">
    </form>

    Файл /install/version.php

    Файл вызывается при установки модуля из /install/index.php. Номер версии модуля должен храниться в файле /install/version.php в виде массива. Плюс к этому нужно в классе модуля записывать эти значения. В связи с этим нужно налепить небольшую городишку, которая будет брать значение из этого файла и записывать его в модуль


    //файл /lang/ru/install/deInstalInfo-step1.php
    <?
    $MESS["MOD_UNINST_DATA"] = "Удалить данные таблицы?";
    $MESS["MOD_UNINST_DATA_BUTTON"] = "Выполнить";
    //файл /lang/ru/install/deInstalInfo-step2.php
    <?
    $MESS['DEINSTALL_FAILED'] = 'Ошибка при удалении модуля';
    $MESS['DEINSTALL_SUCCESS'] = 'Модуль успешно удален';
    //файл /lang/ru/install/deInstalInfo.php
    <?
    $MESS['DEINSTALL_FAILED'] = 'Ошибка при удалении модуля';
    $MESS['DEINSTALL_SUCCESS'] = 'Модуль успешно удален';
    //файл /lang/ru/install/index.php
    <?
    $MESS['INSTALL_TITLE'] = 'Установка модуля';
    $MESS['INSTALL_TITLE_STEP_1'] = 'Установка модуля шаг 1';
    $MESS['INSTALL_TITLE_STEP_2'] = 'Установка модуля шаг 2';
    $MESS['DEINSTALL_TITLE'] = 'Удаление модуля';
    $MESS['DEINSTALL_TITLE_STEP_1'] = 'Удаление модуля шаг 1';
    $MESS['DEINSTALL_TITLE_STEP_2'] = 'Удаление модуля шаг 2';
    //файл /lang/ru/install/instalInfo-step1.php
    <?
    $MESS["MOD_ADD_DATA"] = "Записать тестовые данные?";
    $MESS["MOD_ADD_DATA_BUTTON"] = "Выполнить";
    //файл /lang/ru/install/instalInfo-step2.php
    <?
    $MESS['INSTALL_SUCCESS'] = 'Модуль успешно установлен';
    $MESS['INSTALL_FAILED'] = 'Ошибка при установке модуля';
    //файл /lang/ru/install/instalInfo.php
    <?
    $MESS['INSTALL_SUCCESS'] = 'Модуль успешно установлен';
    $MESS['INSTALL_FAILED'] = 'Ошибка при установке модуля';
    $MESS['RETURN_MODULES'] = 'Вернуться в список модулей';
    //файл /lang/ru/install/instalInfo.php
    <?
    $MESS['INSTALL_SUCCESS'] = 'Модуль успешно установлен';
    $MESS['INSTALL_FAILED'] = 'Ошибка при установке модуля';
    $MESS['RETURN_MODULES'] = 'Вернуться в список модулей';

    Файл /lib/Main.php

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

    //файл local/modules/hmarketing.d7/lib/Main.php
    <?
    // пространство имен модуля
    namespace Hmarketing\d7;
    // пространство имен для подключения класса с ORM
    use \Hmarketing\d7\DataTable;
    // пространство имен для получения данных сущности таблицы по событиям
    use \Bitrix\Main\Entity\Event;
    // основной класс модуля
    class Main
    {
        // метод для получения строки из таблицы базы данных
        public static function get()
        {
            // запрос к базе
            $result = DataTable::getList(
                array(
                    'select' => array('*')
                )
            );
            // преобразование запроса от базы
            $row = $result->fetch();
            // распечатываем массив с ответом на экран
            print "<pre>";
            print_r($row);
            print "</pre>";
            // возвращаем ответ от баззы
            return $row;
        }
    }
    Комментрии
    Комементариев нет, будьте первыми....
    Оставить комментарий
    Пожалуйста, введите ваше Имя.
    Пожалуйста, введите ваш Email.
    Пожалуйста, напишите комментарий.