Я использую Symfony2 и пытаюсь использовать ветку для вывода данных в формате XML. Вместо того, что происходит, ветка просто бросает массивный блок текста в браузер, только когда щелкнул правой кнопкой мыши, чтобы посмотреть исходник, я могу видеть хорошо выложенный XML.
Есть ли способ заставить Twig фактически выводить отформатированный XML вместо блока текста без необходимости просмотра источника страницы …?
<?xml version="1.0" encoding="UTF-8"?> <urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9"> <url> {% for entry in sitemapresp %} <loc>{{ entry['url'] }}</loc> <lastmod>{{ entry['date'] }}</lastmod> <changefreq>{{ entry['frequency'] }}</changefreq> <priority>{{ entry['priority'] }}</priority> {% endfor %} </url> </urlset>
Выход из браузера:
http://www.sitemappro.com/2015-01-27T23:55:42+01:00daily0.5http://www.sitemappro.com/download.html2015-01-26T17:24:27+01:00daily0.5
Выход источника:
<?xml version="1.0" encoding="UTF-8"?> <urlset xmlns="http://www.google.com/schemas/sitemap/0.90"> <url> <loc>http://www.sitemappro.com/</loc> <lastmod>2015-01-27T23:55:42+01:00</lastmod> <changefreq>daily</changefreq> <priority>0.5</priority> </url> <url> <loc>http://www.sitemappro.com/download.html</loc> <lastmod>2015-01-26T17:24:27+01:00</lastmod> <changefreq>daily</changefreq> <priority>0.5</priority> </url> </urlset>
Какие-либо предложения..?
Если вам нужна страница для XML, вам нужно будет указать тип содержимого ответа.
$response = new Response($this->render('sitemap.xml.twig')); $response->headers->set('Content-Type', 'application/xml; charset=utf-8'); return $response;
Если вы хотите, чтобы часть страницы отображала код на странице HTML, используйте:
{% autoescape %} <?xml version="1.0" encoding="UTF-8"?> <urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9"> <url> {% for entry in sitemapresp %} <loc>{{ entry['url'] }}</loc> <lastmod>{{ entry['date'] }}</lastmod> <changefreq>{{ entry['frequency'] }}</changefreq> <priority>{{ entry['priority'] }}</priority> {% endfor %} </url> </urlset> {% endautoescape %}
Сторона контроллера:
$response = new Response(); $response->headers->set('Content-Type', 'xml'); return $this->render( 'Bundle:Controller:sitemap.xml.twig', array( 'param1' => $param1,// ... ), $response );
Вы должны отобразить только представление, чтобы отправить его в ответ.
$response = new Response($this->renderView('sitemap.xml.twig')); $response->headers->set('Content-Type', 'application/xml; charset=utf-8'); return $response;
Поэтому замените $this->render(...)
на $this->renderView(...)
HTTP/1.0 200 OK Cache-Control: no-cache....
исчезнет