フック処理

Acms\Custom\Hookクラス(extension/acms/Hook.php)のもつ各タイミングメソッドに処理を記述することで、特定タイミングで独自の処理を追加して実行できるようになります。

例えば以下のような用途で利用することが出来ます。

  • GETモジュールに渡されるテンプレート文字列の編集
  • POSTモジュール処理後に、データのロギングを追加
  • HTMLレスポンス全体に対するフィルタリング処理
  • グローバル変数の追加

PHPに関する知識が必要です。以降の説明についてもPHPの基礎知識がある前提で進めていますのでご了承ください。

利用方法

まず、config.server.php の HOOK_ENABLE を1にしてフック拡張を有効にします。

define('HOOK_ENABLE', 1);

extension/acms/Hook.php のファイルを修正していきます。

(サンプル) 発行クエリの操作

/**
 * クエリ発行前
 *
 * @param string $sql
 */
public function query(&$sql)
{
    // クエリの acms_blogという文字列を acms_blog2 に置き換え
    // ローカル環境と、テスト環境でドメインを変えたい場合に便利
    if (DOMAIN == 'localhost') {
        $sql = preg_replace('/acms_blog\d*/', 'acms_blog2', $sql);
    }
}

(サンプル) HTTPレスポンスヘッダーの追加

/**
 * header指定
 *
 * @param bool $cache キャッシュ利用
 */
public function header($cache)
{
    // User-Agentで表示するものを分けている場合
    header('Vary: User-Agent');
}

(サンプル) キャッシュルールの追加

/**
 * キャッシュルールに特殊ルールを追加
 *
 * @param string $customRuleString
 */
public function addCacheRule(&$customRuleString)
{
    // デバイスによってキャッシュを分ける場合
    // ここで指定した文字列毎にキャッシュが分けられます。
    $customRuleString = UA_GROUP;
}

(サンプル) 独自グローバル変数の作成

/**
 * グローバル変数の拡張
 *
 * @param array $globalVars
 */
public function extendsGlobalVars(&$globalVars)
{
  // htmlに%{GLOBALVARS} と記載すると、画面で見た時に「グローバルへんすう」と表示
  $globalVars->setField('GLOBALVARS', 'グローバルへんすう');
}

(サンプル) インクルードのパスで使用できるグローバル変数を追加(テンプレートキャッシュ有効時)

/**
 * テンプレートキャッシュ有効時に、
 * インクルードのパスで使用できるグローバル変数を設定
 *
 * ページ毎に値が違うようなグローバル変数を設定しないでください。
 * 値別にキャッシュが作成されるので、値の種類が多いとキャッシュの意味がなくなります。
 *
 * @param array $globalVarNames
 */
public function addGlobalVarsInIncludePath(&$globalVarNames)
{
    $globalVarNames = ['SESSION_USER_AUTH', 'HOGE']; // 例)インクルード文に %{SESSION_USER_AUTH} と %{HOGE} を使えるようにする
}

(サンプル) GETモジュール処理前のテンプレートを変更

/**
 * GETモジュール処理前
 * 解決前テンプレートの中間処理など
 *
 * @param string   &$tpl
 * @param ACMS_GET $thisModule
 */
public function beforeGetFire(&$tpl, $thisModule)
{
    // モジュールのbidが1のときにテンプレートを編集
    if ( $thisModule->bid === 1 ) {
        $tpl = str_replace('foo', 'bar', $tpl);
    }
}

(サンプル) GETモジュールをビルドした後のレスポンス文字列に対するフィルタ

/**
 * ビルド後(GETモジュール解決後)
 * ※ 空白の除去・文字コードの変換・POSTモジュールに対するSIDの割り当てなどはこの後に行われます
 *
 * @param string &$res レスポンス文字列
 */
public function afterBuild(&$res)
{
    // ここでの$resは参照渡しされています
    $res = str_replace('%[ORIGINAL_VAR]%', 'オリジナル変数の置き換え', $res);
}

(サンプル) POSTモジュール処理後の処理追加

/**
 * POSTモジュール処理前
 * $thisModuleのプロパティを参照・操作するなど
 *
 * @param ACMS_POST $thisModule
 */
public function afterPostFire($thisModule)
{
    $moduleName = get_class($thisModule);

    switch($moduleName) {
        case 'ACMS_POST_Entry_Insert':
        case 'ACMS_POST_Entry_Update':
        // エントリー更新の後に何らかの処理を行う
        
        // POSTモジュールの持っていた関連パラメータを参照できます
        var_dump($thisModule)
        
        break;
    }
}

スケジュールの基本

a-blog cmsでは、営業日やイベント予定を表形式で表示できる「カレンダー機能」も搭載しております。
エントリーとは別の、独自のメニューで管理します。
年月単位の一覧ページを作成したり、ひとつのブログ内に複数のスケジュールを表示することも可能です。

スケジュール作成の大まかな流れは下記の通りです。

  1. 新規スケジュールを作成する
  2. ラベルを作成する(任意)
  3. スケジュールに説明・ラベルを登録する
  4. スケジュールモジュールで表示方法を設定する
  5. テンプレートにタグを記述する

営業日カレンダーを作成する

アクセスした月の定休日を表示する、「営業日カレンダー」の作成方法を説明します。

カレンダーに表示する内容が決まっている場合や、表内で色分けをしたい場合は、「ラベル」を利用すると便利です。


1. 新規スケジュールセットを作成する


