Generování nevalidního RSS

Upozornění: Tohle vlákno je hodně staré a informace nemusí být platné pro současné Nette.
James_Scott
Člen | 55
+
0
-

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
+
0
-

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
+
0
-

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
+
0
-

Nemáš náhodou někde v projektu BOM? Pokud ne, jak vypadá vygenerovaná šablona (kdesi v temp/cache/_Nette.FileTemplate/…)?

James_Scott
Člen | 55
+
0
-

..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
+
0
-

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
+
0
-

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
+
0
-

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
+
0
-

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.