2017-12-28 4 views
2

Ich habe ein Problem mit einem Formular senden. Ich habe eine persönliche Einschränkung, die vom Wert eines Attributs meiner Entität abhängt (Attribut ist nicht in meiner Form). Der Wert muss festgelegt werden, wenn ich auf eine bestimmte Übergabeschaltfläche klicke (ich habe mehrere Übergabeschaltflächen).Validator ist abhängig von Submit-Taste und Attributwert

Mein Problem ist, dass mein Validator nicht angewendet wird.

Beispiel:

Entity:

/** 
* @MyPersonnalConstraint() 
*/  
class Test 
{ 
    private $id; 
    private $text; 
    private $text2; 
    private $state; 
} 

Formtype

public function buildForm(FormBuilderInterface $builder, array $options) 
{ 
    $builder 
     ->add('text', TextType::class) 
     ->add('text2', TextType::class) 
     ->add('Submit1', SubmitType::class) 
     ->add('Submit2', SubmitType::class); 
} 
public function configureOptions(OptionsResolver $resolver) 
{ 
    $resolver->setDefaults([ 
     'data_class' => Test::class, 
    ]); 
} 

MyPersonnalConstraintValidator

public function validate($value, Constraint $constraint) 
{ 
    if ($value->getState("X")) { //<-- "X" is set only if "Submit2" is clicked 
     if($value->getText2() === null || $value->getText2() === ""){ 
       $this->context->buildViolation($constraint->message) 
        ->atPath('text2') 
        ->addViolation(); 
     } 
    } 
} 

Wenn ich auf Submit2 Knopf klicken muss ich tun $test->setState("X").

Ich kann kein verwenden, da mein Formular nicht übergeben wird und boolescher 'angeklickt' Wert immer falsch ist, wenn Sie auf 'Senden2' klicken.

Und

In meinem Controller nach handleRequest($request) Methode, die ich isClicked auf meiner Taste fangen können, aber es ist zu spät für Formulardaten ändern (setState("X")) vorgelegt und $form->isValid() ist immer wahr.

Controller:

$form->handleRequest($request); 

if ($form->get('Submit2')->isClicked()) { 
    $form->getData()->setState("X"); 
} 

if ($form->isSubmitted() && $form->isValid()) { 
    //Already valid 
} 

der Dank für Ihre Lichter!

Antwort

0

löste ich mein Problem, indem es anders unter:

Entity

/** 
* @MyPersonnalConstraint(groups={'mygroup'}) <--- Add Validation group 
*/  
class Test 
{ 
    private $id; 
    private $text; 
    private $text2; 
    private $state; 
} 

Formtype

public function buildForm(FormBuilderInterface $builder, array $options) 
{ 
    $builder 
     ->add('text', TextType::class) 
     ->add('text2', TextType::class) 
     ->add('Submit1', SubmitType::class, array(
     'validation_groups' => array('mygroup', 'Default') //<- Add Validation Group 
    )) 
     ->add('Submit2', SubmitType::class); 
} 
public function configureOptions(OptionsResolver $resolver) 
{ 
    $resolver->setDefaults([ 
     'data_class' => Test::class, 
    ]); 
} 

MyPersonnalConstraintValidator

public function validate($value, Constraint $constraint) 
{ 
//Without test on getState   
if($value->getText2() === null || $value->getText2() === ""){ 
      $this->context->buildViolation($constraint->message) 
       ->atPath('text2') 
       ->addViolation(); 
    } 
} 

Controller:

$form->handleRequest($request); 

if ($form->isSubmitted() && $form->isValid()) { 
    if ($form->get('Submit2')->isClicked()) { 
     $test->setState("X"); 
    } 
} 
0

Es empfiehlt sich, die Vorlagenlogik (Tastenklicks) und die erste Anwendung zu trennen. Fügen Sie dem Formular state verstecktes Feld hinzu und klicken Sie auf Schaltflächenklicks durch JavaScript-Abonnenten, um den Feldwert state festzulegen, je nachdem, welche Taste gedrückt wird.

Verwandte Themen