小枝でJSONをデコードすることは可能ですか?グーグルはこれについて何ももたらさないようです。 JSONをTwigでデコードするのは意味がありませんか?
Symfony2のエンティティフィールドタイプ( エンティティフィールドタイプ )の2つのエンティティプロパティにアクセスしようとしています。
前の2つに出会った後SO質問( 「プロパティ」または「__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 %}
extend twig であれば簡単です。
最初に、拡張子を含むクラスを作成します。
<?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>
次に、twigテンプレートで使用します:
{% set obj = form_label(category) | json_decode %}
代替上記すべて。
そして、これが最適なソリューションかどうかはわかりませんが、worksです。
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 %}
私は自分のJSONに到達する方法を考え出したので、他の人に役立つ場合に備えてここで共有すると思いました。
したがって、私の場合、mysql dbから10個のレコード(レイアウト)が返され、各行にはjson文字列であるpropertiesというフィールドがあります。そのため、レコードを簡単に引き出して、次のようにテンプレートに送信できます。
echo $twig->render('template.html.twig', array(
"layouts" => $layouts,
));
ここまでのところ、ただし、{=レイアウトのレイアウト%}をtwigで行うと、プロパティフィールドアイテムはまだjson文字列であるため、取得する方法がありません。
したがって、twigテンプレートに$ layoutsを渡す直前に、次のことを行いました。
foreach($layouts as $i => $v)
{
$layouts[$i]->decoded = json_decode($v->getProperties());
}
これを行うことで、JSONでデコードされたオブジェクトを含む「decoded」というオブジェクト内に、その場で変数を作成しました。
テンプレートで、{{layout.decoded.whatever}}でJSONアイテムにアクセスできるようになりました
これは少しハックが効くかもしれませんが、良い解決策を誰もが考えているわけではありません。私はうまく動作し、オーバーヘッドはほとんどありません。つまり、テンプレートに到達する前にImが作業を行うので、twigを拡張することについて混乱する必要はありません。
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'),
];
}
}
これは古い質問ですが、レコードにソリューションを追加しています... Twigを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);
使用法:
Twig render。)を呼び出す前に、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
私の場合、私はエンティティにJsonArrayを持っているので、エンティティにメソッドを追加しました
<?php
namespace ACME\DefaultBundle\Entity;
/*...*/
public function getDecodedPath()
{
return json_decode($this->path);
}