Your IP : 18.223.214.17


Current Path : /home/bitrix/ext_www/rk_shared_core/bitrix/admin/
Upload File :
Current File : /home/bitrix/ext_www/rk_shared_core/bitrix/admin/offersgroup_save.php

<?
use Bitrix\Main\Loader;
use Webprofy\Offersgroup\MainTable;
use Webprofy\Offersgroup\Message;
use Webprofy\Offersgroup\OffersGroupMain;
use Webprofy\Offersgroup\PropertiesMain;
use Webprofy\Offersgroup\RelationMain;
use Webprofy\Offersgroup\Conflicts;

require_once($_SERVER["DOCUMENT_ROOT"] . "/bitrix/modules/main/include/prolog_admin_before.php");
Loader::includeModule('webprofy.offersgroup');
Loader::includeModule('iblock');
Loader::includeModule('catalog');

$lockFile = $_SERVER["DOCUMENT_ROOT"] . "/local/combinations.tmp";

if(!$_POST){
	return;
}


$arData = []; //Массив с данными из post
$resultResponse = [];//Массив для сбора ответов от методов
$arPropertyFormat = []; //Массив с группировкой по кодам справочников
$arProperty = []; //Массив с группировкой по id справочника
$resAdd = []; //Массив для добавленных элементов
$arDeleted = []; //Массив для удаленных элементов

if($_POST['data']){
	$arData = $_POST['data'];
}
//id группы
$groupID = intval($arData['groupID']);

//Цена группы
$price = intval($arData['PRICE']);

//Активность
$active = ($arData['active'] == 'true') ? 1 : 0;

//Если действие Сохранить как новую группу, то создадим
if(($_POST['action'] == 'save-new-group') || !$groupID){
	$groupID = OffersGroupMain::createGroup($active);
	$resultResponse['createGroup'] = $groupID;
	$active = 1;
}

if(!$groupID){
	return;
}

//Текущие значения по данной группе
$existProperty = OffersGroupMain::getPropertiesID($groupID);
$existsProduct = PropertiesMain::getProductsByGroup($groupID);


//Выбрать все справочники
$allRelation = RelationMain::getAllReference();

//Сохранить наборы значений Для справочников
foreach ($arData as $key => $item) {
	$del = false;
	//Сохраняем справочники
	if (strrpos($key, 'reference') === false) {
		continue;
	}
	$referenceID = preg_replace('/[^0-9]/', '', $key);

	$arProperty[$referenceID] = $item;
	$arPropertyFormat[$allRelation[$referenceID]['RELATION_CODE']] = PropertiesMain::getHLData($item,
		$allRelation[$referenceID]['RELATION_BITRIX_ID'], true);

	//найдем все удаленные свойства вычитанием массивов: существующие свойства - выбранные свойства,
	if ($existProperty[$referenceID] ) {
		$del = array_diff($existProperty[$referenceID], $item);
	}

	if(empty($item)){
		$del = $existProperty[$referenceID];
	}

	if (!empty($del)) {
		$arDeleted[$allRelation[$referenceID]['RELATION_CODE']] = $del;
	}


	if (is_array($item)) {
		foreach ($item as $key => $value) {
			//если в существующих свойствах есть такой справочник, то проверим наличие этого элемента в нем
			if ($existProperty[$referenceID] && in_array($value, $existProperty[$referenceID])) {
				continue;
			}
			//Свойства нет, добавим его в таблицу
			$resAdd[] = \Webprofy\Offersgroup\PropertiesTable::add(array(
				'GROUP_ID' => $groupID,
				'VALUE_ID' => $value,
				'VALUE_XML_ID' => $arPropertyFormat[$allRelation[$referenceID]['RELATION_CODE']][$value],
				'RELATION_ID' => $referenceID
			))->getId();
		}
	}

}
$message = print_r($arDeleted, true);
error_log('<pre>'.date('Y/m/d H:i:s')."\n".$message.'</pre>' . "\n", 3, $_SERVER['DOCUMENT_ROOT'] . '/test.log');


