2016-04-01 10 views
1

Belirli bir Varlığın birden fazla kaydını oluşturacak bir form türü oluşturmam gerekiyor.Symfony2 aynı türde birden çok kayıt eklemek için bir form türü oluşturun

Ana Form Türü oluşturmayı ve sonra da içinde bir koleksiyon eklediğimi anladım. Bu ebeveyn Türü herhangi bir varlığa bağlanmaz, ancak alt Tür türü. Sorun şu ki, isteği işlediğimde boş bir veri nesnesi alıyorum. İşte

benim ana Tür:

class ChallengeCollectionType extends AbstractType { 

    /** 
    * {@inheritdoc} 
    */ 
    public function buildForm(FormBuilderInterface $builder, array $options) 
    { 
     $builder->add('email_invitations', CollectionType::class, [ 
      'entry_type' => EmailInvitationType::class 
     ]); 
    } 

    /** 
    * {@inheritdoc} 
    */ 
    public function configureOptions(OptionsResolver $resolver) 
    { 
     $resolver->setDefaults(array(
      'csrf_protection' => false 
     )); 
    } 

} 

My Child Tür:

public function inviteEmailAction(Request $request){ 

     $form = $this->createForm(ChallengeCollectionType::class); 

     $form->handleRequest($request); 

     dump($form->getData()); 
     dump($form->get('email_invitations')->getData()); 
     die(); 
} 

Bir veri göndermek:

İşte
class EmailInvitationType extends AbstractType { 

    /** 
    * {@inheritdoc} 
    */ 
    public function buildForm(FormBuilderInterface $builder, array $options) 
    { 
     $builder->add('email', EmailType::class); 
    } 

    /** 
    * {@inheritdoc} 
    */ 
    public function configureOptions(OptionsResolver $resolver) 
    { 
     $resolver->setDefaults(array(
      'data_class'  => Challenge::class, 
      'csrf_protection' => false 
     )); 
    } 

} 

Ben Kontrolör benim verileri işlemek nasıl POST isteği (bu API'dir ve HTML formu yoktur):

challenge_collection[email_invitations][0][email] = "[email protected]" 
challenge_collection[email_invitations][1][email] = "[email protected]" 

Ve Denetleyici tüm dökümler için boş [] döndürür.

Aslında geçici bir çözüm bulduk ama kötü görünüyor:

 $data = ['email_invitations' => [new Challenge(), new Challenge()]];   

     $form = $this->createForm(ChallengeCollectionType::class, $data); 

     $form->handleRequest($request); 

Ve bu çalışacaktır, bu yüzden istek işleme almak için Varlık türünden boş nesneler dizisi göndermek zorunda.

Hatta bu şekilde

:

$data = ['email_invitations' => []]; 

    if(!empty($request->request->get('challenge_collection'))){ 
     if(!empty($request->request->get('challenge_collection')['email_invitations'])){ 
      for($i = 0; $i < count($request->request->get('challenge_collection')['email_invitations']); $i ++){ 
       $data['email_invitations'][] = new Challenge(); 
      } 
     } 
    } 

bunu yapmak için daha iyi bir yolu olmalı, onu bulmak için bana yardım edin. Burada açıklamalar bulabiliriz

$invitations = $this->getDoctrine()->getRepository('yourInvitationEntityClass')->findAll());   
$form = $this->createForm(ChallengeCollectionType::class, $invitations); 

:

cevap

0
+0

Cevabınız için teşekkür ederiz! Benim endişem şu ki, findAll() bu durumda binlerce kaydı geri alabilir, aslında kullanamayacağım bazı verileri almak için veritabanına ağır bir istekte bulunmanın iyi bir yolu mu?Bu durumda boş öğeler kümesi oluşturmak için benim döngüsü daha verimli görünüyor –

+0

Hi @ Vladimir Mikhaylovskiy findAll() sadece bir örnektir. kendi isteğinizi deponuzda yapabilir ve kullanabilirsiniz. ama eğer yeni etkili bir şekilde yaratmak gerekirse, bunu yapmak için iyi bir yol değil: c). Bu durumda, Prototype kullanmayı denemelisiniz: http://symfony.com/doc/current/cookbook/form/form_collections.html#allowing-new-tags-with-the-prototype – lemairep

+0

Anladığım gibi, Prototip yalnızca kullanılır ön uç için, ama bunun için endişelenmiyorum çünkü API yapıyorum. Etiketler içeren örnekte, varlıkla ilgili tüm etiketleri döndüren getTags() vardır. Ama benim durumumda bir varlığım yok. –

1

Sen allow_add ve allow_delete seçenekleri kullanarak denemelisiniz toplama alanı türü. Ayrıca, bu, ana varlık için denetleyicideki ArrayCollection nesnesinde alt nesneler alabilen bir alt öğeyle birlikte mapped-by ilişkisine sahip olması açısından önemlidir. Ayrıca, istek üzerine otomatik olarak kaydetmek/kaldırmak isterseniz, bir 'by_reference false and set association with kaskat-kalıcı and kaskat-kaldır' uygulamanız gerekir.

Çok sayıda kez API ile collection alan türünü kullandım ve çekicilik gibi çalıştı. Daha fazla açıklamaya ihtiyacınız varsa bana bildirin.

İlgili konular