• Модуль: catalog
  • Путь к файлу: ~/bitrix/modules/catalog/lib/Access/Permission/Catalog/IblockCatalogPermissionsSaver.php
  • Класс: BitrixCatalogAccessPermissionCatalogIblockCatalogPermissionsSaver
  • Вызов: IblockCatalogPermissionsSaver::saveIblockRight
private function saveIblockRight(int $iblockId, ?int $taskId, array $accessCodes, array $deleteAccessCodes): void
{
	if (empty($accessCodes) && empty($deleteAccessCodes))
	{
		return;
	}

	$this->convertRightsMode($iblockId);

	$usedAccessCodes = [];
	$iblockRights = new CIBlockRights($iblockId);
	$isNeedResetIblockRights = false;
	
	$rights = $iblockRights->GetRights();
	foreach ($rights as $id => &$right)
	{
		$rightAccessCode = $right['GROUP_CODE'];
		if (in_array($rightAccessCode, $deleteAccessCodes, true))
		{
			unset($rights[$id]);
			$isNeedResetIblockRights = true;
			
			continue;
		}

		if (!in_array($rightAccessCode, $accessCodes, true))
		{
			continue;
		}
		$usedAccessCodes[] = $rightAccessCode;

		$rightTaskId = (int)$right['TASK_ID'];
		if ($rightTaskId !== $taskId)
		{
			if (empty($taskId))
			{
				unset($rights[$id]);
			}
			else
			{
				$right['TASK_ID'] = $taskId;
			}

			$isNeedResetIblockRights = true;
		}
	}
	unset($right);

	if (!empty($taskId))
	{
		$i = 0;
		$newAccessCodes = array_diff($accessCodes, $usedAccessCodes);
		foreach ($newAccessCodes as $accessCode)
		{
			$rights["n{$i}"] = [
				'GROUP_CODE' => $accessCode,
				'TASK_ID' => $taskId,
			];
			$i++;

			$isNeedResetIblockRights = true;
		}
	}

	if (!$isNeedResetIblockRights)
	{
		return;
	}

	$rights = $this->appendDefaultRights($rights);
	$rights = array_slice($rights, 0, 300, true);

	$iblockRights->SetRights($rights);
}