From 754aa699a131f15fe7ec1bfd49fa54907adeac9c Mon Sep 17 00:00:00 2001 From: Kevin Adametz Date: Thu, 28 May 2026 08:21:40 +0000 Subject: [PATCH] Startseiten-Prototyp unter Dev-Link Co-authored-by: Cursor --- .../components/home/dev_slider.html.twig | 95 ++++++++++++++ .../views/default/pages/dev/home.html.twig | 120 +++++++++++++++++ .../Controller/DefaultController.php | 54 ++++++++ src/AppBundle/Entity/PageRepository.php | 121 ++++++++++++++++++ 4 files changed, 390 insertions(+) create mode 100644 app/Resources/views/default/components/home/dev_slider.html.twig create mode 100644 app/Resources/views/default/pages/dev/home.html.twig diff --git a/app/Resources/views/default/components/home/dev_slider.html.twig b/app/Resources/views/default/components/home/dev_slider.html.twig new file mode 100644 index 00000000..0440e26c --- /dev/null +++ b/app/Resources/views/default/components/home/dev_slider.html.twig @@ -0,0 +1,95 @@ +{% form_theme search_form 'default/form/theme.html.twig' %} + +
+
+
+
+
+
+
+
+ Top Kundenservice +
+
    +
  • Spezialist für Kulturreisen
  • +
  • Reiseexperte seit 1998
  • +
  • Beratung für individuelle Reisen
  • +
+
+
+
+
+
+
+ +
+ +
+
+
+
+
+
+
+
+ {{ form_field_pho(search_form.b, 'Anreise am') }} +
+
+ {{ form_field_pho(search_form.e, 'Abreise am') }} +
+
+ {{ form_field_pho(search_form.c) }} +
+
+ + +
+
+ +
+
+
+
+
+
+
+
diff --git a/app/Resources/views/default/pages/dev/home.html.twig b/app/Resources/views/default/pages/dev/home.html.twig new file mode 100644 index 00000000..22d43200 --- /dev/null +++ b/app/Resources/views/default/pages/dev/home.html.twig @@ -0,0 +1,120 @@ +{% extends 'base.html.twig' %} + +{% block meta_description %} + +{% endblock %} + +{% block meta_keywords %} + +{% endblock %} + +{% block meta_robots %} + +{% endblock %} + +{% block canonical_tag %}{% endblock %} + +{% block stylesheets %} + {{ parent() }} + +{% endblock %} + +{% block header2 %} + {% include 'default/components/home/dev_slider.html.twig' %} +{% endblock %} + +{% block breadcrumb %}{% endblock %} + +{% block body %} +
+
+ Interne Abstimmungsversion: + Diese Startseite ist nur unter dem Testlink sichtbar und nicht fuer Suchmaschinen freigegeben. +
+ +

Unsere beliebtesten Kulturreisen

+ +
+ {% if homepage_offer_pages is not empty %} + {% include 'default/components/multiPageBoxCarousel.html.twig' with {pages: homepage_offer_pages} %} + {% else %} +

Aktuell konnten keine kuratierten Reiseangebote geladen werden.

+ {% endif %} +
+ +
+
+
+

Lieber näher zuhause? Ferienwohnungen auf Usedom

+

+ Neben unseren Kulturreisen bieten wir acht Ferienwohnungen in zwei Häusern auf Usedom. + Ideal für alle, die kurzfristig, individuell und nah an der Ostsee Urlaub machen möchten. +

+ + Ferienwohnungen ansehen + +
+
+

+ Der Block macht Usedom als zweites Standbein sichtbar, ohne die Kulturreisen zu verdrängen. + Bilder und Reihenfolge können nach Sichtung des vorhandenen Bildpools noch feinjustiert werden. +

+
+
+ + {% if fewo_lodgings is not empty %} +
+ {% for lodging in fewo_lodgings %} + {% include 'default/components/pageLodgingBox.html.twig' %} + {% endfor %} +
+ {% endif %} +
+ +
+
+

Alle Reisekategorien auf einen Blick

+
+ + {% include 'default/components/multiPageBoxCarousel.html.twig' with {pages: country_pages} %} +
+ +
+
+

STERN TOURS - Ihr Kulturreise-Spezialist aus Berlin

+

+ Herzlich willkommen bei STERN TOURS, Ihrem Reiseveranstalter für ausgewählte Kulturreisen. + In der aktuellen Startseitenfassung stehen besonders die Reiseziele im Vordergrund, die + derzeit gut planbar und verkaufbar sind: Ägypten, Marokko, Usbekistan und Oman. +

+

Kulturreisen mit Erfahrung und persönlicher Beratung

+

+ Seit 1998 beraten wir Reisende zu Kulturreisen in den Orient und angrenzende Regionen. + Die neue Frontseite soll Orientierung geben, buchbare Reisen sichtbar machen und zugleich + verantwortungsvoll mit Destinationen umgehen, bei denen die Lage eine vorsichtigere + Kommunikation erfordert. +

