2014-12-16 9 views
5

Günlük olayları raporlama için insan tarafından okunabilir eşdeğerlere dönüştürmek için bir veritabanı tablosu kullanan bir günlük ayrıştırıcısı üzerinde çalışıyorum.Symfony2'de bir grup ilişkisiz varlık ile nasıl bir form oluşturabilirim?

Örneğin,"start_application_minecraft" gibi bir günlük girişi dönüştürülür alacağı "Minecraft Başlatılan".

Ekran metnini eklemek/güncelleştirmek için bir web arabirimi oluşturmaya çalışıyorum, ancak bunları Symfony Form nesnesine nasıl alacağımı anlayamıyorum.

I (ID, Text ve DisplayText için özelliklere sahip) bir LogEvent varlık var ve bu özelliklere karşılık gelen bir form Tipi oluşturduk.

Tek seferde bir olayı değiştirmek için iyi çalışıyor, ancak her şeyi güncellemek için hepsini tek bir Gönder düğmesine sahip bir sayfaya sahip olmak isterim. Sorun, Forms'u gömmekle ilgili bulabildiğim tüm belgelerin ilişkili olan varlıklarla ilgilenmesidir (örneğin, birden fazla Ürün içeren bir Kategori), fakat benim durumumda, üzerinde çalışmam gereken tüm öğeler tamamen ilgisizdir. Bunu ayarlamak için en iyi yol nedir?

+0

Ben: Düzenlemeniz eylem Eğer günlük etkinlikler aracılığıyla döngü ve ihtiyaç onu yapabilirsin içinde Sonra

public function indexAction() { // replace findAll() with a more restrictive query if you need to $logEvents = $this->getDoctrine()->getManager() ->getRepository('MyBundle:LogEvent')->findAll(); $form = $this->createForm( new MultiLogEventType(), array('logEvents' => $logEvents) ); return array('form' => $form->createView()); } 

d bunun için de bir cevabın olmasını çok seviyorum! :) Bir geçici çözüm, bir ana öğeye bağlı olan her bir "LogEvent" öğesinin olması olabilir. Sonra bu ana varlık için bir form oluşturun ve içinde 'LogEvent' formunu katlayın. – paulgv

+0

Sadece günlük olaylarınızın bir dizisini yapın ve 'koleksiyon' öğesiyle bir forma iletin. http://symfony.com/doc/current/cookbook/form/form_collections.html – Cerad

cevap

1

Symfony 'Collection' form alanı türünü kullanın ve istediğiniz LogEvent varlıklarını bulmak ve bunu Koleksiyona aktarmak için Doktrini'yi kullanın.

Örnek: http://symfony.com/doc/current/cookbook/form/form_collections.html

Referans:

:

class LogEventType extends AbstractType 
{ 
    public function buildForm(FormBuilderInterface $builder, array $options) 
    { 
     $builder->add('text'); 
    } 

    public function setDefaultOptions(OptionsResolverInterface $resolver) 
    { 
     $resolver->setDefaults(array(
      'data_class' => 'My\Bundle\Entity\LogEvent', 
     )); 
    } 

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

Sonra LogEvent varlıkların Collection tutan Formunuzu tipini olun: http://symfony.com/doc/current/reference/forms/types/collection.html

Yani, önce size LogEvent form tipi yapacak

class MultiLogEventType extends AbstractType 
{ 
    public function buildForm(FormBuilderInterface $builder, array $options) 
    { 
     $builder->add(
      'logEvents', 'collection', array('type' => new LogEventType()) 
     ); 
    } 

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

T senin Kontrolör hen, bunun için günlük olayları form oluşturmak ve pass:

public function editAction(Request $request) 
{ 
    $em = $this->getDoctrine()->getManager(); 

    $editForm = $this->createForm(new MultiLogEventType()); 
    $editForm->handleRequest($request); 

    if ($editForm->isValid()) 
    { 
     foreach ($logEvents as $logEvent) { 
      // perform any logic you need to here 
      // (ex: removing the log event; $em->remove($logEvent);) 
     } 
     $em->flush(); 
    } 

    return $this->redirect($this->generateUrl('log_event_edit')); 
} 
+1

Anlamlandırır - örnek kod ile güncellenir. –

1

Tüm varlıkları alt öğe olarak ekleyen bir Form Türü oluşturabilirsiniz. "Verilerinizi" bir dizi yaparsanız, rasgele sayıda form öğesi olabilir.

İlgili konular