Wie kann man dafür sorgen, dass form_rest () mit Symfony2 kein Feld anzeigt?

70

Ich habe angefangen, Symfony2 zu verwenden, aber ich habe einige Probleme. Ich wollte Felder von Hand rendern, aber es funktioniert nicht, weil mein noch von mir gerendertes Feld auch mit der form_rest()Funktion angezeigt wird, sodass ich zwei gleiche Felder habe.

Hier ist mein Code:

<div>
     {{ form_errors(form.contenu) }}
     <textarea id="{{ form.contenu.vars.id }}" name="{{ form.contenu.vars.full_name }}">{{ form.contenu.vars.value }}</textarea>
</div>

Und am Ende des Formulars muss ich Folgendes setzen:

{{ form_rest(form) }}

Es wird jedoch das Feld "contenu" angezeigt :(

Haben Sie eine Vorstellung davon, wo das Problem liegt?

Ilan Coulon
quelle
Wird Ihr Formular zufällig "Formular" genannt? Bei welcher Version von Symfony hat diese Lösung für Sie funktioniert? Ich versuche das Gleiche zu tun, aber es funktioniert nicht.
Userfuser

Antworten:

201

Eine andere Möglichkeit besteht darin, das Feld explizit als gerendert zu markieren:

{% do form.contenu.setRendered %}
Francesc Rosas
quelle
in PHP wäre es <? php $ form ['contenu'] -> setRendered (true)?>
Tomas Dermisek
2
@TomasDermisek Nein \Symfony\Component\Form\FormView::setRenderedhat keine Argumente. Und da es keine setUnrenderedund keine $renderedprivate Methode gibt, können Sie sie {{ form_row(form.contenu) }}später in Ihrem Code nicht mehr verwenden .
Stephan Vierkant
1
@StephanVierkant, der Trick ist, zuerst {% set formDescription = form_row(form.description) %}dann {{ form_rest(form) }}und dann zu tun {{ formDescription|raw }}.
TheFrost
54

Eine andere meiner Meinung nach weniger hackige Art, dies zu tun, ist folgende:

{{ form_widget(form._token) }} // render the CSRF Token
{{ form_end(form, {'render_rest': false}) }} // do not render anything else

Es ist aus der offiziellen Dokumentation (v3.0), also ist es ziemlich viel Best Practice, denke ich.

Andresch Serj
quelle
2
{{ form_widget(form._token) }}
Abenevaut
32

{{ form_rest(form) }}geht ganz am Ende, nachdem jedes Feld "manuell" gerendert wurde. Wenn Sie es für das CSRF-Token verwenden, können Sie es jederzeit rendern mit:

{# Token CSRF #}
{{ form_widget(form._token) }}
Gremo
quelle
34
sehr nützlich in Kombination mit {{ form_widget(form._token) }} {{ form_end(form, {'render_rest': false}) }}
Barno
10

Die Situation, in der Sie kein Feld anzeigen möchten, deutet auf eine schlecht gestaltete Form hin. Sie könnten einige Argumente einbringen __construct, um es bedingt zu machen (z. B. einige Felder einschließen / ausschließen), oder Sie könnten einfach separate FormKlassen erstellen (was meiner Meinung nach etwas übertrieben ist).

Ich hatte vor einigen Monaten einen häufigen Fall, in dem sich die Form unterschied, als der Benutzer Datensätze einfügte / aktualisierte. Es war ungefähr so:

...
public function __construct($isUpdateForm){
    $this->isUpdateForm= $isUpdateForm;
}

public function buildForm(FormBuilder $builder, array $options){
    ....
    $builder->add('some_filed', 'text', ..... );

    if ( $this->isUpdateForm ){
        $builder->add(.....);
    }
    ....
}
....

Wenn Sie aus bestimmten Gründen die Formularklasse nicht umgestalten können, können Sie dennoch unerwünschte Felder anzeigen, diese jedoch mit <div>dem CSS- display:noneAttribut umschließen . Auf diese Weise "sind sie noch da" (und werden auf jeden Fall normal verarbeitet), aber für den Benutzer nicht sichtbar.

Hoffe das hilft...

Jovan Perovic
quelle
Danke, aber das wollte ich nicht (ich habe eine Lösung gefunden, siehe meine BEARBEITUNG). Ich wollte Symfony sagen, dass ich das Feld bereits angezeigt habe;)
Ilan Coulon
Noch besser wären verschiedene Formulare zum Hinzufügen oder Aktualisieren einer Entität. Ich habe die Erfahrung gemacht, dass Sie $isUpdateFormIhrem Konstruktor hinzufügen , später hinzufügen $isAdminund $isOwnerusw. usw.
Stephan Vierkant
@StephanVierkant, obwohl ich bisher keinen solchen Fall hatte, ist das sicherlich eine Möglichkeit. Bei einzelnen Formularen sollte der Entwickler jedoch darauf achten, Doppelarbeit zu minimieren (oder überhaupt keine zu haben). Nichts ist schlimmer als einen Fehler an einer Stelle zu beheben, nur um herauszufinden, dass es denselben Ausschnitt gibt, den Sie wirklich gar nicht kennen ... :-)
Jovan Perovic