• Модуль: im
  • Путь к файлу: ~/bitrix/modules/im/lib/update/callbackgroundfolderrights.php
  • Класс: BitrixImUpdateCallBackgroundFolderRights
  • Вызов: CallBackgroundFolderRights::execute
public function execute(array &$option)
{
	$stepResult = Stepper::FINISH_EXECUTION;

	if (!BitrixMainLoader::includeModule('disk'))
	{
		return $stepResult;
	}

	$storageId = (int)Option::get('im', 'disk_storage_id', 0);
	if ($storageId <= 0)
	{
		return $stepResult;
	}

	$topFolder = BitrixDiskInternalsFolderTable::getRow([
		'select' => ['ID'],
		'filter' => [
			'=STORAGE_ID' => $storageId,
			'=TYPE' => BitrixDiskInternalsFolderTable::TYPE_FOLDER,
			'=CODE' => 'CALL_BACKGROUND',
		]
	]);
	if (!$topFolder || (int)$topFolder['ID'] <= 0)
	{
		return $stepResult;
	}
	$topFolderId = (int)$topFolder['ID'];

	$stepVars = Option::get(self::$moduleId, self::OPTION_NAME, '');
	$stepVars = ($stepVars !== "" ? @unserialize($stepVars, ['allowed_classes' => false]) : []);
	$stepVars = (is_array($stepVars) ? $stepVars : []);

	$filter = [
		'=STORAGE_ID' => $storageId,
		'=TYPE' => BitrixDiskInternalsFolderTable::TYPE_FOLDER,
		'=PARENT_ID' => $topFolderId,
		'CODE' => 'CALL_BACKGROUND_%',
	];

	if (empty($stepVars))
	{
		$stepVars = [
			'lastId' => 0,
			'number' => 0,
			'count' => (int)BitrixDiskInternalsFolderTable::getCount($filter),
		];
	}

	if ($stepVars['count'] > 0)
	{
		$option['progress'] = 1;
		$option['steps'] = '';
		$option['count'] = $stepVars['count'];

		$filter['>ID'] = $stepVars['lastId'];

		$diskRightsManager = BitrixDiskDriver::getInstance()->getRightsManager();
		$accessTaskFull = $diskRightsManager->getTaskIdByName(BitrixDiskRightsManager::TASK_FULL);

		$cursor = BitrixDiskFolder::getList([
			'select' => ['ID', 'CREATED_BY'],
			'filter' => $filter,
			'order' => ['ID' => 'ASC'],
			'limit' => self::LIMIT,
		]);
		$found = false;
		foreach ($cursor as $row)
		{
			$folder = BitrixDiskFolder::loadById((int)$row['ID']);
			if ($folder instanceof BitrixDiskFolder)
			{
				$diskRightsManager->append(
					$folder,
					[
						[
							'ACCESS_CODE' => 'U'. (int)$row['CREATED_BY'],
							'TASK_ID' => $accessTaskFull,
						]
					]
				);
			}
			$stepVars['number'] ++;
			$stepVars['lastId'] = (int)$row['ID'];
			$found = true;
		}

		if ($found)
		{
			Option::set(self::$moduleId, self::OPTION_NAME, serialize($stepVars));
			$stepResult = Stepper::CONTINUE_EXECUTION;
		}
		else
		{
			Option::delete(self::$moduleId, ["name" => self::OPTION_NAME]);
		}

		$option['progress'] = round($stepVars['number'] * 100 / $stepVars['count']);
		$option['steps'] = $stepVars['number'];
	}
	elseif ($stepVars['count'] == 0)
	{
		Option::delete(self::$moduleId, ["name" => self::OPTION_NAME]);
	}

	return $stepResult;
}