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ügbaren Variablen

Produkt

VariableBeschreibungVerfügbar ab
product.productNumberProduktnummer. Groß- und Kleinschreibung beachten.6.4.0.0
product.idProdukt-ID.6.4.0.0
product.eanGTIN / EAN.6.4.0.0
product.manufacturerNumberHerstellernummer (MPN).6.4.0.0
product.parentIdID des Hauptprodukts; bei Varianten als Artikelgruppen-ID verwendbar.6.4.0.0
product.childCountAnzahl der Varianten eines Hauptprodukts.6.4.0.0
product.typeGibt an, ob es sich um ein physisches oder digitales Produkt handelt.6.7.7.0
product.downloadsDownload-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.descriptionTeaserKurzfassung 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.ogTitleTitel für die Social-Media-Vorschau.6.7.10.0
product.translated.ogDescriptionBeschreibung 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.urlURL des Hauptbilds.6.4.0.0
product.cover.media.translated.altÜbersetzter Alternativtext des Hauptbilds.6.4.0.0
product.cover.media.thumbnailsVorschaubilder des Hauptbilds; jedes enthält eine URL, Breite und Höhe.6.4.0.0
product.mediaProduktbilder. Die Reihenfolge ist nicht festgelegt. Für die Reihenfolge aus der Administration nach Position sortieren.6.4.0.0
product.coverIdID des Hauptbilds innerhalb von product.media.6.4.0.0
product.openGraphMedia.urlBild für die Social-Media-Vorschau.6.7.10.0
product.calculatedPrice.unitPricePreis 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.priceStreichpreis; leer, wenn kein Streichpreis gepflegt ist.6.4.0.0
product.calculatedPrice.listPrice.percentageErsparnis gegenüber dem Streichpreis in Prozent.6.4.0.0
product.calculatedPrice.listPrice.discountErsparnis gegenüber dem Streichpreis als negativer Betrag.6.4.0.0
product.calculatedPrice.regulationPrice.priceNiedrigster Preis der letzten 30 Tage, sofern am Produkt gepflegt.6.4.10.0
product.calculatedPrice.referencePrice.priceGrundpreis, 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.referenceUnitBasismenge des Grundpreises.6.4.0.0
product.calculatedPrice.referencePrice.unitNameName der Einheit des Grundpreises, z. B. „Kilogramm“.6.4.0.0
product.calculatedPricesErweiterte 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.unitPriceNiedrigster Preis über Produkt, Varianten und Mengenstaffeln („ab“-Preis). Bei einer Variante gilt der niedrigste Preis der Produktfamilie.6.4.0.0
product.calculatedCheapestPrice.hasRangeGibt an, ob sich Preise zwischen Varianten oder Mengenstaffeln unterscheiden.6.4.0.0
product.tax.taxRateMehrwertsteuersatz in Prozent.6.4.0.0
product.activeGibt an, ob das Produkt aktiv ist.6.4.0.0
product.availableGibt 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.stockLagerbestand.6.4.0.0
product.availableStockVerfügbarer Lagerbestand. Ab 6.6.0.0 entspricht dieser Wert product.stock; davor werden offene Bestellmengen abgezogen.6.4.0.0
product.isCloseoutGibt an, ob das Produkt ein Abverkaufsprodukt ist, das bei fehlendem Lagerbestand nicht bestellt werden kann.6.4.0.0
product.minPurchaseMindestbestellmenge.6.4.0.0
product.maxPurchaseMaximalbestellmenge, sofern am Produkt festgelegt.6.4.0.0
product.calculatedMaxPurchaseMaximalmenge pro Bestellung unter Berücksichtigung von Produktgrenze, Warenkorb-Limit, Lagerbestand bei Abverkauf und Bestellschritten.6.4.0.0
product.purchaseStepsBestellschritte bzw. Abnahmemenge in Schritten.6.4.0.0
product.restockTimeWiederauffü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.minMindestwert der Lieferzeitspanne.6.4.14.0
product.deliveryTime.maxHöchstwert der Lieferzeitspanne.6.4.14.0
product.deliveryTime.unitEinheit der Lieferzeit: Stunde, Tag, Woche, Monat oder Jahr.6.4.14.0
product.deliveryTimeIdLieferzeit-ID. Auf das kleine „d“ in Id achten.6.4.0.0
product.releaseDateVeröffentlichungsdatum. Bei Bedarf formatieren, z. B. mit product.releaseDate|date('Y-m-d').6.4.0.0
product.isNewGibt 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.linkWebsite des Herstellers.6.4.0.0
product.manufacturer.media.urlURL des Herstellerlogos.6.4.0.0
product.seoCategoryHauptkategorie 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.categoriesAktive Produktkategorien. Vor 6.7.11.0 konnten auch inaktive Kategorien enthalten sein.6.4.0.0
product.seoCategory.breadcrumbKategoriepfad als Liste von Namen. Mit |slice(1)|join(' > ') wird die Root-Kategorie entfernt und der Rest verbunden.6.7.14.0
product.tagsProdukt-Tags; jeder Eintrag enthält einen Namen.6.4.0.0
product.optionsVariantenoptionen mit übersetzten Namen und Optionsgruppen.6.4.0.0
product.variationVariantenoptionen 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.propertiesProdukteigenschaften.6.4.0.0
product.sortedPropertiesNach 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.weightGewicht in kg.6.4.0.0
product.widthBreite in mm.6.4.0.0
product.heightHöhe in mm.6.4.0.0
product.lengthLänge in mm.6.4.0.0
product.measurements.units.weight.valueIn 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.unitEinheit 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.purchaseUnitInhalt einer Verkaufseinheit, z. B. 0.5.6.4.0.0
product.referenceUnitBasismenge für den Grundpreis. Die zugehörige Einheit ist über product.unit verfügbar.6.4.0.0
product.shippingFreeGibt an, ob das Produkt versandkostenfrei ist.6.4.0.0
product.guaranteeMonthsDauer 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.guaranteeConfirmedGibt an, dass der Händler die Richtigkeit und Verfügbarkeit der Garantieangaben bestätigt hat.6.7.14.0
product.guaranteeTermsUrlLink zu den Garantiebedingungen; muss eine HTTP- oder HTTPS-URL sein.6.7.16.0*
product.guaranteeTermsMedia.urlDokument mit den Garantiebedingungen.6.7.16.0*
product.markAsTopsellerGibt an, ob das Produkt als Topseller markiert ist.6.4.0.0
product.salesVerkaufte Stückzahl; wird bei Bestellungen und Stornierungen aktualisiert.6.4.0.0
product.ratingAverageDurchschnittliche Produktbewertung.6.4.0.0