管理メニューの「スケジュール」を選択してください。
「スケジュール管理」画面には、作成したスケジュールセットの一覧が表示されます。
初期状態では何もありません。右上の「スケジュールセットを作成」ボタンをクリックしてください。


スケジュール作成

スケジュール作成


スケジュールセットの新規作成画面になります。

セット名 : 管理画面での表示名を入力します(公開ページには反映されません)。管理しやすい名前を入力してください。

説明 : スケジュールセットの役割などを入力してください。

入力したら「作成」ボタンをクリックしてください。
完了のメッセージが出たら、「一覧」ボタンで、スケジュールセット一覧へ戻ってください。


スケジュール作成画面

スケジュール作成画面


2. ラベルを作成する

先ほど作成したセットが一覧に追加されているのを確認して、「ラベル」の列にある「設定」ボタンをクリックしてください。


ラベル設定ボタン

ラベル設定ボタン


カレンダーに表示する定型文=ラベルの設定を行います。
ここでは「定休日」と「18時まで」 の二種類を選択できるようにしてみます。

ラベル名(必須) : 実際に表示される文字列を入力します。

クラス(省略可) : このラベルが適用されたときに、関連するHTMLタグに付与する、任意のクラス名を入力します。

入力したら「保存」ボタンをクリックしてください。
完了のメッセージが出たら、「一覧」ボタンで、スケジュールセット一覧へ戻ってください。


ラベル編集画面

ラベル編集画面


3. スケジュールセットにラベルを登録する

作成中のセットの「登録データ」の列にある「変更」ボタンをクリックしてください。
「スケジュールの管理」画面に移動します。

★ショートカットに追加 : ダッシュボードにこの画面へのショートカットが作成され、公開後の編集がしやすくなります。

前月・◯年◯月を編集する・次月 : 移動した直後は、「現在の月」の設定画面が表示されています。過去・未来の設定を行う場合は、これらのボタンをクリックして移動できます。

テキスト入力の右側のプルダウンリストで、先ほど作成した「ラベル」が選択できるようになっています。ここでは、毎週月曜日・第三日曜日を「定休日」、それ以外の日曜日を「18時まで」に設定してみます。
表示が確認できる程度まで設定したら「保存」ボタンをクリックしてください。


スケジュール登録画面でラベルを登録

スケジュール登録画面でラベルを登録


4. スケジュールモジュールの設定をする

管理メニューの「コンフィグ」を選択してください。
a-blog cmsで使用できるモジュールの一覧が表示されるので、「スケジュール」モジュールを探し、名前をクリックしてください。


スケジュールモジュール

スケジュールモジュール


スケジュールの表示設定画面となります。以下の通り設定してください。
後半の、年・月・日・曜日の表示形式は、任意で構いません。

参照先スケジュール : 関連付けるスケジュールセットを選択します。ここでは営業日カレンダーを選択してください。

デフォルトの表示 : トップページ、エントリーページで使用したときの、スケジュールの絞り込み条件を選択します。ここでは「月表示」を選択してください。

月の表示モード・年の表示モード : 絞り込み条件別に、スケジュールの表示形式を選択します。ここでは月・年とも「七曜表」を選択してください。

入力したら「保存」ボタンをクリックしてください。


スケジュールモジュールの設定

スケジュールモジュールの設定


5.テンプレートにコードを記述する

利用中のテーマの、営業日カレンダーを表示したい箇所に、以下のコードを記述してください。

コード内のクラス名、表示確認のためのborder属性などは、任意で修正してください。

<!-- BEGIN_MODULE Plugin_Schedule -->
<div class="mod-schedule">
<!--#include file="/admin/module/setting.html"-->

<!-- BEGIN unit:loop -->
<div class="mod-schedule__unit">
	<!-- BEGIN month:loop -->
	<div class="mod-schedule__month">
		<p>{year}年{month}月の営業日</p>
		<table class="{mode}" border="1" cellpadding="5">
			<thead>
				<tr>
					<th class="w0">{w#0}</th>
					<th class="w1">{w#1}</th>
					<th class="w2">{w#2}</th>
					<th class="w3">{w#3}</th>
					<th class="w4">{w#4}</th>
					<th class="w5">{w#5}</th>
					<th class="w6">{w#6}</th>
				</tr>
			</thead>
			<tbody>
				<!-- BEGIN week:loop -->
				<tr class="week{weekRowNo}">
					<!-- BEGIN day:loop -->
					<td class="day{weekNo}<!-- BEGIN dayClass:veil --> {dayClass}<!-- END dayClass:veil -->">
						<!-- BEGIN day:veil -->
						<div class="mod-schedule__day__date">{day}</div>
						<div class="mod-schedule__day__label">{dayLabel}</div>
						<div class="mod-schedule__day__item">{dayItem}</div>
						<!-- END day:veil -->
					</td>
					<!-- END day:loop -->
				</tr>
				<!-- END week:loop -->
			</tbody>
		</table>
	<!-- /.mod-schedule__month --></div>
	<!-- END month:loop -->
<!-- /.mod-schedule__unit --></div>
<!-- END unit:loop -->

<!-- /.mod-schedule --></div>
<!-- END_MODULE Plugin_Schedule -->

テーマを更新すると、スケジュールモジュールの設定通りにカレンダーが表示されます。

複数月表示にしている場合は、<!-- BEGIN month:loop -->〜<!-- END month:loop -->間が繰り返されます。

tr・th・td要素には、表示している週や曜日、設定したラベルに応じたクラス名が付与されます。CSSでの色分けの際に参照してください。