JSON Datei im Theme laden und decodieren

Hallo zusammen,

versuche seit mehreren Stunden erfolglos, mittels TWIG eine JSON Datei zu Laden und mittels „json_decode“ zu decodieren.

Das Laden der Datei habe ich hinbekommen, wird aber natürlich unverarbeitet ausgegeben.
Ich hab diverse möglichkeiten versucht, das ganze über meinen Theme mit einen eigenen „TwigFilter“ zu realisieren, leider klappt das aber nicht.

mein Aktueller Code im Theme:

MYTHEME\src\Twig\JsonDecodeExtension.php

<?php

namespace MyTheme\Twig;

use Twig\Extension\AbstractExtension;
use Twig\TwigFilter;

class JsonDecodeExtension extends AbstractExtension
{
    public function getFilters()
    {
        return [
            new TwigFilter('json_decode', [$this, 'jsonDecodeFilter']),
        ];
    }

    public function jsonDecodeFilter(string $json, bool $assoc = false)
    {
        return json_decode($json, $assoc);
    }
}

in der service.xml habe ich folgendes stehen:

<?xml version="1.0" ?>

<container xmlns="http://symfony.com/schema/dic/services"
           xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
           xsi:schemaLocation="http://symfony.com/schema/dic/services http://symfony.com/schema/dic/services/services-1.0.xsd">

    <services>
        <service id="MYTHEME\Twig\JsonDecodeExtension" />
    </services>
</container>

Sobald ich noch {{ json_file|json_decode(true) }} nutze, bekomme ich die Meldung ob ich nicht „json_encode“ meine.

Jemand Idee was da falsch läuft?

Ohne inhaltlich den Code angesehen zu haben, hast du das ganze innerhalb eines normalen Plugins getestet? Auch wenn Theme und Plugin (nahezu) identisch sind, ich habe aus Erfahrung schon gegenteiliges erlebt.

Der Fehler deutet ja klar darauf hin, dass die Funktion nicht erkannt wurde. Hast du bin/console plugin:refresh und bin/console cache:clear gemacht?

Moin!

Eine genaue Fehlerursache kann ich nicht sagen. Ich habe allerdings ebenfalls mal so einen zusätzlichen Filter geschrieben (rein zufällig ebenfalls json_decode), daher teile ich gerne meinen Code (v6.4 getestet, v6.5 ungetestet):

sw-root/custom/plugin/MyTheme/src/Resources/config/services.xml

...
<!-- Twig extensions -->
<service id="Company\MyTheme\Storefront\Twig\Extension\JsonDecodeTwigExtension" public="true">
  <tag name="twig.extension"/>
</service>
...

sw-root/custom/plugin/MyTheme/src/Storefront/Twig/Extension/JsonDecodeTwigExtension.php

<?php declare(strict_types=1);

namespace Company\MyTheme\Storefront\Twig\Extension;

use Symfony\Component\Config\Definition\Exception\Exception;
use Twig\Extension\AbstractExtension;
use Twig\TwigFilter;

class JsonDecodeTwigExtension extends AbstractExtension
{
  /**
   * Declare custom twig filter.
   *
   * @return TwigFilter[] TwigFilter array.
   */
  public function getFilters()
  {
    return [
      'myfilter' => new TwigFilter('theme_json_decode', [$this, 'ThemeJsonDecode']),
    ];
  }

  /**
   * Decode and return given JSON string.
   *
   * @param string $string JSON as string
   * @return string Filtered html
   */
  public static function ThemeJsonDecode(string $json): string
  {
    $result = json_decode($json);

    if (false === $result) {
      throw new Exception('Failed to decode JSON');
    }

    // String seems to be no JSON, so we return the original string
    if (null === $result) {
      return $json;
    }

    return $result;
  }
}

Ich habe in meinen Code noch „json_encode“ in „theme_json_encode“ umbenannt, um sicherzustellen, dass der Theme-eigene Twig-Filter genutzt wird. Auch, wenn „json_encode“ zwar aktuell nicht existiert, wollte ich Fehler vermeiden, falls es in irgendeinem Update doch mal hinzu kommen sollte.

Hoffe, der Code hilft Dir und anderen Suchenden :slight_smile:

LG;LA

Hey danke für die Rückmeldung…

mit deinem Code erhalte ich die Fehlermeldung…

Hab deine PHP Datei abgelegt unter: SHOPWAREROOT/custom/plugins/MYTheme/src/Twig/Extension abgelegt.
Die services.xml liegt in SHOPWAREROOT/custom/plugins/MYTheme/src/Resources/config

Den Namespace habe ich angepasst auf: MYTheme\Twig\Extension;

Jetzt erhalt ich folgende Meldung:

Attempted to load class „JsonDecodeTwigExtension“ from namespace „MyTheme\Twig\Extension“. Did you forget a „use“ statement for another namespace?

Ehrlich gesagt mit den „namespace“ umgebung bin ich noch recht am anfang, habe bisher immer ohne programmiert… Wo liegt hier der Fehler?

Twig ist aber nicht dein NS, sondern twigs. Daher muss es Twig/Twig lauten.

Hallo zusammen,

danke euch für eure Hilfe.
MIt dem Code „littleAmused“ und einem eigenen Plugin konnte ich das Problem lösen.