eventRegistrations; if ( !isset($registrations) || count($registrations) === 0 ){ $event->delete(); } else { $event->deleted_at = time(); $event->save(false); } } /** * @param EventInterval $interval * @return TimeTableMonth * @throws Exception */ public function loadTimeTable($interval) { $timeTable = new TimeTableMonth(); $timeTable->interval = $interval; /** @var DateTime[] $displayDates */ $displayDates = $interval->getAllDisplayDates(); $timeTable->weeks = []; /** @var DateTime $displayDate */ foreach ($displayDates as $displayDate) { $timeTableMonthDay = new TimeTableMonthDay(); $timeTableMonthDay->date = $displayDate; $timeTableMonthDay->active = $interval->isActive($displayDate); $timeTable->days[] = $timeTableMonthDay; $weekNumber = $displayDate->format('W'); if (!isset($timeTable->weeks[$weekNumber])) { $week = new TimeTableMonthWeek(); $week->weekNumber = $weekNumber; $timeTable->weeks[$weekNumber] = $week; } $weekDayName = strtolower($displayDate->format('l')); $timeTable->weeks[$weekNumber]->$weekDayName = $timeTableMonthDay; } $dateTimeFrom = $interval->firstActiveDate; $dateTimeTo = (clone $interval->lastActiveDate)->modify('+1 day'); // get events between active dates $events =$this->getEvents($dateTimeFrom,$dateTimeTo); // set events per day /** @var Event $event */ foreach ($events as $event) { foreach ($timeTable->days as $date) { $eventDay = new DateTime(); $eventDay->setTimestamp($event->start); /** @noinspection PhpUndefinedMethodInspection */ $eventDay->setTimezone($date->date->getTimezone()); $eventDay->setTime(0, 0); if ($date->date == $eventDay) { $date->events[] = $event; break; } } } return $timeTable; } /** * Get all active events between the to dates * @param DateTime $fromInc from date inclusive (>=) * @param DateTime $toExcl to date exclusive (<) * @return Event[] */ public function getEvents($fromInc, $toExcl) { $query = Event::find(); $query = $query ->innerJoinWith('trainer') ->innerJoinWith('eventType') ->innerJoinWith('room') ->joinWith('activeEventRegistrations') ->andWhere(['>=', 'event.start', $fromInc->getTimestamp()]) ->andWhere(['<', 'event.start', $toExcl->getTimestamp()]) ->orderBy([ 'event.start' => SORT_ASC ]); $query = $this->withEventConditions($query); return $query ->all(); } /** * Get conditions to retrieve all valid active events * @param Query $query * @return Query */ public function withEventConditions($query) { $query = $query->andWhere(['event.active' => '1']) ->andWhere(['event.deleted_at' => null]); return $query; }/** @noinspection PhpUnused */ /** * @param DateTime $date * @return Event[] */ public function getEventsForDay($date) { $start = clone $date; $start->setTime(0,0); $to = clone $start; $to->modify('+1 day'); return $this->getEvents($start,$to); } public function getEvent($id){ return Event::findOne($id); } }