Your IP : 18.119.255.122
<?php
namespace Webprofy\Offersgroup;
class Conflicts
{
/**
* @param $productID
* @param bool $groupID
* @return array
* @throws \Bitrix\Main\ArgumentException
* Поиск групп по продуктам, с исключением текущией группы
*/
protected static function searchGroupByProduct($productID, $groupID = false)
{
$filter = array(
'VALUE_ID' => $productID,
'VALUE_XML_ID' => 'product'
);
if($groupID){
$filter['!GROUP_ID'] = $groupID;
}
return PropertiesTable::getList( array(
'filter' => $filter,
'select' => array(
'GROUP_ID'
)
)
)->fetchAll();
}
/**
* @param $groupID
* @param $relationID
* @param $arValue
* @return array|bool
* @throws \Bitrix\Main\ArgumentException
* Поиск свойств по фильтру группа, Id справочника из нашей таблицы связей, и массив значений id
*/
public static function searchPropertyByFilter($groupID, $relationID, $arValue)
{
if(!$groupID || !$relationID || empty($arValue)) return false;
$filter = array(
'VALUE_ID' => $arValue,
'GROUP_ID' => $groupID,
'RELATION_ID' => $relationID,
);
$arProperty = array();
$arResult = PropertiesTable::getList( array(
'filter' => $filter,
'select' => array(
'VALUE_ID'
)
)
)->fetchAll();
if(!empty($arResult)){
foreach ($arResult as $item) {
$arProperty[] = $item['VALUE_ID'];
}
}
return $arProperty;
}
/**
* @param $arProducts
* @param $groupID
* @return array
* Поиск групп по фильтру товарам для выбранной группы
*/
public static function searchGroupId($arProducts, $groupID = false)
{
$productsGroup = array();
foreach ($arProducts as $product) {
$conflictsProductGroup = self::searchGroupByProduct($product, $groupID);
if ($conflictsProductGroup) {
foreach ($conflictsProductGroup as $group) {
if (!in_array($group['GROUP_ID'], $productsGroup)) {
$productsGroup[] = $group['GROUP_ID'];
}
}
}
}
return self::checkActiveGroup($productsGroup);
}
/**
* @param $arGroup
* @return array
* @throws \Bitrix\Main\ArgumentException
* Проверяем активность группы
*/
protected static function checkActiveGroup($arGroup)
{
$arActiveGroup = array();
$arResult = MainTable::getList(array(
'filter'=>array(
'ID'=>$arGroup
),
'select'=>array(
'ID',
'ACTIVE'
)
));
while($res = $arResult->fetch()){
if(intval($res['ACTIVE']) > 0 ){
$arActiveGroup[] = $res['ID'];
}
}
return $arActiveGroup;
}
public static function prepareProperty($arProperty, $publicForm)
{
$arPropertyFormat = array();
foreach($arProperty as $key => $item){
if($publicForm){
if(strrpos($key, 'reference') === false){
continue;
}
}
$referenceID = preg_replace('/[^0-9]/', '', $key);
if(!empty($item)){
$arPropertyFormat[$referenceID] = $item;
}
}
$arProperty = array();
$keys = array_keys($arPropertyFormat);
sort($keys);
for ($i=0; $i<count($keys); $i++){
if (isset($arPropertyFormat[$keys[$i]])){
$arProperty[$keys[$i]] = $arPropertyFormat[$keys[$i]];
}
}
return $arProperty;
}
public static function isConflict($groupID, $arProducts, $arProperty, $publicForm = false)
{
if(!$groupID || empty($arProducts) || empty($arProperty)) return false;
if($arProperty){
$arProperty = self::prepareProperty($arProperty, $publicForm);
$productsGroup = self::searchGroupId($arProducts, $groupID);
if (!empty($productsGroup)) {
$arConflicts = array();
foreach($productsGroup as $group){
$compareGroupProperty = OffersGroupMain::getPropertiesID($group);
//Проверяем задействованные справочников в группе. Сравнение есть смысл продолжать, только если они совпадают
if(array_keys($compareGroupProperty) != array_keys($arProperty)){
continue;
}
//Ищем пересечения по матрице свойств
$intersect = array_map(function($k1, $v1, $v2){
return [$k1 => array_intersect($v1, $v2)];
}, array_keys($arProperty), $arProperty, $compareGroupProperty);
//Убираем лишнюю вложенность
$result = array();
foreach($intersect as $innerArray){
foreach($innerArray as $key => $value){
if(!empty($value)){
sort($value);
$result[$key] = $value;
}
}
}
//Если есть результат
if(!empty($result) && (count($result) == (count($arProperty)))){
$arConflicts[$group] = $result;
}
}
}
}
return $arConflicts ? $arConflicts : false;
}
public static function isConflictsDeleted($arPropertyID, $arPropertyName, $isForm = false)
{
if(!is_array($arPropertyID) || empty($arPropertyID) || !is_array($arPropertyName) || empty($arPropertyName)){
return;
}
$arResult = [];
foreach ($arPropertyID as $referenceKey => $item) {
$item = array_flip($item);
if($isForm){
$res = array_diff_key($item, $arPropertyName[$referenceKey]['DATA']);
}else{
$res = array_diff_key($item, $arPropertyName[$referenceKey]);
}
if(!empty($res)){
$arResult[$referenceKey] = array_flip($res);
}
}
return $arResult;
}
}