2013-04-12 31 views
5

Tôi muốn trợ giúp. Tôi có một biểu mẫu với danh sách thả xuống và tôi cần sửa đổi các lựa chọn dựa trên đầu vào bên ngoài. Tôi đoán nó sẽ làm việc tốt với eventListenerSymfony2 - sửa đổi trường biểu mẫu với eventListener

$builder->addEventListener(
      FormEvents::PRE_SET_DATA, 
      function(FormEvent $event) use($input){ 
       $form = $event->getForm(); 

       // get existin form child 
       // modify list of choices 

      } 

Tất cả các mẫu tôi đã thấy đang sử dụng FormEvents chỉ để thêm lĩnh vực mới, nhưng tôi cần phải sửa đổi lĩnh vực đang tồn tại nhưng tôi không biết làm thế nào để truy cập vào nó.

nhờ sự giúp đỡ

+0

jros: bạn đang cố sửa đổi nó theo cách nào? Bạn có muốn thay thế nó bằng một loại khác hoặc chỉ thay đổi một trong các thuộc tính của nó hoặc một cái gì đó khác? – Sean

Trả lời

0

Có một bài viết trên blog ở đây là hoạt động thông qua một hình thức động toàn bộ cho một mối quan hệ thực thể: http://aulatic.16mb.com/wordpress/2011/08/symfony2-dynamic-forms-an-event-driven-approach/

Các trang web Symfony đã này chủ yếu là tài liệu quá, bạn chỉ cần viết ajax mã và phương pháp điều khiển tương ứng được thực hiện trong bài đăng trên blog: http://symfony.com/doc/current/cookbook/form/dynamic_form_modification.html

2

Những gì bạn có thể làm là ghi đè con ban đầu.

$builder->addEventListener(
     FormEvents::PRE_SET_DATA, 
     function(FormEvent $event) use($input){ 
      $form = $event->getForm(); 

      $form->add($this->factory->createNamed('name_to_override', 'choice', null, 
       array("choices" => array("choice"=>"value")) 
       )); 

     } 

Nó làm việc cho tôi.

LƯU Ý: điều này sẽ chỉ hoạt động trong PHP 5.4, dưới dạng $this trong phần đóng không có sẵn trong PHP 5.3.

+2

Trong 5.3, đặt '$ that = $ this;' trước khi gọi lại, 'use ($ that)', và thay đổi '$ this-> factory' thành' $ that-> factory'. – moteutsch

20

Trong khi câu hỏi ban đầu là khá cũ, hãy để tôi rời khỏi này đây trong trường hợp ai đó đi qua các nhu cầu thay đổi tùy chọn cụ thể của một trường mà không cần phải sao chép tất cả các tùy chọn nữa:

<?php 

$builder->addEventListener(FormEvents::PRE_SET_DATA, function (FormEvent $event) { 
    $form = $event->getForm(); 

    // Get configuration & options of specific field 
    $config = $form->get('field_to_update')->getConfig(); 
    $options = $config->getOptions(); 

    $form->add(
     // Replace original field... 
     'field_to_update', 
     $config->getType()->getName(), 
     // while keeping the original options... 
     array_replace(
      $options, 
      [ 
       // replacing specific ones 
       'required' => false, 
      ] 
     ) 
    ); 
}); 

Nguồn: https://github.com/symfony/symfony/issues/8513#issuecomment-21868035

+9

Tôi có cùng một vấn đề nhưng với Symfony 3. Thay vì '$ config-> getType-> getName()' sử dụng 'get_class ($ config-> getType() -> getInnerType())'. Điều này là do Symfony 3 yêu cầu loại đó là tên lớp đầy đủ. – TheNextBigThing

+1

Bạn vừa lưu lại ngày của tôi ... Cả hai bạn! – Delphine

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