Datenfeed mit Fehler

Weiß jemand was das bedeutet?
Es geht dabei um einen Datenfeed zu geizhals.at und das gleiche Problem ist bei google

0
Status «400»
Code «FRAMEWORK__STRING_TEMPLATE_RENDERING_FAILED»
Titel «Schlechte Anfrage»
detail «Fehlerhaftes Rendern von String Template mit Twig: Fehlerhaftes Rendern von String Template mit Twig: Kein Zugriff auf ein Attribut (\»translated\») auf eine Null-Variable in \»5c68be0ef3cbefc67dfb910c9b3301c2\» in Zeile 2. »
Meth
Parameter
message «Failed rendering string template using Twig: Unmöglich, auf ein Attribut (\»translated\») auf eine Null-Variable in \»5c68be0ef3cbefc67dfb910c9b3301c2\» in Zeile 2 zuzugreifen. »

also in Zeile 2 steht das hier bei geizhals
„{{ product.manufacturer.translated.name }}“,

und bei Google in Zeile 27 das hier
<g:brand>{{ product.manufacturer.translated.name|escape }}</g:brand>

Das heißt, dass translated null (leer) ist. Eigentlich sollte das Fallback auf die Standardsprache greifen… Versuche mal deine Hersteller alle zu übersetzen, ob der Fehler dann verschwindet.

D.h. bei den Hersteller die Einstellung English wählen

Ja. Oder du entfernst in dem Template das .translated aus der Variable (nur falls du keine Fremdsprachen nutzt, da hierdurch die Übersetzung für den Export deaktiviert wird).

Also das umschalten bringt nichts, keine Änderung.

Muss ich das dann überall rausnehmen?
Durch was kann der Fehler kommen?

„{{ product.productNumber }}“,
„{{ product.manufacturer.translated.name }}“,
„{{ product.manufacturerNumber }}“,
„{{ product.ean }}“,
„{{ product.translated.name|length > 80 ? product.translated.name|slice(0, 80) ~ ‚…‘ : product.translated.name }}“,
"{{ product.translated.description|raw|length > 900 ? product.translated.description|raw|slice(0,900) ~ ‚…‘ : product.translated.description|raw }}

Kann ich dir leider nicht sagen, musst du testen.

hat vielleicht noch jemand eine Idee an was es liegen könnte,

So , Fehler soweit gefunden, es gab Artikel die keinen Hersteller hatten.

Was bedeutet jetzt diese Meldung?
Mit dieser XML-Datei sind anscheinend keine Style-Informationen verknüpft. Nachfolgend wird die Baum-Ansicht des Dokuments angezeigt.

Das deine xml-Datei keine Schema-Definition mit sich bringt, was auch nicht notwendig ist.

Ok

Jetzt hat geizhals mir geschrieben.

Leider können wir den Feed so nicht verarbeiten. Nach jedem Datensatz scheint es einen Zeilenumbruch zu geben, auch die Quotes sind nicht durchgehend gesetzt.

Hallo E-VS,
zu Deinem ursprünglichen Fehler: Die Meldung tritt meist auf, wenn Du in der Dynamischen Produktgruppe ein Produkt ohne Hersteller hast. Das kannst Du durch eine IF Abfrage prüfen, als Beispiel aus einem Google Feed:

{%- if product.manufacturer -%}
        <g:brand>{{ product.manufacturer.translated.name|escape }}</g:brand>
    {%- endif -%}

Du kannst das für Deinen Feed umbauen.

Mehr Informationen dazu gibt es in der Dokumentation z.B. hier: https://docs.shopware.com/de/shopware-6-de/Produktvergleich#fehlerbehebung.

Die Quotes setzt Du im Template prüfe mal die beanstandeten Felder im Vergleich zu funktionierenden.

Die Zeilenumbrüche könnten eventuell entstehen, wenn in der Produktzeile im Template noch Leerzeilen folgen. Zum Vergleich kannst Du aber auch andere Templates heranziehen, z.B. billiger oder idealo.

Viele Grüße
Markus

Template von idealo
Kopfzeile
aid,
brand,
mpnr,
ean,
name,
desc,
shop_cat,
price,
ppu,
link,
image,
dlv_time,
dlv_cost,
pzn,
unit_pricing_measure,
unit_pricing_base_measure,
target_url,
images

