我有两个实体:Campaignstreams&材料储备。他们在许多人的关系中相互联系。
活动流
class campaignstream
{
/**
* @var integer
*
* @ORM'Column(name="id", type="integer")
* @ORM'Id
* @ORM'GeneratedValue(strategy="AUTO")
*/
private $id;
/**
* @var string
*
* @ORM'Column(name="name", type="string", length=80)
*/
private $name;
/**
* @ORM'ManyToMany(targetEntity="materialstream", inversedBy="campaignstreams")
* @ORM'JoinTable(name="campaignstream_materialstream")
*
*/
private $materialstreams;
}
物料流
class materialstream
{
/**
* @var integer
*
* @ORM'Column(name="id", type="integer")
* @ORM'Id
* @ORM'GeneratedValue(strategy="AUTO")
*/
private $id;
/**
* @var string
*
* @ORM'Column(name="description", type="string", length=80)
*/
private $description;
/**
* @ORM'ManyToMany(targetEntity="campaignstream", mappedBy="materialstreams")
*
*/
private $campaignstreams;
}
现在我想创建一个多步骤表单来创建一个带有多个物料流的campaignstream。
在我的控制器中,我有这样的东西:
public function addAction(Request $request, $step)
{
$session = $request->getSession();
$em = $this->getDoctrine()->getManager();
if ($step == 1) {
$campaignstream = ($session->get('campaignstreamdata') == '') ? new campaignstream() : $session->get('campaignstreamdata');
$CSF = $this->createForm(new CampaignstreamForm(), $campaignstream);
$CSF->handleRequest($request);
if ($CSF->isSubmitted() && $CSF->isValid()) {
$session->set('campaignstreamdata', $CSF->getData());
return $this->redirectToRoute('campaignstream_add', array('step' => 2));
} else {
return $this->render('CampaignBundle:Stream:add.html.php', array(
'current' => $id,
'data' => $CSF->createView()
));
}
} elseif ($step == 2) {
$campaignstream = $session->get('campaignstreamdata');
$CSMSF = $this->createForm(new CampaignstreamMaterialstreamForm(), $campaignstream);
if ($CSMSF->isSubmitted()) {
$session->set('campaignstreamdata', $CSMSF->getData());
return $this->redirectToRoute('campaignstream_add', array('step' => 3));
} else {
return $this->render('CampaignBundle:Stream:add.html.php', array(
'progress' => $progress,
'current' => $id,
'data' => $CSMSF->createView(),
'title' => $title,
'campaignstream' => $campaignstream
));
}
} elseif ($step == 3) {
...
}
}
现在,在我用于步骤2的表格中,我有这样的:
public function buildForm(FormBuilderInterface $builder, array $options)
{
$builder
->add('materialstreams', 'entity', array(
'class' => 'CampaignBundle:materialstream',
'property' => 'description',
'multiple' => true,
'expanded' => false,
));
}
现在的问题是:
我完成第一步并填写姓名。我完成了第2步,然后选择了正确的物料流。我来到第三步,我意识到我忘记了一个材料流。我点击链接返回步骤2,得到错误:传递到选择字段的实体必须进行管理
我在谷歌上搜索过,并尝试过各种解决方案,比如:
$campaignstream = $em->merge($campaignstream);
错误消失了,但我的表单中没有以前添加的数据,但会话中确实存在这些数据。
我真的需要一些帮助。
哇,在尝试了很多不同的东西之后,我终于解决了它!
我不得不分别对每个物料流进行合并:
} elseif ($id == 2){
$campaignstream = $session->get('campaignstreamdata');
$materials = $campaignstream->getMaterialstreams();
foreach($materials as $material)
{
$campaignstream->removeMaterialstream($material);
$campaignstream->addMaterialstream($em->merge($material));
}
...
}