Skip to content
Snippets Groups Projects
OverviewController.php 3.27 KiB
Newer Older
Stefan Galinski's avatar
Stefan Galinski committed
<?php

namespace SGalinski\SgNews\Controller;

/***************************************************************
 *  Copyright notice
 *
 *  (c) sgalinski Internet Services (http://www.sgalinski.de)
 *
 *  All rights reserved
 *
 *  This script is part of the TYPO3 project. The TYPO3 project is
 *  free software; you can redistribute it and/or modify
 *  it under the terms of the GNU General Public License as published by
 *  the Free Software Foundation; either version 3 of the License, or
 *  (at your option) any later version.
 *
 *  The GNU General Public License can be found at
 *  http://www.gnu.org/copyleft/gpl.html.
 *
 *  This script is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 *  GNU General Public License for more details.
 *
 *  This copyright notice MUST APPEAR in all copies of the script!
 ***************************************************************/

use SGalinski\ProjectBase\Service\HeaderMetaDataService;
Stefan Galinski's avatar
Stefan Galinski committed
use SGalinski\SgNews\Domain\Model\Category;
use SGalinski\SgNews\Domain\Model\News;
use TYPO3\CMS\Extbase\Persistence\Generic\Query;

/**
 * Controller that handles the overview page of categories and their news
 */
class OverviewController extends AbstractController {
	/**
	 * @inject
	 * @var \SGalinski\SgNews\Domain\Repository\CategoryRepository
	 */
	protected $categoryRepository;

	/**
	 * @inject
	 * @var \SGalinski\SgNews\Domain\Repository\NewsRepository
	 */
	protected $newsRepository;

	/**
	 * Renders the news overview
	 *
	 * @return void
	 */
	public function overviewAction() {
		$newsByCategory = [];
		$newsLimitPerCategory = (int) $this->settings['newsLimitPerCategory'];
		$this->categoryRepository->setDefaultOrderings(['sorting' => Query::ORDER_ASCENDING]);
		$categories = $this->categoryRepository->findAll();
		foreach ($categories as $category) {
			/** @var Category $category */
			$categoryId = $category->getUid();

			$newsMetaData = [];
			$news = $this->newsRepository->findAllSortedNewsByCategory($categoryId, $newsLimitPerCategory);
			foreach ($news as $newsEntry) {
				/** @var News $newsEntry */
				$data = $this->getMetaDataForNews($newsEntry, $category);
				$newsMetaData[] = $data;
			}

			/** @noinspection PhpUndefinedMethodInspection */
			$newsByCategory[$categoryId] = [
				'category' => $category,
				'categoryId' => $categoryId,
				'newsCount' => $this->newsRepository->countByPid($categoryId),
				'newsMetaData' => $newsMetaData
			];
		}

		/** @var News $highlightedNews */
		$highlightedNews = $this->newsRepository->findLastUpdatedOrHighlightedNewsByCategory(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']);
		}

Stefan Galinski's avatar
Stefan Galinski committed
		$this->view->assign('newsByCategory', $newsByCategory);
		$this->view->assign('highlightedNewsMetaData', $highlightedNewsMetaData);
	}
}