Produktzeile
„{{ product.productNumber }}“,
„{{ product.manufacturer.translated.name }}“,
„{{ product.manufacturerNumber }}“,
„{{ product.ean }}“,
„{{ product.translated.name|length > 80 ? product.translated.name|slice(0, 80) ~ ‚…‘ : product.translated.name }}“,
"{{ product.translated.description|raw|length > 900 ? product.translated.description|raw|slice(0,900) ~ ‚…‘ : product.translated.description|raw }}
",
„{%- if product.categories.count > 0 -%}
{{ product.categories.first.getBreadCrumb|slice(1)|join(’ > ')|raw }}
{%- endif -%}“,
{% set price = product.calculatedPrice %}
{%- if product.calculatedPrices.count > 0 -%}
{% set price = product.calculatedPrices.last %}
{%- endif -%}
„{{ price.unitPrice }}“,
„{%- if price.referencePrice is not null -%}
{{ price.referencePrice.price|currency }} / {{ price.referencePrice.referenceUnit }} {{ price.referencePrice.unitName }}
{%- endif -%}“,
„{{ seoUrl(‚frontend.detail.page‘, {‚productId‘: product.id}) }}“,
„{% if product.cover is not null %}{{ product.cover.media.url }}{% endif %}“,
„{%- if product.availableStock >= product.minPurchase and product.deliveryTime -%}
{{ „detail.deliveryTimeAvailable“|trans({‚%name%‘: product.deliveryTime.translation(‚name‘)}) }}
{%- elseif product.availableStock < product.minPurchase and product.deliveryTime and product.restockTime -%}
{{ „detail.deliveryTimeRestock“|trans({‚%count%‘: product.restockTime,‚%restockTime%‘: product.restockTime,‚%name%‘: product.deliveryTime.translation(‚name‘)}) }}
{%- else -%}
{{ „detail.soldOut“|trans }}
{%- endif -%}“,
„4.95“,
,
„{% if product.purchaseUnit and product.unit %}{{ product.purchaseUnit }} {{ product.unit.shortCode }}{% endif %}“,
„{% if product.referenceUnit and product.unit %}{{ product.referenceUnit }} {{ product.unit.shortCode }}{% endif %}“,
„{{ seoUrl(‚frontend.detail.page‘, {‚productId‘: product.id}) }}“,
{%- if product.media|length > 1 -%}
„{%- for mediaAssociation in product.media|slice(0, 5) -%}
{{ mediaAssociation.media.url }}
{%- if not loop.last -%},{%- endif -%}
{%- endfor -%}“
{%- endif -%}

Mir wird die Excel-Datei als Liste angezeigt, also es steht alles untereinander, es gibt keine Spalten.

Hat jemand ein Original-Standard Template für Google.
Das was im SW6 drin ist sieht ja ganz anders aus als in der Doku von SW.

Kopfzeile

<?xml version="1.0" encoding="UTF-8" ?> {{ context.salesChannel.name }} {{ productExport.salesChannelDomain.url }} {{ productExport.salesChannelDomain.language.locale.code }} {{ context.salesChannel.name }} {{ productExport.salesChannelDomain.url }}

Produktzeile

<g:id>{{ product.productNumber }}</g:id>
{{ product.translated.name|escape }}
{{ product.translated.description|escape }}
<g:google_product_category>950</g:google_product_category>
{%- if product.categories.count > 0 -%}
<g:product_type>{{ product.categories.first.getBreadCrumb|slice(1)|join(’ > ')|raw|escape }}</g:product_type>
{%- endif -%}
{{ seoUrl(‚frontend.detail.page‘, {‚productId‘: product.id}) }}
{% if product.cover.media is defined %}<g:image_link>{{ product.cover.media.url }}</g:image_link>{% endif %}
<g:condition>new</g:condition>
<g:availability>
{%- if product.availableStock >= product.minPurchase and product.deliveryTime -%}
in_stock
{%- elseif product.availableStock < product.minPurchase and product.deliveryTime and product.restockTime -%}
preorder
{%- else -%}
out_of_stock
{%- endif -%}
</g:availability>
{% set price = product.calculatedPrice %}
{%- if product.calculatedPrices.count > 0 -%}
{% set price = product.calculatedPrices.last %}
{%- endif -%}

<g:price>{{ price.unitPrice|number_format(context.currency.itemRounding.decimals, '.', '') }} {{ context.currency.isoCode }}</g:price>
<g:brand>{{ product.manufacturer.translated.name|escape }}</g:brand>
<g:gtin>{{ product.ean }}</g:gtin>
<g:mpn>{{ product.manufacturerNumber }}</g:mpn>
<g:shipping>
    <g:country>DE</g:country>
    <g:service>Standard</g:service>
    {% if product.shippingFree  %}
    <g:price>0.00 {{ context.currency.isoCode }}</g:price>
    {% else %}
    <g:price>4.95 {{ context.currency.isoCode }}</g:price>
    {% endif %}
</g:shipping>

Also der Googledatenfeed funktioniert jetzt, ich habe gesehen das die Artikel in einer Kategorie sind, leider nicht in meiner.
Ich habe ein Plugin für Taxonomie und dort die Kategorien zugeordnet, komisch das es trotzdem nur in einer ist.
Hier mal das Template , vielleicht hat jemand Ahnung ob da ein Fehler drin ist.

Kopfzeile:

<?xml version="1.0" encoding="UTF-8" ?> {{ context.salesChannel.name }} {{ productExport.salesChannelDomain.url }} {{ productExport.salesChannelDomain.language.locale.code }} {{ context.salesChannel.name }} {{ productExport.salesChannelDomain.url }}

Fußzeile:

<g:id>{{ product.productNumber }}</g:id>
{{ product.translated.name|escape }}
{{ product.translated.description|escape }}
<g:google_product_category>950</g:google_product_category>
{%- if product.categories.count > 0 -%}
<g:product_type>{{ product.categories.first.getBreadCrumb|slice(1)|join(’ > ')|raw|escape }}</g:product_type>
{%- endif -%}
{{ seoUrl(‚frontend.detail.page‘, {‚productId‘: product.id}) }}
{% if product.cover.media is defined %}<g:image_link>{{ product.cover.media.url }}</g:image_link>{% endif %}
<g:condition>new</g:condition>
<g:availability>
{%- if product.availableStock >= product.minPurchase and product.deliveryTime -%}
in_stock
{%- elseif product.availableStock < product.minPurchase and product.deliveryTime and product.restockTime -%}
preorder
{%- else -%}
out_of_stock
{%- endif -%}
</g:availability>
{% set price = product.calculatedPrice %}
{%- if product.calculatedPrices.count > 0 -%}
{% set price = product.calculatedPrices.last %}
{%- endif -%}

<g:price>{{ price.unitPrice|number_format(context.currency.itemRounding.decimals, '.', '') }} {{ context.currency.isoCode }}</g:price>
<g:brand>{{ product.manufacturer.translated.name|escape }}</g:brand>
<g:gtin>{{ product.ean }}</g:gtin>
<g:mpn>{{ product.manufacturerNumber }}</g:mpn>
<g:shipping>
    <g:country>DE</g:country>
    <g:service>Standard</g:service>
    {% if product.shippingFree  %}
    <g:price>0.00 {{ context.currency.isoCode }}</g:price>
    {% else %}
    <g:price>4.99 {{ context.currency.isoCode }}</g:price>
    {% endif %}
</g:shipping>

Hallo E-VS,
dieses Tag gibt die Google Kategorie 950 vor:

Viele Grüße
Markus

Ok Danke ich habe es geändert

Hi - hätte ich den Beitrag nur früher gesehen. Ich hatte praktisch alle Fehler die hier aufgezählt wurden.
Nun habe ich aber das Problem, dass die Image-Url einfach falsch ist. Also der Google Shopping Feed:
{%- if product.cover -%}
<g:image_link>{{ product.cover.media.url }}</g:image_link>
{%- endif -%}

exportiert warum auch immer falsche Image-Urls.

Habt ihr eine Idee woran das liegen kann ?

Danke im Voraus

Ich habe das jetzt mit einem Plugin gelöst da dort auch die Taxonomie mit dabei war

Hallo DrTrialandError007,
die Variable product.cover.media.url gibt die URL des Coverbildes des Produkts aus. Ein mögliche Erklärung wäre, dass Du Varianten betrachtest, aber keine Varianten exportierst. Ansonsten hast wirklich falsche Bildlinks gespeichert. Das ist ohne Prüfung aber schwer einzugrenzen.

Viele Grüße
Markus