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?
Antworten:
Eine andere Möglichkeit besteht darin, das Feld explizit als gerendert zu markieren:
{% do form.contenu.setRendered %}
quelle
\Symfony\Component\Form\FormView::setRendered
hat keine Argumente. Und da es keinesetUnrendered
und keine$rendered
private Methode gibt, können Sie sie{{ form_row(form.contenu) }}
später in Ihrem Code nicht mehr verwenden .{% set formDescription = form_row(form.description) %}
dann{{ form_rest(form) }}
und dann zu tun{{ formDescription|raw }}
.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.
quelle
{{ form_widget(form._token) }}
{{ 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) }}
quelle
{{ form_widget(form._token) }}
{{ form_end(form, {'render_rest': false}) }}
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 separateForm
Klassen 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:none
Attribut 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...
quelle
$isUpdateForm
Ihrem Konstruktor hinzufügen , später hinzufügen$isAdmin
und$isOwner
usw. usw.