2013-05-24 31 views
21

tôi có một vấn đề đơn giản.Symfony2 -> Twig -> Form -> Field -> Set rendered = true

Tôi có một hình thức với một lĩnh vực ví dụ:

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

Trong file cành lá của tôi sử dụng nhiều khối và tôi muốn dừng làm ruộng ... tôi xem b.html.twig tập tin!

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

Nếu tôi loại bỏ các "mặc định()" tôi nhận lỗi, rằng đối tượng không thể được chuyển đổi thành chuỗi. Và thực sự biểu mẫu hiển thị tất cả các trường ... Bao gồm trường x. Nhưng họ không nên hiển thị trường x ...

Cảm ơn bạn trước!

Trả lời

65

Tôi có thiếu các câu hỏi ở đây? Nếu bạn muốn đặt trường làm kết xuất mặc dù đây không phải là cuộc gọi đơn giản là:

{% do form.x.setRendered %} 

Nếu tôi hiểu lầm, xin lỗi của tôi.

3

Bạn nên xóa (hoặc chỉ thêm) trường biểu mẫu trong FormType của bạn bằng cách bao gồm một số loại logic quyết định.

Ví dụ kiểm tra sự tồn tại/giá trị của biến số nguyên.

Biến này sau đó có thể được tiêm vào hàm tạo.

Xóa khỏi mẫu của bạn là logic ứng dụng không thuộc mẫu của bạn.

Nếu không có lựa chọn nào khác, hãy xem phương thức FormView::setRendered().

Bạn có thể truy cập vào các phương pháp của một đối tượng sử dụng Cành attribute function:

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

Vấn đề là tôi sử dụng chủ đề biểu mẫu chung có chứa "form_widget (biểu mẫu)" làm mặc định. Tôi cần một trường ở dưới cùng và vì tôi sẽ đặt kết xuất = true. Sau đó, tôi có thể sử dụng nó ở phía dưới và chủ đề toàn cầu của tôi sẽ không hiển thị trường ... – PatrickB

+0

cập nhật câu trả lời của tôi ... câu hỏi chính xác của bạn là làm thế nào để gọi setRendered() cho một hàng trong một hình thức bằng tay? – nifr

+0

Câu hỏi đặt ra là làm thế nào để làm điều này với cành cây (chỉ)^^ Tại thời điểm này tôi sử dụng một chức năng tự tạo ra: chức năng public renderState (trường FormView $) {$ field-> setRendered (true); } – PatrickB

2

Bạn có thể sử dụng tiếp theo tuyên bố hình thức đóng cửa để ngăn chặn render lĩnh vực hình thức được quy định tại Mẫu nhưng không được mô tả trong mẫu:

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

Ví dụ, chúng ta định nghĩa hình thức tiếp theo:

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

Đối biểu mẫu này chúng tôi mô tả mẫu tiếp theo, nhưng chúng tôi không muốn hiển thị trường id, vì vậy chúng tôi có thể sử dụng tùy chọn render_rest trong form_end khối để hiển thị trường một cách id:

{{ form_start(form) }} 
{{ form_row(form.name) }} 
{{ form_row(form.comment) }} 
{{ form_row(form.amount) }} 
{{ form_end(form, {'render_rest': false}) }} 
+4

Câu trả lời này sẽ tốt hơn nếu bạn thêm giải thích. – johnnyRose

+0

Nhưng điều này làm việc cho tất cả các lĩnh vực. Ngoài ra đối với _csrf_token SO, bạn cần phải nhớ thêm trường _csrf bằng tay – Tom

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