true])] public function month( Request $request, SpeakerRepositoryQuery $speakerQuery, ProjectRepositoryQuery $projectQuery, EventRepositoryQuery $eventQuery ): Response { $projects = $projectQuery->create()->withIds($request->query->get('projects'))->find(); $speakers = $speakerQuery->create()->withIds($request->query->get('speakers'))->find(); $month = $request->query->get('month', date('m')); $year = $request->query->get('year', date('Y')); $dateFrom = new \DateTime(sprintf('%d-%d-1', $year, $month)); $currentMonthFirstDayOfWeek = $dateFrom->format('N'); $nextMonthFirstDayOfWeek = date('N', $dateFrom->getTimestamp() + 3600 * 24 * $dateFrom->format('t')); $currentMonthDays = $dateFrom->format('t'); $prevMonthDays = date('t', $dateFrom->getTimestamp() - 3600); $days = []; if ($currentMonthFirstDayOfWeek > 1) { for ($day = $prevMonthDays - $currentMonthFirstDayOfWeek + 2; $day <= $prevMonthDays; ++$day) { $days[] = [ 'day' => $day, 'currentMonth' => false, 'events' => [], ]; } } for ($day = 1; $day <= $currentMonthDays; ++$day) { $events = $eventQuery->create() ->ofProjects($projects) ->ofSpeakers($speakers) ->ofMonth($month) ->ofYear($year) ->ofDay($day) ->find() ; $events = array_map(function ($event) { return [ 'uid' => $event->getUid(), 'summary' => $event->getSummary(), 'description' => $event->getCleanedDescription(), 'startAt' => $event->getStartAt() ? $event->getStartAt()->format('H:i') : null, 'finishAt' => $event->getFinishAt() ? $event->getFinishAt()->format('H:i') : null, 'projects' => array_map(fn ($i) => [ 'id' => $i->getId(), 'label' => $i->getLabel(), ], $event->getProjects()->toArray()), 'speakers' => array_map(fn ($i) => [ 'id' => $i->getId(), 'name' => $i->getName(), 'color' => $i->getColor(), ], $event->getSpeakers()->toArray()), ]; }, $events); $days[] = [ 'day' => $day, 'currentMonth' => true, 'events' => $events, ]; } if ($nextMonthFirstDayOfWeek > 1) { $day = 0; for ($u = $nextMonthFirstDayOfWeek; $u <= 7; ++$u) { $days[] = [ 'day' => ++$day, 'currentMonth' => false, 'events' => [], ]; } } return $this->json($days); } #[Route('/admin/calendar/projects', name: 'admin_calendar_projects', options: ['expose' => true])] public function projects(ProjectRepositoryQuery $query): Response { $entities = array_map(function ($entity) { return [ 'id' => $entity->getId(), 'label' => $entity->getLabel(), ]; }, $query->create()->orderBy('.label')->find()); return $this->json($entities); } #[Route('/admin/calendar/speakers', name: 'admin_calendar_speakers', options: ['expose' => true])] public function speakers(SpeakerRepositoryQuery $query): Response { $entities = array_map(function ($entity) { return [ 'id' => $entity->getId(), 'name' => $entity->getName(), ]; }, $query->create()->orderBy('.name')->find()); return $this->json($entities); } }