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);
}
}
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?
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):
<?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.
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?