32

小枝でJSONをデコードすることは可能ですか?グーグルはこれについて何ももたらさないようです。TwigでJSONをデコードしても意味がありませんか?


Symfony2のエンティティフィールドタイプ(エンティティフィールドタイプ)の2つのエンティティプロパティにアクセスしようとしています。

以前の2つのSO質問(「property」または「__ toString()」に代わるSymfony2エンティティフィールドタイプ?およびSymfony 2 2つのプロパティを持つエンティティフォームフィールドの作成)に出くわした後、カスタマイズされた文字列を取得するための追加のメソッドをエンティティに追加することを提案しましたエンティティ属性ではなく、オブジェクトインスタンスを表すJSON文字列を返すことを考えました(そして実際に返しました)。

エンティティクラスのどこか:

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

そしてその形で(のようなもの):

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

json_decodeその後、 Twigでそれを望んでいました...

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

6 に答える 6

42

小枝を伸ばせば簡単です。

まず、拡張子を含むクラスを作成します。

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

次に、そのクラスをServices.xmlファイルに登録します。

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

次に、小枝テンプレートで使用します。

{% set obj = form_label(category) | json_decode %}
于 2013-01-24T15:33:37.967 に答える
7

上記のすべてに代わるもの。
そして、これが最適な解決策であるかどうかはわかりませんが、機能します

1)ヘルパー関数を作成し、その関数を登録します。

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


2)この関数をtwigファイルで使用します。

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

{% for r is res %}
    {{ r }}
{% endfor %}
于 2015-01-16T11:35:15.930 に答える
6

JSONにアクセスする方法を思いついたので、他の人に役立つ場合に備えて、ここで共有したいと思いました。

したがって、私の場合、mysql dbから返されるレコード(レイアウト)はおそらく10個あり、各行には、json文字列であるpropertiesというフィールドがあります。したがって、レコードを簡単に引き出して、次のようにテンプレートに送信できます。

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

これまでのところ良いですが、小枝で{%for layout in layouts%}を実行すると、プロパティフィールドアイテムはまだjson文字列であるため、アクセスできません。

したがって、$ layoutsをtwigテンプレートに渡す直前に、次のことを行いました。

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

これを行うことで、jsonデコードされたオブジェクトを含む'decoded'というオブジェクト内にオンザフライで変数を作成しました。

これで、テンプレートで{{layout.decoded.whatever}}によってjsonアイテムにアクセスできるようになりました。

これは少しハッキーかもしれませんし、良い解決策を考えている人にとってはそうではありません。私は私にとってうまく機能し、オーバーヘッドはほとんどなく、テンプレートに到達する前に作業をしているときに小枝を伸ばすことをいじる必要がないことを意味します。

于 2013-06-07T14:25:14.570 に答える
4

Symfony2.8または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'),
        ];
    }
}
于 2016-01-07T18:27:10.687 に答える
1

これは古い質問ですが、レコードのソリューションを追加しています...SimpleFunctionでTwigを拡張するだけです。

// 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);

使用法:

Twigレンダリングを呼び出す前に、a_json_variableを文字列'["1"、 "2"、 "3"、 "4"、"5"]'に設定します。

小枝テンプレート:

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

生産します

The values are: 1, 2, 3, 4, 5
于 2017-11-29T19:12:31.530 に答える
0

私の場合、エンティティにJsonArrayがあり、エンティティにメソッドを追加しました

<?php
namespace ACME\DefaultBundle\Entity;
/*...*/    
public function getDecodedPath()
{
    return json_decode($this->path);
}
于 2016-04-04T07:42:21.920 に答える