Маркетплейс (http://marketplace.1c-bitrix.ru/) дает возможность централизовано хранить и быстро обновлять свои решения (модули, классы, компоненты, шаблоны, скрипты и т.д.) на сайтах клиентов.
На пример мы написали свой абстрактный класс для обработки элементов инфоблока и используем его в компонентах типа news.list и catalog.section на всех решениях. С течением времени, разрабатываем модуль для вывода пункта меню в панели администрирования, потом появляется модуль документации, свои наработки по монитору качества и много еще всякого. И тут появляется проблема: как все это разом поставить на новый проект (сайт)?
Очевидных решений два:
Хранить все в одном модуле, но так теряем гибкость в плане использования наработок, снижается качество поддержки и хотелось бы свои модули продавать по частям.
Можно динамически загружать необходимые модули при установке/обновлении модуля или через мастер установки типового решения.
С автоматической установкой решения связано несколько нюансов:
поставить свое платное решение. Сейчас идут работы по уведомлению партнера о факте активации купона, тут нужно будет с помощью скрипта (http://dev.1c-bitrix.ru/community/web...blog/2336/) активировать купон на необходимые решения.
поставить свое бесплатное решение (возможно оно будет скрытым в Маркетплейсе). Все просто: бери и качай.
установить чужое решение. Тут осложняется лицензионным соглашением. Если со своими мы еще сами с собой договоримся, то сторонние разработчики могут и обидится. Т.е. Чешем репу и думаем самостоятельно как выкрутится.
Итого: создаем набор из X своих бесплатных модулей и скрипт по их загрузке пачкой. Для простоты скрипт я сделаю отдельным, в дальнейшем вам придется его встраивать в инсталятор (скрипт обновления) или мастер установки.
Пример реализации был подсмотрен в мастере установки модуля 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;
}
}
}
2. Загружаем модуль.
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);
}
3. Устанавливаем.
$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);
}
4. Регистрируем.
RegisterModule($selectedModule);
5. Берем следующий и на шаг 2.
Вспомогательная функция:
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 и вам счастье
Во вложении файл для примера - кладем его в корень и качаем модули ))
Можно динамически загружать необходимые модули при установке/обновлении модуля или через мастер установки типового решения.
Платные нельзя -- иначе придется "спалить" свой секреткей в коде.. и кто угодно затем сможет поставить ваш платный модуль себе на сайт.
поставить свое платное решение. Сейчас идут работы по уведомлению партнера о факте активации купона, тут нужно будет с помощью скрипта (http://dev.1c-bitrix.ru/community/web...blog/2336/) активировать купон на необходимые решения.
А работы уже закончены. Наше решение при своей активации уже добавляет ~16 (с каждым днем число растёт..) платных модулей в систему обновления клиента. А кроме того, новый механизм позволил нам выложить в Маркетплейс еще 2-е редакции, которые отличаются только составом включенных в них модулей.. Это очень крутая штука!
Решил ради интересу протестировать. Пример выдал ошибку при попытке установке моего бесплатного модуля. При этом установил сам модуль, а обновления не смог. вернул ошибку:
[Bitrix\Main\DB\SqlQueryException]
Mysql query error: Duplicate entry 'coffeediz.schema' for key 'PRIMARY' (400)
INS ERT IN TO b_module(ID) VALUES('coffeediz.schema')
/home/bitrix/www/bitrix/modules/main/lib/db/mysqlconnection.php:104
#0: Bitrix\Main\DB\MysqlConnection->queryInternal(string, array, NULL)
/home/bitrix/www/bitrix/modules/main/lib/db/connection.php:332
#1: Bitrix\Main\DB\Connection->query(string, NULL)
/home/bitrix/www/bitrix/modules/main/lib/db/connection.php:381
#2: Bitrix\Main\DB\Connection->queryExecute(string)
/home/bitrix/www/bitrix/modules/main/lib/modulemanager.php:51
#3: Bitrix\Main\ModuleManager::add(string)
/home/bitrix/www/bitrix/modules/main/lib/modulemanager.php:62
#4: Bitrix\Main\ModuleManager::registerModule(string)
/home/bitrix/www/bitrix/modules/main/classes/general/module.php:317
#5: RegisterModule(string)
/home/bitrix/www/1.php:81
Есть мнение, что ошибка выше спровоцирована попыткой регистрации модуля. ВОЗМОЖНО, нынче он уже автоматом регистрируется при выполнении вашего кода установки?
Однако по прежнему жаль, что модуль устанавливается в своём базовом виде, обновления не подтягивает. Было б круто дополнить.
Группы на сайте создаются не только сотрудниками «1С-Битрикс», но и партнерами компании. Поэтому мнения участников групп могут не совпадать с позицией компании «1С-Битрикс».