Symfony表单 - 自动将固定数量的子项添加到集合中
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Symfony表单 - 自动将固定数量的子项添加到集合中相关的知识,希望对你有一定的参考价值。
我想在创建父实体时构建一个包含固定数量子节点的集合的表单。它不应该允许添加更多的孩子。在编辑时,它应该自动获取子项,不允许添加更多子项。
使用下面的代码,表单将呈现,但不会显示任何收集子项。
家长表格:
$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
]);
}
树枝:
{% 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
*
* @ORMColumn(name="id", type="integer")
* @ORMId
* @ORMGeneratedValue(strategy="AUTO")
*/
private $id;
/**
* @ORMManyToOne(targetEntity="QC", inversedBy="items", cascade={"persist"})
* @ORMJoinColumn(name="qc_id", referencedColumnName="id")
*/
protected $qc;
/**
* @var string
*
* @ORMColumn(name="sujet", type="text")
*/
private $sujet;
/**
* @var string
*
* @ORMColumn(name="corrige", type="text", nullable=true)
*/
private $corrige;
/**
* @var boolean
*
* @ORMColumn(name="vrai", type="boolean")
**/
private $vrai;
/**
* @var boolean
*
* @ORMColumn(name="annule", type="boolean")
**/
private $annule;
/**
* @var integer
* @ORMColumn(name="ordre", type="integer", nullable=true)
*/
private $ordre;
}
QC(父母)实体:
class QC {
....
/**
* @var ArrayCollection
* @ORMOneToMany(targetEntity="Item", mappedBy="qc", cascade={"all"})
* @ORMOrderBy({"ordre" = "asc"})
*/
protected $items;
....
}
答案
在您的控制器中,高于规则
$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('AppBundleFormParentType', $parent);
$form->handleRequest($request);
这样,您可以在显示表单之前以多种方式“初始化”新实体...
另一答案
这个问题很古老,但这个答案可能仍然适用于其他人。您还可以在父类的construct
中定义初始关系,如下所示:
class QC {
....
/**
* @var ArrayCollection
* @ORMOneToMany(targetEntity="Item", mappedBy="qc", cascade={"all"})
* @ORMOrderBy({"order" = "asc"})
*/
protected $items;
public function __construct()
{
$this->items = new ArrayCollection([
new Item(),
new Item(),
new Item(),
new Item(),
new Item(),
new Item()
]);
}
}
您仍需要在提交时验证控制器中的关系数量。
以上是关于Symfony表单 - 自动将固定数量的子项添加到集合中的主要内容,如果未能解决你的问题,请参考以下文章
Symfony 4 + 奏鸣曲管理包 + 关系。表单正在删除子项,但不仅是 parentId