• Модуль: intranet
  • Путь к файлу: ~/bitrix/modules/intranet/classes/general/utils.php
  • Класс: CIntranetUtils
  • Вызов: CIntranetUtils::GetStsSyncURL
static function GetStsSyncURL($arSectionParams, $type = 'calendar', $employees = false)
{
	global $USER;

	if (!BitrixMainLoader::includeModule('webservice'))
	{
		return sprintf("alert('%s')", CUtil::jsEscape(getMessage('INTR_SYNC_OUTLOOK_NOWEBSERVICE')));
	}

	if (!is_array($arSectionParams))
		$arSectionParams = array('ID' => intval($arSectionParams));

	//if (!$arSectionParams['ID'])
	//	return false;

	$arAllowedTypes = array('calendar', 'tasks', 'contacts');

	if (!in_array($type, $arAllowedTypes))
		$type = 'calendar';

	if ($type == 'calendar')
	{
		$calendar2 = COption::GetOptionString("intranet", "calendar_2", "N") == "Y" && CModule::IncludeModule("calendar");
		$fld_EXTERNAL_ID = 'XML_ID';

		if ($calendar2) // Module 'Calendar'
		{
			// $arSectionParams = array(
				// 'ID' => int
				// 'XML_ID' => string
				// 'NAME' => string
				// 'PREFIX' => string
				// 'LINK_URL' => string
				// 'TYPE' => string
			// )

			if (mb_strlen($arSectionParams['XML_ID']) !== 32)
			{
				$arSectionParams[$fld_EXTERNAL_ID] = md5($arSectionParams['TYPE'].'_'.$arSectionParams['ID'].'_'.RandString(8));
				// Set XML_ID
				CCalendar::SaveSection(array('arFields' => Array('ID' => $arSectionParams['ID'],'XML_ID' => $arSectionParams[$fld_EXTERNAL_ID]), 'bAffectToDav' => false, 'bCheckPermissions' => false));
			}
		}
		else // Old version calendar on iblocks
		{
			if (!$arSectionParams['IBLOCK_ID'] || !$arSectionParams['NAME'] || !$arSectionParams[$fld_EXTERNAL_ID])
			{
				$dbRes = CIBlockSection::GetByID($arSectionParams['ID']);
				$arSection = $dbRes->Fetch();
				if ($arSection)
				{
					$arSectionParams['IBLOCK_ID'] = $arSection['IBLOCK_ID'];
					$arSectionParams['NAME'] = $arSection['NAME'];
					$arSectionParams[$fld_EXTERNAL_ID] = $arSection[$fld_EXTERNAL_ID];
				}
				else
				{
					return false;
				}
			}

			if (mb_strlen($arSectionParams[$fld_EXTERNAL_ID]) !== 32)
			{
				$arSectionParams[$fld_EXTERNAL_ID] = md5($arSectionParams['IBLOCK_ID'].'_'.$arSectionParams['ID'].'_'.RandString(8));

				$obSect = new CIBlockSection();
				if (!$obSect->Update($arSectionParams['ID'], array($fld_EXTERNAL_ID => $arSectionParams[$fld_EXTERNAL_ID]), false, false))
					return false;
			}
		}

		if (!$arSectionParams['PREFIX'])
		{
			$rsSites = CSite::GetByID(SITE_ID);
			$arSite = $rsSites->Fetch();
			if ($arSite["NAME"] <> '')
				$arSectionParams['PREFIX'] = $arSite["NAME"];
			else
				$arSectionParams['PREFIX'] = COption::GetOptionString('main', 'site_name', GetMessage('INTR_OUTLOOK_PREFIX_CONTACTS'));
		}

		$GUID = CIntranetUtils::makeGUID($arSectionParams[$fld_EXTERNAL_ID]);
	}
	elseif($type == 'contacts')
	{
		if (!$arSectionParams['LINK_URL'])
		{
			if (CModule::IncludeModule('extranet') && CExtranet::IsExtranetSite())
				$arSectionParams['LINK_URL'] = SITE_DIR.'contacts/';
			else
				$arSectionParams['LINK_URL'] = SITE_DIR.'company/';
		}

		if (!isset($arSectionParams['NAME']))
		{
			if (CModule::IncludeModule('extranet') && CExtranet::IsExtranetSite() && !$employees)
				$arSectionParams['NAME'] = GetMessage('INTR_OUTLOOK_TITLE_CONTACTS_EXTRANET');
			else
				$arSectionParams['NAME'] = GetMessage('INTR_OUTLOOK_TITLE_CONTACTS');
		}
		if (!isset($arSectionParams['PREFIX']))
		{
			$rsSites = CSite::GetByID(SITE_ID);
			$arSite = $rsSites->Fetch();

			if ($arSite["NAME"] <> '')
				$arSectionParams['PREFIX'] = $arSite["NAME"];
			else
				$arSectionParams['PREFIX'] = COption::GetOptionString('main', 'site_name', GetMessage('INTR_OUTLOOK_PREFIX_CONTACTS'));
		}


		$SERVER_NAME = $_SERVER['SERVER_NAME'];
		$GUID_DATA = $SERVER_NAME.'|'.$type;
		if (CModule::IncludeModule('extranet') && CExtranet::IsExtranetSite())
		{
			$GUID_DATA .= "|extranet";
			if ($employees)
				$GUID_DATA .= "|employees";
		}

		$GUID = CIntranetUtils::makeGUID(md5($GUID_DATA));
	}
	elseif($type == 'tasks')
	{
		if (!$arSectionParams['LINK_URL'])
		{
			if (CModule::IncludeModule('extranet') && CExtranet::IsExtranetSite())
				$arSectionParams['LINK_URL'] = SITE_DIR.'contacts/personal/user/'.$USER->GetID().'/tasks/';
			else
				$arSectionParams['LINK_URL'] = SITE_DIR.'company/personal/user/'.$USER->GetID().'/tasks/';
		}

		$arSectionParams['NAME'] = $arSectionParams['NAME'] ?? GetMessage('INTR_OUTLOOK_TITLE_TASKS');


		if (!($arSectionParams['PREFIX'] ?? null))
		{
			$rsSites = CSite::GetByID(SITE_ID);
			$arSite = $rsSites->Fetch();
			if ($arSite["NAME"] <> '')
				$arSectionParams['PREFIX'] = $arSite["NAME"];
			else
				$arSectionParams['PREFIX'] = COption::GetOptionString('main', 'site_name', GetMessage('INTR_OUTLOOK_PREFIX_CONTACTS'));
		}

		$SERVER_NAME = $_SERVER['SERVER_NAME'];
		$GUID_DATA = $SERVER_NAME.'|'.$type;

		if (CModule::IncludeModule('extranet') && CExtranet::IsExtranetSite())
			$GUID_DATA .= "|extranet";
		$GUID = CIntranetUtils::makeGUID(md5($GUID_DATA));
	}
	else
	{
		return '';
	}

	if (mb_substr($arSectionParams['LINK_URL'], -9) == 'index.php')
		$arSectionParams['LINK_URL'] = mb_substr($arSectionParams['LINK_URL'], 0, -9);

	if (mb_substr($arSectionParams['LINK_URL'], -4) != '.php' && mb_substr($arSectionParams['LINK_URL'], -1) != '/')
		$arSectionParams['LINK_URL'] .= '/';

	// another dirty hack to avoid some M$ stssync protocol restrictions
	if (mb_substr($arSectionParams['LINK_URL'], -1) != '/')
		$arSectionParams['LINK_URL'] .= '/';

	$type_script = $type;
	if (CModule::IncludeModule('extranet') && CExtranet::IsExtranetSite())
	{
		$type_script .= "_extranet";
		if ($employees)
			$type_script .= "_emp";
	}

	return BitrixWebServiceStsSync::getUrl($type, $type_script, $arSectionParams['LINK_URL'], $arSectionParams['PREFIX'], $arSectionParams['NAME'], $GUID);
}