2012-09-17 13 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はオブジェクトのすべてのプロパティのシャローコピーを実行します。他の変数への参照であるプロパティはすべて参照のままです。

代わりに、反射を使用してオブジェクトの(深い)コピーを作成できます。

あなたはこの時点で反射-APIを呼び出す必要はありません。気にも人のために

$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;に追加することができます。あるいは、すべて同じプロパティを持つ新しいObjectを作成することもできます。

2

。 などと呼ばれるメソッドを実装するだけで済みます。

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

、あなたはあなたのコントローラ内でオブジェクトを複製するために魔法cloneメソッドを使用することができます。このようなモデルでresetUid()。その後、新しいresetUid()メソッドを呼び出さなければならず、新しいオブジェクトを古いプロパティで永続化することができます。

1

私の場合、ソリューション "モデルオブジェクトのClone $ ObjectとresetUid()"は機能しません。このソリューションは古いTYPO3バージョンではなく、7.6で動作していた可能性があります。 LTSそれは、他の反射ソリューションよりもはるかに少ないコードが役に立つよう

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

はので、多分誰かが私の解決策を見つけることができる例外をスロー:(とあなたがすべて単一のプロパティを設定するために約考える必要はありません...)

与えられた:すべてのデータを含む$ registrantというオブジェクト。 の結果募集:同じデータでそのオブジェクトのコピーを、新しい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) ; 

}