生成动态数量的CollectionType

时间:2017-06-30 16:56:05

标签: php forms symfony symfony-forms

我想创建几个CollectionType字段。

我有版主,我从db加载所有主持人,并希望将子用户分配给表单中的每个主持人

尝试做类似的事情:

public function buildForm(FormBuilderInterface $builder, array $options)
{
    foreach ($options['moderators'] as $mod) {
        $builder
        ->add('users['.$mod->getId().']', CollectionType::class, array(
          'entry_type' => UserFields::class,
          'allow_add' => true,
          'label' => false,
          'entry_options' => array(
          ),
        ));
    }
}

$options['moderators']中有一些主持人实体。 我想创建与版主实体相同数量的CollectionType字段(上面的示例 - 不起作用,因为我不能将[]作为字段名称传递)

每个版主都有唯一的ID,所以我可以使用它并将此ID传递给每个CollectionType,但如何?

  1. 如何在Controller函数中找回CollectionType的id?
  2. 如何在页面上显示此表单?

1 个答案:

答案 0 :(得分:0)

我认为你需要更深入地了解收藏品是什么;)

您的收藏无效,因为entry_type应为formType。我猜你的情况应该是EntityType(如果你想让用户从用户列表中选择)。

因此,假设您希望每个主持人的主持人集合是一个子用户集合(顺便说一下,您通常会制作一个CRUD并分别编辑每个主持人,因此您不需要带有子集合的集合),你需要这样的东西:

ModeratorCollectionType.php

<?php

namespace AppBundle\Form;

use Symfony\Component\Form\AbstractType;
use Symfony\Component\Form\Extension\Core\Type\CollectionType;
use Symfony\Component\Form\FormBuilderInterface;

class ModeratorCollectionType extends AbstractType
{
    public function buildForm(FormBuilderInterface $builder, array $options)
    {
        $builder->add('moderators', CollectionType::class, [
            'entry_type' => ModeratorType::class,
            'prototype' => true,
            'allow_add' => true
        ]);
    }
}

ModeratorType.php

<?php

namespace AppBundle\Form;

use Symfony\Bridge\Doctrine\Form\Type\EntityType;
use Symfony\Component\Form\AbstractType;
use Symfony\Component\Form\Extension\Core\Type\CollectionType;
use Symfony\Component\Form\FormBuilderInterface;
use Symfony\Component\OptionsResolver\OptionsResolver;

class ModeratorType extends AbstractType
{
    public function buildForm(FormBuilderInterface $builder, array $options)
    {
        $builder->add('users', CollectionType::class, [
            'entry_type' => EntityType::class,
            'entry_options' => [
                'class' => 'AppBundle:User',
            ],
            'prototype' => true,
            'allow_add' => true
        ]);
    }

    public function configureOptions(OptionsResolver $resolver)
    {
        $resolver->setDefaults([
            'data_class' => 'AppBundle\Entity\Moderator',
        ]);
    }
}

在您的控制器中,您将使用ModeratorCollection

制作表格
$form = $this->createForm(ModeratorCollectionType::class, $data = []);