フック処理

目次

フック処理


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 のファイルを編集していきます。

リファレンス

init()

説明: アプリケーション起動時に呼ばれます。

戻り値: void

サンプル:

public function init()
{
    // 初期化処理、グローバル設定の読み込みなど
}

beforeAuthenticate()

説明: ログイン判定の前に呼ばれます。

戻り値: void


afterAuthenticate()

説明: ログイン判定の後に呼ばれます。

パラメータ: なし

戻り値: void


restrictionAuthority($suid, $bid)

説明: 権限チェック時に呼ばれます。

パラメータ

説明

$suid

int|null

ユーザーID

$bid

int

ブログID

戻り値: void


header($cache)

説明: HTTP ヘッダーの指定を行います。キャッシュ利用時の Vary ヘッダーなどを設定できます。

パラメータ

説明

$cache

bool

キャッシュ利用可否

戻り値: void

サンプル: User-Agent で表示するものを分けている場合

public function header($cache)
{
    header('Vary: User-Agent');
    // その他の例
    // header('Vary: Accept-Encoding');
    // header('Vary: Accept-Language');
    // header('Vary: Cookie');
}

query(&$sql)

説明: SQL クエリ発行前に呼ばれます。クエリの内容を参照・変更できます。

パラメータ

説明

$sql

array

SQL 情報(sql キーにクエリ文字列、その他にバインドパラメータなど)

戻り値: void

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

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

$sql の構造はバージョンにより異なる場合があります。連想配列の場合は $sql['sql'] を編集してください。


customRuleValue(&$value)

説明: ルール判定で使用するカスタム値を設定します。ここで設定した値をルール判定に使用できます。

パラメータ

説明

$value

string

カスタム値(参照渡し)

戻り値: void

サンプル:

public function customRuleValue(&$value)
{
    $value = 'custom_value';  // ルール判定で使用する値
}

addCacheRule(&$customRuleString)

説明: キャッシュルールに特殊ルールを追加します。

パラメータ

説明

$customRuleString

string

カスタムルール文字列(参照渡し)

戻り値: void

サンプル: デバイスによってキャッシュを分ける場合

public function addCacheRule(&$customRuleString)
{
    // ここで指定した文字列毎にキャッシュが分けられます
    $customRuleString = UA_GROUP;
}

addGlobalVarsInIncludePath(&$globalVarNames)

説明: テンプレートキャッシュ有効時に、インクルードのパスで使用できるグローバル変数を設定します。

注意: ページ毎に値が違うようなグローバル変数を設定しないでください。値別にキャッシュが作成されるため、値の種類が多いとキャッシュの意味がなくなります。

パラメータ

説明

$globalVarNames

string[]

グローバル変数名の配列(参照渡し)

戻り値: void

サンプル: インクルードのパスで使用できるグローバル変数を追加

public function addGlobalVarsInIncludePath(&$globalVarNames)
{
    // インクルード文に %{SESSION_USER_AUTH} と %{HOGE} を使えるようにする
    $globalVarNames = ['SESSION_USER_AUTH', 'HOGE'];
}

beforeGetFire(&$tpl, $thisModule)

説明: GET モジュール処理前に呼ばれます。解決前テンプレートの中間処理などに使用します。

パラメータ

説明

$tpl

string

テンプレート文字列(参照渡し)

$thisModule

\ACMS_GET

対象の GET モジュール

戻り値: void

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

public function beforeGetFire(&$tpl, $thisModule)
{
    // モジュールの bid が 1 のときにテンプレートを編集
    if ($thisModule->bid === 1) {
        $tpl = str_replace('foo', 'bar', $tpl);
    }
}

afterGetFire(&$res, $thisModule)

説明: GET モジュール処理後に呼ばれます。解決済みテンプレートの中間処理などに使用します。

パラメータ

説明

$res

string

解決済みテンプレート(参照渡し)

$thisModule

\ACMS_GET

対象の GET モジュール

戻り値: void

サンプル:

