Für Entwickler
Entität
Landingpages sind die DAL-Entität repertus_seo_filter_landingpage und über die Admin-API unter /api/repertus-seo-filter-landingpage erreichbar, inklusive Suche (/api/search/repertus-seo-filter-landingpage) und Sync-API.
Wichtige Felder und Zuordnungen:
| Feld | Bedeutung |
|---|---|
name, title, description, metaTitle, metaDescription, keywords | Übersetzbare Textfelder; title und metaTitle sind Pflicht |
breadcrumb | Text des Breadcrumb-Eintrags; ohne Admin-Feld, nur per API |
ogTitle, ogDescription, openGraphMediaId | Open-Graph-Daten; werden gespeichert, aktuell nicht im Storefront ausgegeben |
enabled, robotType, sitemapPrio, changeFreq, sitemapExclude | Status und SEO-Strategie |
configurationMode | shared oder per_sales_channel |
categoryId, useScNav | Kategorie bzw. Sales-Channel-Navigation |
properties, manufacturers | Filterkombination (M:N auf property_group_option und product_manufacturer) |
parameters | Zusätzliche Listing-Parameter als Typ/Wert-Paare, zum Beispiel min-price = 10. Nur per API pflegbar, ohne Admin-Oberfläche. |
salesChannels | Sichtbarkeit im Modus shared |
children, parentId, salesChannelId | Sales-Channel-Varianten im Modus per_sales_channel |
cmsPageId, slotConfig | Layout und Elementinhalte |
canonicalForeignKey | Ziel der kanonischen URL (Foreign-Key einer seo_url) |
Eine Landingpage per API anlegen:
POST /api/repertus-seo-filter-landingpage
{
"name": "Tischdeko in Creme",
"title": "Tisch/Creme",
"metaTitle": "Tischdeko in Creme kaufen",
"enabled": true,
"configurationMode": "shared",
"robotType": "follow, index",
"categoryId": "0190…",
"properties": [{ "id": "0190…" }],
"salesChannels": [{ "id": "0190…" }]
}Nach dem Anlegen erzeugt der Indexer die SEO-URLs; bei Warteschlangen-Indizierung asynchron.
Konfigurations-Modus per API wechseln
Der Moduswechsel läuft nicht über ein Feld-Update, sondern über zwei Aktionen, die Varianten anlegen bzw. zusammenführen und die SEO-URLs mit umhängen:
POST /api/_action/repertus/seo-filter-landingpage/{id}/convert-to-per-sales-channel
POST /api/_action/repertus/seo-filter-landingpage/{id}/convert-to-shared
{ "chosenVariantId": "…" }Schreibzugriffe auf Landingpages im Modus per_sales_channel über die Admin-API werden ohne aktive In-App-Erweiterung mit HTTP 403 abgewiesen; die Rückumstellung auf shared ist immer erlaubt.
Storefront-Routen
| Route | Zweck |
|---|---|
GET /landingpage/{landingpageId} (frontend.repertus.landingpage.page) | Storefront-Seite; die SEO-URL zeigt hierauf |
GET /widgets/landingpage/{navigationId}/check | Prüfung aus dem Listing, ob die aktiven Filter einer Landingpage entsprechen |
/widgets/cms/tonur-seo-filter-landingpage/{landingpageId} und …/filter | Nachladen von Listing und Filtern per XHR |
Events
Tonur\SeoFilterLandingpages\Storefront\Page\Landingpage\LandingpagePageLoadedEventwird nach dem Laden der Storefront-Seite ausgelöst und trägtLandingpagePage, Kontext und Request. Die Seite erweitert die Navigationsseite umlandingpageundparentCategoryUrl.Tonur\SeoFilterLandingpages\Core\Content\Landingpage\Event\SeoFilterLandingpageIndexerEventwird nach der Indizierung ausgelöst und stößt die SEO-URL-Erzeugung an.
Templates
Das Plugin erweitert diese Storefront-Templates:
storefront/page/content/index.html.twig: Breadcrumb-Blockstorefront/layout/breadcrumb.html.twig: Landingpage als Breadcrumb-Elementstorefront/component/product/listing.html.twig: Listing-Optionen (Landingpage-Filter, Zurück-Button, Prüf-URL)storefront/element/cms-element-product-listing.html.twig: XHR-URLs des Listings
Das JavaScript-Plugin TonurSeoFilterLandingpageListingPlugin überschreibt Shopwares Listing-Plugin global (PluginManager.override('Listing', …)). Es sperrt die Landingpage-Filter, rendert den Zurück-Button und schickt bei jeder Filteränderung in jedem Listing die Weiterleitungsprüfung an frontend.repertus.landingpage.check. Eigene Listing-Overrides müssen davon erben oder die Prüfung selbst auslösen.
Landingpages generieren
Der Befehl bin/console repertus:seo-filter-landingpage:generate-for-filter legt Landingpages in Masse über die Sync-API an. Die Daten liefern Services, die Tonur\SeoFilterLandingpages\DataProvider\LandingpageDataProvider erweitern und mit tonur.seo_filter_landingpages.landingpage_data_provider getaggt sind:
class ColorLandingpageProvider extends LandingpageDataProvider
{
public function getAction(): string { return 'upsert'; }
public function getEntity(): string { return 'repertus_seo_filter_landingpage'; }
public function getPayload(): array { /* Liste von Landingpage-Payloads */ }
}Nach dem Import werden die SEO-URLs der neuen Landingpages direkt erzeugt.
SEO-URL-Vorlage
Die Route frontend.repertus.landingpage.page ist beim SEO-URL-System registriert. In der Vorlage stehen alle Felder der Landingpage unter landingpage bereit, ergänzt um propertyIds, manufacturerIds, parameters und, bei zugewiesener Kategorie, seoBreadcrumb.