2016-07-28 615 views
3

Lassen Sie sich sagen, dass ich die Symfony Form Component verwenden ein einfaches Formular mit nur zwei Feldern (Benutzername und E-Mail)Wie kann ich feststellen, ob in einem Formular Elemente noch gerendert werden können?

ich beiden Felder Rendering mit form_row() hinzufügen benutzerdefinierter CSS um, dann rufe form_widget() zu machen, den Rest der Elemente bin zu machen (Eine andere Option wäre form_rest()) Was ich suche ist eine Möglichkeit, vorher zu prüfen, ob form_widget() irgendwelche Objekte drucken wird oder nicht, um benutzerdefinierte HTML hinzuzufügen, falls es zusätzliche Felder gibt. So wie ich es tat, ist wie folgt:

//app/form/index.html.twig 
{# Other template code #} 
... 
{# Rendering form: #} 
{{ form_start(form) }} 

{{ form_row(form.username) }} 
{{ form_row(form.email) }} 

{% set form_rendered = form_widget(form) %} 
{% if form_rendered %} 
    <h3>Other fields</h3> 
    {{ form_rendered | raw }} 
{% endif %} 

{{ form_end(form) }} 
{# End form #} 
... 
{# Other template code #} 

aber ich bin nicht mit ihm zufrieden. Gibt es einen besseren Weg?

Edit: Wenn CSRF-Schutz (standardmäßig aktiviert), würde der vorherige Code IMMER <h3>Other fields</h3> drucken, da das Formular ein zusätzliches verstecktes Feld für das Token hat, dass wir nicht gedruckt. Wir müssten es irgendwo mit {{ form_row(form._token) }} rendern.

Antwort

3

Durch Überprüfung des Codes in src/Symfony/Component/Form/FormView.php fand ich eine Funktion, die genau das tut, was ich wollte.

//src/Symfony/Component/Form/FormView.php 

    /**                 
    * Returns whether the view was already rendered. 
    * 
    * @return bool Whether this view's widget is rendered 
    */ 
    public function isRendered() 
    { 
     $hasChildren = 0 < count($this->children); 

     if (true === $this->rendered || !$hasChildren) { 
      return $this->rendered; 
     } 

     if ($hasChildren) { 
      foreach ($this->children as $child) { 
       if (!$child->isRendered()) { 
        return false; 
       } 
      } 

      return $this->rendered = true; 
     } 

     return false; 
    } 

Nun wird die Funktion kann in der Vorlage als solche verwendet werden:

{% if not form.isRendered() %} 
    <h3>Other fields</h3> 
    {{ form_widget(form) }} 
{% endif %}