1C-Bitrix 25.700.0
Загрузка...
Поиск...
Не найдено
event.php
См. документацию.
1<?php
2
3namespace Bitrix\Calendar\Core\Mappers;
4
5use Bitrix\Calendar\Core;
6use Bitrix\Calendar\Internals\EO_Event;
7use Bitrix\Calendar\Internals\EventTable;
8use Bitrix\Main\ArgumentException;
9use Bitrix\Main\Error;
10use Bitrix\Main\ObjectException;
11use Bitrix\Main\ObjectPropertyException;
12use Bitrix\Main\ORM\Data\AddResult;
13use Bitrix\Main\ORM\Query\Result;
14use Bitrix\Main\ORM\Query\Query;
15use Bitrix\Main\SystemException;
16use CCalendar;
17
18class Event extends Mapper
19{
20 private const JS_DATE_FORMAT = 'D M d Y';
21 private const JS_DATE_TIME_FORMAT = 'D M d Y H:i:s';
22
35 public function getCollectionByIds(array $ids, int $ownerId, array $fields = ['*']): Core\Event\EventCollection
36 {
37 $eventDM = EventTable::query()
38 ->whereIn('ID', $ids)
39 ->where('OWNER_ID', $ownerId)
40 ->setSelect($fields)
41 ->exec()
42 ;
43
44 $collection = new Core\Event\EventCollection();
45
46 while ($event = $eventDM->fetch())
47 {
48 $collection->add((new Core\Builders\EventBuilderFromArray($event))->build());
49 }
50
51 return $collection;
52 }
53
62 {
63 $entity->setDateModified(new Core\Base\Date());
64 $result = $this->save($entity, $params);
65
66 if ($result->isSuccess())
67 {
68 return $this->getById($result->getId());
69 }
70
71 return null;
72 }
73
83 {
84 $entity->setDateModified(new Core\Base\Date());
86
87 $params = array_merge($params, [
88 'arFields' => $data,
89 'originalFrom' => $params['originalFrom'] ?? null,
90 'checkPermission' => false,
91 'userId' => $params['userId']
92 ?? ($entity->getOwner() ? $entity->getOwner()->getId() : null),
93 ]);
94
95 $result = CCalendar::SaveEvent($params);
96 $id = (is_array($result) && isset($result['id']))
97 ? (int)$result['id']
98 : $result
99 ;
100
101 if (is_numeric($id))
102 {
103 return $this->getById((int)$id);
104 }
105
106 return null;
107 }
108
119 {
120 $params = array_merge($params,[
121 'Event' => $this->prepareArrayForDelete($entity),
122 'id' => $entity->getId(),
123 'checkPermissions' => false,
124 'bMarkDeleted' => true,
125 'userId' => $params['userId']
126 ?? $entity->getOwner() ? $entity->getOwner()?->getId() : null,
127 ]);
128
129 if (CCalendar::DeleteEvent($entity->getId(), true, $params) && !empty($params['bMarkDeleted']))
130 {
131 $entity->setIsDeleted(true);
132
133 return $entity;
134 }
135
136 return null;
137 }
138
144 private function prepareArrayForDelete(Core\Event\Event $event): ?array
145 {
146 try
147 {
148 return $this->convertToArray($event);
149 }
150 catch(\Throwable $e)
151 {
152 return null;
153 }
154 }
155
164 private function save(Core\Event\Event $event, array $params = []): AddResult
165 {
166 $data = $this->convertToArray($event);
167
168 $params = array_merge($params, [
169 'arFields' => $data,
170 'checkPermissions' => false,
171 'userId' => $event->getOwner() ? $event->getOwner()->getId() : null, // todo how get userId ?
172 ]);
173
174 $id = CCalendar::SaveEvent($params);
175
176 $result = new AddResult();
177 if ($id)
178 {
179 $result->setPrimary($id);
180 }
181 else
182 {
183 $result->addError(new Error('Error of create event'));
184 }
185
186 return $result;
187 }
188
197 private function prepareReminders(Core\Event\Properties\RemindCollection $collection, Core\Base\Date $start): array
198 {
199 $result = [];
200 $collection->setEventStart(clone $start);
201 $collection->deDuplicate();
203 foreach ($collection->getCollection() as $reminder)
204 {
205 $remind = [
206 'before' => null,
207 'count' => null,
208 'time' => null,
209 'value' => null,
210 ];
211 if ($reminder->getDaysBefore() !== null)
212 {
213 $remind['type'] = Core\Event\Properties\Remind::UNIT_DAY_BEFORE;
214 $remind['before'] = $reminder->getDaysBefore();
215 $remind['time'] = $reminder->getTimeOffset();
216 }
217 elseif ($reminder->isSimpleType())
218 {
219 $remind['type'] = str_replace('minutes', 'min', $reminder->getUnits()) ;
220 $remind['count'] = $reminder->getTime();
221 }
222 else
223 {
224 $remind['type'] = Core\Event\Properties\Remind::UNIT_DATES;
225 $remind['value'] = $reminder->getSpecificTime();
226 }
227 $result[] = $remind;
228 }
229
230 return $result;
231 }
232
241 {
242 $jsFormat = $event->isFullDayEvent() ? self::JS_DATE_FORMAT : self::JS_DATE_TIME_FORMAT;
243
244 return [
245 'ID' => $event->getId(),
246 'ACTIVE' => $event->isActive() ? 'Y' : 'N',
247 'DELETED' => $event->isDeleted() ? 'Y' : 'N',
248 'DT_SKIP_TIME' => $event->isFullDayEvent() ? 'Y' : 'N',
249 'DAV_XML_ID' => $event->getUid(),
250 'TZ_FROM' => (string)$event->getStartTimeZone(),
251 'TZ_TO' => (string)$event->getEndTimeZone(),
252 'NAME' => $event->getName(),
253 'DATE_FROM' => (string)$event->getStart(),
254 'DATE_TO' => (string)$event->getEnd(),
255 'ORIGINAL_DATE_FROM' => $this->prepareOriginalDateFrom($event),
256 'DESCRIPTION' => $event->getDescription(),
257 'ACCESSIBILITY' => $event->getAccessibility(),
258 'PRIVATE_EVENT' => $event->isPrivate(),
259 'IMPORTANCE' => $event->getImportance(),
260 'OWNER_ID' => $event->getOwner()?->getId(),
261 'CREATED_BY' => $event->getOwner()?->getId(),
262 'CAL_TYPE' => $event->getCalendarType(),
263 'EVENT_TYPE' => $event->getSpecialLabel(),
264 'LOCATION' => $event->getLocation() ? $event->getLocation()->getActualLocation() : '',
265 'REMIND' => ($event->getRemindCollection() && $event->getRemindCollection()->count())
266 ? $this->prepareReminders($event->getRemindCollection(), $event->getStart())
267 : null,
268 'RRULE' => $event->isRecurrence()
269 ? $event->getRecurringRule()?->toArray()
270 : null,
271 'EXDATE' => $event->getExcludedDateCollection()?->toString(),
272 'RECURRENCE_ID' => $event->getRecurrenceId(),
273 'IS_MEETING' => $event->isMeeting(),
274 'MEETING_STATUS' => $event->getMeetingStatus(),
275 'MEETING_HOST' => $event->getEventHost()?->getId(),
276 'MEETING' => $event->getMeetingDescription()?->getFields(),
277 'ATTENDEES_CODES' => $event->getAttendeesCollection()
278 ? $event->getAttendeesCollection()->getFields()['attendeesCodesCollection']
279 : null,
280 'SECTIONS' => $event->getSection() ? [$event->getSection()->getId()] : null,
281 'SECTION_ID' => $event->getSection() ? $event->getSection()->getId() : null,
282 'RELATIONS' => $event->getRelations()?->getFields(),
283 'DATE_CREATE' => $event->getDateCreate()?->toString(),
284 'TIMESTAMP_X' => $event->getDateModified()?->toString(),
285 'VERSION' => $event->getVersion(),
286 'COLOR' => $event->getColor(),
287 'DT_LENGTH' => $event->getDtLength(),
288 'DATE_FROM_FORMATTED' => $event->getStart()->format($jsFormat),
289 'DATE_TO_FORMATTED' => $event->getEnd()->format($jsFormat),
290 ];
291 }
292
302 protected function getOneEntityByFilter(array $filter): ?object
303 {
304 $eventData = EventTable::query()
305 ->setFilter($filter)
306 ->setSelect(['*'])
307 ->fetchObject()
308 ;
309
310 try
311 {
312 if ($eventData)
313 {
314 return $this->convertToObject($eventData);
315 }
316
317 }
318 catch (\Exception)
319 {
320 return null;
321 }
322
323 return null;
324 }
325
331 protected function convertToObject($objectEO): Core\Base\EntityInterface
332 {
333 return (new Core\Builders\EventBuilderFromEntityObject($objectEO))->build();
334 }
335
339 protected function getEntityName(): string
340 {
341 return 'event';
342 }
343
347 protected function getMapClass(): string
348 {
349 return Core\Event\EventMap::class;
350 }
351
362 {
363 $params['select'] = $params['select'] ?? ["*"];
364 return EventTable::getList($params);
365 }
366
372 public function getMapFullChainByParentId(int $id, int $ownerId, array $fields = ['*']): Core\Event\EventMap
373 {
374 $eventDM = EventTable::query()
375 ->where(Query::filter()
376 ->logic('or')
377 ->where('PARENT_ID', $id)
378 ->where('RECURRENCE_ID', $id)
379 )
380 ->where('OWNER_ID', $ownerId)
381 ->setSelect($fields)
382 ->exec()
383 ;
384
385 $eventMap = new Core\Event\EventMap();
386
387 while ($event = $eventDM->fetch())
388 {
389 $eventMap->add((new Core\Builders\EventBuilderFromArray($event))->build(), (int)$event['ID']);
390 }
391
392 return $eventMap;
393 }
394
404 public function getEntity(int $id, ?array $additionalParams = null): ?Core\Event\Event
405 {
406 $eventDM = EventTable::query()
407 ->where('ID', $id)
408 ;
409
410 if ($additionalParams)
411 {
412 //filter
413 if (isset($additionalParams['filter'])
414 && is_iterable($additionalParams['filter'])
415 )
416 {
417 foreach ($additionalParams['filter'] as $filter)
418 {
419 $eventDM->addFilter($filter['key'], $filter['value']);
420 }
421 }
422
423 //select
424 if (isset($additionalParams['fields'])
425 && is_array($additionalParams['fields'])
426 )
427 {
428 $eventDM->setSelect($additionalParams['fields']);
429 }
430 else
431 {
432 $eventDM->setSelect(['*']);
433 }
434 }
435 else
436 {
437 $eventDM->setSelect(['*']);
438 }
439
440 $event = $eventDM->exec()->fetchObject();
441
442 return $event
444 : null
445 ;
446 }
447
455 {
456 $eventFields = [
457 'EXDATE' => (string)$event->getExcludedDateCollection(),
458 ];
459
460 $result = EventTable::update(
461 $event->getId(),
462 array_intersect_key($eventFields, array_flip($fields))
463 );
464
465 if ($result->isSuccess())
466 {
467 return $event;
468 }
469
470 throw new Core\Base\BaseException('do not patch event');
471 }
472
480 public function getByArray(array $fields)
481 {
482 if ($this->getCacheMap()->has($fields['ID']))
483 {
484 return $this->getCacheMap()->getItem($fields['ID']);
485 }
486
488 $this->getCacheMap()->add($entity, $entity->getId());
489
490 return $entity;
491 }
492
499 {
500 return (new Core\Builders\EventBuilderFromArray($fields))->build();
501 }
502
506 protected function getEntityClass(): string
507 {
508 return Core\Event\Event::class;
509 }
510
516 private function prepareOriginalDateFrom(Core\Event\Event $event): ?string
517 {
518 $result = null;
519 if ($event->getOriginalDateFrom())
520 {
521 if ($event->getStartTimeZone())
522 {
523 $event->getOriginalDateFrom()->setTimezone($event->getStartTimeZone()->getTimeZone());
524 }
525 $result = (string)$event->getOriginalDateFrom();
526 }
527
528 return $result;
529 }
530}
convertToObject($objectEO)
Определения event.php:331
getMapFullChainByParentId(int $id, int $ownerId, array $fields=[' *'])
Определения event.php:372
updateEntity($entity, array $params=[])
Определения event.php:82
convertFromArray(array $fields)
Определения event.php:498
getOneEntityByFilter(array $filter)
Определения event.php:302
convertToArray(Core\Event\Event $event)
Определения event.php:240
deleteEntity(Core\Base\EntityInterface $entity, array $params)
Определения event.php:118
getByArray(array $fields)
Определения event.php:480
getEntity(int $id, ?array $additionalParams=null)
Определения event.php:404
createEntity($entity, array $params=[])
Определения event.php:61
getDataManagerResult(array $params)
Определения event.php:361
patch(Core\Event\Event $event, array $fields)
Определения event.php:454
getCollectionByIds(array $ids, int $ownerId, array $fields=[' *'])
Определения event.php:35
getById(int $id)
Определения mapper.php:28
Определения date.php:9
$data['IS_AVAILABLE']
Определения .description.php:13
</td ></tr ></table ></td ></tr >< tr >< td class="bx-popup-label bx-width30"><?=GetMessage("PAGE_NEW_TAGS")?> array( $site)
Определения file_new.php:804
$result
Определения get_property_values.php:14
$start
Определения get_search.php:9
$entity
$filter
Определения iblock_catalog_list.php:54
$event
Определения prolog_after.php:141
if( $daysToExpire >=0 &&$daysToExpire< 60 elseif)( $daysToExpire< 0)
Определения prolog_main_admin.php:393
if($inWords) echo htmlspecialcharsbx(Number2Word_Rus(roundEx($totalVatSum $params['CURRENCY']
Определения template.php:799
$reminder
Определения options.php:2415
$fields
Определения yandex_run.php:501