2012-01-31 4 views
5

Im thay đổi một số trường thông qua AJAX và khi tôi cố gắng lưu biểu mẫu, tôi sẽ phát hiện lỗi Extra fields are not allowed.Symfony 2 trường bổ sung biểu mẫu

Cách thay đổi thuộc tính trình xác thực đó như validatorPass() trong sf1.4?
Hoặc thay đổi có thể có của nó để hình thành để chấp nhận các trường bổ sung?

Im sử dụng SonataAdminBundle để tạo biểu mẫu.

Trả lời

20

Bạn có thể loại bỏ các trường bổ sung từ các dữ liệu yêu cầu trước khi ràng buộc họ phải có dạng:

// The JSON PUT data will include all attributes in the entity, even 
    // those that are not updateable by the user and are not in the form. 
    // We need to remove these extra fields or we will get a 
    // "This form should not contain extra fields" Form Error 
    $data = $request->request->all(); 
    $children = $form->all(); 
    $data = array_intersect_key($data, $children); 
    $form->bind($data); 
+0

Chính xác những gì tôi đã tìm kiếm, @rogerh, cảm ơn bạn rất nhiều! – Serg

+0

Trong trường hợp của tôi, tôi phải thay đổi dòng đầu tiên thành: $ data = $ request-> request-> get ($ form-> getName()); – Serg

+0

Có cách nào để nhận yêu cầu $ trong một sự kiệnSubscriber để giải pháp này hoạt động trên tất cả các biểu mẫu mà $ builder thêm eventSubscriber không? – Simon

0

Bạn không thể thêm trường bổ sung vì chúng không được khai báo vào thực thể. Có một giải pháp để bỏ qua vấn đề của bạn:

  • tạo biểu mẫu động nơi bạn có thể thêm trường bổ sung.

Bạn có một ví dụ về cách nó hoạt động trên github: https://github.com/Keirua/KeiruaProdCustomerDemoBundle

và đầy đủ các hướng dẫn tại địa chỉ này (nhưng bằng tiếng Pháp):

http://blog.keiruaprod.fr/2012/01/18/formulaires-dynamiques-avec-symfony2/

PS: Có vẻ như Sonata sử dụng cách này để thêm các trường.

+0

Trường Hmm .. liên quan đến thực thể bởi nhiều người. Nhưng tôi muốn trong danh sách chỉ các yếu tố có liên quan đến một thể loại. – Pawel

+0

Mối quan hệ được sử dụng là OneToMany kể từ khi bạn tạo một phần tử mới sẽ là liên kết đến danh mục. – Chopchop

1

Trong trường hợp của tôi là giải pháp thật sự rất đơn giản, chỉ cần thêm allow_add đến lĩnh vực sưu tập của bạn, dưới đây ví dụ của tôi

 ->add('Details', 'collection', array(
      'type' => new DetailsType(), 
      'allow_add' => true, 
      'allow_delete' => true, 
      'label' => ' ' 
     )) 

Bạn cũng có thể kiểm tra các tài liệu chính thức cho vấn đề này http://symfony.com/doc/current/cookbook/form/form_collections.html

Điều đầu tiên bạn cần làm là để cho bộ sưu tập biểu mẫu biết rằng nó sẽ nhận được một số lượng thẻ không xác định. Cho đến nay bạn đã thêm hai thẻ và loại biểu mẫu mong đợi nhận được chính xác hai thẻ, nếu không một lỗi sẽ được ném: Biểu mẫu này không được chứa các trường thừa. Để thực hiện điều này linh hoạt, hãy thêm tùy chọn allow_add vào trường sưu tập của bạn.

+0

Tác phẩm này hoạt động. Cảm ơn. – TrtG