Hallo,
habe ein Feld mit einer m:n Beziehung! Wähle ich aus dem select Feld im FE einen Wert aus und speichere funktioniert alles wunderbar. Auch wenn ich diesen Wert nochmal ändere oder noch weitere dazunehme/entferne wird alles in den entsprechenden Tabellen von extbase gespeichert.
Jetzt das Problem, wenn ich alles deaktiviere, so dass es keine Beziehungen mehr geben soll, dann bleibt alles wie vorher. Was muss ich machen dass alle vorherigen Beziehungen gelöscht werden wenn im select alles deaktiviert wird.
public function updateAction(Tx_MyExt_Domain_Model_myModel $myModel) {
$this->myRepository->update($myModel);
$this->redirect('list');
}
Gruß
mimaxx
Du machst alles richtig. Man würde es nicht meinen, aber das ist tatsächlich ein ... wie sag ich das jetzt möglichst diplomatisch ... "missing feature"? :o
Siehe: http://forge.typo3.org/issues/42149
Wenn Du die 4.7 verwendest, dann findest Du die entsprechende Stelle in der Klasse "Tx_Extbase_Property_PropertyMapper" in den Zeilen 176-185. Allerdings sind auch TypeConverter (z.B. der Tx_Extbase_Property_TypeConverter_PersistentObjectConverter) davon betroffen und weiters auch die Property-Validatoren (wenn du sie benötigst), welche alle darauf ausgerichtet sind, keine NULL-Values zu erhalten. Viel Spaß beim fixen ;-)
Mmh, sorry, das was ich geschrieben habe gilt nicht für m:n sondern nur für 1:n. Das betreffende Property bei Dir ist ein Objectstorage, richtig? Dann musst Du den ObjectStorageConverter fixen:
class Tx_MyExt_Property_TypeConverter_ObjectStorageConverter extends Tx_Extbase_Property_TypeConverter_ObjectStorageConverter {
/**
* Actually convert from $source to $targetType, in fact a noop here.
*
* @param array $source
* @param string $targetType
* @param array $convertedChildProperties
* @param Tx_Extbase_Property_PropertyMappingConfigurationInterface $configuration
* @return array
* @api
*/
public function convertFrom($source, $targetType, array $convertedChildProperties = array(), Tx_Extbase_Property_PropertyMappingConfigurationInterface $configuration = NULL)
{
$objectStorage = new Tx_Extbase_Persistence_ObjectStorage();
if (count($convertedChildProperties)) {
foreach ($convertedChildProperties as $subProperty) {
$objectStorage->attach($subProperty);
}
} else {
// this ugly hack takes care, that the empty object storage get´s marked as modified;
// without this it would not get persisted
$tmp = new stdClass();
$objectStorage->attach($tmp);
$objectStorage->detach($tmp);
}
return $objectStorage;
}
}