Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- <?
- $_SERVER['DOCUMENT_ROOT']="/home/bitrix/www";
- define("NO_KEEP_STATISTIC", true);
- define("NOT_CHECK_PERMISSIONS", true);
- // подгружаем пролог
- require($_SERVER["DOCUMENT_ROOT"]."/bitrix/modules/main/include/prolog_before.php");
- // отключаем таймаут
- set_time_limit(0);
- // ограничения по памяти
- ini_set('memory_limit', '2048M');
- // выполняем все действия от админа битрикса
- global $USER;
- $USER->Authorize(1);
- CModule::IncludeModule('iblock');
- $start = microtime(true);
- //Считываем инфоблоки в массивы
- $iblock_ids = array(2,1,3,4); // id инфоблоков для считывания
- $arSelect = array(
- "IBLOCK_NAME",
- "ID",
- "NAME",
- "IBLOCK_SECTION_ID",
- "PROPERTY_22", // Код производителя товара ELKO (manufacturerCode)
- "PROPERTY_3", // Артикул Treolan (articul)
- "PROPERTY_31", // Номер партии OCS (PartNumber)
- "PROPERTY_25", // Цена товара ELKO (price)
- "PROPERTY_27", // Количество товара на складе ELKO (quantityInStock)
- "PROPERTY_19", // Идентификатор позиции ELKO (id)
- "PROPERTY_7", // Цена Treolan (price)
- "PROPERTY_1", // Идентификатор позиции Treolan (id)
- "PROPERTY_39", // Цена товара RUR OCS (priceRUR)
- "PROPERTY_30", // Идентификатор позиции OCS (id)
- "PROPERTY_65", // Артикул Market (articul)
- "PROPERTY_68", // Количество на складе OCS (Amount)
- "PROPERTY_14", // Количество на складе Treolan (freenom)
- "PROPERTY_53", // Цена товара Market (price_elko)
- "PROPERTY_54", // Цена товара Market (price_treolan)
- "PROPERTY_55", // Цена товара Market (price_ocs)
- "PROPERTY_56", // Количество на складе Market (amount_elko)
- "PROPERTY_57", // Количество на складе Market (amount_treolan)
- "PROPERTY_58", // Количество на складе Market (amount_ocs)
- );
- // Выборка элементов указанных инфоблоков
- $rsElement = CIBlockElement::GetList(array(), array("IBLOCK_ID" => $iblock_ids, "ACTIVE" => "Y", "SECTION_ACTIVE" => "Y", "SECTION_GLOBAL_ACTIVE" => "Y"), false, false, $arSelect);
- while($arElement = $rsElement->Fetch())
- {
- $elems[$arElement["IBLOCK_NAME"]][] = $arElement;
- }
- // Массивы с элементами инфоблоков
- $elkoArr = $elems["ELKO"];
- $treolanArr = $elems["Treolan"];
- $ocsArr = $elems["OCS"];
- $marketArr = $elems["Market"];
- if (count($marketArr)==0){$marketArr=array();}
- //Считываем инфоблок market в массив - END
- $arFilter = array(
- 'IBLOCK_ID' => 3,
- 'ACTIVE' => 'Y',
- 'GLOBAL_ACTIVE' => 'Y',
- );
- $dbSection = CIBlockSection::GetList(array(), $arFilter, false);
- while( $arSection = $dbSection-> GetNext() ){
- $sections[] = $arSection;
- }
- $no_parent = 0;
- $parent = 0;
- $upd_sect = 0;
- function getSectionIdByCode($iblock_id, $sCategory) {
- $dbSection = CIBlockSection::GetList(
- Array(),
- Array(
- 'IBLOCK_ID' => $iblock_id,
- 'ACTIVE' => 'Y',
- 'CODE' => $sCategory,
- ),
- false
- );
- while( $arSection = $dbSection-> GetNext() ){
- $SID[] = $arSection['ID'];
- }
- return ($SID[0]);
- }
- function getSectionCodeByID($sec_id) {
- return CIBlockSection::GetByID($sec_id)->GetNext()['CODE'];
- }
- function createSection($iblock_id, $code, $name, $sCategory) {
- global $ID;
- $bs = new CIBlockSection;
- $arFields = Array(
- "ACTIVE" => "Y",
- "CODE" => $code,
- "IBLOCK_ID" => $iblock_id,
- "IBLOCK_SECTION_ID" => (!empty($sCategory) ? getSectionIdByCode($iblock_id, $sCategory) : ""),
- "NAME" => $name,
- "SORT" => "500"
- );
- $ID = $bs->Add($arFields);
- }
- // перебор разделов OCS
- foreach ($sections as $sec) {
- if (empty(getSectionIdByCode(4, $sec["CODE"]))) {
- if (!$sec["IBLOCK_SECTION_ID"]) {
- $no_parent++;
- createSection(4, $sec["CODE"], $sec["NAME"], "");
- } else {
- $parent++;
- createSection(4, $sec["CODE"], $sec["NAME"], getSectionCodeByID($sec["IBLOCK_SECTION_ID"]));
- }
- } else {
- $upd_sect++;
- $bs = new CIBlockSection;
- $arFields = Array(
- "IBLOCK_SECTION_ID" => (!empty($sec["IBLOCK_SECTION_ID"]) ? getSectionIdByCode(4, $sec["CODE"]) : ""),
- "IBLOCK_ID" => 4,
- "NAME" => $sec["NAME"],
- );
- $res = $bs->Update(getSectionIdByCode(4, $sec["CODE"]), $arFields);
- }
- }
- // Функция поиска товара по свойству - возвращает id битрикс товара
- function searchElementArr($prop_id, $value, $array) // ("КОД_СВОЙСТВА_ПО_КОТОРОМУ_ИЩЕМ", "ЗНАЧЕНИЕ_СВОЙСТВА", "МАССИВ_ГДЕ_ИЩЕМ")
- {
- foreach ($array as $i => $element) {
- if ($element["PROPERTY_".$prop_id."_VALUE"] == $value) {
- return $element["ID"];
- }
- }
- }
- function getNewAmount($str)
- {
- $str = preg_replace('/\s/', '', $str);
- if (preg_match('/>/', $str)) {
- $result = preg_replace('/>/', '', $str);
- } elseif (preg_match('/</', $str)) {
- $result = floor((preg_replace('/</', '', $str))/2);
- } elseif ($str == "много") {
- $result = 100;
- } elseif ($str == "мало") {
- $result = 7;
- } else $result = $str;
- return $result;
- }
- $add_chk=0;
- $edit_chk=0;
- $dub_chk=0;
- // Функция перебора товаров для склейки
- function main_cycle($vname,$varray) // vname=elco,treolan,ocs
- {
- global $marketArr,$add_chk,$edit_chk,$dub_chk;
- switch ($vname) {
- case "elko":
- $art_id = "22";
- $price_id = "25";
- $amount_id = "27";
- $api_code_id = "19";
- $vendor_name="ELKO";
- break;
- case "treolan":
- $art_id = "3";
- $price_id = "7";
- $amount_id = "14";
- $api_code_id = "1";
- $vendor_name="TREOLAN";
- break;
- case "ocs":
- $art_id = "31";
- $price_id = "39";
- $amount_id = "68";
- $api_code_id = "30";
- $vendor_name="OCS";
- break;
- }
- foreach ($varray as $i => $elem) {
- if (!empty($elem["IBLOCK_SECTION_ID"])) {
- $articul = $elem["PROPERTY_".$art_id."_VALUE"];
- $search_id=null;
- $search_id = searchElementArr(65,$articul,$marketArr);
- $amount_new = getNewAmount($elem["PROPERTY_".$amount_id."_VALUE"]);
- settype($elem["PROPERTY_".$price_id."_VALUE"],'float');
- if ($vname == 'ocs') {
- $sec_code = getSectionCodeByID($elem["IBLOCK_SECTION_ID"]);
- $sec_id_market = getSectionIdByCode(4, $sec_code);
- $sid = $sec_id_market;
- } else {
- $sid = null;
- }
- $el = new CIBlockElement;
- $arLoadProductAdd = Array(
- "IBLOCK_SECTION_ID" => $sid,
- "IBLOCK_ID" => 4,
- "PROPERTY_VALUES" => array(
- "name_".$vname => $elem["NAME"],
- "price_".$vname => $elem["PROPERTY_".$price_id."_VALUE"],
- "amount_".$vname => $amount_new,
- "id_bitrix_".$vname => $elem["ID"],
- "id_api_".$vname => $elem["PROPERTY_".$api_code_id."_VALUE"],
- "articul" => $articul,
- ),
- (!is_numeric($elem["NAME"]) ? "NAME" : "") => (!is_numeric($elem["NAME"]) ? html_entity_decode($elem["NAME"]) : ""),
- "ACTIVE" => "Y",
- );
- $propsUpdate = Array(
- "name_".$vname => $elem["NAME"],
- "price_".$vname => $elem["PROPERTY_".$price_id."_VALUE"],
- "amount_".$vname => $amount_new,
- "id_bitrix_".$vname => $elem["ID"],
- "id_api_".$vname => $elem["PROPERTY_".$api_code_id."_VALUE"],
- );
- if (empty($search_id)) {
- if (!empty($amount_new)) {
- // добавляем товар
- $add_chk++;
- $id = $el->Add($arLoadProductAdd);
- array_push($marketArr, array(
- "ID" => $id,
- (!is_numeric($elem["NAME"]) ? "NAME" : "") => (!is_numeric($elem["NAME"]) ? html_entity_decode($elem["NAME"]) : ""),
- "IBLOCK_SECTION_ID" => $sid,
- "PROPERTY_".$price_id."_VALUE" => $elem["PROPERTY_".$price_id."_VALUE"],
- "PROPERTY_".$amount_id."_VALUE" => $amount_new,
- "PROPERTY_".$api_code_id."_VALUE" => $elem["PROPERTY_".$api_code_id."_VALUE"],
- "PROPERTY_65_VALUE" => $articul,
- "sys_".$vendor_name => 1, // отмечаем в текущем элементе, что текущий артикул уже получен из инфоблока вендора
- ));
- }
- } else {
- // обновляем секцию свойств
- foreach ($marketArr as $i => $elemArr) {
- if ($elemArr["ID"] == $search_id) {
- // если [sys_VENDORNAME] равно 1,то выполняем блок условий для сплита одинаковых артикулов вендора или делаем пуш
- $el_upd = new CIBlockElement;
- if ($elemArr["sys_".$vendor_name]<>1) // если не было взаимодействия по текущему артикулу
- {
- unset($marketArr[$i]);
- array_push($marketArr, array(
- "ID" => $search_id,
- (!is_numeric($elem["NAME"]) ? "NAME" : "") => (!is_numeric($elem["NAME"]) ? html_entity_decode($elem["NAME"]) : ""),
- ($vname !== 'ocs' ? "IBLOCK_SECTION_ID" : "") => ($vname !== 'ocs' ? $sid : ""),
- "PROPERTY_".$price_id."_VALUE" => $elem["PROPERTY_".$price_id."_VALUE"],
- "PROPERTY_".$amount_id."_VALUE" => $amount_new,
- "PROPERTY_".$api_code_id."_VALUE" => $elem["PROPERTY_".$api_code_id."_VALUE"],
- "PROPERTY_65_VALUE" => $articul,
- "sys_".$vendor_name => 1, // отмечаем в текущем элементе, что текущий артикул уже получен из инфоблока вендора
- ));
- $edit_chk++;
- $el_upd->Update($search_id, [(!is_numeric($elem["NAME"]) ? "NAME" : "") => (!is_numeric($elem["NAME"]) ? html_entity_decode($elem["NAME"]) : ""),
- ($vname !== 'ocs' ? "IBLOCK_SECTION_ID" : "") => ($vname !== 'ocs' ? $sid : ""),
- ]);
- $el->SetPropertyValuesEx($search_id, 4, $propsUpdate);
- }
- else
- {
- // Блок обработки дубликата товара по артикулу для текущего вендора
- $dub_chk++;
- if ($elemArr["PROPERTY_".$amount_id."_VALUE"] < $amount_new) {
- unset($marketArr[$i]);
- array_push($marketArr, array(
- "ID" => $search_id,
- (!is_numeric($elem["NAME"]) ? "NAME" : "") => (!is_numeric($elem["NAME"]) ? html_entity_decode($elem["NAME"]) : ""),
- ($vname !== 'ocs' ? "IBLOCK_SECTION_ID" : "") => ($vname !== 'ocs' ? $sid : ""),
- "PROPERTY_".$price_id."_VALUE" => $elem["PROPERTY_".$price_id."_VALUE"],
- "PROPERTY_".$amount_id."_VALUE" => $amount_new,
- "PROPERTY_".$api_code_id."_VALUE" => $elem["PROPERTY_".$api_code_id."_VALUE"],
- "PROPERTY_65_VALUE" => $articul,
- "sys_".$vendor_name => 1, // отмечаем в текущем элементе, что текущий артикул уже получен из инфоблока вендора
- ));
- $edit_chk++;
- $el_upd->Update($search_id, [(!is_numeric($elem["NAME"]) ? "NAME" : "") => (!is_numeric($elem["NAME"]) ? html_entity_decode($elem["NAME"]) : ""),
- ($vname !== 'ocs' ? "IBLOCK_SECTION_ID" : "") => ($vname !== 'ocs' ? $sid : ""),
- ]);
- $el->SetPropertyValuesEx($search_id, 4, $propsUpdate);
- }
- }
- }
- }
- }
- }
- }
- }
- main_cycle("ocs",$ocsArr);
- main_cycle("elko",$elkoArr);
- main_cycle("treolan",$treolanArr);
- // выборка элементов из инфоблока Market
- $updElement = CIBlockElement::GetList(array(), array("IBLOCK_ID" => 4), false, false, $arSelect);
- while($arUpdElement = $updElement->Fetch())
- {
- $updMarket[] = $arUpdElement;
- }
- // перебор массива Market и изменение кол-ва и цены.
- foreach ($updMarket as $i => $product) {
- $upd_el = new CIBlockElement;
- $numProps1 = [56, 57, 58];
- $amount = array_sum(array_map(function($n) use ($product) {
- return $product['PROPERTY_' . $n . '_VALUE'];
- }, $numProps1));
- $numProps2 = [53, 54, 55];
- $price = min(array_filter(array_map(function($n) use ($product) {
- return $product['PROPERTY_' . $n . '_VALUE'];
- }, $numProps2)));
- $arLoadUpdProduct = [
- 'amount' => $amount,
- 'price' => $price
- ];
- $upd_el->SetPropertyValuesEx($product["ID"], 4, $arLoadUpdProduct);
- }
- $finish = microtime(true);
- $delta = $finish - $start;
- echo round($delta, 2)." сек. \n";
- echo "Создано не родительских разделов: ".$no_parent."\n";
- echo "Создано родительских разделов: ".$parent."\n";
- echo "Изменено разделов: ".$upd_sect."\n";
- echo "Добавлено: ".$add_chk."\n";
- echo "Изменено: ".$edit_chk."\n";
- echo "Дубликатов: ".$dub_chk."\n";
- ?>
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement