1C-Bitrix 25.700.0
Загрузка...
Поиск...
Не найдено
mapper.php
См. документацию.
1<?php
2
3namespace Bitrix\Calendar\Sharing\Link\Rule;
4
5use Bitrix\Calendar\Internals\SharingLinkRuleTable;
6use Bitrix\Calendar\Internals\SharingObjectRuleTable;
7use Bitrix\Main;
8use Bitrix\Main\Localization\Loc;
9
10class Mapper
11{
12 protected const DEFAULT_SLOT_SIZE = 60;
13 protected const DEFAULT_FROM = 540;
14 protected const DEFAULT_TO = 1080;
15 protected const DEFAULT_WORKDAYS = [1, 2, 3, 4, 5];
16
17 public function convertToArray(?Rule $rule = null): array
18 {
19 if (is_null($rule))
20 {
21 $rule = new Rule();
22 }
23
24 $slotSize = $rule->getSlotSize() ?? self::DEFAULT_SLOT_SIZE;
25
26 $ranges = $this->getSortedRanges($rule->getRanges() ?? []);
27 $rangeArrays = [];
28 foreach ($ranges as $range)
29 {
30 $weekdays = $range->getWeekdays() ?? $this->getWorkdays();
31 $rangeArrays[] = [
32 'from' => $range->getFrom() ?? $this->getDefaultFrom(),
33 'to' => $range->getTo() ?? $this->getDefaultTo(),
34 'weekdays' => $weekdays,
35 'weekdaysTitle' => $this->getWeekdaysTitle($weekdays),
36 ];
37 }
38 if (empty($rangeArrays))
39 {
40 $weekdays = $this->getWorkdays();
41 $rangeArrays = [
42 [
43 'from' => $this->getDefaultFrom(),
44 'to' => $this->getDefaultTo(),
45 'weekdays' => $weekdays,
46 'weekdaysTitle' => $this->getWeekdaysTitle($weekdays),
47 ],
48 ];
49 }
50
51 return [
52 'slotSize' => $slotSize,
53 'ranges' => $rangeArrays,
54 ];
55 }
56
57 public function buildRuleFromArray(array $ruleArray): Rule
58 {
59 $slotSize = $ruleArray['slotSize'] ?? self::DEFAULT_SLOT_SIZE;
60
61 $rangeArrays = $ruleArray['ranges'] ?? [];
62 $ranges = [];
63 foreach ($rangeArrays as $rangeArray)
64 {
65 $from = $rangeArray['from'] ?? $this->getDefaultFrom();
66 $to = $rangeArray['to'] ?? $this->getDefaultTo();
67 $weekdays =
68 is_array($rangeArray['weekdays'] ?? null)
69 ? $rangeArray['weekdays']
70 : $this->getWorkdays()
71 ;
72 $ranges[] = (new Range())
73 ->setFrom($from)
74 ->setTo($to)
75 ->setWeekdays($weekdays);
76 }
77 if (empty($ranges))
78 {
79 $ranges = [
80 (new Range())
81 ->setFrom($this->getDefaultFrom())
82 ->setTo($this->getDefaultTo())
83 ->setWeekdays($this->getWorkdays())
84 ];
85 }
86
87 return (new Rule())
88 ->setSlotSize($slotSize)
89 ->setRanges($this->getSortedRanges($ranges));
90 }
91
92 public function getFromLinkObjectRule(LinkObjectRule $objectRule): Rule
93 {
94 $ruleEOCollection = null;
95
96 if (is_int($objectRule->getLinkId()))
97 {
98 $ruleEOCollection = $this->getRuleEOByLinkId($objectRule->getLinkId());
99 }
100
101 if ($ruleEOCollection === null || empty($ruleEOCollection->getAll()))
102 {
103 $ruleEOCollection = $this->getRuleEOByObject($objectRule->getObjectId(), $objectRule->getObjectType());
104 }
105
106 return $this->convertToObject($ruleEOCollection);
107 }
108
109 protected function getRuleEOByLinkId(int $linkId): ?Main\ORM\Objectify\Collection
110 {
112 ->setSelect(['*'])
113 ->where('LINK_ID', $linkId)
114 ->exec()->fetchCollection();
115 }
116
117 protected function getRuleEOByObject(int $objectId, string $objectType): ?Main\ORM\Objectify\Collection
118 {
120 ->setSelect(['*'])
121 ->where('OBJECT_ID', $objectId)
122 ->where('OBJECT_TYPE', $objectType)
123 ->exec()->fetchCollection();
124 }
125
126 protected function convertToObject($ruleEOCollection): Rule
127 {
128 if (!empty($ruleEOCollection->getAll()))
129 {
130 $slotSize = $ruleEOCollection->getAll()[0]->getSlotSize();
131 $ranges = array_map(static fn($ruleEO) => (new Range())
132 ->setWeekdays(array_map('intval', explode(',', $ruleEO->getWeekdays())))
133 ->setFrom($ruleEO->getTimeFrom())
134 ->setTo($ruleEO->getTimeTo())
135 , $ruleEOCollection->getAll());
136
137 return (new Rule())
138 ->setSlotSize($slotSize)
139 ->setRanges($ranges)
140 ;
141 }
142
143 $slotSize = self::DEFAULT_SLOT_SIZE;
144 $ranges = [
145 (new Range())
146 ->setFrom($this->getDefaultFrom())
147 ->setTo($this->getDefaultTo())
148 ->setWeekdays($this->getWorkdays())
149 ];
150
151 return (new Rule())
152 ->setSlotSize($slotSize)
153 ->setRanges($this->getSortedRanges($ranges));
154 }
155
156 public function saveForLinkObject(Rule $rule, LinkObjectRule $linkObjectRule): void
157 {
158 $rows = array_map(static fn($range) => [
159 'LINK_ID' => $linkObjectRule->getLinkId(),
160 'SLOT_SIZE' => $rule->getSlotSize(),
161 'WEEKDAYS' => implode(',', $range->getWeekdays()),
162 'TIME_FROM' => $range->getFrom(),
163 'TIME_TO' => $range->getTo(),
164 ], $rule->getRanges());
165 SharingLinkRuleTable::deleteByFilter([
166 'LINK_ID' => $linkObjectRule->getLinkId(),
167 ]);
169
170 $rows = array_map(static fn($range) => [
171 'OBJECT_ID' => $linkObjectRule->getObjectId(),
172 'OBJECT_TYPE' => $linkObjectRule->getObjectType(),
173 'SLOT_SIZE' => $rule->getSlotSize(),
174 'WEEKDAYS' => implode(',', $range->getWeekdays()),
175 'TIME_FROM' => $range->getFrom(),
176 'TIME_TO' => $range->getTo(),
177 ], $rule->getRanges());
178 SharingObjectRuleTable::deleteByFilter([
179 'OBJECT_ID' => $linkObjectRule->getObjectId(),
180 'OBJECT_TYPE' => $linkObjectRule->getObjectType(),
181 ]);
183 }
184
185 public function deleteLinkRule(int $linkId): void
186 {
187 SharingLinkRuleTable::deleteByFilter([
188 'LINK_ID' => $linkId,
189 ]);
190 }
191
192 public function getChanges(?Rule $rule): array
193 {
194 $defaultRule = $this->convertToArray();
195 $ruleArray = $this->convertToArray($rule);
196
197 $changes = [
198 'customDays' => 'N',
199 'customLength' => 'N',
200 ];
201
202 if ($defaultRule['slotSize'] !== $ruleArray['slotSize'])
203 {
204 $changes['customLength'] = 'Y';
205 }
206
207 if ($defaultRule['ranges'] !== $ruleArray['ranges'])
208 {
209 $changes['customDays'] = 'Y';
210 }
211
212 return $changes;
213 }
214
215 protected function getDefaultFrom(): int
216 {
217 $settings = \CCalendar::GetSettings();
218 if (!isset($settings['work_time_start']))
219 {
220 return self::DEFAULT_FROM;
221 }
222
223 return $this->getMinutesFromTimeString($settings['work_time_start']);
224 }
225
226 protected function getDefaultTo(): int
227 {
228 $settings = \CCalendar::GetSettings();
229 if (!isset($settings['work_time_end']))
230 {
231 return self::DEFAULT_TO;
232 }
233
234 return $this->getMinutesFromTimeString($settings['work_time_end']);
235 }
236
237 protected function getMinutesFromTimeString(string $timeString): int
238 {
239 $time = strtotime(str_replace('.', ':', "$timeString:00"));
240 return (int)date('H', $time) * 60 + (int)date('i', $time);
241 }
242
247 protected function getSortedRanges(array $ranges): array
248 {
249 usort($ranges, fn($a, $b) => $this->compareRanges($a, $b));
250
251 return $ranges;
252 }
253
259 protected function compareRanges(Range $range1, Range $range2): int
260 {
261 $weekdaysWeight1 = $this->getWeekdaysWeight($range1->getWeekdays());
262 $weekdaysWeight2 = $this->getWeekdaysWeight($range2->getWeekdays());
263
264 if ($weekdaysWeight1 !== $weekdaysWeight2)
265 {
266 return $weekdaysWeight1 - $weekdaysWeight2;
267 }
268
269 if ($range1->getFrom() !== $range2->getFrom())
270 {
271 return $range1->getFrom() - $range2->getFrom();
272 }
273
274 return $range1->getTo() - $range2->getTo();
275 }
276
281 protected function getWeekdaysWeight(array $weekdays): int
282 {
283 $weekStart = $this->getWeekStart();
284 $mappedWeekdays = array_map(static fn($w) => $w < $weekStart ? $w + 10 : $w, $weekdays);
285 sort($mappedWeekdays);
286
287 $weight = 0;
288 foreach ($mappedWeekdays as $index => $w)
289 {
290 $weight += $w * 10 ** (10 - $index);
291 }
292
293 return $weight;
294 }
295
300 protected function getWeekdaysTitle(array $weekdays): string
301 {
302 $workdays = $this->getWorkdays();
303 sort($weekdays);
304 sort($workdays);
305 if (implode(',', $weekdays) === implode(',', $workdays))
306 {
307 return Loc::getMessage('CALENDAR_SHARING_WORKDAYS_MSGVER_1');
308 }
309
310 return $this->formatWeekdays($weekdays);
311 }
312
317 protected function formatWeekdays(array $weekdays): string
318 {
319 $weekdaysLoc = $this->getWeekdaysLoc();
320 $weekdays = array_map(static fn($weekday) => $weekdaysLoc[$weekday], $this->getSortedWeekdays($weekdays));
321
322 return implode(', ', $weekdays);
323 }
324
329 protected function getSortedWeekdays(array $weekdays): array
330 {
331 $weekStart = $this->getWeekStart();
332 $mappedWeekdays = array_map(static fn($w) => $w < $weekStart ? $w + 10 : $w, $weekdays);
333 usort($mappedWeekdays, static fn($a, $b) => $a - $b);
334
335 return array_map(static fn($w) => $w % 10, $mappedWeekdays);
336 }
337
341 protected function getWorkdays(): array
342 {
343 $settings = \CCalendar::GetSettings();
344 if (empty($settings['week_holidays']))
345 {
346 return self::DEFAULT_WORKDAYS;
347 }
348
349 $holidays = array_map(static function(string $weekday) {
350 return \CCalendar::IndByWeekDay($weekday);
351 }, $settings['week_holidays']);
352
353 return array_values(array_diff([0, 1, 2, 3, 4, 5, 6], $holidays));
354 }
355
359 protected function getWeekStart(): int
360 {
361 $weekStart = \CCalendar::GetWeekStart();
362
363 return \CCalendar::IndByWeekDay($weekStart);
364 }
365
369 protected function getWeekdaysLoc(): array
370 {
371 $dayLength = 60 * 60 * 24;
372 $now = time();
373 $dayOfWeek = FormatDate('w', $now);
374 $sunday = $now - $dayOfWeek * $dayLength;
375 $weekdays = [0, 1, 2, 3, 4, 5, 6];
376
377 return array_map(static fn($weekday) => FormatDate('D', $sunday + $weekday * $dayLength), $weekdays);
378 }
379}
static addMulti($rows, $ignoreEvents=false)
Определения datamanager.php:1041
</td ></tr ></table ></td ></tr >< tr >< td class="bx-popup-label bx-width30"><?=GetMessage("PAGE_NEW_TAGS")?> array( $site)
Определения file_new.php:804
FormatDate($format="", $timestamp=false, $now=false, ?string $languageId=null)
Определения tools.php:871
$time
Определения payment.php:61
$settings
Определения product_settings.php:43
else $a
Определения template.php:137
$rows
Определения options.php:264