エラーメッセージの分岐
一つのフィールドで複数のエラーを検知したい場合があります。例えば以下のように、必須だけではなく、数値のみ許可したり、最大数値を設定したりです。
- 必須
- 数値のみ許可
- 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記法では出力できません。