グローバル変数を作ってみる【a-blog cms】
グローバル変数をカスタマイズ
a-blog cmsでphpを触る事になりますが、グローバル変数を自分で作れると表現できる幅がすごく広がるので、 ちょっと触ってみようと思います。
この機能はver1.6.0以上で出来ます。
つくってみる
Hook機能を有効化
Hook機能でグローバル変数をカスタマイズする為、まずはHook機能を有効化します。
// config.server.php define('HOOK_ENABLE', 1);
独自のグローバル変数を作成
Hook機能が有効になったので、Hook.phpをカスタマイズして独自のグローバル変数を作ってみます。
// /php/ACMS/User/Hook.php /** * グローバル変数の拡張 * * @param array $globalVars */ public function extendsGlobalVars($globalVars) { $globalVars->set('HOGE', '独自変数!'); }
使ってみる
以上の作業を行うとテンプレートのどこでも「%{HOGE}」と書くと「独自変数!」と出力されるようになります。
独自にグローバル変数を作れるようになると、カスタムフィールドをグローバル変数にしたり、その独自グローバル変数を使ってインクルードするテンプレートを分けたりなど、出来る事の幅が広がるので是非使ってみて下さい。
以下はエントリーのカスタムフィールドを全部、グローバル変数にしています。
public function extendsGlobalVars($globalVars) { if ( EID ) { $Field = loadEntryField(EID); foreach ( $Field->listFields() as $key ) { $globalVars->setField($key, $Field->get($key)); } } }
おまけ(カスタマイズ例)
最後に独自グローバル変数を使ったカスタマイズ例を紹介。
Calendar_Monthモジュールがありますが、同じページに2ヶ月や3ヶ月分表示したい時があると思います。 モジュールをそれぞれ設定すれば固定で数ヶ月分のカレンダーが作れますが、月送りに対応できません。 そこで、独自グローバル変数を作成して、月送りできる、数ヶ月表示のカレンダーを作ってみたいと思います。
テンプレート
まずは普通にCalendar_Monthモジュールをテンプレートに貼り2個目のモジュールだけidを振っておきます。 また2個目のモジュールの月送りは必要がないので消しておきます。
<!-- BEGIN_MODULE Calendar_Month --> <div> <div> <p><a href="{monthUrl}">{month}</a></p> <p> <a href="{prevUrl}calendar.html" title="前月へ">«</a> <a href="{yearUrl}" title="年間カレンダーへ">{year}</a> <a href="{nextUrl}calendar.html" title="次月へ">»</a> </p> </div> <table summary="calender"> <tr> <!-- BEGIN weekLabel:loop --> <td >{label}</td> <!-- END weekLabel:loop --> </tr> <!-- BEGIN week:loop --> <tr> <!-- BEGIN day:loop --> <!-- BEGIN spacer --> <td> </td> <!-- END spacer --> <!-- BEGIN none --> <td>{day}</td> <!-- END none --> <!-- BEGIN link --> <td><a href="{url}">{day}</a></td> <!-- END link --> <!-- END day:loop --> </tr> <!-- END week:loop --> </table> </div> <!-- END_MODULE Calendar_Month --> <!-- BEGIN_MODULE Calendar_Month id="nextCalendar" --> <div> <div> <p><a href="{monthUrl}">{month}</a></p> </div> <table summary="calender"> <tr> <!-- BEGIN weekLabel:loop --> <td >{label}</td> <!-- END weekLabel:loop --> </tr> <!-- BEGIN week:loop --> <tr> <!-- BEGIN day:loop --> <!-- BEGIN spacer --> <td> </td> <!-- END spacer --> <!-- BEGIN none --> <td>{day}</td> <!-- END none --> <!-- BEGIN link --> <td><a href="{url}">{day}</a></td> <!-- END link --> <!-- END day:loop --> </tr> <!-- END week:loop --> </table> </div> <!-- END_MODULE Calendar_Month -->
これで2ヶ月分のカレンダーが表示されますが、この段階だと両方とも同じ月が表示されてしまいます。
モジュールを設定する
では2個目のモジュールを設定したいと思います。
開始日時に表示されているページの翌月を設定すればよい事になります。 翌月を表すグローバル変数があればいいのですが、存在しないので独自にグローバル変数を作成します %{NEXT_MONTH}というグローバル変数を仮で設定しておきましょう!
グローバル変数を作成する
では先ほど設定した%{NEXT_MONTH}が実際に動作するようにグローバル変数を作ってみます。
public function extendsGlobalVars($globalVars) { $start = START != '1000-01-01 00:00:00' ? strtotime(START) : time(); $nextMonth = date('Y-m-d', strtotime(date('Y-m-t', $start)) + (60 * 60 * 24)); $globalVars->set('NEXT_MONTH', $nextMonth); }
STARTという定数がURLコンテキストの日付をとってくるのでその翌月を新しいグローバル変数に設定しています。
これで月送りできる2ヶ月表示のカレンダーができたと思います。 いろいろな使い方が出来ると思うので是非やってみて下さい。