public function afterGetFire(&$res, $thisModule)
{
    // 解決済みテンプレートに対する後処理
    $res = str_replace('<!-- placeholder -->', '置換後のコンテンツ', $res);
}

afterV2GetFire(&$response, $thisModule)

説明: V2 GET モジュール処理後に呼ばれます。モジュールが返した配列を参照・加工できます。

パラメータ

説明

$response

array

モジュールが返した配列(参照渡し)

$thisModule

\Acms\Modules\Get\V2\Base

対象の V2 GET モジュール

戻り値: void

サンプル:

public function afterV2GetFire(array &$response, \Acms\Modules\Get\V2\Base $thisModule)
{
    // レスポンス配列に項目を追加
    $response['customField'] = '追加した値';
}

beforePostFire($thisModule)

説明: POST モジュール処理前に呼ばれます。$thisModule のプロパティを参照・操作できます。

パラメータ

説明

$thisModule

\ACMS_POST

対象の POST モジュール

戻り値: void

サンプル:

public function beforePostFire($thisModule)
{
    if ($thisModule instanceof 'ACMS_POST_Entry_Insert') {
        // エントリー登録前に何らかの処理を行う
    }
}

afterPostFire($thisModule)

説明: POST モジュール処理後に呼ばれます。$thisModule のプロパティを参照・操作できます。

パラメータ

説明

$thisModule

\ACMS_POST

対象の POST モジュール

戻り値: void

サンプル: POST モジュール処理後の処理追加(公式ドキュメントより)

public function afterPostFire($thisModule)
{
    if ($thisModule instanceof \ACMS_POST_Entry_Update) {
        // エントリー登録・更新の後に何らかの処理を行う(Insert は Update を継承)
        // POST モジュールの持っていた関連パラメータを参照できます
        // var_dump($thisModule);
    }
}

beforeBuild(&$tpl)

説明: ビルド前(GET モジュール解決前)に呼ばれます。

パラメータ

説明

$tpl

string

テンプレート文字列(参照渡し)

戻り値: void

サンプル:

public function beforeBuild(&$tpl)
{
    // ビルド前のテンプレートに対する一括置換など
    $tpl = str_replace('{{DEBUG_MODE}}', DEBUG_MODE ? '1' : '0', $tpl);
}

afterBuild(&$res)

説明: ビルド後(GET モジュール解決後)に呼ばれます。

注意: 空白の除去・文字コードの変換は、このフックのに行われます。

パラメータ

説明

$res

string

レスポンス文字列(参照渡し)

戻り値: void

サンプル: ビルド後のレスポンス文字列に対するフィルタ(公式ドキュメントより)

public function afterBuild(&$res)
{
    // ここでの $res は参照渡しされています
    $res = str_replace('%[ORIGINAL_VAR]%', 'オリジナル変数の置き換え', $res);
}

beforeResponse(&$res)

説明: HTTP レスポンス直前に呼ばれます。

パラメータ

説明

$res

string

レスポンス文字列(参照渡し)

戻り値: void

サンプル:

public function beforeResponse(&$res)
{
    // 最終的な HTML 出力に対するフィルタ
    $res = preg_replace('/\s+/', ' ', $res);  // 余分な空白を削除
}

saveEntry($eid, $revisionId)

説明: エントリー作成・更新時、またはエントリーインポート時(CSV, WordPress, Movable Type)に呼ばれます。

パラメータ

説明

$eid

int

エントリーID

$revisionId

int|null

リビジョンID

戻り値: void

サンプル:

public function saveEntry($eid, $revisionId)
{
    // エントリー保存後に外部サービスへ通知するなど
}

saveMedia($mid, $method, $isUpload)

説明: メディア作成・更新時に呼ばれます。

パラメータ

説明

$mid

int

メディアID

$method

string

新規・更新(insert | update | 空文字)

$isUpload

bool

アップロードファイルがあるかどうか

戻り値: void

サンプル:

public function saveMedia($mid, $method, $isUpload)
{
    $data = \Media::getMedia($mid);
    // メディア保存後にサムネイル生成や外部ストレージへの同期など
}

