我有两个相关的实体:杂志和OneToMany关系的问题。 如何创建表单以添加与特定杂志相关的新问题实体?
当我在控制器中创建一个表单时,从表单类中调用它来添加一个Issue,如何为它的某些字段传递一个预先建立的值?
我知道这一定很容易,但我被困在这里。
答案 0 :(得分:1)
您有多种选择:
您可以向FormType
添加隐藏字段,然后通过这样的Magazine ID
。您可以结帐this tutorial作为示例。
详细信息在FormType
:
$builder->add('magazine', 'entity' /*, more options... */);
在您的Controller
:
$magazine = // get Your magazine here...
$issue = new Issue();
$issue->setMagazine($magazine);
$form = $this->createForm(new YourFormType(), $issue);
你可以简单地生成这样的路线:/magazines/{magazine_id}/issues/add
这将为您提供 Controller Action 中的Magazine
实体,如下所示:
public function addAction($magazineId)
{
$magazine = // get by $magazineId
// generate your issue form and stuff
if ($form->isValid()) {
$issue->setMagazine($magazine);
}
}
你可以从那里开始工作。
答案 1 :(得分:0)
您可以通过两种不同的方式解决问题。
1 - 路线:您是否为每个杂志设置了不同的路线?
在您的控制器中,您可以执行以下操作:
if ($form->isValid()) {
...
$magazine = $this->getManager()
->getRepository('AcmeBundle:Magazine')
->findOneBy($magazineId); // /{magazineId}/issue/new
...
$issue->setMagazine($magazine);
$em->persist($issue);
...
}
您也可以阅读route parameters的文档。
2 - 单一表单:如果您在同一路线中添加新问题/issue/new
将Issue
字段添加到$formBuilder
时,添加一个下拉列表以指定Magazine
$builder->add('magazine', 'entity', array(
'class' => 'BundleNamespace:Magazine',
//If your class does not have a __toString() method add below
'property' => 'title',
));
答案 2 :(得分:0)
如果要将Magazine实体绑定到新的Issue实体,则必须添加 表单中包含实体类型的字段(使用formBuilder)。
$builder->add('magazine', 'entity', array(
'class' => 'AcmeBundle:Magazine',
'property' => 'title'));