Eigene Twig-Funktion in Shopware 6 Plugin erstellen

Stelle dir vor, du möchten während der Theme-Entwicklung ein PHP-Skript innerhalb des Twig-Templates aufrufen, um beispielsweise einen MD5-Hash zu erstellen. Für diese Fälle können wir unsere eigenen Twig-Funktionen erstellen.

In diesem Beispiel übergeben wir der Twig-Funktion einen String und erhalten als Rückgabewert den MD5-Hash.

Es wird nicht empfohlen, Twig-Funktionen zu verwenden, um Daten aus der Datenbank abzurufen. In diesen Fällen könnte ein DataResolver hilfreich sein.

Vorkenntnisse

Um eine eigene Twig-Funktion für dein Plugin zu erstellen, benötigst du zunächst ein Plugin als Basis. In der Shopware Dokumentation findest du eine Anleitung, wie du ein Plugin erstellst.

Twig-Funktion erstellen

Damit die Twig-Funktion funktioniert müssen wir zunächst ein paar Dateien erstellen. Genaugenommen nur 2 Dateien. Zum einen die PHP-Datei mit der Twig-Function selbst und die services.xml. Die services.xml wirst du wahrscheinlich schon haben.

Der Übersichtlichkeit halber erstellen wir im Ordner src einen Ordner namens Twig. Darin erstellen wir eine neue PHP-Datei. Die kannst du beliebig benennen.

Im Code beziehe ich mich auf die Beispiele aus der Shopware-Dokumentation. Sprich, du musst SwagBasicExample mit deinem Plugin-Namen ersetzen.

//<plugin root>/src/Twig/SwagCreateMd5Hash.php
<?php declare(strict_types=1);

namespace SwagBasicExample\Twig;

use Shopware\Core\Framework\Context;
use Twig\Extension\AbstractExtension;
use Twig\TwigFunction;

class SwagCreateMd5Hash extends AbstractExtension
{
    public function getFunctions()
    {
        return [
            new TwigFunction('createMd5Hash', [$this, 'createMd5Hash']),
        ];
    }

    public function createMd5Hash(string $str)
    {
        return md5($str);
    }
}

Selbstverständlich kannst du hier auch alles andere machen, was du mit PHP machen kannst. Du kannst also theoretisch auch Daten aus der Datenbank abrufen oder sonstige PHP-Logik verwenden.

Was jetzt noch fehlt, ist die services.xml. Wir müssen die Funktion im DI Container registrieren.

<!-- <plugin root>/src/Resources/config/services.xml -->
    <services>
        <service id="SwagBasicExample\Twig\SwagCreateMd5Hash" public="true">
            <tag name="twig.extension"/> <!--Required-->
        </service>
    </services>

Wenn das erledigt ist, kannst du die Twig-Funktion im Theme verwenden.

{{ createMd5Hash('Hello World') }}