2012-09-17 6 views
5

En mi proyecto extbase/fluido, además de las acciones estándar como crear, eliminar, enumerar, etc., quiero crear un duplicado de un objeto de clase modelo que esté almacenado en un repositorio. Usando findall(), todos los objetos se muestran en una lista y las acciones correspondientes como eliminar, editar se muestran al lado de cada uno. Para duplicar un objeto, he creado una acción duplicado en el controlador correspondiente y aquí está el código:Duplicar el objeto del repositorio extbase

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

Parece straitforward suficiente, pero no se añade nuevo objeto en el repositorio y no estoy recibiendo un error.I tiene verificó la documentación y no hay un método explícito disponible para duplicar.

Respuesta

3

Nota: Cuando se clona un objeto, PHP 5 realizará una copia superficial de todas las propiedades del objeto. Cualquier propiedad que sea referencia a otras variables, seguirá siendo referencias.

Alternativa puede usar el reflejo para crear una copia (profunda) de su objeto.

$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

Creo que el comando agregar ignora los objetos que ya existen.

Puede intentar clonar el objeto y luego agregar el clon al repositorio $copy_of_object = clone $object;. O tal vez crear un nuevo objeto con todas las mismas propiedades.

2

Para los que pueda interesar:

No es necesario llamar a la reflexión-api en este punto. Solo necesita implementar un método llamado, p. resetUid() en su modelo como este:

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

continuación, puede utilizar el método mágico clone para clonar el objeto en su controlador. luego debe llamar al nuevo método resetUid() y luego puede persistir el nuevo objeto con las propiedades anteriores.

1

Para mí, la solución "Clone $ Object y resetUid() en el Modell" no funciona ... tal vez esta solución haya funcionado en versiones anteriores de TYPO3 pero en 7.6. LTS lanza una excepción

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

así que tal vez alguien puede encontrar mi solución útil, ya que es mucho menos código que la otra solución reflexión: (y no tener que pensar en establecer todas las propiedades individuales ..)

Dado: un Objeto llamado $ registrant con todos los Datos. Se buscan Resultado: una copia de ese objeto con la misma información, pero UID nuevo ..

/** @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) ; 

} 
Cuestiones relacionadas