formSubmit($mail, $mailAdmin)

説明: フォームの送信後(ログ保存後)に呼ばれます。

パラメータ

説明

$mail

array

自動返信メール設定

$mailAdmin

array

管理者宛メール設定

戻り値: void

サンプル:

public function formSubmit($mail, $mailAdmin)
{
    // フォーム送信時に CRM へデータを送信するなど
}

beforeSendAutoReply($thisModule, &$abort, $mail, $field)

説明: 自動返信メール送信前に呼ばれます。$aborttrue にすると、メール送信を中止できます。

パラメータ

説明

$thisModule

\ACMS_POST_Form_Submit

POST モジュール

$abort

bool

メール送信を中止するかどうか(参照渡し)

$mail

\Field

メール設定フィールド

$field

\Field_Validation

フォームフィールド

戻り値: void

サンプル:

public function beforeSendAutoReply(
    \ACMS_POST_Form_Submit $thisModule,
    bool &$abort,
    \Field $mail,
    \Field_Validation $field,
): void {
    // 特定の条件でメール送信を中止
    if ($mail->get('To') === 'test@example.com') {
        $abort = true;
        $thisModule->Post->set('step', 'forbidden');
    }

    // メール設定を変更
    // $mail->set('AdminTo', 'admin@example.com');
}

approvalNotification($data, &$send)

説明: 承認通知時に呼ばれます。$sendfalse を設定すると、デフォルトのメール送信を抑制できます。

パラメータ

説明

$data

array

通知データ

$send

bool

