maki-o memo

制作に関する私的なメモです

選択されているタグ : tips

タグを絞り込む : a-blog_cms Advent_Calendar CMS jQuery js movableType php カスタマイズ グローバル変数

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点です。

  1. テンプレート上で、インクルードやモジュールIDの指定に利用できる
  2. モジュール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 さんがすでに記事を書いてるのを思い出しました。
まあでもあまり周知されてないような気もするので、再度周知ということで、、

グローバル変数を作ってみる




現場からは以上です。


プロフィール

フロントエンドエンジニア

Tomokazu Makita

名古屋でフリーランスでWeb制作してます。 フロントエンドのことを主にやってます。
a-blog cmsを使用したサイト制作が得意です。
お仕事のご相談随時受付中。

雪山大すき。冬は雪山の合間に仕事します。
財布はいつも吹雪です。

エントリーリスト

タグ