• Модуль: tasks
  • Путь к файлу: ~/bitrix/modules/tasks/classes/general/taskfiles.php
  • Класс: CTaskFiles
  • Вызов: CTaskFiles::getFilesAttachedInAccessibleTasks
static function getFilesAttachedInAccessibleTasks($userId, $arFilesIds)
{
	$arAccessibleFilesIds = array();	// Array of accessible files ids

	$arTasksWithFiles  = array();	// Tasks with given files
	$arAccessibleTasks = array();	// Tasks that user can access
	$arTaskFiles       = array();	// Mapped FILE_ID to array of TASK_ID, that contains this file

	// Usage of 'f' prefix prevents createing indexed array,
	// but forces associative. So, PHP wouldn't fill in the gaps in
	// index values.
	// It should improves perfomance and prevent big memory usage.

	// Init $arTaskFiles
	foreach ($arFilesIds as $fileId)
		$arTaskFiles['f' . $fileId] = array();


	$rsTaskFile = self::GetList(
		array(),
		array('FILE_ID' => $arFilesIds)
	);

	while ($arTaskFile = $rsTaskFile->Fetch())
	{
		$taskId = (int) $arTaskFile['TASK_ID'];
		$fileId = (int) $arTaskFile['FILE_ID'];

		$arTasksWithFiles[] = $taskId;
		$arTaskFiles['f' . $fileId][] = $taskId;
	}

	$arTasksWithFiles = array_unique($arTasksWithFiles);

	$rsTask = CTasks::GetList(
		array(),
		array('ID' => $arTasksWithFiles),
		array('ID'),
		array('USER_ID' => $userId)
	);

	while ($arTask = $rsTask->Fetch())
		$arAccessibleTasks[] = (int) $arTask['ID'];

	// user can access files, that are already attached to tasks, accessibly by user
	foreach ($arFilesIds as $fileId)
	{
		$arTasksIds = array_unique($arTaskFiles['f' . $fileId]);

		if (count(array_intersect($arTasksIds, $arAccessibleTasks)))
			$arAccessibleFilesIds[] = (int) $fileId;
	}

	return ($arAccessibleFilesIds);
}