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:
İşteclass 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);
:
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 –
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
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. –