Symfony表单 - 自动将固定数量的子项添加到集合中

时间:2018-03-22 18:06:15

标签: php symfony twig

我想在创建父实体时构建一个包含固定数量子节点的集合的表单。它不应该允许添加更多的孩子。 在编辑时,它应该自动获取子项,而不允许添加更多子项。

使用下面的代码,表单将被呈现,但不显示任何收集子项。

父母表格:

$builder->add('items', CollectionType::class, ['entry_type' => ItemFormType::class]);

ItemFormType:

public function buildForm(FormBuilderInterface $builder, array $options) {
    $builder
        ->add('sujet', TextareaType::class)
        ->add('corrige', TextareaType::class)
        ->add('vrai', CheckboxType::class)
    ;

        $builder
            ->add('annule', CheckboxType::class);
}

public function configureOptions(OptionsResolver $resolver) {
    $resolver->setDefaults([
        'data_class' => Item::class
    ]);
}

Twig:

{% for item in form.items %}
    {% set nomItem = 'Item'~loop.index %}
    {{ nomItem }}
   {{ form_row(item.vrai) }}
   {{ form_row(item.annule) }}
   {{ form_row(item.sujet) }}
   {{ form_row(item.corrige) }}
{% endfor %}

项目(子)实体:

class Item
{
/**
 * @var integer
 *
 * @ORM\Column(name="id", type="integer")
 * @ORM\Id
 * @ORM\GeneratedValue(strategy="AUTO")
 */
private $id;

/**
 * @ORM\ManyToOne(targetEntity="QC", inversedBy="items", cascade={"persist"})
 * @ORM\JoinColumn(name="qc_id", referencedColumnName="id")
 */
protected $qc;

/**
 * @var string
 *
 * @ORM\Column(name="sujet", type="text")
 */
private $sujet;

/**
 * @var string
 *
 * @ORM\Column(name="corrige", type="text", nullable=true)
 */
private $corrige;

/**
 * @var boolean
 *
 * @ORM\Column(name="vrai", type="boolean")
 **/
private $vrai;

/**
 * @var boolean
 *
 * @ORM\Column(name="annule", type="boolean")
 **/
private $annule;

/**
 * @var integer
 * @ORM\Column(name="ordre", type="integer", nullable=true)
 */
private $ordre;
}

QC(父母)实体:

class QC {
    ....
        /**
 * @var ArrayCollection
 * @ORM\OneToMany(targetEntity="Item", mappedBy="qc", cascade={"all"})
 * @ORM\OrderBy({"ordre" = "asc"})
 */
protected $items;

    ....
}

2 个答案:

答案 0 :(得分:0)

在您的控制器中,高于规则

$form->handleRequest($request); 

将您的孩子添加到父实体。

$parent = new Parent();
for($i = 0 ; $i < 5 ; $i++) {
    $child = new Child(); // instantiate a new child entity
    $parent->addChild($child); // add this instance to the parent entity
}
/* now build your form and handle the request vars if form has been posted */
$form = $this->createForm('AppBundle\Form\ParentType', $parent);
$form->handleRequest($request); 

这样,您可以在显示表单之前以多种方式“初始化”新实体...

答案 1 :(得分:0)

这个问题已经很老了,但是这个答案可能对其他人仍然有用。 您也可以像这样在父类的construct中定义初始关系:

class QC {
    ....

    /**
     * @var ArrayCollection
     * @ORM\OneToMany(targetEntity="Item", mappedBy="qc", cascade={"all"})
     * @ORM\OrderBy({"order" = "asc"})
     */
    protected $items;

    public function __construct()
    {
        $this->items = new ArrayCollection([
            new Item(),
            new Item(),
            new Item(),
            new Item(),
            new Item(),
            new Item()
        ]);
    }
}

提交时,您仍然必须验证控制器中的关系量。