Битрикс — пакетное обновление цен товаров по ценам торговых предложений

18.12.2018  11:02

Штатная ситуация, когда в 1С бардак, а на сайте на Битриксе есть сортировка товаров по ценам. Если одинэсник не может у себя навести порядок и наладить корректные обмен сайта и 1С, сделаем сами скриптом. Скрипт простой: выбираются товары, для каждого его торговые предложения и минимальная цена — её записываю в базовую цену товара.

$_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');
$IBLOCK_ID = 1;// id каталога товаров
$IBLOCK_ID_OFFERS = 2;// id инфоблока торговых предложений
$PRICE_TYPE_ID = 1;
$CURRENCY = 'RUB';
$filterFields = Array(
	0 => "ID",
	1 => "IBLOCK_ID",
	2 => "NAME",
);
$c = 0;
$c2 = 0;
$arFilter = Array(
   "IBLOCK_ID"=>$IBLOCK_ID,
   // "ID"=>123,// для проверки по одному товару, чтоб не облажаться
   "ACTIVE" => "Y",
);
$res = CIBlockElement::GetList(Array("ID"=>"ASC"), $arFilter, $filterFields);
while ($ar_fields = $res->GetNext()) {
	$c2++;
	unset($prices,$minPrice,$pricesArr);// обнуляем массивы цен
	// выбираем торговые предложения товара:
	$filterFieldsOffers = Array(
		0 => "ID",
		1 => "IBLOCK_ID",
	);
	$arFilterOffers = Array(
		"IBLOCK_ID"=>$IBLOCK_ID_OFFERS,
		"PROPERTY_CML2_LINK"=>$ar_fields['ID'],
		"ACTIVE" => "Y",
	);
	$resOffers = CIBlockElement::GetList(Array("ID"=>"ASC"), $arFilterOffers, $filterFieldsOffers);
	while ($ar_fieldsOffers = $resOffers->GetNext()) {
		$ID = $ar_fieldsOffers["ID"];
		$resItem = CPrice::GetList(
			array(),
			array(
                "PRODUCT_ID" => $ID,
                "CATALOG_GROUP_ID" => $PRICE_TYPE_ID
            )
		);
		if ($arrItem = $resItem->Fetch())
		{
			$prices[] = $arrItem;
		}
		else
		{
			// $id = CPrice::Add($arFields);
		}
	}
	if(!empty($prices)){
		foreach($prices as $v){
			$pricesArr[] = $v['PRICE'];
		}
		$minPrice = min($pricesArr);//выбор минимальной цены
	}
	if(!empty($minPrice)){
		$arFields = Array(
			"PRODUCT_ID" => $ar_fields["ID"],
			"CATALOG_GROUP_ID" => $PRICE_TYPE_ID,
			"PRICE" => $minPrice,
			// "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,
		);
		$obE = new CIBlockElement();
		if ($obE->Update($ar_fields["ID"], $arFields_update)){
			// $arMessages[] = ''.$name.' update';
			// $c++;
		}
	}
}
echo 'fin '.$c.'_'.$c2;// сколько всего товаров и сколько обновлено
if($c > 0){
	BXClearCache(true, "/");// очистка кеша
}


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



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

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


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

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


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