• Модуль: crm
  • Путь к файлу: ~/bitrix/modules/crm/lib/Service/ParentFieldManager.php
  • Класс: Bitrix\Crm\Service\ParentFieldManager
  • Вызов: ParentFieldManager::saveParentRelationsForIdentifier
public function saveParentRelationsForIdentifier(ItemIdentifier $childIdentifier, array $data): Result
{
	$result = new Result();

	$relationManager = Container::getInstance()->getRelationManager();

	$oldParentElements = $this->sortIdentifiersByEntityTypeId($relationManager->getParentElements($childIdentifier));
	$newParentElements = $this->sortIdentifiersByEntityTypeId($this->getParentIdentifiersFromData($data));

	// delete removed relations
	foreach ($data as $name => $value)
	{
		if (empty($value) && static::isParentFieldName($name))
		{
			/** @var string $entityTypeId */
			$entityTypeId = static::getEntityTypeIdFromFieldName($name);
			if (isset($oldParentElements[$entityTypeId]))
			{
				$unBindResult = $relationManager->unbindItems($oldParentElements[$entityTypeId], $childIdentifier);
				if (!$unBindResult->isSuccess())
				{
					$result->addErrors($unBindResult->getErrors());
				}
			}
		}
	}

	// bind new items and change existing (not deleted) relations
	foreach (array_diff($newParentElements, $oldParentElements) as $bindItem)
	{
		$oldParent = ($oldParentElements[$bindItem->getEntityTypeId()] ?? null);
		if ($oldParent && $bindItem->getEntityId() !== $oldParent->getEntityId())
		{
			$unBindResult = $relationManager->unbindItems($oldParentElements[$bindItem->getEntityTypeId()], $childIdentifier);
			if (!$unBindResult->isSuccess())
			{
				$result->addErrors($unBindResult->getErrors());
			}
		}
		$bindResult = $relationManager->bindItems($bindItem, $childIdentifier);
		if (!$bindResult->isSuccess())
		{
			$result->addErrors($bindResult->getErrors());
		}
	}

	return $result;
}