Я хочу иметь URL-адрес, который возвращает простой объект JSON. Я пытаюсь использовать Twig для создания объекта JSON:
{ "urls": [ {% for child in page.root %} "{{ child.url }}"{% if not loop.last %},{% endif %} {% endfor %} ] }
Возврат каретки не останется на месте, и я продолжаю получать результат, который выглядит следующим образом:
{'urls':['../ants/','../brick-report/','../the-pollution-intervention/','../barclay/','../broken-advertising/','../aldat-n-densom/','../thisisart/','../there-she-goes-again/']}
который JQuery не будет анализировать с помощью методов ajax или getJSON. Это полностью игнорирует этот JSON. Как я могу убедить Twig поставить правильные пробелы? Я просмотрел инструкцию, и мне кажется, что это НЕ касается вставки пробелов.
Это работает для меня (шаблон ветки):
var parsedJSON = JSON.parse('{{ ['one', 'two', 'three']|json_encode|e('js') }}');
И что:
console.log(parsedJSON);
выведет:
Array ["one", "two", "three"]
в консоли FF.
Не используйте Twig для генерации вашего json-ответа.
В вашем контроллере используйте:
return new Response(json_encode($var));
Образец:
public function sampleAction() { $urls = array('../test', '../something', '../sample'); return new Response(json_encode($var)); }
Если URL-адреса генерируются из маршрутов Symfony2, вы можете использовать:
public function sampleAction() { $urls = array( $this->generateUrl('my_test'), $this->generateUrl('my_something'), $this->generateUrl('my_sample'), ); return new Response(json_encode($var)); }
Для этого у Twig есть фильтр.
json_encode , он использует функцию PHP json_encode.
для вашего дела:
{{ {'urls': page.root}|json_encode }}
выйдет
{"urls":["..\/ants\/","..\/brick-report\/","..\/the-pollution-intervention\/","..\/barclay\/","..\/broken-advertising\/","..\/aldat-n-densom\/","..\/thisisart\/","..\/there-she-goes-again\/"]}
код проверен и работает. Для получения дополнительной информации взгляните на документацию Twig для json_encode .
Это легко, если вы расширяете веточку.
Во-первых, создайте класс, который будет содержать расширение:
<?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); } }
В принципе метод $ .getJson () требует json, но ther является строкой, поэтому вы можете использовать $ .get () для получения ответа и использовать синтаксический анализатор для анализа строки в JSON
$.get("ffff",function(data){ // user parser JSON.parse(); });