2015-12-28 32 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?'因为它被锁定了 –

相关问题