src/Calendar/Calendar.php line 45

Open in your IDE?
  1. <?php
  2. namespace App\Calendar;
  3. use App\Calendar\Event\EventContext;
  4. use App\Calendar\Model\CalendarEvent;
  5. use Carbon\Carbon;
  6. use Carbon\CarbonImmutable;
  7. use Carbon\CarbonPeriod;
  8. class Calendar
  9. {
  10.   protected $events;
  11.   protected $month;
  12.   protected $eventContext;
  13.   public function __construct(EventContext $eventContext)
  14.   {
  15.     $this->eventContext $eventContext;
  16.   }
  17.   public function getEvents()
  18.   {
  19.     return $this->events;
  20.   }
  21.   public function setEvents($events)
  22.   {
  23.     $this->events $events;
  24.   }
  25.   public function getMonth()
  26.   {
  27.     return $this->month;
  28.   }
  29.   public function setMonth(CarbonImmutable $month)
  30.   {
  31.     $this->month $month;
  32.   }
  33.   public function generateEvents(array $objects)
  34.   {
  35.     $this->events array_map(function ($event) {
  36.       return $this->eventContext->handle($event);
  37.     }, $objects);
  38.     return $this->events;
  39.   }
  40.   public function getEventsForWeek(CarbonPeriod $week)
  41.   {
  42.     $events = [];
  43.     foreach ($this->events as $event) {
  44.       $gridPosition $this->getGridPositionForEventInWeek($event$week);
  45.       if (!$gridPosition) {
  46.         continue;
  47.       }
  48.       $events[] = [
  49.         'event' => $event,
  50.         'grid' => $gridPosition,
  51.       ];
  52.     }
  53.     return $events;
  54.   }
  55.   public function getGridPositionForEventInWeek(CalendarEvent $eventCarbonPeriod $week)
  56.   {
  57.     $eventPeriod $event->getPeriod();
  58.     if (!$eventPeriod->overlaps($week)) {
  59.       return null;
  60.     }
  61.     $latestStartDate = new CarbonImmutable(max($eventPeriod->getStartDate(), $week->getStartDate()));
  62.     $firstEndDate = new CarbonImmutable(min($eventPeriod->calculateEnd(), $week->calculateEnd()));
  63.     return [
  64.       'start' => $latestStartDate->dayOfWeekIso,
  65.       'end' => $firstEndDate->dayOfWeekIso,
  66.     ];
  67.   }
  68.   public function getWeeksWithEvents()
  69.   {
  70.     $calendarStart $this->month->startOfMonth()->startOfWeek(Carbon::MONDAY);
  71.     $weeks = [];
  72.     $weekWalker = new Carbon($calendarStart);
  73.     for ($i 0$i 5; ++$i) {
  74.       $weekPeriod CarbonPeriod::create($weekWalker->startOfWeek()->copy(), $weekWalker->endOfWeek()->copy());
  75.       $weeks[$weekWalker->weekOfYear] = [
  76.         'period' => $weekPeriod,
  77.         'events' => $this->getEventsForWeek($weekPeriod),
  78.       ];
  79.       $weekWalker->addWeek();
  80.     }
  81.     return $weeks;
  82.   }
  83.   public function getDaysWithEvents()
  84.   {
  85.     $calendarStart $this->month->startOfMonth()->startOfWeek(Carbon::MONDAY);
  86.     $calendarEnd $this->month->endOfMonth()->endOfWeek(Carbon::MONDAY);
  87.     $calendarPeriod = new CarbonPeriod($calendarStart$calendarEnd);
  88.     $entries = [];
  89.     foreach ($calendarPeriod as $day) {
  90.       $entry = [
  91.         'day' => $day,
  92.       ];
  93.       foreach ($this->events as $event) {
  94.         if ($day->between($event->start->startOfDay(), $event->end)) {
  95.           $entry['events'][] = $event;
  96.         }
  97.       }
  98.       if (array_key_exists('events'$entry)) {
  99.         $entries[] = $entry;
  100.       }
  101.     }
  102.     return $entries;
  103.   }
  104. }