require_once($_SERVER["DOCUMENT_ROOT"]."/bitrix/modules/main/include/prolog_admin_before.php"); CModule::IncludeModule("iblock"); require_once($_SERVER["DOCUMENT_ROOT"]."/bitrix/modules/iblock/prolog.php"); IncludeModuleLangFile(__FILE__); $rsIBlocks = CIBlock::GetList(array(), array( "MIN_PERMISSION" => "X", "OPERATION" => "iblock_export", )); if(!$rsIBlocks->Fetch()) $APPLICATION->AuthForm(GetMessage("ACCESS_DENIED")); if(!isset($INTERVAL)) $INTERVAL = 30; else $INTERVAL = intval($INTERVAL); if($INTERVAL <= 0) @set_time_limit(0); $start_time = time(); $arErrors = array(); $arMessages = array(); if($_SERVER["REQUEST_METHOD"] == "POST" && $_REQUEST["Export"]=="Y") { require_once($_SERVER["DOCUMENT_ROOT"]."/bitrix/modules/main/include/prolog_admin_js.php"); if(array_key_exists("NS", $_POST) && is_array($_POST["NS"])) $NS = $_POST["NS"]; else $NS = array( "STEP" => 0, "IBLOCK_ID" => $_REQUEST["IBLOCK_ID"], "URL_DATA_FILE" => $_REQUEST["URL_DATA_FILE"], "SECTIONS_FILTER" => $_REQUEST["SECTIONS_FILTER"], "ELEMENTS_FILTER" => $_REQUEST["ELEMENTS_FILTER"], "DOWNLOAD_CLOUD_FILES" => $_REQUEST["DOWNLOAD_CLOUD_FILES"] === "N"? "N": "Y", "next_step" => array(), ); $NS["catalog"] = CModule::IncludeModule('catalog'); //We have to strongly check all about file names at server side $ABS_FILE_NAME = false; $WORK_DIR_NAME = false; if(isset($NS["URL_DATA_FILE"]) && ($NS["URL_DATA_FILE"] <> '')) { $filename = trim(str_replace("\\", "/", trim($NS["URL_DATA_FILE"])), "/"); if ( preg_match('/[^a-zA-Z0-9\s!#\$%&\(\)\[\]\{\}+\.;=@\^_\~\/\\\\\-]/i', $filename) || HasScriptExtension($filename) ) { $arErrors[] = GetMessage("IBLOCK_CML2_FILE_NAME_ERROR"); } else { $FILE_NAME = rel2abs($_SERVER["DOCUMENT_ROOT"], "/".$filename); if((mb_strlen($FILE_NAME) > 1) && ($FILE_NAME === "/".$filename)) { $ABS_FILE_NAME = $_SERVER["DOCUMENT_ROOT"].$FILE_NAME; if (mb_strtolower(mb_substr($ABS_FILE_NAME, -4)) != ".xml") $ABS_FILE_NAME .= ".xml"; $WORK_DIR_NAME = mb_substr($ABS_FILE_NAME, 0, mb_strrpos($ABS_FILE_NAME, "/") + 1); } } } $fp = false; if(!check_bitrix_sessid()) { $arErrors[] = GetMessage("IBLOCK_CML2_ACCESS_DENIED"); } elseif(!CIBlockRights::UserHasRightTo($NS["IBLOCK_ID"], $NS["IBLOCK_ID"], "iblock_export")) { $arErrors[] = GetMessage("IBLOCK_CML2_ACCESS_DENIED"); } elseif($ABS_FILE_NAME && (count($arErrors) == 0)) { if($NS["STEP"] < 1) { $_SESSION["BX_CML2_EXPORT"] = array( "PROPERTY_MAP" => false, "SECTION_MAP" => false, "PRICES_MAP" => false, "work_dir" => false, "file_dir" => false, ); if($fp = fopen($ABS_FILE_NAME, "wb")) { @chmod($ABS_FILE_NAME, BX_FILE_PERMISSIONS); if(mb_strtolower(mb_substr($ABS_FILE_NAME, -4)) == ".xml") { $DIR_NAME = mb_substr($ABS_FILE_NAME, 0, -4)."_files"; if( is_dir($DIR_NAME) || @mkdir($DIR_NAME, BX_DIR_PERMISSIONS) ) { $_SESSION["BX_CML2_EXPORT"]["work_dir"] = $WORK_DIR_NAME; $_SESSION["BX_CML2_EXPORT"]["file_dir"] = mb_substr($DIR_NAME."/", mb_strlen($WORK_DIR_NAME)); } } } else { $arErrors[] = GetMessage("IBLOCK_CML2_FILE_ERROR"); } $NS["STEP"]++; } elseif($NS["STEP"] < 4) { if($fp = fopen($ABS_FILE_NAME, "ab")) { $obExport = new CIBlockCMLExport; if($obExport->Init($fp, $NS["IBLOCK_ID"], $NS["next_step"], true, $_SESSION["BX_CML2_EXPORT"]["work_dir"], $_SESSION["BX_CML2_EXPORT"]["file_dir"])) { if($NS["DOWNLOAD_CLOUD_FILES"] === "N") $obExport->DoNotDownloadCloudFiles(); if($NS["STEP"]==1) { $obExport->StartExport(); $obExport->StartExportMetadata(); $obExport->ExportProperties($_SESSION["BX_CML2_EXPORT"]["PROPERTY_MAP"]); $NS["STEP"]++; } elseif($NS["STEP"]==2) { $result = $obExport->ExportSections( $_SESSION["BX_CML2_EXPORT"]["SECTION_MAP"], $start_time, $INTERVAL, $NS["SECTIONS_FILTER"], $_SESSION["BX_CML2_EXPORT"]["PROPERTY_MAP"] ); if($result) { $NS["SECTIONS"] += $result; } else { $obExport->EndExportMetadata(); $obExport->StartExportCatalog(); $NS["STEP"]++; } } elseif($NS["STEP"]==3) { $result = $obExport->ExportElements( $_SESSION["BX_CML2_EXPORT"]["PROPERTY_MAP"], $_SESSION["BX_CML2_EXPORT"]["SECTION_MAP"], $start_time, $INTERVAL, 0, $NS["ELEMENTS_FILTER"] ); if($result) { $NS["ELEMENTS"] += $result; } else { $obExport->EndExportCatalog(); //$obExport->ExportProductSets(); $obExport->EndExport(); $NS["STEP"]++; } } else $NS["STEP"]++; $NS["next_step"] = $obExport->next_step; } else { $arErrors[] = GetMessage("IBLOCK_CML2_IBLOCK_ERROR"); } } else { $arErrors[] = GetMessage("IBLOCK_CML2_FILE_ERROR")."(1)"; } } } else { $arErrors[] = GetMessage("IBLOCK_CML2_FILE_ERROR")."(2)"; } if($fp) fclose($fp); ?> foreach($arErrors as $strError) CAdminMessage::ShowMessage($strError); foreach($arMessages as $strMessage) CAdminMessage::ShowMessage(array("MESSAGE"=>$strMessage,"TYPE"=>"OK")); if(count($arErrors) == 0) { if($NS["STEP"] < 4) { $progressItems = array( GetMessage("IBLOCK_CML2_METADATA_DONE"), ); if($NS["STEP"] < 2) $progressItems[] = GetMessage("IBLOCK_CML2_SECTIONS"); elseif($NS["STEP"] < 3) $progressItems[] = "".GetMessage("IBLOCK_CML2_SECTIONS_PROGRESS", array("#COUNT#"=>intval($NS["SECTIONS"]))).""; else $progressItems[] = GetMessage("IBLOCK_CML2_SECTIONS_PROGRESS", array("#COUNT#"=>intval($NS["SECTIONS"]))); if($NS["STEP"] < 3) $progressItems[] = GetMessage("IBLOCK_CML2_ELEMENTS"); elseif($NS["STEP"] < 4) $progressItems[] = "".GetMessage("IBLOCK_CML2_ELEMENTS_PROGRESS", array("#COUNT#"=>intval($NS["ELEMENTS"]))).""; else $progressItems[] = GetMessage("IBLOCK_CML2_ELEMENTS_PROGRESS", array("#COUNT#"=>intval($NS["ELEMENTS"]))); CAdminMessage::ShowMessage(array( "DETAILS" => "
".implode("
", $progressItems)."
", "HTML" => true, "TYPE" => "PROGRESS", )); if($NS["STEP"] > 0) echo ''; } else { $progressItems = array( GetMessage("IBLOCK_CML2_DONE_SECTIONS", array("#COUNT#"=>intval($NS["SECTIONS"]))), GetMessage("IBLOCK_CML2_DONE_ELEMENTS", array("#COUNT#"=>intval($NS["ELEMENTS"]))), ); CAdminMessage::ShowMessage(array( "MESSAGE" => GetMessage("IBLOCK_CML2_DONE"), "DETAILS" => "".implode("
", $progressItems)."
", "HTML" => true, "TYPE" => "PROGRESS", )); echo ''; } } else { echo ''; } require($_SERVER["DOCUMENT_ROOT"].BX_ROOT."/modules/main/include/epilog_admin_js.php"); } $APPLICATION->SetTitle(GetMessage("IBLOCK_CML2_TITLE")); require($_SERVER["DOCUMENT_ROOT"]."/bitrix/modules/main/include/prolog_admin_after.php"); ?> $aTabs = array( array( "DIV" => "edit1", "TAB" => GetMessage("IBLOCK_CML2_TAB"), "ICON" => "main_user_edit", "TITLE" => GetMessage("IBLOCK_CML2_TAB_TITLE"), ), ); $tabControl = new CAdminTabControl("tabControl", $aTabs, true, true); ?>