2016-08-30 15 views
0

Auf der Suche nach einer einfachen Möglichkeit zum Hinzufügen von Einschränkungen dynamisch zu allen meinen Formularfeldern. Bis jetzt bin ich auf die Idee gekommen, eine form type extension zu verwenden, die Art von funktioniert: Ich kann das Formular Ansicht ändern und dann manuell die Ansicht auf Formularvorlage überprüfen.Symfony Dynamic Form Constitains

Gibt es jedoch eine intelligentere Möglichkeit, echte Symfony-basierte Einschränkungen in Echtzeit hinzuzufügen?

(Beachten Sie, dass die Einschränkungen der Form hinzugefügt werden müssen, in Echtzeit, wie das Formular geladen wird auf die Benutzerkonfiguration in der Datenbank basiert .. Vordefinierte Form-Gruppen und dergleichen wird nicht funktionieren.)

Antwort

1

I würde vorschlagen, Formularereignisse zu verwenden.

Verwenden Sie das Ereignis PRE_SUBMIT, um das Formular vor der Überprüfung zu bearbeiten.

Erstellen Sie Ihre Felder mit $event->getForm()->add(...) neu und fügen Sie Ihre Einschränkungen hinzu.

Natürlich können Sie den Listener automatisch zu allen Formularen hinzufügen, indem Sie eine FormExtension verwenden, die den Listener hinzufügt.

EDIT: Einige Beispiele aus Alsatian67/FormBundle


Ihre Erweiterung sollte wie folgt aussieht:

class ExtensibleExtension extends AbstractTypeExtension 
{ 
    private $extensibleSubscriber; 
    public function __construct($extensibleSubscriber) { 
     $this->extensibleSubscriber = $extensibleSubscriber; 
    } 

    public function buildForm(FormBuilderInterface $builder, array $options) 
    { 
     // Only apply on base form 
     if($builder->getForm()->isRoot()) 
     { 
      $builder->addEventSubscriber($this->extensibleSubscriber); 
     } 
    } 

    public function getExtendedType() 
    { 
     return FormType::class; 
    } 
} 

Und Ihre Eventlistener/EventSubscriber auf alle Kinder durchlaufen sollte:

foreach($event->getForm()->all() as $child){ 
    $childName = $child->getName(); 
    $type = get_class($child->getConfig()->getType()->getInnerType()); 
    $options = $child->getConfig()->getOptions(); 

    $options['constraints'] = array(/* ... */); 

    $form->add($childName,$type,$options); 
} 
+0

Ja, danke. Ich würde es nie tun Ich habe darüber nachgedacht, Formularereignisse innerhalb einer Formulartyperweiterung zu verwenden. Aber da meine Typerweiterung für jedes Formularfeld aufgerufen würde, müsste '$ event-> getForm() -> add (...)' sich selbst ersetzen? Wie würde ich das tun? – nurikabe

+0

Werfen Sie einen Blick auf die Bearbeitung. (Mein Beispiel verwendet einen EventSubscriber, der als Dienst injiziert wird. Aber Sie können dasselbe mit einem EventListener als Abschluss tun). – Alsatian

+0

Aha, vermeiden Sie das rekursive Feld Walking von 'FormType :: class', indem Sie nach dem Stammformular suchen. Nett! – nurikabe