错误:传递到选择字段的实体必须以多步骤形式进行管理


Error: Entities passed to the choice field must be managed in a multistep form

我有两个实体: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));
  }
  ...
}