protected function compile() { global $objPage; $this->Template->event = ''; $this->Template->referer = 'javascript:history.go(-1)'; $this->Template->back = $GLOBALS['TL_LANG']['MSC']['goBack']; if ($this->objEvent === null) { // Do not index or cache the page $objPage->noSearch = 1; $objPage->cache = 0; // Send a 404 header header('HTTP/1.1 404 Not Found'); $this->Template->event = '<p class="error">' . sprintf($GLOBALS['TL_LANG']['MSC']['invalidPage'], \Input::get('events')) . '</p>'; // remove page from search index if ($this->cal_showInModal) { \HeimrichHannot\SearchPlus\Search::removePageFromIndex(\Environment::get('request')); } return; } // Overwrite the page title (see #2853 and #4955) if ($this->objEvent->title != '') { $objPage->pageTitle = strip_tags(strip_insert_tags($this->objEvent->title)); } // Overwrite the page description if ($this->objEvent->teaser != '') { $objPage->description = $this->prepareMetaDescription($this->objEvent->teaser); } $strUrl = ''; $objCalendar = \CalendarModel::findByPk($this->objEvent->pid); // Get the current "jumpTo" page if ($objCalendar !== null && $objCalendar->jumpTo && ($objTarget = $objCalendar->getRelated('jumpTo')) !== null) { $strUrl = $this->generateFrontendUrl($objTarget->row(), \Config::get('useAutoItem') && !\Config::get('disableAlias') ? '/%s' : '/events/%s'); } $intStartTime = $this->objEvent->startTime; $intEndTime = $this->objEvent->endTime; $span = \Calendar::calculateSpan($intStartTime, $intEndTime); // Do not show dates in the past if the event is recurring (see #923) if ($this->objEvent->recurring) { $arrRange = deserialize($this->objEvent->repeatEach); while ($intStartTime < time() && $intEndTime < $this->objEvent->repeatEnd) { $intStartTime = strtotime('+' . $arrRange['value'] . ' ' . $arrRange['unit'], $intStartTime); $intEndTime = strtotime('+' . $arrRange['value'] . ' ' . $arrRange['unit'], $intEndTime); } } $objEvent = (object) $this->getEventDetails($this->objEvent, $intStartTime, $intEndTime, $strUrl, $intStartTime, $this->objEvent->pid); $arrSubEvents = array(); if (!$this->cal_ungroupSubevents) { $objChildEvents = CalendarPlusEventsModel::findPublishedSubEvents($objEvent->id); if ($objChildEvents !== null) { while ($objChildEvents->next()) { $arrSubEvents[$objChildEvents->id] = $this->addSingleEvent($objChildEvents, $intStartTime); } } } if ($objPage->outputFormat == 'xhtml') { $strTimeStart = ''; $strTimeEnd = ''; $strTimeClose = ''; } else { $strTimeStart = '<time datetime="' . date('Y-m-d\\TH:i:sP', $intStartTime) . '">'; $strTimeEnd = '<time datetime="' . date('Y-m-d\\TH:i:sP', $intEndTime) . '">'; $strTimeClose = '</time>'; } // Get date if ($span > 0) { $date = $strTimeStart . \Date::parse($objEvent->addTime ? $objPage->datimFormat : $objPage->dateFormat, $intStartTime) . $strTimeClose . ' - ' . $strTimeEnd . \Date::parse($objEvent->addTime ? $objPage->datimFormat : $objPage->dateFormat, $intEndTime) . $strTimeClose; } elseif ($intStartTime == $intEndTime) { $date = $strTimeStart . \Date::parse($objPage->dateFormat, $intStartTime) . ($objEvent->addTime ? ' (' . \Date::parse($objPage->timeFormat, $intStartTime) . ')' : '') . $strTimeClose; } else { $date = $strTimeStart . \Date::parse($objPage->dateFormat, $intStartTime) . ($objEvent->addTime ? ' (' . \Date::parse($objPage->timeFormat, $intStartTime) . $strTimeClose . ' - ' . $strTimeEnd . \Date::parse($objPage->timeFormat, $intEndTime) . ')' : '') . $strTimeClose; } $until = ''; $recurring = ''; // Recurring event if ($objEvent->recurring) { $arrRange = deserialize($objEvent->repeatEach); $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)); } } // Override the default image size if ($this->imgSize != '') { $size = deserialize($this->imgSize); if ($size[0] > 0 || $size[1] > 0 || is_numeric($size[2])) { $objEvent->size = $this->imgSize; } } $imgSize = false; // Override the default image size if ($this->imgSize != '') { $size = deserialize($this->imgSize); if ($size[0] > 0 || $size[1] > 0 || is_numeric($size[2])) { $imgSize = $this->imgSize; } } $objTemplate = new \FrontendTemplate($this->cal_template); $objTemplate->setData((array) $objEvent); $objTemplate->nav = $this->generateArrowNavigation($objEvent, $strUrl); if ($this->registration !== null) { $objTemplate->registration = $this->registration; $objTemplate->module = $this; // falback } if (is_array($arrSubEvents) && !empty($arrSubEvents)) { $strSubEvents = ''; foreach ($arrSubEvents as $subID => $arrSubEvent) { $objSubEventTemplate = new \FrontendTemplate($this->cal_templateSubevent); $objSubEventTemplate->setData($arrSubEvent); $this->addEventDetailsToTemplate($objSubEventTemplate, $arrSubEvent, '', '', $imgSize); $strSubEvents .= $objSubEventTemplate->parse() . "\n"; } $objTemplate->subEvents = $strSubEvents; } if ($this->addShare && in_array('share', $this->Config->getActiveModules())) { $objShare = new \HeimrichHannot\Share\Share($this->objModel, $objEvent); $objTemplate->share = $objShare->generate(); } $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(); $arrEvent['singleSRC'] = $objModel->path; $this->addImageToTemplate($objTemplate, $arrEvent); } } $objTemplate->enclosure = array(); // Add enclosures if ($objEvent->addEnclosure) { $this->addEnclosuresToTemplate($objTemplate, $this->objEvent->row()); } $this->Template->event = $objTemplate->parse(); // HOOK: comments extension required if ($objEvent->noComments || !in_array('comments', \ModuleLoader::getActive())) { $this->Template->allowComments = false; return; } $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') { 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); }
/** * Generate the module */ protected function compile() { global $objPage; $blnClearInput = false; $intYear = \Input::get('year'); $intMonth = \Input::get('month'); $intDay = \Input::get('day'); // Jump to the current period if (!isset($_GET['year']) && !isset($_GET['month']) && !isset($_GET['day'])) { switch ($this->cal_format) { case 'cal_year': $intYear = date('Y'); break; case 'cal_month': $intMonth = date('Ym'); break; case 'cal_day': $intDay = date('Ymd'); break; } $blnClearInput = true; } $blnDynamicFormat = !$this->cal_ignoreDynamic && in_array($this->cal_format, array('cal_day', 'cal_month', 'cal_year')); // Display year if ($blnDynamicFormat && $intYear) { $this->Date = new \Date($intYear, 'Y'); $this->cal_format = 'cal_year'; $this->headline .= ' ' . date('Y', $this->Date->tstamp); } elseif ($blnDynamicFormat && $intMonth) { $this->Date = new \Date($intMonth, 'Ym'); $this->cal_format = 'cal_month'; $this->headline .= ' ' . \Date::parse('F Y', $this->Date->tstamp); } elseif ($blnDynamicFormat && $intDay) { $this->Date = new \Date($intDay, 'Ymd'); $this->cal_format = 'cal_day'; $this->headline .= ' ' . \Date::parse($objPage->dateFormat, $this->Date->tstamp); } else { $this->Date = new \Date(); } list($strBegin, $strEnd, $strEmpty) = $this->getDatesFromFormat($this->Date, $this->cal_format); $arrFilter = array(); $arrOptions = array(); $arrFilterConfig = array(); if ($this->cal_filterModule) { $objFilterModule = \ModuleModel::findByPk($this->cal_filterModule); if ($objFilterModule !== null) { $objFilterModule = $this->prepareFilterModel($objFilterModule); $arrFilter = $this->getFilter($objFilterModule); // $arrOptions = $this->getPossibleFilterOptions($objFilterModule); $arrFilterConfig['module'] = $objFilterModule->row(); $arrFilterConfig['combine_docents'] = $objFilterModule->cal_docent_combine; if (!empty($arrFilter)) { $strEmpty =& $GLOBALS['TL_LANG']['eventlist']['listEmptyFilter']; } } } // Get all events $arrAllEvents = $this->getAllEvents($this->cal_calendar, $strBegin, $strEnd, $arrFilter, $arrOptions, $arrFilterConfig); $isRelatedList = false; if (empty($arrAllEvents) && $objFilterModule->cal_filterRelatedOnEmpty) { $arrFilterConfig['show_related'] = true; $arrAllEvents = $this->getAllEvents($this->cal_calendar, $strBegin, $strEnd, $arrFilter, $arrOptions, $arrFilterConfig); $isRelatedList = true; } $sort = $this->cal_order == 'descending' ? 'krsort' : 'ksort'; // Sort the days $sort($arrAllEvents); // Sort the events foreach (array_keys($arrAllEvents) as $key) { $sort($arrAllEvents[$key]); } $arrEvents = array(); $arrEventIds = array(); $arrParentEvents = array(); $arrParentEventIds = array(); $arrSubEvents = array(); $dateBegin = date('Ymd', $strBegin); $dateEnd = date('Ymd', $strEnd); // Remove events outside the scope foreach ($arrAllEvents as $key => $days) { if ($key < $dateBegin || $key > $dateEnd) { continue; } foreach ($days as $day => $events) { foreach ($events as $event) { $event['firstDay'] = $GLOBALS['TL_LANG']['DAYS'][date('w', $day)]; $event['firstDate'] = \Date::parse($objPage->dateFormat, $day); $event['datetime'] = date('Y-m-d', $day); $event['dateday'] = $day; if (!$this->cal_ungroupSubevents) { // event is child event --> add parent event if (($intParentEvent = $event['parentEvent']) > 0) { // add parent event if (($arrParentEvent = $this->getParentEventDetails($intParentEvent, $event['pid'], $strBegin)) === null) { continue; } $arrParentEvent['firstDay'] = $GLOBALS['TL_LANG']['DAYS'][date('w', $day)]; $arrParentEvent['firstDate'] = \Date::parse($objPage->dateFormat, $day); $arrParentEvent['datetime'] = date('Y-m-d', $day); $arrParentEvent['dateday'] = $day; $arrParentEvents[$arrParentEvent['id']] = $arrParentEvent; $arrParentEventIds[] = $arrParentEvent['id']; // set parent event as href $event['href'] = $event['parentHref']; $arrSubEvents[$intParentEvent][$event['id']] = $event; continue; } else { $objChildEvents = CalendarPlusEventsModel::findPublishedSubEvents($event['id']); if ($objChildEvents !== null) { while ($objChildEvents->next()) { $arrSubEvents[$event['id']][$objChildEvents->id] = $this->addSingleEvent($objChildEvents, $strBegin); } } } } $arrEvents[] = $event; $arrEventIds[] = $event['id']; } } } // add parent events to $arrEvents if (!empty($arrParentEventIds)) { $arrEventIds = array_diff($arrParentEventIds, $arrEventIds); foreach ($arrParentEvents as $id => $event) { if (!in_array($id, $arrEventIds)) { continue; } $arrEvents[] = $event; } } unset($arrAllEvents); $total = count($arrEvents); $limit = $total; $offset = 0; // Overall limit if ($this->cal_limit > 0) { $total = min($this->cal_limit, $total); $limit = $total; } // Pagination if ($this->perPage > 0) { $id = 'page_e' . $this->id; $page = \Input::get($id) ?: 1; // Do not index or cache the page if the page number is outside the range if ($page < 1 || $page > max(ceil($total / $this->perPage), 1)) { global $objPage; $objPage->noSearch = 1; $objPage->cache = 0; // Send a 404 header header('HTTP/1.1 404 Not Found'); return; } $offset = ($page - 1) * $this->perPage; $limit = min($this->perPage + $offset, $total); // load specific pagination template if infiniteScroll is used // otherwise keep standard pagination $objT = $this->cal_useInfiniteScroll ? new \FrontendTemplate('infinite_pagination') : null; if (!is_null($objT)) { $objT->triggerText = $this->cal_changeTriggerText ? $this->cal_triggerText : $GLOBALS['TL_LANG']['eventlist']['loadMore']; } // Add the pagination menu $objPagination = new \Pagination($total, $this->perPage, \Config::get('maxPaginationLinks'), $id, $objT); $this->Template->pagination = $objPagination->generate("\n "); } $strMonth = ''; $strDate = ''; $strEvents = ''; $monthCount = 0; $dayCount = 0; $eventCount = 0; $headerCount = 0; $headerMonthCount = 0; $imgSize = false; // Override the default image size if ($this->imgSize != '') { $size = deserialize($this->imgSize); if ($size[0] > 0 || $size[1] > 0 || is_numeric($size[2])) { $imgSize = $this->imgSize; } } // Parse events for ($i = $offset; $i < $limit; $i++) { $event = $arrEvents[$i]; $blnIsLastEvent = false; // Last event on the current day if ($i + 1 == $limit || !isset($arrEvents[$i + 1]['firstDate']) || $event['firstDate'] != $arrEvents[$i + 1]['firstDate']) { $blnIsLastEvent = true; } $objTemplate = new \FrontendTemplate($this->cal_template); $objTemplate->setData($event); $objTemplate->lastItem = $i + 1 == $limit || $arrEvents[$i + 1]['month'] != $event['month'] || $arrEvents[$i + 1]['firstDate'] != $event['firstDate']; // Month header if ($strMonth != $event['month']) { $headerMonthCount = 0; $objTemplate->newMonth = true; $objTemplate->classMonth = ($monthCount % 2 == 0 ? ' even' : ' odd') . ($monthCount == 0 ? ' first' : '') . ($event['firstDate'] == $arrEvents[$limit - 1]['firstDate'] ? ' last' : ''); $strMonth = $event['month']; ++$monthCount; } // Day header if ($strDate != $event['firstDate']) { $headerCount = 0; $objTemplate->header = true; $objTemplate->classHeader = ($dayCount % 2 == 0 ? ' even' : ' odd') . ($dayCount == 0 ? ' first' : '') . ($event['firstDate'] == $arrEvents[$limit - 1]['firstDate'] ? ' last' : ''); $objTemplate->firstHeader = $dayCount == 0; $strDate = $event['firstDate']; ++$dayCount; } if (isset($arrSubEvents[$event['id']]) && is_array($arrSubEvents[$event['id']])) { $strSubEvents = ''; foreach ($arrSubEvents[$event['id']] as $subID => $arrSubEvent) { $objSubEventTemplate = new \FrontendTemplate($this->cal_templateSubevent); $objSubEventTemplate->setData($arrSubEvent); $this->addEventDetailsToTemplate($objTemplate, $arrSubEvent, $headerCount, $eventCount, $imgSize); $strSubEvents .= $objSubEventTemplate->parse() . "\n"; } $objTemplate->subEvents = $strSubEvents; } $strClassList = $event['class'] . ($headerCount % 2 == 0 ? ' even' : ' odd') . ($headerCount == 0 ? ' first' : '') . ($blnIsLastEvent ? ' last' : '') . ' cal_' . $event['parent']; $strClassUpcoming = $event['class'] . ($eventCount % 2 == 0 ? ' even' : ' odd') . ($eventCount == 0 ? ' first' : '') . ($offset + $eventCount + 1 >= $limit ? ' last' : '') . ' cal_' . $event['parent']; $this->addEventDetailsToTemplate($objTemplate, $event, $strClassList, $strClassUpcoming, $imgSize); $strEvents .= $objTemplate->parse(); ++$eventCount; ++$headerCount; } $strEmpty = "\n" . '<div class="empty">' . $strEmpty . '</div>' . "\n"; $this->Template->emptyMessage = $strEmpty; // No events found if ($strEvents == '') { $strEvents = $strEmpty; $this->Template->empty = true; } // See #3672 $this->Template->headline = $this->headline; $this->Template->events = $strEvents; $this->Template->isRelated = $isRelatedList && !$this->Template->empty; // Clear the $_GET array (see #2445) if ($blnClearInput) { \Input::setGet('year', null); \Input::setGet('month', null); \Input::setGet('day', null); } }