Принято. что кодировка файлов в решении под Маркетплейс должна быть windows-1251 (кстати, почему?), и при установке решения Битрикс самостоятельно перекодирует файлы в нужную кодировку. Однако, на практике оказалось не так.
Для импорта демо-данных в инфоблоки в качестве дампов используются xml-файлы, которые Битрикс не перекодирует. Из-за чего при установке в кодировке UTF-8 мастер не может прочитать xml-файл => не устанавливается инфоблок => не переписываются макросы и происходит либо что-то страшное, либо вообще не происходит ничего.
Мы решили так.
Это типичный пример импорта
$iBlockXMLFile = WIZARD_SERVICE_RELATIVE_PATH . "/xml/" . LANGUAGE_ID . "/colors.xml";
$iBlockCode = "COLORS";
$iBlockType = "catalog";
$arPermissions = Array(
"1" => "X",
"2" => "R"
);
$iBlockID = WizardServices::ImportIBlockFromXML(
$iBlockXMLFile,
$iBlockCode,
$iBlockType,
WIZARD_SITE_ID,
$arPermissions
);
|
Перед данным фрагментом добавляем следующее:
// encode xml-file
$res = CSite::GetByID(WIZARD_SITE_ID);
if($arSite = $res->Fetch()) {
$encoding = $arSite["CHARSET"];
$strXMLFile = file_get_contents(WIZARD_SERVICE_ABSOLUTE_PATH . "/xml/" . LANGUAGE_ID . "/banner.xml");
$strXMLFile = str_r eplace('<?xml version="1.0"?>', '<?xml version="1.0" encoding="'.$encoding.'"?>', $strXMLFile);
if(ToLower($encoding) == "utf-8") {
$strXMLFile = iconv("windows-1251", $encoding, $strXMLFile);
}
$fileXML = fopen(WIZARD_SERVICE_ABSOLUTE_PATH . "/xml/" . LANGUAGE_ID . "/banner.xml", "w");
fwrite($fileXML, $strXMLFile);
fclose($fileXML);
}
|
То есть, определяем кодировку сайта, в который устанавливается решение. Добавляем кодироку в тег
, и если сайт в utf-8, перекодируем xml-файл дампа.