• Модуль: 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;
}