2012-09-17 12 views
5

Nel mio progetto extbase/fluid, oltre alle azioni standard come creare, eliminare, elencare ecc., Voglio creare un duplicato di un oggetto di classe del modello che è memorizzato in un repository. Usando findall(), tutti gli oggetti sono visualizzati in un elenco e le azioni corrispondenti come delete, edit sono visualizzate accanto a ciascuna. Per duplicare un oggetto, ho creato un duplicato azione nel controller corrispondente e qui è il codice:Duplicazione dell'oggetto repository extbase

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

Sembra straitforward sufficiente, ma nessun nuovo oggetto viene aggiunto al repository e io non sto ottenendo un error.I hanno controllato la documentazione e non esiste un metodo esplicito disponibile per la duplicazione.

risposta

3

Nota: quando un oggetto viene clonato, PHP 5 eseguirà una copia superficiale di tutte le proprietà dell'oggetto. Tutte le proprietà che sono riferimenti ad altre variabili, rimarranno riferimenti.

In alternativa è possibile utilizzare la riflessione per creare una copia (profonda) dell'oggetto.

$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

Penso che il comando add ignora gli oggetti già esistenti.

Si potrebbe provare a clonare l'oggetto e quindi aggiungere il clone al repository $copy_of_object = clone $object;. O forse creare un nuovo oggetto con tutte le stesse proprietà.

2

Per coloro che possono riguardare:

Non è necessario chiamare la riflessione-api a questo punto. Devi solo implementare un metodo chiamato ad es. resetUid() nel modello come questo:

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

quindi è possibile utilizzare il metodo magico clone per clonare l'oggetto nel controller. dopodiché devi chiamare il nuovo metodo resetUid() e poi sei in grado di mantenere il nuovo oggetto con le vecchie proprietà.

1

Per me, la soluzione "Clona $ Object e resetUid() nel Modell" non funziona .. forse questa soluzione aveva funzionato con versioni precedenti di TYPO3 ma in 7.6. LTS viene generata un'eccezione

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

così forse qualcuno può trovare la mia soluzione utile in quanto è molto meno codice rispetto l'altra soluzione di riflessione: (e non pensare a impostare tutte le singole proprietà ..)

Dato: un oggetto chiamato $ registrant con tutti i dati. Cercasi Risultato: una copia di tale oggetto con stessi dati, ma nuova 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) ; 

} 
Problemi correlati