Exporteinstellungen

VariableBeschreibungVerfügbar ab
productExport.fileNameDateiname des Exports.6.4.0.0
productExport.accessKeyZugriffsschlüssel in der Export-URL.6.4.0.0
productExport.encodingKodierung, z. B. UTF-8 oder ISO-8859-1.6.4.0.0
productExport.fileFormatDateiformat: CSV oder XML.6.4.0.0
productExport.includeVariantsGibt an, ob Varianten exportiert werden.6.4.0.0
productExport.feedLabelGoogle-Feed-Label.6.7.12.0
productExport.productStream.nameName der dynamischen Produktgruppe; in der Exportvorschau leer.6.4.0.0
productExport.generatedAtZeitpunkt 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.urlURL der Export-Domain.6.4.0.0
productExport.salesChannelDomain.language.locale.codeGebietsschema der Export-Domain, z. B. de-DE.6.4.0.0



Kontext

VariableBeschreibungVerfügbar ab
context.currency.isoCodeWährungscode aus den Exporteinstellungen, z. B. EUR.6.4.0.0
context.currency.symbolWährungssymbol, z. B. €.6.4.0.0
context.currency.itemRounding.decimalsAnzahl der Nachkommastellen für Preise.6.4.0.0
context.taxStateSteuerdarstellung: brutto, netto oder steuerfrei.6.4.0.0
context.currentCustomerGroup.translated.nameKundengruppe des ausgewählten Verkaufskanals; relevant für die Preisberechnung.6.4.0.0
context.measurementSystem.systemMaßsystem des ausgewählten Verkaufskanals: metrisch oder imperial. Eine Maßsystemeinstellung auf der Export-Domain wird ignoriert.6.7.1.0
context.shippingMethod.translated.nameStandard-Versandart des ausgewählten Verkaufskanals.6.4.0.0
context.shippingLocation.country.isoISO-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.localeCodeGebietsschema der Export-Sprache, z. B. de-DE.6.6.10.0
context.languageInfo.nameName der Export-Sprache.6.6.10.0
context.paymentMethod.translated.nameStandard-Zahlungsart des ausgewählten Verkaufskanals.6.4.0.0

*Die Ausgangsliste kennzeichnet diese Variablen für 6.7.16.0 als angekündigt.

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?

0 / 1000 Zeichen