- Модуль: sale
- Путь к файлу: ~/bitrix/modules/sale/lib/internals/delivery_paysystem.php
- Класс: BitrixSaleInternalsDeliveryPaySystemTable
- Вызов: DeliveryPaySystemTable::setLinks
static function setLinks($entityId, $entityType, array $linkedIds = array(), $actualizeRestrictions = true)
{
if(intval($entityId) <= 0)
throw new ArgumentNullException("entityId");
if($entityType != self::ENTITY_TYPE_DELIVERY && $entityType != self::ENTITY_TYPE_PAYSYSTEM)
throw new ArgumentOutOfRangeException("entityType");
$result = new BitrixMainEntityResult();
$con = BitrixMainApplication::getConnection();
$sqlHelper = $con->getSqlHelper();
$entityId = $sqlHelper->forSql($entityId);
$reverseParentLinks = array();
if($entityType == self::ENTITY_TYPE_DELIVERY)
{
$linkDirection = self::LINK_DIRECTION_DELIVERY_PAYSYSTEM ;
$reverseLinkDirection = self::LINK_DIRECTION_PAYSYSTEM_DELIVERY;
$reverseEntityType = self::ENTITY_TYPE_PAYSYSTEM;
$parentId = self::getDeliveryParentId($entityId);
}
else
{
$linkDirection = self::LINK_DIRECTION_PAYSYSTEM_DELIVERY;
$reverseLinkDirection = self::LINK_DIRECTION_DELIVERY_PAYSYSTEM;
$reverseEntityType = self::ENTITY_TYPE_DELIVERY;
$parentId = 0;
if(!empty($linkedIds)) // for delivery profiles
{
$reverseFieldsList = self::getEntityItemsFieldsList($reverseEntityType);
foreach($linkedIds as $id)
if(isset($reverseFieldsList[$id]['PARENT_ID']) && self::isValidParent($reverseFieldsList[$id]['PARENT_ID'], $reverseEntityType))
if(!in_array($reverseFieldsList[$id]['PARENT_ID'], $linkedIds))
$reverseParentLinks[] = $reverseFieldsList[$id]['PARENT_ID'];
if(!empty($reverseParentLinks))
{
$linkedIds = array_unique(array_merge($linkedIds, $reverseParentLinks));
}
}
}
//delete current entity links
$con->queryExecute(
"DELETE FROM ".self::getTableName().
" WHERE ".$entityType."=".$entityId ." AND LINK_DIRECTION='".$linkDirection."'"
);
//insert new links
if(!empty($linkedIds))
self::insertLinks($entityId, $linkDirection, $entityType, $linkedIds);
$glParams = array(
'filter' => array(
'=LINK_DIRECTION' => $reverseLinkDirection,
)
);
if(!empty($linkedIds))
$glParams['filter'][$reverseEntityType] = $linkedIds;
$res = self::getList($glParams);
$linkedToEntity = array();
$linkedToOther = array();
while($rec = $res->fetch())
{
if($rec[$entityType] == $entityId)
{
if(!in_array($rec[$reverseEntityType], $linkedToEntity))
$linkedToEntity[] = $rec[$reverseEntityType];
}
else
{
if(!in_array($rec[$reverseEntityType], $linkedToOther))
$linkedToOther[] = $rec[$reverseEntityType];
}
}
$reverseIdsToAdd = array_diff($linkedToOther, $linkedToEntity);
//set reverse links to current entity
if(!empty($reverseIdsToAdd))
self::insertLinks($entityId, $reverseLinkDirection, $entityType, $reverseIdsToAdd);
//delete reverse links we didn't choose
$glParams = array(
'filter' => array(
'=LINK_DIRECTION' => $reverseLinkDirection,
'='.$entityType => $entityId,
)
);
if(!empty($linkedIds))
$glParams['filter']['!='.$reverseEntityType] = $linkedIds;
$res = self::getList($glParams);
while($rec = $res->fetch())
{
self::delete(array(
'DELIVERY_ID' => $rec['DELIVERY_ID'],
'PAYSYSTEM_ID' => $rec['PAYSYSTEM_ID'],
'LINK_DIRECTION' => $rec['LINK_DIRECTION']
));
}
self::$unLinked = null;
//Modify delivery parent links for working profile links.
if(!empty($linkedIds))
{
$unlinked = self::getUnlinkedEnityItems($entityType);
if($entityType == self::ENTITY_TYPE_DELIVERY && self::isValidParent($parentId, $entityType) && !in_array($parentId, $unlinked))
{
$parentLinks = self::getLinks($parentId, $entityType, array(), false);
self::setLinks(
$parentId,
$entityType,
array_unique(array_merge($parentLinks, $linkedIds)),
false
);
}
elseif($entityType == self::ENTITY_TYPE_PAYSYSTEM)
{
$reverseFieldsList = self::getEntityItemsFieldsList($reverseEntityType);
$unlinkedReverse = self::getUnlinkedEnityItems($reverseEntityType);
$entityList = self::getEntityItemsFullList($entityType);
$entityList = array_diff($entityList, array($entityId));
foreach($reverseFieldsList as $id => $fields)
{
if(intval($fields['PARENT_ID']) > 0 && in_array($fields['PARENT_ID'], $reverseParentLinks) && in_array($id, $unlinkedReverse))
{
self::setLinks(
$id,
$reverseEntityType,
$entityList,
false
);
}
}
}
}
if($actualizeRestrictions)
{
self::actualizeDeliveriesRestrictionByPS();
self::actualizePaySystemRestrictionByDelivery();
}
return $result;
}