メール送信可否(参照渡し、デフォルト: true

戻り値: void

サンプル:

public function approvalNotification($data, &$send = true)
{
    // 独自の承認通知処理を行う場合、デフォルトのメール送信を抑制
    // $send = false;
    // 自前でメール送信や Slack 通知など
}

beforeShutdown()

説明: 処理の一番最後のシャットダウン時に呼ばれます。

パラメータ: なし

戻り値: void

サンプル:

public function beforeShutdown()
{
    // ログ出力、リソースの解放など
}

extendsGlobalVars(&$globalVars)

説明: グローバル変数を拡張します。

パラメータ

説明

$globalVars

\Field

グローバル変数フィールド(参照渡し)

戻り値: void

サンプル: 独自グローバル変数の作成(公式ドキュメントより)

public function extendsGlobalVars(&$globalVars)
{
    // html に %{GLOBALVARS} と記載すると、画面で見た時に「グローバルへんすう」と表示
    $globalVars->setField('GLOBALVARS', 'グローバルへんすう');
    // または
    // $globalVars->set('key', 'var');
}

extendsQuoteUnit($url, &$html)

説明: 埋め込みユニット(旧: 引用ユニット)を拡張します。$html に値を設定すると、その値を埋め込みユニットの HTML として保存します。

パラメータ

説明

$url

string

URL

$html

string

整形後 HTML(参照渡し)

戻り値: void

サンプル:

public function extendsQuoteUnit($url, &$html)
{
    // 埋め込み URL から取得した HTML をカスタマイズ
    // $html = '<blockquote>' . $html . '</blockquote>';
}

extendsVideoUnit($url, &$videoId)

説明: ビデオユニットを拡張します。$videoId に値を設定すると、その値をビデオ ID として保存します。

パラメータ

説明

$url

string

ユニットに設定された URL

$videoId

string

上書き用の Video ID(参照渡し)

戻り値: void

サンプル:

public function extendsVideoUnit($url, &$videoId)
{
    // 独自の動画サービス URL から ID を抽出
    $parsed_url = parse_url($url);
    if (!empty($parsed_url['path'])) {
        $videoId = preg_replace('@/@', '', $parsed_url['path']);
    }
}

cacheRefresh()

説明: キャッシュのリフレッシュ時に呼ばれます。

パラメータ: なし

戻り値: void

サンプル:

public function cacheRefresh()
{
    // キャッシュリフレッシュ時に外部キャッシュのクリアなど
}

cacheClear()

説明: キャッシュのクリア時に呼ばれます。

パラメータ: なし

戻り値: void

サンプル:

public function cacheClear()
{
    // キャッシュクリア時の追加処理
}

mediaCreate($path)

説明: メディアデータ作成時に呼ばれます。

パラメータ

説明

$path

string

作成先パス

戻り値: void

サンプル:

public function mediaCreate($path)
{
    // メディア作成時にディレクトリのパーミッション設定など
}

mediaDelete($path)

説明: メディアデータ削除時に呼ばれます。

パラメータ

説明

$path

string

削除パス

戻り値: void

サンプル:

public function mediaDelete($path)
{
    // メディア削除時に外部ストレージからも削除するなど
}

filterEntryFulltext(&$entry, &$field, $entryId)

説明: エントリーのフルテキスト検索対象をカスタマイズします。$entry$field から要素を unset すると、該当項目を検索対象から除外できます。

パラメータ

説明

$entry

array<string, string>

エントリーデータ(参照渡し)

$field

array<string, string[]>

カスタムフィールド(参照渡し)

$entryId

int

エントリーID

戻り値: void

サンプル:

public function filterEntryFulltext(array &$entry, array &$field, int $entryId): void
{
    // エントリーIDとコードをフルテキスト検索から除外する
    unset($entry['id'], $entry['code']);

    // 特定のフィールドをフルテキスト検索から除外する
    $exceptFields = ['private_field', 'internal_memo'];
    foreach ($exceptFields as $exceptField) {
        unset($field[$exceptField]);
    }
}

filterUserFulltext(&$user, &$field, $userId)

説明: ユーザーのフルテキスト検索対象をカスタマイズします。

パラメータ

説明

$user

array<string, string>

ユーザーデータ(参照渡し)

$field

array<string, string[]>

カスタムフィールド(参照渡し)

$userId

int

ユーザーID

戻り値: void

サンプル:

public function filterUserFulltext(array &$user, array &$field, int $userId): void
{
    // メールアドレスをフルテキスト検索から除外する
    unset($user['mail'], $user['mail_mobile']);

    $exceptFields = ['private_field', 'internal_memo'];
    foreach ($exceptFields as $exceptField) {
        unset($field[$exceptField]);
    }
}

filterCategoryFulltext(&$category, &$field, $categoryId)

説明: カテゴリーのフルテキスト検索対象をカスタマイズします。

パラメータ

説明

$category

array<string, string>

カテゴリーデータ(参照渡し)

$field

array<string, string[]>

カスタムフィールド(参照渡し)

$categoryId

int

カテゴリーID

戻り値: void

サンプル:

public function filterCategoryFulltext(array &$category, array &$field, int $categoryId): void
{
    unset($category['code']);
    $exceptFields = ['internal_note', 'admin_memo'];
    foreach ($exceptFields as $exceptField) {
        unset($field[$exceptField]);
    }
}

filterBlogFulltext(&$blog, &$field, $blogId)

説明: ブログのフルテキスト検索対象をカスタマイズします。

パラメータ

説明

$blog

array<string, string>

ブログデータ(参照渡し)

$field

array<string, string[]>

カスタムフィールド(参照渡し)

$blogId

int

ブログID

戻り値: void

サンプル:

public function filterBlogFulltext(array &$blog, array &$field, int $blogId): void
{
    unset($blog['domain']);
    $exceptFields = ['private_setting', 'system_config'];
    foreach ($exceptFields as $exceptField) {
        unset($field[$exceptField]);
    }
}

unserializeAllowedClasses(&$classes)

説明: デリアライズ(unserialize)可能なクラスを追加します。セキュリティのため、デフォルトで許可されているクラス以外は unserialize できません。必要なクラスをこの配列に追加してください。

パラメータ

説明

$classes

string[]

デフォルトで許可されているクラスの配列(参照渡し)

戻り値: void

サンプル:

public function unserializeAllowedClasses(array &$classes): void
{
    $classes[] = \Acms\Plugins\SamplePlugin\SampleClass::class;
}