При сборке обновлений модуля я пользуюсь вот этим решением Конструктор модулей для Маркетплейса, после сборки обновлений модуля архив падает сюда
/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))", )); } } } */