我想在创建父实体时构建一个包含固定数量子节点的集合的表单。它不应该允许添加更多的孩子。 在编辑时,它应该自动获取子项,而不允许添加更多子项。
使用下面的代码,表单将被呈现,但不显示任何收集子项。
父母表格:
$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;
....
}
答案 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()
]);
}
}
提交时,您仍然必须验证控制器中的关系量。