Generování nevalidního RSS
- James_Scott
- Člen | 55
Ahoj, píšu si v Nette blog a narazil jsem na menší problém
s generováním RSS.
V šabloně mám
{contentType application/rss+xml; charset=utf-8}
<?xml version="1.0" encoding="UTF-8" ?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
<channel>
<title>Scottův blog</title>
<link>http://james-scott.cz</link>
<webMaster>admin@james-scott.cz (Pavel Müller)</webMaster>
<category>blog, IT, Linux, Windows, PHP, Microsoft</category>
<docs>http://backend.userland.com/rss</docs>
<lastBuildDate>{$date|date:'j. n. Y'}</lastBuildDate>
<atom:link href="http://james-scott.cz/rss/" rel="self" type="application/rss+xml" />
{foreach $posts as $item}
<item>
<title>{$item->title}</title>
<link>{link SinglePost:getPostUrl $item->id, $item->url}</link>
<guid>{link SinglePost:getPostUrl $item->id, $item->url}</guid>
<description>{$item->description}</description>
<pubDate>{$item->date |date:'j. n. Y'}</pubDate>
</item>
{/foreach}
</channel>
</rss>
Nemůžu najít co tam mám špatně? Potřebuju nakopnout..
- Michal Vyšinský
- Člen | 608
Vypadá to, že mu tam vadí ty prázdné znaky před <?xml
Zkus dát <?xml na řádek hned za {contentType}
- James_Scott
- Člen | 55
Právě jsem to zkusil, výsledek pořád stejný – jako by tam Nette generovalo to prázdné místo?
- jiri.pudil
- Nette Blogger | 1032
Nemáš náhodou někde v projektu BOM? Pokud ne, jak vypadá vygenerovaná šablona (kdesi v temp/cache/_Nette.FileTemplate/…)?
- Tirus91
- Člen | 199
@James_Scott jen mimo téma :)
Zde asi máš chybku – nesmyslně dle mého to tam vyhodí Err 500
- James_Scott
- Člen | 55
..jak najdu BOM? Zapnul jsem netisknutelné znaky, nic tam není..
tady je kód šablovny v cache:
<?php //netteCache[01]000371a:2:{s:4:"time";s:21:"0.33598000 1396291768";s:9:"callbacks";a:2:{i:0;a:3:{i:0;a:2:{i:0;s:19:"Nette\Caching\Cache";i:1;s:9:"checkFile";}i:1;s:49:"/var/www/blog/web/app/templates/Rss/default.latte";i:2;i:1396291766;}i:1;a:3:{i:0;a:2:{i:0;s:19:"Nette\Caching\Cache";i:1;s:10:"checkConst";}i:1;s:25:"Nette\Framework::REVISION";i:2;s:30:"80a7e46 released on 2013-08-08";}}}?><?php
// source file: /var/www/blog/web/app/templates/Rss/default.latte
?><?php
// prolog Nette\Latte\Macros\CoreMacros
list($_l, $_g) = Nette\Latte\Macros\CoreMacros::initRuntime($template, 'qmbt9mhdop')
;
// prolog Nette\Latte\Macros\UIMacros
// snippets support
if (!empty($_control->snippetMode)) {
return Nette\Latte\Macros\UIMacros::renderSnippets($_control, $_l, get_defined_vars());
}
//
// main template
//
$netteHttpResponse->setHeader("Content-Type", 'application/rss+xml; charset=utf-8') ?>
<<?php ?>?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
<channel>
<title>ScottĹŻv blog</title>
<link>http://james-scott.cz</link>
<webMaster>admin@james-scott.cz (Pavel MĂĽller)</webMaster>
<category>blog, IT, Linux, Windows, PHP, Microsoft</category>
<docs>http://backend.userland.com/rss</docs>
<lastBuildDate><?php echo Nette\Templating\Helpers::escapeXml($template->date($date, 'j. n. Y')) ?></lastBuildDate>
<atom:link href="http://james-scott.cz/rss/" rel="self" type="application/rss+xml" />
<?php $iterations = 0; foreach ($posts as $item): ?>
<item>
<title><?php echo Nette\Templating\Helpers::escapeXml($item->title) ?></title>
<link><?php echo Nette\Templating\Helpers::escapeXml($_control->link("SinglePost:getPostUrl", array($item->id, $item->url))) ?></link>
<guid><?php echo Nette\Templating\Helpers::escapeXml($_control->link("SinglePost:getPostUrl", array($item->id, $item->url))) ?></guid>
<description><?php echo Nette\Templating\Helpers::escapeXml($item->description) ?></description>
<pubDate><?php echo Nette\Templating\Helpers::escapeXml($template->date($item->date, 'j. n. Y')) ?></pubDate>
</item>
<?php $iterations++; endforeach ?>
</channel>
</rss>
- greeny
- Člen | 405
Zkus úplně vyřadit řádek s contentType a hlavičku poslat v presenteru
<?php
$this->getHttpResponse()->setHeader('ContentType', 'whatever');
?>
Pak ta šablona bude čistě jen xml kód a makra budou až vevnitř (kde by to nemělo vadit)
P.S.: Vypadá to že do výstupu se opravdu dostane prázdný řádek, viz tvůj příklad:
<?php
$netteHttpResponse->setHeader("Content-Type", 'application/rss+xml; charset=utf-8') ?> // na konci tohohle řádku již nejsme v PHP kontextu a vypíše se prázdný řádek
<<?php ?>?xml version="1.0" encoding="UTF-8"?>
?>
Editoval greeny (1. 4. 2014 1:10)
- James_Scott
- Člen | 55
Přesně tak, zkusil jsem nastavit hlavičku i v presenteru a výsledek
stejný.
Co mám v tom případě ale dělat? Můžu použít klasickou fci v PHP
header() ?
Tak ikdyž zkusim nastavit hlavičku pomocí header(), tak je to pořád stejný…
public function beforeRender() {
parent::beforeRender();
header('Content-Type: application/rss+xml; charset=utf-8');
}
Editoval James_Scott (1. 4. 2014 2:08)
- James_Scott
- Člen | 55
Tirus91 napsal(a):
@James_Scott jen mimo téma :)
Zde asi máš chybku – nesmyslně dle mého to tam vyhodí Err 500
Díky, už jsem to fixnul.
- James_Scott
- Člen | 55
Tak jsem si stáhnul verzi 2.1.x, vyzkoušel ten samý kód v sandboxu a
funguje to (nevkládá se prázdný řádek).
Tak budu muset updatovat verzi Nette na blogu… Díky za pomoc.