/** * Rebuild Vimeo cache * * @param DataContainer $dc */ public function rebuildVimeoCache(DataContainer $dc) { $rebuilder = new Rebuilder(); try { $result = $rebuilder->rebuildElementCache(ContentModel::findByPk($dc->id)); } catch (\InvalidArgumentException $e) { return; } catch (\RuntimeException $e) { System::log(sprintf('Unable to rebuild Vimeo cache of element ID %s: %s', $dc->id, $e->getMessage()), __METHOD__, TL_ERROR); $result = false; } if ($result === true) { Message::addConfirmation($GLOBALS['TL_LANG']['tl_content']['vimeo_cacheConfirm']); } elseif ($result === false) { Message::addError($GLOBALS['TL_LANG']['tl_content']['vimeo_cacheError']); } }
/** * Generate the module */ protected function compile() { /** @var PageModel $objPage */ global $objPage; $this->Template->event = ''; $this->Template->referer = 'javascript:history.go(-1)'; $this->Template->back = $GLOBALS['TL_LANG']['MSC']['goBack']; // Get the current event $objEvent = \CalendarEventsModel::findPublishedByParentAndIdOrAlias(\Input::get('events'), $this->cal_calendar); if (null === $objEvent) { throw new PageNotFoundException('Page not found: ' . \Environment::get('uri')); } // Overwrite the page title (see #2853 and #4955) if ($objEvent->title != '') { $objPage->pageTitle = strip_tags(\StringUtil::stripInsertTags($objEvent->title)); } // Overwrite the page description if ($objEvent->teaser != '') { $objPage->description = $this->prepareMetaDescription($objEvent->teaser); } $intStartTime = $objEvent->startTime; $intEndTime = $objEvent->endTime; $span = \Calendar::calculateSpan($intStartTime, $intEndTime); // Do not show dates in the past if the event is recurring (see #923) if ($objEvent->recurring) { $arrRange = \StringUtil::deserialize($objEvent->repeatEach); if (is_array($arrRange) && isset($arrRange['unit']) && isset($arrRange['value'])) { while ($intStartTime < time() && $intEndTime < $objEvent->repeatEnd) { $intStartTime = strtotime('+' . $arrRange['value'] . ' ' . $arrRange['unit'], $intStartTime); $intEndTime = strtotime('+' . $arrRange['value'] . ' ' . $arrRange['unit'], $intEndTime); } } } $strDate = \Date::parse($objPage->dateFormat, $intStartTime); if ($span > 0) { $strDate = \Date::parse($objPage->dateFormat, $intStartTime) . ' – ' . \Date::parse($objPage->dateFormat, $intEndTime); } $strTime = ''; if ($objEvent->addTime) { if ($span > 0) { $strDate = \Date::parse($objPage->datimFormat, $intStartTime) . ' – ' . \Date::parse($objPage->datimFormat, $intEndTime); } elseif ($intStartTime == $intEndTime) { $strTime = \Date::parse($objPage->timeFormat, $intStartTime); } else { $strTime = \Date::parse($objPage->timeFormat, $intStartTime) . ' – ' . \Date::parse($objPage->timeFormat, $intEndTime); } } $until = ''; $recurring = ''; // Recurring event if ($objEvent->recurring) { $arrRange = \StringUtil::deserialize($objEvent->repeatEach); if (is_array($arrRange) && isset($arrRange['unit']) && isset($arrRange['value'])) { $strKey = 'cal_' . $arrRange['unit']; $recurring = sprintf($GLOBALS['TL_LANG']['MSC'][$strKey], $arrRange['value']); if ($objEvent->recurrences > 0) { $until = sprintf($GLOBALS['TL_LANG']['MSC']['cal_until'], \Date::parse($objPage->dateFormat, $objEvent->repeatEnd)); } } } /** @var FrontendTemplate|object $objTemplate */ $objTemplate = new \FrontendTemplate($this->cal_template); $objTemplate->setData($objEvent->row()); $objTemplate->date = $strDate; $objTemplate->time = $strTime; $objTemplate->datetime = $objEvent->addTime ? date('Y-m-d\\TH:i:sP', $intStartTime) : date('Y-m-d', $intStartTime); $objTemplate->begin = $intStartTime; $objTemplate->end = $intEndTime; $objTemplate->class = $objEvent->cssClass != '' ? ' ' . $objEvent->cssClass : ''; $objTemplate->recurring = $recurring; $objTemplate->until = $until; $objTemplate->locationLabel = $GLOBALS['TL_LANG']['MSC']['location']; $objTemplate->details = ''; $objTemplate->hasDetails = false; $objTemplate->hasTeaser = false; // Clean the RTE output if ($objEvent->teaser != '') { $objTemplate->hasTeaser = true; $objTemplate->teaser = \StringUtil::toHtml5($objEvent->teaser); $objTemplate->teaser = \StringUtil::encodeEmail($objTemplate->teaser); } // Display the "read more" button for external/article links if ($objEvent->source != 'default') { $objTemplate->details = true; $objTemplate->hasDetails = true; } else { $id = $objEvent->id; $objTemplate->details = function () use($id) { $strDetails = ''; $objElement = \ContentModel::findPublishedByPidAndTable($id, 'tl_calendar_events'); if ($objElement !== null) { while ($objElement->next()) { $strDetails .= $this->getContentElement($objElement->current()); } } return $strDetails; }; $objTemplate->hasDetails = function () use($id) { return \ContentModel::countPublishedByPidAndTable($id, 'tl_calendar_events') > 0; }; } $objTemplate->addImage = false; // Add an image if ($objEvent->addImage && $objEvent->singleSRC != '') { $objModel = \FilesModel::findByUuid($objEvent->singleSRC); if ($objModel !== null && is_file(TL_ROOT . '/' . $objModel->path)) { // Do not override the field now that we have a model registry (see #6303) $arrEvent = $objEvent->row(); // Override the default image size if ($this->imgSize != '') { $size = \StringUtil::deserialize($this->imgSize); if ($size[0] > 0 || $size[1] > 0 || is_numeric($size[2])) { $arrEvent['size'] = $this->imgSize; } } $arrEvent['singleSRC'] = $objModel->path; $this->addImageToTemplate($objTemplate, $arrEvent); } } $objTemplate->enclosure = array(); // Add enclosures if ($objEvent->addEnclosure) { $this->addEnclosuresToTemplate($objTemplate, $objEvent->row()); } $this->Template->event = $objTemplate->parse(); $bundles = \System::getContainer()->getParameter('kernel.bundles'); // HOOK: comments extension required if ($objEvent->noComments || !isset($bundles['ContaoCommentsBundle'])) { $this->Template->allowComments = false; return; } /** @var CalendarModel $objCalendar */ $objCalendar = $objEvent->getRelated('pid'); $this->Template->allowComments = $objCalendar->allowComments; // Comments are not allowed if (!$objCalendar->allowComments) { return; } // Adjust the comments headline level $intHl = min(intval(str_replace('h', '', $this->hl)), 5); $this->Template->hlc = 'h' . ($intHl + 1); $this->import('Comments'); $arrNotifies = array(); // Notify the system administrator if ($objCalendar->notify != 'notify_author') { $arrNotifies[] = $GLOBALS['TL_ADMIN_EMAIL']; } // Notify the author if ($objCalendar->notify != 'notify_admin') { /** @var UserModel $objAuthor */ if (($objAuthor = $objEvent->getRelated('author')) instanceof UserModel && $objAuthor->email != '') { $arrNotifies[] = $objAuthor->email; } } $objConfig = new \stdClass(); $objConfig->perPage = $objCalendar->perPage; $objConfig->order = $objCalendar->sortOrder; $objConfig->template = $this->com_template; $objConfig->requireLogin = $objCalendar->requireLogin; $objConfig->disableCaptcha = $objCalendar->disableCaptcha; $objConfig->bbcode = $objCalendar->bbcode; $objConfig->moderate = $objCalendar->moderate; $this->Comments->addCommentsToTemplate($this->Template, $objConfig, 'tl_calendar_events', $objEvent->id, $arrNotifies); }
/** * Render a news. * * @param GetNewsEvent $event The event. * * @param string $eventName The event name. * * @param EventDispatcherInterface $eventDispatcher The event dispatcher. * * @return void * * @SuppressWarnings(PHPMD.CyclomaticComplexity) * @SuppressWarnings(PHPMD.NPathComplexity) * @SuppressWarnings(PHPMD.ExcessiveMethodLength) * @SuppressWarnings(PHPMD.Superglobals) * @SuppressWarnings(PHPMD.CamelCaseVariableName) * @SuppressWarnings(PHPMD.UnusedFormalParameter) */ public function handleNews(GetNewsEvent $event, $eventName, EventDispatcherInterface $eventDispatcher) { if ($event->getNewsHtml()) { return; } $newsArchiveCollection = NewsArchiveModel::findAll(); $newsArchiveIds = $newsArchiveCollection ? $newsArchiveCollection->fetchEach('id') : array(); $newsModel = NewsModel::findPublishedByParentAndIdOrAlias($event->getNewsId(), $newsArchiveIds); if (!$newsModel) { return; } $newsModel = $newsModel->current(); $newsArchiveModel = $newsModel->getRelated('pid'); $objPage = PageModel::findWithDetails($newsArchiveModel->jumpTo); $objTemplate = new FrontendTemplate($event->getTemplate()); $objTemplate->setData($newsModel->row()); $objTemplate->class = $newsModel->cssClass != '' ? ' ' . $newsModel->cssClass : ''; $objTemplate->newsHeadline = $newsModel->headline; $objTemplate->subHeadline = $newsModel->subheadline; $objTemplate->hasSubHeadline = $newsModel->subheadline ? true : false; $objTemplate->linkHeadline = $this->generateLink($eventDispatcher, $newsModel->headline, $newsModel); $objTemplate->more = $this->generateLink($eventDispatcher, $GLOBALS['TL_LANG']['MSC']['more'], $newsModel, false, true); $objTemplate->link = $this->generateNewsUrl($eventDispatcher, $newsModel); $objTemplate->archive = $newsModel->getRelated('pid'); $objTemplate->count = 0; $objTemplate->text = ''; // Clean the RTE output. if ($newsModel->teaser != '') { if ($objPage->outputFormat == 'xhtml') { $objTemplate->teaser = StringHelper::toXhtml($newsModel->teaser); } else { $objTemplate->teaser = StringHelper::toHtml5($newsModel->teaser); } $objTemplate->teaser = StringHelper::encodeEmail($objTemplate->teaser); } // Display the "read more" button for external/article links. if ($newsModel->source != 'default') { $objTemplate->text = true; } else { // Compile the news text. $objElement = ContentModel::findPublishedByPidAndTable($newsModel->id, 'tl_news'); if ($objElement !== null) { while ($objElement->next()) { $getContentElementEvent = new GetContentElementEvent($objElement->id); $eventDispatcher->dispatch(ContaoEvents::CONTROLLER_GET_CONTENT_ELEMENT, $getContentElementEvent); $objTemplate->text .= $getContentElementEvent->getContentElementHtml(); } } } $arrMeta = $this->getMetaFields($newsModel); // Add the meta information. $objTemplate->date = $arrMeta['date']; $objTemplate->hasMetaFields = !empty($arrMeta); $objTemplate->numberOfComments = $arrMeta['ccount']; $objTemplate->commentCount = $arrMeta['comments']; $objTemplate->timestamp = $newsModel->date; $objTemplate->author = $arrMeta['author']; $objTemplate->datetime = date('Y-m-d\\TH:i:sP', $newsModel->date); $objTemplate->addImage = false; // Add an image. if ($newsModel->addImage && $newsModel->singleSRC != '') { $objModel = FilesModel::findByUuid($newsModel->singleSRC); if ($objModel === null) { if (!Validator::isUuid($newsModel->singleSRC)) { $objTemplate->text = '<p class="error">' . $GLOBALS['TL_LANG']['ERR']['version2format'] . '</p>'; } } elseif (is_file(TL_ROOT . '/' . $objModel->path)) { // Do not override the field now that we have a model registry (see #6303). $arrArticle = $newsModel->row(); // Override the default image size. // This is always false! if ($this->imgSize != '') { $size = deserialize($this->imgSize); if ($size[0] > 0 || $size[1] > 0) { $arrArticle['size'] = $this->imgSize; } } $arrArticle['singleSRC'] = $objModel->path; $addImageToTemplateEvent = new AddImageToTemplateEvent($arrArticle, $objTemplate); $eventDispatcher->dispatch(ContaoEvents::CONTROLLER_ADD_IMAGE_TO_TEMPLATE, $addImageToTemplateEvent); } } $objTemplate->enclosure = array(); // Add enclosures. if ($newsModel->addEnclosure) { $addEnclosureToTemplateEvent = new AddEnclosureToTemplateEvent($newsModel->row(), $objTemplate); $eventDispatcher->dispatch(ContaoEvents::CONTROLLER_ADD_ENCLOSURE_TO_TEMPLATE, $addEnclosureToTemplateEvent); } $news = $objTemplate->parse(); $event->setNewsHtml($news); }
/** * Render a calendar event. * * @param GetCalendarEventEvent $event The event. * * @param string $eventName The event name. * * @param EventDispatcherInterface $eventDispatcher The event dispatcher. * * @return void * * @SuppressWarnings(PHPMD.CyclomaticComplexity) * @SuppressWarnings(PHPMD.NPathComplexity) * @SuppressWarnings(PHPMD.ExcessiveMethodLength) * @SuppressWarnings(PHPMD.Superglobals) * @SuppressWarnings(PHPMD.CamelCaseVariableName) * @SuppressWarnings(PHPMD.UnusedFormalParameter) */ public function handleEvent(GetCalendarEventEvent $event, $eventName, EventDispatcherInterface $eventDispatcher) { if ($event->getCalendarEventHtml()) { return; } $calendarCollection = CalendarModel::findAll(); if (!$calendarCollection) { return; } $calendarIds = $calendarCollection->fetchEach('id'); $eventModel = CalendarEventsModel::findPublishedByParentAndIdOrAlias($event->getCalendarEventId(), $calendarIds); if (!$eventModel) { return; } $calendarModel = $eventModel->getRelated('pid'); $objPage = PageModel::findWithDetails($calendarModel->jumpTo); if ($event->getDateTime()) { $selectedStartDateTime = clone $event->getDateTime(); $selectedStartDateTime->setTime(date('H', $eventModel->startTime), date('i', $eventModel->startTime), date('s', $eventModel->startTime)); $secondsBetweenStartAndEndTime = $eventModel->endTime - $eventModel->startTime; $intStartTime = $selectedStartDateTime->getTimestamp(); $intEndTime = $intStartTime + $secondsBetweenStartAndEndTime; } else { $intStartTime = $eventModel->startTime; $intEndTime = $eventModel->endTime; } $span = Calendar::calculateSpan($intStartTime, $intEndTime); // Do not show dates in the past if the event is recurring (see #923). if ($eventModel->recurring) { $arrRange = deserialize($eventModel->repeatEach); while ($intStartTime < time() && $intEndTime < $eventModel->repeatEnd) { $intStartTime = strtotime('+' . $arrRange['value'] . ' ' . $arrRange['unit'], $intStartTime); $intEndTime = strtotime('+' . $arrRange['value'] . ' ' . $arrRange['unit'], $intEndTime); } } if ($objPage->outputFormat == 'xhtml') { $strTimeStart = ''; $strTimeEnd = ''; $strTimeClose = ''; } else { $strTimeStart = ''; $strTimeEnd = ''; $strTimeClose = ''; // @codingStandardsIgnoreStart /* TODO $this->date and $this->time is used in the <a> title attribute and cannot contain HTML! $strTimeStart = '<time datetime="' . date('Y-m-d\TH:i:sP', $intStartTime) . '">'; $strTimeEnd = '<time datetime="' . date('Y-m-d\TH:i:sP', $intEndTime) . '">'; $strTimeClose = '</time>'; */ // @codingStandardsIgnoreEnd } // Get date. if ($span > 0) { $date = $strTimeStart . Date::parse($eventModel->addTime ? $objPage->datimFormat : $objPage->dateFormat, $intStartTime) . $strTimeClose . ' - ' . $strTimeEnd . Date::parse($eventModel->addTime ? $objPage->datimFormat : $objPage->dateFormat, $intEndTime) . $strTimeClose; } elseif ($intStartTime == $intEndTime) { $date = $strTimeStart . Date::parse($objPage->dateFormat, $intStartTime) . ($eventModel->addTime ? ' (' . Date::parse($objPage->timeFormat, $intStartTime) . ')' : '') . $strTimeClose; } else { $date = $strTimeStart . Date::parse($objPage->dateFormat, $intStartTime) . ($eventModel->addTime ? ' (' . Date::parse($objPage->timeFormat, $intStartTime) . $strTimeClose . ' - ' . $strTimeEnd . Date::parse($objPage->timeFormat, $intEndTime) . ')' : '') . $strTimeClose; } $until = ''; $recurring = ''; // Recurring event. if ($eventModel->recurring) { $arrRange = deserialize($eventModel->repeatEach); $strKey = 'cal_' . $arrRange['unit']; $recurring = sprintf($GLOBALS['TL_LANG']['MSC'][$strKey], $arrRange['value']); if ($eventModel->recurrences > 0) { $until = sprintf($GLOBALS['TL_LANG']['MSC']['cal_until'], Date::parse($objPage->dateFormat, $eventModel->repeatEnd)); } } // Override the default image size. // This is always false. if ($this->imgSize != '') { $size = deserialize($this->imgSize); if ($size[0] > 0 || $size[1] > 0) { $eventModel->size = $this->imgSize; } } $objTemplate = new FrontendTemplate($event->getTemplate()); $objTemplate->setData($eventModel->row()); $objTemplate->date = $date; $objTemplate->start = $intStartTime; $objTemplate->end = $intEndTime; $objTemplate->class = $eventModel->cssClass != '' ? ' ' . $eventModel->cssClass : ''; $objTemplate->recurring = $recurring; $objTemplate->until = $until; $objTemplate->locationLabel = $GLOBALS['TL_LANG']['MSC']['location']; $objTemplate->details = ''; $objElement = ContentModel::findPublishedByPidAndTable($eventModel->id, 'tl_calendar_events'); if ($objElement !== null) { while ($objElement->next()) { $getContentElementEvent = new GetContentElementEvent($objElement->id); $eventDispatcher->dispatch(ContaoEvents::CONTROLLER_GET_CONTENT_ELEMENT, $getContentElementEvent); $objTemplate->details .= $getContentElementEvent->getContentElementHtml(); } $objTemplate->hasDetails = true; } $objTemplate->addImage = false; // Add an image. if ($eventModel->addImage && $eventModel->singleSRC != '') { $objModel = FilesModel::findByUuid($eventModel->singleSRC); if ($objModel === null) { if (!Validator::isUuid($eventModel->singleSRC)) { $objTemplate->text = '<p class="error">' . $GLOBALS['TL_LANG']['ERR']['version2format'] . '</p>'; } } elseif (is_file(TL_ROOT . '/' . $objModel->path)) { // Do not override the field now that we have a model registry (see #6303). $arrEvent = $eventModel->row(); $arrEvent['singleSRC'] = $objModel->path; $addImageToTemplateEvent = new AddImageToTemplateEvent($arrEvent, $objTemplate); $eventDispatcher->dispatch(ContaoEvents::CONTROLLER_ADD_IMAGE_TO_TEMPLATE, $addImageToTemplateEvent); } } $objTemplate->enclosure = array(); // Add enclosures. if ($eventModel->addEnclosure) { $addEnclosureToTemplateEvent = new AddEnclosureToTemplateEvent($eventModel->row(), $objTemplate); $eventDispatcher->dispatch(ContaoEvents::CONTROLLER_ADD_ENCLOSURE_TO_TEMPLATE, $addEnclosureToTemplateEvent); } $calendarEvent = $objTemplate->parse(); $event->setCalendarEventHtml($calendarEvent); }
/** * Generate a content element and return it as string * * @param mixed $intId A content element ID or a Model object * @param string $strColumn The column the element is in * * @return string The content element HTML markup */ public static function getContentElement($intId, $strColumn = 'main') { if (is_object($intId)) { $objRow = $intId; } else { if (!strlen($intId) || $intId < 1) { return ''; } $objRow = \ContentModel::findByPk($intId); if ($objRow === null) { return ''; } } // Check the visibility (see #6311) if (!static::isVisibleElement($objRow)) { return ''; } $strClass = \ContentElement::findClass($objRow->type); // Return if the class does not exist if (!class_exists($strClass)) { static::log('Content element class "' . $strClass . '" (content element "' . $objRow->type . '") does not exist', __METHOD__, TL_ERROR); return ''; } $objRow->typePrefix = 'ce_'; /** @var \ContentElement $objElement */ $objElement = new $strClass($objRow, $strColumn); $strBuffer = $objElement->generate(); // HOOK: add custom logic if (isset($GLOBALS['TL_HOOKS']['getContentElement']) && is_array($GLOBALS['TL_HOOKS']['getContentElement'])) { foreach ($GLOBALS['TL_HOOKS']['getContentElement'] as $callback) { $strBuffer = static::importStatic($callback[0])->{$callback}[1]($objRow, $strBuffer, $objElement); } } // Disable indexing if protected if ($objElement->protected && !preg_match('/^\\s*<!-- indexer::stop/', $strBuffer)) { $strBuffer = "\n<!-- indexer::stop -->" . $strBuffer . "<!-- indexer::continue -->\n"; } return $strBuffer; }
/** * Rebuild the content element cache * * @param ContentModel $contentElement * * @return bool|null * * @throws \InvalidArgumentException * @throws \RuntimeException */ public function rebuildElementCache(ContentModel $contentElement) { $callback = static::getCallbackInstance($contentElement->type); if (!$callback->isEligible($contentElement->row())) { return null; } return $callback->rebuild(new SingleRebuildProvider(new Cache(), Client::getInstance()), $contentElement); }