Битрикс. Создание своего модуля. Часть 2 из 3

26.10.2018

Теги: CMSWeb-разработкаБитриксИнфоблокКомпонентМодуль

Давайте создадим еще один модуль, который будет устанавливать в систему несколько компонентов — три простых и один комплексный. Больше никаких задач модуль решать не будет, поэтому его код будут очень простым. Сами компоненты предназначены для работы с инфоблоками:

  • простой компонент infoblock:iblock.element умеет показывать элемент инфоблока;
  • простой компонент infoblock:iblock.section умеет показывать раздел инфоблока;
  • простой компонент infoblock:iblock.popular умееет показывать коневые разделы инфоблока + популярные элементы;
  • комплексный компонент infoblock:iblock объединяет эти простые компоненты.

Файловая структура модуля будет такой:

[infoblock]
    [install]
        [assets]
            [components]
                [iblock]
                [iblock.element]
                [iblock.popular]
                [iblock.section]
        index.php
        step.php
        unstep.php
        version.php
    [lang]
        [ru]
            [install]
                index.php

При установке модуля происходит копирование содержимого директории

local/modules/infoblock/install/assets/componenets

в директорию

local/components/infoblock
<?php
/*
 * Файл local/modules/infoblock/install/version.php
 */

$arModuleVersion = array(
    'VERSION'      => '1.0.0',
    'VERSION_DATE' => '2018-10-26 14:00:00'
);
<?php
/*
 * Файл local/modules/infoblock/install/index.php
 */

use Bitrix\Main\Localization\Loc;
use Bitrix\Main\ModuleManager;
use Bitrix\Main\Config\Option;
use Bitrix\Main\Application;
use Bitrix\Main\IO\Directory;

Loc::loadMessages(__FILE__);

class infoblock extends CModule {

    public function __construct() {
        if (is_file(__DIR__.'/version.php')){
            include_once(__DIR__.'/version.php');
            $this->MODULE_ID           = get_class($this);
            $this->MODULE_VERSION      = $arModuleVersion['VERSION'];
            $this->MODULE_VERSION_DATE = $arModuleVersion['VERSION_DATE'];
            $this->MODULE_NAME         = Loc::getMessage('INFOBLOCK_NAME');
            $this->MODULE_DESCRIPTION  = Loc::getMessage('INFOBLOCK_DESCRIPTION');
        } else {
            CAdminMessage::showMessage(
                Loc::getMessage('INFOBLOCK_FILE_NOT_FOUND').' version.php'
            );
        }
    }
    
    public function doInstall() {

        global $APPLICATION;

        // мы используем функционал нового ядра D7 — поддерживает ли его система?
        if (CheckVersion(ModuleManager::getVersion('main'), '14.00.00')) {
            // копируем файлы, необходимые для работы модуля
            $this->installFiles();
            // регистрируем модуль в системе
            ModuleManager::registerModule($this->MODULE_ID);
        } else {
            CAdminMessage::showMessage(
                Loc::getMessage('INFOBLOCK_INSTALL_ERROR')
            );
            return;
        }

        $APPLICATION->includeAdminFile(
            Loc::getMessage('INFOBLOCK_INSTALL_TITLE').' «'.Loc::getMessage('INFOBLOCK_NAME').'»',
            __DIR__.'/step.php'
        );
    }
    
    public function installFiles() {
        // копируем файлы компонентов, которые устанавливаем вместе с модулем;
        // пространством имен для компонентов будет имя модуля, т.е. infoblock
        CopyDirFiles(
            __DIR__.'/assets/components',
            Application::getDocumentRoot().'/local/components/'.$this->MODULE_ID.'/',
            true,
            true
        );
    }

    public function doUninstall() {

        global $APPLICATION;

        $this->unInstallFiles();
        ModuleManager::unRegisterModule($this->MODULE_ID);
        $APPLICATION->includeAdminFile(
            Loc::getMessage('INFOBLOCK_UNINSTALL_TITLE').' «'.Loc::getMessage('INFOBLOCK_NAME').'»',
            __DIR__.'/unstep.php'
        );
    }

    public function unInstallFiles() {
        // удаляем файлы компонента, который установили вместе с модулем
        Directory::deleteDirectory(
            Application::getDocumentRoot().'/local/components/'.$this->MODULE_ID
        );
        // удаляем настройки нашего модуля
        Option::delete($this->MODULE_ID);
    }

}
<?php
/*
 * Файл local/modules/infoblock/install/step.php
 */
use Bitrix\Main\Localization\Loc;

Loc::loadMessages(__FILE__);

if (!check_bitrix_sessid()) {
    return;
}

if ($errorException = $APPLICATION->getException()) {
    // ошибка при установке модуля
    CAdminMessage::showMessage(
        Loc::getMessage('INFOBLOCK_INSTALL_FAILED').': '.$errorException->GetString()
    );
} else {
    // модуль успешно установлен
    CAdminMessage::showNote(
        Loc::getMessage('INFOBLOCK_INSTALL_SUCCESS')
    );
}
?>

<form action="<?= $APPLICATION->getCurPage(); ?>"> <!-- Кнопка возврата к списку модулей -->
    <input type="hidden" name="lang" value="<?= LANGUAGE_ID; ?>" />
    <input type="submit" value="<?= Loc::getMessage('INFOBLOCK_RETURN_MODULES'); ?>">
