フックを使用してContaoにカスタム機能を追加する方法
フックはデータコンテナ配列のコールバック関数と似た動作をします。特定のイベントに1つ以上の関数を登録でき、イベントが起きると登録した関数が呼び出されます。フックによってコアにカスタム機能を追加できます。
activateAccount ¶
activateAccountフックは新しいフロントエンドのアカウントを有効したときに呼び出します。フック関数の引数にはユーザーオブジェクトを渡し、戻り値は使用しません。バージョン2.4.3から利用可能です。
// config.php
$GLOBALS['TL_HOOKS']['activateAccount'][] = array('MyClass', 'myActivateAccount');
// MyClass.php
public function myActivateAccount(Database_Result $objUser)
{
// Do something
}
activateRecipient ¶
activateRecipientフックはニュースレターの新しい宛先を追加したときに呼び出します。フック関数の引数には電子メールアドレス、宛先のID、チャンネルのIDを渡し、戻りは使用しません。バージョン2.8.RC1から利用可能です。
// config.php
$GLOBALS['TL_HOOKS']['activateRecipient'][] = array('MyClass', 'myActivateRecipient');
// MyClass.php
public function myActivateRecipient($strEmail, $arrRecipients, $arrChannels)
{
// Do something
}
addComment ¶
addCommentフックはコメントを追加したときに呼び出します。 フック関数の引数にはレコードのIDとデータ配列を渡し、戻り値は使用しません。バージョン2.8.2から利用可能です。
// config.php
$GLOBALS['TL_HOOKS']['addComment'][] = array('MyClass', 'myAddComment');
// MyClass.php
public function myAddComment($intId, $arrSet)
{
// Do something
}
addCustomRegexp ¶
addCustomRegexpフックは不明な正規表現をみつけたときに呼び出します。フック関数の引数には正規表現の名前、現在の値、ウィジェットオブジェクトを渡し、論理値を戻り値とします。バージョン2.6.2から利用可能です。
// config.php
$GLOBALS['TL_HOOKS']['addCustomRegexp'][] = array('MyClass', 'myAddCustomRegexp');
// MyClass.php
public function myAddCustomRegexp($strRegexp, $varValue, Widget $objWidget)
{
if ($strRegexp == 'postal')
{
if (!preg_match('/^0-9{4,6}$/', $varValue))
{
$objWidget->addError('Field ' . $objWidget->label . ' should be a postal code.');
}
return true;
}
return false;
}
addLogEntry ¶
addLogEntryフックは新しいログの項目を追加したときに呼び出します。フック関数の引数にはメッセージ、(ログの元となった)関数、アクションを渡し、戻り値は使用しません。バージョン2.8.RC1から利用可能です。
// config.php
$GLOBALS['TL_HOOKS']['addLogEntry'][] = array('MyClass', 'myAddLogEntry');
// MyClass.php
public function myAddLogEntry($strText, $strFunction, $strAction)
{
// Do something
}
checkCredentials ¶
checkCredentialsフックは間違ったパスワードによってログインに失敗したときに呼び出します。フック関数の引数にはユーザーオブジェクトに加えて、ユーザー名、パスワードが渡され、論理値を戻り値とします。バージョン2.6.0から利用可能です。
// config.php
$GLOBALS['TL_HOOKS']['checkCredentials'][] = array('MyClass', 'myCheckCredentials');
// MyClass.php
public function myCheckCredentials($strUsername, $strPassword, User $objUser)
{
// Check against a global database
if ($this->checkGlobalDbFor($strUsername, $strPassword))
{
return true;
}
return false;
}
closeAccount ¶
closeAccountフックはユーザーがアカウントを廃止したときに呼び出します。フック関数の引数にはユーザーのID、操作モード、モジュールを渡し、戻り値は使用しません。バージョン2.8.0から利用可能です。
// config.php
$GLOBALS['TL_HOOKS']['closeAccount'][] = array('MyClass', 'myCloseAccount');
// MyClass.php
public function myCloseAccount($intId, $strMode, $objModule)
{
if ($strMode == 'close_delete')
{
// Do something
}
}
compileDefinition ¶
compileDefinitionフックはスタイルシートの書式定義が書き込まれたときに呼び出します。フック関数の引数には構成配列を渡し、文字列を戻り値とします。バージョン2.9.4から利用可能です。
// config.php
$GLOBALS['TL_HOOKS']['compileDefinition'][] = array('MyClass', 'myCompileDefinition');
// MyClass.php
public function myCompileDefinition($arrRow)
{
if (isset($arrRow['border-radius']))
{
return "\nborder-radius:" . $arrRow['border-radius'] . ";";
}
return '';
}
createDefinition ¶
createDefinitionフックはスタイルシートの書式定義がインポートされたときに呼び出します。フック関数の引数にはキーと値、元の書式定義、データ配列が渡され、配列またはfalseを戻り値とします。バージョン2.9.4から利用可能です。
// config.php
$GLOBALS['TL_HOOKS']['createDefinition'][] = array('MyClass', 'myCreateDefinition');
// MyClass.php
public function myCreateDefinition($strKey, $strValue, $strDefinition, $arrSet)
{
if ($strKey == 'border-radius')
{
return array('border-radius'=>$strValue);
}
return false;
}
createNewUser ¶
createNewUserフックはウェブサイトに新しいフロントエンドのユーザーを登録したときに呼び出します。フック関数の引数には新しいユーザーのIDとデータ配列が渡され、戻り値は使用しません。バージョン2.2.0から利用可能です。
// config.php
$GLOBALS['TL_HOOKS']['createNewUser'][] = array('MyClass', 'myCreateNewUser');
// MyClass.php
public function myCreateNewUser($intId, $arrData)
{
// Modify the record
}
executePreActions ¶
executePreActionsフックは応答を求めないAjaxをリクエストの前に呼び出します。フック関数の引数にはアクションの名前を渡し、戻り値は使用しません。バージョン2.6.1から利用可能です。
// config.php
$GLOBALS['TL_HOOKS']['executePreActions'][] = array('MyClass', 'myExecutePreActions');
// MyClass.php
public function myExecutePreActions($strAction)
{
if ($strAction == 'update')
{
// Do something
}
}
executePostActions ¶
executePostActionsフックは応答を求めないAjaxのリクエストの後で呼び出します。フック関数の引数にはアクションの名前とデータコンテナオブジェクトを渡し、戻り値は使用しません。バージョン2.6.1から利用可能です。
// config.php
$GLOBALS['TL_HOOKS']['executePostActions'][] = array('MyClass', 'myExecutePostActions');
// MyClass.php
public function myExecutePostActions($strAction, DataContainer $dc)
{
if ($strAction == 'update')
{
// Do something
}
}
generateFrontendUrl ¶
generateFrontendUrlフックはフロントエンドのURLを再作成したときに呼び出します。フック関数の引数にはページオブジェクト、パラメーター引数、デフォルトのURLが渡し、文字列を戻り値とします。バージョン2.5.8から利用可能です。
// config.php
$GLOBALS['TL_HOOKS']['generateFrontendUrl'][] = array('MyClass', 'myGenerateFrontendUrl');
// MyClass.php
public function myGenerateFrontendUrl(Database_Result $objPage, $strParams, $strUrl)
{
return str_replace('.html', '.xml', $strUrl);
}
generatePage ¶
generatePageフックは主となるレイアウト(fe_page)を処理する前に呼び出します。フック関数の引数にはページオブジェクトと自身への参照を渡し、戻り値は使用しません。バージョン2.8.RC1から利用可能です。
// config.php
$GLOBALS['TL_HOOKS']['generatePage'][] = array('MyClass', 'myGeneratePage');
// MyClass.php
public function myGeneratePage(Database_Result $objPage, Database_Result $objLayout, PageRegular $objPageRegular)
{
// Do something
}
getAllEvents ¶
getAllEventsフックにより、カレンダーとイベントモジュールの結果のセットを変更できます。フック関数の引数には現在の結果のセット、親の項目のID、開始と終了の時刻を渡し、結果のセット(配列)を戻り値とします。バージョン2.6.4から利用可能です。
// config.php
$GLOBALS['TL_HOOKS']['getAllEvents'][] = array('MyClass', 'myGetAllEvents');
// MyClass.php
public function myGetAllEvents($arrEvents, $arrCalendars, $intStart, $intEnd)
{
ksort($arrEvents);
return $arrEvents;
}
getContentElement ¶
getContentElementフックはコンテント要素を表示(レンダリング)するときに呼び出します。フック関数の引数にはデータベースオブジェクトとバッファー文字列を渡し、バッファー文字列を戻り値とします。バージョン2.9.0から利用可能です。
// config.php
$GLOBALS['TL_HOOKS']['getContentElement'][] = array('MyClass', 'myGetContentElement');
// MyClass.php
public function myGetContentElement(Database_Result $objElement, $strBuffer)
{
return $strBuffer;
}
getImage ¶
getImageフックはサムネイルを生成したときに呼び出し、カスタム処理を追加できます。フック関数の引数にはパス、幅と高さ、モード、キャッシュの名前、ファイルオブジェクトを私、パスを戻り値とします。バージョン2.8から利用可能です。
// config.php
$GLOBALS['TL_HOOKS']['getImage'][] = array('MyClass', 'myGetImage');
// MyClass.php
public function myGetImage($image, $width, $height, $mode, $strCacheName, $objFile)
{
return MyImage::generateThumbnail($image, $widht, $height, $mode);
}
getPageIdFromUrl ¶
getPageIdFromUrlフックはURLの断片を評価したときに呼び出します。フック関数の引数にはURLの断片が渡され、URLの断片の配列を戻り値とします。バージョン2.5.4から利用可能です。
// config.php
$GLOBALS['TL_HOOKS']['getPageIdFromUrl'][] = array('MyClass', 'myGetPageIdFromUrl');
// MyClass.php
public function myGetPageIdFromUrl($arrFragments)
{
return array_unique($arrFragments);
}
getSearchablePages ¶
getSearchablePagesフックは検索インデックスを再構築したときに呼び出します。フック関数の引数にはページの配列とルートページを渡し、完全なURL! の配列を戻り値とします。バージョン2.2.0から利用可能です。
// config.php
$GLOBALS['TL_HOOKS']['getSearchablePages'][] = array('MyClass', 'myGetSearchablePages');
// MyClass.php
public function myGetSearchablePages($arrPages, $intRoot)
{
return array_merge($arrPages, array('Additional pages'));
}
importUser ¶
importUserフックは、データベースにユーザー名を見つけられないときに呼び出します。フック関数の引数にはユーザー名、パスワード、テーブル名を引数として渡し、論理値を戻り値とします。バージョン2.7.RC1から利用可能です。
// config.php
$GLOBALS['TL_HOOKS']['importUser'][] = array('MyClass', 'myImportUser');
// MyClass.php
public function myImportUser($strUsername, $strPassword, $strTable)
{
if ($strTable == 'tl_member')
{
// Import user from an LDAP server
if ($this->importUserFromLdap($strUsername, $strPassword))
{
return true;
}
}
return false;
}
listComments ¶
listCommentsフックはコメントがバックエンドに一覧されるときに呼び出します。フック関数の引数には現在のレコードを渡し、文字列を戻り値とします。バージョン2.8.RC2から利用可能です。
// config.php
$GLOBALS['TL_HOOKS']['listComments'][] = array('MyClass', 'myListComments');
// MyClass.php
public function myListComments($arrRow)
{
return '<a href="contao/main.php?do= ... ">' . $arrRow['title'] . '</a>';
loadFormField ¶
loadFormFieldフックはフォームのフィールドを読み込んだときに呼び出します。フック関数の引数にはウィジェットのオブジェクト、フォームのID、フォームのデータを渡し、ウィジェットのオブジェクトを戻り値とします。バージョン2.5.0から利用可能です。
// config.php
$GLOBALS['TL_HOOKS']['loadFormField'][] = array('MyClass', 'myLoadFormField');
// MyClass.php
public function myLoadFormField(Widget $objWidget, $strForm, $arrForm)
{
$objWidget->class = 'myclass';
return $objWidget;
}
loadDataContainer ¶
loadDataContainerフックはDCAファイルを読み込んだときに呼び出します。フック関数の引数にはファイル名を渡し、戻り値は使用しません。バージョン2.8.2から利用可能です。
// config.php
$GLOBALS['TL_HOOKS']['loadDataContainer'][] = array('MyClass', 'myLoadDataContainer');
// MyClass.php
public function myLoadDataContainer($strName)
{
// Do something
}
loadLanguageFile ¶
loadLanguageFileフックは言語ファイルを読み込んだときに呼び出します。フック関数の引数にはファイル名と言語を渡し、戻り値は使用しません。バージョン2.8.RC1から利用可能です。
// config.php
$GLOBALS['TL_HOOKS']['loadLanguageFile'][] = array('MyClass', 'myLoadLanguageFile');
// MyClass.php
public function myLoadLanguageFile($strName, $strLanguage)
{
// Do something
}
outputBackendTemplate ¶
outputBackendTemplateフックはバックエンドのテンプレートを画面に表示したときに呼び出します。フック関数の引数にはテンプレートの内容とテンプレート名を渡し、テンプレートのコンテンツを戻り値とします。バージョン2.6.0から利用可能です。
// config.php
$GLOBALS['TL_HOOKS']['outputBackendTemplate'][] = array('MyClass', 'myOutputBackendTemplate');
// MyClass.php
public function myOutputBackendTemplate($strContent, $strTemplate)
{
if ($strTemplate == 'be_main')
{
// Modify output
}
return $strContent;
}
outputFrontendTemplate ¶
outputFrontendTemplateフックはフロントエンドのテンプレートを画面に表示したときに呼び出します。フック関数の引数にはテンプレートの内容とテンプレート名を渡し、テンプレートのコンテンツを戻り値とします。バージョン2.6.0から利用可能です。
// config.php
$GLOBALS['TL_HOOKS']['outputFrontendTemplate'][] = array('MyClass', 'myOutputFrontendTemplate');
// MyClass.php
public function myOutputFrontendTemplate($strContent, $strTemplate)
{
if ($strTemplate == 'fe_page')
{
// Modify output
}
return $strContent;
}
parseBackendTemplate ¶
parseBackendTemplateフックはバックエンドのテンプレートを解析したときに呼び出します。フック関数の引数にはテンプレートの内容とテンプレート名を渡し、テンプレートのコンテンツを戻り値とします。バージョン2.6.0から利用可能です。
// config.php
$GLOBALS['TL_HOOKS']['parseBackendTemplate'][] = array('MyClass', 'myParseBackendTemplate');
// MyClass.php
public function myParseBackendTemplate($strContent, $strTemplate)
{
if ($strTemplate == 'be_main')
{
// Modify output
}
return $strContent;
}
parseFrontendTemplate ¶
parseFrontendTemplateフックはフロントエンドのテンプレートを解析したときに呼び出します。フック関数の引数にはテンプレートの内容とテンプレート名を渡し、テンプレートのコンテンツを戻り値とします。バージョン2.6.0から利用可能です。
// config.php
$GLOBALS['TL_HOOKS']['parseFrontendTemplate'][] = array('MyClass', 'myParseFrontendTemplate');
// MyClass.php
public function myParseFrontendTemplate($strContent, $strTemplate)
{
if ($strTemplate == 'ce_text')
{
// Modify output
}
return $strContent;
}
postDownload ¶
postDownloadフックはコンテント要素のダウンロードや複数ダウンロードで、ファイルをダウンロードした後で呼び出します。フック関数の引数にはファイル名を渡し、戻り値は使用しません。バージョン2.4.6から利用可能です。
// config.php
$GLOBALS['TL_HOOKS']['postDownload'][] = array('MyClass', 'myPostDownload');
// MyClass.php
public function myPostDownload($strFile)
{
// Do something
}
postLogin ¶
postLoginフックはユーザーがフロントエンドにログインした後で呼び出します。フック関数の引数にはユーザーオブジェクトを渡し、戻り値は使用しません。バージョン2.4.3から利用可能です。
// config.php
$GLOBALS['TL_HOOKS']['postLogin'][] = array('MyClass', 'myPostLogin');
// MyClass.php
public function myPostLogin($objUser)
{
// Do something
}
postLogout ¶
postLogoutフックはユーザーがフロントエンドからログアウトした後で呼び出します。フック関数の引数にはユーザーオブジェクトを渡し、戻り値は使用しません。バージョン2.4.3から利用可能です。
// config.php
$GLOBALS['TL_HOOKS']['postLogout'][] = array('MyClass', 'myPostLogout');
// MyClass.php
public function myPostLogout(Database_Result $objUser)
{
// Do something
}
postUpload ¶
postUploadフックはユーザーがバックエンドで1つ、または複数のファイルをアップロードした後で呼び出します。フック関数の引数にはファイル名の配列を渡し、戻り値は使用しません。バージョン2.6.4から利用可能です。
// config.php
$GLOBALS['TL_HOOKS']['postUpload'][] = array('MyClass', 'myPostUpload');
// MyClass.php
public function myPostUpload($arrFiles)
{
// Do something
}
printArticleAsPdf ¶
printArticleAsPdfフックはアーティクルをPDFとしてエクスポートしたときに呼び出します。フック関数の引数にはアーティクルのテキストとアーティクルのオブジェクトを渡し、戻り値は使用しません。バージョン2.8.RC1から利用可能です。
// config.php
$GLOBALS['TL_HOOKS']['printArticleAsPdf'][] = array('MyClass', 'myPrintArticleAsPdf');
// MyClass.php
public function myPrintArticleAsPdf($strArticle, Database_Result $objArticle)
{
// Do something
}
// config.php
$GLOBALS['TL_HOOKS']['processFormData'][] = array('MyClass', 'myProcessFormData');
// MyClass.php
public function myProcessFormData($arrPost, $arrForm, $arrFiles)
{
// Do something
}
removeOldFeeds ¶
removeOldFeedsフックは古いXMLファイルをContaoのディレクトリから削除したときに呼び出します。フック関数の引数はなく、保存するためのファイル名の配列を戻り値とします。バージョン2.5.8から利用可能です。
// config.php
$GLOBALS['TL_HOOKS']['removeOldFeeds'][] = array('MyClass', 'myRemoveOldFeeds');
// MyClass.php
public function myRemoveOldFeeds()
{
return array('custom.xml');
}
removeRecipient ¶
removeRecipientフックはニュースレターの宛先を削除したときに呼び出します。フック関数の引数には電子メールアドレス、チャンネルのIDを渡し、戻りは使用しません。バージョン2.8.RC1から利用可能です。
// config.php
$GLOBALS['TL_HOOKS']['removeRecipient'][] = array('MyClass', 'myRemoveRecipient');
// MyClass.php
public function myRemoveRecipient($strEmail, $arrChannels)
{
// Do something
}
replaceInsertTags ¶
replaceInsertTagsフックは不明な挿入タグを見つけたときに呼び出します。フック関数の引数には挿入タグを渡し、置き換えた値かfalseを戻り値とします。バージョン2.6.0から利用可能です。
// config.php
$GLOBALS['TL_HOOKS']['replaceInsertTags'][] = array('MyClass', 'myReplaceInsertTags');
// MyClass.php
public function myReplaceInsertTags($strTag)
{
if ($strTag == 'mytag')
{
return 'mytag replacement';
}
return false;
}
reviseTable ¶
reviseTableフックはContaoが孤児となったレコードをテーブルから削除するときに呼び出します。フック関数の引数には現在のテーブル、新しいレコードのID、親のテーブルの名前、すべての子のテーブルを渡し、論理値を戻り値とします(trueを返すと現在のページを再読み込みすることになります)。バージョン2.6.4から利用可能です。
// config.php
$GLOBALS['TL_HOOKS']['reviseTable'][] = array('MyClass', 'myReviseTable');
// MyClass.php
public function myReviseTable($table, $new_records, $parent_table, $child_tables)
{
// Do something
}
setNewPassword ¶
setNewPasswordフックは新しいパスワードを設定した後で呼び出します。フック関数の引数にはユーザーオブジェクトと暗号化したパスワードを渡し、戻り値は使用しません。バージョン2.2.3から利用可能です。
// config.php
$GLOBALS['TL_HOOKS']['setNewPassword'][] = array('MyClass', 'mySetNewPassword');
// MyClass.php
public function mySetNewPassword($objUser, $strPassword)
{
// Do something
}
validateFormField ¶
validateFormFieldフックはフォームのフィールドが提出されたときに呼び出します。フック関数の引数にはウィジェットのオブジェクト、フォームのIDを渡し、ウィジェットのオブジェクトを戻り値とします。バージョン2.5.0から利用可能です。
// config.php
$GLOBALS['TL_HOOKS']['validateFormField'][] = array('MyClass', 'myValidateFormField');
// MyClass.php
public function myValidateFormField(Widget $objWidget, $intId)
{
if ($objWidget instanceof FormPassword)
{
// Do something
}
return $objWidget;
}
コメントを追加
Kamil Kuzminskiによるコメント| 2011年8月30日
"postLogin"と"postLogout"の2つのコールバックを使用する場合は、両方を1つの関数に割り当てることができます。
public function postLoginLogout(FrontendUser $objUser)
{
// ユーザーがログイン
if (!FE_USER_LOGGED_IN)
{
// ...
}
// ユーザーがログアウト
else
{
// ...
}
}
Tsarmaによるコメント| 2011年9月5日
用意されているgenerateBreadcrumbフックにも触れていません。これを使うとナビゲーション項目を出力する前に操作できます。
Fredによるコメント| 2011年9月14日
ドキュメントされていないフックがあります。
if (isset($GLOBALS['TL_HOOKS']['updatePersonalData']) && is_array($GLOBALS['TL_HOOKS']['updatePersonalData']))
{
foreach ($GLOBALS['TL_HOOKS']['updatePersonalData'] as $callback)
{
$this->import($callback[0]);
$this->$callback[0]->$callback[1]($this->User, $_SESSION['FORM_DATA']);
}
}
Kamil Kuzminskiによるコメント| 2011年9月28日
postLoginの例はContao 2.10以降では正しく動作しないでしょう、なぜならバックエンドのユーザーがログインした時も呼び出されるからです。従って、以下のようにコードを変更しなければなりません:
public function postLogin($objUser)
{
// Front end
if (TL_MODE == 'FE')
{
}
// Back end
elseif (TL_MODE == 'BE')
{
}
}
Kamil Kuzminskiによるコメント| 2011年12月23日
getSearchablePages()はrootのIDを渡さなくなっていることに注意してください!
Tsarmaによるコメント| 2011年12月23日
Templateを変更したいが、初期状態でテンプレートのドロップダウンがない状況ではparseTemplateフックが役に立ちます。
// HOOK: カスタマイズした解析フィルターを追加
if (isset($GLOBALS['TL_HOOKS']['parseTemplate']) && is_array($GLOBALS['TL_HOOKS']['parseTemplate']))
{
foreach ($GLOBALS['TL_HOOKS']['parseTemplate'] as $callback)
{
$this->import($callback[0]);
$this->$callback[0]->$callback[1]($this);
}
}
Kamil Kuzminskiによるコメント| 2011年6月21日
サイトマップを生成するときに、getSearchablePagesフックも呼び出されます。