php & fopen in tpl

Hallo, irgendwie kam ich bei den Beiträgen im Forum nicht weiter. Aktuell binde ich bestimmte Daten bei mir per iFrame im Shop ein. [quote] [/quote] Auf einer anderen Seite (nicht im Shop) hole ich mir diese Daten direkt in die Datenbank über den unten genannten Befehl. Etwas ähnliches möchte ich bei Shopware auch machen. Ich benutze folgenden Code: [quote]$fd = fopen („http://domain.de/lieferzeit.php?liefernummer=$ls_nr“, „r“); while (!feof($fd)) { $lieferzeit = fgetss($fd, 4096); $lieferzeit = preg_replace(’/-{2,}/’,’ ',$lieferzeit); } fclose($fd);[/quote] Mit diesem php Code bekomme ich einfach eine Zahl {$lieferzeit} raus. Genau diese Zahl möchte ich jetzt in einem .tpl einbinden, aber wie? Besser gesagt, soll $lieferzeit welche per php abgefragt wird, über smarty in einer .tpl Datei ausgegeben werden. Wenn ich den Code mit {php}{/php} einbinde, kommt eine Fehlermeldung.

{php} funktioniert nicht. Ich würde das ganze einfach simpel über ein smarty plugin lösen: http://www.smarty.net/docs/en/plugins.functions.tpl Seit Shopware 5 kannst du smarty Plugins direkt im Theme ablegen und dann in den .tpl Dateien ausgeben: https://developers.shopware.com/designe … ty-plugins Außerdem solltest du dir smarty Hinweise auch durchlesen: [quote]Do not embed PHP! This is by far the biggest mistake with Smarty templates. […] Experience has revealed that directly embedding PHP is not only unnecessary, it creates more problems than it solves.[/quote] Allerdings würde dein Code ja bei jedem Aufruf ausgeführt werden, ob das wiederum so sinnvoll ist musst du entscheiden.

Vielen Dank, jetzt habe ich auf jeden Fall schon mal eine Richtung wonach ich gehen kann. Eine Frage noch, ich muss in der PHP Abfrage in der URL die Artikelnummer mit anhängen, die im Shop mit {sArticle.ordernumber} abrufbar ist. Geht das dann so einfach, dass ich die Variable einfach in den Link einfüge wie in der .tpl? Bekomme ansonsten noch diesen Fehler [quote] Parse error: syntax error, unexpected ‘.’, expecting ‘}’ in /www/htdocs/test/shops/themes/Frontend/template/_private/smarty/function.colli.php on line 14[/quote] Line 14: [quote]$fd = fopen (“http://domain.de/colli.php?artnr={$sArticle.ordernumber}”, “r”);[/quote]

Hi, in Ergänzung zu kayyy: Wir haben mit dem “action”-Tag einen Mechanismus, mit dem du da auch arbeiten kannst. Dazu brauchst du zwar auch noch einen zusätzlichen Controller + Template - aber dafür kannst du dann da auch das Caching kontrollieren (e.g. abschalten oder Lagerbestand für 15 Minuten cachen etc). https://developers.shopware.com/develop … action-tag Alternativ wäre es noch dankbar, das über Javascript zu lösen. Da würde ich dann an der gewünschten Stelle einfach ein div packen, das als data-Attribut die aktuelle Artikelnummer bekommt. Mit der JS-Plugin-Basis kannst du das dann auslesen, den Lagerbestand vom anderen Server hohlen und in das div-Tag schreiben. Besten Gruß, Daniel

[quote=„kayyy“]{php} funktioniert nicht. Allerdings würde dein Code ja bei jedem Aufruf ausgeführt werden, ob das wiederum so sinnvoll ist musst du entscheiden.[/quote] Leider ja, ich rufe so die Daten direkt vom Hersteller ab, die können sich sehr spontan mal ändern… Ich würde diese Werte auch gerne in ein Freitextfeld bei dem Artikel eintragen lassen und per Cronjob das ganze einmal am Tag aktualisieren lassen, nur bin ich noch nicht so weit das hinzukriegen. Eins nach dem anderen.

[quote=“konsi”] Bekomme ansonsten noch diesen Fehler [quote] Parse error: syntax error, unexpected ‘.’, expecting ‘}’ in /www/htdocs/test/shops/themes/Frontend/template/_private/smarty/function.colli.php on line 14[/quote] Line 14: [quote]$fd = fopen (“http://domain.de/colli.php?artnr={$sArticle.ordernumber}”, “r”);[/quote][/quote] Hi, das funktioniert da etwas anders, die Smarty-Variablen funktionieren nur in Smarty-Templates, nicht im PHP-Teil der Smarty-Funktionen. Schau dir mal unsere Smarty-Funktionen im Core an, da siehst du, wie mit Parametern gearbeitet wird: engine/Library/Enlight/Template/Plugins Daniel

[quote=„Daniel Nögel“] Hi, das funktioniert da etwas anders, die Smarty-Variablen funktionieren nur in Smarty-Templates, nicht im PHP-Teil der Smarty-Funktionen. Schau dir mal unsere Smarty-Funktionen im Core an, da siehst du, wie mit Parametern gearbeitet wird: engine/Library/Enlight/Template/Plugins Daniel[/quote] Wäre auch zu schön gewesen :smiley: Mal gucken ob ich da eine Lösung finde, wie ich mir dann die Artikelnummer raussuchen kann…

Sorry aber ich komme einfach null klar… kann mir nochmal jemand einen Tipp geben wie ich an die Artikelnummer dran komme?! habe folgendes gefunden: [quote]$articleId = Shopware()->Front()->Request()->sArticle; $article = Shopware()->Modules()->Articles()->sGetArticleById($articleId); [/quote] wenn ich jetzt also in die url articleId eintrage, sollte er doch die artikelnummer eintrage?!

Ich habe jetzt mal so eine function.colli.php gemacht, aber es wird mir kein Wert ausgegeben :frowning: kann mir jemand bitte einen Tipp geben? Ich finde einfach nichts und irgendwie hat es bei mir noch kein Klick gemacht wie ich an die Daten dran komme… [quote]function smarty_function_colli($params, Smarty_Internal_Template $template) { $articleId = Shopware()->Front()->Request()->sArticle; $article = Shopware()->Modules()->Articles()->sGetArticleById($articleId); $fd = fopen („http://domain.de/colli.php?artnr=$article“, „r“); while (!feof($fd)) { $colli = fgetss($fd, 4096); $colli = preg_replace(’/-{2,}/’,’ ',$colli); } fclose($fd); return $colli; }[/quote] würde es denn sonst mit Shopware()->Db()-> gehen? Das ist so das einzige was ich noch gefunden habe im Forum, aber auch da finde ich nicht wirklich einen Ansatz im Moment…

*push* kann mir nicht jemand noch einen tipp geben? =/ ich weiß nicht wie ich es sonst lernen soll, wenn ich nicht selbst drauf komme…

Hallo,

lernen kann man die Entwicklung von Shopware Plugins entweder hierüber: Developer Guides oder indem man die entsprechenden Schulungen von Shopware besucht: https://de.shopware.com/support/academy/ (vorallem die Developer Training und Advanced Developer Training).

Nutzt du den Code innerhalb eines Plugins bzw. innerhalb eines Events? Hast du einmal probiert, mittels der View dran zu kommen? Soll es ein Backend- oder Frontend-Plugin sein?

Beste Grüße

Sebastian

Ich habe wie kayyy empfohlen hat ein smarty plugin geschrieben, mit folgendem Inhalt:

function smarty_function_colli($params, Smarty_Internal_Template $template)
{

$articleId = Shopware()->Front()->Request()->sArticle;
$article = Shopware()->Modules()->Articles()->sGetArticleById($articleId);


$fd = fopen ("http://domain.de/colli.php?artnr=$article", "r");
while (!feof($fd)) {
$colli = fgetss($fd, 4096);
$colli = preg_replace('/-{2,}/',' ',$colli);
}
fclose($fd);

return $colli;
}

wenn ich es richtig verstanden habe, müsste ich dann in der .tpl mit {colli} das Ergebnis dieser Abfrage abrufen können, es kommt aber nichts raus.

Vom logischen her, muss doch erstmal die Abfrage gestartet werden, dass die Artikelnummer abgefragt wird, diese wird dann in der Variable $article gespeichert. Dann kommt die Abfrage von der externen URL und der dort ausgegebene Wert sollte in der Variable $colli gespeichert sein und dann ausgegeben werden. Aktuell läuft das ganze wie gesagt über einen iFrame mit dem fopen, was seitens google natürlich nicht gerne gesehen wird und auch optisch nicht ganz so schön ist.

 

Und das ganze soll im Frontend angezeigt werden, direkt in der Artikelbeschreibung unter dem Preis.

Hi, 

ja, aber sGetArticleId gibt dir viel mehr zurück. Auch steht sArticle nicht auf jeder Seite zur Verfügung. Am besten die Inhalte der Variablen mal loggen, dann siehst du es. 

Daniel 

Ach mist, ich brauche ja gar nicht die articleId sondern die ordernumber…

 

jetzt kriege ich wenigstens mal eine Fehlermeldung =D

Fatal error: Call to undefined method Shopware_Proxies_sArticlesProxy::sGetArticleByordernumber() in /www/htdocs/shops/themes/Frontend/NAME/_private/smarty/function.colli.php on line 16
503 Service Unavailable

function smarty_function_colli($params, Smarty_Internal_Template $template)
{

$articleId = Shopware()->Front()->Request()->sArticle;
$article = Shopware()->Modules()->Articles()->sGetArticleByordernumber($articleId);



$fd = fopen ("http://domain.de/colli.php?artnr=$article", "r");
while (!feof($fd)) {
$colli = fgetss($fd, 4096);
$colli = preg_replace('/-{2,}/',' ',$colli);
}
fclose($fd);

return $colli;
}

ich teste jetzt mal weiter rum, vielleicht hat aber bis dahin jemand eine Lösung was ich in Zeile 16 ändern muss?

Hi,

du hast dich bei der Methode verschrieben - es ist nicht sGetArticleByordernumber, sondern sGetArticleIdByOrderNumber

Daniel

hatte es mit sGetArticleIdByOrderNumber auch versucht, ging aber nicht… es wird immer noch kein Wert ausgegeben.

Ich habe mal mit Firebug versucht zu gucken, ob ich irgendwie diese abfrage mir raussuchen kann, aber auch dazu finde ich nichts… weiß nicht wo ich jetzt noch suchen soll, um zu sehen ob die function.colli.php überhaupt was ausgibt =/

Hi,

„geht auch nicht“ ist ja gar nicht die Frage - vorher hattest du eine Exception - die müssen wir ja erstmal wegbekommen.

Auch ansonsten kannst du ja immer mit " error_log", „Shopware()->Pluginlogger()“ oder zur Not einfach " file_put_contents" schauen, was wo wann passiert. Ideal ist natürlich ein Debugger wie Xdebug. Für dein Vorgehen schaust du also erstmal, ob und was in Shopware()->Front()->Request()->sArticle drin steht, ob und was Shopware()->Modules()->Articles()->sGetArticleByordernumber($articleId) zurück gibt etc. Die While-Schleife kann man sich vll. mit einem file_get_contents komplett schenken, allow_url_fopen ist in Shopware ja eh vorausgesetzt.

Generell bin ich kein Fan, das auf diese Art zu machen - aber wenn es schon so sein muss, dann vll. eher so:

Template-Anpassung für Detailseite

{extends file='parent:frontend/detail/index.tpl'}


{block name='frontend_detail_data_ordernumber' prepend}
    
        
            InStock
        
        
            {callurl number={$sArticle.mainVariantNumber}}
        

    
{/block}

Smarty-Funktion:

Das macht jetzt einen Call gegen random.org und übergibt (nur als Beispiel) die Bestellnummer - das kannst du für deinen Zweck ja vll. anpassen. Vorteil hier ist, dass die Bestellnummer immer übergeben werden muss, anstatt sie auf gut Glück aus dem Request zu ziehen.

Eleganter wäre mMn wirklich ein Action-Tag oder JS; das hier ist ja schon eher Logik, die im Template (und das ist Smarty letztlich) nichts zu suchen hat. 

Daniel

1 „Gefällt mir“

Hi Daniel, vielen Dank für deine Mühe!

Ich werde das ganze mal in den nächsten Tagen wieder angehen.

Was ich noch nicht so richtig verstehe ist, warum es nicht möglich ist mit dem fopen etc. die Seite auszulesen und das in einer Variablen zu speichern?! In einem anderen System mache ich das tagtäglich, da ist der selbe Code einfach in der .php Datei drin, liest die Seite aus, es kommt eine Zahl raus, als Beispiel 2 und das wird dann direkt in die Datenbank übernommen.

Ich möchte ja nur, dass diese Zahl die am Ende rauskommt, in einer .tpl Datei angezeigt wird.

Aber ich versuche das ganze jetzt erstmal im laufe der Woche und gebe dann bescheid.

Hi,

fopen geht auch, aber es scheitert ja in deinem Beispiel schon allein „sGetArticleByOrdernumber“  - das gibt ja eben die ID zurück und nicht die Bestellnummer, die du ja anscheinend brauchst. Weiterhin finde ich fopen/fgetss mit all seinen Iterationen und Implikationen (willst du preg_replace(’/-{2,}/’,’ ',$colli); wirklich für jede Iteration ausführen oder soll das eigentlich außerhalb der Schleife stehen?) auch nicht so elegant (kann man aber sicher drüber streiten).

Shopware()->Front()->Request()->sArticle habe ich ja oben schon erwähnt, das  macht auch ziemlich viele Annahmen, die man vll. auch vermeiden kann.

Letztlich hätten wir auch deinen Ansatz „rund“ machen können - aber so ganz sicher scheinst du mir bei deinem Vorgehen ja auch nicht gewesen zu sein :slight_smile:

Ich denke, so wird es auch gehen :slight_smile:

Daniel

Irgendwie klappt es bei immer noch nicht…

Also bis jetzt habe ich es immer so gemacht in der detail/index.tpl

                                {* Product attribute Cbm *}
                                {block name='frontend_detail_data_attributes_attr5'}
                                        
                                            
                                                {s name="DetailCbm"}Cbm{/s}:
                                            
    
                                            
                                                                                    
                                            
                                        
                                {/block}

wenn ich da jetzt anstatt dem iframe deinen callurl befehl eintrage, kriege ich die Meldung Ups es ist ein fehler aufgetreten etc…

Wenn ich in der .php Datei return file_get_contents mache, kriege ich an der besagten Stelle folgende Meldung:

Fatal error: Call to undefined function smarty_function_Colli() in /www/htdocs/shops/var/cache/production_201601120732/templates/frontend_MSPOTKIDS_de_DE_1/06/fb/ec/06fbec7b9511073905fd349d4c9e09d6de713350.snippet.index.tpl.php on line 1081
503 Service Unavailable

 

ich weiß echt einfach nicht weiter :frowning:

wenn ich übrigens in der function eingebe return $fd; und das in der .tpl mit {colli} abfrage, bekomme ich folgendes Ergebnis: Resource id #1040