</form>
<?php
/*
 * Файл local/modules/infoblock/install/unstep.php
 */

use Bitrix\Main\Localization\Loc;

Loc::loadMessages(__FILE__);

if (!check_bitrix_sessid()){
    return;
}

if ($errorException = $APPLICATION->getException()) {
    // ошибка при удалении модуля
    CAdminMessage::showMessage(
        Loc::getMessage('INFOBLOCK_UNINSTALL_FAILED').': '.$errorException->GetString()
    );
} else {
    // модуль успешно удален
    CAdminMessage::showNote(
        Loc::getMessage('INFOBLOCK_UNINSTALL_SUCCESS')
    );
}
?>

<form action="<?= $APPLICATION->getCurPage(); ?>"> <!-- Кнопка возврата к списку модулей -->
    <input type="hidden" name="lang" value="<?= LANGUAGE_ID; ?>" />
    <input type="submit" value="<?= Loc::getMessage('INFOBLOCK_RETURN_MODULES'); ?>">
</form>
<?php
/*
 * Файл local/modules/infoblock/lang/ru/install/index.php
 */

$MESS['INFOBLOCK_NAME']              = 'Компонент «Инфоблок»';
$MESS['INFOBLOCK_DESCRIPTION']       = 'Устанавливает универсальный компонент для работы с инфоблоками';

$MESS['INFOBLOCK_FILE_NOT_FOUND']    = 'Не найден файл';
$MESS['INFOBLOCK_INSTALL_TITLE']     = 'Установка модуля';
$MESS['INFOBLOCK_INSTALL_ERROR']     = 'Версия главного модуля ниже 14, обновите систему.';
$MESS['INFOBLOCK_INSTALL_SUCCESS']   = 'Модуль успешно установлен';
$MESS['INFOBLOCK_INSTALL_FAILED']    = 'Ошибка при установке модуля';

$MESS['INFOBLOCK_UNINSTALL_TITLE']   = 'Удаление модуля';
$MESS['INFOBLOCK_UNINSTALL_SUCCESS'] = 'Модуль успешно удален';
$MESS['INFOBLOCK_UNINSTALL_FAILED']  = 'Ошибка при удалении модуля';

$MESS['INFOBLOCK_RETURN_MODULES']    = 'Вернуться в список модулей';

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

<?php
require($_SERVER["DOCUMENT_ROOT"]."/bitrix/header.php");
$APPLICATION->SetTitle("Статьи о домашних животных");
?>
<?php
$APPLICATION->IncludeComponent(
    "infoblock:iblock",
    "",
    Array(
        "ADD_SECTIONS_CHAIN" => "Y",
        "CACHE_GROUPS" => "Y",
        "CACHE_TIME" => "3600",
        "CACHE_TYPE" => "A",
        "DISPLAY_BOTTOM_PAGER" => "Y",
        "DISPLAY_TOP_PAGER" => "N",
        "ELEMENT_SET_BROWSER_TITLE" => "Y",
        "ELEMENT_SET_META_DESCRIPTION" => "Y",
        "ELEMENT_SET_META_KEYWORDS" => "Y",
        "ELEMENT_SET_PAGE_TITLE" => "Y",
        "IBLOCK_ID" => "5",
        "IBLOCK_TYPE" => "content",
        "MESSAGE_404" => "",
        "PAGER_BASE_LINK_ENABLE" => "N",
        "PAGER_DESC_NUMBERING" => "N",
        "PAGER_DESC_NUMBERING_CACHE_TIME" => "36000",
        "PAGER_SHOW_ALL" => "N",
        "PAGER_SHOW_ALWAYS" => "N",
        "PAGER_TEMPLATE" => ".default",
        "PAGER_TITLE" => "Элементы",
        "POPULAR_ELEMENT_COUNT" => "4",
        "POPULAR_ROOT_SECTIONS" => "Y",
        "POPULAR_SECTIONS" => array(),
        "POPULAR_SET_BROWSER_TITLE" => "Y",
        "POPULAR_SET_PAGE_TITLE" => "Y",
        "SECTION_ELEMENT_COUNT" => "3",
        "SECTION_SET_BROWSER_TITLE" => "Y",
        "SECTION_SET_META_DESCRIPTION" => "Y",
        "SECTION_SET_META_KEYWORDS" => "Y",
        "SECTION_SET_PAGE_TITLE" => "Y",
        "SEF_MODE" => "N",
        "SET_STATUS_404" => "N",
        "SHOW_404" => "N",
        "USE_CODE_INSTEAD_ID" => "N",
        "VARIABLE_ALIASES" => Array(
            "ELEMENT_CODE"=>"ELEMENT_CODE",
            "ELEMENT_ID"=>"ELEMENT_ID",
            "SECTION_CODE"=>"SECTION_CODE",
            "SECTION_ID"=>"SECTION_ID"
        )
    )
);
?>
<?php
require($_SERVER["DOCUMENT_ROOT"]."/bitrix/footer.php");
?>

Дополнительно

Поиск: CMS • Web-разработка • doInstall • doUninstall • step.php • unstep.php • version.php • Битрикс • Инфоблок • Компонент • Модуль • Установка • registerAutoloadClasses • registerModule • unRegisterModule • CopyDirFiles • deleteDirectory

Каталог оборудования
Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.
Производители
Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.
Функциональные группы
Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.