public function __construct($cal, $siteId = null) { if (!isset($cal) || !is_array($cal) && !is_string($cal)) { return; } $this->component = new CDavICalendarComponent(); if (is_string($cal)) { $this->component->InitializeFromString($cal); } else { $this->component->SetType('VCALENDAR'); $this->component->SetProperties(array(new CDavICalendarProperty('VERSION:2.0'), new CDavICalendarProperty('PRODID:-//davical.org//NONSGML AWL Calendar//EN'), new CDavICalendarProperty('METHOD:PUBLISH'))); $arComps = array(); $tz = CDavICalendarTimeZone::GetTimezone(CDavICalendarTimeZone::getTimeZoneId()); if (!empty($tz)) { $comptz = new CDavICalendarComponent(); $comptz->InitializeFromString($tz); $arComps[] = $comptz; } $comp = new CDavICalendarComponent(); $comp->InitializeFromArray($cal); $arComps[] = $comp; $this->component->SetComponents($arComps); } }
private function GetVCardContent(array $contact) { $arVCardContact = array("TYPE" => "VCARD", "VERSION" => "3.0", "N" => $contact["LAST_NAME"] . ";" . $contact["NAME"] . ";" . $contact["SECOND_NAME"] . ";;", "FN" => $contact["NAME"] . ($contact["SECOND_NAME"] ? " " . $contact["SECOND_NAME"] : "") . " " . $contact["LAST_NAME"], "EMAIL" => array("VALUE" => $contact["EMAIL"], "PARAMETERS" => array("TYPE" => "INTERNET")), "REV" => date("Ymd\\THis\\Z", MakeTimeStamp($contact["TIMESTAMP_X"])), "UID" => $contact["ID"]); if (intval($contact["PERSONAL_BIRTHDAY"]) > 0) { $arVCardContact["BDAY"] = date("Y-m-d", MakeTimeStamp($contact["PERSONAL_BIRTHDAY"])); } if (strlen($contact["WORK_PHONE"]) > 0) { $arVCardContact["TEL"][] = array("VALUE" => $contact["WORK_PHONE"], "PARAMETERS" => array("TYPE" => "WORK")); } if (strlen($contact["PERSONAL_MOBILE"]) > 0) { $arVCardContact["TEL"][] = array("VALUE" => $contact["PERSONAL_MOBILE"], "PARAMETERS" => array("TYPE" => "CELL")); } if (strlen($contact["PERSONAL_PHONE"]) > 0) { $arVCardContact["TEL"][] = array("VALUE" => $contact["PERSONAL_PHONE"], "PARAMETERS" => array("TYPE" => "HOME")); } if (strlen($contact["WORK_COMPANY"]) > 0) { $arVCardContact["ORG"] = $contact["WORK_COMPANY"]; } if (strlen($contact["WORK_POSITION"]) > 0) { $arVCardContact["TITLE"] = $contact["WORK_POSITION"]; } if (strlen($contact["WORK_WWW"]) > 0) { $arVCardContact["URL"][] = array("VALUE" => $contact["WORK_WWW"], "PARAMETERS" => array("TYPE" => "WORK")); } if (strlen($contact["PERSONAL_WWW"]) > 0) { $arVCardContact["URL"][] = array("VALUE" => $contact["PERSONAL_WWW"], "PARAMETERS" => array("TYPE" => "HOME")); } if (strlen($contact["PERSONAL_STREET"]) > 0) { $arVCardContact["ADR"][] = array("VALUE" => ";;" . $contact["PERSONAL_STREET"] . ";" . $contact["PERSONAL_CITY"] . ";" . $contact["PERSONAL_STATE"] . ";" . $contact["PERSONAL_ZIP"] . ";" . GetCountryByID($contact["PERSONAL_COUNTRY"]) . "", "PARAMETERS" => array("TYPE" => "HOME")); } if (strlen($contact["WORK_STREET"]) > 0) { $arVCardContact["ADR"][] = array("VALUE" => ";;" . $contact["WORK_STREET"] . ";" . $contact["WORK_CITY"] . ";" . $contact["WORK_STATE"] . ";" . $contact["WORK_ZIP"] . ";" . GetCountryByID($contact["WORK_COUNTRY"]) . "", "PARAMETERS" => array("TYPE" => "WORK")); } if (intval($contact["PERSONAL_PHOTO"]) > 0) { $arTempFile = CFile::ResizeImageGet($contact["PERSONAL_PHOTO"], array("width" => \Bitrix\Main\Config\Option::get("dav", "vcard_image_width", 400), "height" => \Bitrix\Main\Config\Option::get("dav", "vcard_image_width", 400)), BX_RESIZE_IMAGE_PROPORTIONAL, false, false, false, \Bitrix\Main\Config\Option::get("dav", "vcard_image_quality", 60)); if ($arTempFile) { $cnt = file_get_contents($_SERVER["DOCUMENT_ROOT"] . $arTempFile['src']); if (!empty($cnt)) { $arImageTypes = array(IMAGETYPE_JPEG => 'JPEG', IMAGETYPE_GIF => 'GIF', IMAGETYPE_PNG => 'PNG'); $imageType = "JPEG"; if ($imageInfo = CFile::GetImageSize($_SERVER["DOCUMENT_ROOT"] . $arTempFile['src']) && isset($arImageTypes[$imageInfo[2]])) { $imageType = $arImageTypes[$imageInfo[2]]; } $arVCardContact["PHOTO"] = array("VALUE" => base64_encode($cnt), "PARAMETERS" => array("ENCODING" => "BASE64", "TYPE" => $imageType)); } } } $cal = new CDavICalendarComponent($arVCardContact); return $cal->Render(); }
private static function ParseVTimezone(CDavICalendarComponent $vtimezone, $year) { $result['time'] = 0; $rruleInterval = 0; // 0 undefined, 1 yearly, 12 monthly $t = self::ParseUtcOffset($vtimezone->GetPropertyValue('TZOFFSETFROM')); if ($t == null) { return false; } $result['from'] = ($t["hours"] * 60 * 60 + $t["minutes"] * 60) * ($t["ahead"] ? 1 : -1); $t = self::ParseUtcOffset($vtimezone->GetPropertyValue('TZOFFSETTO')); if ($t == null) { return false; } $result['to'] = ($t["hours"] * 60 * 60 + $t["minutes"] * 60) * ($t["ahead"] ? 1 : -1); $t = $vtimezone->GetPropertyValue('DTSTART'); if ($t == null) { return false; } $switchTime = self::ParseDateTime($t); if (!is_int($switchTime)) { return false; } $rrules = $vtimezone->GetPropertyValue('RRULE'); if ($rrules == null) { $t = getdate($switchTime); $result['time'] = @gmmktime($t['hours'], $t['minutes'], $t['seconds'], $t['mon'], $t['mday'], $t['year']); return $result; } $switchYear = date("Y", $switchTime); if ($switchYear > $year) { return false; } $rrules = explode(';', $rrules); foreach ($rrules as $rrule) { $t = explode('=', $rrule); switch ($t[0]) { case 'FREQ': switch ($t[1]) { case 'YEARLY': if ($rruleInterval == 12) { return false; } $rruleInterval = 1; break; case 'MONTHLY': if ($rruleInterval == 1) { return false; } $rruleInterval = 12; break; default: return false; } break; case 'INTERVAL': if ($rruleInterval && $t[1] != $rruleInterval) { return false; } $rruleInterval = intval($t[1]); if ($rruleInterval != 1 && $rruleInterval != 12) { return false; } break; case 'COUNT': if ($switchYear + intval($t[1]) < intval($year)) { return false; } break; case 'BYMONTH': $month = intval($t[1]); break; case 'BYDAY': $len = strspn($t[1], '1234567890-+'); if ($len == 0) { return false; } $weekday = substr($t[1], $len); $weekdays = array('SU' => 0, 'MO' => 1, 'TU' => 2, 'WE' => 3, 'TH' => 4, 'FR' => 5, 'SA' => 6); $weekday = $weekdays[$weekday]; $which = intval(substr($t[1], 0, $len)); break; case 'UNTIL': if (intval($year) > intval(substr($t[1], 0, 4))) { return false; } break; } } if ($rruleInterval == 12) { $month = date("n", $switchTime); } if (empty($month) || !isset($weekday)) { return false; } $switchTime = strftime('%H:%M:%S', $switchTime); $switchTime = explode(':', $switchTime); $when = gmmktime($switchTime[0], $switchTime[1], $switchTime[2], $month, 1, $year); $firstOfMonthWeekday = intval(gmstrftime('%w', $when)); if ($weekday >= $firstOfMonthWeekday) { $weekday -= 7; } $when -= ($firstOfMonthWeekday - $weekday) * 60 * 60 * 24; if ($which < 0) { do { $when += 60 * 60 * 24 * 7; } while (intval(gmstrftime('%m', $when)) == $month); } $when += $which * 60 * 60 * 24 * 7; $result['time'] = $when; return $result; }