2013-09-17 2 views
0

У меня возникли проблемы с полем коллекции в форме. Я новичок в Symfony, так что, возможно, это поблем. Я надеюсь, что вы можете мне помочь.Symfony2 - Сохранить поле для создания формы

У меня есть объект с именем 'TrOrder':

/** 
* @ORM\Entity(repositoryClass="projectName\TrOrderBundle\Entity\TrOrderRepository") 
*/ 
class TrOrder 
{ 
    /** 
    * @ORM\Id 
    * @ORM\Column(type="integer") 
    * @ORM\GeneratedValue 
    * @Assert\NotBlank() 
    */ 
    protected $id; 

    /** 
    * @ORM\ManyToOne(targetEntity="projectName\UserBundle\Entity\Client", inversedBy="trOrders") 
    * @ORM\JoinColumn(name="client_id", referencedColumnName="id", nullable=false)   
    * @Assert\NotBlank(message = "Por favor, selecciona el cliente tramitador.") 
    */ 
    protected $client; 

    /** 
    * @ORM\OneToMany(targetEntity="projectName\TrOrderBundle\Entity\TrOrderAttachment", mappedBy="trOrder") 
    */ 
    protected $attachments; 

    ... 

} 

Как вы можете видеть, поле 'вложения' имеет OneToMany связь с другим объектом под названием 'TrOrderAttachment':

/** 
* @ORM\Entity(repositoryClass="projectName\TrOrderBundle\Entity\TrOrderAttachmentRepository") 
* @ORM\HasLifecycleCallbacks 
*/ 
class TrOrderAttachment 
{ 
    /** 
    * @ORM\Id 
    * @ORM\Column(type="integer") 
    * @ORM\GeneratedValue 
    */ 
    protected $id; 

    /** 
    * @ORM\ManyToOne(targetEntity="projectName\TrOrderBundle\Entity\TrOrder", inversedBy="attachments") 
    * @ORM\JoinColumn(name="trorder_id", referencedColumnName="id") 
    */ 
    protected $trOrder; 

    /** 
    * @ORM\ManyToOne(targetEntity="projectName\TrOrderBundle\Entity\AttachmentType") 
    * @ORM\JoinColumn(name="attachmenttype_id", referencedColumnName="id") 
    */ 
    protected $attachmentType; 

    /** @ORM\Column(type="string", length=255) */ 
    protected $fileName; 

    public $file; 

    ... 
} 

I создали форму для TrOrder, в которой они создали поле коллекции:

class TrOrderType extends AbstractType 
{ 
    public function buildForm(FormBuilderInterface $builder, array $options) 
    { 
     // Crea un array con los subordinados del cliente registrado 
     $subordinates = $this->subordinates;   
     $sub = array();   
     foreach ($subordinates as &$subord) 
      $sub[$subord->getId()] = $subord->getAdminName() . " (" . $subord->getId() . ")"; 

     // Crea los campos del formulario 
     $builder  
      ... 
      ->add('attachments', 'collection', array(
                'required' => false, 
                'type'   => new    TrOrderAttachmentType(), 
                /*'allow_delete' => true,*/ 
                'allow_add' => true, 
                'prototype' => true, 
                'by_reference' => false, 
                )) 
      ... 
    } 

    public function setDefaultOptions(OptionsResolverInterface $resolver) 
    { 
     $resolver->setDefaults(array(
      'data_class' => 'projectName\TrOrderBundle\Entity\TrOrder'/*, 
      'csrf_protection' => false*/ 
     )); 
    } 

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

Форма TrOrderAttachment является:

class TrOrderAttachmentType extends AbstractType 
{ 
    public function buildForm(FormBuilderInterface $builder, array $options) 
    { 
     $builder 
      ->add('attachmentType', 'entity', array('label' => 'Tipo de adjunto', 
                'class' => 'TrOrderBundle:AttachmentType')) 
      ->add('file', 'file', array('label' => 'Archivo', 'required' => false)) 
      ; 
    } 
    public function setDefaultOptions(OptionsResolverInterface $resolve) 
    { 
     $resolve->setDefaults(array(
      'data_class' => 'projectName\TrOrderBundle\Entity\TrOrderAttachment' 
     )); 
    } 
    public function getName() 
    { 
     return 'attachment'; 
    } 
} 

В моей html.twig для TrOrder я включил поле вложения, как это:

{{ form_widget(formulario.attachments) }} 
<input class="jslink" type="submit" value="Add new file" /> 

и некоторые JS код:

function add() { 
      var collectionHolder = $('#nencargo_attachments'); 
      var prototype = collectionHolder.attr('data-prototype'); 
      // Sustituye __name__ con el número de hijos que tiene el div #nencargo_attachments, es decir, la cantidad de archivos adjuntos que hay. 
      var form = prototype.replace(/__name__/g, collectionHolder.children().length); 
      $(form).filter('div').first().html($(form).html() +'<a class="delete_link" href="#">Remove</a>'); 
      collectionHolder.append(form); 
     } 

     $('input.jslink').click(function(event){ 
      event.preventDefault(); 
      add(); 
     }); 

     $(document).on('click', 'a.delete_link',function(event){ 
      $(event.currentTarget).parent().remove(); 
     }); 

Мой вопрос: как сохранить прикрепленные файлы в вложениях полей в TrOrder? Они также должны быть сохранены в TrOrderAttachment. Я не понимаю, как это делается.

Я был бы очень признателен.

ответ

1

Вам необходимо выполнить каскадное сопротивление на вложениях вашего объекта trorder. More info here

После отправки формы используйте метод getData для извлечения объекта. Тогда просто продолжайте это.

Извините за короткий ответ, но я нахожусь на своем телефоне.

Смежные вопросы