diff options
Diffstat (limited to 'app/php/dto/CalendarGridDTO.php')
-rw-r--r-- | app/php/dto/CalendarGridDTO.php | 84 |
1 files changed, 84 insertions, 0 deletions
diff --git a/app/php/dto/CalendarGridDTO.php b/app/php/dto/CalendarGridDTO.php new file mode 100644 index 0000000..f5d91a5 --- /dev/null +++ b/app/php/dto/CalendarGridDTO.php @@ -0,0 +1,84 @@ +<?php + +Prado::using('Application.dto.CalendarGridDayDTO'); +Prado::using('Application.dto.GridEventDTO'); + +class CalendarGridDTO { + + public $DateFrom; + public $DateTo; + public $Weeks = []; + + public function __construct($events, DateTime $dateFrom, DateTime $dateTo) { + $this->DateFrom = DateTimeImmutable::createFromMutable($dateFrom); + $this->DateTo = DateTimeImmutable::createFromMutable($dateTo); + $date = $this->DateFrom; + $days = []; + $previousDay = NULL; + while ($date <= $this->DateTo) { + $day = $this->_getGridDay($date, $events, $previousDay); + $days[] = $day; + $previousDay = $day; + $date = $date->modify('+1 day'); + } + $this->Weeks = array_chunk($days, 7); + } + + private function _getContinuedEventGridPositions( + CalendarGridDayDTO $day, + CalendarGridDayDTO $previousDay = NULL) { + $eventPositions = []; + if ($previousDay) { + foreach ($day->Events as $event) { + if (in_array($event, $previousDay->Events)) { + $eventPositions[] = $event->GridPosition; + } + } + } + return $eventPositions; + } + + private function _alignEvents(array $eventPositions, array $events) { + $previousCount = count($eventPositions); + foreach ($events as $event) { + if ($event->GridPosition === NULL) { + $event->GridPosition = min( + array_diff( + range(0, count($events) + $previousCount), + $eventPositions + ) + ); + $eventPositions[] = $event->GridPosition; + } + } + usort($events, ['GridEventDTO', '__compare']); + return $events; + } + + private function _fillEventGrid(array $events) { + $previousEvent = -1; + foreach ($events as $event) { + $eventStep = $event->GridPosition - $previousEvent; + if ($eventStep > 1) { + array_splice( + $events, $previousEvent + 1, 0, array_fill(0, $eventStep - 1, NULL) + ); + } + $previousEvent = $event->GridPosition; + } + return $events; + } + + private function _getGridDay(DateTimeImmutable $date, + array $events, + CalendarGridDayDTO $previousDay = NULL) { + $day = new CalendarGridDayDTO($date, $events); + $eventPositions = $this->_getContinuedEventGridPositions($day, $previousDay); + $day->Events = $this->_alignEvents($eventPositions, $day->Events); + $day->Events = $this->_fillEventGrid($day->Events); + return $day; + } + +} + +?> |