• Модуль: dav
  • Путь к файлу: ~/bitrix/modules/dav/classes/general/calendarhandler.php
  • Класс: CDavCalendarHandler
  • Вызов: CDavCalendarHandler::ConvertICalToArray
private function ConvertICalToArray($event, $calendar)
	{
		static $arWeekDayMap = array("SU" => 6, "MO" => 0, "TU" => 1, "WE" => 2, "TH" => 3, "FR" => 4, "SA" => 5);

		$request = $this->groupdav->GetRequest();

		$arFields = array(
			"NAME" => $event->GetPropertyValue("SUMMARY"),
			"PROPERTY_LOCATION" => $event->GetPropertyValue("LOCATION"),
			"DETAIL_TEXT" => $event->GetPropertyValue("DESCRIPTION"),
			"DETAIL_TEXT_TYPE" => 'html',
			"ACTIVE_FROM" => CDavICalendarTimeZone::GetFormattedServerDateTime(
				$event->GetPropertyValue("DTSTART"),
				$event->GetPropertyParameter("DTSTART", "TZID"),
				$calendar
			),
			"ACTIVE_TO" => CDavICalendarTimeZone::GetFormattedServerDateTime(
				$event->GetPropertyValue("DTEND"),
				$event->GetPropertyParameter("DTSTART", "TZID"),
				$calendar
			),
			"MODIFIED_BY" => $request->GetPrincipal()->Id(),
			"XML_ID" => $event->GetPropertyValue("UID"),
			"DATE_CREATE" => CDavICalendarTimeZone::GetFormattedServerDateTime($event->GetPropertyValue("CREATED")),
			"PROPERTY_CATEGORY" => $event->GetPropertyValue("CATEGORIES"),
		);

		if ($priority = $event->GetPropertyValue("PRIORITY"))
		{
			if ($priority <= 3)
				$arFields["PROPERTY_IMPORTANCE"] = "high";
			elseif ($priority > 3 && $priority <= 6)
				$arFields["PROPERTY_IMPORTANCE"] = "normal";
			else
				$arFields["PROPERTY_IMPORTANCE"] = "low";
		}
		else
		{
			$arFields["PROPERTY_IMPORTANCE"] = "normal";
		}

		if ($transp = $event->GetPropertyValue("TRANSP"))
		{
			if ($transp == 'TRANSPARENT')
				$arFields["PROPERTY_ACCESSIBILITY"] = "free";
			else
				$arFields["PROPERTY_ACCESSIBILITY"] = "busy";
		}
		else
		{
			$arFields["PROPERTY_ACCESSIBILITY"] = "busy";
		}

		$arVAlarm = $event->GetComponents("VALARM");
		if (count($arVAlarm) > 0 && $event->GetPropertyValue("X-MOZ-LASTACK") == null)
		{
			$trigger = $arVAlarm[0]->GetPropertyValue("TRIGGER");
			if (preg_match('/^-PT([0-9]+)([HMD])$/i', $trigger, $arMatches))
			{
				$arPeriodMapTmp = array("M" => "min", "H" => "hour", "D" => "day");
				$arFields["PROPERTY_REMIND_SETTINGS"] = $arMatches[1]."_".$arPeriodMapTmp[$arMatches[2]];
			}
		}

		if ($rrule = $event->GetPropertyValueParsed("RRULE"))
		{
			// RRULE:FREQ=WEEKLY;COUNT=5;INTERVAL=2;BYDAY=TU,SA
			$arFields["PROPERTY_PERIOD_TYPE"] = $rrule["FREQ"];
			$arFields["PROPERTY_PERIOD_COUNT"] = isset($rrule["INTERVAL"]) ? $rrule["INTERVAL"] : 1;

			if ($arFields["PROPERTY_PERIOD_TYPE"] == "WEEKLY")
			{
				if (isset($rrule["BYDAY"]))
				{
					$ar = explode(",", $rrule["BYDAY"]);
					$ar1 = array();
					foreach ($ar as $v)
						$ar1[] = $arWeekDayMap[mb_strtoupper($v)];
					$arFields["PROPERTY_PERIOD_ADDITIONAL"] = implode(",", $ar1);
				}
				else
				{
					$arFields["PROPERTY_PERIOD_ADDITIONAL"] = date("w", MakeTimeStamp($arFields["ACTIVE_FROM"])) - 1;
					if ($arFields["PROPERTY_PERIOD_ADDITIONAL"] < 0)
						$arFields["PROPERTY_PERIOD_ADDITIONAL"] = 6;
				}
			}

			$arFields["PROPERTY_EVENT_LENGTH"] = MakeTimeStamp($arFields["ACTIVE_TO"]) - MakeTimeStamp($arFields["ACTIVE_FROM"]);

			if (isset($rrule["UNTIL"]))
			{
				$arFields["ACTIVE_TO"] = CDavICalendarTimeZone::GetFormattedServerDateTime($rrule["UNTIL"]);
			}
			elseif (isset($rrule["COUNT"]))
			{
				$eventTime = $this->GetPeriodicEventTime(
					MakeTimeStamp($arFields["ACTIVE_TO"]),
					array(
						"freq" => $arFields["PROPERTY_PERIOD_TYPE"],
						"interval" => $arFields["PROPERTY_PERIOD_COUNT"],
						"byday" => $arFields["PROPERTY_PERIOD_ADDITIONAL"]
					),
					$rrule["COUNT"]
				);
				$arFields["ACTIVE_TO"] = date($GLOBALS["DB"]->DateFormatToPHP(FORMAT_DATETIME), $eventTime);
			}
		}

		return $arFields;
	}