webentwicklung-frage-antwort-db.com.de

Dekodierung von JSON in Twig

Ist es möglich, JSON in Zweig zu dekodieren? Googeln scheint darüber nichts auszusprechen. Ist die Dekodierung von JSON in Twig nicht sinnvoll?


Ich versuche, auf zwei Entitätseigenschaften auf den Entitätsfeldtyp eines Symfony2 ( Entity Field Type ) zuzugreifen.

Nachdem Sie 2 vorherige SO - Fragen gefunden haben ( Symfony2-Entitätsfeldtyp-Alternativen zu "property" oder "__toString ()"? und Symfony 2) Erstellen Sie ein Entitätsformularfeld mit 2 Eigenschaften ), das vorgeschlagen wurde Wenn ich einer Entität eine zusätzliche Methode hinzufügte, um eine angepasste Zeichenfolge anstelle eines Entitätsattributs abzurufen, dachte ich (und tat es), eine JSON-Zeichenfolge zurückzugeben, die eine Objektinstanz darstellt.

Irgendwo in der Entitätsklasse:

/**
 * Return a JSON string representing this class.
 */
public function getJson()
{
   return json_encode(get_object_vars($this));
}

Und in der Form (so etwas):

$builder->add('categories', 'entity', array (
...
'property' => 'json',
...
));

Danach hoffte ich, es in Twig json_decode zu machen ...

{% for category in form.categories %}
    {# json_decode() part is imaginary #}
    {% set obj = category.vars.label|json_decode() %}
{% endfor %}
22
Czar Pino

Das ist einfach, wenn Sie Zweig verlängern .

Erstellen Sie zuerst eine Klasse, die die Erweiterung enthält:

<?php

namespace Acme\DemoBundle\Twig\Extension;

use Symfony\Component\DependencyInjection\ContainerInterface;  
use \Twig_Extension;

class VarsExtension extends Twig_Extension
{
    protected $container;

    public function __construct(ContainerInterface $container) 
    {
        $this->container = $container;
    }

    public function getName() 
    {
        return 'some.extension';
    }

    public function getFilters() {
        return array(
            'json_decode'   => new \Twig_Filter_Method($this, 'jsonDecode'),
        );
    }

    public function jsonDecode($str) {
        return json_decode($str);
    }
}

Dann registrieren Sie diese Klasse in Ihrer Services.xml-Datei:

<service id="some_id" class="Acme\DemoBundle\Twig\Extension\VarsExtension">
        <tag name="twig.extension" />
        <argument type="service" id="service_container" />
</service>

Dann verwenden Sie es in Ihren Zweigvorlagen:

{% set obj = form_label(category) | json_decode %}
35
Xocoatzin

Eine Alternative zu allen oben.
Und ich weiß nicht, ob dies die optimale Lösung ist, aber es funktioniert .

1) Erstellen Sie ein helper function und register diese Funktion.

<?php
function twig_json_decode($json)
{
    return json_decode($json, true);
}


2) Verwenden Sie diese Funktion in Ihrer twig-Datei .

{% set res = twig_json_decode(json) %}
# above will return an array which can be iterated

{% for r is res %}
    {{ r }}
{% endfor %}

Ich hatte einen Weg gefunden, zu meinem JSON zu gelangen, und ich dachte, ich würde es hier teilen, falls es jemandem helfen würde.

in meinem Fall habe ich vielleicht 10 Datensätze (Layouts) von einer Mysql-Datenbank zurückgegeben, und jede Zeile hat ein Feld namens Eigenschaften, das eine Json-Zeichenfolge ist. So kann ich die Datensätze einfach herausziehen und wie folgt an die Vorlage senden:

echo $twig->render('template.html.twig', array(
      "layouts" => $layouts,
));

So weit so gut. Wenn ich jedoch {% for layout in layouts%} in twig mache, gibt es keine Möglichkeit, zu den Eigenschaftenfeldelementen zu gelangen, da sie immer noch eine Json-Zeichenfolge sind.

Kurz bevor ich $ layouts an die twig-Vorlage übergeben habe, habe ich folgendes gemacht:

foreach($layouts as $i => $v)
{
      $layouts[$i]->decoded = json_decode($v->getProperties());
}

auf diese Weise habe ich eine Variable in meinem Objekt namens 'decoded' erstellt, die das json-decodierte Objekt enthält.

Nun kann ich in meiner Vorlage auf meine Json-Artikel zugreifen, indem Sie {{layout.decoded.whatever}}

Dies könnte etwas hackig sein und nicht für jedermann eine gute Lösung. Ich arbeite gut für mich, sehr wenig Aufwand und bedeutet, dass ich mich nicht mit dem Erweitern von Zweig beschäftigen muss, da ich die Arbeit erledige, bevor es an die Vorlage gelangt.

4
azzy81

Aktualisierter Code für Symfony2.8 oder Symfony3:

<?php

namespace Acme\DemoBundle\Twig\Extension;

use Symfony\Component\DependencyInjection\ContainerInterface;  
use \Twig_Extension;

class VarsExtension extends Twig_Extension
{
    protected $container;

    public function __construct(ContainerInterface $container) 
    {
        $this->container = $container;
    }

    public function getName() 
    {
        return 'some.extension';
    }

    // Note: If you want to use it as {{ json_decode(var) }} instead of 
    // {{ var|json_decode }} please use getFunctions() and 
    // new \Twig_SimpleFunction('json_decode', 'json_decode') 
    public function getFilters() {
        return [
            // Note that we map php json_decode function to 
            // extension filter of the same name
            new \Twig_SimpleFilter('json_decode', 'json_decode'),
        ];
    }
}
2
Chris Hasiński

Dies ist eine alte Frage, aber ich füge meine Lösung für das Protokoll hinzu ... Erweitern Sie Twig einfach mit einer SimpleFunction:

// Return a string of separated values from a JSON string
// Can optionally specify a separator.  If none provided, ", " is used.
$function = new Twig_SimpleFunction('json_to_list', function($json, $separator = ", ")
{
    $result = "";
    $array = json_decode($json, true);
    foreach ($array as $item)
    {
        if ($result != "") { $result .= $separator; }           
        $result .= $item;
    }
    return $result;
});
$twig->addFunction($function);

Verwendungszweck:

setzen Sie a_json_variable auf die Zeichenfolge '["1", "2", "3", "4", "5"]', bevor Sie das Rendern von Twig aufrufen.

Zweigvorlage:

The values are: {{ json_to_list(a_json_variable) }}

Wird herstellen

The values are: 1, 2, 3, 4, 5
0
Ryan Griggs

In meinem Fall habe ich einen JsonArray in meiner Entity, dann habe ich in meiner Entity eine Methode hinzugefügt

<?php
namespace ACME\DefaultBundle\Entity;
/*...*/    
public function getDecodedPath()
{
    return json_decode($this->path);
}
0
S.Alfano