Создание, установка, удаление
Если у вас есть какой-то готовый функционал или вы придумали способ облегчить рутинные операции, то можно вынести этот код в модуль, это даст вам:
- Ускорение разработки на Битриксе
- Облегчение поддержки сайтов
- Баллы в партнёрской системе Битрикс
- Возможность заработка на Marketplace
Чтобы писать модули под Битрикс нужны определённые знания. В этой статье я покажу Hello World, а в последующих я расскажу о возможных решениях различных задач в рамках модулей, всевозможных тонкостях работы и способах заработка. Шаг за шагом мы напишем свои собственнные комментарии, которые, кстати, используются на этом сайте, затем будет рассказано о работе с Маркетплейсом.
Предпологается, что вы уже более менее знакомы с этой CMS, хотя бы знаете что такое компоненты, главный модуль и пролог.
Начнём с теории.
Теоритическая часть
Файлы, которые обязательны для модуля.
- /install/index.php - здесь хранится описание модуля, точки входа установки и удаления модуля
- /install/version.php - здесь указывается версия модуля
- /include.php - здесь содержится маппинг на классы в папках /classes/ и /lib/
Папка модуля
Распологается в папке /bitrix/modules/. В принципе в качестве названия папки может выступать любое не занятое название модуля, и это удобно для начала разработки. Но при выкладывании решения на Marketplace название будет состоят из код_партнёра.название_модуля, например, aristov.comments, поэтому можно сразу указать название через точку.
Кратко подытожем
Hello world модуля под Битрикс должен находиться в папке /bitrix/modules/ и содержать три вышеуказанных файла.
Практика
Начнём создавать наш модуль.
Шаг 1
Создадим папку aristov.comments в папке /bitrix/modules/. Рабочее пространство создано.
Шаг 2. Создание необходимых файлов
Создадим в папке /bitrix/modules/comments/ файл include.php, заполним его следующим содержимым.
<? // silence is golden ?>
Пусто! Потому что у нас нет ещё ни одного используемого класса модуля или библиотеки функций, но файл всё равно обязательный.
В папке /bitrix/modules/comments/install/ - файл version.php.
<? $arModuleVersion = array( "VERSION" => "1.0.0", "VERSION_DATE" => "2015-07-29 01:55:45" ); ?>
Не 0.0.0, потому что версия не может быть нулевой. Дату можно указать любую, но более или менее актуальную, чтобы избежать проблем со сборкой архивов.
В той же папке /bitrix/modules/comments/install/ - файл index.php.
<? IncludeModuleLangFile(__FILE__); Class aristov_comments extends CModule{ // обязательно для партнёрских модулей const MODULE_ID = 'aristov.comments'; var $MODULE_ID = 'aristov.comments'; var $MODULE_VERSION; var $MODULE_VERSION_DATE; var $MODULE_NAME; var $MODULE_DESCRIPTION; var $MODULE_CSS; var $strError = ''; function __construct(){ $arModuleVersion = array(); include(dirname(__FILE__)."/version.php"); $this->MODULE_VERSION = $arModuleVersion["VERSION"]; $this->MODULE_VERSION_DATE = $arModuleVersion["VERSION_DATE"]; $this->MODULE_NAME = GetMessage("aristov.comments_MODULE_NAME"); $this->MODULE_DESCRIPTION = GetMessage("aristov.comments_MODULE_DESC"); $this->PARTNER_NAME = GetMessage("aristov.comments_PARTNER_NAME"); // обязательно для партнёрских модулей $this->PARTNER_URI = GetMessage("aristov.comments_PARTNER_URI"); // обязательно для партнёрских модулей } function InstallDB($arParams = array()){ return true; } function UnInstallDB($arParams = array()){ return true; } function InstallEvents(){ return true; } function UnInstallEvents(){ return true; } // здесь содержится установка компонентов, административных скриптов и прочих файлов function InstallFiles($arParams = array()){ // административные скрипты if (is_dir($p = $_SERVER['DOCUMENT_ROOT'].'/bitrix/modules/'.self::MODULE_ID.'/admin')){ if ($dir = opendir($p)){ while (false !== $item = readdir($dir)){ if ($item == '..' || $item == '.' || $item == 'menu.php') continue; file_put_contents($file = $_SERVER['DOCUMENT_ROOT'].'/bitrix/admin/'.self::MODULE_ID.'_'.$item, '<'.'? require($_SERVER["DOCUMENT_ROOT"]."/bitrix/modules/'.self::MODULE_ID.'/admin/'.$item.'");?'.'>'); } closedir($dir); } } // компоненты if (is_dir($p = $_SERVER['DOCUMENT_ROOT'].'/bitrix/modules/'.self::MODULE_ID.'/install/components')){ if ($dir = opendir($p)){ while (false !== $item = readdir($dir)){ if ($item == '..' || $item == '.') continue; CopyDirFiles($p.'/'.$item, $_SERVER['DOCUMENT_ROOT'].'/bitrix/components/'.$item, $ReWrite = True, $Recursive = True); } closedir($dir); } } return true; } // здесь все установленные в систему файлы модуля удаляются function UnInstallFiles(){ if (is_dir($p = $_SERVER['DOCUMENT_ROOT'].'/bitrix/modules/'.self::MODULE_ID.'/admin')){ if ($dir = opendir($p)){ while (false !== $item = readdir($dir)){ if ($item == '..' || $item == '.') continue; unlink($_SERVER['DOCUMENT_ROOT'].'/bitrix/admin/'.self::MODULE_ID.'_'.$item); } closedir($dir); } } if (is_dir($p = $_SERVER['DOCUMENT_ROOT'].'/bitrix/modules/'.self::MODULE_ID.'/install/components')){ if ($dir = opendir($p)){ while (false !== $item = readdir($dir)){ if ($item == '..' || $item == '.' || !is_dir($p0 = $p.'/'.$item)) continue; $dir0 = opendir($p0); while (false !== $item0 = readdir($dir0)) { if ($item0 == '..' || $item0 == '.') continue; DeleteDirFilesEx('/bitrix/components/'.$item.'/'.$item0); } closedir($dir0); } closedir($dir); } } return true; } // точка входа при установке function DoInstall(){ global $APPLICATION; $this->InstallFiles(); $this->InstallDB(); RegisterModule(self::MODULE_ID); } // точка входа при удалении function DoUninstall(){ global $APPLICATION; UnRegisterModule(self::MODULE_ID); $this->UnInstallDB(); $this->UnInstallFiles(); } } ?>
Вы могли заметить функцию GetMessage(), она подставляет тексты в зависимости от выбранного языка. Чтобы создать необходимую текстовую переменную, её нужно указать в /lang/{идентификатор языка, например, ru}/{имя файлы с сохранением структуры}, например, в /lang/ru/install/index.php будут хранится языковые фразы на русском языке для файла /install/index.php.
Пример файла.
<? $MESS["aristov.comments_MODULE_NAME"] = "Комментарии"; $MESS["aristov.comments_MODULE_DESC"] = "Очередной велосипед, зато свой."; $MESS["aristov.comments_PARTNER_NAME"] = "Aristov"; $MESS["aristov.comments_PARTNER_URI"] = "http://www.mysite.ru"; ?>
Шаг 3. Проверка работоспособности
Попробуем установить и удалить модуль.
Обратите внимание, что страница установки находится в Настройки/Модули, но если код вашего модуля написан через точку, то он считается партнёрским, а они управляются на странице Marketplace/Установленные решения.
Установка
На странице управления модулями (см. выше) найдите свой модуль (в нашем случае "Комментарии"):

И в контекстном меню (иконка бургера) нажмите "Установить". В случае успеха сверху должна появиться надпись как на картинке:

Удаление
На той же странице управления модулями, в том же контекстном меню жмём кнопку "Удалить". Появится аналогичная надпись:

Если ваше решение было распознано как партнёрское, то также появится стандартная форма отзыва об удалении решения.

Если вы смогли установить и удалить модуль, то значит мы создали работоспособный шаблон для модуля.
Итого
Мы подготовили наш модуль, который не несёт решительно никакой смысловой нагрузки. Но он и не должен, мы лишь создали шаблон для модуля, который может регистрировать себя в системе, а также удаляться из неё по всем правилам. В следующем уроке мы положим в модуль свой компонент, который будет устанавливаться и удаляться вместе с самим решением.
Комментарии
John Smith 28.02.2016 01:23
Аристов Василий 02.03.2016 00:59
Вы правы, теперь должно быть видно
John Smith 02.03.2016 01:51
Кстати, если не сложно, не подскажете зачем мы определяем в функциях массив $arParams, который в дальнейшем не используется?
Аристов Василий 02.03.2016 18:39
Я собираюсь продолжить курс, рассказать про админразделы, сервисы, api маркетплейса и т.п. и переписать этот и другие уроки на D7
Будет всё по-другому и намного полнее