Skip to content
Snippets Groups Projects
Commit 922659cf authored by Stefan Galinski's avatar Stefan Galinski :video_game:
Browse files

[FEATURE] Load more entries via AJAX inside the overview category menu

parent 11a2b71f
No related branches found
No related tags found
No related merge requests found
...@@ -61,6 +61,29 @@ class OverviewController extends AbstractController { ...@@ -61,6 +61,29 @@ class OverviewController extends AbstractController {
} }
} }
/**
* Highlights the best fitting news in the meta data of the page
*
* @param array $categoryIds
*/
protected function highlightBestFitNews(array $categoryIds) {
/** @var News $highlightedNews */
$highlightedNews = $this->newsRepository
->findLastUpdatedOrHighlightedNewsByCategories(1, FALSE, $categoryIds)->getFirst();
/** @var Category $category */
$category = $this->categoryRepository->findByUid($highlightedNews->getPid());
$highlightedNewsMetaData = NULL;
if ($category) {
$highlightedNewsMetaData = $this->getMetaDataForNews($highlightedNews, $category);
}
if ($highlightedNewsMetaData['image']) {
HeaderMetaDataService::addOgImageToHeader($highlightedNewsMetaData['image']);
} elseif ($highlightedNewsMetaData['teaserImage']) {
HeaderMetaDataService::addOgImageToHeader($highlightedNewsMetaData['teaserImage']);
}
}
/** /**
* Renders the news overview grouped by categories * Renders the news overview grouped by categories
* *
...@@ -71,18 +94,27 @@ class OverviewController extends AbstractController { ...@@ -71,18 +94,27 @@ class OverviewController extends AbstractController {
$newsLimitPerCategory = (int) $this->settings['newsLimit']; $newsLimitPerCategory = (int) $this->settings['newsLimit'];
$this->categoryRepository->setDefaultOrderings(['sorting' => Query::ORDER_ASCENDING]); $this->categoryRepository->setDefaultOrderings(['sorting' => Query::ORDER_ASCENDING]);
$offset = 0;
$currentPageBrowserPage = (int) GeneralUtility::_GP('tx_sgnews_pagebrowser')['currentPage'];
if ($currentPageBrowserPage && $newsLimitPerCategory) {
$offset = ($currentPageBrowserPage * $newsLimitPerCategory) - 1;
}
if ($this->settings['onlyNewsWithinThisPageSection']) { if ($this->settings['onlyNewsWithinThisPageSection']) {
/** @noinspection PhpUndefinedMethodInspection */ /** @noinspection PhpUndefinedMethodInspection */
$categories = $this->categoryRepository->findByPid($GLOBALS['TSFE']->id); $categories = $this->categoryRepository->findByPid($GLOBALS['TSFE']->id);
} else { } else {
$categories = $this->categoryRepository->findAll(); $categories = $this->categoryRepository->findAll();
} }
$categoryIds = [];
foreach ($categories as $category) { foreach ($categories as $category) {
/** @var Category $category */ /** @var Category $category */
$categoryId = $category->getUid(); $categoryId = $category->getUid();
$categoryIds[] = $categoryId;
$newsMetaData = []; $newsMetaData = [];
$news = $this->newsRepository->findAllSortedNewsByCategories([$categoryId], $newsLimitPerCategory); $news = $this->newsRepository->findAllSortedNewsByCategories([$categoryId], $newsLimitPerCategory, $offset);
foreach ($news as $newsEntry) { foreach ($news as $newsEntry) {
/** @var News $newsEntry */ /** @var News $newsEntry */
$data = $this->getMetaDataForNews($newsEntry, $category); $data = $this->getMetaDataForNews($newsEntry, $category);
...@@ -98,22 +130,12 @@ class OverviewController extends AbstractController { ...@@ -98,22 +130,12 @@ class OverviewController extends AbstractController {
]; ];
} }
/** @var News $highlightedNews */ $this->highlightBestFitNews($categoryIds);
$highlightedNews = $this->newsRepository->findLastUpdatedOrHighlightedNewsByCategories(1, FALSE)->getFirst();
$category = $newsByCategory[$highlightedNews->getPid()]['category'];
$highlightedNewsMetaData = NULL;
if ($category) {
$highlightedNewsMetaData = $this->getMetaDataForNews($highlightedNews, $category);
}
if ($highlightedNewsMetaData['image']) {
HeaderMetaDataService::addOgImageToHeader($highlightedNewsMetaData['image']);
} elseif ($highlightedNewsMetaData['teaserImage']) {
HeaderMetaDataService::addOgImageToHeader($highlightedNewsMetaData['teaserImage']);
}
$newsCount = $this->newsRepository->newsCountByCategories($categoryIds);
$numberOfPages = ($newsLimitPerCategory <= 0 ? 0 : ceil($newsCount / $newsLimitPerCategory));
$this->view->assign('numberOfPages', $numberOfPages);
$this->view->assign('newsByCategory', $newsByCategory); $this->view->assign('newsByCategory', $newsByCategory);
$this->view->assign('highlightedNewsMetaData', $highlightedNewsMetaData);
} }
/** /**
...@@ -137,8 +159,9 @@ class OverviewController extends AbstractController { ...@@ -137,8 +159,9 @@ class OverviewController extends AbstractController {
$categoriesById = []; $categoriesById = [];
foreach ($categories as $category) { foreach ($categories as $category) {
/** @var $category Category */ /** @var $category Category */
$categoryIds[] = $category->getUid(); $categoryId = $category->getUid();
$categoriesById[$category->getUid()] = $category; $categoryIds[] = $categoryId;
$categoriesById[$categoryId] = $category;
} }
$newsCount = $this->newsRepository->newsCountByCategories($categoryIds); $newsCount = $this->newsRepository->newsCountByCategories($categoryIds);
...@@ -162,12 +185,7 @@ class OverviewController extends AbstractController { ...@@ -162,12 +185,7 @@ class OverviewController extends AbstractController {
$newsMetaData[] = $data; $newsMetaData[] = $data;
} }
$firstNews = $newsMetaData[0]; $this->highlightBestFitNews($categoryIds);
if (is_array($firstNews) && $firstNews['image'] !== '') {
HeaderMetaDataService::addOgImageToHeader($firstNews['image']);
} elseif (is_array($firstNews) && $firstNews['teaserImage'] !== '') {
HeaderMetaDataService::addOgImageToHeader($firstNews['teaserImage']);
}
$numberOfPages = ($newsPerPage <= 0 ? 0 : ceil($newsCount / $newsPerPage)); $numberOfPages = ($newsPerPage <= 0 ? 0 : ceil($newsCount / $newsPerPage));
$this->view->assign('numberOfPages', $numberOfPages); $this->view->assign('numberOfPages', $numberOfPages);
......
...@@ -51,6 +51,10 @@ class NewsRepository extends AbstractRepository { ...@@ -51,6 +51,10 @@ class NewsRepository extends AbstractRepository {
$categoryConstraint[] = $query->in('pid', $categoryIds); $categoryConstraint[] = $query->in('pid', $categoryIds);
} }
if ($categoryIds !== NULL) {
$query->matching($query->logicalAnd($categoryConstraint));
}
if ($limit > 0) { if ($limit > 0) {
$query->setLimit($limit); $query->setLimit($limit);
} }
...@@ -65,7 +69,7 @@ class NewsRepository extends AbstractRepository { ...@@ -65,7 +69,7 @@ class NewsRepository extends AbstractRepository {
'crdate' => QueryInterface::ORDER_DESCENDING, 'crdate' => QueryInterface::ORDER_DESCENDING,
] ]
); );
return $query->matching($query->logicalAnd($categoryConstraint))->execute(); return $query->execute();
} }
/** /**
......
...@@ -23,7 +23,7 @@ ...@@ -23,7 +23,7 @@
<f:for each="{newsByCategory}" as="dataByCategory"> <f:for each="{newsByCategory}" as="dataByCategory">
<div class="tx-sgnews-categories-tabcontent" id="tx-sgnews-categories-tabcontent{dataByCategory.category.uid}"> <div class="tx-sgnews-categories-tabcontent" id="tx-sgnews-categories-tabcontent{dataByCategory.category.uid}">
<h4 class="tx-sgnews-tab-title">{dataByCategory.category.title}</h4> <h4 class="tx-sgnews-tab-title">{dataByCategory.category.title}</h4>
<ul class="tx-sgnews-list row"> <ul class="tx-sgnews-list tx-sgnews-list-{dataByCategory.category.uid} row" data-category="{dataByCategory.category.uid}">
<f:for each="{dataByCategory.newsMetaData}" as="newsMetaDataEntry"> <f:for each="{dataByCategory.newsMetaData}" as="newsMetaDataEntry">
<li class="col-md-4 col-sm-6 col-xs-12"> <li class="col-md-4 col-sm-6 col-xs-12">
<f:render partial="Teaser" arguments="{ <f:render partial="Teaser" arguments="{
...@@ -45,5 +45,7 @@ ...@@ -45,5 +45,7 @@
</f:for> </f:for>
</div> </div>
</div> </div>
<sg:pageBrowser numberOfPages="{numberOfPages}" />
</f:if> </f:if>
</f:section> </f:section>
...@@ -24,8 +24,8 @@ ...@@ -24,8 +24,8 @@
var SG = SG || {}; var SG = SG || {};
SG.ElementScrollBrowser = function(resultList) { SG.ElementScrollBrowser = function() {
this.initialize(resultList); this.initialize();
}; };
SG.ElementScrollBrowser.prototype = { SG.ElementScrollBrowser.prototype = {
...@@ -39,11 +39,6 @@ SG.ElementScrollBrowser.prototype = { ...@@ -39,11 +39,6 @@ SG.ElementScrollBrowser.prototype = {
*/ */
lock: false, lock: false,
/**
* @var object
*/
resultList: null,
/** /**
* @var string|null * @var string|null
*/ */
...@@ -64,10 +59,9 @@ SG.ElementScrollBrowser.prototype = { ...@@ -64,10 +59,9 @@ SG.ElementScrollBrowser.prototype = {
* *
* @return {void} * @return {void}
*/ */
initialize: function(resultList) { initialize: function() {
$('.tx-sgnews-pagebrowser').css('display', 'none'); $('.tx-sgnews-pagebrowser').css('display', 'none');
this.resultList = resultList; this.loadIndicator = $('.tx-sgnews-list').children(':last');
this.loadIndicator = this.resultList.children(':last');
if (!this.loadIndicator.length) { if (!this.loadIndicator.length) {
return; return;
} }
...@@ -86,22 +80,27 @@ SG.ElementScrollBrowser.prototype = { ...@@ -86,22 +80,27 @@ SG.ElementScrollBrowser.prototype = {
{ {
url: this.url, url: this.url,
beforeSend: function() {
//var loader = '<li class="tx-sgnews-load-indicator"></li>';
//resultList.append(loader);
//resultList.find('.tx-sgnews-indicator').show();
},
success: function(response) { success: function(response) {
var results = $(response).find('.tx-sgnews-list').children(); var results = $(response).find('.tx-sgnews-list');
if (results.length) { results.each(function(index, result) {
this.lastUrl = this.url; var $result = $(result);
this.url = $(response).find('.tx-pagebrowse-next a').attr('href'); var children = $result.children();
//resultList.find('.tx-sgnews-load-indicator').remove(); if (!children.length) {
resultList.append(results); return;
this.loadIndicator = resultList.children(':last'); }
this.lock = false;
} var $resultList = $('.tx-sgnews-list-' + $result.data('category'));
if (!$resultList.length) {
$resultList = $('.tx-sgnews-list');
}
$resultList.append(children);
this.loadIndicator = $resultList.children(':last');
});
this.lastUrl = this.url;
this.url = $(response).find('.tx-pagebrowse-next a').attr('href');
this.lock = false;
}.bind(this) }.bind(this)
} }
); );
...@@ -121,9 +120,6 @@ SG.ElementScrollBrowser.prototype = { ...@@ -121,9 +120,6 @@ SG.ElementScrollBrowser.prototype = {
} }
}; };
$(document).ready( $(document).ready(function() {
function() { (new SG.ElementScrollBrowser());
var resultList = $(this).find('.tx-sgnews-list'); });
(new SG.ElementScrollBrowser(resultList));
}
);
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment