2017-03-15 2 views
1

私は、電話と電子メールフィールドのカスタム検証でサーバー側の検証をしようとしています。私はフォームアクションでカスタム検証をしています。Silverstripe - 検証後にフォームデータを返す

ので、どのように私はそれが検証を満たしていない場合、データがフォームに戻るために得ることができるかどうか最初に第二に、これはそれを行うには、正しい場所であると?

現在はフォーム全体をクリアします。

public function doSubmitForm($data, Form $form) { 

     if (!preg_match("/^[\+_a-z0-9-'&=]+(\.[\+_a-z0-9-']+)*@[a-z0-9-]+(\.[a-z0-9-]+)*(\.[a-z]{2,})$/i",$data['Email'])) { 
      $form->addErrorMessage('Email', 'Invalid email', 'bad'); 
     return $this->redirectBack(); 
     } 
     if (!preg_match("/^((?:\+)|0)(\d{9,14})$/i",$data['Phone'])) { 
      $form->addErrorMessage('Phone', 'Please match the correct format eg: 0821234567', 'bad'); 
     return $this->redirectBack(); 
     } 

     $form->sessionMessage('Thank you for your submission','alert alert-success'); 

    return $this->redirectBack(); 
    } 

答えて

2

このようなサーバー側の検証はお勧めしません。 最も簡単な方法は、適切なフォームフィールドを使用することです。例えば。 EmailFieldおよびPhoneNumberField。これらは、あなたが望む方法を検証していない場合は、単にそれらを拡張したり、独自のFormFieldサブクラスを作成

https://github.com/silverstripe/silverstripe-framework/blob/3.5/forms/EmailField.php#L39はまたあなたもValidatorまたはRequiredFieldsを拡張してカスタムバリデータを実装することができます:

は、ここでは検証だEmailFieldが行う方法です。バリデーターはフォーム全体に適用されます。個々のフィールドタイプのバリデーションを開始する場合は、フィールドをカスタムクラスとして実装するほうがよいでしょう。

+0

ありがとうございます。私は電子メールの検証が大丈夫だと思う。それは私が少なくとも10文字であることを確認する必要があるだけの電話番号です。私は 'Validator'を拡張することについて読みましたが、正確にはそれに従っていません。 '$ required = new RequiredFields(配列( 'Name'、 'Email'、 'Phone')); $ form = new Form($ this、 'MyForm'、$ fields、$ actions); \t \t \t $ form-> setValidator($ required); ' 私はカスタムの電話クラスを作成し、そこで検証を行う必要がありますか? – Craig

+0

'TextField'のカスタムサブクラス、たぶん' PhoneField'を作成してそこに 'validate'メソッドを実装することをお勧めします。あなたは 'EmailField'のコードを出発点として取ることができます。 – bummzack

+0

は電話番号を検証するためのものです。https://github.com/giggsey/libphonenumber-for-phpは良いツールかもしれません。 – wmk

1

先日電話番号の10文字の長さを実装する必要がありました。

https://github.com/sheadawson/silverstripe-zenvalidator

Iは作曲を介して上記モジュールが含まれ、READMEに設定しました。私はちょうど$バリデータを作成し、フォーム

$validator = ZenValidator::create(); 
$validator->setConstraint('Phone', Constraint_length::create('range', 10, 10)->setMessage('Phone numbers must be 10 digits in length')); 
$validator->disableParsley(); 

$Form = new Form($this, 'FormName', $fields, $actions, $validator); 

に追加するフロントエンド用getCMSValidator()メソッド

public function getCMSValidator() { 
    $validator = ZenValidator::create(); 
    $validator->setConstraint('Phone', Constraint_length::create('range', 10, 10)->setMessage('Phone numbers must be 10 digits in length')); 
    $validator->setConstraint('PhoneAH', Constraint_length::create('range', 10, 10)->setMessage('Phone numbers must be 10 digits in length')); 
    $validator->setConstraint('PhoneMobile', Constraint_length::create('range', 10, 10)->setMessage('Mobile numbers must be 10 digits in length')); 
    $validator->disableParsley(); 
    return $validator; 
} 

を作成した管理インターフェイスの場合

は私に約20分かかりました最小値10 &を最大5文字または6つの異なる形式で実装することができます。

こちらがお役に立てば幸いです。

乾杯、 コリン

関連する問題