Zum Hauptinhalt springen Skip to page footer

Duplizieren von Datensätzen in Extbase-Erweiterungen

Häufig wird eine "Kopier-Funktion" in Extbase Erweiterungen benötigt, um bereits vorhandene Datensätze zu duplizieren (klonen) um diese dann als neuen Datensatz zu verwenden. Hier stelle ich eine Möglichkeit vor.

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;
}