2014-03-04 206 views
1

我有一個支持門票的實體:SupportTicket()。我還有一個回覆每張票的條目:SupportEntry()。我在SupportTicket()和SupportEntry()之間建立了一對多的關係。Symfony窗​​體創建新對象並創建第一個一對多對象

現在我想要做的是構建我的窗體,以便它創建初始SupportTicket,然後插入第一個SupportEntry,全部使用相同的形式。我一直在亂搞我的代碼了一段時間,只有半理解我在做什麼,但是這是我在哪裏現在:

// My controller, creating the form 
$supportTicket = new SupportTicket(); 

    $form = $this->createFormBuilder($supportTicket) 
     ->add('subject', 'text', array(
      'label'   => 'Subject' 
     )) 
     ->add('jobNumber', 'text', array(
      'label'   => 'Job Number' 
     )) 
     ->add('supportGroup', 'entity', array(
      'label'   => 'Group', 
      'class'   => 'ShawmutClientBundle:SupportGroup', 
      'property' => 'name', 
      'multiple'  => true, 
      'expanded'  => true 
     )) 
     // ->add('supportEntries', new SupportEntryType()) 
     ->add('supportEntries', new SupportEntryType()) 

     ->add('Save', 'submit') 

     ->getForm(); 

我在自定義表單類型的嘗試

<?php 
namespace Shawmut\ClientBundle\Form\Type; 

use Symfony\Component\Form\AbstractType; 
use Symfony\Component\Form\FormBuilderInterface; 
use Symfony\Component\OptionsResolver\OptionsResolverInterface; 

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

public function setDefaultOptions(OptionsResolverInterface $resolver) 
{ 
    $resolver->setDefaults(array(
     'data_class' => 'Shawmut\ClientBundle\Entity\SupportEntry', 
    )); 
} 

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

形式確實有,我已經從表單類型拉在評論框,但是當我嘗試提交表單,我得到這個錯誤:

Neither the property "supportEntries" nor one of the methods "setSupportEntries()", "_set()" or "_call()" exist and have public access in class "Me\MyBundle\Entity\SupportTicket".

,是的,這是有道理的。它應該是那裏的addSupportEntries()方法。那麼如何告訴表單構建器使用addSupportEntries而不是setSupportEntries?

在此先感謝

+0

很肯定使用集合將做的工作。 - > add('supportEntries','collection',array('type'=> new SupportEntryType()))http://symfony.com/doc/current/cookbook/form/form_collections.html – Cerad

+0

謝謝。這看起來像要走的路,但我無法弄清楚如何渲染textarea。它似乎進入模板,如果我將allow_add和protype包含爲true,但是必須使用Javascript呈現該字段。然後,它不會在表單中正確傳遞值。有點卡住了。 – Dominick

+1

將SupportEntry添加到您的SupportTicket中,以便表單系統可以處理某些事情。 – Cerad

回答

1

collection表單類型去。

->add(
    'supportEntries', 
    'collection', 
    array(
     'type' => new SupportEntryType(), 
     'label' => 'Support Entries', 
     'error_bubbling' => true, 
     'cascade_validation' => true, 
    ) 
) 
+0

感謝您的答案,但它仍然無法正常工作。問題是該集合包含標籤,但我的SupportEntryType中的「comment」textarea未顯示。嘗試提交表單顯示textarea的值不能爲空,因此它看起來像表單是正確的,但textarea不顯示。任何想法爲什麼會發生? – Dominick

+0

這個問題似乎與原型有關。如果我將它保留爲false,則在div中呈現時不顯示任何內容。當我設置爲true時,它將吐出這個破碎的HTML: http://pastebin.com/cYGDHbih – Dominick

0

如果使用集合形式的類型,和textarea的沒有顯示,添加:

'allow_add' => true 

到屬性陣列()。 該代碼會是這個樣子:

->add(
'supportEntries', 
'collection', 
array(
    'type' => new SupportEntryType(), 
    'label' => 'Support Entries', 
    'error_bubbling' => true, 
    'allow_add' => true 
    'cascade_validation' => true, 
) 

要顯示控件,假設你使用的樹枝:

{{ form_widget(form.supportEntries.vars.prototype.comment) }} 

爲了節省支持的條目,這取決於你如何建立你的實體,你可能需要做一些額外的修改。

的文檔可以幫助你得到它的權利: How to Embed a Collection of Forms