1C-Bitrix 25.700.0
Загрузка...
Поиск...
Не найдено
icalicsbuilder.php
См. документацию.
1<?php
2
3namespace Bitrix\Calendar\ICal;
4
5use Bitrix\Calendar\Core\Event\Event;
6use Bitrix\Calendar\ICal\Basic\Dictionary;
7use Bitrix\Calendar\ICal\Basic\RecurrenceRuleProperty;
8use Bitrix\Calendar\ICal\Builder\Alarm;
9use Bitrix\Calendar\ICal\Builder\Calendar;
10use Bitrix\Calendar\ICal\Builder\Event as IcalEvent;
11use Bitrix\Calendar\ICal\Builder\StandardObservances;
12use Bitrix\Calendar\ICal\Builder\Timezone;
13use Bitrix\Calendar\ICal\helper\ReminderHelper;
14use Bitrix\Calendar\ICal\MailInvitation\AttachmentManager;
15use Bitrix\Calendar\ICal\MailInvitation\Helper;
16use Bitrix\Calendar\Util;
17
19{
20 private Event $eventObject;
21
22 public function getContent(): string
23 {
24 $icalEvent = $this->buildIcalEvent();
25 $icalCalendar = $this->buildIcalCalendar();
26 $icalCalendar->addEvent($icalEvent);
27
28 return $icalCalendar->get();
29 }
30
31 public static function buildFromEvent(Event $eventObject): self
32 {
33 $eventFields = self::prepareArrayFields($eventObject);
34 $manager = self::createInstance($eventFields);
35 $manager->eventObject = $eventObject;
36
37 return $manager;
38 }
39
40 private static function prepareArrayFields(Event $eventObject): array
41 {
42 $fields = [
43 'DATE_FROM' => $eventObject->getStart()->format(IcsBuilder::DEFAULT_DATETIME_FORMAT),
44 'TZ_FROM' => $eventObject->getStartTimeZone(),
45 'DATE_TO' => $eventObject->getEnd()->format(IcsBuilder::DEFAULT_DATETIME_FORMAT),
46 'TZ_TO' => $eventObject->getEndTimeZone(),
47 'CREATED' => $eventObject->getDateCreate()->format(IcsBuilder::DEFAULT_DATETIME_FORMAT),
48 'MODIFIED' => $eventObject->getDateModified()->format(IcsBuilder::DEFAULT_DATETIME_FORMAT),
49 ];
50 $parentId = $eventObject->getParentId();
51 $hostId = $eventObject->getEventHost()?->getId();
52 $fields['ICAL_ORGANIZER'] = Helper::getAttendee(
53 $eventObject->getEventHost()?->getId(),
54 $parentId,
55 false
56 );
57 $fields['ICAL_ORGANIZER']->setEmail(null);
58 $fields['ICAL_ORGANIZER']->setMailto(null);
59 if (!$eventObject->getMeetingDescription()?->getHideGuests())
60 {
61 $fields['ICAL_ATTENDEES'] = Helper::getAttendeesByEventParentId($parentId);
62 }
63
64 $fields['ICAL_ATTACHES'] = Helper::getMailAttaches(null, $hostId, $parentId);
65
66 return $fields;
67 }
68
69 private function buildIcalEvent(): IcalEvent
70 {
71 $location = $this->eventObject->getLocation()?->toString()
72 ? \Bitrix\Calendar\Rooms\Util::getTextLocation($this->eventObject->getLocation()->toString())
73 : null;
74 $excludeDates = array_map(
75 fn($ed) => $ed->getDate(),
76 $this->eventObject->getExcludedDateCollection()->getCollection()
77 );
78 $rrule = $this->eventObject->getRecurringRule()?->toArray();
79
80 // 0199387:
81 // Google Calendar not support both fields, so delete UNTIL if COUNT presented
82 // From documentation: You can use either COUNT or UNTIL to specify the end of the event recurrence. Don't use both in the same rule.
83 // @see: https://developers.google.com/calendar/api/concepts/events-calendars#recurrence_rule
84 if (($rrule['COUNT'] ?? null) && ($rrule['UNTIL'] ?? null))
85 {
86 unset($rrule['UNTIL']);
87 }
88
89 $rrule = new RecurrenceRuleProperty($rrule);
90
91 $skipTime = $this->eventObject->isFullDayEvent();
92 $priority = Dictionary::PRIORITY_MAP[$this->eventObject->getImportance()] ?? Dictionary::PRIORITY_MAP['default'];
93
94 $icalEvent = (new IcalEvent($this->eventObject->getUid()))
95 ->setName($this->eventObject->getName())
96 ->setStartsAt(Util::getDateObject($this->event['DATE_FROM'], $skipTime, $this->event['TZ_FROM']))
97 ->setEndsAt(Util::getDateObject($this->event['DATE_TO'], $skipTime, $this->event['TZ_TO']))
98 ->setCreatedAt(Util::getDateObject($this->event['CREATED'], false, $this->event['TZ_FROM']))
99 ->setDtStamp(Util::getDateObject($this->event['CREATED'], false, $this->event['TZ_FROM']))
100 ->setModified(Util::getDateObject($this->event['MODIFIED'], false, $this->event['TZ_FROM']))
101 ->setWithTimezone(!$skipTime)
102 ->setWithTime(!$skipTime)
103 ->setTransparent(
104 Dictionary::TRANSPARENT[$this->eventObject->getAccessibility()] ?? Dictionary::TRANSPARENT['busy']
105 )
106 ->setRRule($rrule)
107 ->setExdates($excludeDates)
108 ->setLocation($location)
109 ->setSequence($this->eventObject->getVersion())
110 ->setStatus(Dictionary::INVITATION_STATUS['confirmed'])
111 ->setPriority($priority)
112 ;
113
114 if ($this->eventObject->getDescription())
115 {
116 $icalEvent->setDescription($this->prepareDescription($this->eventObject->getDescription()));
117 }
118
119 if ($reminders = $this->eventObject->getRemindCollection()?->getCollection())
120 {
121 $icalEvent
122 ->setAlerts(
123 array_map(
124 function ($r) use ($skipTime) {
125 [$value, $valueType] = ReminderHelper::prepareReminderValue($r, $skipTime);
126
127 return new Alarm(type: $valueType, value: $value);
128 },
129 $reminders
130 )
131 )
132 ;
133 }
134
135 if (!empty($event['ICAL_ATTENDEES']) && !($event['MEETING']['HIDE_GUESTS'] ?? true))
136 {
137 $icalEvent->setAttendees($event['ICAL_ATTENDEES']);
138 }
139
140 if (!empty($event['ICAL_ORGANIZER']))
141 {
142 $icalEvent->setOrganizer($event['ICAL_ORGANIZER'], '');
143 }
144
145 return $icalEvent;
146 }
147
148 private function buildIcalCalendar(): Calendar
149 {
151 ->setMethod('REQUEST')
152 ->setTimezones(Timezone::createInstance()
153 ->setTimezoneId(Helper::getTimezoneObject($this->eventObject->getStartTimeZone()))
154 ->setObservance(StandardObservances::createInstance()
155 ->setOffsetFrom(Helper::getTimezoneObject($this->eventObject->getStartTimeZone()))
156 ->setOffsetTo(Helper::getTimezoneObject($this->eventObject->getEndTimeZone()))
157 ->setDTStart()
158 )
159 )
160 ;
161 }
162}
static createInstance(string $name=null)
Определения calendar.php:27
static buildFromEvent(Event $eventObject)
Определения icalicsbuilder.php:31
const DEFAULT_DATETIME_FORMAT
Определения icsbuilder.php:16
static getDateObject(string $date=null, ?bool $fullDay=true, ?string $tz='UTC')
Определения util.php:107
</td ></tr ></table ></td ></tr >< tr >< td class="bx-popup-label bx-width30"><?=GetMessage("PAGE_NEW_TAGS")?> array( $site)
Определения file_new.php:804
Calendar($fieldName, $formName="")
Определения tools.php:291
$value
Определения Param.php:39
$manager
Определения office365push.php:39
$event
Определения prolog_after.php:141
$location
Определения options.php:2729
$fields
Определения yandex_run.php:501