Mit dem Verkaufskanal Produktvergleich kannst du Produktexporte zu vorhandenen Preisportalen durchführen. Zudem können komplette Anbindungen an neuen Marktplätzen geschaffen werden. Durch die Verwendung eines Export-Templates, welches mit Twig-Variablen arbeitet, kannst du schnell Anpassungen und neue Exporte schaffen.
Bei den meisten Portalen kann ein Link zur Exportdatei hinterlegt werden. Je nach Caching-Methode wird die Datei bei jedem Aufruf neu erzeugt und das Portal erhält immer den aktuellsten Datenstand. Alternativ wird die Datei in regelmäßigen Abständen erneuert und das Portal kann die Datei wesentlich schneller holen.

In den Grundeinstellungen gibst du zunächst den Namen Deines Produktvergleiches an. Wenn du den Produktevergleich für ein großes Preisportal verwenden möchtest, kannst du hier auch direkt eine der vorhandenen Vorlagen auswählen. Alle Einstellungen werden dann für das jeweilige Portal korrekt voreingestellt.

Hier gibst du an, auf welchen Verkaufskanal (1) und welcher Storefront-Domain (2) sich dein Produktvergleiche bezieht. Außerdem gibst du an, welche Währung (3), welche Sprache (4) und welche Kundengruppe (5) für diesen Produktvergleich verwendet werden soll.

Im Bereich Produktexport gibst du an, wie die Ausgabe Datei des Produktexportes aussehen soll. Du gibst zunächst einen Dateinamen (1) an.
Als Encoding (2) kann UTF-8 oder ISO-8859-1 gewählt werden. Hier solltest du dich bei dem entsprechendem Preisportal informieren, was hier benötigt wird.
Als Dateiformat (3) kannst du eine CSV Datei oder eine XML Datei auswählen. Auch hier solltest du dich beim Preisportal informieren, was hier gewünscht wird.
Außerdem gibst du an, ob du die Produktvarianten (4) mit in den Export einschließen möchtest oder nicht und gibst einen Generierungsintervall (5) an. Die Produktvergleichsdatei wird nur dann automatisch neu generiert, wenn das Intervall abgelaufen ist und die Option per Scheduler generieren(6) aktiviert ist. Den Scheduler führst du aus, indem du in deinem Shop Hauptverzeichnis den Befehl bin/console scheduled-task:run ausführst.
Über eine Dynamische Produktgruppe (7) kannst du festlegen, welche Artikel aus deinem Shop in dem Produktexport enthalten sein sollen. Wie du diese genau anlegst erfährst du hier.

Im Bereich API-Zugang kannst du eine API Zugangs ID für diesen Produktvergleich generieren. Weitere Informationen zur Nutzung eigener API Zugänge findest du in unserer Developer Dokumentation.
Außerdem wird dir hier die Export-URL angezeigt, unter welcher der Produktexport zur Verfügung gestellt wird. Diese URL kannst du dann auch bei dem Preisportal angeben.
Sollte beim Aufruf der Export-URL über den Browser ein Fehler angezeigt werden, so prüfe deine Dynamischen Produktgruppen.
Ergänze dafür unter "Kataloge > Dynamische Produktgruppen" die Bedingungen des Feeds in der Produktgruppe z.B. "Verkaufspreis > 0" und " z.B. Preis > 0".

Hier kannst du den Produktvergleich temporär deaktivieren. Der Aufruf der Produktvergleichs URL und die API ist dann vorübergehend unzugänglich. Außerdem kannst du hier den Wartungsmodus aktivieren. Der Aufruf ist dann nur für ausgewählte IP-Adressen aus der Whitelist möglich.

Wenn du den Produktvergleich über diese Schaltfläche löscht, wird er unwiderruflich entfernt. Das solltest du also nur durchführen, wenn der Verkaufskanal sicher nicht mehr benötigt wird.
Das Template bestimmt den Aufbau der Produktexport Datei. Das Template ist aufgeteilt in eine Kopfzeile, eine Produktzeile und eine Fußzeile.
Wenn du im Reiter Allgemein eine Vorlage verwendest, sind hier in der Regel keine Anpassungen notwendig. Die korrekten Dokumenten-Templates für die jeweiligen Vergleichsportale sind in den Vorlagen bereits enthalten.
Über den Button Template testen, wird überprüft, ob sich Syntaxfehler in dem Template befinden. Über Vorschau generieren kannst du dir den Inhalt der erstellten Export Datei direkt ansehen.
Die Kopfzeile unterscheidet sich, je nach ausgewähltem Format.
Bei einer CSV-Datei sind hier die Spaltenbezeichnungen definiert, z.B.: id, hersteller, modell_nr, name, kategorie, preis etc.
Bei einer XML-Datei befindet sich hier ebenfalls der gesamte Kopf der Datei, sowie der Start-Tag, title, description etc.

