<?PHP
//$arZip массив = имя файла zip => имя упакованного xml
//в цикле перебираем этот массив и для каждого открытого xml производим импорт в инфоблок
foreach($arZIP as $zip => $xml){
$ABS_FILE_NAME = $_SERVER["DOCUMENT_ROOT"] . $zip;
$ABS_FILE_NAME_XML = $_SERVER["DOCUMENT_ROOT"] . $xml;
$start = date("m.d.y H:i:s");
set_time_limit(6000);
echo "-----------------------\n";
echo "Start - " . $start . " - $ABS_FILE_NAME_XML\n";
echo "-----------------------\n";
define("NO_KEEP_STATISTIC", true);
define("NOT_CHECK_PERMISSIONS", true);
require_once($_SERVER["DOCUMENT_ROOT"]."/bitrix/modules/main/include/prolog_before.php");
require_once($_SERVER["DOCUMENT_ROOT"]."/bitrix/modules/iblock/iblock.php");
$WORK_DIR_NAME = substr($ABS_FILE_NAME, 0, strrpos($ABS_FILE_NAME, "/")+1);
//тут проверяем расширение
if(substr($ABS_FILE_NAME, -7) == ".tar.gz")
{
include_once($_SERVER["DOCUMENT_ROOT"].BX_ROOT."/modules/main/classes/general/tar_gz.php");
//пытаемся разархивировать
$obArchiver = new CArchiver($ABS_FILE_NAME);
if(!$obArchiver->ExtractFiles($WORK_DIR_NAME))
{
$strError = "";
if(is_object($APPLICATION))
{
$arErrors = $obArchiver->GetErrors();
if(count($arErrors))
{
foreach($arErrors as $error)
$strError .= $error[1]."<br>";
}
}
if($strError != "")
return $strError;
else
return GetMessage("IBLOCK_XML2_FILE_ERROR");
}
$ABS_FILE_NAME_TARGZ = $ABS_FILE_NAME;
if(file_exists($ABS_FILE_NAME_XML)) $IMP_FILE_NAME = $ABS_FILE_NAME_XML;
else $IMP_FILE_NAME = substr($ABS_FILE_NAME, 0, -7).".xml";
}
else
{
$IMP_FILE_NAME = $ABS_FILE_NAME;
}
$fp = fopen($IMP_FILE_NAME, "rb");
if(!$fp)
return GetMessage("IBLOCK_XML2_FILE_ERROR");
fclose($fp);
//-----------------
$ABS_FILE_NAME = $IMP_FILE_NAME;
//тут мы задаем начальные параметры
$NS = array(
"STEP" => 0, //номер шага
"IBLOCK_TYPE" => "catalog", //тип инфоблока
"LID" => "s1", //сайт
"URL_DATA_FILE" => $ABS_FILE_NAME, //файл импорта
"ACTION" => "A", //действие по умолчанию для элементов или секций которые отсутствуют в xml
"PREVIEW" => "N", //не создавать превьюшки из картинок
);
//объект для импрта xml
$obXMLFile = new CIBlockXMLFile;
if($ABS_FILE_NAME)
{
if($NS["STEP"] < 1)
{
set_time_limit(6000);
//дропаем временную таблицу
CIBlockXMLFile::DropTemporaryTables();
echo "DropTemporaryTables - " . date("m.d.y H:i:s") . " - OK\n";
//раньше еще проверял на валидность xml но лишнее время ....
//if(CIBlockCMLImport::CheckIfFileIsCML($ABS_FILE_NAME)):
$NS["STEP"]++;
// echo "CheckIfFileIsCML - " . date("m.d.y H:i:s") . " - OK\n";
//else:
// $arErrors[] = GetMessage("IBLOCK_CML2_WRONG_FILE_ERROR");
//endif;
}
if($NS["STEP"] < 2)
{
set_time_limit(6000);
//создаем временную таблицу
if(CIBlockXMLFile::CreateTemporaryTables()):
$NS["STEP"]++;
echo "CreateTemporaryTables - " . date("m.d.y H:i:s") . " - OK\n";
else:
$arErrors[] = GetMessage("IBLOCK_CML2_TABLE_CREATE_ERROR");
endif;
}
if($NS["STEP"] < 3)
{
set_time_limit(6000);
if(file_exists($ABS_FILE_NAME) && is_file($ABS_FILE_NAME) && ($fp = fopen($ABS_FILE_NAME, "rb")))
{
//читаем данные из xml
if($obXMLFile->ReadXMLToDatabase($fp, $NS, 0))
$NS["STEP"]++;
echo "ReadXMLToDatabase - " . date("m.d.y H:i:s") . " - OK\n";
fclose($fp);
}
else
{
$arErrors[] = GetMessage("IBLOCK_CML2_FILE_ERROR");
}
}
if($NS["STEP"] < 4)
{
set_time_limit(6000);
//индексируем временную таблицу
if(CIBlockXMLFile::IndexTemporaryTables()):
$NS["STEP"]++;
echo "IndexTemporaryTables - " . date("m.d.y H:i:s") . " - OK\n";
else:
$arErrors[] = GetMessage("IBLOCK_CML2_INDEX_ERROR");
endif;
}
if($NS["STEP"] < 5)
{
set_time_limit(6000);
//объект для импорта подготовленных данных
$obCatalog = new CIBlockCMLImport;
//инициализируем
$obCatalog->Init($NS, $WORK_DIR_NAME, true, $NS["PREVIEW"], false, true);
//импортируем метаданные
$result = $obCatalog->ImportMetaData(1, $NS["IBLOCK_TYPE"], $NS["LID"]);
//импортируем секции
$obCatalog->ImportSections();
echo "ImportSections - " . date("m.d.y H:i:s") . " - OK\n";
//а тут мы деактивируем тесекции которых нет в XML, можно удалять, можно ничего не делать
$obCatalog->DeactivateSections("A");
echo "DeactivateSections - " . date("m.d.y H:i:s") . " - OK\n";
if($result === true):
$NS["STEP"]++;
else:
$arErrors[] = $result;
endif;
}
if($NS["STEP"] < 6)
{
set_time_limit(6000);
//это я не понял для чего :)
if(($NS["DONE"]["ALL"] <= 0) && $NS["XML_ELEMENTS_PARENT"])
{
$rs = $DB->Query("select count(*) C from b_xml_tree where PARENT_ID = ".intval($NS["XML_ELEMENTS_PARENT"]));
$ar = $rs->Fetch();
$NS["DONE"]["ALL"] = $ar["C"];
}
//тут создаем снова объект, инициализируем
$obCatalog = new CIBlockCMLImport;
$obCatalog->Init($NS, $WORK_DIR_NAME, true, $NS["PREVIEW"], false, true);
//тут подготавливаются данные о дереве секций и матрицы цен
$obCatalog->ReadCatalogData($_SESSION["BX_CML2_IMPORT"]["SECTION_MAP"], $_SESSION["BX_CML2_IMPORT"]["PRICES_MAP"]);
//собственно сам импорт элементов
$result = $obCatalog->ImportElements($start_time, 0);
echo "ImportElements - " . date("m.d.y H:i:s") . " - OK\n";
$counter = 0;
foreach($result as $key=>$value)
{
$NS["DONE"][$key] += $value;
$counter+=$value;
}
if(!$counter)
$NS["STEP"]++;
}
//тут я закоментил шаг потому что активность элементов устанавливаю уже в самом файле xml
/* if($NS["STEP"] < 7)
{
set_time_limit(6000);
$obCatalog = new CIBlockCMLImport;
$obCatalog->Init($NS, $WORK_DIR_NAME, true, $NS["PREVIEW"], false, true);
$result = $obCatalog->DeactivateElement($NS["ACTION"], $start_time, 0);
echo "DeactivateElement - " . date("m.d.y H:i:s") . " - OK\n";
$counter = 0;
foreach($result as $key=>$value)
{
$NS["DONE"][$key] += $value;
$counter+=$value;
}
if(!$counter)
$NS["STEP"]++;
}
if($NS["STEP"] < 8)
{
$NS["STEP"]++;
}
*/
}
else
{
$arErrors[] = GetMessage("IBLOCK_CML2_FILE_ERROR");
}
$end = date("m.d.y H:i:s");
echo "End - " . $end;
if(count($arErrors)==0):
echo " OK\n";
unlink($ABS_FILE_NAME_TARGZ);
unlink($ABS_FILE_NAME);
endif;
}
?>
|