Neu Eigene Funktion in NOVA schreiben

wespread.online

Gut bekanntes Mitglied
29. September 2020
136
13
Also wenn ich laut der Dokumentation: https://docs.jtl-shop.de/de/latest/...cks.html#eigene-smarty-funktionen-integrieren

im Child-Template in Bootstrap.php folgende Funktion schreibe:

PHP:
class Bootstrap extends \Template\NOVA\Bootstrap
{
    public function getPI($precision)
    {
        $iterator = 1;
        $factor   = -1;
        $nenner   = 3;

        for ($i = 0; $i < $precision; $i++) {
            $iterator = $iterator + $factor / $nenner;
            $factor   *= -1;
            $nenner   += 2;
        }

        return $iterator * 4;
    }
}

und in Template nutze:
PHP:
{getPi(12)}

dann bekomme ich folgende Fehler:

"{getPi(12)}" unknown function 'getPi'
 

FMoche

Moderator
Mitarbeiter
15. Dezember 2014
1.369
347
Halle (Saale)
Kann es sein, dass du den Artikel nicht ganz zu Ende gelesen hast? Der Teil mit
Code:
$this->getSmarty()->registerPlugin(Smarty::PLUGIN_FUNCTION, 'getPI', [$this, 'getPI']);

fehlt in deinem Codebeispiel jedenfalls und die Fehlermeldung lässt darauf schließen, dass die Smarty-Funktion nicht registriert wurde.
 

wespread.online

Gut bekanntes Mitglied
29. September 2020
136
13
Ich bekomme trotzdem ein Fehler, genau bei dieser Zeile:

Fatal error: Uncaught Error: Class 'Template\NOVAChild\Smarty' not found in / shop/templates/NOVAChild/Bootstrap.php:14 Stack trace: #0 /shop/includes/src/Smarty/JTLSmarty.php(126): Template\NOVAChild\Bootstrap->boot() #1 /shop/includes/src/Smarty/JTLSmarty.php(76): JTL\Smarty\JTLSmarty->initTemplate() #2 /shop/includes/src/Smarty/JTLSmarty.php(203): JTL\Smarty\JTLSmarty->__construct(false, 'frontend') #3 /shop/includes/smartyInclude.php(2): JTL\Smarty\JTLSmarty::getInstance() #4 in /shop/templates/NOVAChild/Bootstrap.php on line 14
 

wespread.online

Gut bekanntes Mitglied
29. September 2020
136
13
Hallo,

danke erstmal für das schnelle Feedback. Aber ich bekomme dann wieder ein Fehler, dass z.B. {container} nicht kompiliert werden kann (Syntax Error). Könntet ihr mal das testen, ein eigenes Funktion in Child-Template zu erstellen?
 

wespread.online

Gut bekanntes Mitglied
29. September 2020
136
13
Wenn ich den boot() function deaktviere, dann funktioniert es wieder. Ich glaub nicht, dass es bei Namespace liegt.

PHP:
<?php declare(strict_types=1);

namespace Template\NOVAChild;

use Smarty;

/**
* Class Bootstrap
* @package Template\NOVAChild
*/

class Bootstrap extends \Template\NOVA\Bootstrap
{
    public function boot(): void
    {
        try {
            $this->getSmarty()->registerPlugin(Smarty::PLUGIN_FUNCTION, 'getPI', [$this, 'getPI']);
        } catch (\SmartyException $e) {
            throw new \RuntimeException('Problems during smarty instantiation: ' . $e->getMessage());
        }
    }
    public function getPI($precision)
    {
        $iterator = 1;
        $factor   = -1;
        $nenner   = 3;
        for ($i = 0; $i < $precision; $i++) {
            $iterator = $iterator + $factor / $nenner;
            $factor   *= -1;
            $nenner   += 2;
        }
        return $iterator * 4;
    }
}
 

wespread.online

Gut bekanntes Mitglied
29. September 2020
136
13
Code:
Fatal error: Uncaught --> Smarty Compiler: Syntax error in template "templates/NOVA/layout/index.tpl" on line 19 "{container}" unknown tag 'container' <-- thrown in /includes/vendor/smarty/smarty/libs/sysplugins/smarty_internal_templatecompilerbase.php on line 19

das hat aber nichts mit dem Namespace zu tun. wenn ich den boot() funktion hinzufüge kommt das.
 

wespread.online

Gut bekanntes Mitglied
29. September 2020
136
13
Also ich krieg das nicht hin, und ich glaube es auch nicht, dass ich der einzige bin, dass sowas nicht checken wird.
Wir schreiben jetzt seit 3 Tagen hin und her, und kommen nicht auf eine Lösung. Ihr habt auch nicht eine vernüftige Dokumentation, damit ein Entwickler was anfangen kann.

Ist es einfach so schwer, ein snippet in Dokumentation zu machen, oder ein Funktion in dem Child-Template von NOVA in gitlab hinzuzfügen.

Wie soll den diese Community wachsen? Ihr als JTL, müsst ein bisschen über den Tellerrand hinausschauen. Ihr entwickelt ein Software in Jahr 2020, sagt dass JTL internationalisiert wird, und es gibt immer noch deutsche-Begriffe im Quellcode. Wann soll denn sowas internationalisert werden in Shop6, im Jahr 2060?
 

wespread.online

Gut bekanntes Mitglied
29. September 2020
136
13
Code:
public function boot(): void
    {
        parent::boot();
        try {
            $this->getSmarty()->registerPlugin(Smarty::PLUGIN_FUNCTION, 'getPI', [$this, 'getPI']);
        } catch (\SmartyException $e) {
            throw new \RuntimeException('Problems during smarty instantiation: ' . $e->getMessage());
        }
    }

nächste Fehler: "{getPi(12)}" unknown function 'getPi'
 

wespread.online

Gut bekanntes Mitglied
29. September 2020
136
13
Danke für die Hilfe.

Auf jedem fall beachtet ihr auch das gleiche Fehler von dem Template Dokumentation. Ich habs einfach von der Doku copy/paste genommen.
 

wespread.online

Gut bekanntes Mitglied
29. September 2020
136
13
Also ich sehe, dass ihr die Dokumentation auch aktualisiert habt... Aber ich kann immer noch kein eigene Funktion in Child-Template nutzen.
Ich bekomme folgende Fehler:
Fatal error: Uncaught --> Smarty Compiler: Syntax error in template "/templates/NOVAChild/page/index.tpl" on line 5 "{getPI(12)}" unknown function 'getPI' <-- thrown in /includes/vendor/smarty/smarty/libs/sysplugins/smarty_internal_templatecompilerbase.php on line 5
 

FPrüfer

Moderator
Mitarbeiter
19. Februar 2016
1.881
529
Halle
Sorry und Danke für deine Geduld... :oops: Die Doku hat an der Stelle offensichtlich noch "Schwächen".

Die getPI-Funktion sollte besser so aussehen:
PHP:
public function getPI($args)
{
    $precision = $args['precision'];
    $iterator  = 1;
    $factor    = -1;
    $nenner    = 3;

    for ($i = 0; $i < $precision; $i++) {
        $iterator = $iterator + $factor / $nenner;
        $factor   *= -1;
        $nenner   += 2;
    }

    return $iterator * 4;
}
Und der Aufruf im Template sollte natürlich den Regeln für Smarty-Funktionen folgen...
PHP:
{getPI precision=12}
 

Ähnliche Themen