Produktvergleich

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.

Allgemein

Grundeinstellungen

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. 

Storefront-Verkaufskanal

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. 

Produktexport


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

API-Zugang

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".

Status

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.

Verkaufskanal löschen

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. 

Template

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. 

Kopfzeile

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.

Produktzeile

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!
 

Fußzeile

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.

TWIG

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 }}",{#- -#}

Variablen

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

KonfigurationsvariablenBeschreibung
productExport.salesChannelDomain.urlURL zum Verkaufskanal
context.salesChannel.nameName vom Verkaufskanal
ExporteinstellungenBeschreibung
productExport.fileNameName der Export Datei
productExport.accessKeyAPI - Zugangsschlüssel
productExport.encodingEncoding Standard
productExport.fileFormatDateiformat
productExport.includeVariantsAngabe ob Varianten mit exportiert werden
productExport.salesChannel. ...Daten zum angegebenen SalesChannel
productExport.salesChannelDomain. ...Daten zur SalesChannel Domain
Produkteinstellungen (Nur in der Produktzeile)Beschreibung
product.activeAktiv Status
product.productnumberProdukt Nummer
product.translated.nameProdukt Name
seoUrl('frontend.detail.page', {'productId': product.id}) Artikel-URL
product.translated.descriptionBeschreibung
product.deliveryTimeLieferzeit
product.restockTimeWiederauffüllzeiten in Tagen
product.minPurchaseMindestabnahme
product.maxPurchaseMaximalabnahme
product.availableStockVerfügbarer Lagerbestand
product.manufacturerNumberHerstellernummer
product.eanEAN
product.manufacturer.translated.nameHersteller
product.cover.media.urlArtikelbild
product.calculatedPrice.listPrice.priceStreichpreis (Brutto)
product.categories.first.getBreadCrumbAusgabe der Kategorien
product.stockLagerbestand
product.availableVerfügbar
product.deliveryTimeLieferzeit
product.deliveryTimeIDLieferzeit ID
product.isCloseoutAbverkauf
product.purchaseStepsDie Abnahmemenge in Schritten
product.referenceUnitProduktreferenzeinheit
product.shippingFreeKostenloser Versand
product.markAsTopsellerProdukt ist ein Topseller
product.weightGewicht
product.widthBreite
product.heightHöhe
product.lengthLänge
product.releaseDateProdukt Verkauf Start
product.keywordsProdukt Schlüsselwörter
product.descriptionProdukt Beschreibung
product.metaDescriptionProdukt Meta Beschreibung
product.metaTitleProdukt Meta Titel
product.packUnitProdukt Verpackungseinheit
product.packUnitPluralProdukt Verpackungseinheit Plural

Zusatzfelder

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 %}

Eigenschaften

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 %}

Bilder

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 -%}{#- -#}


Fehlerbehebung

Unter Umständen kann es bei dem Produktvergleich zu Fehlern kommen welche wir hier beschreiben und wie man diese behebt.

Fehlende Inhalte

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. 

Produkt ist keiner gültigen Kategorie zugeordnet

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.

Leerzeichen entfernen

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 -%}

Hilfreiche Code-Snippets

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. 

War dieser Artikel hilfreich?