/** * Parse an item and return it as string * * @param \NewsModel $objArticle * @param boolean $blnAddArchive * @param string $strClass * @param integer $intCount * * @return string */ protected function parseArticle($objArticle, $blnAddArchive = false, $strClass = '', $intCount = 0) { /** @var \PageModel $objPage */ global $objPage; /** @var \FrontendTemplate|object $objTemplate */ $objTemplate = new \FrontendTemplate($this->news_template); $objTemplate->setData($objArticle->row()); $objTemplate->class = ($objArticle->cssClass != '' ? ' ' . $objArticle->cssClass : '') . $strClass; $objTemplate->newsHeadline = $objArticle->headline; $objTemplate->subHeadline = $objArticle->subheadline; $objTemplate->hasSubHeadline = $objArticle->subheadline ? true : false; $objTemplate->linkHeadline = $this->generateLink($objArticle->headline, $objArticle, $blnAddArchive); $objTemplate->more = $this->generateLink($GLOBALS['TL_LANG']['MSC']['more'], $objArticle, $blnAddArchive, true); $objTemplate->link = $this->generateNewsUrl($objArticle, $blnAddArchive); $objTemplate->archive = $objArticle->getRelated('pid'); $objTemplate->count = $intCount; // see #5708 $objTemplate->text = ''; $objTemplate->hasText = false; $objTemplate->hasTeaser = false; // Clean the RTE output if ($objArticle->teaser != '') { $objTemplate->hasTeaser = true; if ($objPage->outputFormat == 'xhtml') { $objTemplate->teaser = \StringUtil::toXhtml($objArticle->teaser); } else { $objTemplate->teaser = \StringUtil::toHtml5($objArticle->teaser); } $objTemplate->teaser = \StringUtil::encodeEmail($objTemplate->teaser); } // Display the "read more" button for external/article links if ($objArticle->source != 'default') { $objTemplate->text = true; $objTemplate->hasText = true; } else { $id = $objArticle->id; $objTemplate->text = function () use($id) { $strText = ''; $objElement = \ContentModel::findPublishedByPidAndTable($id, 'tl_news'); if ($objElement !== null) { while ($objElement->next()) { $strText .= $this->getContentElement($objElement->current()); } } return $strText; }; $objTemplate->hasText = \ContentModel::countPublishedByPidAndTable($objArticle->id, 'tl_news') > 0; } $arrMeta = $this->getMetaFields($objArticle); // Add the meta information $objTemplate->date = $arrMeta['date']; $objTemplate->hasMetaFields = !empty($arrMeta); $objTemplate->numberOfComments = $arrMeta['ccount']; $objTemplate->commentCount = $arrMeta['comments']; $objTemplate->timestamp = $objArticle->date; $objTemplate->author = $arrMeta['author']; $objTemplate->datetime = date('Y-m-d\\TH:i:sP', $objArticle->date); $objTemplate->addImage = false; // Add an image if ($objArticle->addImage && $objArticle->singleSRC != '') { $objModel = \FilesModel::findByUuid($objArticle->singleSRC); if ($objModel === null) { if (!\Validator::isUuid($objArticle->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 = $objArticle->row(); // Override the default image size if ($this->imgSize != '') { $size = deserialize($this->imgSize); if ($size[0] > 0 || $size[1] > 0 || is_numeric($size[2])) { $arrArticle['size'] = $this->imgSize; } } $arrArticle['singleSRC'] = $objModel->path; $this->addImageToTemplate($objTemplate, $arrArticle); } } $objTemplate->enclosure = array(); // Add enclosures if ($objArticle->addEnclosure) { $this->addEnclosuresToTemplate($objTemplate, $objArticle->row()); } // HOOK: add custom logic if (isset($GLOBALS['TL_HOOKS']['parseArticles']) && is_array($GLOBALS['TL_HOOKS']['parseArticles'])) { foreach ($GLOBALS['TL_HOOKS']['parseArticles'] as $callback) { $this->import($callback[0]); $this->{$callback[0]}->{$callback[1]}($objTemplate, $objArticle->row(), $this); } } return $objTemplate->parse(); }
/** * 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) { /** @var \PageError404 $objHandler */ $objHandler = new $GLOBALS['TL_PTY']['error_404'](); $objHandler->generate($objPage->id); } // Overwrite the page title (see #2853 and #4955) if ($objEvent->title != '') { $objPage->pageTitle = strip_tags(strip_insert_tags($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 = 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 = 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; if ($objPage->outputFormat == 'xhtml') { $objTemplate->teaser = \StringUtil::toXhtml($objEvent->teaser); } else { $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 = \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) { if (!\Validator::isUuid($objEvent->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 = $objEvent->row(); // Override the default image size if ($this->imgSize != '') { $size = 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(); // HOOK: comments extension required if ($objEvent->noComments || !in_array('comments', \ModuleLoader::getActive())) { $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')) !== null && $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); }
protected function compile() { if ($this->objConfig->header) { $this->Template->showHeader = true; } $id = $this->id; $this->Template->body = function () use($id) { $strText = ''; $objElement = \ContentModel::findPublishedByPidAndTable($id, 'tl_modal'); if ($objElement !== null) { while ($objElement->next()) { $strContent = $this->getContentElement($objElement->current()); // HOOK: add custom logic if (isset($GLOBALS['TL_HOOKS']['getModalContentElement']) && is_array($GLOBALS['TL_HOOKS']['getModalContentElement'])) { foreach ($GLOBALS['TL_HOOKS']['getModalContentElement'] as $callback) { $strContent = static::importStatic($callback[0])->{$callback[1]}($objElement->current(), $strContent, $this->Template, $this->objModel, $this->objConfig, $this); } } $strText .= $strContent; } } return $strText; }; $this->Template->hasBody = \ContentModel::countPublishedByPidAndTable($this->id, 'tl_modal') > 0; if ($this->objConfig->footer && $this->addFooter) { $this->Template->showFooter = true; } }
/** * Add an event to the array of active events * * @param CalendarEventsModel $objEvents * @param integer $intStart * @param integer $intEnd * @param integer $intBegin * @param integer $intLimit * @param integer $intCalendar */ protected function addEvent($objEvents, $intStart, $intEnd, $intBegin, $intLimit, $intCalendar) { /** @var PageModel $objPage */ global $objPage; // Backwards compatibility (4th argument was $strUrl) if (func_num_args() > 6) { @trigger_error('Calling Events::addEvent() with 7 arguments has been deprecated and will no longer work in Contao 5.0. Do not pass $strUrl as 4th argument anymore.', E_USER_DEPRECATED); $intBegin = func_get_arg(4); $intLimit = func_get_arg(5); $intCalendar = func_get_arg(6); } $span = \Calendar::calculateSpan($intStart, $intEnd); // Adjust the start time of a multi-day event (see #6802) if ($this->cal_noSpan && $span > 0 && $intStart < $intBegin && $intBegin < $intEnd) { $intStart = $intBegin; } $intDate = $intStart; $intKey = date('Ymd', $intStart); $strDate = \Date::parse($objPage->dateFormat, $intStart); $strDay = $GLOBALS['TL_LANG']['DAYS'][date('w', $intStart)]; $strMonth = $GLOBALS['TL_LANG']['MONTHS'][date('n', $intStart) - 1]; if ($span > 0) { $strDate = \Date::parse($objPage->dateFormat, $intStart) . ' – ' . \Date::parse($objPage->dateFormat, $intEnd); $strDay = ''; } $strTime = ''; if ($objEvents->addTime) { if ($span > 0) { $strDate = \Date::parse($objPage->datimFormat, $intStart) . ' – ' . \Date::parse($objPage->datimFormat, $intEnd); } elseif ($intStart == $intEnd) { $strTime = \Date::parse($objPage->timeFormat, $intStart); } else { $strTime = \Date::parse($objPage->timeFormat, $intStart) . ' – ' . \Date::parse($objPage->timeFormat, $intEnd); } } $until = ''; $recurring = ''; // Recurring event if ($objEvents->recurring) { $arrRange = deserialize($objEvents->repeatEach); $strKey = 'cal_' . $arrRange['unit']; $recurring = sprintf($GLOBALS['TL_LANG']['MSC'][$strKey], $arrRange['value']); if ($objEvents->recurrences > 0) { $until = sprintf($GLOBALS['TL_LANG']['MSC']['cal_until'], \Date::parse($objPage->dateFormat, $objEvents->repeatEnd)); } } // Store raw data $arrEvent = $objEvents->row(); // Overwrite some settings $arrEvent['date'] = $strDate; $arrEvent['time'] = $strTime; $arrEvent['datetime'] = $objEvents->addTime ? date('Y-m-d\\TH:i:sP', $intStart) : date('Y-m-d', $intStart); $arrEvent['day'] = $strDay; $arrEvent['month'] = $strMonth; $arrEvent['parent'] = $intCalendar; $arrEvent['calendar'] = $objEvents->getRelated('pid'); $arrEvent['link'] = $objEvents->title; $arrEvent['target'] = ''; $arrEvent['title'] = specialchars($objEvents->title, true); $arrEvent['href'] = $this->generateEventUrl($objEvents); $arrEvent['class'] = $objEvents->cssClass != '' ? ' ' . $objEvents->cssClass : ''; $arrEvent['recurring'] = $recurring; $arrEvent['until'] = $until; $arrEvent['begin'] = $intStart; $arrEvent['end'] = $intEnd; $arrEvent['details'] = ''; $arrEvent['hasDetails'] = false; $arrEvent['hasTeaser'] = false; // Override the link target if ($objEvents->source == 'external' && $objEvents->target) { $arrEvent['target'] = ' target="_blank"'; } // Clean the RTE output if ($arrEvent['teaser'] != '') { $arrEvent['hasTeaser'] = true; $arrEvent['teaser'] = \StringUtil::toHtml5($arrEvent['teaser']); $arrEvent['teaser'] = \StringUtil::encodeEmail($arrEvent['teaser']); } // Display the "read more" button for external/article links if ($objEvents->source != 'default') { $arrEvent['details'] = true; $arrEvent['hasDetails'] = true; } else { $id = $objEvents->id; $arrEvent['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; }; $arrEvent['hasDetails'] = \ContentModel::countPublishedByPidAndTable($id, 'tl_calendar_events') > 0; } // Get todays start and end timestamp if ($this->intTodayBegin === null) { $this->intTodayBegin = strtotime('00:00:00'); } if ($this->intTodayEnd === null) { $this->intTodayEnd = strtotime('23:59:59'); } // Mark past and upcoming events (see #3692) if ($intEnd < $this->intTodayBegin) { $arrEvent['class'] .= ' bygone'; } elseif ($intStart > $this->intTodayEnd) { $arrEvent['class'] .= ' upcoming'; } else { $arrEvent['class'] .= ' current'; } $this->arrEvents[$intKey][$intStart][] = $arrEvent; // Multi-day event for ($i = 1; $i <= $span && $intDate <= $intLimit; $i++) { // Only show first occurrence if ($this->cal_noSpan && $intDate >= $intBegin) { break; } $intDate = strtotime('+ 1 day', $intDate); $intNextKey = date('Ymd', $intDate); $this->arrEvents[$intNextKey][$intDate][] = $arrEvent; } }
/** * Add an event to the array of active events * * @param \CalendarEventsModel $objEvents * @param integer $intStart * @param integer $intEnd * @param string $strUrl * @param integer $intBegin * @param integer $intLimit * @param integer $intCalendar */ protected function addEvent($objEvents, $intStart, $intEnd, $strUrl, $intBegin, $intLimit, $intCalendar) { /** @var \PageModel $objPage */ global $objPage; $intDate = $intStart; $intKey = date('Ymd', $intStart); $strDate = \Date::parse($objPage->dateFormat, $intStart); $strDay = $GLOBALS['TL_LANG']['DAYS'][date('w', $intStart)]; $strMonth = $GLOBALS['TL_LANG']['MONTHS'][date('n', $intStart) - 1]; $span = \Calendar::calculateSpan($intStart, $intEnd); if ($span > 0) { $strDate = \Date::parse($objPage->dateFormat, $intStart) . ' – ' . \Date::parse($objPage->dateFormat, $intEnd); $strDay = ''; } $strTime = ''; if ($objEvents->addTime) { if ($span > 0) { $strDate = \Date::parse($objPage->datimFormat, $intStart) . ' – ' . \Date::parse($objPage->datimFormat, $intEnd); } elseif ($intStart == $intEnd) { $strTime = \Date::parse($objPage->timeFormat, $intStart); } else { $strTime = \Date::parse($objPage->timeFormat, $intStart) . ' – ' . \Date::parse($objPage->timeFormat, $intEnd); } } $until = ''; $recurring = ''; // Recurring event if ($objEvents->recurring) { $arrRange = deserialize($objEvents->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 ($objEvents->recurrences > 0) { $until = sprintf($GLOBALS['TL_LANG']['MSC']['cal_until'], \Date::parse($objPage->dateFormat, $objEvents->repeatEnd)); } } } // Store raw data $arrEvent = $objEvents->row(); // Overwrite some settings $arrEvent['date'] = $strDate; $arrEvent['time'] = $strTime; $arrEvent['datetime'] = $objEvents->addTime ? date('Y-m-d\\TH:i:sP', $intStart) : date('Y-m-d', $intStart); $arrEvent['day'] = $strDay; $arrEvent['month'] = $strMonth; $arrEvent['parent'] = $intCalendar; $arrEvent['calendar'] = $objEvents->getRelated('pid'); $arrEvent['link'] = $objEvents->title; $arrEvent['target'] = ''; $arrEvent['title'] = specialchars($objEvents->title, true); $arrEvent['href'] = $this->generateEventUrl($objEvents, $strUrl); $arrEvent['class'] = $objEvents->cssClass != '' ? ' ' . $objEvents->cssClass : ''; $arrEvent['recurring'] = $recurring; $arrEvent['until'] = $until; $arrEvent['begin'] = $intStart; $arrEvent['end'] = $intEnd; $arrEvent['details'] = ''; $arrEvent['hasDetails'] = false; $arrEvent['hasTeaser'] = false; // Override the link target if ($objEvents->source == 'external' && $objEvents->target) { $arrEvent['target'] = $objPage->outputFormat == 'xhtml' ? ' onclick="return !window.open(this.href)"' : ' target="_blank"'; } // Clean the RTE output if ($arrEvent['teaser'] != '') { $arrEvent['hasTeaser'] = true; if ($objPage->outputFormat == 'xhtml') { $arrEvent['teaser'] = \StringUtil::toXhtml($arrEvent['teaser']); } else { $arrEvent['teaser'] = \StringUtil::toHtml5($arrEvent['teaser']); } $arrEvent['teaser'] = \StringUtil::encodeEmail($arrEvent['teaser']); } // Display the "read more" button for external/article links if ($objEvents->source != 'default') { $arrEvent['details'] = true; $arrEvent['hasDetails'] = true; } else { $id = $objEvents->id; $arrEvent['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; }; $arrEvent['hasDetails'] = \ContentModel::countPublishedByPidAndTable($id, 'tl_calendar_events') > 0; } // Get todays start and end timestamp if ($this->intTodayBegin === null) { $this->intTodayBegin = strtotime('00:00:00'); } if ($this->intTodayEnd === null) { $this->intTodayEnd = strtotime('23:59:59'); } // Mark past and upcoming events (see #3692) if ($intEnd < $this->intTodayBegin) { $arrEvent['class'] .= ' bygone'; } elseif ($intStart > $this->intTodayEnd) { $arrEvent['class'] .= ' upcoming'; } else { $arrEvent['class'] .= ' current'; } $this->arrEvents[$intKey][$intStart][] = $arrEvent; // Multi-day event for ($i = 1; $i <= $span && $intDate <= $intLimit; $i++) { // Only show first occurrence if ($this->cal_noSpan) { break; } $intDate = strtotime('+ 1 day', $intDate); $intNextKey = date('Ymd', $intDate); $this->arrEvents[$intNextKey][$intDate][] = $arrEvent; } }