2012-06-03 18 views
13

Ich arbeite an einem Symfony2-Backend für eine Backbone.js-Anwendung. Ich habe mein Modell und meine Form.Validierung von Symfony2-Formularen mit zusätzlichen Feldern

Allerdings sendet backbone.js einige zusätzliche Eigenschaften an die REST-API, wenn es ein Modell erstellt/aktualisiert und ich habe Schwierigkeiten, das zu validierende Formular zu erhalten.

Wie kann ich ein Formular in Symfony2 erhalten, um zusätzliche Daten zu akzeptieren, oder wie kann ich bestimmte Schlüssel löschen, bevor ich Daten an ein Formular binde?

Antwort

12

Um Symfony2 zusätzliche Daten übernehmen, die zusätzlichen Felder in Ihrem Formular-Builder hinzufügen, und legen Sie ihre property_path Option auf false:

Beispiel:

$builder 
    ->add('my_additional_field', 'checkbox', array(
     'mapped' => false, 
    )); 

Sie brauchen nicht die Schlüssel fallen vor dem Binden der Daten werden sie trotzdem ignoriert.

+3

+1 Kurzinfo für> = 2.1: "Neu in Version 2.1: Seit 2.1 wurde die zugeordnete Option für diesen Anwendungsfall hinzugefügt." http://symfony.com/doc/2.1/reference/forms/types/hidden.html#mapped –

+0

Vielleicht sollten Sie in Betracht ziehen, Ihre Antwort zu aktualisieren, indem Sie hinzufügen, welche Version gültig ist. – xPheRe

+1

Ich mache kein PHP mehr. Bitte aktualisieren Sie meine Antwort, wenn Sie können. –

2

Sie können den Ereignis-Listener FormEvents::BIND_CLIENT_DATA (oder FormEvents::PRE_BIND, wenn Sie 2.1 dev verwenden) abhören und Felder hinzufügen/entfernen. Siehe this Kochbucheintrag.

16

property_path jetzt in sf 2.1 ist veraltet, verwenden Sie "gemappt" statt

$builder 
    ->add("firstName", "text") 
    ->add("lastName", "text") 
    ->add("tac", "checkbox", array(
     "mapped" => false 
    ) 
); 
46

Sie sollten Option "allow_extra_fields" verwenden.

public function setDefaultOptions(OptionsResolverInterface $resolver) 
{ 
     $resolver->setDefaults(
     array(
      'allow_extra_fields' => true 
     ) 
    ); 
} 
+2

allow_extra_fields wird bis 2.6 nicht in symfony enthalten sein. Dies ist der richtige Weg, um zusätzliche Felder hinzuzufügen. mapped = false wäre der vorgeschlagene Weg, wenn Sie die zusätzlichen Feldnamen kennen, die gesendet werden. – Heyflynn

+1

Da 2.6 nun als stabile Version markiert wurde, sollte dies als korrekte Antwort markiert werden. @ user1432227 – Chausser

+0

@krun Sie könnten auch die symfony 2.8/3. * Beispiel hinzufügen wo es ist: 'configureOptions (OptionsResolver $ resolver)' 'anstelle der Funktion setDefaultOptions. –

Verwandte Themen