PHPとSmartyでRSSを自動生成
2008年10月15日 19:37
こんばんは。
最近、ActionScript2.0&3.0の勉強に必死な掛尾です。
冒頭にActionScriptとか書いておきながら、今回はPHPとSmartyでRSSを自動生成させる方法について書いてみようと思います。
何はともあれ、RSSの元になるデータがないと話にならないので、例によってデータを取得してきた所から始めます。
RSSの生成には、「サイト(ブログ)タイトル」「サイト(ブログ)URL」「サイト(ブログ)概要」「管理者メールアドレス」「記事タイトル」「記事URL」「記事概要」「登録日時」程度の情報を用意します。
なくても大丈夫なものも含まれていますが、今回はこの8つの情報からRSS2.0用のファイルを作ります。
まず、PHPのスクリプトを以下のような感じで書きます。
変数には、DBもしくはデータファイルから取得したデータが10件程度(あまり多すぎるのもどうかと思いますし・汗)入っているものとします。
/* $rss_master配列に含まれる情報(例:$rss_master['site_title']) site_title : サイトタイトル; site_url : サイトURL; site_description: サイト概要; admin_mail_addr : 管理者メールアドレス; $rss_data配列に含まれる情報(例:$rss_data[0]['topic_title']) topic_title : 記事タイトル; topic_url : 記事URL; topic_description: 記事概要; post_datetime : 登録日時; $smarty: Smartyインスタンス */ // 取得したデータをSmarty変数へ割り当てる $smarty->assign( 'rss_master', $rss_master ); $smarty->assign( 'rss_data' , $rss_data ); // RSS生成用のSmartyテンプレートを取得 $template = $smarty->fetch( 'rss.tpl' ); // 生成されたSmartyテンプレートをファイルとして書き出し $filePath = '/rss/rss.xml'; $handle = fopen( $filePath, 'w' ); if( $handle ){ // テンプレートを丸ごとUTF-8に変換(自作のクラスです) fputs( $handle, $conversion->convert2utf8( $template ) ); fclose( $handle ); }
PHPスクリプトは以上です。
Smartyは単に表示させるだけでなく、テンプレートをデータとして取得する事もできます。
[余談]
「$smarty->display」は、Smartyエンジンの内部的には「fetch→echo」となってるんだそうです。(ネタ元忘・汗)
(2008-12-31追記)Smarty.class.phpのdisplayメソッドはfetchメソッドをラップしているだけなのを確認しました。
[/余談]
次に、肝心のRSS用のテンプレートファイルを作成します。
RSSファイルは他の文字コードに対応していないRSSリーダーがないとは限らないので、可能な限りUTF-8にしておきます。
また、HTMLタグは取ってしまうか、エスケープしておきます。
<?xml version="1.0" encoding="utf-8"?> <rss version="2.0"> <channel> <title>{$rss_master.site_title}</title> <link>{$rss_master.site_url}</link> <description>{$rss_master.site_description}</description> <language>ja</language> <docs>http://blogs.law.harvard.edu/tech/rss</docs> <copyright>{$rss_master.site_title}</copyright> <webMaster>{$rss_master.master_mail_addr}</webMaster> {foreach item="item_list" from=$rss_data name="item_list"} <item> <title>{$item_list.topic_title|strip_tags:false}</title> <link>{$item_list.topic_url}</link> <description>{$item_list.topic_description|strip_tags:false|jp_truncate:"200"|escape:"html"}</description> <pubDate>{$item_list.post_datetime|my_date_format:"r"}</pubDate> </item> {/foreach} </channel> </rss>
以上を実行すると、rssディレクトリ内にrss.xmlというRSSファイルが出来上がります。
後は、サイトの好きなところに、<a href="rss/rss.xml">RSS購読</a>のように書けば、RSSリーダーへ登録ができます。
RSS1.0や、Atomも情報を送るテンプレートを変えれば作成する事ができます。
ブログ以外にも、メールマガジンのようにインフォメーションや、新着情報を作ったりする事もできますね(*^_^*)
一般の方には、RSSという物自体がなんだかよく知らないって方もまだまだ少なくないと小耳に挟んだりしますが・・・そこら辺は気にせずに(^-^;
では、今回はこの辺で。
※参考URL:www.kanzaki.com: RSS(RDF Site Summary)によるサイト情報の要約と公開
※このスクリプトにおいて、動作の検証は行っていませんので、責任は一切負いません。
Smarty Tips :: テンプレート関数プラグイン
2008年10月10日 20:38
こんばんは。
午前中に、ぷれ大掃除(笑)をした掛尾です。
今回は、意外と知られていない(?)Smartyのプラグインのひとつ、テンプレート関数プラグインについて書いてみようと思います。
Smartyでは、標準で使用できる{assign}や{html_options}といったカスタム関数があります。
でも、そのまま使うとなると、意外と使い勝手が悪かったり、融通が利かなかったりと、まぁ、いろいろ大人の事情ができてきます(笑)
そんなわけで、カスタム関数をもう少しカスタムして、DBからのデータをテンプレート側から直接呼び出せるプラグインを作ってみます。
さて、大人の事情で、例えばWEBページの右サイドにDBから取得してきたインフォメーションのデータを、タイトルにページへのリンクを張った一覧で10件、表示常に表示したいとしましょう。
普通(?)なら、各ページのPHPもしくは、テンプレートに直接書いたりインクルードしたりするでしょうか?
しかし、これではちょっとした修正をするのにも、一苦労になりそうな予感がプンプンしますよね(^-^;
というわけで、テンプレート関数プラグインを作成しましょう。
まず、Smartyの標準プラグイン達は、Smarty/plugins/に入っています。
$plugins_dirで設定もできますが、ここでは忘れます(笑)
その中に、以下のような感じの関数を書いて、plulgins/の中に保存します。
プラグインのファイル名には規則があって、関数名が「smarty_function_AAA()」なら、ファイル名は「function.AAA」としないとダメです。
今回の場合は「smarty_function_info_list」なので、「function.info_list.php」となります。
function smarty_function_info_list( $params, &$smarty ){ // 〜 ここで、DBに接続して、LIMIT 10でデータを取得 〜 // $db_data:取得したデータ配列 // smarty変数に割当 $smarty->assign( $params['info_list_assign'], $db_data ); }
これで、プラグインは完成です。
このプラグインをテンプレートの何処からでも呼び出せるようになりました。
次は、呼び出すテンプレート側です。
挿入したい箇所に、以下のように書きます。
{* プラグイン関数からデータを取得 *} {info_list info_list_assign="list"} <div> <h2>Information</h2> <ul> {foreach item="list" from=$list} <li><a href="info.php?id={$list.id}">{$list.str_title|strip_tags:false}</a></li> {/foreach} </ul> </div>
1行目の{info_list info_list_assign="list"}は{関数名 受け取る$paramsのキー名 割り当てる変数}となっています。
あとは、通常通り{foreach}や{section}で配列を回して、一覧を作っていくだけです。
そして、使いたいテンプレートに上記のテンプレートをincludeすれば、修正する時もたった1ヶ所修正すればOKですよね(*^_^*)
プラグインは、使い出すと便利で意外とクセになるので、僕は常用しているのですが、他人がソースを見た時に関連性が解りにくいという理由で嫌う方もいるので、その辺はご注意を(笑)
次回は修飾子プラグインについて…としておきましょうか(笑)
※参考URL:Smarty::テンプレート関数プラグイン
※このスクリプトにおいて、動作の検証は行っていませんので、責任は一切負いません。
影に裏打ちされた光。
2008年10月8日 20:33
こんばんは。
最近、だいたい仕事中はB'zがヘビロテの掛尾です。
先日、NHKスペシャルで「メガヒットの秘密〜20年目のB'z〜」という番組が放送されました。
1ヶ月くらい前にmixiかどこかのニュースで告知されていて、心待ちにしてました。
B'zは僕が高校時代から大好きなアーティストで、その昔音楽の道を選んだのも、その影響は大きいと思います。
B'zの音楽は、心に響く歌詞と、ジャンルの幅の広い曲が絶妙に相まって、いつもすごいなと思います。
20年・・・何をするにも、続けるには相当の努力と、情熱がないと難しいと思います。
特に、音楽の業界で、数え切れない程のアーティストがいる中で、常にトップに君臨しているというのは、並大抵の事じゃないと思います。
番組を見て、ホントにすごいと思いました。
Vo.稲葉さんは、10日間のリハ合宿で、毎日ランニングをしていたり、ツアー中は専属の整体師を動向させていたり、リハのステージには4台もの加湿器を置いていたり・・・。
Gt.松本さんは、たった8小節のフレーズにこだわり、ほんの10数秒のフレーズに1ヶ月間も気に掛ける・・・。
大ヒットの方程式は?という質問に、松本さんは、答えは無いと言っていたけど、野生のカンだとも言っていた。
メガヒットを生み出した楽曲が出来上がった時は、ミリオンを確信しているんだとか。
2人は恐らくもう40代半ば・・・。
その歳になっても、3時間のステージでのあのパワー、そして、人気の秘訣は、やっぱり日常にしっかり裏打ちされたものなんだなと思いました。
何となく何かをやって、結果だけを見て納得しない人達とは既に次元が違うのだと感じました。
恐らくB'zの2人は、いい音楽を作り上げる事しか見えないのだろう・・・。
そう考えると、TVとかでほとんど見る事がないのも納得がいく。
大好きな事を思い切りやる。
それも、中途半端ではなく、他に何も見えなくなるくらいに。
PHPカレンダースクリプト
2008年10月7日 09:11
おはようございます。
何故か微妙に寝不足気味な掛尾です。
今回は、某所で公開していたPHPのカレンダースクリプトを紹介しようと思います。
ブログなんかのサイドにちょこんとあって、まぁ使うとこはあまり無いけど、あるとなんとなく安心するあれです(笑)
クラスで作っているので、単体でも動きますが、必要があればロジックとビューを分けて、MVC化して使う事もできると思います。
(余談)shape DESIGNが作るブログは、これをSmartyと連携して使っています。
class Calendar { function &createCalendar( $year, $month ) { $calendar['curr_month'] = sprintf( '%04d年%02d月', $year, $month ); $f_dow = date( 'w', mktime( 0, 0, 0, $month, 1, $year ) ); $col = 0; $cal = "<tr>\n"; for( $i = 0; $i < $f_dow; $i++ ){ $cal .= "<td> </td>"; $col++; } $day = 0; while( checkdate( $month, ++$day, $year ) ){ // 今日 if( $year == date( "Y" ) && $month == date( "m" ) && $day == date( "d" ) ){ $cal .= "<td style=\"background: #fdd; font-weight: bold;\">$day</td>"; } // 日曜 elseif( ( $day + $f_dow ) % 7 == 1 ){ $cal .= "<td style=\"color: #f00;\">$day</td>"; } // 土曜 elseif( ( $day + $f_dow ) % 7 == 0 ){ $cal .= "<td style=\"color: #00f;\">$day</td>"; } else { $cal .= "<td>$day</td>"; } $col++; if( $col % 7 == 0 ) $cal .="\n</tr>\n<tr>\n"; } $e_dow = date( 'w', mktime( 0, 0, 0, $month, $day, $year ) ); if( $e_dow != 0 ){ for( $i = 0; $i < 7 - $e_dow; $i++ ){ $cal .= "<td> </td>"; } } $cal .= "\n</tr>\n"; $calendar['view'] = $cal; // ページ処理 // 前月 if( $month == 1 ){ $calendar['last_year'] = $year - 1; $calendar['last_month'] = 12; } else { $calendar['last_year'] = $year; $calendar['last_month'] = $month - 1; } // 次月 if( $month == 12 ){ $calendar['next_year'] = $year + 1; $calendar['next_month'] = 1; } else { $calendar['next_year'] = $year; $calendar['next_month'] = $month + 1; } return $calendar; } } $calendar = new Calendar(); $curr_year = isset( $_GET['year'] ) ? $_GET['year'] : date( "Y" ); $curr_month = isset( $_GET['month'] ) ? $_GET['month'] : date( "m" ); $cal =& $calendar->createCalendar( $curr_year, $curr_month ); <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" /> <title>カレンダー</title> </head> <body> <div id="calendar"> <table border="0" cellspacing="0" cellpadding="5" style="text-align: center;"> <tr> <td colspan="7" align="center"> <a href="Calendar.class.php?year= echo $cal['last_year']; &month= echo $cal['last_month']; "><<</a> echo $cal['curr_month']; <a href="Calendar.class.php?year= echo $cal['next_year']; &month= echo $cal['next_month']; ">>></a> </td> </tr> <tr> <th style="color: #f00;">日</th> <th>月</th> <th>火</th> <th>水</th> <th>木</th> <th>金</th> <th style="color: #00f;">土</th> </tr> echo $cal['view']; </table> </div> </body> </html>
それほど難しい事はしていないと思うので、じっくり読めば難解でもないと思います。
それでは…今回はこの辺で。
オシャレな(?)カレンダーを設置してくださいね!
※このスクリプトにおいて、動作の検証は行っていませんので、責任は一切負いません。
画像変換スクリプト、販売開始です!
2008年10月5日 15:52
こんにちは。
最近めっきりお酒が弱くなってしまった掛尾です。
秋も深くなってきましたね。
一時、もう冬?という寒さの日もあったようにも思いますが、ここ2、3日は日中は程良く暖かかったですね。
[image:432adb8ba7.gif]さて、サイト上のInformationにも告知しましたが、先日より「画像変換スクリプト version 1.0.0」の販売を開始しました。
このスクリプトは、shape DESIGNがCMSで使用しているものを、単体で、しかも簡単に既存のサイト構築に役立てられるように修正を施したものです。
PHPファイル自体は2つから構成されており、ロジック自体は1つのクラスファイルとなっています。
そして、もう一方のPHPファイルは画像を表示するためのもので、少し修正を加えれば、画像が格納されているディレクトリの指定や、クオリティなども調節できるようになっています。
通常のHTMLファイルの<img src="***">に表示用のPHPファイルと、パラメーターを指定するだけで、簡単に画像を変換する事ができます。
携帯サイトなどをキャリア別に表示する場合に、画像のフォーマットを変換しなければいけないといった場合も、元画像1枚からそれぞれのフォーマットの画像を自動で生成させる事も可能です。
これからも、こういったアクセサリー的なスクリプトも増やしていこうと考えていますのでお楽しみに(?)
徳島県徳島市名東町
tel/fax 088-635-5859
営業時間 平日 10:00〜18:00
※打ち合わせ等で不在の場合は、お電話でのお問い合わせに対応できない場合がありますので、ご了承ください。
徳島・香川・愛媛・高知および大阪・京都を中心にご依頼を承ります。その他の地域でも、メール・お電話・FAX・Skype等での作業が可能であれば柔軟に対応いたします。