【问题标题】:Symfony2 : accessing entity fields in Twig with an entity field typeSymfony2:使用实体字段类型访问 Twig 中的实体字段
【发布时间】:2012-05-07 06:50:38
【问题描述】:

这是我的表单类型:

public function buildForm(FormBuilder $builder, array $options)
{
    $builder
        ->add('user', 'entity', array(
            'class'   => 'UserBundle:User',
            'expanded' => true,
            'property' => 'name',
        ));
}

有没有办法在视图(Twig)中访问用户的字段?

我想做这样的事情:

{% for u in form.user %}
    {{ form_widget(u) }}
    {{ form_label(u) }}
    {% if u.moneyLeft > 0 %}
    <span>{{ u.name }} : {{ u.moneyLeft }} €</span>
    {% endif %}
{% endfor %}

... moneyLeftname 是来自用户实体的字段。

【问题讨论】:

  • 这里有一个 Github 上 Symfony 问题的链接,其中有一些很好的代码可以让人们朝着正确的方向前进:Issue 3836

标签: symfony twig symfony-forms


【解决方案1】:

这对我在 Symfony 3.1 中的收音机小部件有用:

{% set entity = form.parent.vars.choices[form.vars.name].data %}

【讨论】:

  • 您好,除了 CollectionType 字段,我该如何做同样的事情?无法访问集合数据,因为该方法是私有的...
【解决方案2】:

Symfony 2.8.4(甚至更低的版本)更新 Bernhard Schussek's answer

{% for key,value in form.user %} {# key is the ID in the database table #}
    {{ form_widget(value, {'label':value.vars.label}) }}
    {{ form.user.vars.choices[key].data.moneyLeft }} {# this syntax is new #}
{% endfor %}

【讨论】:

    【解决方案3】:

    2.6.7 版

    类似于 Aaron Geiser 的建议,您可以使用 customised form widgets 来实现:

    {# src/AppBundle/Resources/views/Form/fields.html.twig #}
    {% extends 'form_div_layout.html.twig' %}
    
    {%- block entity_widget -%}
        <div {{ block('widget_container_attributes') }}>
        {%- for n, child in form %}
            {{- form_widget(child, {
                'entity': form.vars.choices[n].data
            }) -}}
            {{- form_label(child) -}}
        {% endfor -%}
        </div>
    {%- endblock %-}
    
    {%- block radio_widget -%}
    {# You now have access to entity #}
    {%- endblock -%}
    

    【讨论】:

      【解决方案4】:

      在 Symfony 2.5 中 - 您可以通过使用子索引值访问每个选项的数据来完成此操作。

      在表单生成器中 - 正如您所料:

      public function buildForm(FormBuilderInterface $builder, array $options)
      {
          // Generate form
          $builder
              ->add('child', 'entity', array(
                  'class'         => 'MyBundle:Child',
                  'label'         => 'Children',
                  'property'      => 'any_property_for_label',
                  'expanded'      => true,
                  'multiple'      => true
              ));
      }
      

      在 Twig 模板中:

      {{ form_start(form) }}
      {% for child in form.child %}
          {% set index = child.vars.value %}{# get array index #}
          {% set entity = form.child.vars.choices[index].data %}{# get entity object #}
          <tr>
              <td>{{ form_widget(child) }}</td>{# render checkbox #}
              <td>{{ entity.name }}</td>
              <td>{{ entity.email }}</td>
              <td>{{ entity.otherProperty }}</td>
          </tr>
      {% endfor %}
      {{ form_end(form) }}
      

      【讨论】:

      • 我建议使用{% set entity = projectForm.stages.vars.choices[loop.index - 1].data %} 而不是从实体属性值获取索引。这样可以避免未知数组键错误。
      • @NikDenisov 循环还有一个loop.index0 变量:twig.symfony.com/doc/2.x/tags/for.html#the-loop-variable 所以不需要-1
      【解决方案5】:

      从今天开始,您可以在 master 分支(以及即将推出的 2.1)中执行以下操作:

      {{ u.vars.data.name }}
      

      u 是用户的表单视图,其中包含附加变量的列表。 data 变量包含表单的规范化数据,通常是您的对象(除非您添加了自定义模型转换器)。

      在 Symfony 的早期版本中,您可以:

      {{ u.vars.value.name }}
      

      value 变量包含表单的视图数据,这也是您的对象(除非您添加了自定义模型或视图转换器)。

      如果您正在使用 Symfony master 或 >=2.1,我建议您访问 data 而不是 value

      【讨论】:

      • 对于实体表单类型,我必须这样做:{{ u.data.field }} 迭代选项时
      • 这是如何获得选票的,我不知道。这完全是错误的。我在 OP 下发布了一条带有解决方案链接的评论。
      • @keyboardSmasher:您可能会注意到,bernhard 是关闭您链接到 github 上的问题的同一个人,所以我相信您现在可以弄清楚为什么这个答案有 6 个赞成票:我确信(我会以同样的方式回答)这种方法有效
      • 有没有办法通过使用query_builder 来实现这一点?
      • 下面 Aaron 的回答帮助了我的方案。还是谢谢。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-02-10
      • 1970-01-01
      • 1970-01-01
      • 2012-11-10
      • 1970-01-01
      • 2014-06-22
      • 2012-07-09
      相关资源
      最近更新 更多