From 222e6f28dbf747bc9876101f19b678e765e6438f Mon Sep 17 00:00:00 2001
From: Kevin Ditscheid <kevin.ditscheid@sgalinski.de>
Date: Wed, 27 Apr 2022 13:05:42 +0200
Subject: [PATCH] [TASK] Add the possibility to reuse the Teaser partial

---
 Classes/Domain/Model/News.php                 | 73 +++++++++++++++++++
 .../Templates/SingleView/SingleView.html      | 14 +++-
 2 files changed, 84 insertions(+), 3 deletions(-)

diff --git a/Classes/Domain/Model/News.php b/Classes/Domain/Model/News.php
index d042f4b..607c4a7 100644
--- a/Classes/Domain/Model/News.php
+++ b/Classes/Domain/Model/News.php
@@ -26,6 +26,9 @@ namespace SGalinski\SgNews\Domain\Model;
  *  This copyright notice MUST APPEAR in all copies of the script!
  ***************************************************************/
 
+use SGalinski\SgNews\Domain\Repository\CategoryRepository;
+use TYPO3\CMS\Core\Utility\GeneralUtility;
+use TYPO3\CMS\Extbase\Domain\Model\FileReference;
 use TYPO3\CMS\Extbase\Persistence\Generic\LazyLoadingProxy;
 use TYPO3\CMS\Extbase\Persistence\ObjectStorage;
 
@@ -102,6 +105,16 @@ class News extends CategoryAndNews {
 	 */
 	protected $enableComments = TRUE;
 
+	/**
+	 * @var Category
+	 */
+	protected $categoryCache = NULL;
+
+	/**
+	 * @var FileReference
+	 */
+	protected $teaserImageCache = NULL;
+
 	/**
 	 * Constructor
 	 */
@@ -402,4 +415,64 @@ class News extends CategoryAndNews {
 	public function setEnableComments(bool $enableComments): void {
 		$this->enableComments = $enableComments;
 	}
+
+	/**
+	 * Get the assigned category
+	 *
+	 * @return Category
+	 */
+	public function getCategory(): Category {
+		if ($this->categoryCache instanceof Category) {
+			return $this->categoryCache;
+		}
+
+		return $this->categoryCache = GeneralUtility::makeInstance(CategoryRepository::class)
+			->findByUid($this->pid);
+	}
+
+	/**
+	 * Get the teaser image object
+	 *
+	 * @return FileReference|null
+	 */
+	public function getTeaserImageObject(): ?FileReference {
+		if ($this->teaserImageCache instanceof FileReference) {
+			return $this->teaserImageCache;
+		}
+		$teaserImage = $this->getTeaser1Image()->current();
+		if ($teaserImage instanceof FileReference) {
+			return $this->teaserImageCache = $teaserImage;
+		}
+
+		$teaserImage = $this->getCategory()->getTeaser1Image()->current();
+		if ($teaserImage instanceof FileReference) {
+			return $this->teaserImageCache = $teaserImage;
+		}
+
+		$teaserImage = $this->getTeaser2Image()->current();
+		if ($teaserImage instanceof FileReference) {
+			return $this->teaserImageCache = $teaserImage;
+		}
+
+		return NULL;
+	}
+
+	/**
+	 * Get the teaser image public url
+	 *
+	 * @return string
+	 */
+	public function getTeaserImage() {
+		$teaserImage = $this->getTeaserImageObject();
+		if ($teaserImage === NULL) {
+			return '';
+		}
+
+		$originalResource = $teaserImage->getOriginalResource();
+		if ($originalResource === NULL) {
+			return '';
+		}
+
+		return $originalResource->getPublicUrl();
+	}
 }
diff --git a/Resources/Private/Templates/SingleView/SingleView.html b/Resources/Private/Templates/SingleView/SingleView.html
index 485bcc8..bc803ad 100644
--- a/Resources/Private/Templates/SingleView/SingleView.html
+++ b/Resources/Private/Templates/SingleView/SingleView.html
@@ -221,6 +221,13 @@
 												iteration="iterator"
 												limit="5"
 												as="relatedNewsEntry">
+										<f:variable name="relatedNewsMetaData"
+													value="{
+														news: relatedNewsEntry,
+														teaserImage: relatedNewsEntry.teaserImage,
+														teaserImageObject: relatedNewsEntry.teaserImageObject,
+														category: relatedNewsEntry.category
+													}" />
 										<f:if condition="{iterator.isFirst}">
 											<div class="tx-sgnews-single-related">
 												<h3>
@@ -229,10 +236,11 @@
 												<ul class="tx-sgnews-list tx-sgnews-overview">
 										</f:if>
 													<li class="col-md-4 col-sm-6 col-xs-12">
-														<f:render partial="TeaserRelated" arguments="{
-															news: relatedNewsEntry,
+														<f:render partial="Teaser" arguments="{
+															newsMetaData: relatedNewsMetaData,
 															headerTag: '<h2>',
-															closingHeaderTag: '</h2>'
+															closingHeaderTag: '</h2>',
+															showCategory: '1'
 														}" />
 													</li>
 										<f:if condition="{iterator.isLast}">
-- 
GitLab