setSessionMessage() を介して適切なエラー メッセージを表示するために、送信後にフォームの検証に必要なフィールドを使用する方法はありますか? 私が正しく理解していれば、必須フィールドが設定されておらず、ページがリロードされただけの場合、フォームの送信が妨げられているため、送信機能は呼び出されません。私の質問は、カスタム エラー メッセージを表示するためだけに、必要なフィールドの送信機能を手動でチェックインする必要がありますか? Thx、フロリアン
2 に答える
SilverStripe フォームは、一見しただけでは信じられないほど複雑です。
そうです、バリデーターは送信前にチェックされ、バリデーターが true を返した場合にのみフォームアクションが呼び出されます。(また、フォーム アクションが URL として公開されることは決してないことに注意してください。URL は常にフォーム自体であり、フォーム アクションを呼び出します。)
検証エラーが発生すると、エラーが設定され (セッションに)、フォームがリダイレクトされます。次に、エラーがセッションから取得されます。
silverstripe フォームは、カスタム検証を念頭に置いて構築されています。Validator というクラスがあり、このクラスを拡張するものはすべてフォームの検証に使用できます。(RequiredFields は Validator のサブクラスです)。したがって、この方法で独自のバリデータを構築できます。しかし、一般的な検証ケースを探している場合は、素晴らしい NetefxValidator モジュールが探しているものかもしれません: https://github.com/lx-berlin/NetefxValidator
フォームを検証するための多くのルールを提供します。次に例を示します。
- より少ない
- より大きい
- テキストが等しい
- テキストが含まれています
- 正規表現
- ...
and
また、ルールを,or
と組み合わせることもできますxor
(完全なリストはhttps://github.com/lx-berlin/NetefxValidator/tree/master/code/rulesにあります)。次のように、検証するカスタム php 関数を指定することもできます。
# SilverStripe 3.x (but with some slight modifications it should also work in 2.x)
$fields = FieldList::create(array(
TextField::create('myField', 'some label')
));
$actions = FieldList::create(array(
FormAction::create('doSend', 'submit'),
));
$myValidationFunction = function ($data, $args) {
if ($data['myField'] == 'zauberfisch is awesome' && $args['someOtherThing'] == 'yay') {
// only allow this form to pass if the user acknowledges that zauberfisch is awesome
return true;
} else {
return false;
}
};
$additionalArguments = array('something' => 'ohai', 'someOtherThing' => 'yay');
$rule = NetefxValidatorRuleFUNCTION::create(
$fieldName = 'myField',
$errorMessage = 'to bad, you did not fill this field correctly',
null,
array($myValidationFunction, $additionalArguments)
);
$validator = NetefxValidator::create(array($rule));
$form = Form::create($this, $fields, $actions, $validator);
注:Form::create()
基本的にはnew Form()
フォーム アクションにエラー メッセージを設定するというアイデアについて: BADアイデア、これを行おうとすると数え切れないほどの問題に遭遇します。バリデータークラスが存在するのには理由があります。バリデーターがすべきことを行うために他の何かを悪用しようとしないでください
編集:あなたの質問にもっと明確に答えるために:
いいえ、独自のエラー メッセージを設定することはできません。これにはカスタム バリデータを使用する必要があります。