エラーメッセージの分岐

一つのフィールドで複数のエラーを検知したい場合があります。例えば以下のように、必須だけではなく、数値のみ許可したり、最大数値を設定したりです。

  • 必須
  • 数値のみ許可
  • 100以下の数値を許可

今ままでのエラー表記

ここまでで紹介したエラー表記の仕方は、以下のようなコードでした。


<input type="text" name="age" value="{age}">
<input type="hidden" name="field[]" value="age">
<input type="hidden" name="age:validator#required"> <!-- 必須チェック -->
<input type="hidden" name="age:validator#digits"> <!-- 数値チェック -->
<input type="hidden" name="age:validator#max" value="100"> <!-- 最大数チェック -->

<!-- BEGIN age:validator -->
<p class="notice">年齢が入力されていないか、数値(100以下)が入力されていません。</p>
<!-- END age:validator -->
<input type="text" name="age" value="{{ age.value }}">
<input type="hidden" name="field[]" value="age">
<input type="hidden" name="age:validator#required"> <!-- 必須チェック -->
<input type="hidden" name="age:validator#digits"> <!-- 数値チェック -->
<input type="hidden" name="age:validator#max" value="100"> <!-- 最大数チェック -->

{% if age.invalid %}
<p class="notice">年齢が入力されていないか、数値(100以下)が入力されていません。</p>
{% endif %}

間違ってはいませんが、どのエラーにひっかかっているのか判りにくいです。

エラーにあわせてメッセージを変える


<input type="text" name="age" value="{age}">
<input type="hidden" name="field[]" value="age">
<input type="hidden" name="age:validator#required"> <!-- 必須チェック -->
<input type="hidden" name="age:validator#digits"> <!-- 数値チェック -->
<input type="hidden" name="age:validator#max" value="100"> <!-- 最大数チェック -->

<!-- BEGIN age:validator#required -->
<p class="notice">年齢を入力してください。</p>
<!-- END age:validator#required -->
<!-- BEGIN age:validator#digits -->
<p class="notice">年齢には数値を入力してください。</p>
<!-- END age:validator#digits -->
<!-- BEGIN age:validator#max -->
<p class="notice">年齢には100以下の数値を入力してください。</p>
<!-- END age:validator#max -->
<input type="text" name="age" value="{{ age.value }}">
<input type="hidden" name="field[]" value="age">
<input type="hidden" name="age:validator#required"> <!-- 必須チェック -->
<input type="hidden" name="age:validator#digits"> <!-- 数値チェック -->
<input type="hidden" name="age:validator#max" value="100"> <!-- 最大数チェック -->

{% if age.v.required %}
<p class="notice">年齢を入力してください。</p>
{% endif %}
{% if age.v.digits %}
<p class="notice">年齢には数値を入力してください。</p>
{% endif %}
{% if age.v.max %}
<p class="notice">年齢には100以下の数値を入力してください。</p>
{% endif %}

エラーメッセージが分岐され必要なメッセージだけが出力されるようになりました。

このようにエラーメッセージ用のブロックを書き換える事で、複数のバリデーターを設定した場合のエラーで、別々のメッセージを表示させることができます。


<!-- BEGIN [対象の項目名]:validator#[オプション名] --><p>[エラーメッセージ]</p><!-- BEGIN [対象の項目名]:validator#[オプション名] -->
{% if [対象の項目名].v.[オプション名] %}<p>[エラーメッセージ]</p>{% endif %}

特殊なエラーメッセージ

フォームでファイルをアップロードする際、PHP の upload_max_filesize を超えるサイズのファイルが送信されると、POST データ自体が空になるため、各フィールドごとのエラーメッセージは表示できません。

そのため、以下の記述を使用してフォーム全体のエラーメッセージを表示します。

<!-- BEGIN post:v#filesize -->リクエストサイズが大きすぎます<!-- END post:v#filesize -->

この特殊なエラーブロックは、標準テンプレートのみ対応しており、twig記法では出力できません。