2010年3月6日土曜日

RSSをXMLにし、違う形のXMLに書換え TiltViewerで見せてみた


前から無料で気になっていたtiltviewer いつか使ってみたいと思っていました。

サンプルを落としてきたら、真黒なバックですが、貼り付けるhtmlをいじることによりバックの色の変更が可能です。#ffffffと書くところを、0xFFFFFF と書かないといけませんが…。 それなりにカスタマイズもできます。

xmlのデータは手で一生懸命に書いてもいいのですが、PHPを始めて5年ほど、むくむくと挑戦の気持ちがわいてまいりまして、
google calender のデータを表示させたのをヒントにこれもできるはずだと挑戦してみました。ロリポップのお手軽サイトはPHP5は使えません。そこで… (現在はphp5だけになり、こちらの方がいいと思います。

XMLライブラリーを使った方が早いのは知っていたけど、XML_unserializeの意味を私はわかってないので相変わらずの恥ずかしい質問をPHP pro でお世話になる。 ダンプするという意味もわかってないけど見よう見まねでxmlとなっている。


http://ikekumi.lovepop.jp/view/test3.php は文字化けしているが、これをutf-8で見てもらったら文字化けは解消する。
さらに、これを右クリックしてソースを見ることでXMLの構造が理解できる。

次につまづいたのが階層であるが、["rdf:RDF"]["item"] と書く。
最初[rdf][item] としていて全然出なかった。
$entry = $data["rdf:RDF"]["item"];
$count = count($entry);
とかして countすることで確認しながら試行錯誤で認識!

itemごとに複数の写真が入っており、それぞれの写真に対してデータを書くのをどうしたらいいのかちょっと考えました。
おばさん45歳!この熱心さが受験勉強の時代に欲しかったです。 幸か不幸か、本当に子どももいないので、もうパズルみたいで楽しくてたまらず土曜日1日やってしまいました! これがADHDの力でしょう。

utf-8で記述します。
<?php
//XMLライブラリーを引っ張ってきます
require_once('xml.php');
//ぶろぐんのrssのアドレス
$rdf_url = "http://ikekumi.lovepop.jp/bg/?mode=rss&c=6";

//rssの内容を抜出すファンクションをもらってきた
function getURL( $pURL ) {
$_data = null;
if( $_http = fopen( $pURL, "r" ) ) {
while( !feof( $_http ) ) {$_data .= fgets( $_http);}
fclose( $_http );}
return( $_data );}
//XML
$_rawData = getURL($rdf_url);
//簡単に
$data = XML_unserialize($_rawData);
//写真を抜き出すパターンを設定します。
$pattern ='!imgs+srcs*=s*"http://ikekumi.lovepop.jp/bg/files/(d+).JPG".+?/!i';
//写真などが入っているのはrdfの次の階層のitemです。
$entry = $data["rdf:RDF"]["item"];
//$entryの数を数えます。この場合は10と出ますが、titleなどの要素が入っていないものもあります。
$count = count($entry);
//配列を準備します
$title=array();
$link =array();
$descs=array();
//エントリーの数だけ配列にいれろ!
for($i=0; $i<$count; $i++){
array_push($title,$entry[$i]["title"]);
array_push($link,$entry[$i]["link"]);
$desc=str_replace(" ","",$entry[$i]["description"]);//空白を削除asciiはstr_replaceです。
array_push($descs,$desc);
//写真の配列$photosを準備します
$photos[$i] =array();
//写真の$i番目のコンテント要素を$photoと宣言し、
$photo =$entry[$i]['content:encoded'];
//$photoからパターンを抜き出す
preg_match_all($pattern,$photo,$matches);
//$photosにマッチした要素の2番目のものを追加していく
array_push($photos[$i],$matches[1]);
//マッチした数を数えて、その数だけxml要素を出力していく
$pcount=count($matches[1]);
for($s=0; $s<$pcount; $s++){
print("<photo imageurl="http://ikekumi.lovepop.jp/bg/files/".$photos[$i][0][$s].".JPG" linkurl="".$link[$i]."">");
print("<title>".$title[$i]."</title>");
print("<description>".$descs[$i]."</description>");
print("</photo>");
}
}
?>
</photos>


これに上下に
<tiltviewergallery>
<photos>
などxml要素を入れてxmlの形式にする。今回descriptionの要素は空白文字が抜けれないのと表示を少しでも軽くするためにスルーした。 またまたPHP proで全角スペースの削除方法を教えてもらう。マルチバイト文字というものを初めて認識。

できあがった.phpファイルを.xmlで保存してアップする。
.htaccess を準備し、
# 全てのPHPコードをHTMLのように作成する
AddType application/x-httpd-php .xml
を書き込み、phpでもxmlで表示できるようにする。

***後日、ロリポップの仕様が変更になりまして上記の記述ではなく、
<Files 変更したいファイル名>
SetHandler php5.2-script
</Files>
になります。 

さらに、このサイトは池田久美.jpという日本語ドメインを使っているのですが、それだと表示されないので、
さらに.htaccessに

RewriteEngine on
RewriteCond %{HTTP_HOST} ^xn--3iqu74en7fm7k\.jp
RewriteRule (.*) http://ikekumi.lovepop.jp$1 [R=301,L]
と書いてリダイレクトを設定して完成した。

一番難しかったのは、$photos[$i][0][$s] という要素が写真の番号になることを調べたこと。
段階的にプログラムを書いて絞り込んでいくことで書けた。 我ながら本当によく頑張った。
まだまだphp proの質問を眺めても半分もわからないけど。 上には上がいるけれども…。phpを多少は使えると言えるようになったかな…。 しみじみとしてしまう。

どうしてもxmlを表示するのに時間がかかるので(ロリポのせい?)xmlで手書きで少しデータを入れてみたり…。
イラナイものは全部消して軽く書いてみたりして…。まぁ。許せる感じにはなった。

お友達のサイトなので何でもお任せなので…・いろいろ実験させていただいてます。

opera若干表示遅いですな。

お問合せフォーム

お名前 :
Email: (必須)
メッセージ: (必須)


0 コメント :

コメントを投稿



連絡フォーム

名前

メール *

メッセージ *

サイト内検索