校正オプションの拡張について
Acms\Custom\Correctorクラス(extension/acms/Corrector.php)にメソッドを定義することで、校正オプションの拡張が可能です。Acms\Custom\Correctorクラスが記述される、extension/acms/Corrector.phpは、アップデート時の上書き対象ではないので、自由に拡張してご利用いただけます。
テンプレート上の校正オプション指定との対応
<!-- {var}の中は、'a-blog cms' とする --> <body> {var}[sample('hoge', 'fuga')] </body>
テンプレート上に記述する校正オプション名と、Acms\Custom\Corrector 内で拡張するメソッド名を同一にします。テンプレート上から指定するメソッドへの引数は、シングルクオーテーションで囲い、カンマで区切ります。
<?php namespace Acms\Custom; /** * 校正オプションにユーザー定義のメソッドを追加します。 * ユーザー定義のメソッドが優先されます。 */ class Corrector { /** * sample * 校正オプションのサンプルメソッド * * @param string $txt - 校正オプションが適用されている文字列 * @param array $args - 校正オプションの引数 {var}[sample('ここの値')] * @return string - 校正後の文字列 */ public function sample($txt, $args = array()) { // 例 {var}[sample('hoge','fuga')] // {var}の中は,'a-blogcms' とする $hoge = isset($args[0]) ? $args[0] : null; // 'hoge' $fuga = isset($args[1]) ? $args[1] : null; // 'fuga' return $hoge.$fuga.'+'.$txt; // 'hogefuga+a-blog cms' } }
校正オプションのメソッドには、校正オプション適用対象の変数(主に文字列)と、テンプレート上で指定された引数が渡されます。
<body> hogefuga+a-blogcms </body>
例では、本来の変数 'a-blog cms' と、引数として与えられた文字列 'hoge' , 'fuga' が合成されて、'hogefuga+a-blogcms' という文字列が出力されます。
備考
校正オプションは、各GETモジュール内でテンプレート内の変数を解決する際に、付随する形で実行されます。そのためモジュールが出力してない変数に校正オプションを指定しても実行されません。
フック処理
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; } }