+
+
+
+{% endblock body %} diff --git a/src/AppBundle/Controller/DefaultController.php b/src/AppBundle/Controller/DefaultController.php index d5cff9f8..6567e588 100644 --- a/src/AppBundle/Controller/DefaultController.php +++ b/src/AppBundle/Controller/DefaultController.php @@ -73,6 +73,60 @@ class DefaultController extends Controller ]); } + /** + * @Route("/dev/seite/startseite") + */ + public function devHomepageAction() + { + $search_request_b = Util::getMySession('search_request_b'); + $search_request_e = Util::getMySession('search_request_e'); + $search_request_c = Util::getMySession('search_request_c'); + + if($search_request_b){ + $timestap_b = strtotime($search_request_b); + $search_request_b = new \DateTime(); + $search_request_b->setTimestamp($timestap_b); + } + if($search_request_e){ + $timestap_e = strtotime($search_request_e); + $search_request_e = new \DateTime(); + $search_request_e->setTimestamp($timestap_e); + } + + if($search_request_c){ + $repo = $this->getEntityManager()->getRepository('AppBundle:TravelCountry'); + $search_request_c = $repo->find($search_request_c); + } + + $pageRepo = $this->getEntityManager()->getRepository('AppBundle:Page'); + $fewoLodgings = []; + $lodgingGroups = $this->getEntityManager()->getRepository('AppBundle:FewoLodgingGroup')->findAll(); + foreach ($lodgingGroups as $lodgingGroup) { + foreach ($lodgingGroup->getLodgings() as $lodging) { + $fewoLodgings[] = $lodging; + if (count($fewoLodgings) >= 3) { + break 2; + } + } + } + + return $this->render('default/pages/dev/home.html.twig', [ + 'base_dir' => realpath($this->getParameter('kernel.root_dir').'/..').DIRECTORY_SEPARATOR, + 'site_loading' => 'home', + 'show_search_sidebar_widget' => false, + 'show_offers_sidebar_widget' => false, + 'search_form' => $this->createForm(SearchRequestType::class, [ + 'c' => $search_request_c ? $search_request_c : null, + 'b' => $search_request_b ? $search_request_b : null, + 'e' => $search_request_e ? $search_request_e : null, + ])->createView(), + 'tt_search_form' => $this->createForm(TtSearchRequestType::class)->createView(), + 'homepage_offer_pages' => $pageRepo->findHomepageOffers(), + 'country_pages' => $pageRepo->findHomepageCountryPages(), + 'fewo_lodgings' => $fewoLodgings, + ]); + } + /** * @Route("/suche") */ diff --git a/src/AppBundle/Entity/PageRepository.php b/src/AppBundle/Entity/PageRepository.php index 6f7dccea..a8a2cc20 100644 --- a/src/AppBundle/Entity/PageRepository.php +++ b/src/AppBundle/Entity/PageRepository.php @@ -84,6 +84,127 @@ class PageRepository extends NestedTreeRepository return $ret; } + /** + * Curated offer selection for the start page test version. + * + * The existing findOffers() intentionally shuffles results. For the crisis + * communication start page we need a stable order with currently sellable + * destinations first. + * + * @param int $limit + * @return Page[] + */ + public function findHomepageOffers($limit = 12) + { + $pages = $this->createQueryBuilder('node') + ->distinct() + ->innerJoin('node.travelProgram', 'tp') + ->addSelect('tp') + ->innerJoin('tp.countries', 'c') + ->addSelect('c') + ->where('node.status = 1') + ->andWhere('tp.status = 1') + ->orderBy('node.order') + ->addOrderBy('tp.position') + ->addOrderBy('node.title') + ->getQuery() + ->execute(); + + $pages = array_values(array_filter($pages, function (Page $page) { + return $this->getHomepagePriority($page) <= 4; + })); + + usort($pages, function (Page $a, Page $b) { + $priorityA = $this->getHomepagePriority($a); + $priorityB = $this->getHomepagePriority($b); + + if ($priorityA !== $priorityB) { + return $priorityA - $priorityB; + } + + $orderA = $a->getOrder() ?: 9999; + $orderB = $b->getOrder() ?: 9999; + if ($orderA !== $orderB) { + return $orderA - $orderB; + } + + return strcasecmp($a->getTitle(), $b->getTitle()); + }); + + return array_slice($pages, 0, $limit); + } + + /** + * @return Page[] + */ + public function findHomepageCountryPages() + { + $pages = $this->findCountryPages(); + + usort($pages, function (Page $a, Page $b) { + $priorityA = $this->getHomepagePriority($a); + $priorityB = $this->getHomepagePriority($b); + + if ($priorityA !== $priorityB) { + return $priorityA - $priorityB; + } + + return strcasecmp($a->getTitle(), $b->getTitle()); + }); + + return $pages; + } + + private function getHomepagePriority(Page $page) + { + $haystack = $this->buildHomepageSortHaystack($page); + + $priorities = [ + 0 => ['aegypt', 'agypt', 'egypt'], + 1 => ['marokko'], + 2 => ['usbek', 'uzbek'], + 3 => ['oman'], + 4 => ['jordan'], + 6 => ['israel'], + 7 => ['tuerkei', 'turkei'], + 8 => ['iran'], + ]; + + foreach ($priorities as $priority => $needles) { + foreach ($needles as $needle) { + if (strpos($haystack, $needle) !== false) { + return $priority; + } + } + } + + return 99; + } + + private function buildHomepageSortHaystack(Page $page) + { + $parts = [ + $page->getSlug(), + $page->getTitle(), + $page->getTitleShort(), + $page->getRealUrlPath(), + ]; + + if ($page->getCountry()) { + $parts[] = $page->getCountry()->getName(); + $parts[] = $page->getCountry()->getSlug(); + } + + if ($page->getTravelProgram()) { + foreach ($page->getTravelProgram()->getCountries() as $country) { + $parts[] = $country->getName(); + $parts[] = $country->getSlug(); + } + } + + return strtolower(implode(' ', array_filter($parts))); + } + public function findCountryPages() { return $this->createQueryBuilder('node')