2016-07-28 74 views
3

比方说,我现在用的是Symfony Form Component来渲染一个简单的表格只有两个字段(用户名和电子邮件)如何检测表单是否有任何要呈现的元素?

我渲染这两个领域与form_row()添加自定义的CSS左右,然后调用form_widget()来再现元素的其余部分(另一个选项是form_rest()) 我正在寻找的是一种预先检查form_widget()是否会打印任何对象的方法,以便在有额外字段的情况下添加自定义html。 我做它的方式是这样的:

//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 #} 

不过,我并不感到满意。有没有更好的方法?

编辑:使用CSRF保护(默认启用),前面的代码将始终打印<h3>Other fields</h3>,因为形式对我们没有打印标记一个额外的隐藏字段。我们需要使用{{ form_row(form._token) }}来渲染它。

回答

3

通过检查src/Symfony/Component/Form/FormView.php中的代码,我发现了一个完全符合我想要的功能。

//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; 
    } 

现在功能可以在模板被用作这样的:

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