a-blog cmsのカスタマイズが捗る、Hook.php の設定
このエントリーは、a-blog cms Advent Calendar 2017 の1日目のエントリーです。
タイトルのとおり、私が日々のカスタマイズで実践している、Hook.phpを使用したカスタマイズ方法をご紹介します。
具体的には、カスタムフィールドをグローバル変数に変換し、それをカスタマイズに利用します。
php苦手な方には「えー、phpさわるの?」とか思われるかもしれませんが、できるだけコピペだけでいけるよう解説していくつもりです。
Hook.phpとは?
公式にHook.phpの説明があるのは下記リンクですが、
ひとまず以降に説明する3ステップでお試しください。
3ステップだけでお試し
できればカスタムフィールドをエントリーにもつ、既存のサイトなどでお試しいただけると楽だと思います。
ステップ1 config.server.php をさわる
さきほどの公式のページにも記載がありますが、まずはHook.phpを利用するための設定を行ないます。
config.server.php 内にある、
define('HOOK_ENABLE', 0);
を
define('HOOK_ENABLE', 1);
へ、変更します。
29行目あたり。
ステップ2 Hook.phpにコピペ
以下の内容を、
/php/ACMS/User/Hook.php の、134行目(Ver. 2.7.19時点)にコピペ。
public function extendsGlobalVars(&$globalVars)
{
の後です。
if ( EID ) { $field = loadEntryField(EID); foreach ( $field->listFields() as $key ) { $globalVars->setField($key, $field->get($key)); } }
追加後は以下のようになるはずです
public function extendsGlobalVars(&$globalVars) { if ( EID ) { $field = loadEntryField(EID); foreach ( $field->listFields() as $key ) { $globalVars->setField($key, $field->get($key)); } } // $globalVars->set('key', 'var'); }
ここまでで、エントリーに設定されているカスタムフィールドが、すべてグローバル変数に変換されていると思います。(エントリー画面でのみ
これを表示してみます。
ステップ3 作成したグローバル変数を出力
エントリーのテンプレートに、作成したグローバル変数を出力するための記述をします。
例えば、
{hoge}
という記述で表示されるカスタムフィールドの場合、
%{hoge}
とするだけです。カンタンです。
ここまでで、作成したグローバル変数が表示ができるようになったかと思います。
具体的な利用方法
で、これの何がいいの?
ということなんですが、こうすることのメリットは今回は以下の2点です。
- テンプレート上で、インクルードやモジュールIDの指定に利用できる
- モジュールIDの管理画面上で利用できる
こちらを順にやってみます。
テンプレート上で、インクルードやモジュールIDの指定に利用できる
通常、カスタムフィールドの値は、テンプレートの処理順の関係でインクルードやモジュールIDの指定に利用できません。
例えば以下のような記述です。
// インクルードの記述 <!--#include file="/path/to/template/{hoge}.html" --> // モジュールIDの指定の記述 <!-- BEGIN_MODULE Entry_Body id="{hoge}_body" -->
こちらがこのように指定することが可能になります。
// インクルードの記述 <!--#include file="/path/to/template/%{hoge}.html" --> // モジュールIDの指定の記述 <!-- BEGIN_MODULE Entry_Body id="%{hoge}_body" -->
インクルードの場合 IFモジュールでの実装も可能ですが、IFモジュールの場合、IF内部の処理が全て実行されてしまう為、複雑な処理がされているとページの表示スピードに影響を与えかねません。
モジュールIDの指定では、テンプレートを変えずにカスタムフィールドの値のみでモジュールの切り替えが可能になります。
モジュールIDの管理画面上で利用できる
もうひとつはモジュールIDの管理画面上での利用です。
例えばフールドの指定で、
のような指定をしたいと思ったことないですか?
この指定で期待されるのは、hogeというカスタムフィールドが、{hoge}の値(エントリーによって変わる)のとき出力される
ということです。
通常ではこの指定はできませんが、カスタムフィールドをグローバル変数化している場合、
hoge/eq/%{hoge}
という指定が可能になります。
まとめ
今回わかりやすいように、すべてのフィールドをカスタムフィールドに変換していますが、個別の指定も可能です。
さきほどのコードを簡単に解説しますと、
// エントリーIDがあるとき if ( EID ) { // 該当のエントリーIDのカスタムフィールドを全て取得 $field = loadEntryField(EID); // カスタムフィールドを順に全て処理 foreach ( $field->listFields() as $key ) { // カスタムフィールドの値を取得し、グローバル変数として設定 $globalVars->setField($key, $field->get($key)); } }
となります。
今回のようにhogeカスタムフィールドのみ使用する場合なら、
if( EID ) { $field = loadEntryField(EID); $globalVars->setField('hoge', $field->get('hoge')); }
とだけすればOKです。
Hook.phpには他にも便利な機能が記述されてます。
デフォルトの機能では難しいようなことも、少しの記述でカンタンに実装可能になることもあります。
是非一度Hook.phpを利用したカスタマイズを試してみてください。
と、ここまで書いて2014年の記事で @atsu666 さんがすでに記事を書いてるのを思い出しました。
まあでもあまり周知されてないような気もするので、再度周知ということで、、
現場からは以上です。