2017-03-15 4 views
1

J'essaie de faire la validation côté serveur avec une validation personnalisée pour les champs de téléphone et d'email. Je fais la validation personnalisée dans l'action formulaires.Silverstripe - retourne les données du formulaire après validation

Premièrement, est-ce le bon endroit pour le faire et deuxièmement, si oui, comment puis-je obtenir les données pour retourner au formulaire s'il ne répond pas à la validation?

Actuellement, tout le formulaire sera effacé.

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(); 
    } 

Répondre

2

Je vous suggère de ne pas faire de validation côté serveur comme ça. La méthode la plus simple consiste simplement à utiliser les champs de formulaire appropriés. Par exemple. EmailField et PhoneNumberField.

Si ceux-ci ne sont pas validés comme vous le souhaitez, il vous suffit de les prolonger ou de créer vos propres sous-classes FormField.

Voilà comment EmailField-t-il est la validation: https://github.com/silverstripe/silverstripe-framework/blob/3.5/forms/EmailField.php#L39

Sinon, vous pouvez également mettre en œuvre un validateur personnalisé en étendant Validator ou RequiredFields. Le validateur sera appliqué à l'ensemble du formulaire et si vous commencez à valider des types de champs individuels, vous feriez mieux d'implémenter le champ en tant que classe personnalisée (de cette façon, vous avez un composant réutilisable).

+0

Merci. Je vois que la validation par courriel est acceptable. Ce serait juste un numéro de téléphone dont je dois m'assurer qu'il y a au moins 10 caractères. J'ai lu au sujet de l'extension 'Validator'but ne pas le suivre exactement. '$ required = new RequiredFields (array ('Nom', 'Email', 'Téléphone')); $ form = new Form ($ this, 'MyForm', $ champs, $ actions); $ Form-> setValidator ($ required); ' Donc je dois faire un cours de téléphone personnalisé et faire la validation ici? – Craig

+0

Je vous suggère de créer une sous-classe personnalisée de 'TextField', peut-être' PhoneField' et d'implémenter la méthode 'validate' ici (avec la validation de votre numéro de téléphone). Vous pouvez prendre le code de 'EmailField' comme point de départ ... – bummzack

+0

pour valider les numéros de téléphone https://github.com/giggsey/libphonenumber-for-php pourrait être un bon outil. – wmk

1

J'ai dû mettre en place une longueur de 10 caractères pour les numéros de téléphone l'autre jour.

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

I inclus le module ci-dessus par l'intermédiaire compositeur et a suivi le mettre en place dans le README.

Pour l'interface admin j'ai créé une méthode 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; 
} 

Pour l'avant tout créer un validateur $, puis l'ajouter à la forme

$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); 

m'a pris environ 20 minutes pour implémenter ce minimum 10 & maximum 10 caractères sur environ 5 ou 6 formes différentes.

J'espère que cela aide.

Cheers, Colin