<?php
// src/EventSubscriber/CalendarSubscriber.php
namespace App\EventSubscriber;
use App\Repository\EventRepository;
use App\Service\ConfigDataService;
use Symfony\Component\EventDispatcher\EventSubscriberInterface;
use Symfony\Component\Routing\Generator\UrlGeneratorInterface;
use CalendarBundle\CalendarEvents;
use CalendarBundle\Entity\Event;
use CalendarBundle\Event\CalendarEvent;
use Symfony\Component\Validator\Constraints\DateTime;
class CalendarSubscriber implements EventSubscriberInterface
{
private $eventRepository;
private $router;
private $configDataService;
public function __construct(EventRepository $eventRepository, UrlGeneratorInterface $router, ConfigDataService $configDataService) {
$this->eventRepository = $eventRepository;
$this->router = $router;
$this->configDataService = $configDataService;
}
public static function getSubscribedEvents()
{
return [
CalendarEvents::SET_DATA => 'onCalendarSetData',
];
}
public function onCalendarSetData(CalendarEvent $calendar)
{
$start = $calendar->getStart();
$end = $calendar->getEnd();
$filters = $calendar->getFilters();
//dd($filters);
// Modify the query to fit to your entity and needs
// Change booking.beginAt by your start date property
// $bookings = $this->bookingRepository
// ->createQueryBuilder('booking')
// ->where('booking.beginAt BETWEEN :start and :end OR booking.endAt BETWEEN :start and :end')
// ->setParameter('start', $start->format('Y-m-d H:i:s'))
// ->setParameter('end', $end->format('Y-m-d H:i:s'))
// ->getQuery()
// ->getResult()
// ;
$service = $this->eventRepository->getCountEventsByService('active');
$eventsRepository = $this->eventRepository->findEventsNotCancelled('cancelled');
//dd($eventsRepository);
foreach ($eventsRepository as $eventRepository) {
if(!empty($eventRepository->getClient()->getFirstName()) || !empty($eventRepository->getClient()->getLastName())) {
$name = $eventRepository->getClient()->getFirstName() . ' ' . $eventRepository->getClient()->getLastName();
} else {
$name = $eventRepository->getClient()->getEmail();
}
if($this->configDataService->get('eventByTime') == 'YES') {
$startTime = $eventRepository->getEventTime();
$endTime = $eventRepository->getEventTimeEnd();
if($startTime != null) {
$eventStartDate = new \DateTime($eventRepository->getEventDate()->format('Y-m-d') . ' ' .$startTime->format('H:i:s'));
//$eventStartDate = $eventRepository->getEventDate()->modify($startTime->format('H:i:s'));
//$eventStartDate = $startTime->
}
if($endTime != null) {
$eventEndDate = new \DateTime($eventRepository->getEventDate()->format('Y-m-d') . ' ' .$endTime->format('H:i:s'));
} else {
$eventEndDate = null;
}
$calendarEvent = new Event(
$name . ' Status: ' . ucfirst($eventRepository->getStatus()),
$eventStartDate,
$eventEndDate,
//$normal->modify('+ 1 hour'),
//$booking->getEndAt() // If the end date is null or not defined, a all day event is created.
);
} else {
//dd($eventRepository->getEventDate());
$eventStartDate = $eventRepository->getEventDate();
$eventEndDate = null;
$calendarEvent = new Event(
$name . ' <br> Status: ' . ucfirst($eventRepository->getStatus()),
$eventStartDate,
$eventEndDate,
//$normal->modify('+ 1 hour'),
//$booking->getEndAt() // If the end date is null or not defined, a all day event is created.
);
}
//
/*
* Add custom options to events
*
* For more information see: https://fullcalendar.io/docs/event-object
* and: https://github.com/fullcalendar/fullcalendar/blob/master/src/core/options.ts
*/
if(!empty($eventRepository->getService()->getColor())) {
$color = $eventRepository->getService()->getColor();
//var_dump($color);
$calendarEvent->setOptions([
'backgroundColor' => $color,
'borderColor' => $color,
'eventTextColor' => $color,
'eventDisplay' => 'block',
]);
} else {
$calendarEvent->setOptions([
'backgroundColor' => '#A4303F',
'borderColor' => '#A4303F',
]);
}
if($this->configDataService->get('eventByTime') == 'YES') {
$calendarEvent->setAllDay(false);
}
//dd($calendarEvent);
$calendarEvent->addOption(
'url',
$this->router->generate('app_event_show', [
'id' => $eventRepository->getId(),
])
);
// finally, add the event to the CalendarEvent to fill the calendar
$calendar->addEvent($calendarEvent);
}
}
}