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 beim Aufruf der Export URL neu erzeugt, wenn dieser Intervall abgelaufen ist.
Zusätzlich lässt sich die Datei erzeugen, sobald der Scheduler (6) ausgeführt wird. 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.
Liste der verfügbare Variablen
Konfigurationsvariablen | Beschreibung |
productExport.salesChannelDomain.url | URL zum Verkaufskanal |
context.salesChannel.name | Name vom Verkaufskanal |
Exporteinstellungen | Beschreibung |
productExport.fileName | Name der Export Datei |
productExport.accessKey | API - Zugangsschlüssel |
productExport.encoding | Encoding Standard |
productExport.fileFormat | Dateiformat |
productExport.includeVariants | Angabe ob Varianten mit exportiert werden |
productExport.salesChannel. ... | Daten zum angegebenen SalesChannel |
productExport.salesChannelDomain. ... | Daten zur SalesChannel Domain |
Produkteinstellungen (Nur in der Produktzeile) | Beschreibung |
product.active | Aktiv Status |
product.productnumber | Produkt Nummer |
product.translated.name | Produkt Name |
seoUrl('frontend.detail.page', {'productId': product.id}) | Artikel-URL |
product.translated.description | Beschreibung |
product.deliveryTime | Lieferzeit |
product.restockTime | Wiederauffüllzeiten in Tagen |
product.minPurchase | Mindestabnahme |
product.maxPurchase | Maximalabnahme |
product.availableStock | Verfügbarer Lagerbestand |
product.manufacturerNumber | Herstellernummer |
product.ean | EAN |
product.manufacturer.translated.name | Hersteller |
product.cover.media.url | Artikelbild |
product.calculatedPrice.listPrice.price | Streichpreis (Brutto) |
product.categories.first.getBreadCrumb | Ausgabe der Kategorien |
product.stock | Lagerbestand |
product.available | Verfügbar |
product.deliveryTime | Lieferzeit |
product.deliveryTimeID | Lieferzeit ID |
product.isCloseout | Abverkauf |
product.purchaseSteps | Die Abnahmemenge in Schritten |
product.referenceUnit | Produktreferenzeinheit |
product.shippingFree | Kostenloser Versand |
product.markAsTopseller | Produkt ist ein Topseller |
product.weight | Gewicht |
product.width | Breite |
product.height | Höhe |
product.length | Länge |
product.releaseDate | Produkt Verkauf Start |
product.keywords | Produkt Schlüsselwörter |
product.description | Produkt Beschreibung |
product.metaDescription | Produkt Meta Beschreibung |
product.metaTitle | Produkt Meta Titel |
product.packUnit | Produkt Verpackungseinheit |
product.packUnitPlural | Produkt Verpackungseinheit Plural |
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.
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.