From fc9fcf9bfc019a71312d1459149434e6e03598c0 Mon Sep 17 00:00:00 2001
From: Stefan Galinski <stefan@sgalinski.de>
Date: Tue, 19 Jul 2016 17:21:13 +0200
Subject: [PATCH] [FEATURE] Add all tab to the overview category list

---
 Classes/Controller/AbstractController.php     | 16 +++-
 Classes/Controller/OverviewController.php     | 34 ++++++--
 Resources/Private/Language/de.locallang.xlf   | 78 ++++++++++---------
 Resources/Private/Language/locallang.xlf      | 59 +++++++-------
 .../Private/Templates/Overview/Overview.html  | 20 +++++
 5 files changed, 133 insertions(+), 74 deletions(-)

diff --git a/Classes/Controller/AbstractController.php b/Classes/Controller/AbstractController.php
index 088b1a8..2e5efc7 100644
--- a/Classes/Controller/AbstractController.php
+++ b/Classes/Controller/AbstractController.php
@@ -47,6 +47,11 @@ abstract class AbstractController extends ActionController {
 	 */
 	protected $extensionConfiguration = [];
 
+	/**
+	 * @var array
+	 */
+	protected $cachedSingleNews = [];
+
 	/**
 	 * Initializes any action
 	 *
@@ -78,6 +83,11 @@ abstract class AbstractController extends ActionController {
 	 * @return array
 	 */
 	protected function getMetaDataForNews(News $news, Category $category) {
+		$newsId = $news->getUid();
+		if (isset($this->cachedSingleNews[$newsId])) {
+			return $this->cachedSingleNews[$newsId];
+		}
+
 		$singleNewsImageData = $this->getDataForSingleViewImage($news, $category);
 		$teaserImageData = $this->getDataForTeaserImage($news, $category);
 
@@ -91,7 +101,7 @@ abstract class AbstractController extends ActionController {
 			];
 		}
 
-		return array_merge(
+		$newsRecord = array_merge(
 			[
 				'category' => $category,
 				'news' => $news,
@@ -99,6 +109,10 @@ abstract class AbstractController extends ActionController {
 			$singleNewsImageData,
 			$teaserImageData
 		);
+
+		$this->cachedSingleNews[$newsId] = $newsRecord;
+
+		return $newsRecord;
 	}
 
 	/**
diff --git a/Classes/Controller/OverviewController.php b/Classes/Controller/OverviewController.php
index b2ca37f..7e65dc4 100644
--- a/Classes/Controller/OverviewController.php
+++ b/Classes/Controller/OverviewController.php
@@ -90,7 +90,6 @@ class OverviewController extends AbstractController {
 	 * @return void
 	 */
 	protected function overviewWithCategories() {
-		$newsByCategory = [];
 		$newsLimitPerCategory = (int) $this->settings['newsLimit'];
 		$this->categoryRepository->setDefaultOrderings(['sorting' => Query::ORDER_ASCENDING]);
 
@@ -108,34 +107,53 @@ class OverviewController extends AbstractController {
 		}
 
 		$categoryIds = [];
+		$categoriesById = [];
+		$newsMetaData = [];
 		foreach ($categories as $category) {
-			/** @var Category $category */
+			/** @var $category Category */
 			$categoryId = $category->getUid();
-			$categoryIds[] = $categoryId;
+			$categoryIds[] = $category->getUid();
+			$categoriesById[$categoryId] = $category;
 
-			$newsMetaData = [];
 			$news = $this->newsRepository->findAllSortedNewsByCategories([$categoryId], $newsLimitPerCategory, $offset);
 			foreach ($news as $newsEntry) {
 				/** @var News $newsEntry */
+				$categoryId = $newsEntry->getPid();
+				$category = $categoriesById[$categoryId];
+
 				$data = $this->getMetaDataForNews($newsEntry, $category);
-				$newsMetaData[] = $data;
+				$newsMetaData[$categoryId][] = $data;
 			}
+		}
 
-			/** @noinspection PhpUndefinedMethodInspection */
+		$newsByCategory = [];
+		foreach ($categoriesById as $categoryId => $category) {
+			/** @var $category Category */
 			$newsByCategory[$categoryId] = [
 				'category' => $category,
 				'categoryId' => $categoryId,
-				'newsCount' => $this->newsRepository->countByPid($categoryId),
-				'newsMetaData' => $newsMetaData
+				'newsMetaData' => $newsMetaData[$categoryId]
 			];
 		}
 
+		$allNews = [];
+		$news = $this->newsRepository->findAllSortedNewsByCategories($categoryIds, $newsLimitPerCategory, $offset);
+		foreach ($news as $newsEntry) {
+			/** @var News $newsEntry */
+			$categoryId = $newsEntry->getPid();
+			$category = $categoriesById[$categoryId];
+
+			$data = $this->getMetaDataForNews($newsEntry, $category);
+			$allNews[] = $data;
+		}
+
 		$this->highlightBestFitNews($categoryIds);
 
 		$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('allNews', $allNews);
 	}
 
 	/**
diff --git a/Resources/Private/Language/de.locallang.xlf b/Resources/Private/Language/de.locallang.xlf
index f050af6..b3e7a64 100644
--- a/Resources/Private/Language/de.locallang.xlf
+++ b/Resources/Private/Language/de.locallang.xlf
@@ -9,42 +9,46 @@
 			<authorEmail>stefan@sgalinski.de</authorEmail>
 		</header>
 		<body>
-			<trans-unit id="frontend.overview.category.allArticles" approved="yes">
-				<source>All Articles</source>
-				<target>Alle Artikel</target>
-			</trans-unit>
-			<trans-unit id="frontend.overview.showAllEntries" approved="yes">
-				<source>All News</source>
-				<target>Alle Beiträge</target>
-			</trans-unit>
-			<trans-unit id="frontend.singleview.author" approved="yes">
-				<source>The author:</source>
-				<target>Der Autor:</target>
-			</trans-unit>
-			<trans-unit id="frontend.singleview.nextArticle" approved="yes">
-				<source>Next Article</source>
-				<target>Nächster Artikel</target>
-			</trans-unit>
-			<trans-unit id="frontend.singleview.previousArticle" approved="yes">
-				<source>Previous Article</source>
-				<target>Vorheriger Artikel</target>
-			</trans-unit>
-			<trans-unit id="frontend.singleview.readingTime" approved="yes">
-				<source>Reading Time:</source>
-				<target>Lesezeit:</target>
-			</trans-unit>
-			<trans-unit id="frontend.singleview.relatedArticles" approved="yes">
-				<source>Related Articles</source>
-				<target>Verwandte Artikel</target>
-			</trans-unit>
-			<trans-unit id="frontend.singleview.similarArticle" approved="yes">
-				<source>These articles could interest you too:</source>
-				<target>Diese Artikel könnten Dich auch interessieren:</target>
-			</trans-unit>
-			<trans-unit id="frontend.teaser.readMore" approved="yes">
-				<source>read more</source>
-				<target>weiterlesen</target>
-			</trans-unit>
+		<trans-unit id="frontend.overview.allTabLabel" approved="yes">
+			<source>All</source>
+			<target>Alle</target>
+		</trans-unit>
+		<trans-unit id="frontend.overview.category.allArticles" approved="yes">
+			<source>All Articles</source>
+			<target>Alle Artikel</target>
+		</trans-unit>
+		<trans-unit id="frontend.overview.showAllEntries" approved="yes">
+			<source>All News</source>
+			<target>Alle Beiträge</target>
+		</trans-unit>
+		<trans-unit id="frontend.singleview.author" approved="yes">
+			<source>The author:</source>
+			<target>Der Autor:</target>
+		</trans-unit>
+		<trans-unit id="frontend.singleview.nextArticle" approved="yes">
+			<source>Next Article</source>
+			<target>Nächster Artikel</target>
+		</trans-unit>
+		<trans-unit id="frontend.singleview.previousArticle" approved="yes">
+			<source>Previous Article</source>
+			<target>Vorheriger Artikel</target>
+		</trans-unit>
+		<trans-unit id="frontend.singleview.readingTime" approved="yes">
+			<source>Reading Time:</source>
+			<target>Lesezeit:</target>
+		</trans-unit>
+		<trans-unit id="frontend.singleview.relatedArticles" approved="yes">
+			<source>Related Articles</source>
+			<target>Verwandte Artikel</target>
+		</trans-unit>
+		<trans-unit id="frontend.singleview.similarArticle" approved="yes">
+			<source>These articles could interest you too:</source>
+			<target>Diese Artikel könnten Dich auch interessieren:</target>
+		</trans-unit>
+		<trans-unit id="frontend.teaser.readMore" approved="yes">
+			<source>read more</source>
+			<target>weiterlesen</target>
+		</trans-unit>
 		</body>
 	</file>
-</xliff>
+</xliff>
\ No newline at end of file
diff --git a/Resources/Private/Language/locallang.xlf b/Resources/Private/Language/locallang.xlf
index db868b7..9f88d23 100644
--- a/Resources/Private/Language/locallang.xlf
+++ b/Resources/Private/Language/locallang.xlf
@@ -9,33 +9,36 @@
 			<authorEmail>stefan@sgalinski.de</authorEmail>
 		</header>
 		<body>
-			<trans-unit id="frontend.overview.category.allArticles">
-				<source>All Articles</source>
-			</trans-unit>
-			<trans-unit id="frontend.overview.showAllEntries">
-				<source>All News</source>
-			</trans-unit>
-			<trans-unit id="frontend.singleview.author">
-				<source>The author:</source>
-			</trans-unit>
-			<trans-unit id="frontend.singleview.nextArticle">
-				<source>Next Article</source>
-			</trans-unit>
-			<trans-unit id="frontend.singleview.previousArticle">
-				<source>Previous Article</source>
-			</trans-unit>
-			<trans-unit id="frontend.singleview.readingTime">
-				<source>Reading Time:</source>
-			</trans-unit>
-			<trans-unit id="frontend.singleview.relatedArticles">
-				<source>Related Articles</source>
-			</trans-unit>
-			<trans-unit id="frontend.singleview.similarArticle">
-				<source>These articles could interest you too:</source>
-			</trans-unit>
-			<trans-unit id="frontend.teaser.readMore">
-				<source>read more</source>
-			</trans-unit>
+		<trans-unit id="frontend.overview.allTabLabel">
+			<source>All</source>
+		</trans-unit>
+		<trans-unit id="frontend.overview.category.allArticles">
+			<source>All Articles</source>
+		</trans-unit>
+		<trans-unit id="frontend.overview.showAllEntries">
+			<source>All News</source>
+		</trans-unit>
+		<trans-unit id="frontend.singleview.author">
+			<source>The author:</source>
+		</trans-unit>
+		<trans-unit id="frontend.singleview.nextArticle">
+			<source>Next Article</source>
+		</trans-unit>
+		<trans-unit id="frontend.singleview.previousArticle">
+			<source>Previous Article</source>
+		</trans-unit>
+		<trans-unit id="frontend.singleview.readingTime">
+			<source>Reading Time:</source>
+		</trans-unit>
+		<trans-unit id="frontend.singleview.relatedArticles">
+			<source>Related Articles</source>
+		</trans-unit>
+		<trans-unit id="frontend.singleview.similarArticle">
+			<source>These articles could interest you too:</source>
+		</trans-unit>
+		<trans-unit id="frontend.teaser.readMore">
+			<source>read more</source>
+		</trans-unit>
 		</body>
 	</file>
-</xliff>
+</xliff>
\ No newline at end of file
diff --git a/Resources/Private/Templates/Overview/Overview.html b/Resources/Private/Templates/Overview/Overview.html
index 5f59968..96e50c1 100644
--- a/Resources/Private/Templates/Overview/Overview.html
+++ b/Resources/Private/Templates/Overview/Overview.html
@@ -9,6 +9,11 @@
 				<a class="tabs-menu-button" href="#">Kategorie <span></span></a>
 
 				<ul class="tx-sgnews-categories-tabmenu tabs-menu-list nav nav-tabs">
+					<li class="tx-sgnews-category">
+						<a class="category-0" data-tab="tx-sgnews-categories-tabcontent0" href="#tx-sgnews-categories-tabcontent0">
+							<f:translate key="frontend.overview.allTabLabel" />
+						</a>
+					</li>
 					<f:for each="{newsByCategory}" as="dataByCategory">
 						<li class="tx-sgnews-category">
 							<a class="category-{dataByCategory.category.uid}" data-tab="tx-sgnews-categories-tabcontent{dataByCategory.category.uid}" href="#tx-sgnews-categories-tabcontent{dataByCategory.category.uid}">
@@ -20,6 +25,21 @@
 			</div>
 
 			<div class="tx-sgnews-categories-tabcontents tabs-contents">
+				<div class="tx-sgnews-categories-tabcontent" id="tx-sgnews-categories-tabcontent0">
+					<h4 class="tx-sgnews-tab-title">{dataByCategory.category.title}</h4>
+					<ul class="tx-sgnews-list tx-sgnews-list-0 row" data-category="0">
+						<f:for each="{allNews}" as="newsMetaDataEntry">
+							<li class="col-md-4 col-sm-6 col-xs-12">
+								<f:render partial="Teaser" arguments="{
+									newsMetaData: newsMetaDataEntry,
+									headerTag: '<h2>',
+									closingHeaderTag: '</h2>',
+									showCategory: 0
+								}" />
+							</li>
+						</f:for>
+					</ul>
+				</div>
 				<f:for each="{newsByCategory}" as="dataByCategory">
 					<div class="tx-sgnews-categories-tabcontent" id="tx-sgnews-categories-tabcontent{dataByCategory.category.uid}">
 						<h4 class="tx-sgnews-tab-title">{dataByCategory.category.title}</h4>
-- 
GitLab