/** * Add an event to the array of active events * * @param \CalendarEventsModel $objEvent * @param integer $intStart * @param integer $intEnd * @param string $strUrl * @param string $strBase */ protected function addEvent($objEvent, $intStart, $intEnd, $strUrl, $strBase) { if ($intEnd < time()) { return; } /** @var \PageModel $objPage */ global $objPage; // Called in the back end (see #4026) if ($objPage === null) { $objPage = new \stdClass(); $objPage->dateFormat = \Config::get('dateFormat'); $objPage->datimFormat = \Config::get('datimFormat'); $objPage->timeFormat = \Config::get('timeFormat'); } $intKey = date('Ymd', $intStart); $span = self::calculateSpan($intStart, $intEnd); $format = $objEvent->addTime ? 'datimFormat' : 'dateFormat'; // Add date if ($span > 0) { $title = \Date::parse($objPage->{$format}, $intStart) . ' – ' . \Date::parse($objPage->{$format}, $intEnd); } else { $title = \Date::parse($objPage->dateFormat, $intStart) . ($objEvent->addTime ? ' (' . \Date::parse($objPage->timeFormat, $intStart) . ($intStart < $intEnd ? ' – ' . \Date::parse($objPage->timeFormat, $intEnd) : '') . ')' : ''); } // Add title and link $title .= ' ' . $objEvent->title; $link = ''; switch ($objEvent->source) { case 'external': $link = $objEvent->url; break; case 'internal': if (($objTarget = $objEvent->getRelated('jumpTo')) !== null) { $link = $strBase . $this->generateFrontendUrl($objTarget->row()); } break; case 'article': if (($objArticle = \ArticleModel::findByPk($objEvent->articleId, array('eager' => true))) !== null && ($objPid = $objArticle->getRelated('pid')) !== null) { $link = $strBase . ampersand($this->generateFrontendUrl($objPid->row(), '/articles/' . (!\Config::get('disableAlias') && $objArticle->alias != '' ? $objArticle->alias : $objArticle->id))); } break; } // Link to the default page if ($link == '') { $link = $strBase . sprintf($strUrl, $objEvent->alias != '' && !\Config::get('disableAlias') ? $objEvent->alias : $objEvent->id); } // Store the whole row (see #5085) $arrEvent = $objEvent->row(); // Override link and title $arrEvent['link'] = $link; $arrEvent['title'] = $title; // Clean the RTE output if ($objPage->outputFormat == 'xhtml') { $arrEvent['teaser'] = \StringUtil::toXhtml($objEvent->teaser); } else { $arrEvent['teaser'] = \StringUtil::toHtml5($objEvent->teaser); } // Reset the enclosures (see #5685) $arrEvent['enclosure'] = array(); // Add the article image as enclosure if ($objEvent->addImage) { $objFile = \FilesModel::findByUuid($objEvent->singleSRC); if ($objFile !== null) { $arrEvent['enclosure'][] = $objFile->path; } } // Enclosures if ($objEvent->addEnclosure) { $arrEnclosure = deserialize($objEvent->enclosure, true); if (is_array($arrEnclosure)) { $objFile = \FilesModel::findMultipleByUuids($arrEnclosure); if ($objFile !== null) { while ($objFile->next()) { $arrEvent['enclosure'][] = $objFile->path; } } } } $this->arrEvents[$intKey][$intStart][] = $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; $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); } } // Store raw data $arrEvent = $objEvents->row(); // Overwrite some settings $arrEvent['time'] = $strTime; $arrEvent['date'] = $strDate; $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['begin'] = $intStart; $arrEvent['end'] = $intEnd; $arrEvent['details'] = ''; // 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'] != '') { if ($objPage->outputFormat == 'xhtml') { $arrEvent['teaser'] = \String::toXhtml($arrEvent['teaser']); } else { $arrEvent['teaser'] = \String::toHtml5($arrEvent['teaser']); } } // Display the "read more" button for external/article links if ($objEvents->source != 'default') { $arrEvent['details'] = 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; }; } // 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 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 $objEvent * @param integer $intStart * @param integer $intEnd * @param string $strUrl * @param string $strBase */ protected function addEvent($objEvent, $intStart, $intEnd, $strUrl, $strBase = '') { if ($intEnd < time()) { return; } /** @var PageModel $objPage */ global $objPage; // Called in the back end (see #4026) if ($objPage === null) { $objPage = new \stdClass(); $objPage->dateFormat = \Config::get('dateFormat'); $objPage->datimFormat = \Config::get('datimFormat'); $objPage->timeFormat = \Config::get('timeFormat'); } $intKey = date('Ymd', $intStart); $span = self::calculateSpan($intStart, $intEnd); $format = $objEvent->addTime ? 'datimFormat' : 'dateFormat'; // Add date if ($span > 0) { $title = \Date::parse($objPage->{$format}, $intStart) . ' – ' . \Date::parse($objPage->{$format}, $intEnd); } else { $title = \Date::parse($objPage->dateFormat, $intStart) . ($objEvent->addTime ? ' (' . \Date::parse($objPage->timeFormat, $intStart) . ($intStart < $intEnd ? ' – ' . \Date::parse($objPage->timeFormat, $intEnd) : '') . ')' : ''); } // Add title and link $title .= ' ' . $objEvent->title; // Backwards compatibility (see #8329) if ($strBase != '' && !preg_match('#^https?://#', $strUrl)) { $strUrl = $strBase . $strUrl; } $link = ''; switch ($objEvent->source) { case 'external': $link = $objEvent->url; break; case 'internal': if (($objTarget = $objEvent->getRelated('jumpTo')) instanceof PageModel) { /** @var PageModel $objTarget */ $link = $objTarget->getAbsoluteUrl(); } break; case 'article': if (($objArticle = \ArticleModel::findByPk($objEvent->articleId, array('eager' => true))) !== null && ($objPid = $objArticle->getRelated('pid')) instanceof PageModel) { /** @var PageModel $objPid */ $link = ampersand($objPid->getAbsoluteUrl('/articles/' . ($objArticle->alias ?: $objArticle->id))); } break; default: $link = sprintf($strUrl, $objEvent->alias ?: $objEvent->id); break; } // Store the whole row (see #5085) $arrEvent = $objEvent->row(); // Override link and title $arrEvent['link'] = $link; $arrEvent['title'] = $title; // Clean the RTE output $arrEvent['teaser'] = \StringUtil::toHtml5($objEvent->teaser); // Reset the enclosures (see #5685) $arrEvent['enclosure'] = array(); // Add the article image as enclosure if ($objEvent->addImage) { $objFile = \FilesModel::findByUuid($objEvent->singleSRC); if ($objFile !== null) { $arrEvent['enclosure'][] = $objFile->path; } } // Enclosures if ($objEvent->addEnclosure) { $arrEnclosure = \StringUtil::deserialize($objEvent->enclosure, true); if (is_array($arrEnclosure)) { $objFile = \FilesModel::findMultipleByUuids($arrEnclosure); if ($objFile !== null) { while ($objFile->next()) { $arrEvent['enclosure'][] = $objFile->path; } } } } $this->arrEvents[$intKey][$intStart][] = $arrEvent; }