Your IP : 18.223.214.17
<?
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);