Neu Einsteigerfragen Plugin Entwicklung bzw. Ausgabe im Template

HannesD.

Aktives Mitglied
14. März 2021
14
0
Hallo zusammen,

ich will (vorerst) im Template eine SQL-Abfrage machen, um dann das daraus erzeugte Array im Footer darzustellen:

Bootstrap.php
... public function getLatestOrders() { $query = " SELECT ...... "; $latestOrders = Shop::Container()->getDB()->query($query,2); Shop::Smarty() ->assign('latestOrdersS', $latestOrders ); Shop::dbg($latestOrders); ...

footer.tpl
... {getLatestOrders} ...

jetzt erhalte ich folgendes Array:
Bootstrap.php:77 array(3) { [0]=> object(stdClass)#12727 (6) { ["kArtikel"]=> string(5) "53203" ["nAnzahl"]=> string(6) "1.0000" ["cSEO"]=> string(28) "Testartikel" ["cName"]=> string(28) "Testartikel" ["dErstellt"]=> string(19) "2022-08-18 18:25:31" ["cOrt"]=> string(9) "Testort" } ...

Wie kann ich nun auf die einzelnen Arrayinhalte bzw. die darin enthaltenen Objekte per Smarty zugreifen?
Laut Debugger scheint eine Smartyvariable $latestOrdersS als Array mit Inhalt einer StdClass vorhanden zu sein. Ein {$latestOrdersS[0]->kArtikel} wirft jedoch folgende Warnung: "Undefined array key "latestOrdersS""

Vielleicht denke ich auch zu kompliziert. Ich will eigentlich nur eine DB-Abfrage machen und die Ergebnisse im Footer ausgeben. Gibt es da eine geschmeidigere Möglichkeit?
 

css-umsetzung

Offizieller Servicepartner
SPBanner
6. Juli 2011
8.496
2.616
Berlin
Firma
css-umsetzung
Verwendest du ein Child Template?

Hast du dir im Nova mal die plugin.php angeschaut, so solltest du das machen.

Funktion anmelden. Nutzen und dann die Variable ausgeben.

Mit {$variable|dump} kannst du dir variablen im Template schön anzeigen lassen.
 

HannesD.

Aktives Mitglied
14. März 2021
14
0
Verwendest du ein Child Template?

Hast du dir im Nova mal die plugin.php angeschaut, so solltest du das machen.

Funktion anmelden. Nutzen und dann die Variable ausgeben.

Mit {$variable|dump} kannst du dir variablen im Template schön anzeigen lassen.
Vielen Dank für deine rasche Antwort :)

Ja es ist ein Child Template.

Ich weise die Variable vorerst direkt im Bootstrap zu:
Shop::Smarty() ->assign('latestOrdersS', $latestOrders );
(Laut Docs die bevorzugte Methode: https://jtl-devguide.readthedocs.io...gramming_tips/shopclass.html?highlight=assign)

Laut debugger Plugin scheint das auch zu funktionieren:
template1.png

im Footer kann ich trotzdem nicht darauf zugreifen.
{getLatestOrders} {$latestOrdersS|dump}
Gibt NULL zurück:
template2.png
Sicher nur eine Kleinigkeit, ich komme aber echt nicht drauf.
 

HannesD.

Aktives Mitglied
14. März 2021
14
0
Okay, ich habe wohl ein Verständnisproblem mit den Smarty functions.

meine Function in der bootstrap.php lautet getLatestOrders()

wenn ich jetzt in der footer.tpl {getLatestOrders} eintrage, werden die Variablen zwar laut Debug Plugin als Smarty-Variablen gelistet, ich bekomme aber in der footer.tpl keinen Zugriff drauf.
 

css-umsetzung

Offizieller Servicepartner
SPBanner
6. Juli 2011
8.496
2.616
Berlin
Firma
css-umsetzung
also zuerst musst du die Funktion ja registrieren

PHP:
$this->getSmarty()->registerPlugin(Smarty::PLUGIN_FUNCTION, 'getLatestOrders', [$this, 'getLatestOrders']);

und dann hast du die Funktion:

PHP:
public function getLatestOrders($params = array(), &$smarty)    {

    // hier kommt mein code
    $deinIhhalt = "dieses hier ist mein  Inhalt";
    
    if(!empty($params['assign'])) {
        $smarty->assign($params['assign'],$deinInhalt);
    } else {
        return $deinInhalt;
    }
}

so in der Art sollte es schon aussehen und du rufst das dann aus dem Template heraus so auf:

Code:
{getLatestOrders assign='latestOrdersS'}

dann sollte {$latestOrdersS} jetzt meinen Inhalt haben.
 
  • Gefällt mir
Reaktionen: frankw75

HannesD.

Aktives Mitglied
14. März 2021
14
0
Hallo css-umsetzung,

vielen Dank, dass du dich des Themas angenommen hast. Leider stehe ich hier noch immer auf dem Schlauch.

Ich habe in der Bootstrap.php des NOVA Child-Templates die Funktion registriert:

PHP:
<?php declare(strict_types=1);
namespace Template\meintemplate;
use Smarty;
use Shop;
/**
 * Class Bootstrap
 * @package Template\meintemplate
 */
class Bootstrap extends \Template\NOVA\Bootstrap
{
    /**
     * @inheritdoc
     */
    public function boot(): void
    {
        parent::boot();
        // whatever you do, always call parent::boot() or delete this method!
        try {
            $this->getSmarty()->registerPlugin(Smarty::PLUGIN_FUNCTION, 'getLatestOrders', [$this, 'getLatestOrders']);
        } catch (\SmartyException $e) {
            throw new \RuntimeException('Problems during smarty instantiation: ' . $e->getMessage());
        }
    }
    protected function registerPlugins(): void
    {
        parent::registerPlugins();
        // whatever you do, always call parent::registerPlugins() or delete this method!
    }
    public function getLatestOrders($params = array(), $smarty)    {
        global $smarty;   
        // hier kommt mein code
        //$deinInhalt = "dieses hier ist mein Inhalt";
        
        $deinInhalt = array(
            "test" => "antwort",
            "test2" => "antwort2",
        );
        if(!empty($params['assign'])) {
            $smarty->assign($params['assign'],$deinInhalt);
        } else {
            return $deinInhalt;
        }
    }


}
Ich habe in der fuction getLatestOrders das $smarty statt &$smarty gesetzt.

Meine meintemplate/layout/footer.tpl endet folgendermaßen:

<br>---<br> {getLatestOrders assign='latestOrdersS'} {$latestOrdersS.test} <br>---<br> {$latestOrdersS.test|dump} </body> </html> {/block}
Ich erhalte keine Ausgabe der Variablen. Das JTL Debug Plugin sagt aber:

Smartyvariablen- latestOrdersS : array (2) $latestOrdersS test : antwort $latestOrdersS.test test2 : antwort2 $latestOrdersS.test2

Folgende PHP (8.0) Warnings erhalte ich im TL Debug Plugin:
Undefined array key "latestOrdersS"
Attempt to read property "value" on null
Trying to access array offset on value of type null

Hätte ich noch Haare, würde ich sie mir gerade ausreißen :-/
 

Ähnliche Themen