2014-01-23 118 views
1

我想为Sonata Admin中的某些对象创建单个修订选项。将表单绑定后的原始数据保存为对象

我虽然要做到这一点通过以下方式:

  • 用户编辑条目
  • 形式进行验证
  • 新的信息被保存为一个单独的条目(我称之为revision
  • 原来的对象没有被修改,除了相对于修订

,使代码看起来小号omething像这样(源Sonata\AdminBundle\Controller\CRUDController::editAction()):

$object = $this->admin->getObject($id); 
$this->admin->setSubject($object); 
$form = $this->admin->getForm(); 
$form->setData($object); 

$form->bind($this->get('request')); // does this persist the object ? 

// and here is what I basically want to do: 
$object->setId(null); 
$orig = $em->getRepository("MedtravelClinicBundle:Clinic")->find($id); 
$orig->setRevision($object); 
$this->admin->update($orig); 

的问题是,$orig加载已修改,所以var_dump($orig === $object)true

我也试过$em->getUnitOfWork()->getOriginalEntityData($object); - 它抓取正确的数据,但作为一个数组,而不是一个对象(这可能是最后的手段)。

所以,我怎么能得到(并保存)原始对象的形式绑定后发生?

回答

1

我想你应该使用clone关键字来获得你想存储的对象的独立实例。它应该工作通过以下步骤:

  1. 将原始实体($object
  2. 克隆原来的实体得到一个新的临时实体($newObject
  3. 改变$newObject,使之成为项:$newObject->setId(null);
  4. 绑定$newObject的形式
  5. 保存(坚持)$newObject作为修订
  6. 添加修订($object),并坚持它太

我希望,如果形式是无效的,你不会失去所有用户发送的数据。

以防万一,我用this answer找到原来的实体和一个由形式修改之间的差异。

相关问题