При сборке обновлений модуля я пользуюсь вот этим решением Конструктор модулей для Маркетплейса, после сборки обновлений модуля архив падает сюда
/bitrix/tmp/api.blog/1.0.4
В этом архиве всегда есть файл updater.php, который скачивается клиентом при установке обновлений модуля и делает все необходимые изменения, так называемый роутер.
Но в нем есть не все, что требуется в работе, иногда приходится таблицы новые добавлять, столбцы к уже существующим таблицам, индексы, джаваскрипты, стили, картинки и т.д.
Если у вашего модуля есть особая структура, которую необходимо обновлять у клиента, то добавить ее в апдейтер можно следующим образом:
Находим в модуле вот этот файл
/bitrix/modules/bitrix.mpbuilder/samples/_updater.php
И добавляем в него вот этот код, который при каждой сборке обновлений автоматически будет добавляться в архив, а после вы уже можете изменить его как захочется.
С папками /install/js и т.д. думаю все понятно, все эти папки апдейтер будет обновлять, вот обратите внимание на закомментированные по умолчанию запросы к БД, они служат как примеры, если мне нужно обновить таблицу или добавить столбец к таблице, я пользуюсь этими примерами и пишу отдельно необходимый запрос под конкретный модуль, а по умолчанию при каждой сборке обновлений они должны быть закомментированы.
if(IsModuleInstalled('{MODULE_ID}'))
{
if(is_dir(dirname(__FILE__) . '/install/admin'))
$updater->CopyFiles("install/admin", "admin/");
if(is_dir(dirname(__FILE__) . '/install/components'))
$updater->CopyFiles("install/components", "components/{NAMESPACE}");
if(is_dir(dirname(__FILE__) . '/install/js'))
$updater->CopyFiles("install/js", "js/{MODULE_ID}/");
if(is_dir(dirname(__FILE__) . '/install/css'))
$updater->CopyFiles("install/css", "css/{MODULE_ID}/");
if(is_dir(dirname(__FILE__) . '/install/images'))
$updater->CopyFiles("install/images", "images/{MODULE_ID}/");
}
/*
if($updater->CanUpdateDatabase())
{
//Sample #1
if($updater->TableExists("api_orderstatus_history"))
{
global $DB;
if(!$DB->Query("SELECT `FILES` FROM `api_orderstatus_history` WHERE 1=0", true))
{
$updater->Query(array(
"MySQL" => "ALTER TABLE `api_orderstatus_history` ADD `FILES` CHAR(1) NOT NULL DEFAULT 'N' AFTER `MAIL`",
));
}
}
//Sample #2
if(!$updater->TableExists("api_orderstatus_file"))
{
$updater->Query(array(
"MySQL" => "CREATE TABLE `api_orderstatus_file` (
`ID` INT(11) NOT NULL AUTO_INCREMENT,
`ORDER_ID` INT(11) NULL DEFAULT NULL,
`FILE_ID` VARCHAR(255) NULL DEFAULT NULL,
PRIMARY KEY (`ID`)
);",
));
}
//Sample #3
if($updater->TableExists("api_reviews"))
{
$updater->Query(array(
"MySQL" => "ALTER TABLE `api_reviews` ADD `IBLOCK_ID` INT(11) NOT NULL AFTER `THUMBS_DOWN`",
));
}
//Sample #4
if($updater->TableExists("b_iblock_element_property"))
{
if(!$DB->IndexExists("b_iblock_element_property", array("VALUE_NUM", "IBLOCK_PROPERTY_ID")))
{
$updater->Query(array(
"MySQL" => "CREATE INDEX ix_iblock_element_prop_num ON b_iblock_element_property(VALUE_NUM, IBLOCK_PROPERTY_ID)",
"MSSQL" => "CREATE INDEX IX_B_IBLOCK_ELEMENT_PROPERTY_4 ON B_IBLOCK_ELEMENT_PROPERTY(VALUE_NUM, IBLOCK_PROPERTY_ID)",
"Oracle" => "CREATE INDEX IX_IBLOCK_ELEMENT_PROP_NUM ON B_IBLOCK_ELEMENT_PROPERTY(VALUE_NUM, IBLOCK_PROPERTY_ID)",
));
}
}
//Sample #5
if($updater->TableExists("b_iblock_property"))
{
if(!$DB->IndexExists("b_iblock_property", array("UPPER(\"CODE\")")))
{
$updater->Query(array(
"Oracle" => "CREATE INDEX ix_iblock_property_2 ON B_IBLOCK_PROPERTY(UPPER(CODE))",
));
}
}
}
*/