Hier wird das Template für die zu exportierenden Artikel definiert. Das Template wird via Schleife auf jeden Artikel angewendet. Bei CSV/TXT-Exporten ergibt dies jeweils eine Zeile pro Artikel. Bei einem XML-Export z.B. Google, ist jeder Artikel durch einen Start- und End-Tag eingefasst. So ist es möglich die Exporte, je nach Struktur und Anforderung anzupassen. Beachte, dass die Generierung massiv verlangsamt wird, je mehr Berechnungen im Feed ausgeführt werden!
Die Fußzeile wird ausschließlich für die XML-Exporte benötigt. In diesem Feld stehen die End-Tags, die in der Kopfzeile geöffnet werden.

Der Produktvergleich wird in der PHP Template-Engine TWIG geschrieben. Der Standard stellt dir bereits die wichtigsten Informationen deiner Produkte zur Verfügung. Mit der TWIG Syntax hast du die Möglichkeit, die Vorlage komplett individuell anzupassen. Eine ausführliche Dokumentation, welche Ausdrücke und Befehle du nutzen kannst, findest du hier.
Die wichtigsten Befehle, die du im Produktvergleich verwenden kannst haben wir hier einmal aufgeführt.
if- Abfrage:
mit der If-Abfrage kannst du überprüfen, ob eine Aussage wahr ist. So kannst du den gewünschten Inhalt nur unter bestimmten Bedingungen ausgeben.
Das Starttag für eine If-Abfrage beinhaltet if und eine Bedingung in einer geschweiften Klammer und Prozentzeichen.
Eine If-Abfrage, die überprüft, ob ein Produkt aktiv ist würde so aussehen:
{% if product.active %}Nach der Bedingung folgt der Abschnitt, der nur dann ausgegeben werden soll, wenn die Bedingung erfüllt wird gefolgt von einem abschließendem endif tag, der ebenfalls in geschweiften Klammern und Prozentzeichen eingebunden ist.
{% endif %}Im folgenden Beispiel wird die Produktnummer nur dann ausgegeben, wenn der Artikel verfügbar ist.
{% if product.active %}
"{{ product.productNumber }}",{#- -#}
{% endif %}
elseif- und else-Abfrage:
Die elseif-Abfrage entspricht einer weiteren if-Abfrage, die ausgeführt wird, wenn die Bedingung der ersten if-Abfrage nicht erfüllt wird. Der Inhalt hinter einem else-Tag wird ausgeführt, wenn die Bedingungen aller vorheriger if- und elseif-Abfragen nicht erfüllt wurden.
Im folgendem Beispiel wird der Inhalt 1 ausgegeben, wenn der Verfügbare Lagerbestand größer als 20 ist. Ist er das nicht, aber dennoch größer als 10, wird der Inhalt 2 ausgegeben. Ist der Lagerbestand kleiner als 10 und werden somit beide Bedingungen nicht erfüllt, wird der Inhalt 3 ausgegeben.
{% if product.availableStock >20 %}
Inhalt
{% elseif product.availableStock > 10 %}
Inhalt 2
{% else %}
Inhalt 3
{% endif %}set
Mit dem set Befehl kannst du Variablen zuweisen, die du anschließend weiter verwenden kannst. Mit dem folgenden Befehl weist du zum Beispiel den Preis eines Produktes der Variable price zu.
{% set price = product.calculatedPrice %}Anschließend kannst du dann mit der kurzen Variable weiter arbeiten anstatt verzweigte Ressourcen zu verwenden.
"{{ price.unitPrice }}",{#- -#}Mit Hilfe von Variablen kannst du dem Template Informationen zu den Produkten und zu dem Produktexport hinzufügen. In den Vorlagen sind bereits die notwendigen Variablen für den jeweiligen Export angelegt.
Für eigene Exporte kannst du aber auch eigene Informationen mit Variablen hinzufügen.
Jede Variable startet dabei mit product oder productExport und kann mit einem Punkt erweitert werden zum Beispiel product.productNumber für die Produktnummer.
Die Variablen können aber auch mehrstufig sein. So ist die Variable für den Produktnamen beispielsweise product.translated.name.
Wenn du hinter einer Stufe einen Punkt schreibst, werden dir alle verfügbaren Unterstufen angezeigt.

| Variable | Beschreibung | Verfügbar ab |
|---|---|---|
product.productNumber | Produktnummer. Groß- und Kleinschreibung beachten. | 6.4.0.0 |
product.id | Produkt-ID. | 6.4.0.0 |
product.ean | GTIN / EAN. | 6.4.0.0 |
product.manufacturerNumber | Herstellernummer (MPN). | 6.4.0.0 |
product.parentId | ID des Hauptprodukts; bei Varianten als Artikelgruppen-ID verwendbar. | 6.4.0.0 |
product.childCount | Anzahl der Varianten eines Hauptprodukts. | 6.4.0.0 |
product.type | Gibt an, ob es sich um ein physisches oder digitales Produkt handelt. | 6.7.7.0 |
product.downloads | Download-Dateien eines digitalen Produkts. Mit product.downloads|length > 0 lässt sich prüfen, ob Downloads vorhanden sind. | 6.4.19.0 |
product.translated.name | Übersetzter Produktname. | 6.4.0.0 |
product.translated.description | Übersetzte Produktbeschreibung als HTML. Für Klartext den Twig-Filter |striptags verwenden. | 6.4.0.0 |
product.translated.descriptionTeaser | Kurzfassung der Beschreibung als Klartext, bis zu 512 Zeichen. Wird beim Speichern des Produkts generiert. | 6.7.12.0 |
product.translated.keywords | Übersetzte Schlüsselwörter; verwendet den Sprachfallback. | 6.4.0.0 |
product.translated.metaTitle | Übersetzter SEO-Titel; verwendet den Sprachfallback. | 6.4.0.0 |
product.translated.metaDescription | Übersetzte SEO-Beschreibung; verwendet den Sprachfallback. | 6.4.0.0 |
product.translated.ogTitle | Titel für die Social-Media-Vorschau. | 6.7.10.0 |
product.translated.ogDescription | Beschreibung für die Social-Media-Vorschau. | 6.7.10.0 |
product.translated.packUnit | Übersetzte Verpackungseinheit im Singular. | 6.4.0.0 |
product.translated.packUnitPlural | Übersetzte Verpackungseinheit im Plural. | 6.4.0.0 |
product.translated.customFields.<name> | Wert eines Produkt-Zusatzfelds. <name> durch den technischen Namen ersetzen. | 6.4.0.0 |
entitySeoUrl('product', product.id) | Produkt-URL für Storefront- und Headless-Verkaufskanäle. Vor Version 6.7.14.0 für Storefront-Verkaufskanäle seoUrl('frontend.detail.page', {'productId': product.id}) verwenden. | 6.7.14.0 |
product.cover.media.url | URL des Hauptbilds. | 6.4.0.0 |
product.cover.media.translated.alt | Übersetzter Alternativtext des Hauptbilds. | 6.4.0.0 |
product.cover.media.thumbnails | Vorschaubilder des Hauptbilds; jedes enthält eine URL, Breite und Höhe. | 6.4.0.0 |
product.media | Produktbilder. Die Reihenfolge ist nicht festgelegt. Für die Reihenfolge aus der Administration nach Position sortieren. | 6.4.0.0 |
product.coverId | ID des Hauptbilds innerhalb von product.media. | 6.4.0.0 |
product.openGraphMedia.url | Bild für die Social-Media-Vorschau. | 6.7.10.0 |
product.calculatedPrice.unitPrice | Preis für eine Einheit aus dem Standardpreis des Produkts. Wenn eine erweiterte Preisregel greift, verwenden Storefront und Warenkorb product.calculatedPrices. | 6.4.0.0 |
product.calculatedPrice.listPrice.price | Streichpreis; leer, wenn kein Streichpreis gepflegt ist. | 6.4.0.0 |
product.calculatedPrice.listPrice.percentage | Ersparnis gegenüber dem Streichpreis in Prozent. | 6.4.0.0 |
product.calculatedPrice.listPrice.discount | Ersparnis gegenüber dem Streichpreis als negativer Betrag. | 6.4.0.0 |
product.calculatedPrice.regulationPrice.price | Niedrigster Preis der letzten 30 Tage, sofern am Produkt gepflegt. | 6.4.10.0 |
product.calculatedPrice.referencePrice.price | Grundpreis, z. B. Preis pro Kilogramm. Nur gesetzt, wenn die erforderlichen Einheiten gepflegt sind und Verkaufs- und Basiseinheit voneinander abweichen. | 6.4.0.0 |
product.calculatedPrice.referencePrice.referenceUnit | Basismenge des Grundpreises. | 6.4.0.0 |
product.calculatedPrice.referencePrice.unitName | Name der Einheit des Grundpreises, z. B. „Kilogramm“. | 6.4.0.0 |
product.calculatedPrices | Erweiterte Preise der ersten passenden Preisregel, nach Mengenstaffel sortiert. .first ist der Preis einer Einheit; Shopware-Templates verwenden häufig .last für den Preis der größten Staffel. | 6.4.0.0 |
product.calculatedCheapestPrice.unitPrice | Niedrigster Preis über Produkt, Varianten und Mengenstaffeln („ab“-Preis). Bei einer Variante gilt der niedrigste Preis der Produktfamilie. | 6.4.0.0 |
product.calculatedCheapestPrice.hasRange | Gibt an, ob sich Preise zwischen Varianten oder Mengenstaffeln unterscheiden. | 6.4.0.0 |
product.tax.taxRate | Mehrwertsteuersatz in Prozent. | 6.4.0.0 |
product.active | Gibt an, ob das Produkt aktiv ist. | 6.4.0.0 |
product.available | Gibt an, ob das Produkt bestellt werden kann. Bei Abverkaufsprodukten mit einem Lagerbestand unterhalb der Mindestbestellmenge kann der Wert false sein. | 6.4.0.0 |
product.stock | Lagerbestand. | 6.4.0.0 |
product.availableStock | Verfügbarer Lagerbestand. Ab 6.6.0.0 entspricht dieser Wert product.stock; davor werden offene Bestellmengen abgezogen. | 6.4.0.0 |
product.isCloseout | Gibt an, ob das Produkt ein Abverkaufsprodukt ist, das bei fehlendem Lagerbestand nicht bestellt werden kann. | 6.4.0.0 |
product.minPurchase | Mindestbestellmenge. | 6.4.0.0 |
product.maxPurchase | Maximalbestellmenge, sofern am Produkt festgelegt. | 6.4.0.0 |
product.calculatedMaxPurchase | Maximalmenge pro Bestellung unter Berücksichtigung von Produktgrenze, Warenkorb-Limit, Lagerbestand bei Abverkauf und Bestellschritten. | 6.4.0.0 |
product.purchaseSteps | Bestellschritte bzw. Abnahmemenge in Schritten. | 6.4.0.0 |
product.restockTime | Wiederauffüllzeit in Tagen. | 6.4.0.0 |
product.deliveryTime.translated.name | Übersetzter Name der Lieferzeit, z. B. „1–3 Tage“. | 6.4.0.0 |
product.deliveryTime.min | Mindestwert der Lieferzeitspanne. | 6.4.14.0 |
product.deliveryTime.max | Höchstwert der Lieferzeitspanne. | 6.4.14.0 |
product.deliveryTime.unit | Einheit der Lieferzeit: Stunde, Tag, Woche, Monat oder Jahr. | 6.4.14.0 |
product.deliveryTimeId | Lieferzeit-ID. Auf das kleine „d“ in Id achten. | 6.4.0.0 |
product.releaseDate | Veröffentlichungsdatum. Bei Bedarf formatieren, z. B. mit product.releaseDate|date('Y-m-d'). | 6.4.0.0 |
product.isNew | Gibt an, ob das Veröffentlichungsdatum innerhalb des in den Shop-Einstellungen festgelegten Zeitraums für neue Produkte liegt. | 6.4.0.0 |
product.manufacturer.translated.name | Übersetzter Herstellername bzw. Marke. | 6.4.0.0 |
product.manufacturer.translated.link | Website des Herstellers. | 6.4.0.0 |
product.manufacturer.media.url | URL des Herstellerlogos. | 6.4.0.0 |
product.seoCategory | Hauptkategorie des Produkts für den ausgewählten Verkaufskanal. Sie wird im SEO-Tab des Produkts festgelegt. Leer, wenn keine Hauptkategorie gesetzt ist. | 6.7.14.0 |
product.categories | Aktive Produktkategorien. Vor 6.7.11.0 konnten auch inaktive Kategorien enthalten sein. | 6.4.0.0 |
product.seoCategory.breadcrumb | Kategoriepfad als Liste von Namen. Mit |slice(1)|join(' > ') wird die Root-Kategorie entfernt und der Rest verbunden. | 6.7.14.0 |
product.tags | Produkt-Tags; jeder Eintrag enthält einen Namen. | 6.4.0.0 |
product.options | Variantenoptionen mit übersetzten Namen und Optionsgruppen. | 6.4.0.0 |
product.variation | Variantenoptionen als Liste aus Gruppen- und Optionsnamen. Wird nur befüllt, wenn das Template auch product.options mit der entsprechenden Gruppe verwendet. | 6.4.0.0 |
product.properties | Produkteigenschaften. | 6.4.0.0 |
product.sortedProperties | Nach Eigenschaftsgruppe sortierte Eigenschaften; Gruppen, die auf der Produktdetailseite ausgeblendet sind, werden ausgelassen. Wird nur befüllt, wenn das Template auch product.properties mit der Gruppe verwendet. | 6.4.9.0 |
product.weight | Gewicht in kg. | 6.4.0.0 |
product.width | Breite in mm. | 6.4.0.0 |
product.height | Höhe in mm. | 6.4.0.0 |
product.length | Länge in mm. | 6.4.0.0 |
product.measurements.units.weight.value | In das Maßsystem des ausgewählten Verkaufskanals umgerechnetes Gewicht. Entsprechende Felder gibt es für Breite, Höhe und Länge. Es werden nur gepflegte Werte ausgegeben. | 6.7.1.0 |
product.measurements.units.weight.unit | Einheit des umgerechneten Gewichts. | 6.7.1.0 |
product.unit.translated.name | Übersetzter Name der Maßeinheit, z. B. „Kilogramm“. | 6.4.0.0 |
product.unit.translated.shortCode | Übersetztes Kurzzeichen der Maßeinheit, z. B. „kg“. | 6.4.0.0 |
product.purchaseUnit | Inhalt einer Verkaufseinheit, z. B. 0.5. | 6.4.0.0 |
product.referenceUnit | Basismenge für den Grundpreis. Die zugehörige Einheit ist über product.unit verfügbar. | 6.4.0.0 |
product.shippingFree | Gibt an, ob das Produkt versandkostenfrei ist. | 6.4.0.0 |
product.guaranteeMonths | Dauer der Haltbarkeitsgarantie des Herstellers in Monaten, in Halbjahresschritten ab 30 Monaten. Ab 6.7.15.0 auf 600 Monate begrenzt. | 6.7.14.0 |
product.guaranteeConfirmed | Gibt an, dass der Händler die Richtigkeit und Verfügbarkeit der Garantieangaben bestätigt hat. | 6.7.14.0 |
product.guaranteeTermsUrl | Link zu den Garantiebedingungen; muss eine HTTP- oder HTTPS-URL sein. | 6.7.16.0* |
product.guaranteeTermsMedia.url | Dokument mit den Garantiebedingungen. | 6.7.16.0* |
product.markAsTopseller | Gibt an, ob das Produkt als Topseller markiert ist. | 6.4.0.0 |
product.sales | Verkaufte Stückzahl; wird bei Bestellungen und Stornierungen aktualisiert. | 6.4.0.0 |
product.ratingAverage | Durchschnittliche Produktbewertung. | 6.4.0.0 |
| Variable | Beschreibung | Verfügbar ab |
|---|---|---|
productExport.fileName | Dateiname des Exports. | 6.4.0.0 |
productExport.accessKey | Zugriffsschlüssel in der Export-URL. | 6.4.0.0 |
productExport.encoding | Kodierung, z. B. UTF-8 oder ISO-8859-1. | 6.4.0.0 |
productExport.fileFormat | Dateiformat: CSV oder XML. | 6.4.0.0 |
productExport.includeVariants | Gibt an, ob Varianten exportiert werden. | 6.4.0.0 |
productExport.feedLabel | Google-Feed-Label. | 6.7.12.0 |
productExport.productStream.name | Name der dynamischen Produktgruppe; in der Exportvorschau leer. | 6.4.0.0 |
productExport.generatedAt | Zeitpunkt der letzten Generierung; in der Exportvorschau leer. | 6.4.0.0 |
productExport.salesChannel.translated.name | Übersetzter Name des Produktvergleich-Verkaufskanals. | 6.4.0.0 |
productExport.salesChannelDomain.url | URL der Export-Domain. | 6.4.0.0 |
productExport.salesChannelDomain.language.locale.code | Gebietsschema der Export-Domain, z. B. de-DE. | 6.4.0.0 |
| Variable | Beschreibung | Verfügbar ab |
|---|---|---|
context.currency.isoCode | Währungscode aus den Exporteinstellungen, z. B. EUR. | 6.4.0.0 |
context.currency.symbol | Währungssymbol, z. B. €. | 6.4.0.0 |
context.currency.itemRounding.decimals | Anzahl der Nachkommastellen für Preise. | 6.4.0.0 |
context.taxState | Steuerdarstellung: brutto, netto oder steuerfrei. | 6.4.0.0 |
context.currentCustomerGroup.translated.name | Kundengruppe des ausgewählten Verkaufskanals; relevant für die Preisberechnung. | 6.4.0.0 |
context.measurementSystem.system | Maßsystem des ausgewählten Verkaufskanals: metrisch oder imperial. Eine Maßsystemeinstellung auf der Export-Domain wird ignoriert. | 6.7.1.0 |
context.shippingMethod.translated.name | Standard-Versandart des ausgewählten Verkaufskanals. | 6.4.0.0 |
context.shippingLocation.country.iso | ISO-Code des Standardlands für den ausgewählten Verkaufskanal, z. B. DE. | 6.4.0.0 |
context.salesChannel.translated.name | Übersetzter Name des Storefront- oder Headless-Verkaufskanals aus den Exporteinstellungen; verwendet den Sprachfallback. | 6.4.0.0 |
context.languageInfo.localeCode | Gebietsschema der Export-Sprache, z. B. de-DE. | 6.6.10.0 |
context.languageInfo.name | Name der Export-Sprache. | 6.6.10.0 |
context.paymentMethod.translated.name | Standard-Zahlungsart des ausgewählten Verkaufskanals. | 6.4.0.0 |
*Die Ausgangsliste kennzeichnet diese Variablen für 6.7.16.0 als angekündigt.
Du hast auch die Möglichkeit, Zusatzfelder in das Template einzubinden.
Hierzu wird der technische Name des Zusatzfelds benötigt. Diesen kannst du in den Einstellungen des Zusatzfeldes entnehmen.
Der generelle Aufbau für eine Zusatzfeld-Variable ist wie folgt:
Für ein Produkt-Zusatzfeld:
{{ product.translated.customFields.technischer_name_des_zusatzfeldes }}z.B.:
{{ product.translated.customFields.weitere_informationen }}Außerdem ist es auch möglich, Zusatzfelder des Produkt-Herstellers abzufragen.
{{ product.manufacturer.translated.customFields.technischer_name_des_zusatzfeldes }}z.B.:
{{ product.manufacturer.translated.customFields.hersteller_informationen }}Es kann sinnvoll sein, die Abfrage der Zusatzfelder in eine if-Abfrage einzubauen, damit die Ausgabe nur erfolgt, wenn das Feld auch gefüllt ist.
Dies ist z.B. wie folgt möglich:
{% if product.translated.customFields.technischer_name_des_zusatzfeldes is defined %}
{{ product.translated.customFields.technischer_name_des_zusatzfeldes }}
{% endif %}Durch eine Anpassung des Templates können auch Eigenschaften ausgegeben und übertragen werden. Die Produkteigenschaften befinden sich in dem Array product.properties. Dieser kann dir die Eigenschaften anzeigen lassen.
{% for properties in product.properties %}
{{ properties.name }}
{% endfor %}Wenn du eine bestimmte Eigenschaften-Gruppe ausgeben lassen willst, kannst du diese mit einer zusätzlichen if-Abfrage eingrenzen und abfragen.
Zum Beispiel:
{% for properties in product.properties %}
{% if properties.group.name == "Größe" %}
{{ properties.name }}
{% endif %}
{% endfor %}Mithilfe einer Bedingung, die mit einem endif tag abschließt, kannst du dir mehrere Bild-Urls eines Produktes anzeigen lassen. Bei der folgenden Abfrage werden neben dem Cover-Bild noch fünf weitere Bild-Urls ausgegeben, sofern welche vorhanden sind. Die Anzahl der ausgebenen Urls kannst du beliebig verändern.
{%- if product.media|length > 1 -%}
"{%- for mediaAssociation in product.media|slice(0, 5) -%}
{{ mediaAssociation.media.url }}
{%- if not loop.last -%},{%- endif -%}
{%- endfor -%}"
{%- endif -%}{#- -#}Unter Umständen kann es bei dem Produktvergleich zu Fehlern kommen welche wir hier beschreiben und wie man diese behebt.
Im Standard werden einige Inhalte wie z.B. Produktbilder erwartet. Hast du zum Beispiel als Template Google Shopping (XML) ausgewählt, kann es vorkommen, dass Der Export abgebrochen wird, wenn in der Dynamischen Produktgruppe zum Feed ein oder mehr Artikel enthalten sind, bei denen kein Produktbild enthalten ist. In einem solchen Fall solltest du darauf achten, allen Produkten ein Produktbild zuzuweisen.
Alternativ kannst du im Reiter Template die Produktzeile bearbeiten.
Die Produktbild URL wird über diesen Eintrag ausgegeben:
<g:image_link>{{ product.cover.media.url }}</g:image_link>Diese ersetzt du komplett durch folgenden Eintrag:
<g:image_link>
{% if product.cover.media.url is defined and product.cover.media.url is not null %}
{{ product.cover.media.url }}
{% endif %}
</g:image_link>
Somit wird bei einem Produktvergleich zunächst überprüft ob ein Produktbild vorhanden ist. Nur wenn eines vorhanden ist, wird dieses in den Produktvergleich mit einbezogen.
Dieses Beispiel kann auch auf andere Variablen angewandt werden.
Wenn es in der ausgewählten Dynamischen Produktgruppe Artikel gibt, die keiner gültigen und verfügbaren Kategorie zugewiesen sind, kann es zu folgender Meldung kommen:
{"errors":[{"status":"400","code":"FRAMEWORK__STRING_TEMPLATE_RENDERING_FAILED",
"title":"Bad Request","detail":"Failed rendering string template using Twig:
Failed rendering string template using Twig: Impossible to access an attribute (\u0022getBreadCrumb\u0022)
on a null variable in \u0022420463b818562f32a1fd3ff62050d151\u0022 at line 6.",
"meta":{"parameters":
{"message":"Failed rendering string template using Twig: Impossible to access an attribute (\u0022getBreadCrumb\u0022) on a null variable in \u0022420463b818562f32a1fd3ff62050d151\u0022 at line 6."}
}}]}Durch eine Anpassung des Templates kannst du zuvor überprüfen lassen, ob eine Kategorie hinterlegt ist. So wird dieser Meldung umgangen.
Hierzu kannst du im Reiter Template die Produktzeile bearbeiten.
Die Kategorie wird über diesen Eintrag ausgegeben:
<g:product_type>{{ product.categories.first.getBreadCrumb|slice(1)|join(' > ')|raw|escape }}</g:product_type>Um die Kategorie vor dem Produktvergleich zu kontrollieren, ersetze diesen Eintrag durch folgenden:
<g:product_type>
{% if product.categories.first.getBreadCrumb is defined and product.categories.first.getBreadCrumb is not null %}
{{ product.categories.first.getBreadCrumb|slice(1)|join(' > ')|raw|escape }}
{% endif %}
</g:product_type>Somit wird bei einem Produktvergleich zunächst überprüft, ob eine gültige Kategorie vorhanden ist. Nur wenn eine vorhanden ist, wird diese in den Produktvergleich mit einbezogen.
Du kannst mithilfe eines Bindestrichs überflüssige Leerzeichen bzw. "Whitespaces" links und rechts entfernen. Hierzu musst du wie unten gezeigt am Anfang und Ende ein - einfügen.
Beispiel mit Leerzeichen:
{% for properties in product.properties %}
{% if properties.group.name == "Markenname" %}
{{ properties.name }}
{% endif %}
{% endfor %}Beispiel ohne Leerzeichen:
{%- for properties in product.properties -%}
{%- if properties.group.name == "Markenname" -%}
{{- properties.name -}}
{%- endif -%}
{%- endfor -%}Die Shopware Templates für die Produktvergleiche und die Social Shopping Verkaufskanäle werden in einer Standardkonfiguration ausgeliefert. Für manche Produkte oder Anbieter sind Ergänzungen notwendig. Für häufig angefragte Elemente haben wir hier die entsprechenden Code Snippets zusammengefasst.