いつの間にかバリデーションが強化されてた
原文
Since 2.3 the HTML5 required attribute will also be added to the input based on validation rules.
You can explicitly set required key in options array to override it for a field.
To skip browser validation triggering for the whole form you can set option ‘formnovalidate’ => true for the input button you generate using FormHelper::submit() or set ‘novalidate’ => true in options for FormHelper::create().
翻訳
バージョン 2.3 から HTML5 の required属性が(Model等の)バリデーションルールに基づいて(自動で入力フィールドに)追加されるようになった。
この仕様をオーバーライド(上書き)したい場合は、入力フィールドのオプション(配列)にrequireキーをセットすればよい。
(⇒ 必須:’required’ => true , 必須でない:’required’ => false)
フォーム全体に対してのバリデーションをスキップしたい場合は以下のどちらかをすればいいアル。
- サブミットボタンの生成 FormHelper::submit() に ‘formnovalidate’ => true をセットする
- フォーム生成 FormHelper::create() に ‘novalidate’ => true をセットする
備考
なぜ、今回の仕様変更で問題になるのかというと、
require属性の動作が、ブラウザがサーバにデータを送る前に、ブラウザ上でエラーを返す点にあります。
『フィールドに入力が無かった場合にサーバー側で何らかの処理をして動かす』というような実装をしている場合に、
サーバにデータが送られるまえにエラーになってしまうので、予めrequire(の自動付与)をキャンセルしておく必要が生じます。
また、更新処理でない、検索処理のフォームでも同様にバリデーションが行われる為、
検索では起こる確率が高くなるのかなという気がします。
対応が必要にりそうな想定される実装のパターン
- Search Plugin などで Table上の必須項目を任意検索の対象にしてたらツむ
- hasManyで動的に複数行をsaveAllしようとする実装で、予め入力フォームを余分に用意する実装だったらツむ