kann Google Shopping Feed nicht exportieren

Hallo liebes Shopware Forum,

leider habe ich ein Problem mit der Veröffentlichung des Google Shopping Feeds.

Wenn ich auf das Blitz Symbol klicke, öffnet sich eine leere Seite und weiter passiert nichts.

In meiner LOG-Datei erhalte ich folgenden ERROR-Fehler:

SmartyCompilerException in /engine/Library/Smarty/sysplugins/smarty_internal_templatecompilerbase.php:657 Stack trace:
#0 /engine/Library/Smarty/sysplugins/smarty_internal_templateparser.php(3144): Smarty_Internal_TemplateCompilerBase->trigger_template_error()
#1 /engine/Library/Smarty/sysplugins/smarty_internal_templateparser.php(3209): Smarty_Internal_Templateparser->yy_syntax_error(10, ‘\xE2’)
#2 /engine/Library/Smarty/sysplugins/smarty_internal_smartytemplatecompiler.php(105): Smarty_Internal_Templateparser->doParse(10, ‘\xE2’)
#3 /engine/Library/Smarty/sysplugins/smarty_internal_templatecompilerbase.php(192): Smarty_Internal_SmartyTemplateCompiler->doCompile(’{foreach $sArti…’)
#4 /engine/Library/Smarty/sysplugins/smarty_internal_template.php(187): Smarty_Internal_TemplateCompilerBase->compileTemplate(Object(Enlight_Template_Default))
#5 /engine/Library/Smarty/sysplugins/smarty_internal_templatebase.php(155): Smarty_Internal_Template->compileTemplateSource()
#6 /engine/Shopware/Core/sExport.php(1210): Smarty_Internal_TemplateBase->fetch(‘string:{foreach…’, 1)
#7 /engine/Shopware/Controllers/Backend/Export.php(133): sExport->executeExport(Resource id
#769)
#8 /engine/Shopware/Controllers/Backend/Export.php(69): Shopware_Controllers_Backend_Export->generateExport(‘php://output’)
#9 /engine/Library/Enlight/Controller/Action.php(193): Shopware_Controllers_Backend_Export->indexAction()
#10 /engine/Library/Enlight/Controller/Dispatcher/Default.php(549): Enlight_Controller_Action->dispatch(‘indexAction’)
#11 /engine/Library/Enlight/Controller/Front.php(222): Enlight_Controller_Dispatcher_Default->dispatch(Object(Enlight_Controller_Request_RequestHttp), Object(SwagCookieConsentManager\Services\EnlightResponseCookieModified))
#12 /engine/Shopware/Kernel.php(215): Enlight_Controller_Front->dispatch()
#13 /vendor/symfony/http-kernel/HttpCache/HttpCache.php(486): Shopware\Kernel->handle(Object(Symfony\Component\HttpFoundation\Request), 1, true)
#14 /engine/Shopware/Components/HttpCache/AppCache.php(268): Symfony\Component\HttpKernel\HttpCache\HttpCache->forward(Object(Symfony\Component\HttpFoundation\Request), true, NULL)
#15 /vendor/symfony/http-kernel/HttpCache/HttpCache.php(253): Shopware\Components\HttpCache\AppCache->forward(Object(Symfony\Component\HttpFoundation\Request), true)
#16 /engine/Shopware/Components/HttpCache/AppCache.php(105): Symfony\Component\HttpKernel\HttpCache\HttpCache->pass(Object(Symfony\Component\HttpFoundation\Request), true)
#17 /var/www/vhosts/schrauben-seimatec.de/httpdocs/shopware.php(122): Shopware\Components\HttpCache\AppCache->handle(Object(Symfony\Component\HttpFoundation\Request))
#18 {main}

Leider kenne ich mich mit diesen Dingen nicht aus und möchte deshalb fragen, ob mir hier jemand behilflich sein kann.

Vielen Dank vorab und beste Grüße

Marc

Wie sieht die Einstellung bei den ProduktExporten aus? Template?

Hi,

