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; } protected 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; } } ?>