Startseiten-Reisekategorien aus CMS-Widget statt fester Abfrage laden.

Bindet das neue Sidebar-Widget an die Startseite an und nutzt den
Widget-Titel für die Überschrift, mit Fallback auf die bisherige Logik.

Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
Kevin Adametz 2026-06-18 10:46:30 +00:00
parent 64dce95f20
commit d4b7937801
5 changed files with 53 additions and 4 deletions

View file

@ -190,7 +190,7 @@
<section id="dev-home-countries"> <section id="dev-home-countries">
<div class="clearfix"> <div class="clearfix">
<h2 class="h3 h3l">Alle Reisekategorien auf einen Blick</h2> <h2 class="h3 h3l">{{ homepage_country_title|default('Alle Reisekategorien auf einen Blick') }}</h2>
</div> </div>
{% include 'default/components/multiPageBoxCarousel.html.twig' with {pages: country_pages} %} {% include 'default/components/multiPageBoxCarousel.html.twig' with {pages: country_pages} %}

View file

@ -172,7 +172,7 @@
<section id="home-countries"> <section id="home-countries">
<div class="clearfix"> <div class="clearfix">
<h2 class="h3 h3l">Alle Reisekategorien auf einen Blick</h2> <h2 class="h3 h3l">{{ homepage_country_title|default('Alle Reisekategorien auf einen Blick') }}</h2>
</div> </div>
{% include 'default/components/multiPageBoxCarousel.html.twig' with {pages: country_pages} %} {% include 'default/components/multiPageBoxCarousel.html.twig' with {pages: country_pages} %}

View file

@ -108,6 +108,7 @@ class DefaultController extends Controller
$sidebarWidgetRepo = $this->getEntityManager()->getRepository('AppBundle:SidebarWidget'); $sidebarWidgetRepo = $this->getEntityManager()->getRepository('AppBundle:SidebarWidget');
$plannableTripsWidget = $sidebarWidgetRepo->findActiveWidgetByComponent('homepagePlannableTrips'); $plannableTripsWidget = $sidebarWidgetRepo->findActiveWidgetByComponent('homepagePlannableTrips');
$popularTripsWidget = $sidebarWidgetRepo->findActiveWidgetByComponent('homepagePopularTrips'); $popularTripsWidget = $sidebarWidgetRepo->findActiveWidgetByComponent('homepagePopularTrips');
$travelCategoriesWidget = $sidebarWidgetRepo->findActiveWidgetByComponent('homepageTravelCategories');
$newsWidget = $sidebarWidgetRepo->findActiveWidgetByComponent('newsSidebarWidget', 'home'); $newsWidget = $sidebarWidgetRepo->findActiveWidgetByComponent('newsSidebarWidget', 'home');
$homepageOfferPages = $popularTripsWidget $homepageOfferPages = $popularTripsWidget
? $pageRepo->findActiveTravelPagesByIds($popularTripsWidget->getConfigPageIds()) ? $pageRepo->findActiveTravelPagesByIds($popularTripsWidget->getConfigPageIds())
@ -123,6 +124,13 @@ class DefaultController extends Controller
$devHomeSidebarOfferPages = $pageRepo->findHomepageOffers(4); $devHomeSidebarOfferPages = $pageRepo->findHomepageOffers(4);
} }
$countryPages = $travelCategoriesWidget
? $pageRepo->findActiveCountryPagesByIds($travelCategoriesWidget->getConfigPageIds())
: [];
if (empty($countryPages)) {
$countryPages = $pageRepo->findHomepageCountryPages();
}
$fewoLodgings = []; $fewoLodgings = [];
$lodgingGroups = $this->getEntityManager()->getRepository('AppBundle:FewoLodgingGroup')->findAll(); $lodgingGroups = $this->getEntityManager()->getRepository('AppBundle:FewoLodgingGroup')->findAll();
foreach ($lodgingGroups as $lodgingGroup) { foreach ($lodgingGroups as $lodgingGroup) {
@ -144,7 +152,10 @@ class DefaultController extends Controller
'homepage_offer_pages' => $homepageOfferPages, 'homepage_offer_pages' => $homepageOfferPages,
'homepage_offer_title' => $popularTripsWidget && $popularTripsWidget->getName() ? $popularTripsWidget->getName() : 'beliebtesten Kulturreisen', 'homepage_offer_title' => $popularTripsWidget && $popularTripsWidget->getName() ? $popularTripsWidget->getName() : 'beliebtesten Kulturreisen',
'homepage_offer_new_page_ids' => $popularTripsWidget ? $popularTripsWidget->getConfigNewPageIds() : [], 'homepage_offer_new_page_ids' => $popularTripsWidget ? $popularTripsWidget->getConfigNewPageIds() : [],
'country_pages' => $pageRepo->findHomepageCountryPages(), 'country_pages' => $countryPages,
'homepage_country_title' => $travelCategoriesWidget && $travelCategoriesWidget->getName()
? $travelCategoriesWidget->getName()
: 'Alle Reisekategorien auf einen Blick',
'fewo_lodgings' => $fewoLodgings, 'fewo_lodgings' => $fewoLodgings,
'dev_home_sidebar' => true, 'dev_home_sidebar' => true,
'dev_home_sidebar_offer_title' => $plannableTripsWidget && $plannableTripsWidget->getName() ? $plannableTripsWidget->getName() : 'Aktuell planbare Reisen', 'dev_home_sidebar_offer_title' => $plannableTripsWidget && $plannableTripsWidget->getName() ? $plannableTripsWidget->getName() : 'Aktuell planbare Reisen',

View file

@ -170,6 +170,44 @@ class PageRepository extends NestedTreeRepository
return $ret; return $ret;
} }
/**
* @param int[] $ids
* @return Page[]
*/
public function findActiveCountryPagesByIds(array $ids)
{
$ids = array_values(array_filter(array_map('intval', $ids)));
if (empty($ids)) {
return [];
}
$pages = $this->createQueryBuilder('node')
->innerJoin('node.country', 'country')
->addSelect('country')
->where('node.id IN (:ids)')
->andWhere('node.status > 0')
->andWhere('node.template = \'overview\'')
->andWhere('node.lvl = 0')
->setParameter('ids', $ids)
->getQuery()
->execute();
$pagesById = [];
foreach ($pages as $page) {
$pagesById[$page->getId()] = $page;
}
$ret = [];
foreach ($ids as $id) {
if (isset($pagesById[$id])) {
$ret[] = $pagesById[$id];
}
}
return $ret;
}
/** /**
* @return Page[] * @return Page[]
*/ */

View file

@ -16,7 +16,7 @@ class SidebarWidgetRepository extends \Doctrine\ORM\EntityRepository
$qb = $this->createQueryBuilder('sidebar_widget'); $qb = $this->createQueryBuilder('sidebar_widget');
$qb->where('sidebar_widget.active = 1') $qb->where('sidebar_widget.active = 1')
->andWhere('sidebar_widget.component NOT IN (:configComponents)') ->andWhere('sidebar_widget.component NOT IN (:configComponents)')
->setParameter('configComponents', ['homepagePlannableTrips', 'homepagePopularTrips']) ->setParameter('configComponents', ['homepagePlannableTrips', 'homepagePopularTrips', 'homepageTravelCategories'])
->addOrderBy('sidebar_widget.pos', 'ASC'); ->addOrderBy('sidebar_widget.pos', 'ASC');
$results = $qb->getQuery()->getResult(); $results = $qb->getQuery()->getResult();