2015-05-13 12 views
7

Also hier ist das Szenario: Ich habe eine Optionsfeldgruppe. Basierend auf ihrem Wert sollte oder sollte ich andere drei Felder nicht validieren (sind sie leer, enthalten sie Zahlen usw.)?Bedingte Validierung von Feldern basierend auf anderen Feldwert in Symfony2

Kann ich passieren all diese Werte zu einer Einschränkung irgendwie, und sie dort vergleichen?

Oder ein Rückruf direkt in der Steuerung ist ein besserer Weg, dies zu lösen?

Im Allgemeinen, was ist die beste Praxis in diesem Fall?

Antwort

2

Ich schlage vor, Sie callback validator zu verwenden.

Zum Beispiel in Ihrer Entity-Klasse:

<?php 

use Symfony\Component\Validator\Constraints as Assert; 

/** 
* @Assert\Callback(methods={"myValidation"}) 
*/ 
class Setting { 
    public function myValidation(ExecutionContextInterface $context) 
    { 
     if (
       $this->getRadioSelection() == '1' // RADIO SELECT EXAMPLE 
       && 
       (// CHECK OTHER PARAMS 
       $this->getFiled1() == null 
       ) 
      ) 
     { 
      $context->addViolation('mandatory params'); 
     } 
     // put some other validation rule here 
    } 
} 

Ansonsten können Sie Ihren eigenen benutzerdefinierten Validator bauen, wie here beschrieben.

Lassen Sie mich wissen, dass Sie weitere Informationen benötigen.

Hoffe, das hilft.

+0

Nicht _exactly_ was ich benötigt, aber es führt mich zur richtigen Lösung. Vielen Dank!! – spiridon

+3

Hi @spiridon, könnten Sie bitte erläutern, wie Sie die richtige Lösung basierend auf diesem Ansatz erreichen? Vielen Dank – Ninj

2

Sie müssen Validierungsgruppen verwenden. Auf diese Weise können Sie ein Objekt nur anhand einiger Einschränkungen für diese Klasse validieren. Weitere Informationen finden Sie in der Symfony2 Dokumentation http://symfony.com/doc/current/book/validation.html#validation-groups und auch http://symfony.com/doc/current/book/forms.html#validation-groups

In Form finden Sie eine Methode setDefaultOptions genannt definieren kann, das in etwa so aussehen sollte:

public function buildForm(FormBuilderInterface $builder, array $options) 
{ 
    // some other code here ... 
    $builder->add('SOME_FIELD', 'password', array(
     'constraints' => array(
      new NotBlank(array(
       'message' => 'Password is required', 
       'groups' => array('SOME_OTHER_VALIDATION_GROUP'), 
      )), 
     ) 
    )) 
} 

public function setDefaultOptions(OptionsResolverInterface $resolver) 
{ 
    $resolver->setDefaults(array(
     'validation_groups' => function (FormInterface $form) { 
      $groups = array('Default'); 
      $data = $form->getData(); 

      if ($data['SOME_OTHER_FIELD']) { // then we want password to be required 
       $groups[] = 'SOME_OTHER_VALIDATION_GROUP'; 
      } 

      return $groups; 
     } 
    )); 
} 

Der folgende Link ein detailliertes Beispiel liefert davon, wie Sie sie verwenden können http://web.archive.org/web/20161119202935/http://marcjuch.li:80/blog/2013/04/21/how-to-use-validation-groups-in-symfony/.

Hoffe, das hilft!

+0

Ich mache das in einer Unterform und $ form-> getData() gibt ein leeres Array zurück. Mein Formulartyp hat Felder und funktioniert trotzdem. – Ninj

+0

EDIT: Ok, mit '$ form-> getData()' war mein Fehler, ich musste nach dem richtigen Feld suchen: '$ form-> get ('aField') -> getData()' – Ninj

Verwandte Themen