2012-04-23 23 views
8

tôi có 3 loại hình thức trong symfony2Làm thế nào để tự động thêm của các bộ sưu tập trong các bộ sưu tập trong các loại hình thức Symfony2

FaultType đó là mẹ của tất cả các bộ sưu tập tiếp theo

<?php 

namespace My\FaultBundle\Form; 

use Symfony\Component\Form\AbstractType; 
use Symfony\Component\Form\FormBuilder; 

class FaultType extends AbstractType 
{ 

    public function buildForm(FormBuilder $builder, array $options) 
    { 
     $builder 
       ->add('title') 
       ->add('steps', 'collection', array(
        'type' => new StepType(), 
        'allow_add' => true, 
        'prototype' => true, 
        'by_reference' => false, 
       )) 
       ->add('created') 
       ->add('updated') 
     ; 
    } 

    public function getDefaultOptions() 
    { 
     return array(
      'data_class' => 'My\FaultBundle\Entity\Fault' 
     ); 
    } 

    public function getName() 
    { 
     return 'my_fault_fault'; 
    } 

} 

StepType:

<?php 

namespace My\FaultBundle\Form; 

use Symfony\Component\Form\AbstractType; 
use Symfony\Component\Form\FormBuilder; 

class StepType extends AbstractType 
{ 
    public function buildForm(FormBuilder $builder, array $options) 
    { 
     $builder 
      ->add('body') 
      ->add('photos', 'collection', array(
       'type' => new PhotoType(), 
       'allow_add' => true, 
       'allow_delete' => true, 
       'prototype' => true, 
       'by_reference' => false, 
      )) 
     ; 
    } 

    public function getDefaultOptions() 
    { 
     return array(
      'data_class' => 'My\FaultBundle\Entity\Step' 
     ); 
    } 

    public function getName() 
    { 
     return 'my_fault_step'; 
    } 
} 

và Loại ảnh cuối cùng:

<?php 

namespace My\FaultBundle\Form; 

use Symfony\Component\Form\AbstractType; 
use Symfony\Component\Form\FormBuilder; 

class PhotoType extends AbstractType 
{ 
    public function buildForm(FormBuilder $builder, array $options) 
    { 
     $builder 
      ->add('name') 
      ->add('description') 
      ->add('filename') 
     ; 
    } 

    public function getDefaultOptions() 
    { 
     return array(
      'data_class' => 'My\FaultBundle\Entity\Photo' 
     ); 
    } 

    public function getName() 
    { 
     return 'my_fault_photo'; 
    } 
} 

Tôi tìm thấy bài viết xuất sắc link về nguyên mẫu, và với một loại hình lồng nhau là rất tốt, nhưng tôi có một vấn đề khi muốn có được điều này để làm việc với tổ thứ ba có nghĩa là PhotoType ... Hình ảnh trong bộ sưu tập của các bước, đó là bộ sưu tập Lỗi ..., làm cách nào để tôi có thể tự động thêm/xóa ảnh cho các bước bằng ví dụ này ...?

Trả lời

3

Tôi đã tạo đoạn mã JS có thể trợ giúp tại đây. bạn chỉ cần thêm hai nút [thêm mới, xóa cuối cùng]. https://gist.github.com/juanmf/10483041

nó có thể xử lý các mẫu thử đệ quy/lồng nhau. Nó kết hợp với một trung gian hòa giải (giống như Symfony event Dispatcher) cho phép bạn liên kết các điều khiển được tạo ra với các sự kiện. Nếu bạn không cần người hòa giải xóa các dòng này:

docdigital.mediatorInstance.send(
    docdigital.constants.mediator.messages.clonePrototype_prototypeAdded, 
    $clone 
); 
+0

Hãy cân nhắc thêm nội dung liên quan bạn đã liên kết vào câu trả lời của mình. Xem: [** Cung cấp ngữ cảnh cho các liên kết **] (http://stackoverflow.com/help/how-to-answer) –

0

Bạn phải tự tạo mẫu thử nghiệm.

Có 2 giải pháp:

  1. Tìm với regex tất cả các phân đoạn chữ số của một property_path, và thay thế chúng với placeholder

    $segments_found = preg_match('/\[(\d+)\]/', $prototype, $matches); 
    
  2. Sử dụng đệ quy để tìm cha mẹ bộ sưu tập hàng đầu và xây dựng con đường bằng tay từ đó.

Bạn đã thử sắp xếp lại các mục chưa? Đây là tổng số thảm họa;)

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