5

私のextbase/Fluidプロジェクトでは、create、delete、listなどの標準アクションに加えて、リポジトリに保存されているモデルクラスオブジェクトの複製を作成したいと思います。findall()を使用すると、すべてのオブジェクトがリストに表示され、削除、編集などの対応するアクションがそれぞれの横に表示されます。オブジェクトを複製するために、対応するコントローラーで複製アクションを作成しました。コードは次のとおりです。

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

十分に単純なようですが、リポジトリに新しいオブジェクトが追加されておらず、エラーが発生していません。ドキュメントを確認しましたが、複製に使用できる明示的なメソッドがありません。

4

4 に答える 4

3

注:オブジェクトのクローンが作成されると、PHP5はオブジェクトのすべてのプロパティのシャローコピーを実行します。他の変数への参照であるすべてのプロパティは、参照のままになります。

別の方法として、リフレクションを使用して、オブジェクトの(深い)コピーを作成できます。

    $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. 
于 2012-09-26T10:41:37.157 に答える
3

懸念するかもしれない人のために:

この時点でreflection-apiを呼び出す必要はありません。次のように、モデルにresetUid()などのメソッドを実装するだけで済みます。

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

次に、magicメソッドを使用してclone、コントローラー内のオブジェクトのクローンを作成できます。その後、新しいメソッドを呼び出す必要がありますresetUid()。そうすれば、古いプロパティを使用して新しいオブジェクトを永続化できます。

于 2014-06-12T14:45:14.520 に答える
3

私にとって、ソリューション「Modellで$ 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 ) ;

}
于 2016-11-30T18:28:57.513 に答える
0

addコマンドは既存のオブジェクトを無視すると思います。

オブジェクトのクローンを作成してから、そのクローンをリポジトリに追加することができます$copy_of_object = clone $object;。または、すべて同じプロパティを持つ新しいオブジェクトを作成することもできます。

于 2012-09-22T09:30:23.370 に答える