メッセージのカスタマイズ

不正なリクエストトークンのメッセージは言語の設定に関係なく英語で表示されます。幸い、テンプレートによるカスタマイズで各国語の表示をするようにカスタマイズできます。

Contao 3.1.RC1から、リクエストトークンを含んだ様々なエラーメッセージも各国語に対応しましたので、このようなカスタマイズも不要になりました。

元のテンプレートのファイル

元のテンプレートのファイルは system/modules/backend/templates/be_referer.html5 で内容は以下のようになっています。

be_referer.html5の内容
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="utf-8">
<title>Contao Open Source CMS</title>
<style media="screen">
(スタイルシートの定義...)
</style>
</head>
<body>

<div>

<h1>Invalid request token!</h1>

<p>The request token could not be verified. Please <a href="javascript:window.location.href=window.location.href;">go back</a> and try again.</p>
<p>This error occurres if there is a POST request without a valid authentication token. In Contao 2.10, the referer check has been replaced with a request token system. If the problem persists, you are maybe using an incompatible third-party extension or have not correctly updated your Contao installation.</p>
<p>For more information, visit the <a href="http://www.contao.org/faq.html" onclick="window.open(this.href); return false;">Contao FAQ page</a> or search the <a href="http://www.contao-community.org" onclick="window.open(this.href); return false;">Contao forum</a>.</p>

</div>
<p class="hint">To customize this notice, create a custom template file named <em>templates/be_referer.tpl</em>.</p>

</body>
</html>

カスタマイズする上での注意点

オリジナルのテンプレートのファイルの内容から以下のことがわかります。

  • 言語を"en"、英語が決め打ちで指定しています。
  • 文字エンコーディングは"utf-8"で、こちらも決め打ちで指定しています。

また、通常のテンプレートのファイルと異なり、Templateクラスで処理はされないことに注意が必要です。

カスタマイズの実際

テンプレートのファイルを単に日本語化することもできますが、ここでは少し汎用的な方向を目指して各言語のファイルを別に用意することにします。

バックエンドのテンプレートで、新しいテンプレートのファイルを be_referer.html5 をコピーして作成します。さらに、これをコピーして be_referer.ja.html5 というテンプレートのファイルも用意します。それぞれの内容は次のようにします。

カスタマイズしたbe_referer.html5
<?php
    $lang = $GLOBALS['TL_LANGUAGE'];
    $charset = $GLOBALS['TL_CONFIG']['characterSet'];

    $template = TL_ROOT . '/templates/be_referer.' . $lang . '.html5';
    $template_lang = $template;
    if (!file_exists($template))
    {
        $template = TL_ROOT . '/system/modules/backend/templates/be_referer.html5';
    }
    if (file_exists($template)) {
        include($template);
    } else {
        echo 'Invalid request token. Please <a href="javascript:window.location.href=window.location.href">go back</a> and try again.';
    }
?>
be_referer.ja.html5
<html lang="<?php echo $lang; ?>">
<head>
<meta charset="<?php echo $charset; ?>">
<title>Contao Open Source CMS</title>
<style media="screen">
a { text-decoration:none; }
div { width:520px; margin:64px auto 18px; padding:18px 18px 9px; background:#ffc; border:1px solid #fc0; font-family:Verdana,sans-serif; font-size:12px; }
h1 { font-size:18px; font-weight:bold; margin:0 0 18px; }
p { line-height:1.5; }
.hint { font-size:11px; color:#999; font-family:Verdana,sans-serif; text-align:center; }
</style>
</head>
<body>

<div>

<h1>無効なリクエストトークン!</h1>

<p>リクエストトークンを検証できませんでした。<a href="javascript:window.location.href=window.location.href">ここから戻って</a>もう一度試してください。</p>
<p>このエラーは有効な認証キーを持たないPOSTリクエストで発生します。Contao 2.10からリファラーの検査をリクエストトークンのシステムに置き換えました。この問題が継続して発生する場合は互換性がない第三者の機能拡張を使用しているか、インストールしたContaoを正しく更新できていないかもしれません。</p>
<p>さらに詳しい情報は<a href="http://www.contao.org/faq.html" target="_blank">ContaoのFAQのページ</a>を参照するか、<a href="http://www.contao-community.org" target="_blank">Contaoのフォーラム</a>を検索してください。</p>

</div>

<p class="hint">この注意をカスタマイズするには、 <em>be_referer.html5</em> という名前のカスタマイズしたテンプレートのファイルを作成してください。</p>

</body>
</html>

ここでは be_referer.html5 で以下のような処理を行っています。

  1. 現在の言語と文字エンコーディングを得て、ローカルな変数に代入
  2. 現在の言語の言語コードを元に、テンプレートのファイル名(日本語だと be_referer.ja.html5 )を生成
  3. 生成した名前のテンプレートのファイルが存在すれば、それをincludeして表示
  4. 存在しなければオリジナルのbackendモジュールにあるテンプレートのファイルをinckudeして表示
  5. (通常、そういうことはないはずですが)4.のファイルも存在しなければ、固定した英語のメッセージを表示

本来は、ここまで複雑なロジックをテンプレートのファイル内で行うべきではありませんが、Contao本体のファイルを変更せずに対応できています。

うまくカスタマイズすると、次の図のようになります。

Invalid Request in Japanese