/** * <p>Функция обновляет параметры местоположения с кодом ID в соответствии с параметрами из массива arFields. Обновляются так же страна и город этого местоположения. </p> * * * * * @param int $ID Код местоположения. </h * * * * @param array $arFields Ассоциативный массив параметров местоположения с ключами: <ul> <li> * <b>SORT</b> - индекс сортировки; </li> <li> <b>COUNTRY_ID</b> - код страны (если такая * страна уже есть, иначе код должен быть нулем, и должен быть * заполнен ключ COUNTRY);</li> <li> <b>COUNTRY</b> - массив с параметрами страны * (должен быть заполнен, если не установлен ключ COUNTRY_ID или если ключ * CHANGE_COUNTRY установлен в значение Y); </li> <li> <b>CHANGE_COUNTRY</b> - флаг (Y/N), * изменять ли параметры страны (долны быть установлены ключи COUNTRY_ID * и COUNTRY); </li> <li> <b>WITHOUT_CITY</b> - флаг (Y/N), означающий, что это * местоположение без города (только страна) (если значением с этим * ключем является N, то необходимо заполнить ключ CITY);</li> <li> <b>CITY_ID</b> - * код города (если такой город уже есть, иначе код должен быть нулем, * и должен быть заполнен ключ CITY);</li> <li> <b>CITY</b> - массив с параметрами * города (если установлен флаг WITHOUT_CITY в значение Y, то этот ключ * заполнять не нужно);</li> </ul> Массив с параметрами страны должен * содержать ключи: <ul> <li> <b>NAME</b> - название страны (не зависящее от * языка);</li> <li> <b>SHORT_NAME</b> - сокращенное название страны - абревиатура * (не зависящее от языка);</li> <li> <b><код языка></b> - ключем является * код языка, а значением ассоциативный массив вида <pre class="syntax"> * array("LID" => "код языка", "NAME" => "название страны на этом языке", * "SHORT_NAME" => "сокращенное название страны (аббревиатура) на этом * языке")</pre> Эта пара ключ-значение должна присутствовать для * каждого языка системы. </li> </ul> Массив с параметрами города должен * содержать ключи: <ul> <li> <b>NAME</b> - название города (не зависящее от * языка);</li> <li> <b>SHORT_NAME</b> - сокращенное название города - абревиатура * (не зависящее от языка);</li> <li> <b><код языка></b> - ключем является * код языка, а значением ассоциативный массив вида <pre class="syntax"> * array("LID" => "код языка", "NAME" => "название города на этом языке", * "SHORT_NAME" => "сокращенное название города (аббревиатура) на этом * языке")</pre> Эта пара ключ-значение должна присутствовать для * каждого языка системы.</li> </ul> * * * * @return int <p>Возвращается код измененного местоположения или <i>false</i> у * случае ошибки.</p> <a name="examples"></a> * * * <h4>Example</h4> * <pre> * <? * $arFields = array( * "SORT" => 100, * "COUNTRY_ID" => 8, * "WITHOUT_CITY" => "N" * ); * * $arCity = array( * "NAME" => "Kaliningrad", * "SHORT_NAME" => "Kaliningrad", * "ru" => array( * "LID" => "ru", * "NAME" => "Калининград", * "SHORT_NAME" => "Калининград" * ), * "en" => array( * "LID" => "en", * "NAME" => "Kaliningrad", * "SHORT_NAME" => "Kaliningrad" * ) * ); * * $arFields["CITY"] = $arCity; * * if (!CSaleLocation::Update(6, $arFields)) * echo "Ошибка изменения местоположения"; * ?> * </pre> * * * @static * @link http://dev.1c-bitrix.ru/api_help/sale/classes/csalelocation/csalelocation__update.a6601f1c.php * @author Bitrix */ public static function Update($ID, $arFields) { global $DB; if (!CSaleLocation::CheckFields("UPDATE", $arFields)) { return false; } if (!($arLocRes = CSaleLocation::GetByID($ID, LANGUAGE_ID))) { return false; } if ((!is_set($arFields, "COUNTRY_ID") || IntVal($arFields["COUNTRY_ID"]) <= 0) && $arFields["COUNTRY_ID"] != "") { $arFields["COUNTRY_ID"] = CSaleLocation::AddCountry($arFields["COUNTRY"]); if (IntVal($arFields["COUNTRY_ID"]) <= 0) { return false; } unset($arFields["CITY_ID"]); unset($arFields["REGION_ID"]); CSaleLocation::AddLocation($arFields); } elseif ($arFields["CHANGE_COUNTRY"] == "Y" || $arFields["COUNTRY_ID"] == "") { CSaleLocation::UpdateCountry($arFields["COUNTRY_ID"], $arFields["COUNTRY"]); } //city if ($arFields["WITHOUT_CITY"] != "Y") { if (IntVal($arLocRes["CITY_ID"]) > 0) { CSaleLocation::UpdateCity(IntVal($arLocRes["CITY_ID"]), $arFields["CITY"]); } else { $arFields["CITY_ID"] = CSaleLocation::AddCity($arFields["CITY"]); if (IntVal($arFields["CITY_ID"]) <= 0) { return false; } } } else { CSaleLocation::DeleteCity($arLocRes["CITY_ID"]); $arFields["CITY_ID"] = false; } //region if (IntVal($arFields["REGION_ID"]) > 0) { CSaleLocation::UpdateRegion(IntVal($arLocRes["REGION_ID"]), $arFields["REGION"]); } elseif ($arFields["REGION_ID"] == 0 && $arFields["REGION_ID"] != '') { $db_res = CSaleLocation::GetRegionList(array("ID" => "DESC"), array("NAME" => $arFields["REGION"][LANGUAGE_ID]["NAME"])); $arRegion = $db_res->Fetch(); if (count($arRegion) > 1) { $arFields["REGION_ID"] = $arRegion["ID"]; } else { $arFields["REGION_ID"] = CSaleLocation::AddRegion($arFields["REGION"]); if (IntVal($arFields["REGION_ID"]) <= 0) { return false; } $arFieldsTmp = $arFields; unset($arFieldsTmp["CITY_ID"]); CSaleLocation::AddLocation($arFieldsTmp); } } elseif ($arFields["REGION_ID"] == '') { //CSaleLocation::DeleteRegion($arLocRes["REGION_ID"]); $arFields["REGION_ID"] = 0; } else { unset($arFields["REGION_ID"]); } CSaleLocation::UpdateLocation($ID, $arFields); return $ID; }
function saleLocationImport($arParams) { global $DB; $arReturn = array('STEP' => false, 'ERROR' => '', 'AMOUNT' => 0, 'POS' => 0, 'MESSAGE' => ''); $step_length = intval($arParams["STEP_LENGTH"]); if ($step_length <= 0) { $step_length = 10; } define('ZIP_STEP_LENGTH', $step_length); define('LOC_STEP_LENGTH', $step_length); define('DLZIPFILE', $arParams["DLZIPFILE"]); $STEP = intval($arParams['STEP']); $CSVFILE = $arParams["CSVFILE"]; $LOADZIP = $arParams["LOADZIP"]; $bSync = $arParams["SYNC"] == "Y"; if (isset($arParams['TMP_PATH'])) { $sTmpFilePath = $arParams['TMP_PATH']; } else { $sTmpFilePath = CTempFile::GetDirectoryName(12, 'sale'); } if (strlen($CSVFILE) > 0 && !in_array($CSVFILE, array('loc_ussr.csv', 'loc_ua.csv', 'loc_kz.csv', 'loc_usa.csv', 'loc_cntr.csv', 'locations.csv'))) { //echo GetMessage('SL_IMPORT_ERROR_FILES'); $arReturn['ERROR'] = GetMessage('SL_IMPORT_ERROR_FILES'); } else { if ($STEP == 1 && strlen($CSVFILE) <= 0) { if ($LOADZIP == 'Y') { $STEP = 2; } else { $STEP = 3; } } switch ($STEP) { case 0: $arReturn['MESSAGE'] = GetMessage('WSL_IMPORT_FILES_LOADING'); $arReturn['STEP'] = 1; break; case 1: $time_limit = ini_get('max_execution_time'); if ($time_limit < LOC_STEP_LENGTH) { set_time_limit(LOC_STEP_LENGTH + 5); } $start_time = time(); $finish_time = $start_time + LOC_STEP_LENGTH; $file_url = $sTmpFilePath . $CSVFILE; if (!file_exists($file_url)) { $arReturn['ERROR'] = GetMessage('SL_IMPORT_ERROR_NO_LOC_FILE'); break; } $bFinish = true; $arSysLangs = array(); $db_lang = CLangAdmin::GetList($b = "sort", $o = "asc", array("ACTIVE" => "Y")); while ($arLang = $db_lang->Fetch()) { $arSysLangs[$arLang["LID"]] = $arLang["LID"]; } $arLocations = array(); if (!$bSync) { if (!is_set($_SESSION["LOC_POS"])) { CSaleLocation::DeleteAll(); } } else { $dbLocations = CSaleLocation::GetList(array(), array(), false, false, array("ID", "COUNTRY_ID", "REGION_ID", "CITY_ID")); while ($arLoc = $dbLocations->Fetch()) { $arLocations[$arLoc["ID"]] = $arLoc; } } if (count($arLocations) <= 0) { $bSync = false; } include_once $_SERVER["DOCUMENT_ROOT"] . "/bitrix/modules/main/classes/general/csv_data.php"; $csvFile = new CCSVData(); $csvFile->LoadFile($file_url); $csvFile->SetFieldsType("R"); $csvFile->SetFirstHeader(false); $csvFile->SetDelimiter(","); $arRes = $csvFile->Fetch(); if (!is_array($arRes) || count($arRes) <= 0 || strlen($arRes[0]) != 2) { $strWarning .= GetMessage('SL_IMPORT_ERROR_WRONG_LOC_FILE') . "<br />"; } if (strlen($strWarning) <= 0) { $DefLang = $arRes[0]; if (!in_array($DefLang, $arSysLangs)) { $strWarning .= GetMessage('SL_IMPORT_ERROR_NO_LANG') . "<br />"; } } if (strlen($strWarning) > 0) { $arReturn['ERROR'] = $strWarning . "<br />"; break; } if (is_set($_SESSION["LOC_POS"])) { $csvFile->SetPos($_SESSION["LOC_POS"]); $CurCountryID = $_SESSION["CUR_COUNTRY_ID"]; $CurRegionID = $_SESSION["CUR_REGION_ID"]; $numCountries = $_SESSION["NUM_COUNTRIES"]; $numRegiones = $_SESSION["NUM_REGIONES"]; $numCities = $_SESSION["NUM_CITIES"]; $numLocations = $_SESSION["NUM_LOCATIONS"]; } else { $CurCountryID = 0; $CurRegionID = 0; $numCountries = 0; $numRegiones = 0; $numCities = 0; $numLocations = 0; } $tt = 0; while ($arRes = $csvFile->Fetch()) { $type = ToUpper($arRes[0]); $tt++; $arArrayTmp = array(); foreach ($arRes as $ind => $value) { if ($ind % 2 && isset($arSysLangs[$value])) { $arArrayTmp[$value] = array("LID" => $value, "NAME" => $arRes[$ind + 1]); if ($value == $DefLang) { $arArrayTmp["NAME"] = $arRes[$ind + 1]; } } } //country if (is_array($arArrayTmp) && strlen($arArrayTmp["NAME"]) > 0) { if ($type == "S") { $CurRegionID = null; $arRegionList = array(); $CurCountryID = null; $arContList = array(); $LLL = 0; if ($bSync) { $db_contList = CSaleLocation::GetList(array(), array("COUNTRY_NAME" => $arArrayTmp["NAME"], "LID" => $DefLang)); if ($arContList = $db_contList->Fetch()) { $LLL = IntVal($arContList["ID"]); $CurCountryID = IntVal($arContList["COUNTRY_ID"]); } } if (IntVal($CurCountryID) <= 0) { $CurCountryID = CSaleLocation::AddCountry($arArrayTmp); $CurCountryID = IntVal($CurCountryID); if ($CurCountryID > 0) { $numCountries++; if (IntVal($LLL) <= 0) { $LLL = CSaleLocation::AddLocation(array("COUNTRY_ID" => $CurCountryID)); if (IntVal($LLL) > 0) { $numLocations++; } } } } } elseif ($type == "R") { $CurRegionID = null; $arRegionList = array(); $LLL = 0; if ($bSync) { $db_rengList = CSaleLocation::GetList(array(), array("COUNTRY_ID" => $CurCountryID, "REGION_NAME" => $arArrayTmp["NAME"], "LID" => $DefLang)); if ($arRegionList = $db_rengList->Fetch()) { $LLL = $arRegionList["ID"]; $CurRegionID = IntVal($arRegionList["REGION_ID"]); } } if (IntVal($CurRegionID) <= 0) { $CurRegionID = CSaleLocation::AddRegion($arArrayTmp); $CurRegionID = IntVal($CurRegionID); if ($CurRegionID > 0) { $numRegiones++; if (IntVal($LLL) <= 0) { $LLL = CSaleLocation::AddLocation(array("COUNTRY_ID" => $CurCountryID, "REGION_ID" => $CurRegionID)); if (IntVal($LLL) > 0) { $numLocations++; } } } } } elseif ($type == "T" && IntVal($CurCountryID) > 0) { $city_id = 0; $LLL = 0; $arCityList = array(); if ($bSync) { $arFilter = array("COUNTRY_ID" => $CurCountryID, "CITY_NAME" => $arArrayTmp["NAME"], "LID" => $DefLang); if (IntVal($CurRegionID) > 0) { $arFilter["REGION_ID"] = $CurRegionID; } $db_cityList = CSaleLocation::GetList(array(), $arFilter); if ($arCityList = $db_cityList->Fetch()) { $LLL = $arCityList["ID"]; $city_id = IntVal($arCityList["CITY_ID"]); } } if ($city_id <= 0) { $city_id = CSaleLocation::AddCity($arArrayTmp); $city_id = IntVal($city_id); if ($city_id > 0) { $numCities++; } } if ($city_id > 0) { if (IntVal($LLL) <= 0) { $LLL = CSaleLocation::AddLocation(array("COUNTRY_ID" => $CurCountryID, "REGION_ID" => $CurRegionID, "CITY_ID" => $city_id)); if (intval($LLL) > 0) { $numLocations++; } } } } } if ($tt == 10) { $tt = 0; $cur_time = time(); if ($cur_time >= $finish_time) { $cur_step = $csvFile->GetPos(); $amount = $csvFile->iFileLength; $_SESSION["LOC_POS"] = $cur_step; $_SESSION["CUR_COUNTRY_ID"] = $CurCountryID; $_SESSION["CUR_REGION_ID"] = $CurRegionID; $_SESSION["NUM_COUNTRIES"] = $numCountries; $_SESSION["NUM_REGIONES"] = $numRegiones; $_SESSION["NUM_CITIES"] = $numCities; $_SESSION["NUM_LOCATIONS"] = $numLocations; $bFinish = false; //echo "<script>Import(1, {AMOUNT:".CUtil::JSEscape($amount).",POS:".CUtil::JSEscape($cur_step)."})</script>"; $arReturn['STEP'] = 1; $arReturn['AMOUNT'] = $amount; $arReturn['POS'] = $cur_step; break; } } } if ($bFinish) { unset($_SESSION["LOC_POS"]); $strOK = GetMessage('SL_IMPORT_LOC_STATS') . '<br />'; $strOK = str_replace('#NUMCOUNTRIES#', intval($numCountries), $strOK); $strOK = str_replace('#NUMREGIONES#', intval($numRegiones), $strOK); $strOK = str_replace('#NUMCITIES#', intval($numCities), $strOK); $strOK = str_replace('#NUMLOCATIONS#', intval($numLocations), $strOK); $arReturn['MESSAGE'] = $strOK; $arReturn['STEP'] = $LOADZIP == "Y" ? 2 : 3; //echo '<script>Import('.($LOADZIP == "Y" ? 2 : 3).')</script>'; } break; case 2: $time_limit = ini_get('max_execution_time'); if ($time_limit < ZIP_STEP_LENGTH) { set_time_limit(ZIP_STEP_LENGTH + 5); } $start_time = time(); $finish_time = $start_time + ZIP_STEP_LENGTH; if ($LOADZIP == "Y" && file_exists($sTmpFilePath . DLZIPFILE)) { $rsLocations = CSaleLocation::GetList(array(), array("LID" => 'ru'), false, false, array("ID", "CITY_NAME_LANG", "REGION_NAME_LANG")); $arLocationMap = array(); while ($arLocation = $rsLocations->Fetch()) { if (strlen($arLocation["REGION_NAME_LANG"]) > 0) { if (strlen($arLocation["CITY_NAME_LANG"]) > 0) { $arLocationMap[$arLocation["CITY_NAME_LANG"]][$arLocation["REGION_NAME_LANG"]] = $arLocation["ID"]; } } else { $arLocationMap[$arLocation["CITY_NAME_LANG"]] = $arLocation["ID"]; } } $DB->StartTransaction(); include_once $_SERVER["DOCUMENT_ROOT"] . "/bitrix/modules/main/classes/general/csv_data.php"; $csvFile = new CCSVData(); $csvFile->LoadFile($sTmpFilePath . DLZIPFILE); $csvFile->SetFieldsType("R"); $csvFile->SetFirstHeader(false); $csvFile->SetDelimiter(";"); if (is_set($_SESSION, 'ZIP_POS')) { $numZIP = $_SESSION["NUM_ZIP"]; $csvFile->SetPos($_SESSION["ZIP_POS"]); } else { CSaleLocation::ClearAllLocationZIP(); unset($_SESSION["NUM_ZIP"]); $numZIP = 0; } $bFinish = true; $tt = 0; $REGION = ""; while ($arRes = $csvFile->Fetch()) { $tt++; $CITY = $arRes[1]; if (strlen($arRes[3]) > 0) { $REGION = $arRes[3]; } if (array_key_exists($CITY, $arLocationMap)) { if (strlen($REGION) > 0) { $ID = $arLocationMap[$CITY][$REGION]; } else { $ID = $arLocationMap[$CITY]; } } else { $ID = 0; } if ($ID) { CSaleLocation::AddLocationZIP($ID, $arRes[2]); $numZIP++; } if ($tt == 10) { $tt = 0; $cur_time = time(); if ($cur_time >= $finish_time) { $cur_step = $csvFile->GetPos(); $amount = $csvFile->iFileLength; $_SESSION["ZIP_POS"] = $cur_step; $_SESSION["NUM_ZIP"] = $numZIP; $bFinish = false; $arReturn['STEP'] = 2; $arReturn['AMOUNT'] = $amount; $arReturn['POS'] = $cur_step; break; } } } $DB->Commit(); if ($bFinish) { unset($_SESSION["ZIP_POS"]); $numCity = CSaleLocation::_GetZIPImportStats(); $strOK = GetMessage('SL_IMPORT_ZIP_STATS'); $strOK = str_replace('#NUMZIP#', intval($numZIP), $strOK); $strOK = str_replace('#NUMCITIES#', intval($numCity["CITY_CNT"]), $strOK); $arReturn['MESSAGE'] = $strOK; $arReturn['STEP'] = 3; $arReturn['PB_REMOVE'] = true; break; } } else { $arReturn['ERROR'] = GetMessage('SL_IMPORT_ERROR_NO_ZIP_FILE') . '<br>'; $arReturn['STEP'] = 3; break; } break; case 3: $arReturn['COMPLETE'] = true; break; } } return $arReturn; }
Array( "COUNTRY_ID" => $CurCountryID, "REGION_NAME"=>$arArrayTmp["NAME"], "LID" => $DefLang ) ); if ($arRegionList = $db_rengList->Fetch()) { $LLL = $arRegionList["ID"]; $CurRegionID = IntVal($arRegionList["REGION_ID"]); } } if (IntVal($CurRegionID) <= 0) { $CurRegionID = CSaleLocation::AddRegion($arArrayTmp); $CurRegionID = IntVal($CurRegionID); if ($CurRegionID > 0) { $numRegiones++; if (IntVal($LLL) <= 0) { $LLL = CSaleLocation::AddLocation(array("COUNTRY_ID" => $CurCountryID, "REGION_ID" => $CurRegionID)); if (IntVal($LLL)>0) $numLocations++; } } } } elseif ($type == "T" && IntVal($CurCountryID)>0) //city { $city_id = 0;
function Update($ID, $arFields) { global $DB; if (!CSaleLocation::CheckFields("UPDATE", $arFields)) return false; if (!($arLocRes = CSaleLocation::GetByID($ID, LANGUAGE_ID))) return false; if(self::isLocationProMigrated()) { try { // only partial support: name update functionality if(($arFields["CHANGE_COUNTRY"]=="Y" || intval($arFields["COUNTRY_ID"])) && is_array($arFields["COUNTRY"])) CSaleLocation::UpdateCountry($arFields["COUNTRY_ID"], $arFields["COUNTRY"]); if(intval($arFields["REGION_ID"]) && is_array($arFields["REGION"])) CSaleLocation::UpdateRegion($arFields["REGION_ID"], $arFields["REGION"]); if(intval($arFields["CITY_ID"]) && is_array($arFields["CITY"])) CSaleLocation::UpdateCity($arFields["CITY_ID"], $arFields["CITY"]); } catch(Exception $e) { return false; } } else { if ((!is_set($arFields, "COUNTRY_ID") || IntVal($arFields["COUNTRY_ID"])<=0) && $arFields["COUNTRY_ID"] != "") { $arFields["COUNTRY_ID"] = CSaleLocation::AddCountry($arFields["COUNTRY"]); if (IntVal($arFields["COUNTRY_ID"])<=0) return false; UnSet($arFields["CITY_ID"]); UnSet($arFields["REGION_ID"]); CSaleLocation::AddLocation($arFields); } elseif ($arFields["CHANGE_COUNTRY"]=="Y" || $arFields["COUNTRY_ID"] == "") { CSaleLocation::UpdateCountry($arFields["COUNTRY_ID"], $arFields["COUNTRY"]); } //city if ($arFields["WITHOUT_CITY"]!="Y") { if (IntVal($arLocRes["CITY_ID"])>0) { CSaleLocation::UpdateCity(IntVal($arLocRes["CITY_ID"]), $arFields["CITY"]); } else { $arFields["CITY_ID"] = CSaleLocation::AddCity($arFields["CITY"]); if (IntVal($arFields["CITY_ID"])<=0) return false; } } else { CSaleLocation::DeleteCity($arLocRes["CITY_ID"]); $arFields["CITY_ID"] = false; } //region if (IntVal($arFields["REGION_ID"])>0) { CSaleLocation::UpdateRegion(IntVal($arLocRes["REGION_ID"]), $arFields["REGION"]); } elseif ($arFields["REGION_ID"] == 0 && $arFields["REGION_ID"] != '') { $db_res = CSaleLocation::GetRegionList(array("ID" => "DESC"), array("NAME" => $arFields["REGION"][LANGUAGE_ID]["NAME"])); $arRegion = $db_res->Fetch(); if (count($arRegion) > 1) $arFields["REGION_ID"] = $arRegion["ID"]; else { $arFields["REGION_ID"] = CSaleLocation::AddRegion($arFields["REGION"]); if (IntVal($arFields["REGION_ID"])<=0) return false; $arFieldsTmp = $arFields; UnSet($arFieldsTmp["CITY_ID"]); CSaleLocation::AddLocation($arFieldsTmp); } } elseif ($arFields["REGION_ID"] == '') { //CSaleLocation::DeleteRegion($arLocRes["REGION_ID"]); $arFields["REGION_ID"] = 0; } else { UnSet($arFields["REGION_ID"]); } CSaleLocation::UpdateLocation($ID, $arFields); return $ID; } }