//Сохранить товары
if($arData['products'] && is_array($arData['products'])){
	//Получить ID связи торгового каталога, и сам RELATION_ID каталога
	$arProductsInfo = RelationMain::getProductsInfo();
	$productIblockID = $arProductsInfo['RELATION_BITRIX_ID'];
	$productRelationID = $arProductsInfo['ID'];

	//найдем все удаленные свойства вычитанием массивов: существующие свойства - выбранные свойства,
	if($existsProduct){
		$arDeletedProducts = array_diff($existsProduct, $arData['products']);
	}


	foreach($arData['products'] as $productID){
		if($existsProduct && in_array($productID, $existsProduct)){
			continue;
		}

		$resAdd[] = \Webprofy\Offersgroup\PropertiesTable::add(array(
			'GROUP_ID' => $groupID,
			'VALUE_ID' => $productID,
			'VALUE_XML_ID' => 'product',
			'RELATION_ID' => $productRelationID
		))->getId();
	}
}

$arProductsInfo = RelationMain::getProductsInfo();
$productIblockID = $arProductsInfo['RELATION_BITRIX_ID'];
//Получить ID каталога и id свойств
$arCatalog = \CCatalog::GetByID($productIblockID);
if(!$arCatalog){
	return;
}
//Получить Названия товаров
$productsName = PropertiesMain::getIblockData($arData['products'], $productIblockID);

$offersIblockID = $arCatalog['OFFERS_IBLOCK_ID']; // ID предложений
$offersSkuProperty = $arCatalog['OFFERS_PROPERTY_ID']; // ID свойства "Привязка к товарам (SKU)"
$arExistsOffers = PropertiesMain::searchOffer($groupID, $arData['products'], $offersIblockID);


foreach($arData['products'] as $productID){
	//Сформируем массив для добавление Торг.предложения
	$arFields = array(
		'NAME' => $productsName[$productID],
		'IBLOCK_ID' => $offersIblockID,
		'ACTIVE' => $active ? "Y" : 'N',
		'PROPERTY_VALUES' => $arPropertyFormat,
	);
	$arFields['PROPERTY_VALUES']['COMBINATION_CODE'] = $groupID;
	//Добавим привязку к товару
	$arFields['PROPERTY_VALUES'][$offersSkuProperty] = $productID;

	if(isset($arExistsOffers[$productID])){
		//update
		foreach($arExistsOffers[$productID] as $offerID){
			$updated[] = PropertiesMain::updateOffers($offerID, $arFields, $price);
		}
	} else{
		//add
		if($addedID = PropertiesMain::addOffer($arFields, $price)){
			$added[] = $addedID;
		}
	}
}

$arConflicts = Conflicts::isConflict($groupID, $arData['products'], $arProperty);
$arGroupInfo = []; //Массив свойств группы

if(!empty($arConflicts)){
	$active = 0;
	$resultResponse['conflicts'] = true;
} elseif(!$resultResponse['createGroup']){
	$resultResponse['save'] = $groupID;
}

if($price){
	$arGroupInfo['PRICE'] = $price;
}

$arGroupInfo['ACTIVE'] = $active;

MainTable::update($groupID, $arGroupInfo);

if (!empty($arDeleted)) {
	PropertiesMain::deletePropertyByGroupAndValue($groupID, $arDeleted);
}


//    if (!empty($arDeletedProducts)) {
//        $_SESSION['WP_OFFERS'][$_POST['mode']] = PropertiesMain::switchProductsModeBeforeAction($_POST['mode'], $groupID,
//            $arDeletedProducts);
//        $_SESSION['WP_OFFERS']['deleted_product'] = PropertiesMain::deletePropertyByGroupAndProduct($groupID,
//            $arDeletedProducts);
//    }

//Дополнительно передача id группы, для обновления формы и селекторов
$resultResponse['groupID'] = $groupID;
$resultResponse['productsName'] = implode(', ', $productsName);
if(!empty($added)){
	$resultResponse['added'] = count($added);
}

if(!empty($updated)){
	$resultResponse['updated'] = count($updated);
}

return Message::sendGroupMessage(array($groupID => $resultResponse), true);