src/Controller/Frontend/HomeController.php line 21

Open in your IDE?
  1. <?php
  2. namespace App\Controller\Frontend;
  3. use App\Application\Artikel\ArtikelFrontendData;
  4. use App\Application\Artikel\ArtikelService;
  5. use App\Application\Artikel\ArtikelServiceQuery;
  6. use App\Application\Content\ContentFrontendData;
  7. use App\Application\Content\ContentService;
  8. use App\Application\Epaper\EpaperService;
  9. use App\Entity\Artikel\ArtikelTyp;
  10. use Sensio\Bundle\FrameworkExtraBundle\Configuration\Cache;
  11. use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
  12. use Symfony\Component\HttpFoundation\Response;
  13. use Symfony\Component\Routing\Annotation\Route;
  14. #[Cache(expires: '+10 minutes')]
  15. class HomeController extends AbstractController
  16. {
  17. #[Route(path: '/', name: 'fe.home')]
  18. public function home(ArtikelService $artikelService, ContentService $contentService, EpaperService $epaperService): Response
  19. {
  20. $artikelStream = [];
  21. $artikelGalleryStream = [];
  22. // --- Artikel Stream ---
  23. $totArtikelInStream = 6;
  24. // Top Lead Artikel finden
  25. // Ist glaube ich obsolet da gar nirgends das Attribut isLeadArtikel gesetzt ist
  26. $leadArtikel = [];
  27. // $query = new ArtikelServiceQuery();
  28. // $query->addFilterOneOfLeadTypeOnly(['leadartikel']);
  29. // $query->addFilterOneOfStatusOnly(['publiziert']);
  30. // $res = $artikelService->findArtikels(new ArtikelFrontendData(), $query);
  31. //
  32. // if ($res) {
  33. // $leadArtikel = reset($res); // 1 Record im Array verwenden (nur ein Lead Artikel)
  34. // $artikelStream[] = $leadArtikel;
  35. // }
  36. // end
  37. // Zu pinnende Publireportagen Artikel finden
  38. $pinnedPRArtikels = [];
  39. $query = new ArtikelServiceQuery();
  40. $query->addFilterOneOfStatusOnly(['publiziert']);
  41. $query->addFilterNotInArtikelstreamStartseite();
  42. $query->addFilterOneOfTypOnly([ArtikelTyp::ID_AT_4]);
  43. $query->addFilterPrArtikelPinnedToday();
  44. // Ist glaube ich obsolet da gar nirgends das Attribut isLeadArtikel gesetzt ist
  45. // if ($leadArtikel) {
  46. // //Lead Artikel entfernen, falls dies zugleich auch ein pinned Publireportage Artikel ist (theoretisch nicht nötig, da im Backend abgefangen)
  47. // $query->addFilterExcludeArtikel([$leadArtikel['id']]);
  48. // }
  49. $res = $artikelService->findArtikels(new ArtikelFrontendData(), $query);
  50. $pinnedPRArtikels = $res;
  51. // Weitere Artikel holen und mit zu pinnenden Publireportagen mischen
  52. $query = new ArtikelServiceQuery($totArtikelInStream);
  53. $query->addFilterOneOfTypOnly([ArtikelTyp::ID_AT_1, ArtikelTyp::ID_AT_3]);
  54. $query->addFilterOneOfStatusOnly(['publiziert']);
  55. $query->addFilterNotInArtikelstreamStartseite();
  56. if ($leadArtikel || $pinnedPRArtikels) {
  57. // Lead Artikel entfernen
  58. $excludeArtikelIds = $leadArtikel !== [] ? [$leadArtikel['id']] : [];
  59. // Pinned Publireportagen entfernen
  60. foreach ($pinnedPRArtikels as $prArtikel) {
  61. $excludeArtikelIds[] = $prArtikel['id'];
  62. }
  63. $query->addFilterExcludeArtikel($excludeArtikelIds);
  64. }
  65. $query->addSort('publish_at', 'desc');
  66. $res = $artikelService->findArtikels(new ArtikelFrontendData(), $query);
  67. $artikelStream = $res;
  68. // end
  69. // Schiebe nun die vorhin gefundenen pinned Publireportagen dazwischen
  70. if ($pinnedPRArtikels) {
  71. if (count($artikelStream) > 3) {
  72. // an Position 3 dazwischen schieben
  73. array_splice($artikelStream, 2, 0, $pinnedPRArtikels); // splice in at position 3
  74. } else {
  75. // am Ende anhängen
  76. $artikelStream = array_merge($artikelStream, $pinnedPRArtikels);
  77. }
  78. }
  79. // Stream aufquellen mit [], wenn zuwenig Artikel, damit in View Layer mittels Index darauf zugriffen werden kann
  80. while (count($artikelStream) < $totArtikelInStream) {
  81. $artikelStream[] = [];
  82. }
  83. // Ende
  84. // --- End Artikel Stream---
  85. // --- Gallery Artikel Stream---
  86. $totGalleryArtikel = 3;
  87. // Top Galerie Artikel holen
  88. $query = new ArtikelServiceQuery($totGalleryArtikel);
  89. $query->addFilterOneOfLeadTypeOnly(['leadgalleryartikel']);
  90. $query->addFilterOneOfStatusOnly(['publiziert']);
  91. $query->addSort('publish_at', 'desc');
  92. $topGalleryArtikel = $artikelService->findArtikels(new ArtikelFrontendData(), $query);
  93. foreach ($topGalleryArtikel as $item) {
  94. $artikelGalleryStream[] = $item;
  95. }
  96. // Ende
  97. // Weitere Galerie Artikel hinzufügen
  98. if (count($artikelGalleryStream) < $totGalleryArtikel) {
  99. $query = new ArtikelServiceQuery($totGalleryArtikel);
  100. $query->addFilterVideoOrImagegalleryOnly();
  101. $query->addFilterOneOfStatusOnly(['publiziert']);
  102. if ($topGalleryArtikel) {
  103. $artikelIds = array_map(fn ($artikel) => $artikel['id'], $topGalleryArtikel);
  104. $query->addFilterExcludeArtikel($artikelIds);
  105. }
  106. $query->addSort('publish_at', 'desc');
  107. $res = $artikelService->findArtikels(new ArtikelFrontendData(), $query);
  108. foreach ($res as $artikel) {
  109. // $artikelGalleryStream bis auf Max. aufquellen
  110. if (count($artikelGalleryStream) < $totGalleryArtikel) {
  111. $artikelGalleryStream[] = $artikel;
  112. }
  113. }
  114. }
  115. // Stream aufquellen mit [], wenn zuwenig Artikel, damit in View Layer mittels Index darauf zugriffen werden kann
  116. while (count($artikelGalleryStream) < $totGalleryArtikel) {
  117. $artikelGalleryStream[] = [];
  118. }
  119. // Ende
  120. // --- Ende Gallery Artikel Stream ---
  121. // Service
  122. $services = [
  123. $contentService->getContentByCode('SERVICE_BOX_VERANSTALTUNGEN', new ContentFrontendData(), true),
  124. $contentService->getContentByCode('SERVICE_BOX_ABOSERVICE', new ContentFrontendData(), true),
  125. $contentService->getContentByCode('SERVICE_BOX_EINSENDUNGEN', new ContentFrontendData(), true),
  126. $contentService->getContentByCode('SERVICE_BOX_TODESANZEIGEN', new ContentFrontendData(), true),
  127. $contentService->getContentByCode('SERVICE_BOX_IMMOBILIEN', new ContentFrontendData(), true),
  128. $contentService->getContentByCode('SERVICE_BOX_STELLEN', new ContentFrontendData(), true),
  129. ];
  130. // Ende
  131. return $this->render('frontend/home/home.html.twig', [
  132. 'artStream' => $artikelStream,
  133. 'galStream' => $artikelGalleryStream,
  134. 'services' => $services,
  135. 'lastIssue' => $epaperService->getLastIssueValues(),
  136. ]);
  137. }
  138. }