【问题标题】:Symfony2 -> Twig -> Form -> Field -> Set rendered = trueSymfony2 -> Twig -> 表单 -> 字段 -> 设置渲染 = true
【发布时间】:2013-05-20 00:37:36
【问题描述】:

我有一个简单的问题。

我有一个带有字段的表单,例如:

$builder
    ->add('x')
    ->add('y')
    ->add('z')
;

在我的树枝文件中,我使用了多个块,我想停止渲染字段... 我查看了 b.html.twig 文件!

a.html.twig

{% block body %}
    {% block form %}
        {{ form_widget(form) }}
    {% endblock form %}
{% endblock body %}

b.html.twig

{% block form %}
    {{ form.x.set('rendered', true) | default() }}
    {{ parent() }}
{% endblock form %}

如果我删除“default()”,我会得到错误,即对象无法转换为字符串。 实际上,表单会呈现所有字段...包括 x 字段。但他们不应该渲染 x 字段...

提前致谢!

【问题讨论】:

    标签: symfony twig symfony-forms symfony-2.2 symfony-2.3


    【解决方案1】:

    我在这里错过了这个问题吗?如果你想将一个字段设置为渲染,即使它不是简单的调用是:

    {% do form.x.setRendered %}
    

    如果我误解了,我很抱歉。

    【讨论】:

      【解决方案2】:

      您可以使用下一个关闭表单语句来防止呈现在表单中定义但在模板中未描述的表单字段:

      {{ form_end(form, {'render_rest': false}) }}
      

      例如,我们定义下一个形式:

      public function buildForm(FormBuilderInterface $builder, array $options)
      {
          $builder
              ->add(
                  'id',
                  HiddenType::class,
                  array(                                     
                      'required' => false
                  )
              )
              ->add(
                  'name',
                  TextType::class,
                  array(                                     
                      'required' => false
                  )
              )
              ->add(
                  'comment',
                  TextType::class,
                  array(
                      'required' => false
                  )
              )
              ->add(
                  'amount',
                  TextType::class,
                  array(
                      'required' => false
                  )
              );
      }
      

      对于这个表单,我们描述了下一个模板,但是我们不想渲染字段id,所以我们可以在form_end块中使用选项render_rest来省略字段id的渲染:

      {# render opening form tag #}
      {{ form_start(form) }}
      {# render field with label #}
      {{ form_row(form.name) }}
      {# render only field #}
      {{ form_widget(form.comment) }}
      {# render only label #}
      {{ form_label(form.amount) }}
      
      {# render only field #}
      {{ form_widget(form.amount) }}
      
      {# if csrf token is enabled for form render field #}
      {% if form._token is defined %}
      {{ form_widget(form._token) }}
      {% endif %}
      
      {# render closing form tag and do not render rest form elements #}
      {{ form_end(form, {'render_rest': false}) }}
      

      【讨论】:

      • 如果您添加解释,这个答案会更好。
      • 但这适用于所有领域。同样对于 _csrf_token SO,您需要记住手动添加 _csrf 字段
      • 这是一个更好的答案,但我们必须记住将{{ form_widget(form._token) }} 添加到模板中
      【解决方案3】:

      您应该通过包含某种决策逻辑来删除(或仅添加)FormType 中的表单字段。

      例如检查 cerain 变量的存在/值。

      然后可以将这个变量注入到构造函数中。

      从您的模板中删除它是不属于您的模板的应用程序逻辑。

      如果没有其他选择,请查看FormView::setRendered() 方法。

      您可以使用 Twigs attribute function 访问对象的方法:

      {{ attribute(object, method, arguments) }}
      

      【讨论】:

      • 问题是,我使用默认包含“form_widget(form)”的全局表单主题。我需要一个底部的字段,因为我会设置 render = true。然后我可以在底部使用它,我的全局主题不会呈现该字段...
      • 更新了我的答案...您的确切问题是如何手动调用表单中的一行 setRendered() ?
      • 问题是如何用 twig 做这个(仅限)^^ 目前我使用自制的 twig 函数: public function renderState(FormView $field) { $field->setRendered(true ); }
      猜你喜欢
      • 1970-01-01
      • 2014-03-26
      • 2017-01-26
      • 1970-01-01
      • 2015-02-23
      • 2012-04-09
      • 1970-01-01
      • 2013-10-17
      • 2015-02-04
      相关资源
      最近更新 更多