diff options
author | emkael <emkael@tlen.pl> | 2016-06-16 02:25:37 +0200 |
---|---|---|
committer | emkael <emkael@tlen.pl> | 2016-06-16 11:50:18 +0200 |
commit | 0fea2103dd4cc5a04a756d5a87e26d39ea347e49 (patch) | |
tree | 193c6af2ffe418c71348944528178e1b11e46fce /app/frontend/dto/GroupedCalendarGridDTO.php | |
parent | ece88ff6d4c59418dc043c735252aca012eee207 (diff) |
* data objects for grouped calendar view
Diffstat (limited to 'app/frontend/dto/GroupedCalendarGridDTO.php')
-rw-r--r-- | app/frontend/dto/GroupedCalendarGridDTO.php | 70 |
1 files changed, 70 insertions, 0 deletions
diff --git a/app/frontend/dto/GroupedCalendarGridDTO.php b/app/frontend/dto/GroupedCalendarGridDTO.php new file mode 100644 index 0000000..401d8c2 --- /dev/null +++ b/app/frontend/dto/GroupedCalendarGridDTO.php @@ -0,0 +1,70 @@ +<?php + +Prado::using('Application.dto.GroupedCalendarGridDayDTO'); +Prado::using('Application.dto.GridEventDTO'); + +class GroupedCalendarGridDTO extends CalendarGridDTO { + + private function _getContinuedEventGridPositions( + CalendarGridDayDTO $day, + CalendarGridDayDTO $previousDay = NULL) { + $eventPositions = []; + if ($previousDay) { + foreach ($day->Events as $group) { + foreach ($previousDay->Events as $pGroup) { + if ($group && $pGroup) { + if ($group->Calendar == $pGroup->Calendar) { + $group->GridPosition = $pGroup->GridPosition; + $eventPositions[] = $group->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, ['GridEventGroupDTO', '__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; + } + + protected function _getGridDay(DateTimeImmutable $date, + array $events, + CalendarGridDayDTO $previousDay = NULL) { + $day = new GroupedCalendarGridDayDTO($date, $events); + $eventPositions = $this->_getContinuedEventGridPositions($day, $previousDay); + $day->Events = $this->_alignEvents($eventPositions, $day->Events); + $day->Events = $this->_fillEventGrid($day->Events); + return $day; + } + +} + +?> |