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::テンプレート関数プラグイン
※このスクリプトにおいて、動作の検証は行っていませんので、責任は一切負いません。
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>
それほど難しい事はしていないと思うので、じっくり読めば難解でもないと思います。
それでは…今回はこの辺で。
オシャレな(?)カレンダーを設置してくださいね!
※このスクリプトにおいて、動作の検証は行っていませんので、責任は一切負いません。
Text_Highlighter 設置プロセス(2)
2008年10月2日 20:53
こんばんは。
最近、DSでアクションゲームをやりすぎて、左手親指の爪の辺りが痛い掛尾です。
さて、今回はText_Highlighter 設置プロセス第2弾という事で、MySQLから取得したデータにText_Highlighterを適用してみようと思います。
ファイルの設置方法はText_Highlighter 設置プロセス(1)を参照して下さい。
では、始めましょう。
まずは、MySQLからデータを取得するという所ですが、接続等から説明を始めると長くなるので割愛します。
テーブルのカラム構成は、id int(11)、title varchar(64)、body textとでもしておきましょうか。
今回は上記のbodyカラムの中に、以下の様にカスタムタグで囲まれたテキストが存在するものとして話を進めます。
〜 略 〜 |code:PHP| $a = 'テキスト1'; $b = 'テキスト2'; $c = $a . $b; echo $c; |/code| 〜 略 〜
このカスタムタグ|code:PHP|〜|/code|の部分だけをPHPの構文でハイライトしたいので、bodyカラムのデータ内のカスタムタグの部分だけを正規表現で抽出して、以下の様にText_Highlighterを通すようにします。
// $db_dataにはMySQLのデータがハッシュで格納されている $data = $db_data['body']; // Text_Highlighterをインクルード require_once( 'Text/Highlighter.php' ); require_once( 'Text/Highlighter/Renderer/Html.php' ); // HTML Rendererのインスタンス生成 $renderer = new Text_Highlighter_Renderer_Html( array( 'numbers' => false, 'tabsize' => 4 ) ); // テキスト内のカスタムタグブロックを一つずつ変換 while( preg_match( '/\|code\:([^\|]*?)\|(.*?(?:(?=\|code\:(?:[^\|]*?)\|)|(?=\|\/code\|)))/s', $data, $matches_value ) ){ $type = $matches_value[1]; $value_str = $matches_value[2]; $hlHtml =& Text_Highlighter::factory( strtoupper( $type ) ); $hlHtml->setRenderer( $renderer ); $chgCode = $hlHtml->highlight( $value_str ); $chgCode = preg_replace( '/(\s*(\r\n|\r|\n))/', '', $chgCode, 1 ); // 何となく開始タグの後に改行入れたくなるので $data = preg_replace( '/\|code\:'.preg_quote( $type, '/' ).'\|'.preg_quote( $value_str, '/' ).'\|\/code\|/', $chgCode, $data, 1 ); } echo $data;
これで、$dataには、カスタムタグ内が|code:○○|の○○の部分、つまりPHP構文でハイライトするためのタグ付きのテキストに変換されるはずです。
後は、CSSファイルで色やマージン等を指定すれば、好みの表示方法が実現できます。
実用的な事を考えると、Text_Highlighterがどうこうというより、正規表現の方が肝心だったりという気も若干しますが…。(実際、僕も苦労しました・苦笑)
実際、丸々ハイライトする事ってほとんどないと思いますしね(笑)
こんな感じで、Text_Highlighter 設置プロセスは完結とします。
※このスクリプトにおいて、動作の検証は行っていませんので、責任は一切負いません。
Text_Highlighter 設置プロセス(1)
2008年9月21日 08:38
おはようございます。
最近、和の配色って絶妙で奥が深いなぁ…と日本のわびさびを感じている掛尾です。
さて、このブログで、くだらない事ばかり書いていてもいいのですが、少しは役に立つ事も書きたいなと思って、Tips?なんぞを書きつづってみようかと。
そこで必要になったのが、コードのいわゆるHighlighterというやつです。
探せば種類はたくさんあるのですが、ライセンスの問題などを考慮して、PEARのText_Highlighterというものを使う事にしました。
今回は少し時間を取って設置したそのプロセス第1弾という事で。
僕は基本的にPEARパッケージを手動で設置するので注意して下さい。
1)何はともあれパッケージをダウンロード
PEAR::Package::Text_Highlighterから、Text_Highlighterのパッケージをダウンロード(Text_Highlighter-0.7.1)。
PEARの本体パッケージも必要になるので、PEAR::Package::PEARからダウンロード(PEAR-1.7.2)しておきます。
2)PEARのディレクトリ構成の規則に沿って設置
ダウンロードしたものを解凍すると、たくさんのファイルやらフォルダやらがありますが、今回は必要なものだけ使う事にして、PEARディレクトリを新しく作成して以下の構成にします。
■ ディレクトリ構成
PEAR/
|
+-- PEAR.php
| ※解凍したフォルダの中のPEAR-1.7.2フォルダの中にある
|
+-- Text/
| ※解凍したフォルダの中のText_Highlighter-0.7.1をリネーム
|
+-- css/
| ※この中にハイライト用のCSSファイルを入れる。
| サンプルファイルはTextフォルダにsample.cssがある
|
+-- test.php
※Text_Highlighterを使用するPHPファイル
ここまででとりあえず設置は完了。
他のサイトのサンプルを見ると、大体はこの後text.phpで自分自身のスクリプトを表示させるっていうので終わっているけど、ここではもう少し実用的なサンプルを作っていこうと思います。
このまま書き散らかしても良いんですが、個人的にこういうのを一つの記事で完結してるものを見るのが苦痛なので、何回かに分けて書きます。
次回はtest.phpでMySQLからデータを取得して、その中身にText_Highlighterを適用するという所でしょうか。
ではでは、今回はこの辺で。
徳島県徳島市名東町
tel/fax 088-635-5859
営業時間 平日 10:00〜18:00
※打ち合わせ等で不在の場合は、お電話でのお問い合わせに対応できない場合がありますので、ご了承ください。
徳島・香川・愛媛・高知および大阪・京都を中心にご依頼を承ります。その他の地域でも、メール・お電話・FAX・Skype等での作業が可能であれば柔軟に対応いたします。