2015-12-28 50 views
0

我有一個字段類型實體呈現爲複選框,我想爲每個複選框添加一個textarea類型的字段,我該怎麼做?Symfony:如何將字段表單添加到孩子?

代碼:

// OfferType.php 
$builder 
    ->add('payment_method', new OfferPaymentType(), [ 
     'required' => false, 
     'mapped' => false, 
     'expanded' => true, 
     'multiple' => true, 
    ]) 
; 

// OfferPaymentType.php 
class OfferPaymentType extends AbstractType 
{ 
    public function buildForm(FormBuilderInterface $builder, array $options) 
    { 
     $builder 
      ->add('payment', null, [ 
       'multiple' => true, 
       'expanded' => true, 
       'compound' => true, 
      ])  
     ; 

     $factory = $builder->getFormFactory(); 

     $formModifier = function (FormInterface $form, $payments = null) use ($factory) { 
      foreach ($form as $child) { 
       //dump($child);die; 
       $child->add(
        $factory->createNamed('metadata', 'textarea', null, [ 
         'auto_initialize' => false, 
         'compound' => true, 
        ]), 
        null, 
        ['compound' => true] 
       ); 

      } 
     }; 

     $builder->get('payment')->addEventListener(
      FormEvents::PRE_SET_DATA, 
      function (FormEvent $event) use ($formModifier) { 
       $data = $event->getData(); 
       $formModifier($event->getForm(), $data); 
      } 
     ); 
    } 

    public function configureOptions(OptionsResolver $resolver) 
    { 
     $resolver->setDefaults(array(
      'multiple'   => true, 
      'expanded'   => true, 
      'class'    => 'AppBundle:OfferPayment', 
      'data_class'   => 'AppBundle\Entity\OfferPayment', 
      'translation_domain' => 'app', 
      'compound'   => true, 
     )); 
    } 

    public function getName() 
    { 
     return 'offer_payment'; 
    } 
} 
+0

我認爲你可以通過以下步驟解決: 1-創建一個帶有兩個字段的新類型表單s - 複選框和文本區 2-使用創建的新類型的集合創建新表單。 但這取決於你需要做什麼。無論如何,你可以看看文檔:[如何嵌入表單集合](http://symfony.com/doc/current/cookbook/form/form_collections.html) – rck6982

+0

這種方法的實體類型字段將是選擇框不復選框 –

回答

1

您需要創建要去有兩個嵌入式領域的一個複選框和一個文本區域自定義表單類型

class OfferPaymentType extends AbstractType 
{ 
    public function buildForm(FormBuilderInterface $builder, array $options) 
    { 
     $builder->add('payement', 'checkbox') 
       ->add('metadata', 'textarea'); 
    } 
} 

而且在你的表格類型,你會做這樣的事情

class CustomType extends AbstractType 
{ 
    public function buildForm(FormBuilderInterface $builder, array $options) 
    { 
     $builder->add('payment_method', 'collection', array(
       'type'   => new OfferPaymentType(), 
       'allow_add' => true, 
       'allow_delete' => true 
      ) 
     ); 

    } 
} 
+0

我的領域是一個實體領域與擴大和多重設置爲真,有沒有辦法修改實體領域的孩子? –

+0

如果我真的明白你的需要,你正在尋找修改相同的形式你的實體和那裏的孩子,如果是的話,所以你可以使用嵌入式的形式http://symfony.com/doc/current/cookbook/form/form_collections。 html –

+0

對於sampe表單類,我在實體字段上偵聽'PRE_SET_DATA'事件,但是當我嘗試向子項添加一個新字段時,它向我顯示一個錯誤:「您無法將子項添加到簡單表單中。也許你應該將選項「compound」設置爲true?'因爲它被鎖定了 –

相關問題