• Модуль: tasks
  • Путь к файлу: ~/bitrix/modules/tasks/classes/general/tasknotifications.php
  • Класс: CTaskNotifications
  • Вызов: CTaskNotifications::getNotificationPath
static function getNotificationPath($arUser, $taskID, $bUseServerName = true, $arSites = array())
{
	if(!is_array($arUser) || !intval($taskID))
	{
		return false;
	}

	static $siteCache = array();

	$siteID = false;
	$arTask = static::getTaskBaseByTaskId($taskID);

	if (is_array($arTask) && !empty($arTask))
	{
		if(!is_array($arSites) || empty($arSites))
		{
			$arSites = BitrixTasksUtilSite::getPair();
		}

		// we have extranet and the current user is an extranet user
		$bExtranet = 	BitrixTasksIntegrationExtranetUser::isExtranet($arUser["ID"]);
		// task is in a group
		$useGroup = 	$arTask['GROUP_ID'] && self::checkUserCanViewGroupExtended($arUser['ID'], $arTask['GROUP_ID']);

		// detect site id
		if($bExtranet)
		{
			$siteID = (string) CExtranet::GetExtranetSiteID();
		}
		else
		{
			if($useGroup)
			{
				$groupSiteList = self::getSocNetGroupSiteList($arTask['GROUP_ID']);
				foreach($groupSiteList as $groupSite)
				{
					if (
						isset($arSites['EXTRANET']['SITE_ID'])
						&& $groupSite['LID'] == $arSites['EXTRANET']['SITE_ID']
					)
					{
						continue;
					}

					$siteID = $groupSite['LID'];
					$siteCache[$groupSite['LID']] = $groupSite;
					break;
				}
			}
			else
			{
				$userDataDb = CUser::GetList('', '', ['ID' => $arUser['ID']], ['FIELDS' => ['ID', 'LID']]);
				if ($userData = $userDataDb->Fetch())
				{
					$siteID = $userData['LID'];
				}
			}

			if(!$siteID) // still not detected, use just intranet site
			{
				if(isset($arSites['INTRANET']['SITE_ID']))
					$siteID = $arSites['INTRANET']['SITE_ID'];
				else
					$siteID = (string) SITE_ID;
			}
		}

		// get site
		if(!isset($siteCache[$siteID]))
		{
			if((string) $siteID != '')
			{
				$siteCache[$siteID] = BitrixMainSiteTable::getList(array(
					'filter' => array('=LID' => $siteID),
					'select' => array('SITE_ID' => 'LID', 'DIR', 'SERVER_NAME'),
					'limit' => 1
				))->fetch();
			}
		}

		if(!is_array($siteCache[$siteID]))
		{
			return false;// still no site??? abort!
		}

		// choose template
		if ($useGroup)
		{
			$pathTemplate = str_replace(
				array('#group_id#', '#GROUP_ID#'),
				$arTask["GROUP_ID"],
				CTasksTools::GetOptionPathTaskGroupEntry(
					$siteID,
					$siteCache[$siteID]['DIR'] . "workgroups/group/#group_id#/tasks/task/view/#task_id#/"
				)
			);
			$workgroupsPage = Option::get('socialnetwork', 'workgroups_page', $siteCache[$siteID]['DIR'] . 'workgroups/', $siteID);
			$pathTemplate = '#GROUPS_PATH#' . mb_substr($pathTemplate, mb_strlen($workgroupsPage), mb_strlen($pathTemplate) - mb_strlen($workgroupsPage));
			$processed = CSocNetLogTools::ProcessPath(array("TASK_URL" => $pathTemplate), $arUser['ID'], $siteID);
			$pathTemplate = $processed['URLS']['TASK_URL'];
		}
		else
		{
			$pathTemplate = CTasksTools::GetOptionPathTaskUserEntry(
				$siteID,
				$siteCache[$siteID]['DIR'] . ($bExtranet ? 'contacts' : 'company') . "/personal/user/#user_id#/tasks/task/view/#task_id#/"
			);
		}

		// detect site name
		$serverName = '';
		if($bUseServerName)
		{
			$serverName = tasksServerName($siteCache[$siteID]['SERVER_NAME']);
		}

		$strUrl = $serverName
			. CComponentEngine::MakePathFromTemplate(
				$pathTemplate,
				array(
					'user_id' => $arUser['ID'],
					'USER_ID' => $arUser['ID'],
					'task_id' => $taskID,
					'TASK_ID' => $taskID,
					'action'  => 'view'
				)
			);

		return ($strUrl);
	}

	return false;
}