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

namespace SGalinski\SgNews\Domain\Repository;

/***************************************************************
 *  Copyright notice
 *
 *  (c) sgalinski Internet Services (https://www.sgalinski.de)
Stefan Galinski's avatar
Stefan Galinski committed
 *
 *  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\SgNews\Domain\Model\News;
use TYPO3\CMS\Extbase\Persistence\Generic\QueryResult;
use TYPO3\CMS\Extbase\Persistence\QueryInterface;

/**
 * News Repository
 */
class NewsRepository extends AbstractRepository {
	/**
	 * Method returns all news by category id sorted by the field lastUpdated.
	 *
	 * @param array $categoryIds NULL, if the category filter isn't applied, otherwise an array with the categories uid.
Stefan Galinski's avatar
Stefan Galinski committed
	 * @param int $limit
	 * @param int $offset
	 * @return QueryResult
	 */
	public function findAllSortedNewsByCategories($categoryIds = NULL, $limit = 0, $offset = 0) {
Stefan Galinski's avatar
Stefan Galinski committed
		$query = $this->createQuery();

		$categoryConstraint = [];
		if ($categoryIds !== NULL && is_array($categoryIds)) {
			$categoryConstraint[] = $query->in('pid', $categoryIds);
Stefan Galinski's avatar
Stefan Galinski committed
		}

		if ($limit > 0) {
			$query->setLimit($limit);
		}

		if ($offset > 0) {
			$query->setOffset($offset);
		}

		$query->setOrderings(
			[
				'lastUpdated' => QueryInterface::ORDER_DESCENDING,
				'crdate' => QueryInterface::ORDER_DESCENDING,
			]
		);
		return $query->matching($query->logicalAnd($categoryConstraint))->execute();
	}

	/**
	 * Returns the count of all news within the given category ids.
	 *
	 * @param array $categoryIds NULL, if the category filter isn't applied, otherwise an array with the categories uid.
	 * @return int
	 */
	public function newsCountByCategories($categoryIds = NULL) {
		$query = $this->createQuery();

		$categoryConstraint = [];
		if ($categoryIds !== NULL && is_array($categoryIds)) {
			$categoryConstraint[] = $query->in('pid', $categoryIds);
		}

		return $query->matching($query->logicalAnd($categoryConstraint))->count();
Stefan Galinski's avatar
Stefan Galinski committed
	}

	/**
	 * Method returns the last updated news by category id which is highlighted.
	 *
	 * @param int $limit
	 * @param bool $onlyHighlighted
	 * @param array $categoryIds NULL, if the category filter isn't applied, otherwise an array with the categories uid.
Stefan Galinski's avatar
Stefan Galinski committed
	 * @return QueryResult
	 */
	public function findLastUpdatedOrHighlightedNewsByCategories(
		$limit = 1, $onlyHighlighted = FALSE, $categoryIds = NULL, $offset = 0, $hideNeverHighlightedNews = FALSE
Stefan Galinski's avatar
Stefan Galinski committed
		$query = $this->createQuery();
		$constraints = NULL;
		if ($categoryIds !== NULL && count($categoryIds)) {
			$constraints[] = $query->in('pid', $categoryIds);
Stefan Galinski's avatar
Stefan Galinski committed
		}

		if ($onlyHighlighted) {
			$constraints[] = $query->equals('tx_sgnews_highlighted', 1);
		}

		if ($hideNeverHighlightedNews) {
			$constraints[] = $query->equals('tx_sgnews_never_highlighted', 0);
		}

Stefan Galinski's avatar
Stefan Galinski committed
		$query->setOrderings(
			[
				'tx_sgnews_highlighted' => QueryInterface::ORDER_DESCENDING,
				'lastUpdated' => QueryInterface::ORDER_DESCENDING,
				'crdate' => QueryInterface::ORDER_DESCENDING,
			]
		);

		if ($constraints !== NULL) {
			$constraints = $query->logicalAnd($constraints);
		}

		if ($limit > 0) {
			$query->setLimit($limit);
		}

		if ($offset > 0) {
			$query->setOffset($offset);
		}

		return $query->matching($constraints)->execute();
Stefan Galinski's avatar
Stefan Galinski committed
	}

	/**
	 * Method returns the random News of the given amount.
	 *
	 * @param int $limit
	 * @param News $excludeNews
	 * @return QueryResult
	 */
	public function findRandomNews($limit = 0, News $excludeNews = NULL) {
		$query = $this->createQuery();
		$excludeClause = ($excludeNews ? 'AND uid != ' . $excludeNews->getUid() : '');
		$statement = 'SELECT * FROM pages WHERE doktype = 116 ' . $excludeClause .
			$this->getEnableFieldsStatement('pages') . ' ORDER BY RAND()';

		if ($limit > 0) {
			$statement .= ' LIMIT ' . $limit;
		}

		/** @noinspection PhpUndefinedMethodInspection */
		return $query->statement($statement)->execute();
	}

	/**
	 * Method returns the next News of the given news.
	 *
	 * @param News $news
	 * @return QueryResult
	 */
	public function findNextNewsEntryFromCurrentNews(News $news) {
		$query = $this->createQuery();

		$statement = 'SELECT * FROM pages WHERE uid =
			(SELECT MIN(uid) FROM pages WHERE pid = ' . $news->getPid() . ' AND uid > ' . $news->getUid() .
			$this->getEnableFieldsStatement('pages') . ' ORDER BY lastUpdated DESC, crdate DESC)' .
			$this->getEnableFieldsStatement('pages');

		/** @noinspection PhpUndefinedMethodInspection */
		return $query->statement($statement)->execute();
	}

	/**
	 * Method returns the previous News of the given news.
	 *
	 * @param News $news
	 * @return QueryResult
	 */
	public function findPreviousNewsEntryFromCurrentNews(News $news) {
		$query = $this->createQuery();

		$statement = 'SELECT * FROM pages WHERE uid =
			(SELECT MAX(uid) FROM pages WHERE pid = ' . $news->getPid() . ' AND uid < ' . $news->getUid() .
			$this->getEnableFieldsStatement('pages') . ' ORDER BY lastUpdated DESC, crdate DESC)' .
			$this->getEnableFieldsStatement('pages');

		/** @noinspection PhpUndefinedMethodInspection */
		return $query->statement($statement)->execute();
	}
}