【问题标题】:How can I detect if a form has any elements left to be rendered?如何检测表单是否有任何要呈现的元素?
【发布时间】:2016-07-28 14:43:19
【问题描述】:

假设我正在使用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 保护(默认激活)时,之前的代码将始终打印 &lt;h3&gt;Other fields&lt;/h3&gt;,因为表单有一个额外的隐藏字段用于我们没有打印的令牌。我们需要在某个地方使用{{ form_row(form._token) }} 渲染它。

【问题讨论】:

    标签: php symfony twig symfony-forms


    【解决方案1】:

    通过检查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 %}
    

    【讨论】:

      猜你喜欢
      • 2017-12-23
      • 1970-01-01
      • 1970-01-01
      • 2011-08-24
      • 1970-01-01
      • 1970-01-01
      • 2011-01-10
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多