Web雑記帳 atsu666


グローバル変数を作ってみる【a-blog cms】

August 01 Fri 2014 | 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ヶ月表示のカレンダーができたと思います。 いろいろな使い方が出来ると思うので是非やってみて下さい。


tag : ablogcms テンプレート