1C-Bitrix 25.700.0
Загрузка...
Поиск...
Не найдено
icsmanager.php
См. документацию.
1<?php
2
3namespace Bitrix\Calendar\ICal;
4
5use Bitrix\Calendar\Core\Base\BaseException;
6use Bitrix\Calendar\Core\Event\Event;
7use Bitrix\Calendar\Util;
8use Bitrix\Main\Localization\Loc;
9
10Loc::loadMessages($_SERVER['DOCUMENT_ROOT'].BX_ROOT.'/modules/calendar/lib/ical/incomingeventmanager.php');
11Loc::loadMessages(__FILE__);
12
14{
15 private static ?IcsManager $instance = null;
16
17 private const FILE_TYPE = 'text/calendar';
18 private const FILE_NAME = 'event';
19 private const FILE_EXTENSION = '.ics';
20 private const MODULE_ID = 'calendar';
21
22 protected function __construct()
23 {
24 }
25
26 public static function getInstance(): IcsManager
27 {
28 if (!self::$instance)
29 {
30 self::$instance = new IcsManager();
31 }
32
33 return self::$instance;
34 }
35
39 public function createIcsFile(Event $event, array $params): int
40 {
41 $fileData = $this->getIcsFileData($event, $params);
42 $fileId = \CFile::SaveFile($fileData, 'calendar');
43
44 if (!$this->checkIcsFileExistence($fileId))
45 {
46 throw new BaseException('Error saving ICS file');
47 }
48
49 return $fileId;
50 }
51
52 private function getIcsFileData(Event $event, array $params): array
53 {
54 $fileContent = $this->getIcsFileContent($event, $params);
55 return [
56 'name' => self::FILE_NAME . self::FILE_EXTENSION,
57 'type' => self::FILE_TYPE,
58 'MODULE_ID' => self::MODULE_ID,
59 'content' => $fileContent,
60 ];
61 }
62
63 private function checkIcsFileExistence(int $fileId): bool
64 {
65 return is_array(\CFile::GetFileArray($fileId));
66 }
67
68 public function getIcsFileContent(Event $event, array $params): string
69 {
70 $dtEnd = Util::getTimestamp($event->getEnd());
71 if ($event->isFullDayEvent())
72 {
73 $dtEnd += \CCalendar::GetDayLen();
74 }
75 $icsBuilder = new \Bitrix\Calendar\ICal\IcsBuilder(
76 [
77 'summary' => $event->getName() ?? '',
78 'description' => $this->prepareEventDescription($event, $params),
79 'dtstart' => Util::getTimestamp($event->getStart()),
80 'dtend' => $dtEnd,
81 'dtstamp' => Util::getTimestamp($event->getDateCreate()),
82 'location' => $this->prepareLocationField($event),
83 'uid' => $event->getUid() ?? uniqid('', true),
84 'sequence' => $event->getVersion(),
85 'last-modified' => $event->getDateModified()->getTimestamp(),
86 'priority' => $event->getImportance(),
87 ],
88 );
89 $icsBuilder->setFullDayMode($event->isFullDayEvent());
90 if (isset($params['organizer']))
91 {
92 $organizer = $params['organizer'];
93 $icsBuilder->setOrganizer($organizer['name'], $organizer['email'] ?? null, $organizer['phone'] ?? null);
94 }
95
96 if (!empty($params['attendees']))
97 {
98 $icsBuilder->setAttendees($params['attendees']);
99 }
100
101 if (!$event->isFullDayEvent())
102 {
103 $icsBuilder->setConfig(
104 [
105 'timezoneFrom' => $event->getStartTimeZone(),
106 'timezoneTo' => $event->getEndTimeZone() ?? $event->getStartTimeZone(),
107 ]
108 );
109 }
110
111 if ($event->isRecurrence() && $event->getRecurringRule() !== null)
112 {
113 $icsBuilder->setRrule($event->getRecurringRule());
114 }
115
116 if ($event->isRecurrence() && $event->getExcludedDateCollection()->count() > 0)
117 {
118 $icsBuilder->setExclude($event->getExcludedDateCollection());
119 }
120
121 return $icsBuilder->render();
122 }
123
125 {
126 $languageId = \CCalendar::getUserLanguageId($event->getOwner()?->getId());
127 $eventDescription = '';
128
129 if (
130 $event->getAttendeesCollection()
131 && ($attendeesCodes = $event->getAttendeesCollection()->getAttendeesCodes())
132 && count($attendeesCodes) > 1
133 )
134 {
135 $eventDescription =
136 $this->formatAttendeesDescription($attendeesCodes, $event->getParentId(), $languageId)
137 . ';'
138 ;
139 }
140
141 if (!empty($params['eventUrl']))
142 {
143 if (!empty($eventDescription))
144 {
145 $eventDescription .= '\\n\\n';
146 }
147
148 $eventDescription .= Loc::getMessage('EC_EVENT_LINK') . $params['eventUrl'];
149 }
150
151 if (!empty($params['conferenceUrl']))
152 {
153 if (!empty($eventDescription))
154 {
155 $eventDescription .= '\\n\\n';
156 }
157
158 $eventDescription .= Loc::getMessage('EC_CONFERENCE_LINK') . $params['conferenceUrl'];
159 }
160
161 if (!empty($event->getDescription()))
162 {
163 if (!empty($eventDescription))
164 {
165 $eventDescription .= '\\n\\n';
166 }
167
168 $eventDescription .= Loc::getMessage('EC_CALENDAR_ICS_COMMENT') . ': '. $event->getDescription();
169 }
170
171 return $eventDescription;
172 }
173
174 private function formatAttendeesDescription(array $codes, ?int $parentId, string $languageId): string
175 {
176 $users = \CCalendar::GetDestinationUsers($codes, true);
177
178 $names = array_map(static function($user) {
179 return $user['FORMATTED_NAME'];
180 }, $users);
181
182 $result = Loc::getMessage('EC_ATTENDEES_LIST_TITLE') . ": ";
183 if ($names)
184 {
185 $result .= implode(", ", $names);
186 }
187
188 return $result;
189 }
190
191 private function prepareLocationField(Event $event): string
192 {
193 $locationProperty = $event->getLocation();
194
195 return $locationProperty ? \CCalendar::getTextLocation($locationProperty->getActualLocation()) : '';
196 }
197}
const BX_ROOT
Определения bx_root.php:3
getIcsFileContent(Event $event, array $params)
Определения icsmanager.php:68
prepareEventDescription(Event $event, array $params)
Определения icsmanager.php:124
createIcsFile(Event $event, array $params)
Определения icsmanager.php:39
static getInstance()
Определения icsmanager.php:26
static getTimestamp($date, $round=true, $getTime=true)
Определения util.php:60
</td ></tr ></table ></td ></tr >< tr >< td class="bx-popup-label bx-width30"><?=GetMessage("PAGE_NEW_TAGS")?> array( $site)
Определения file_new.php:804
$fileContent
Определения file_property.php:47
$result
Определения get_property_values.php:14
$_SERVER["DOCUMENT_ROOT"]
Определения cron_frame.php:9
$user
Определения mysql_to_pgsql.php:33
$event
Определения prolog_after.php:141
</p ></td >< td valign=top style='border-top:none;border-left:none;border-bottom:solid windowtext 1.0pt;border-right:solid windowtext 1.0pt;padding:0cm 2.0pt 0cm 2.0pt;height:9.0pt'>< p class=Normal align=center style='margin:0cm;margin-bottom:.0001pt;text-align:center;line-height:normal'>< a name=ТекстовоеПоле54 ></a ><?=($taxRate > count( $arTaxList) > 0) ? $taxRate."%"
Определения waybill.php:936
if($inWords) echo htmlspecialcharsbx(Number2Word_Rus(roundEx($totalVatSum $params['CURRENCY']
Определения template.php:799