
Маркетплейс () дает возможность централизовано хранить и быстро обновлять свои решения (модули, классы, компоненты, шаблоны, скрипты и т.д.) на сайтах клиентов.
На пример мы написали свой абстрактный класс для обработки элементов инфоблока и используем его в компонентах типа news.list и catalog.section на всех решениях. С течением времени, разрабатываем модуль для вывода пункта меню в панели администрирования, потом появляется модуль документации, свои наработки по монитору качества и много еще всякого. И тут появляется проблема: как все это разом поставить на новый проект (сайт)?
Очевидных решений два:
- Хранить все в одном модуле, но так теряем гибкость в плане использования наработок, снижается качество поддержки и хотелось бы свои модули продавать по частям.
- Можно динамически загружать необходимые модули при установке/обновлении модуля или через мастер установки типового решения.
- поставить свое платное решение. Сейчас идут работы по уведомлению партнера о факте активации купона, тут нужно будет с помощью скрипта () активировать купон на необходимые решения.
- поставить свое бесплатное решение (возможно оно будет скрытым в Маркетплейсе). Все просто: бери и качай.
- установить чужое решение. Тут осложняется лицензионным соглашением. Если со своими мы еще сами с собой договоримся, то сторонние разработчики могут и обидится. Т.е. Чешем репу и думаем самостоятельно как выкрутится.
Пример реализации был подсмотрен в мастере установки модуля main (/bitrix/modules/main/install/wizard/wizard.php шаг LoadModuleActionStep)
Немного его упростив получаем следующее:
1. Определяем необходимость загрузки и установки модулей.
$shNEED_MODULES = array('XX.base', 'XX.wizonepage');
if (is_array($shNEED_MODULES) && !empty($shNEED_MODULES)){
$arParams['shef.need.auto.install'] = array();
foreach ($shNEED_MODULES as $module){
if (!IsModuleInstalled($module)){
$arParams['shef.need.auto.install'][] = $module;
}
}
}
|
if (!file_exists($_SERVER["DOCUMENT_ROOT"]."/bitrix/modules/".$selectedModule))
{
require_once($_SERVER["DOCUMENT_ROOT"]."/bitrix/modules/main/classes/general/update_client_partner.php");
$errorMessage = "";
if (!CUpdateClientPartner::LoadModuleNoDemand($selectedModule, $errorMessage, "Y", LANGUAGE_ID))
SendResponse($errorMessage.': '.$selectedModule);
}
|
$module = GetModuleObject($selectedModule);
if (!is_object($module))
SendResponse("error ".("INS_MODULE_CANNOT_BE_INSTALLED").': '.$selectedModule);
if (!$module->InstallDB())
{
if ($ex = $APPLICATION->GetException())
SendResponse("error ".$ex->GetString().': '.$selectedModule);
else
SendResponse("error ".("INS_MODULE_DATABASE_ERROR").': '.$selectedModule);
}
if (!$module->InstallEvents())
{
if ($ex = $APPLICATION->GetException())
SendResponse("error ".$ex->GetString().': '.$selectedModule);
else
SendResponse("error ".("INS_MODULE_EVENTS_ERROR").': '.$selectedModule);
}
if (!$module->InstallFiles())
{
if ($ex = $APPLICATION->GetException())
SendResponse("error ".$ex->GetString().': '.$selectedModule);
else
SendResponse("error ".("INS_MODULE_FILES_ERROR").': '.$selectedModule);
}
|
RegisterModule($selectedModule); |
Вспомогательная функция:
function GetModuleObject($moduleID)
{
$installFile = $_SERVER["DOCUMENT_ROOT"]."/bitrix/modules/".$moduleID."/install/index.php";
if (!file_exists($installFile))
return false;
@include_once($installFile);
$moduleIDTmp = str_replace(".", "_", $moduleID);
if (!class_exists($moduleIDTmp))
return false;
return new $moduleIDTmp;
}
|
Как видите, ничего хитрого пока нет. Когда будете модифицировать скрипт для своих нужд, помните как это работает в BX Frame Work и используйте такой же принцип и те же js и вам счастье

Во вложении файл для примера - кладем его в корень и качаем модули ))