Duplizieren von Datensätzen in Extbase-Erweiterungen
In diesem Beitrag zeige ich eine Möglichkeit auf, wie sich Datensätze in Extbase-Erweiterungen im Frontend-Controller als Objekte duplizieren lassen.
Umsetzung in Erweiterung
Eine sehr schöne Methode zur Umsetzung dieser Funktionalität konnte ich auf Stackoverflow in einer Diskussion finden, nachdem ich eine Erweiterung von TYPO3 9 auf TYPO3 10 aktualisieren musste.
Zuvor wurde in dieser Erweiterung zum Kopieren von Datensätzen eine Backend-Benutzer-Session geöffnet und über das BackendUtility das Kopieren des Datensatzes vorgenommen.
Folgende Funktion von Stackoverflow habe ich übernommen:
/**
* @param object $object
* @return object
* @throws Exception
*/
protected function deepcopy($object)
{
$clone = $this->objectManager->get(get_class($object));
$properties = ObjectAccess::getGettableProperties($object);
foreach ($properties as $propertyName => $propertyValue) {
if ($propertyValue instanceof ObjectStorage) {
$v = $this->objectManager->get(ObjectStorage::class);
foreach ($propertyValue as $subObject) {
$subClone = $this->deepcopy($subObject);
$v->attach($subClone);
}
} else {
$v = $propertyValue;
}
if ($v !== null) {
ObjectAccess::setProperty($clone, $propertyName, $v);
}
}
return $clone;
}
Im eigenen Controller kann diese Funktion dann in einer Kopieren-Funktion wie folgt umsetzen:
/**
* @param MyModel $myModel
* @return MyModel|null
* @throws Exception
*/
protected function copyModel($myModel)
{
/** @var $myModel MyModel */
$newModel = $this->deepcopy($myModel);
if ($newModel) {
$newModel->setProperty('value');
$this->myModelRepository->add($newModel);
$this->persistenceManager->persistAll();
}
return $newModel;
}