*/ class PostRepository extends Repository { protected array $defaultConstraints = []; public function initializeObject(): void { $query = $this->createQuery(); $this->defaultConstraints[] = $query->equals('doktype', Constants::DOKTYPE_BLOG_POST); if ($this->getRequest()->getAttribute('language')?->getLanguageId() === 0) { $this->defaultConstraints[] = $query->logicalOr( $query->equals('l18n_cfg', 0), $query->equals('l18n_cfg', 2) ); } else { try { $this->defaultConstraints[] = $query->lessThan('l18n_cfg', 2); } catch (InvalidQueryException) { } } $this->defaultOrderings = [ 'publish_date' => QueryInterface::ORDER_DESCENDING, ]; } /** * @return QueryResultInterface */ public function findAll(): QueryResultInterface { return $this->getFindAllQuery()->execute(); } /** * @return QueryResultInterface */ public function findAllWithLimit(int $limit): QueryResultInterface { $query = $this->getFindAllQuery(); $query->setLimit($limit); return $query->execute(); } public function findMonthsAndYearsWithPosts(): array { $query = $this->createQuery(); $constraints = $this->defaultConstraints; try { $constraints[] = $query->greaterThan('crdateMonth', 0); $constraints[] = $query->greaterThan('crdateYear', 0); } catch (InvalidQueryException) { } $query->matching($query->logicalAnd(...$constraints)); $posts = $query->execute(true); $result = []; $currentIndex = -1; $currentYear = null; $currentMonth = null; foreach ($posts as $post) { $year = $post['crdate_year']; $month = $post['crdate_month']; if ($currentYear !== $year || $currentMonth !== $month) { $currentIndex++; $currentYear = $year; $currentMonth = $month; $result[$currentIndex] = [ 'year' => $currentYear, 'month' => $currentMonth, 'count' => 1 ]; } else { $result[$currentIndex]['count']++; } } return $result; } /** * @return QueryResultInterface */ public function findByMonthAndYear(int $year, ?int $month = null): QueryResultInterface { $query = $this->createQuery(); $constraints = $this->defaultConstraints; try { if ($month !== null) { $startDate = new DateTimeImmutable(sprintf('%d-%d-1 00:00:00', $year, $month)); $endDate = new DateTimeImmutable( sprintf('%d-%d-%d 23:59:59', $year, $month, (int)$startDate->format('t')) ); } else { $startDate = new DateTimeImmutable(sprintf('%d-1-1 00:00:00', $year)); $endDate = new DateTimeImmutable(sprintf('%d-12-31 23:59:59', $year)); } $constraints[] = $query->greaterThanOrEqual('publish_date', $startDate->getTimestamp()); $constraints[] = $query->lessThanOrEqual('publish_date', $endDate->getTimestamp()); } catch (InvalidQueryException | DateMalformedStringException) { } return $query->matching($query->logicalAnd(...$constraints))->execute(); } /** * @return QueryInterface */ protected function getFindAllQuery(): QueryInterface { $query = $this->createQuery(); $constraints = $this->defaultConstraints; try { $constraints[] = $query->logicalOr( $query->equals('archiveDate', 0), $query->greaterThanOrEqual('archiveDate', time()) ); } catch (InvalidQueryException) { } $query->matching($query->logicalAnd(...$constraints)); return $query; } protected function getRequest(): ?ServerRequestInterface { return $GLOBALS['TYPO3_REQUEST']; } }