/** * Generate the content element */ protected function compile() { $arrItems = array(); $t = 'tl_news'; if ($this->include_type == 'archives') { $arrArchiveIds = deserialize($this->include_archives, true); $strSortOrder = $this->sortOrder == 'ascending' ? 'ASC' : 'DESC'; if (sizeof($arrArchiveIds)) { $objItems = \NewsModel::findPublishedByPids($arrArchiveIds, null, 0, 0, array('order' => 'date ' . $strSortOrder)); } } else { $arrItemIds = deserialize($this->include_items, true); if (sizeof($arrItemIds)) { $arrItems = array_map(function () { return ''; }, array_flip($arrItemIds)); $arrColumns = array("{$t}.id IN(" . implode(',', array_map('intval', $arrItemIds)) . ")"); if (!BE_USER_LOGGED_IN) { $time = time(); $arrColumns[] = "({$t}.start='' OR {$t}.start<{$time}) AND ({$t}.stop='' OR {$t}.stop>{$time}) AND {$t}.published=1"; } $objItems = \NewsModel::findBy($arrColumns, null); } } if (!is_null($objItems)) { while ($objItems->next()) { $objReaderPage = \PageModel::findById($objItems->getRelated('pid')->jumpTo); $arrItem = $objItems->row(); $arrItem['date'] = \Date::parse('Y-m-d', $objItems->date); $arrItem['dateReadable'] = \Date::parse(\Config::get('dateFormat') ?: 'Y-m-d', $objItems->date); $arrItem['href'] = ampersand($this->generateFrontendUrl($objReaderPage->row(), (\Config::get('useAutoItem') && !\Config::get('disableAlias') ? '/' : '/items/') . (!\Config::get('disableAlias') && $objItems->alias != '' ? $objItems->alias : $objItems->id))); $arrItems[$objItems->id] = $arrItem; } } $this->Template->items = array_filter($arrItems); }
/** * Generate an XML files and save them to the root directory * * @param array $arrFeed */ protected function generateFiles($arrFeed) { $arrArchives = deserialize($arrFeed['archives']); if (!is_array($arrArchives) || empty($arrArchives)) { return; } $strType = $arrFeed['format'] == 'atom' ? 'generateAtom' : 'generateRss'; $strLink = $arrFeed['feedBase'] ?: \Environment::get('base'); $strFile = $arrFeed['feedName']; $objFeed = new \Feed($strFile); $objFeed->link = $strLink; $objFeed->title = $arrFeed['title']; $objFeed->description = $arrFeed['description']; $objFeed->language = $arrFeed['language']; $objFeed->published = $arrFeed['tstamp']; // Get the items if ($arrFeed['maxItems'] > 0) { $objArticle = \NewsModel::findPublishedByPids($arrArchives, null, $arrFeed['maxItems']); } else { $objArticle = \NewsModel::findPublishedByPids($arrArchives); } // Parse the items if ($objArticle !== null) { $arrUrls = array(); while ($objArticle->next()) { /** @var \PageModel $objPage */ $objPage = $objArticle->getRelated('pid'); $jumpTo = $objPage->jumpTo; // No jumpTo page set (see #4784) if (!$jumpTo) { continue; } // Get the jumpTo URL if (!isset($arrUrls[$jumpTo])) { $objParent = \PageModel::findWithDetails($jumpTo); // A jumpTo page is set but does no longer exist (see #5781) if ($objParent === null) { $arrUrls[$jumpTo] = false; } else { $arrUrls[$jumpTo] = $objParent->getFrontendUrl(\Config::get('useAutoItem') && !\Config::get('disableAlias') ? '/%s' : '/items/%s'); } } // Skip the event if it requires a jumpTo URL but there is none if ($arrUrls[$jumpTo] === false && $objArticle->source == 'default') { continue; } $strUrl = $arrUrls[$jumpTo]; $objItem = new \FeedItem(); $objItem->title = $objArticle->headline; $objItem->link = $this->getLink($objArticle, $strUrl, $strLink); $objItem->published = $objArticle->date; $objItem->author = $objArticle->authorName; // Prepare the description if ($arrFeed['source'] == 'source_text') { $strDescription = ''; $objElement = \ContentModel::findPublishedByPidAndTable($objArticle->id, 'tl_news'); if ($objElement !== null) { // Overwrite the request (see #7756) $strRequest = \Environment::get('request'); \Environment::set('request', $objItem->link); while ($objElement->next()) { $strDescription .= $this->getContentElement($objElement->current()); } \Environment::set('request', $strRequest); } } else { $strDescription = $objArticle->teaser; } $strDescription = $this->replaceInsertTags($strDescription, false); $objItem->description = $this->convertRelativeUrls($strDescription, $strLink); // Add the article image as enclosure if ($objArticle->addImage) { $objFile = \FilesModel::findByUuid($objArticle->singleSRC); if ($objFile !== null) { $objItem->addEnclosure($objFile->path, $strLink); } } // Enclosures if ($objArticle->addEnclosure) { $arrEnclosure = deserialize($objArticle->enclosure, true); if (is_array($arrEnclosure)) { $objFile = \FilesModel::findMultipleByUuids($arrEnclosure); if ($objFile !== null) { while ($objFile->next()) { $objItem->addEnclosure($objFile->path, $strLink); } } } } $objFeed->addItem($objItem); } } // Create the file \File::putContent('share/' . $strFile . '.xml', $this->replaceInsertTags($objFeed->{$strType}(), false)); }
/** * Generate an XML files and save them to the root directory * @param array */ protected function generateFiles($arrFeed) { $arrArchives = deserialize($arrFeed['archives']); if (!is_array($arrArchives) || empty($arrArchives)) { return; } $strType = $arrFeed['format'] == 'atom' ? 'generateAtom' : 'generateRss'; $strLink = $arrFeed['feedBase'] ?: \Environment::get('base'); $strFile = $arrFeed['feedName']; $objFeed = new \Feed($strFile); $objFeed->link = $strLink; $objFeed->title = $arrFeed['title']; $objFeed->description = $arrFeed['description']; $objFeed->language = $arrFeed['language']; $objFeed->published = $arrFeed['tstamp']; $arrCategories = deserialize($arrFeed['categories']); // Filter by categories if (is_array($arrCategories) && !empty($arrCategories)) { $GLOBALS['NEWS_FILTER_CATEGORIES'] = true; $GLOBALS['NEWS_FILTER_DEFAULT'] = $arrCategories; } else { $GLOBALS['NEWS_FILTER_CATEGORIES'] = false; } // Get the items if ($arrFeed['maxItems'] > 0) { $objArticle = \NewsModel::findPublishedByPids($arrArchives, null, $arrFeed['maxItems']); } else { $objArticle = \NewsModel::findPublishedByPids($arrArchives); } // Parse the items if ($objArticle !== null) { $arrUrls = array(); while ($objArticle->next()) { $jumpTo = $objArticle->getRelated('pid')->jumpTo; // No jumpTo page set (see #4784) if (!$jumpTo) { continue; } // Get the jumpTo URL if (!isset($arrUrls[$jumpTo])) { $objParent = \PageModel::findWithDetails($jumpTo); // A jumpTo page is set but does no longer exist (see #5781) if ($objParent === null) { $arrUrls[$jumpTo] = false; } else { $arrUrls[$jumpTo] = $this->generateFrontendUrl($objParent->row(), $GLOBALS['TL_CONFIG']['useAutoItem'] && !$GLOBALS['TL_CONFIG']['disableAlias'] ? '/%s' : '/items/%s', $objParent->language); } } // Skip the event if it requires a jumpTo URL but there is none if ($arrUrls[$jumpTo] === false && $objArticle->source == 'default') { continue; } // Get the categories if ($arrFeed['categories_show']) { $arrCategories = array(); if (($objCategories = NewsCategoryModel::findPublishedByIds(deserialize($objArticle->categories, true))) !== null) { $arrCategories = $objCategories->fetchEach('title'); } } $strUrl = $arrUrls[$jumpTo]; $objItem = new \FeedItem(); // Add the categories to the title if ($arrFeed['categories_show'] == 'title') { $objItem->title = sprintf('[%s] %s', implode(', ', $arrCategories), $objArticle->headline); } else { $objItem->title = $objArticle->headline; } $objItem->link = $this->getLink($objArticle, $strUrl, $strLink); $objItem->published = $objArticle->date; $objItem->author = $objArticle->authorName; // Prepare the description if ($arrFeed['source'] == 'source_text') { $strDescription = ''; $objElement = \ContentModel::findPublishedByPidAndTable($objArticle->id, 'tl_news'); if ($objElement !== null) { while ($objElement->next()) { $strDescription .= $this->getContentElement($objElement->id); } } } else { $strDescription = $objArticle->teaser; } // Add the categories to the description if ($arrFeed['categories_show'] == 'text_before' || $arrFeed['categories_show'] == 'text_after') { $strCategories = '<p>' . $GLOBALS['TL_LANG']['MSC']['newsCategories'] . ' ' . implode(', ', $arrCategories) . '</p>'; if ($arrFeed['categories_show'] == 'text_before') { $strDescription = $strCategories . $strDescription; } else { $strDescription .= $strCategories; } } $strDescription = $this->replaceInsertTags($strDescription, false); $objItem->description = $this->convertRelativeUrls($strDescription, $strLink); // Add the article image as enclosure if ($objArticle->addImage) { $objFile = \FilesModel::findByUuid($objArticle->singleSRC); if ($objFile !== null) { $objItem->addEnclosure($objFile->path); } } // Enclosures if ($objArticle->addEnclosure) { $arrEnclosure = deserialize($objArticle->enclosure, true); if (is_array($arrEnclosure)) { $objFile = \FilesModel::findMultipleByUuids($arrEnclosure); if ($objFile !== null) { while ($objFile->next()) { $objItem->addEnclosure($objFile->path); } } } } $objFeed->addItem($objItem); } } // Create the file \File::putContent('share/' . $strFile . '.xml', $this->replaceInsertTags($objFeed->{$strType}(), false)); }
/** * Generate the module */ protected function compile() { $offset = intval($this->skipFirst); $limit = null; // Maximum number of items if ($this->numberOfItems > 0) { $limit = $this->numberOfItems; } // Handle featured news if ($this->news_featured == 'featured') { $blnFeatured = true; } elseif ($this->news_featured == 'unfeatured') { $blnFeatured = false; } else { $blnFeatured = null; } $this->Template->articles = array(); $this->Template->empty = $GLOBALS['TL_LANG']['MSC']['emptyList']; // Get the total number of items $intTotal = \NewsModel::countPublishedByPids($this->news_archives, $blnFeatured); if ($intTotal < 1) { return; } $total = $intTotal - $offset; // Split the results if ($this->perPage > 0 && (!isset($limit) || $this->numberOfItems > $this->perPage)) { // Adjust the overall limit if (isset($limit)) { $total = min($limit, $total); } // Get the current page $id = 'page_n' . $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; } // Set limit and offset $limit = $this->perPage; $offset += (max($page, 1) - 1) * $this->perPage; $skip = intval($this->skipFirst); // Overall limit if ($offset + $limit > $total + $skip) { $limit = $total + $skip - $offset; } // Add the pagination menu $objPagination = new \Pagination($total, $this->perPage, \Config::get('maxPaginationLinks'), $id); $this->Template->pagination = $objPagination->generate("\n "); } // Get the items if (isset($limit)) { $objArticles = \NewsModel::findPublishedByPids($this->news_archives, $blnFeatured, $limit, $offset); } else { $objArticles = \NewsModel::findPublishedByPids($this->news_archives, $blnFeatured, 0, $offset); } // Add the articles if ($objArticles !== null) { $this->Template->articles = $this->parseArticles($objArticles); } $this->Template->archives = $this->news_archives; }
/** * Generate the dayil menu */ protected function compileDailyMenu() { $arrData = array(); $this->Template = new \FrontendTemplate('mod_newsmenu_day'); $objArchives = \NewsModel::findPublishedByPids($this->news_archives); if ($objArchives !== null) { while ($objArchives->next()) { ++$arrData[date('Ymd', $objArchives->date)]; } } // Sort the data krsort($arrData); $strUrl = \Environment::get('request'); // Get the current "jumpTo" page if ($this->jumpTo && ($objTarget = $this->objModel->getRelated('jumpTo')) !== null) { $strUrl = $this->generateFrontendUrl($objTarget->row()); } $this->Date = \Input::get('day') ? new \Date(\Input::get('day'), 'Ymd') : new \Date(); $intYear = date('Y', $this->Date->tstamp); $intMonth = date('m', $this->Date->tstamp); $this->Template->intYear = $intYear; $this->Template->intMonth = $intMonth; // Previous month $prevMonth = $intMonth == 1 ? 12 : $intMonth - 1; $prevYear = $intMonth == 1 ? $intYear - 1 : $intYear; $lblPrevious = $GLOBALS['TL_LANG']['MONTHS'][$prevMonth - 1] . ' ' . $prevYear; $this->Template->prevHref = $strUrl . ($GLOBALS['TL_CONFIG']['disableAlias'] ? '?id=' . \Input::get('id') . '&' : '?') . 'day=' . $prevYear . (strlen($prevMonth) < 2 ? '0' : '') . $prevMonth . '01'; $this->Template->prevTitle = specialchars($lblPrevious); $this->Template->prevLink = $GLOBALS['TL_LANG']['MSC']['news_previous'] . ' ' . $lblPrevious; $this->Template->prevLabel = $GLOBALS['TL_LANG']['MSC']['news_previous']; // Current month $this->Template->current = $GLOBALS['TL_LANG']['MONTHS'][date('m', $this->Date->tstamp) - 1] . ' ' . date('Y', $this->Date->tstamp); // Next month $nextMonth = $intMonth == 12 ? 1 : $intMonth + 1; $nextYear = $intMonth == 12 ? $intYear + 1 : $intYear; $lblNext = $GLOBALS['TL_LANG']['MONTHS'][$nextMonth - 1] . ' ' . $nextYear; $this->Template->nextHref = $strUrl . ($GLOBALS['TL_CONFIG']['disableAlias'] ? '?id=' . \Input::get('id') . '&' : '?') . 'day=' . $nextYear . (strlen($nextMonth) < 2 ? '0' : '') . $nextMonth . '01'; $this->Template->nextTitle = specialchars($lblNext); $this->Template->nextLink = $lblNext . ' ' . $GLOBALS['TL_LANG']['MSC']['news_next']; $this->Template->nextLabel = $GLOBALS['TL_LANG']['MSC']['news_next']; // Set week start day if (!$this->news_startDay) { $this->news_startDay = 0; } $this->Template->days = $this->compileDays(); $this->Template->weeks = $this->compileWeeks($arrData, $strUrl); $this->Template->showQuantity = $this->news_showQuantity != '' ? true : false; }
/** * Fetch the matching items * * @param array $newsArchives * @param boolean $blnFeatured * @param integer $limit * @param integer $offset * * @return \Model\Collection|\NewsModel|null */ protected function fetchItems($newsArchives, $blnFeatured, $limit, $offset) { // HOOK: add custom logic if (isset($GLOBALS['TL_HOOKS']['newsListFetchItems']) && is_array($GLOBALS['TL_HOOKS']['newsListFetchItems'])) { foreach ($GLOBALS['TL_HOOKS']['newsListFetchItems'] as $callback) { if (($objCollection = \System::importStatic($callback[0])->{$callback[1]}($newsArchives, $blnFeatured, $limit, $offset, $this)) === false) { continue; } if ($objCollection === null || $objCollection instanceof \Model\Collection) { return $objCollection; } } } return \NewsModel::findPublishedByPids($newsArchives, $blnFeatured, $limit, $offset); }
public static function getRelatedNews(\DataContainer $dc, array $arrRelation = array()) { $arrOptionGroups = array(); $arrOptions = array(); // front end mode with module & relation context if (!empty($arrRelation)) { $objNews = \NewsModel::findPublishedByPids(deserialize($dc->objModule->news_archives, true), null, 0, 0, array('order' => 'headline')); } else { $objNews = \NewsModel::findAll(); } if ($objNews === null) { return $arrOptions; } while ($objNews->next()) { // return as optgroup if more than 1 $arrPids if (($objArchive = $objNews->getRelated('pid')) === null) { continue; } $arrOptionGroups[$objArchive->title][$objNews->id] = $objNews->headline; $arrOptions[$objNews->id] = $objNews->headline; } $arrDca =& $GLOBALS['TL_DCA']['tl_submission']; // filter menu does not support optgroups if (TL_MODE == 'BE' && $dc->field != 'news') { return $arrOptions; } // remove optgroups if not wanted, or less than 2 optgroups if (count($arrOptionGroups) == 1 || $arrDca['fields'][$arrRelation['submissionField']]['eval']['optgroup'] === false) { return $arrOptions; } return $arrOptionGroups; }
protected function getNewsItems() { $tmpArr = array(); $news = \NewsModel::findPublishedByPids(array($this->settings['news'])); while ($news->next()) { $tmpArr[] = array('title' => $news->headline, 'tstamp' => $news->time, 'id' => $news->id, 'type' => 'news', 'thumb' => $news->singleSRC && $news->addImage ? $this->getFilePath($news->singleSRC) : null); } return $tmpArr; }
/** * Generate an XML files and save them to the root directory * @param array */ protected function generateFiles($arrFeed) { $arrArchives = deserialize($arrFeed['archives']); if (!is_array($arrArchives) || empty($arrArchives)) { return; } $strType = $arrFeed['format'] == 'atom' ? 'generateAtom' : 'generateRss'; $strLink = $arrFeed['feedBase'] ?: \Environment::get('base'); $strFile = $arrFeed['feedName']; $objFeed = new \Feed($strFile); $objFeed->link = $strLink; $objFeed->title = $arrFeed['title']; $objFeed->description = $arrFeed['description']; $objFeed->language = $arrFeed['language']; $objFeed->published = $arrFeed['tstamp']; // Get the items if ($arrFeed['maxItems'] > 0) { $objArticle = \NewsModel::findPublishedByPids($arrArchives, null, $arrFeed['maxItems']); } else { $objArticle = \NewsModel::findPublishedByPids($arrArchives); } // Parse the items if ($objArticle !== null) { $arrUrls = array(); while ($objArticle->next()) { $jumpTo = $objArticle->getRelated('pid')->jumpTo; // No jumpTo page set (see #4784) if (!$jumpTo) { continue; } // Get the jumpTo URL if (!isset($arrUrls[$jumpTo])) { $objParent = $this->getPageDetails($jumpTo); $arrUrls[$jumpTo] = $this->generateFrontendUrl($objParent->row(), $GLOBALS['TL_CONFIG']['useAutoItem'] ? '/%s' : '/items/%s', $objParent->language); } $strUrl = $arrUrls[$jumpTo]; $objItem = new \FeedItem(); $objItem->title = $objArticle->headline; $objItem->link = $this->getLink($objArticle, $strUrl, $strLink); $objItem->published = $objArticle->date; $objItem->author = $objArticle->authorName; // Prepare the description if ($arrFeed['source'] == 'source_text') { $strDescription = ''; $objElement = \ContentModel::findPublishedByPidAndTable($objArticle->id, 'tl_news'); if ($objElement !== null) { while ($objElement->next()) { $strDescription .= $this->getContentElement($objElement->id); } } } else { $strDescription = $objArticle->teaser; } $strDescription = $this->replaceInsertTags($strDescription); $objItem->description = $this->convertRelativeUrls($strDescription, $strLink); // Add the article image as enclosure if ($objArticle->addImage) { $objFile = \FilesModel::findByPk($objArticle->singleSRC); if ($objFile !== null) { $objItem->addEnclosure($objFile->path); } } // Enclosures if ($objArticle->addEnclosure) { $arrEnclosure = deserialize($objArticle->enclosure, true); if (is_array($arrEnclosure)) { $objFile = \FilesModel::findMultipleByIds($arrEnclosure); while ($objFile->next()) { $objItem->addEnclosure($objFile->path); } } } $objFeed->addItem($objItem); } } // Create the file $objRss = new \File('share/' . $strFile . '.xml'); $objRss->write($this->replaceInsertTags($objFeed->{$strType}())); $objRss->close(); }