ページ: 1
RSS2.0の方は出力されているのですが,RSS0.91の方がダメです。
それでxml-rss.phpの中を見てみたら
ob_start();
selectSkin('xmlrss');
selector();
$feed = ob_get_contents();
ob_end_clean();
という風に書いてあります。想像するにxmlrssというスキンを呼び出しているのかなあと思ったのですが(ちなみにxml-rss2.phpの方はselectSkin('feeds/rss20'); となっていました),このスキンは見当たりません。どうしたらいいんでしょう?
ちなみに,何をやろうとしているかというと,GREEというソーシャル・ネットワーキングのサイトで,自分のBlogのURLを入れておくと,自動的に見出しを取ってくる機能があるんです。今はRSS2.0の方を指定しているのですが,自動的に取ってくれず,どこを変えたらいいのか,調査しているのです。ちゃんと取れているサイトはRSS0.91になっているようなので,取りあえずそちらを試してみようとしてはまりました。
もし,ほかにGREE試してみたい方がいらっしゃったらメールください。
オフライン
昔はあった「xmlrss」という名前のスキンののデフォ状態は
<?xml version="1.0" encoding="ISO-8859-1"?>
<!DOCTYPE rss PUBLIC "-//Netscape Communications//DTD RSS 0.91//EN" "http://my.netscape.com/publish/formats/rss-0.91.dtd">
<rss version="0.91">
<channel>
<title><%blogsetting(name)%></title>
<link><%blogsetting(url)%></link>
<description><%blogsetting(desc)%></description>
<docs>http://backend.userland.com/rss091</docs>
<language>en</language>
<image>
<url><%adminurl%>nucleus2.gif</url>
<title><%blogsetting(name)%></title>
<link><%blogsetting(url)%></link>
</image>
<%blog(xmlrss,10)%>
</channel>
</rss>
です。
で、ここで指定している「xmlrss」という名前のテンプレートは、アイテムの本体部分が
<item>
<title><%syndicate_title%></title>
<link><%blogurl%>?itemid=<%itemid%></link>
<description><%syndicate_description%></description>
</item>
で、あとは日付フォーマットが%xで時刻フォーマットが%xです。
それぞれの名前のスキンとテンプレートを上記内容で新しく作成すれば普通にxml-rss.phpが使えると思います。
あ、もちろん、日本語サイトの場合は、xml-rss2.php同様$feedをechoする前に文字コード変換が必要だし、例えばUTF-8吐出しするのなら、スキンの先頭の文字コード宣言もUTF-8に変更しなくては正常に吐き出しません。
nakahara21
http://nakahara21.com/
(ただいま調整中です)
オフライン
あと、私が勝手に作ったRSS1.0バージョンもあったので貼付けておきます。
<?xml version="1.0" encoding="UTF-8"?>
<rdf:RDF xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:sy="http://purl.org/rss/1.0/modules/syndication/" xmlns:admin="http://webns.net/mvcb/" xmlns="http://purl.org/rss/1.0/" xml:lang="ja">
<channel rdf:about="<%blogsetting(url)%>">
<title><%blogsetting(name)%></title>
<link><%blogsetting(url)%></link>
<description><%blogsetting(desc)%></description>
<dc:language>ja</dc:language>
<items>
<rdf:Seq>
<%blog(rdfli,10)%>
</rdf:Seq>
</items>
</channel>
<%blog(xmlrss1,10)%>
</rdf:RDF>
テンプレート「rdfli」のアイテム本体部分
<rdf:li rdf:resource="http://xx.nakahara21.net/item-<%itemid%>.html" />
テンプレート「xmlrss1」のアイテム本体部分
<item rdf:about="http://xx.nakahara21.net/item-<%itemid%>.html">
<title><%syndicate_title%></title>
<link><%blogurl%>index.php?itemid=<%itemid%></link>
<description><%syndicate_description%></description>
<dc:subject><%category%></dc:subject>
<dc:creator><%author%></dc:creator>
<dc:date><%date(rfc822)%></dc:date>
</item>
もちろん、サイトURL直接指定しちゃっているので該当部分は修正しないとダメですけど
あと、このitem-**.htmlもmod-rewite技のヤツですけど。
nakahara21
http://nakahara21.com/
(ただいま調整中です)
オフライン
まみおさん,素早いご返事ありがとうございます。
どうやら1.0がよさそうなので,1.0版使わせていただきました。
参考までに,まみおさんが書いていたものから,変更した点を書いておきます。
1. xml-rss.phpで文字コードを変換していたのをしないように変更(元々utf-8なので)。
2. テンプレート「rdfli」のアイテム本体部分を汎用的な形(FancyURL利用)に変更。
<rdf:li rdf:resource="<%blogurl%>item/<%itemid%>" />
3. テンプレート「xmlrss1」のアイテム本体部分を汎用的な形(FancyURL利用)に変更。
<item rdf:about="<%blogurl%>item/<%itemid%>">
<title><%syndicate_title%></title>
<link><%blogurl%>item/<%itemid%></link>
<description><%syndicate_description%></description>
<dc:subject><%category%></dc:subject>
<dc:creator><%author%></dc:creator>
<dc:date><%date(rfc822)%></dc:date>
</item>
少なくとも形式的には,ほかのサイトで出しているのと同じになったような気がします。
後は自動的に認識してくれるのを期待するだけ
まみおさん,重ね重ねありがとうございました。
オフライン
まみおさん,重ね重ねありがとうございました。
うまくいって何よりです。
...が、私が書いた不親切なコメントを読んで汎用型に修正できて(しかもきちんと形を残して)いるのに、0.91 or 1.0 タイプのfeedにつまずかれるってちょっと不思議
nakahara21
http://nakahara21.com/
(ただいま調整中です)
オフライン
という風に書いてあります。想像するにxmlrssというスキンを呼び出しているのかなあと思ったのですが(ちなみにxml-rss2.phpの方はselectSkin('feeds/rss20'); となっていました),このスキンは見当たりません。どうしたらいいんでしょう?
2.5CVSの途中か3.0RCあたりからRSS2.0とATOM0.3に絞っちゃったので、
RSS0.91のスキンは無くなっていたと記憶しています。どのあたりかははっきりと
思い出せませんが・・・。おそらくAndyさんがインストールされた時期が過渡期に
あたるのだろうと推測されます。混乱を招く結果になって申し訳ない限りです :cry:
#後ほどRSS0.91と1.0のスキンファイルをアップロードしておきます
オフライン
2.5CVSの途中か3.0RCあたりからRSS2.0とATOM0.3に絞っちゃったので、
RSS0.91のスキンは無くなっていたと記憶しています。どのあたりかははっきりと
思い出せませんが・・・。おそらくAndyさんがインストールされた時期が過渡期に
あたるのだろうと推測されます。混乱を招く結果になって申し訳ない限りです :cry:
なるほど,そういう事情があったのですね。納得です。でもRSS2.0は1.0の上位互換というわけでもないので,1.0をなくしてしまうのはちょっと解せない気もします。
...が、私が書いた不親切なコメントを読んで汎用型に修正できて(しかもきちんと形を残して)いるのに、0.91 or 1.0 タイプのfeedにつまずかれるってちょっと不思議
そんなもんです :? 。というか,自分で作るより,ここで聞いたほうが早いだろうなと思って。案の定でした 。
オフライン
なるほど,そういう事情があったのですね。納得です。でもRSS2.0は1.0の上位互換というわけでもないので,1.0をなくしてしまうのはちょっと解せない気もします。
3つもいれるとややこしいと思ったのかもしれませんね。
Karma氏は明らかにATOMがお気に召しているようですが。
てことで、0.91と1.0スキンは別途に配布するようにしておきました。
非FancyURL仕様で、htmlタグを取り除いた抜粋表示を行います。
#1.0スキンはまみおさんのをほぼそのまま使ってます。ありがと~
http://japan.nucleuscms.org/bb/viewtopic.php?t=318
オフライン
RSS1.0で生成されたのを見ていて何か変だなあと思ったら,日付のフォーマットが妙でした。一つはローカルの時間であるアイテムの日時に対し,サーバーのロケールで処理していること,それとiso8601でサーバーのタイムゾーンとして表示しているにもかかわらず,時間がGMT(しかもサーバーのロケールから換算されたもの)になっていること。
以上を勘案すると次のようなコードにすべきかと思います(globalfunctions.phpの中)。
function formatDate($format, $timestamp, $defaultFormat) {
global $blogid, $manager;
$blog =& $manager->getBlog($blogid);
$boffset= $blog->getTimeOffset() * 3600;
$offset = date('Z', $timestamp) + $boffset;
switch ($format) {
case 'rfc822' :
if ($offset >= 0) $tz = '+';
else { $tz = '-'; $offset = -$offset;}
$tz .= sprintf("%02d%02d",floor($offset / 3600),round(($offset % 3600)/60));
return date('D, j M y H:i:s ', $timestamp) . $tz;
case 'rfc822GMT' :
$timestamp -= $offset;
return date('D, j M y H:i:s ', $timestamp) . 'GMT';
case 'utc' :
$timestamp -= $offset;
return date('Y-m-d\TH:i:s\Z', $timestamp);
case 'iso8601' :
if ($offset >= 0) $tz = '+';
else { $tz = '-'; $offset = -$offset;}
$tz .= sprintf("%02d:%02d",floor($offset / 3600),round(($offset % 3600)/60));
return date('Y-m-d\TH:i:s', $timestamp) . $tz;
default :
return strftime($format ? $format : $defaultFormat,$timestamp);
}
}
オフライン
RSS1.0で生成されたのを見ていて何か変だなあと思ったら,日付のフォーマットが妙でした。一つはローカルの時間であるアイテムの日時に対し,サーバーのロケールで処理していること,それとiso8601でサーバーのタイムゾーンとして表示しているにもかかわらず,時間がGMT(しかもサーバーのロケールから換算されたもの)になっていること。
以上を勘案すると次のようなコードにすべきかと思います(globalfunctions.phpの中)。
この辺、すごく悩んで置き去りにしていたことを思い出しました。
で、コードを読んで考えていたのですが、なんかひっかかったんですよね(処理結果がおかしいという意味ではなく)。
で、ひとつ思い出しました。
このfunctionを呼び出している方、BLOG.phpの
function parse_date($format = '') {
echo formatDate($format, $this->currentItem->timestamp, $this->template['FORMAT_DATE']);
}
のところ、
echo formatDate($format, $this->getCorrectTime($this->currentItem->timestamp), $this->template['FORMAT_DATE']);
としてやれば、switchより前が不要になりますよね。
たぶん、ほかにも$this->getCorrectTime()していない箇所がいくつかあるんだろうなぁ。TrackBackでさえしていなかったし。
追記:
と書いたものの、全然違うことに気付きました :oops:
今、混乱中。
nakahara21
http://nakahara21.com/
(ただいま調整中です)
オフライン
このfunctionを呼び出している方、BLOG.phpの
function parse_date($format = '') { echo formatDate($format, $this->currentItem->timestamp, $this->template['FORMAT_DATE']); }
のところ、
echo formatDate($format, $this->getCorrectTime($this->currentItem->timestamp), $this->template['FORMAT_DATE']);
としてやれば、switchより前が不要になりますよね。
getCorrectTimeの仕事はサーバーのタイムゾーンからローカルのタイムゾーンへの換算ですよね。
アイテムのタイムスタンプはローカルタイムに変換されて保存されているので,それをgetCorrectTimeする必要はないと思います。
ざっと見たところ,getCorrectTimeを引数付きで呼んでいるのはクッキーのところなので,クッキーはサーバータイムで保存しているようですが,後は全部引数なしで呼んでいるので,現在のローカルの時間を取るために使っているということですよね。
formatDateの中で$offsetを出しているのはGMTからの時差をフォーマット中で使うのと,正しいGMTを算出するのが目的なので,省略できません。
僕もずい分悩んだのですが,とどのつまり,問題はPHPのdate関数がサーバーのロケールでフォーマットしてしまうことにあるので,formatDateで吸収してやるしかないと思います。
オフライン
ini_get('safe_mode')がFALSEなら
putenv("TZ=Asia/Tokyo");
とか
putenv('TZ=JST-9');
とか書けるみたいですね。
誰でもできる訳ではないので使えないですけど :cry:
nakahara21
http://nakahara21.com/
(ただいま調整中です)
オフライン
ini_get('safe_mode')がFALSEなら
putenv("TZ=Asia/Tokyo");
とか
putenv('TZ=JST-9');
とか書けるみたいですね。誰でもできる訳ではないので使えないですけど :cry:
これは便利ですねえ(使っちゃっていいのなら)。
昨日さんざん探して見つからなかったのですが,UNIXの機能を使っているわけですね。
ブログの設定も本当はサーバーとの時差じゃなくてタイムゾーンで指定できると楽なのですが
(そうすると今度は,DSTを使っている地域の人は面倒なんだろうなあ)。 :cry:
オフライン
もろ体調管理失敗して帰宅後即おねむ生活を送っているFelです。
#いつもながら季節の変わり目に弱いなあ・・・自己管理見直さないと
本家へのご報告ありがとうございました>Andyさん
差し支えなければ、アップデート時に取り込んでおきます。
オフライン
ページ: 1