フック処理
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)
説明: 権限チェック時に呼ばれます。
パラメータ | 型 | 説明 |
|---|---|---|
|
| ユーザーID |
|
| ブログID |
戻り値: void
header($cache)
説明: HTTP ヘッダーの指定を行います。キャッシュ利用時の Vary ヘッダーなどを設定できます。
パラメータ | 型 | 説明 |
|---|---|---|
|
| キャッシュ利用可否 |
戻り値: 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 情報( |
戻り値: 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)
説明: ルール判定で使用するカスタム値を設定します。ここで設定した値をルール判定に使用できます。
パラメータ | 型 | 説明 |
|---|---|---|
|
| カスタム値(参照渡し) |
戻り値: void
サンプル:
public function customRuleValue(&$value)
{
$value = 'custom_value'; // ルール判定で使用する値
}addCacheRule(&$customRuleString)
説明: キャッシュルールに特殊ルールを追加します。
パラメータ | 型 | 説明 |
|---|---|---|
|
| カスタムルール文字列(参照渡し) |
戻り値: void
サンプル: デバイスによってキャッシュを分ける場合
public function addCacheRule(&$customRuleString)
{
// ここで指定した文字列毎にキャッシュが分けられます
$customRuleString = UA_GROUP;
}addGlobalVarsInIncludePath(&$globalVarNames)
説明: テンプレートキャッシュ有効時に、インクルードのパスで使用できるグローバル変数を設定します。
注意: ページ毎に値が違うようなグローバル変数を設定しないでください。値別にキャッシュが作成されるため、値の種類が多いとキャッシュの意味がなくなります。
パラメータ | 型 | 説明 |
|---|---|---|
|
| グローバル変数名の配列(参照渡し) |
戻り値: void
サンプル: インクルードのパスで使用できるグローバル変数を追加
public function addGlobalVarsInIncludePath(&$globalVarNames)
{
// インクルード文に %{SESSION_USER_AUTH} と %{HOGE} を使えるようにする
$globalVarNames = ['SESSION_USER_AUTH', 'HOGE'];
}beforeGetFire(&$tpl, $thisModule)
説明: 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 モジュール処理後に呼ばれます。解決済みテンプレートの中間処理などに使用します。
パラメータ | 型 | 説明 |
|---|---|---|
|
| 解決済みテンプレート(参照渡し) |
|
| 対象の GET モジュール |
戻り値: void
サンプル:
public function afterGetFire(&$res, $thisModule)
{
// 解決済みテンプレートに対する後処理
$res = str_replace('<!-- placeholder -->', '置換後のコンテンツ', $res);
}afterV2GetFire(&$response, $thisModule)
説明: V2 GET モジュール処理後に呼ばれます。モジュールが返した配列を参照・加工できます。
パラメータ | 型 | 説明 |
|---|---|---|
|
| モジュールが返した配列(参照渡し) |
|
| 対象の V2 GET モジュール |
戻り値: void
サンプル:
public function afterV2GetFire(array &$response, \Acms\Modules\Get\V2\Base $thisModule)
{
// レスポンス配列に項目を追加
$response['customField'] = '追加した値';
}beforePostFire($thisModule)
説明: POST モジュール処理前に呼ばれます。$thisModule のプロパティを参照・操作できます。
パラメータ | 型 | 説明 |
|---|---|---|
|
| 対象の POST モジュール |
戻り値: void
サンプル:
public function beforePostFire($thisModule)
{
if ($thisModule instanceof 'ACMS_POST_Entry_Insert') {
// エントリー登録前に何らかの処理を行う
}
}afterPostFire($thisModule)
説明: POST モジュール処理後に呼ばれます。$thisModule のプロパティを参照・操作できます。
パラメータ | 型 | 説明 |
|---|---|---|
|
| 対象の POST モジュール |
戻り値: void
サンプル: POST モジュール処理後の処理追加(公式ドキュメントより)
public function afterPostFire($thisModule)
{
if ($thisModule instanceof \ACMS_POST_Entry_Update) {
// エントリー登録・更新の後に何らかの処理を行う(Insert は Update を継承)
// POST モジュールの持っていた関連パラメータを参照できます
// var_dump($thisModule);
}
}beforeBuild(&$tpl)
説明: ビルド前(GET モジュール解決前)に呼ばれます。
パラメータ | 型 | 説明 |
|---|---|---|
|
| テンプレート文字列(参照渡し) |
戻り値: void
サンプル:
public function beforeBuild(&$tpl)
{
// ビルド前のテンプレートに対する一括置換など
$tpl = str_replace('{{DEBUG_MODE}}', DEBUG_MODE ? '1' : '0', $tpl);
}afterBuild(&$res)
説明: ビルド後(GET モジュール解決後)に呼ばれます。
注意: 空白の除去・文字コードの変換は、このフックの後に行われます。
パラメータ | 型 | 説明 |
|---|---|---|
|
| レスポンス文字列(参照渡し) |
戻り値: void
サンプル: ビルド後のレスポンス文字列に対するフィルタ(公式ドキュメントより)
public function afterBuild(&$res)
{
// ここでの $res は参照渡しされています
$res = str_replace('%[ORIGINAL_VAR]%', 'オリジナル変数の置き換え', $res);
}beforeResponse(&$res)
説明: HTTP レスポンス直前に呼ばれます。
パラメータ | 型 | 説明 |
|---|---|---|
|
| レスポンス文字列(参照渡し) |
戻り値: void
サンプル:
public function beforeResponse(&$res)
{
// 最終的な HTML 出力に対するフィルタ
$res = preg_replace('/\s+/', ' ', $res); // 余分な空白を削除
}saveEntry($eid, $revisionId)
説明: エントリー作成・更新時、またはエントリーインポート時(CSV, WordPress, Movable Type)に呼ばれます。
パラメータ | 型 | 説明 |
|---|---|---|
|
| エントリーID |
|
| リビジョンID |
戻り値: void
サンプル:
public function saveEntry($eid, $revisionId)
{
// エントリー保存後に外部サービスへ通知するなど
}saveMedia($mid, $method, $isUpload)
説明: メディア作成・更新時に呼ばれます。
パラメータ | 型 | 説明 |
|---|---|---|
|
| メディアID |
|
| 新規・更新( |
|
| アップロードファイルがあるかどうか |
戻り値: void
サンプル:
public function saveMedia($mid, $method, $isUpload)
{
$data = \Media::getMedia($mid);
// メディア保存後にサムネイル生成や外部ストレージへの同期など
}formSubmit($mail, $mailAdmin)
説明: フォームの送信後(ログ保存後)に呼ばれます。
パラメータ | 型 | 説明 |
|---|---|---|
|
| 自動返信メール設定 |
|
| 管理者宛メール設定 |
戻り値: void
サンプル:
public function formSubmit($mail, $mailAdmin)
{
// フォーム送信時に CRM へデータを送信するなど
}beforeSendAutoReply($thisModule, &$abort, $mail, $field)
説明: 自動返信メール送信前に呼ばれます。$abort を true にすると、メール送信を中止できます。
パラメータ | 型 | 説明 |
|---|---|---|
|
| POST モジュール |
|
| メール送信を中止するかどうか(参照渡し) |
|
| メール設定フィールド |
|
| フォームフィールド |
戻り値: 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)
説明: 承認通知時に呼ばれます。$send に false を設定すると、デフォルトのメール送信を抑制できます。
パラメータ | 型 | 説明 |
|---|---|---|
|
| 通知データ |
|
| メール送信可否(参照渡し、デフォルト: |
戻り値: void
サンプル:
public function approvalNotification($data, &$send = true)
{
// 独自の承認通知処理を行う場合、デフォルトのメール送信を抑制
// $send = false;
// 自前でメール送信や Slack 通知など
}beforeShutdown()
説明: 処理の一番最後のシャットダウン時に呼ばれます。
パラメータ: なし
戻り値: void
サンプル:
public function beforeShutdown()
{
// ログ出力、リソースの解放など
}extendsGlobalVars(&$globalVars)
説明: グローバル変数を拡張します。
パラメータ | 型 | 説明 |
|---|---|---|
|
| グローバル変数フィールド(参照渡し) |
戻り値: void
サンプル: 独自グローバル変数の作成(公式ドキュメントより)
public function extendsGlobalVars(&$globalVars)
{
// html に %{GLOBALVARS} と記載すると、画面で見た時に「グローバルへんすう」と表示
$globalVars->setField('GLOBALVARS', 'グローバルへんすう');
// または
// $globalVars->set('key', 'var');
}extendsQuoteUnit($url, &$html)
説明: 埋め込みユニット(旧: 引用ユニット)を拡張します。$html に値を設定すると、その値を埋め込みユニットの HTML として保存します。
パラメータ | 型 | 説明 |
|---|---|---|
|
| URL |
|
| 整形後 HTML(参照渡し) |
戻り値: void
サンプル:
public function extendsQuoteUnit($url, &$html)
{
// 埋め込み URL から取得した HTML をカスタマイズ
// $html = '<blockquote>' . $html . '</blockquote>';
}extendsVideoUnit($url, &$videoId)
説明: ビデオユニットを拡張します。$videoId に値を設定すると、その値をビデオ ID として保存します。
パラメータ | 型 | 説明 |
|---|---|---|
|
| ユニットに設定された URL |
|
| 上書き用の 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)
説明: メディアデータ作成時に呼ばれます。
パラメータ | 型 | 説明 |
|---|---|---|
|
| 作成先パス |
戻り値: void
サンプル:
public function mediaCreate($path)
{
// メディア作成時にディレクトリのパーミッション設定など
}mediaDelete($path)
説明: メディアデータ削除時に呼ばれます。
パラメータ | 型 | 説明 |
|---|---|---|
|
| 削除パス |
戻り値: void
サンプル:
public function mediaDelete($path)
{
// メディア削除時に外部ストレージからも削除するなど
}filterEntryFulltext(&$entry, &$field, $entryId)
説明: エントリーのフルテキスト検索対象をカスタマイズします。$entry や $field から要素を unset すると、該当項目を検索対象から除外できます。
パラメータ | 型 | 説明 |
|---|---|---|
|
| エントリーデータ(参照渡し) |
|
| カスタムフィールド(参照渡し) |
|
| エントリー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)
説明: ユーザーのフルテキスト検索対象をカスタマイズします。
パラメータ | 型 | 説明 |
|---|---|---|
|
| ユーザーデータ(参照渡し) |
|
| カスタムフィールド(参照渡し) |
|
| ユーザー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)
説明: カテゴリーのフルテキスト検索対象をカスタマイズします。
パラメータ | 型 | 説明 |
|---|---|---|
|
| カテゴリーデータ(参照渡し) |
|
| カスタムフィールド(参照渡し) |
|
| カテゴリー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)
説明: ブログのフルテキスト検索対象をカスタマイズします。
パラメータ | 型 | 説明 |
|---|---|---|
|
| ブログデータ(参照渡し) |
|
| カスタムフィールド(参照渡し) |
|
| ブログ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 できません。必要なクラスをこの配列に追加してください。
パラメータ | 型 | 説明 |
|---|---|---|
|
| デフォルトで許可されているクラスの配列(参照渡し) |
戻り値: void
サンプル:
public function unserializeAllowedClasses(array &$classes): void
{
$classes[] = \Acms\Plugins\SamplePlugin\SampleClass::class;
}