ich habe schon verschiedene Templates probiert, aber alles mit geichem Ergebnis. Es öffnet sich immer eine leere Seite…
Momentan ist folgendes im Einsatz:
 

 {assign var=”string” value=$sArticle.articleID|articleImages:$sArticle.ordernumber:2:”##”|escape}
 {assign var=”productVariantImage” value=”##”|explode:$string}
 {strip}
    {$sArticle.ordernumber|escape}{#S#}
    {$sArticle.name|strip_tags|strip|truncate:80:”…”:true|htmlentities|escape}{#S#}
    {$sArticle.description_long|strip_tags|html_entity_decode|trim|regex_replace:”#[^\w.%&-+]#iu”:””|strip|truncate:500:”…”:true|htmlentities|escape}{#S#}
    {$sArticle.articleID|link:$sArticle.name}{if $sArticle.additionaltext}?number={$sArticle.ordernumber}{/if}{#S#}
    {$productVariantImage[0]}{#S#}
    {$sArticle.supplier|escape}{#S#}
    {if $sArticle.ean}yes{else}no{/if}{#S#}
    {$sArticle.ean|escape}{#S#}
    {$sArticle.suppliernumber|escape}{#S#}
    {$sArticle.price|replace:”,”:”.”}{” EUR”}{#S#}
    {if $sArticle.esd}Auf Lager
    {elseif $sArticle.instock>0}Auf Lager
    {elseif $sArticle.releasedate && $sArticle.releasedate|strtotime > $smarty.now}Vorbestellt
    {elseif $sArticle.shippingtime}Auf Lager
    {else}Nicht auf Lager{/if}
    {/strip}{#L#}

Danke und beste Grüße
Marc

uff, da ergeben sich in meinem Kopf mehr Fragezeichen. Am besten zeig ich mal wie ich das mache:

Dateiname: export.txt

Formatierung: UTF-8 , TXT mit Tab als Trennzeichen

Kopfzeile:

{strip}
id{#S#}
title{#S#}
description{#S#}
link{#S#}
image_link{#S#}
gtin{#S#}
brand{#S#}
mpn{#S#}
condition{#S#}
price{#S#}
shipping{#S#}
availability
{/strip}{#L#}

Template:

{if $sArticle.active == true 
&& $sArticle.description_long != ''
&& $sArticle.description_long != NULL
&& $sArticle.image
&& !$sArticle.lastock 
&& $sArticle.ean}{strip}
{$sArticle.ordernumber|escape}{#S#}
{$sArticle.name|strip_tags|strip|trim|truncate:150:"...":true|escape|regex_replace:"#[^\w\.%&\-+ \|]#iu":""|replace:";":","|escape}{#S#}
{$sArticle.description_long|strip_tags|html_entity_decode|trim|regex_replace:"#[^\wöäüÖÄÜß\.%&-+]#i":""|strip|truncate:500:"...":true|htmlentities|escape}{#S#}
{$sArticle.articleID|link:$sArticle.name|escape}{#S#}
{$sArticle.image|image:1}{#S#}
{$sArticle.ean|escape}{#S#}
{$sArticle.supplier|escape}{#S#}
{$sArticle.suppliernumber|escape}{#S#}
New{#S#}
{$sArticle.price|escape:"number"|replace:",":"."} EUR{#S#}
DE{#S#}
{if $sArticle.instock}in_stock{else}out_of_stock{/if}
{/strip}{#L#}{/if}

 

Ich muss aber dazu sagen, dass ich denk Export umschreibe für diverse Produktexportfeeds (Preisvergleiche, Facebook… nur Google habe ich noch keine Zeit gehabt).

Ein Beispiel ist: ich lege in den Shop-Root einen export Ordner an. In diesem speicher ich direkt aus der Datenbank  mit Hilfe von PHP (/geheim/meinexport.php) die txt/CSV-Datei. Diese rufe ich mit direkt oder mit Cronjob auf.

Der export von Shopware hat seine Grenzen und dessen Cache ist unlogisch bzw kann den Server dermassen in die Knie zwingen, dass es abbricht und der Datensauer die Artikel gar nicht oder nur zum Teil bekommt. Hier ein Beispiel für Preisvergleich -Export. Ausserdem ist das folgende Beispiel 2 Sekunden statt > 8min mit Shopware. bei ca 30K Artikeln.

 '')
                THEN CONCAT(sad.shippingtime,' Tage')
           WHEN (sad.shippingtime IS NULL
               OR sad.shippingtime = '')
           AND sad.instock <= 0
               THEN '5 Tage'
           WHEN (sad.shippingtime IS NULL
               OR sad.shippingtime = '')
           AND sad.instock > 0
           AND saa.lager_nme = 1
               THEN '1-3 Tage'
           WHEN (sad.shippingtime IS NULL
               OR sad.shippingtime = '')
           AND sad.instock > 0
           AND saa.lager_nme
                THEN '5 Tage'
           ELSE '21 Tage'
       END AS Lieferzeit,        
       sad.ean AS EAN,
       sc.description AS Produktkategorie,
       LOWER(CONCAT('https://EXAMPLE.DE/',scru.path)) AS Deeplink,
       CONCAT('https://EXAMPLE.DE/media/image/',
           SUBSTRING(MD5(CONCAT('media/image/thumbnail/',sai.img,'_600x600.jpg')),1,2),
           '/',
           SUBSTRING(MD5(CONCAT('media/image/thumbnail/',sai.img,'_600x600.jpg')),3,2),
           '/',
           SUBSTRING(MD5(CONCAT('media/image/thumbnail/',sai.img,'_600x600.jpg')),5,2),
           '/',
           sai.img,'_600x600.jpg') AS Bilderlink
FROM s_articles_details AS sad 
INNER JOIN s_articles_attributes AS saa ON saa.articledetailsID = sad.id
INNER JOIN s_articles AS sa ON sa.id = sad.articleID
INNER JOIN s_articles_supplier AS sas ON sas.id = sa.supplierID
INNER JOIN s_articles_categories AS sac ON sac.articleID = sa.id
INNER JOIN s_categories AS sc ON sc.id = sac.categoryID
INNER JOIN s_articles_prices AS sap ON sap.articleID = sa.id
INNER JOIN s_core_tax AS sct ON sct.id = sa.taxID
INNER JOIN s_articles_img AS sai ON sai.articleID = sa.id AND sai.main = 1
INNER JOIN s_core_rewrite_urls AS scru ON scru.org_path = CONCAT('sViewport=detail&sArticle=',sa.id)
WHERE sad.active = 1 AND saa.toppreise = 1 AND sad.laststock = 0 LIMIT 100000";

    $conn = $pdo->prepare($query);
    $conn->execute();
    $result = $conn->fetchAll();

//print_r($result);
    $file = "d78802e82970c20bcbc45f4adaeb205e.csv";
    $folder = "/var/www/clients/client1/web1/web/export/";
    $fp = fopen($folder.$file, 'w');
    fputs($fp, $bom =( chr(0xEF) . chr(0xBB) . chr(0xBF) ));
    fputs($fp,"Artikelnummer;Hersteller;Herstellernummer;Artikelbezeichnung;Preis;Versandkosten;Lieferzeit;EAN;Produktkategorie;Deeplink;Bilderlink\n");
    foreach($result as $single){
        fputs($fp, '"'
            . $single['Artikelnummer'].'";"'
            . $single['Hersteller'].'";"'
            . $single['Herstellernummer'].'";"'
            . $single['Artikelbezeichnung'].'";"'
            . $single['Preis'].'";"'
            . $single['Versandkosten'].'";"'
            . $single['Lieferzeit'].'";"'
            . $single['EAN'].'";"'
            . $single['Produktkategorie'].'";"'
            . $single['Deeplink'].'";'
            . $single['Bilderlink']."\n");
    }




}catch(PDOException $e){
    echo $e->getMessage() . $e->getCode();
}

 

Guten Morgen Reinhard,

erst einmal besten Dank für deine Bemühungen.

Leider funktioniert dein Code auch nicht. Es öffnet sich wieder eine leere Seite (URL: about:blanc) und anschliessend ein Fenster, wo Firefox fragt, wie man mit der Datei verfahren soll. Gebe ich an: “öffnen im Editor”, öffnet sich eine Textdatei mit den Kopfzeilen als Inhalt. So war es auch bei allen anderen Versuchen, welche ich gestartet habe.

Das Template, welches ich zuerst oben veröffentlicht hatte, habe ich nach langer Sucherei im Internet gefunden mit einer Schritt für Schritt Anleitung. Ich fand diese Datei ideal, weil ich weder eine gtin noch eine mpn in meinen Daten hinterlegt habe und diese Vorlage diese Angaben für Google wohl unterdrückt. Hier einmal der Link zu dem Template: Google Shopping Feed in Shopware einrichten - SEO-Küche

Auch habe ich Null Ahnung, wie man aus der Datenbank heraus etwas in eine externe Datei speichert. Dafür bräuchte ich eine verständliche Anleitung…

Schönen Sonntag und beste Grüsse

Marc

Ohne EAN an Google exportieren… ich weiss nicht ob das noch geht. In meinem Beispiel habe ich  z.b. auch nach Artikel Description, Bild, Artikel aktiv, Artikel nicht abverkauf und Artikel EAN abgefragt weil das Google Shopping voraussetzt.

Wenn die Kopfzeile ausgegeben wird, funktioniert schonmal ein Teil.

Geh am besten mal Schritt für Schritt jede Variable durch.

Versuce mal imTemplate:

{strip}
{$sArticle.ordernumber|escape}{#S#}
-{#S#}
-{#S#}
-{#S#}
-{#S#}
-{#S#}
-{#S#}
-{#S#}
-{#S#}
-{#S#}
-{#S#}
-
{/strip}{#L#}

Und wenn das klappt gehst fügst du immer eine neue Variable hinzu, 

Hallo,

 

ich habe folgendes was super geht und alles drin hat was Google so will :slight_smile:

 

Formatierung:
Zeichenkodierung: utf-8
Dateiformat: txt mit Tab als Trennzeichen

Kopfzeile:
{strip}
gender{#S#}
age_group{#S#}
größe{#S#}
farbe{#S#}
google_produktkategorie{#S#}
promotion_id{#S#}
id{#S#}
titel{#S#}
beschreibung{#S#}
link{#S#}
bild_url{#S#}
ean{#S#}
marke{#S#}
mpn{#S#}
zustand{#S#}
produktart{#S#}
preis{#S#}
unit_pricing_base_measure{#S#}
unit_pricing_measure{#S#}
versand{#S#}
währung{#S#}
item_group_id{#S#}
menge{#S#}
verfügbarkeit
{/strip}{#L#}

Template:
{strip}
unisex {#S#}
adult {#S#}
{$sArticle.attr7|escape}{#S#}
schwarz {#S#}
{$sArticle.attr4|escape}{#S#}
{$sArticle.attr5|escape}{#S#}
{$sArticle.ordernumber|escape}{#S#}
{$sArticle.name|strip_tags|strip|trim|truncate:60:"…":true|escape} {$sArticle.additionaltext|escape} {if $sArticle.referenceunit && $sArticle.purchaseunit}{assign var=“sArticleReferenceprice” value=$sArticle.price/$sArticle.purchaseunit*$sArticle.referenceunit}({$sArticleReferenceprice|escape:“number”}/{$sArticle.referenceunit}{$sArticle.unit}€){/if}{#S#}
{$sArticle.description_long|strip_tags|strip|trim|truncate:500:"…":true|escape}{#S#}
{$sArticle.articleID|link:$sArticle.name|escape}{#S#}
{$sArticle.image|image:4}{#S#}
{$sArticle.ean|escape}{#S#}
{$sArticle.supplier|escape}{#S#}
{$sArticle.suppliernumber|escape}{#S#}
Neu {#S#}
{$sArticle.articleID|category:" > "|escape}{#S#}
{$sArticle.price|escape:“number”}{#S#}
{if $sArticle.referenceunit && $sArticle.purchaseunit}
{assign var=“sArticleReferenceprice” value=$sArticle.price/$sArticle.purchaseunit*$sArticle.referenceunit}
{$sArticle.referenceunit} {$sArticle.unit}{#S#}
{$sArticle.purchaseunit} {$sArticle.unit}{#S#}
{else}
{#S#}{#S#}
{/if}
DE::DPD:{$sArticle|@shippingcost:“prepayment”:“de”}{#S#}
EUR {#S#}
{$sArticle.additionaltext|escape}{#S#}
{$sArticle.instock}{#S#}
{if $sArticle.esd}Auf Lager
{elseif $sArticle.instock>0}Auf Lager
{elseif $sArticle.releasedate && $sArticle.releasedate|strtotime > $smarty.now}Vorbestellt
{elseif $sArticle.shippingtime}Auf Lager
{else}Nicht auf Lager{/if}
{/strip}{#L#}

 

Grüße 

Matthias

 

Hallo,

besten Dank für die hilfreiche Unterstützung. Leider funktioniert gar nichts, egal welchen Code ich nehme. Ich vermute jetzt mal ganz stark, dass mir irgendein Plugin in die Quere kommt. Was sagt denn oben eingefügte ERROR LOG-Datei aus? Ich blicke als Laie da nicht durch, aber vielleicht kann mir dazu jemand was sagen, der mehr Ahnung hat…

Beste Grüße

Marc