Битрикс — изменение цен товаров по прайс-листу в csv / Excel

19.01.2019  10:48

Есть прайс-лист в Excel (csv) с артикулами, названиями и ценами. Названия и артикулы на сайте чуть отличаются, зато в названиях на сайте есть артикул. Проще было бы сделать по артикулам, если бы они в точности совпадали.

Скрипт обхода csv-файла и обновления цен по API:

$_SERVER["DOCUMENT_ROOT"] = realpath(dirname(__FILE__)."/..");
require_once ($_SERVER["DOCUMENT_ROOT"]."/bitrix/modules/main/include/prolog_before.php");
CModule::IncludeModule("iblock");
CModule::IncludeModule("catalog");
CModule::IncludeModule("sale");
if ( !$USER->IsAdmin() ) {
    $APPLICATION->AuthForm("");
}
set_time_limit(0);
ini_set('max_execution_time', '3600');
ini_set('memory_limit', '512M');
// phpinfo();exit;
$IBLOCK_ID = 12;// id каталога товаров 12
$IBLOCK_ID_OFFERS = 13;// id инфоблока торговых предложений 13
$PRICE_TYPE_ID = 1;
$CURRENCY = 'RUB';
$row = 1;
$c = 0;
$c2 = 0;
$c_empty = 0;
$file_csv = $_SERVER["DOCUMENT_ROOT"]."/upload/price_hartman.csv";
if (($handle = fopen($file_csv, "r")) !== FALSE) {
    while (($data = fgetcsv($handle, 2000, ";")) !== FALSE) {
        $num = count($data);
        // echo "

$num полей в строке $row:

n"; $row++; // for ($c=0; $c < $num; $c++) {// обход колонок в csv // echo $c.':'.$data[$c] . "
n"; // if($c==0) // } $article = $data[0]; $name = $data[1]; $price = $data[5]; $price = str_replace(",",".",$price); $price = str_replace(" ","",$price); $article = trim($article); $name = trim($name); $price = trim($price); $price = ceil($price); echo $article.'
'; if(!empty($article) && !empty($price)) { $filterFields = Array( 0 => "ID", 1 => "IBLOCK_ID", 2 => "NAME", 3 => "PROPERTY_CML2_ARTICLE", ); $arFilter = Array( "IBLOCK_ID"=>$IBLOCK_ID, "NAME" => "%".$article."%",// выбор товаров по артикулам в названиях // "=PROPERTY_CML2_ARTICLE" => "".$article."",// выбор товаров по артикулам // "ID"=>123,// для проверки по одному товару, чтоб не облажаться // "PROPERTY_PRICE_OLD" => false, "ACTIVE" => "Y", ); $res = CIBlockElement::GetList(Array("ID"=>"ASC"), $arFilter, $filterFields); if ($ar_fields = $res->GetNext()) { echo $ar_fields["ID"].' - '.$ar_fields["NAME"].' - '.$price.'
'; // $c++; //////////////// prices / цены товаров $arFields = Array( "PRODUCT_ID" => $ar_fields["ID"], "CATALOG_GROUP_ID" => $PRICE_TYPE_ID, "PRICE" => $price, // "EXTRA_ID" => $EXTRA_ID,//id наценки "CURRENCY" => $CURRENCY, // "QUANTITY_FROM" => 1, // "QUANTITY_TO" => 10 ); $resCat = CPrice::GetList( array(), array( "PRODUCT_ID" => $ar_fields["ID"], "CATALOG_GROUP_ID" => $PRICE_TYPE_ID ) ); if ($arrCat = $resCat->Fetch()) { $id = CPrice::Update($arrCat["ID"], $arFields); $c++; } else { $id = CPrice::Add($arFields); $c++; } $arFields_update = Array( "ACTIVE" => "Y", "IBLOCK_ID" => $IBLOCK_ID, ); // $arProps["PRICE_OLD"] = $price; $obE = new CIBlockElement(); if ($obE->Update($ar_fields["ID"], $arFields_update)){ // CIBlockElement::SetPropertyValuesEx($ID, $IBLOCK_ID, $arProps);// обновление свойств товаров } //////////////// prices $arSelectOffers = array( "ID", "NAME", "IBLOCK_ID", // "IBLOCK_SECTION_ID",//added // "*",//added // "DETAIL_TEXT", "ACTIVE", "ACTIVE_DATE", "SORT", "CATALOG_QUANTITY", // "DETAIL_PICTURE", "PROPERTY_CML2_ARTICLE", ); $arFilterOffers = array( "IBLOCK_ID" => $IBLOCK_ID_OFFERS, "IBLOCK_ACTIVE" => "Y", "=PROPERTY_118" => $ar_fields["ID"], // "SECTION_ID" => $arSection["ID"], // "IBLOCK_SECTION_ID" => $arSection["ID"], "ACTIVE_DATE" => "Y", "ACTIVE" => "Y", ); $rOffers = CIBlockElement::GetList( array(), $arFilterOffers, false, false, $arSelectOffers ); while ( $arCurrentItemOffers = $rOffers->GetNext() ) { echo $arCurrentItemOffers["ID"].' - offer
'; $resOffers = CPrice::GetList( array(), array( "PRODUCT_ID" => $arCurrentItemOffers['ID'], "CATALOG_GROUP_ID" => $PRICE_TYPE_ID ) ); } } else {//add Если в прайс-листе товар есть, а на сайте нет - добавляем $obE = new CIBlockElement(); $arParams = array("replace_space"=>"-","replace_other"=>"-"); $code = Cutil::translit($name,"ru",$arParams); $arFields_insert = $arFields; $arFields_insert["IBLOCK_ID"] = $IBLOCK_ID; $arFields_insert["ACTIVE"] = "Y"; $arFields_insert["CODE"] = $code; $arFields_insert["SECTION_ID"] = 1682; $arFields_insert["IBLOCK_SECTION_ID"] = 1682; $arFields_insert["NAME"] = $name.'('.$article.')'; if ( $ID = $obE->Add($arFields_insert) ) {// добавление элемента инфоблока //////////////// prices / обновление цен $arFields = Array( "PRODUCT_ID" => $ID, "CATALOG_GROUP_ID" => $PRICE_TYPE_ID, "PRICE" => $price, // "EXTRA_ID" => $EXTRA_ID,//id наценки "CURRENCY" => $CURRENCY, // "QUANTITY_FROM" => 1, // "QUANTITY_TO" => 10 ); $resCat = CPrice::GetList( array(), array( "PRODUCT_ID" => $ID, "CATALOG_GROUP_ID" => $PRICE_TYPE_ID ) ); if ($arrCat = $resCat->Fetch()) { $id = CPrice::Update($arrCat["ID"], $arFields); $c++; } else { $id = CPrice::Add($arFields); $c++; } $arFields_update = Array( "ACTIVE" => "Y", "IBLOCK_ID" => $IBLOCK_ID, ); // $arProps["PRICE_OLD"] = $price; $obE = new CIBlockElement(); if ($obE->Update($ar_fields["ID"], $arFields_update)){ // CIBlockElement::SetPropertyValuesEx($ID, $IBLOCK_ID, $arProps);//строка для обновления свойств элементов инфоблока // $arMessages[] = ''.$name.' update'; // $c++; } else { // echo 'err';exit; } //////////////// prices } else { echo "Error: ".$obE->LAST_ERROR;exit; } $c_empty++; } // exit; } } fclose($handle); } echo 'Найдено: '.$c.' Не найдено: '.$c_empty;


Готово! Скрипт можно модернизировать под любые нужды — обновление свойств товаров, например. Те товары, которых нет на сайте, записываются в деативированную группу.
Андрей Панёвин
Здравствуйте! Я — Андрей Панёвин и занимаюсь профессиональной разработкой сайтов на платформе 1С-Битрикс (исключительно программирование). Есть вопросы по статье? Могу подсказать и помочь по скайпу (andrey.panevin.ru), WhatsApp (+7-911-091-0670) или перепиской в ВК.
1000 р./час.



перейти в Блог

Ударим лайками по бездорожью, разгильдяйству и бюрократизму!


Ключевые слова (тэги): 1С-Битрикс 54  PHP 68  web-программирование 92  

Вам есть что сказать — ну я же чую.
Высказаться о наболевшем, я выслушаю-:
Имя


email (не публикуется)