Логотип

Создание, установка, удаление

Если у вас есть какой-то готовый функционал или вы придумали способ облегчить рутинные операции, то можно вынести этот код в модуль, это даст вам:

  • Ускорение разработки на Битриксе
  • Облегчение поддержки сайтов
  • Баллы в партнёрской системе Битрикс
  • Возможность заработка на 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

John Smith 28.02.2016 01:23

Добрый день, по моему в статье отсутствует пример кода файла install/index.php
Аристов Василий

Аристов Василий 02.03.2016 00:59

Здравствуйте,
Вы правы, теперь должно быть видно
John Smith

John Smith 02.03.2016 01:51

Угу, спасибо, у вас пожалуй самое вменяемое и актуальное рассмотрение процесса создания модуля)

Кстати, если не сложно, не подскажете зачем мы определяем в функциях массив $arParams, который в дальнейшем не используется?
Аристов Василий

Аристов Василий 02.03.2016 18:39

Просто на будущее, в планах закончить серию.
Я собираюсь продолжить курс, рассказать про админразделы, сервисы, api маркетплейса и т.п. и переписать этот и другие уроки на D7
Будет всё по-другому и намного полнее

Написать комментарий

Внимание!

Этот сайт использует технологию "cookies" и интернет-сервисы для сбора технических данных!

Условия использования и другие юридические моменты можно найти в пользовательском соглашении и в политике конфиденциальности.

Цель - получение статистической информации и возможность работы множества сервисов на страницах сайта и самого сайта.

Если Вы не согласны на обработку данных на указанных выше условиях, покиньте сайт.