2012-04-26 42 views
14

Dưới đây là FormType tôi:Symfony2: truy cập vào các lĩnh vực thực thể trong cành với một loại lĩnh vực tổ chức

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

Có cách nào để truy cập vào các lĩnh vực của người dùng trong giao diện (cành)?

Tôi muốn làm điều gì đó như thế này:

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

... nơi moneyLefttên là lĩnh vực từ tài khoản thực thể.

+1

Dưới đây là một liên kết đến một vấn đề Symfony tại Github có một số mã tốt đẹp để có được folks đi đúng hướng: [Vấn đề 3836] (https://github.com/symfony/symfony/issues/3836#issuecomment-23145270) – keyboardSmasher

Trả lời

9

Tính đến hôm nay, bạn có thể làm như sau trong ngành thạc sĩ (và sắp tới 2.1):

{{ u.vars.data.name }} 

u là quan điểm hình thức cho người sử dụng, trong đó có chứa một danh sách các biến kèm theo. Biến số data chứa dữ liệu được chuẩn hóa của biểu mẫu, thường là đối tượng của bạn (trừ khi bạn thêm một biến mô hình tùy chỉnh).

Trong các phiên bản trước đó của Symfony, bạn có thể làm:

{{ u.vars.value.name }} 

Biến value chứa các dữ liệu quan điểm của các hình thức, cũng là đối tượng của bạn (trừ khi bạn thêm một mô hình tùy chỉnh hoặc xem biến áp).

Nếu bạn đang làm việc trên tổng thể của Symfony hoặc> = 2.1, tôi khuyên bạn nên truy cập data thay vì value.

+0

Đối với một thực thể loại biểu mẫu tôi phải làm điều này: '{{u.data.field}}' khi lặp qua các lựa chọn – ncatnow

+1

Cách nhận phiếu bầu này, tôi không biết. Nó chỉ đơn giản là sai.Tôi đăng một bình luận theo OP với một liên kết đến một giải pháp. – keyboardSmasher

+0

@keyboardSmasher: bạn có thể nhận thấy rằng bernhard là cùng một người đã đóng vấn đề mà bạn đã liên kết với github vì vậy tôi chắc chắn rằng bạn có thể tìm ra, bây giờ, tại sao câu trả lời này có 6 upvotes: Tôi chắc chắn (như Tôi sẽ trả lời cùng một cách) rằng phương pháp này đang làm việc – DonCallisto

30

Trong Symfony 2.5 - bạn có thể thực hiện việc này bằng cách truy cập dữ liệu từ mỗi lựa chọn bằng cách sử dụng giá trị chỉ mục của trẻ.

Trong xây dựng hình thức - như bạn mong đợi:

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

Trong mẫu 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) }} 
+1

Tôi khuyên bạn nên sử dụng '{% set entity = projectForm.stages.vars.choices [loop.index - 1] .data%}' thay vì lấy chỉ mục từ giá trị thuộc tính thực thể. Bằng cách này bạn có thể tránh lỗi khóa mảng không xác định. –

+0

@NikDenisov vòng lặp cũng có biến 'loop.index0': https://twig.symfony.com/doc/2.x/tags/for.html#the-loop-variable nên không cần -1 –

3

Version 2.6.7

Tương tự như những gì Aaron Geiser đề nghị, bạn có thể sử dụng customised form widgets để đạt được điều này:

{# 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 -%} 
2

Cập nhật Bernhard Schussek's answer cho Symfony 2.8.4 (hoặc thậm chí hơi phiên bản thấp hơn):

{% 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 %} 
4

này đã làm việc cho tôi trong Symfony 3.1 cho một widget radio:

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

Xin chào , làm cách nào tôi có thể thực hiện tương tự nhưng với trường CollectionType? Không thể truy cập vào dữ liệu thu thập vì phương thức này là riêng tư ... – Felurian

Các vấn đề liên quan