2012-09-17 79 views
5

在我的extbase/fluid項目中,除了創建,刪除,列表等標準操作之外,我想創建存儲在存儲庫中的模型類對象的副本。使用findall(),所有對象都顯示在列表中,並且相應的操作(例如刪除,編輯)顯示在每個對象旁邊。對於複製對象,我已經創造了相應的控制器重複的動作和這裏是代碼:複製extbase存儲庫對象

public function dupcliateAction(Tx_CcCompanylogin_Domain_Model_MyObject $testObject) 
{ 
$this->myObjectRepository->add($testObject); 
$this->redirect('list');//Lists the objects again from the repository 
} 

似乎straitforward不夠好,但沒有新的對象被添加到存儲庫和我沒有得到一個error.I有檢查了文檔,沒有明確的方法可用於複製。

回答

3

注意:當一個對象被克隆時,PHP 5會執行所有對象屬性的淺表副本。任何引用其他變量的屬性都將保留引用。

另外,您可以使用反射來創建對象的(深)副本。

$productClone = $this->objectManager->create('Tx_Theext_Domain_Model_Product'); 

// $product = source object 
    $productProperties = Tx_Extbase_Reflection_ObjectAccess::getAccessibleProperties($product); 
    foreach ($productProperties as $propertyName => $propertyValue) { 
     Tx_Extbase_Reflection_ObjectAccess::setProperty($productClone, $propertyName, $propertyValue); 
    } 

// $productAdditions = ObjectStorage property 
    $productAdditions = $product->getProductAddition(); 
    $newStorage = $this->objectManager->get('Tx_Extbase_Persistence_ObjectStorage'); 
    foreach ($productAdditions as $productAddition) { 
     $productAdditionClone = $this->objectManager->create('Tx_Theext_Domain_Model_ProductAddition'); 
     $productAdditionProperties = Tx_Extbase_Reflection_ObjectAccess::getAccessibleProperties($productAddition); 
     foreach ($productAdditionProperties as $propertyName => $propertyValue) { 
      Tx_Extbase_Reflection_ObjectAccess::setProperty($productAdditionClone, $propertyName, $propertyValue); 
     } 
     $newStorage->attach($productAdditionClone); 
    } 
    $productClone->setProductAddition($newStorage); 
// This have to be repeat for every ObjectStorage property, or write a service. 
0

我認爲add命令會忽略已經存在的對象。

您可以嘗試克隆該對象,然後將該克隆添加到存儲庫$copy_of_object = clone $object;。或者也許創建一個具有所有相同屬性的新對象。

2

對於那些誰可能關注:

你並不需要調用反射API在這一點上。 你只需要實現一個叫做例如resetUid()在你的模型是這樣的:

public function resetUid() { 
    $this->uid = NULL; 
    $this->_setClone(FALSE); 
} 

那麼你可以使用魔法clone方法克隆對象在您的控制器。之後你必須調用新的resetUid()方法,然後你可以使用舊屬性來保存新對象。

1

對我來說,解決方案「在Modell中克隆$對象和resetUid()」不起作用。也許這個解決方案在舊版TYPO3版本中工作,但在7.6中。 LTS它拋出一個異常

#1222871239: The uid "61" has been modified, that is simply too much. 

所以也許有人能找到我的解決方案有幫助的,因爲它是代碼比其他反射解決方案要少得多:(你不必去想設置所有單一屬性..)

鑑於:一個名爲$註冊與所有數據的對象。 通緝結果:具有相同數據但新Uid的對象的副本。

/** @var \JVE\JvEvents\Domain\Model\Registrant $newregistrant */ 

$newregistrant = $this->objectManager->get("JVE\\JvEvents\\Domain\\Model\\Registrant") ; 

$properties = $registrant->_getProperties() ; 
unset($properties['uid']) ; 

foreach ($properties as $key => $value) { 
    $newregistrant->_setProperty($key , $value) ; 

}