vendor/contao-community-alliance/events-contao-bindings/src/Subscribers/CalendarSubscriber.php line 95

Open in your IDE?
  1. <?php
  2. /**
  3.  * This file is part of contao-community-alliance/events-contao-bindings
  4.  *
  5.  * (c) 2014-2018 The Contao Community Alliance
  6.  *
  7.  * For the full copyright and license information, please view the LICENSE
  8.  * file that was distributed with this source code.
  9.  *
  10.  * This project is provided in good faith and hope to be usable by anyone.
  11.  *
  12.  * @package    ContaoCommunityAlliance\Contao\Bindings
  13.  * @subpackage Subscribers
  14.  * @author     Christian Schiffler <c.schiffler@cyberspectrum.de>
  15.  * @author     Tristan Lins <tristan.lins@bit3.de>
  16.  * @author     Sven Baumann <baumann.sv@gmail.com>
  17.  * @copyright  2018 The Contao Community Alliance.
  18.  * @license    https://github.com/contao-community-alliance/events-contao-bindings/blob/master/LICENSE LGPL-3.0
  19.  * @filesource
  20.  */
  21. namespace ContaoCommunityAlliance\Contao\Bindings\Subscribers;
  22. use Contao\Calendar;
  23. use Contao\CalendarEventsModel;
  24. use Contao\CalendarModel;
  25. use Contao\ContentModel;
  26. use Contao\CoreBundle\Framework\ContaoFrameworkInterface;
  27. use Contao\Date;
  28. use Contao\FilesModel;
  29. use Contao\FrontendTemplate;
  30. use Contao\PageModel;
  31. use Contao\Validator;
  32. use ContaoCommunityAlliance\Contao\Bindings\ContaoEvents;
  33. use ContaoCommunityAlliance\Contao\Bindings\Events\Calendar\GetCalendarEventEvent;
  34. use ContaoCommunityAlliance\Contao\Bindings\Events\Controller\AddEnclosureToTemplateEvent;
  35. use ContaoCommunityAlliance\Contao\Bindings\Events\Controller\AddImageToTemplateEvent;
  36. use ContaoCommunityAlliance\Contao\Bindings\Events\Controller\GetContentElementEvent;
  37. use Symfony\Component\EventDispatcher\EventDispatcherInterface;
  38. use Symfony\Component\EventDispatcher\EventSubscriberInterface;
  39. /**
  40.  * Subscriber for the calendar extension.
  41.  */
  42. class CalendarSubscriber implements EventSubscriberInterface
  43. {
  44.     /**
  45.      * The contao framework.
  46.      *
  47.      * @var ContaoFrameworkInterface
  48.      */
  49.     protected $framework;
  50.     /**
  51.      * CalendarSubscriber constructor.
  52.      *
  53.      * @param ContaoFrameworkInterface $framework The contao framework.
  54.      */
  55.     public function __construct(ContaoFrameworkInterface $framework)
  56.     {
  57.         $this->framework $framework;
  58.     }
  59.     /**
  60.      * Returns an array of event names this subscriber wants to listen to.
  61.      *
  62.      * @return array
  63.      */
  64.     public static function getSubscribedEvents()
  65.     {
  66.         return [
  67.             ContaoEvents::CALENDAR_GET_EVENT => 'handleEvent',
  68.         ];
  69.     }
  70.     /**
  71.      * Render a calendar event.
  72.      *
  73.      * @param GetCalendarEventEvent    $event           The event.
  74.      *
  75.      * @param string                   $eventName       The event name.
  76.      *
  77.      * @param EventDispatcherInterface $eventDispatcher The event dispatcher.
  78.      *
  79.      * @return void
  80.      *
  81.      * @SuppressWarnings(PHPMD.CyclomaticComplexity)
  82.      * @SuppressWarnings(PHPMD.NPathComplexity)
  83.      * @SuppressWarnings(PHPMD.ExcessiveMethodLength)
  84.      * @SuppressWarnings(PHPMD.Superglobals)
  85.      * @SuppressWarnings(PHPMD.CamelCaseVariableName)
  86.      * @SuppressWarnings(PHPMD.UnusedFormalParameter)
  87.      */
  88.     public function handleEvent(GetCalendarEventEvent $event$eventNameEventDispatcherInterface $eventDispatcher)
  89.     {
  90.         if ($event->getCalendarEventHtml()) {
  91.             return;
  92.         }
  93.         /** @var CalendarModel $calendarModelAdapter */
  94.         $calendarModelAdapter $this->framework->getAdapter(CalendarModel::class);
  95.         $calendarCollection   $calendarModelAdapter->findAll();
  96.         if (!$calendarCollection) {
  97.             return;
  98.         }
  99.         /** @var CalendarEventsModel $calendarEventsModelAdapter */
  100.         $calendarEventsModelAdapter $this->framework->getAdapter(CalendarEventsModel::class);
  101.         $calendarIds $calendarCollection->fetchEach('id');
  102.         $eventModel  $calendarEventsModelAdapter->findPublishedByParentAndIdOrAlias(
  103.             $event->getCalendarEventId(),
  104.             $calendarIds
  105.         );
  106.         if (!$eventModel) {
  107.             return;
  108.         }
  109.         /** @var PageModel $pageModelAdapter */
  110.         $pageModelAdapter $this->framework->getAdapter(PageModel::class);
  111.         $calendarModel $eventModel->getRelated('pid');
  112.         $objPage       $pageModelAdapter->findWithDetails($calendarModel->jumpTo);
  113.         if ($event->getDateTime()) {
  114.             $selectedStartDateTime = clone $event->getDateTime();
  115.             $selectedStartDateTime->setTime(
  116.                 date('H'$eventModel->startTime),
  117.                 date('i'$eventModel->startTime),
  118.                 date('s'$eventModel->startTime)
  119.             );
  120.             $secondsBetweenStartAndEndTime = ($eventModel->endTime $eventModel->startTime);
  121.             $intStartTime $selectedStartDateTime->getTimestamp();
  122.             $intEndTime   = ($intStartTime $secondsBetweenStartAndEndTime);
  123.         } else {
  124.             $intStartTime $eventModel->startTime;
  125.             $intEndTime   $eventModel->endTime;
  126.         }
  127.         /** @var Calendar $calendarAdapter */
  128.         $calendarAdapter $this->framework->getAdapter(Calendar::class);
  129.         $span $calendarAdapter->calculateSpan($intStartTime$intEndTime);
  130.         // Do not show dates in the past if the event is recurring (see #923).
  131.         if ($eventModel->recurring) {
  132.             $arrRange deserialize($eventModel->repeatEach);
  133.             while ($intStartTime time() && $intEndTime $eventModel->repeatEnd) {
  134.                 $intStartTime strtotime('+' $arrRange['value'] . ' ' $arrRange['unit'], $intStartTime);
  135.                 $intEndTime   strtotime('+' $arrRange['value'] . ' ' $arrRange['unit'], $intEndTime);
  136.             }
  137.         }
  138.         $strTimeStart '';
  139.         $strTimeEnd   '';
  140.         $strTimeClose '';
  141.         // @codingStandardsIgnoreStart
  142.         /*
  143.         TODO $this->date and $this->time is used in the <a> title attribute and cannot contain HTML!
  144.         $strTimeStart = '<time datetime="' . date('Y-m-d\TH:i:sP', $intStartTime) . '">';
  145.         $strTimeEnd   = '<time datetime="' . date('Y-m-d\TH:i:sP', $intEndTime) . '">';
  146.         $strTimeClose = '</time>';
  147.         */
  148.         // @codingStandardsIgnoreEnd
  149.         /** @var Date $dateAdapter */
  150.         $dateAdapter $this->framework->getAdapter(Date::class);
  151.         // Get date.
  152.         if ($span 0) {
  153.             $date $strTimeStart .
  154.                 $dateAdapter->parse(
  155.                     ($eventModel->addTime $objPage->datimFormat $objPage->dateFormat),
  156.                     $intStartTime
  157.                 ) .
  158.                 $strTimeClose ' - ' $strTimeEnd .
  159.                     $dateAdapter->parse(
  160.                         ($eventModel->addTime $objPage->datimFormat $objPage->dateFormat),
  161.                         $intEndTime
  162.                     ) .
  163.                 $strTimeClose;
  164.         } elseif ($intStartTime == $intEndTime) {
  165.             $date $strTimeStart .
  166.                     $dateAdapter->parse($objPage->dateFormat$intStartTime) .
  167.                 ($eventModel->addTime ' (' $dateAdapter->parse($objPage->timeFormat$intStartTime) . ')' '') .
  168.                 $strTimeClose;
  169.         } else {
  170.             $date $strTimeStart .
  171.                     $dateAdapter->parse($objPage->dateFormat$intStartTime) .
  172.                 ($eventModel->addTime ' (' $dateAdapter->parse($objPage->timeFormat$intStartTime) .
  173.                     $strTimeClose ' - ' $strTimeEnd .
  174.                                         $dateAdapter->parse($objPage->timeFormat$intEndTime) . ')' ''
  175.                 ) . $strTimeClose;
  176.         }
  177.         $until     '';
  178.         $recurring '';
  179.         // Recurring event.
  180.         if ($eventModel->recurring) {
  181.             $arrRange  deserialize($eventModel->repeatEach);
  182.             $strKey    'cal_' $arrRange['unit'];
  183.             $recurring sprintf($GLOBALS['TL_LANG']['MSC'][$strKey], $arrRange['value']);
  184.             if ($eventModel->recurrences 0) {
  185.                 $until sprintf(
  186.                     $GLOBALS['TL_LANG']['MSC']['cal_until'],
  187.                     $dateAdapter->parse($objPage->dateFormat$eventModel->repeatEnd)
  188.                 );
  189.             }
  190.         }
  191.         // Override the default image size.
  192.         // This is always false.
  193.         if (!empty($this->imgSize)) {
  194.             $size deserialize($this->imgSize);
  195.             if ($size[0] > || $size[1] > 0) {
  196.                 $eventModel->size $this->imgSize;
  197.             }
  198.         }
  199.         /** @var FrontendTemplate $objTemplate */
  200.         $objTemplate $this->framework->createInstance(FrontendTemplate::class, $event->getTemplate());
  201.         $objTemplate->setData($eventModel->row());
  202.         $objTemplate->date          $date;
  203.         $objTemplate->start         $intStartTime;
  204.         $objTemplate->end           $intEndTime;
  205.         $objTemplate->class         = (!empty($eventModel->cssClass)) ? ' ' $eventModel->cssClass '';
  206.         $objTemplate->recurring     $recurring;
  207.         $objTemplate->until         $until;
  208.         $objTemplate->locationLabel $GLOBALS['TL_LANG']['MSC']['location'];
  209.         $objTemplate->details '';
  210.         /** @var ContentModel $contentModelAdapter */
  211.         $contentModelAdapter $this->framework->getAdapter(ContentModel::class);
  212.         $objElement $contentModelAdapter->findPublishedByPidAndTable($eventModel->id'tl_calendar_events');
  213.         if ($objElement !== null) {
  214.             while ($objElement->next()) {
  215.                 $getContentElementEvent = new GetContentElementEvent($objElement->id);
  216.                 $eventDispatcher->dispatch(ContaoEvents::CONTROLLER_GET_CONTENT_ELEMENT$getContentElementEvent);
  217.                 $objTemplate->details .= $getContentElementEvent->getContentElementHtml();
  218.             }
  219.             $objTemplate->hasDetails true;
  220.         }
  221.         $objTemplate->addImage false;
  222.         /** @var FilesModel $filesModelAdapter */
  223.         $filesModelAdapter $this->framework->getAdapter(FilesModel::class);
  224.         // Add an image.
  225.         if ($eventModel->addImage && !empty($eventModel->singleSRC)) {
  226.             $objModel $filesModelAdapter->findByUuid($eventModel->singleSRC);
  227.             if ($objModel === null) {
  228.                 /** @var Validator $validatorAdapter */
  229.                 $validatorAdapter $this->framework->getAdapter(Validator::class);
  230.                 if (!$validatorAdapter->isUuid($eventModel->singleSRC)) {
  231.                     $objTemplate->text '<p class="error">' $GLOBALS['TL_LANG']['ERR']['version2format'] . '</p>';
  232.                 }
  233.             } elseif (is_file(TL_ROOT '/' $objModel->path)) {
  234.                 // Do not override the field now that we have a model registry (see #6303).
  235.                 $arrEvent              $eventModel->row();
  236.                 $arrEvent['singleSRC'] = $objModel->path;
  237.                 $addImageToTemplateEvent = new AddImageToTemplateEvent($arrEvent$objTemplate);
  238.                 $eventDispatcher->dispatch(ContaoEvents::CONTROLLER_ADD_IMAGE_TO_TEMPLATE$addImageToTemplateEvent);
  239.             }
  240.         }
  241.         $objTemplate->enclosure = [];
  242.         // Add enclosures.
  243.         if ($eventModel->addEnclosure) {
  244.             $addEnclosureToTemplateEvent = new AddEnclosureToTemplateEvent($eventModel->row(), $objTemplate);
  245.             $eventDispatcher->dispatch(
  246.                 ContaoEvents::CONTROLLER_ADD_ENCLOSURE_TO_TEMPLATE,
  247.                 $addEnclosureToTemplateEvent
  248.             );
  249.         }
  250.         $calendarEvent $objTemplate->parse();
  251.         $event->setCalendarEventHtml($calendarEvent);
  252.     }
  253. }