---
title: "Fluid-Form: editieren von verschachteten Model-Objekten?"
url: "https://www.typo3.net/d/111229-fluid-form-editieren-von-verschachteten-model-objekten"
source: "typo3.net"
tags: ["Extensions","Extbase","Fluid","Frage"]
created: "2012-07-05"
last_reply: "2018-02-25"
replies: 10
solved: false
page: 1
pages: 1
lang: "de"
---

# Fluid-Form: editieren von verschachteten Model-Objekten?

Extensions › Extbase · 10 Antworten · gestartet 2012-07-05

## Eröffnungsbeitrag

**robsch** · 2012-07-05 · [Beitrag #1](https://www.typo3.net/d/111229-fluid-form-editieren-von-verschachteten-model-objekten/1)

Hallo!

Ich brüte hier schon seit Stunden und erkenne erst langsam mein Problem. Scheinbar will ich etwas, was von Fluid/Extbase gar nicht unterstützt wird.

Und zwar habe ich ein Model-Objekt Configuration, was wiederum in einer 1:n-Beziehung Property-Objekte hat (Tx_Extbase_Persistence_ObjectStorage kommt zum Zuge). So, das ist eigentlich nicht kompliziert.

Wenn ich das Ganze in einer showAction darstellen will, dann geht das ganz leicht. Ich kann die Configuration mit samt ihrer variablen Anzahl an Properties anzeigen lassen.

Nun wollte ich den Benutzer die Werte editieren lassen. Und zwar auf einer Seite, die die Configuration-Eigenschaften und alle Property-Eigenschaften (tabellarisch) auf einmal anzeigt. Jedoch klappt das scheinbar nicht, wenn ich die variable Anzahl an Property-Objekten in einer for-Schleife anzeigen will.

Fluid-Code:

```html
<f:form action="create" controller="Configuration"  object="{configuration}">
	<f:form.textfield property="name" /><br />
	<table>		
		<tr>
			<th>Property name</th>
			<th>Pattern</th>
		</tr>
		<f:for each="{importConfiguration.properties}" as="p">
		<tr>
			<td>{p.name}</td>
			<td><f:form.textfield property="p.pattern" /></td>
		</tr>
		</f:for>
	</table>
	<f:form.submit value="Create new" />
</f:form>
```

p.name sind gut aus.
p.pattern wird zum Problem. Das geht scheinbar so nicht. Irgendwo anders habe ich mal gesehen, dass es vielleicht mit p.{p.uid}.pattern oder so etwas in der Art gehen könnte.

Gibt es eine Möglichkeit, Objekte in einem Tx_Extbase_Persistence_ObjectStorage liegen in einer Form zu editieren, bzw. anzulegen? Oder ist das nicht möglich?

Gruß,
Roert

## Antworten

### [#2](https://www.typo3.net/d/111229-fluid-form-editieren-von-verschachteten-model-objekten/2) · robsch · 2012-07-05

Also hier noch mal ein wenig Hintergrund:

```php
<?php
class Tx_Forumproducts_Domain_Model_ImportConfiguration extends Tx_Extbase_DomainObject_AbstractEntity {

/**
 * The name of the configuration.
 *
 * @var string
 */
protected $name;


/**
 * properties
 *
 * @var Tx_Extbase_Persistence_ObjectStorage<Tx_Forumproducts_Domain_Model_Property>
 */
protected $properties;

/**
 * Returns the name
 *
 * @return string $name
 */
public function getName() {
	return $this->name;
}

/**
 * Sets the name
 *
 * @param string $name
 * @return void
 */
public function setName($name) {
	$this->name = $name;
}

/**
 * __construct
 *
 * @return void
 */
public function __construct() {
	//Do not remove the next line: It would break the functionality
	$this->initStorageObjects();
}

/**
 * Initializes all Tx_Extbase_Persistence_ObjectStorage properties.
 *
 * @return void
 */
protected function initStorageObjects() {
	/**
	 * Do not modify this method!
	 * It will be rewritten on each save in the extension builder
	 * You may modify the constructor of this class instead
	 */
	$this->properties = new Tx_Extbase_Persistence_ObjectStorage();
}

//... Weitere Methodensignaturem
public function addProperty(Tx_Forumproducts_Domain_Model_Property $property)
public function removeProperty(Tx_Forumproducts_Domain_Model_Property $propertyToRemove)
public function getProperties()
public function setProperties(Tx_Extbase_Persistence_ObjectStorage $properties)
}
?>
```

```php
<?php
class Tx_Forumproducts_Domain_Model_Property extends Tx_Extbase_DomainObject_AbstractEntity {

/**
 * pattern
 *
 * @var string
 */
protected $pattern;

/**
 * Returns the pattern
 *
 * @return string $pattern
 */
public function getPattern() {
	return $this->pattern;
}

/**
 * Sets the pattern
 *
 * @param string $pattern
 * @return void
 */
public function setPattern($pattern) {
	$this->pattern = $pattern;
}

}
?>
```

Wenn ich folgendes mache (habe statt as="p" nun as="properties" genommen):

```html
<f:form.textfield property="name" /><br />

<table>		
	<tr>
		<th>Property Uid</th>
		<th>Pattern</th>
	</tr>
	<f:for each="{importConfiguration.properties}" as="properties">
		<tr>
			<td>{properties.uid}</td>
			<td><f:form.textfield property="properties.{properties.uid}.pattern" size="15" maxlength="15" /></td>
		</tr>
	</f:for>
</table>
```

Dann gibt es beim Editieren keine Fehlermeldung. *properties* statt *p* zu nehmen, war schon irgendwie richtig. Es ist der Name, der auch im Configuration-Objekt für den ObjektStorage verwendet wird. Allerdings werden die Werte trotzdem nicht in den Formularfeldern dargestellt. Wenn ich dann die Form absende, dann gibt es jetzt keine Fehlermeldung, aber alle Properties werden leider neu angelegt. Mit neuen Uids - es werden nicht die alten verwendet, also die bestehenden Properties nicht aktualisiert. Dieses Verhalten verstehe ich überhaupt nicht. Scheinbar werden beim update neue Property-Objekte erzeugt. Aber ich bin eh Anfänger.

Noch ein Auszug aus dem Controller:

```php
<?php
/**
 * action update
 *
 * @param $importConfiguration
 * @return void
 */
public function updateAction(Tx_Bla_Domain_Model_Configuration $configuration) {
	$this->configurationRepository->update($configuration);
	$this->flashMessageContainer->add('Your configuration was updated.');
	$this->redirect('import', 'Product');
}

/**
 * action edit
 *
 * @param $importConfiguration
 * @return void
 */
public function editAction(Tx_Bla_Domain_Model_Configuration $configuration = NULL) {
	$this->view->assign('importConfiguration', $importConfiguration);
}
?>
```

Weiß jemand Rat? Frage mich auch, wie es beim Neuanlegen zugehen soll, wo wohl noch keine Uid besteht.

### [#3](https://www.typo3.net/d/111229-fluid-form-editieren-von-verschachteten-model-objekten/3) · robsch · 2012-07-06

So, jetzt habe ich es selbst herausgefunden. Bzw. die Lösung habe ich im Netz selbst gefunden. Ich dokumentiere das mal hier, damit es wen anderem vielleicht noch hilft.

Nach langem Herumsuchen bin ich auf diesen Beitrag gestoßen: [Temporary solution: Persisting/updating nested objects (or sub objects) coming from a frontend form](http://lists.typo3.org/pipermail/typo3-project-typo3v4mvc/2010-January/002618.html)

Das habe ich auf mein Problem übertragen. Herausgekommen ist das:

Im Controller:

```php
<?php 
	public function updateAction(Tx_Bla_Domain_Model_Configuration $configuration, array $properties) {
		$this->deprecatedPropertyMapper->map(array('properties'), array('properties' => $properties), $configuration);
		$this->configurationRepository->update($configuration);
		$this->flashMessageContainer->add('Your configuration was updated.');
		$this->redirect('import', 'Product');
	}
?>
```

(Hinweis: Ich habe hier den deprecatedPropertyMapper verwenden müssen, weil ich Typo3 4.7 verwende. Ob das in zukünftigen Versionen funktionieren wird, weiß ich nicht.)

Fluid sieht dann so aus:

```html
<table>		
	<tr>
		<th>Property Id</th>
		<th>Pattern</th>
		<th></th>
	</tr>
	<f:for each="{configuration.properties}" as="property">
		<tr>
			<td>{property.uid}</td>
			<td><f:form.textfield  name="properties[{property.uid}][pattern]" value="{property.pattern}" /></td>
			<td><f:form.hidden     name="properties[{property.uid}][__identity]" value="{property.uid}"/></td>
		</tr>
	</f:for>
</table>
```

Damit klappt es jetzt. Das geht jetzt aber nur bei bestehenden Configuration-Objekten mit ihren Property-Objekten - was in meinem Fall ausreicht. Bei mir läuft es so, dass wenn eine neue Configuration erstellt wird, auch automatisch eine bestimmte Anzahl Properties erstellt werden. Somit habe ich kein Problem.

### [#4](https://www.typo3.net/d/111229-fluid-form-editieren-von-verschachteten-model-objekten/4) · robsch · 2012-07-06

Übrigens: An manchen Stellen steht hier importConfiguration. Da sollte aber configuration stattdessen stehen. Leider kann ich das nicht mehr korrigieren.

### [#5](https://www.typo3.net/d/111229-fluid-form-editieren-von-verschachteten-model-objekten/5) · robsch · 2012-07-08

Komisch. Wie setzt man einen Thread auf gelöst? Hm...

### [#6](https://www.typo3.net/d/111229-fluid-form-editieren-von-verschachteten-model-objekten/6) · impgala · 2012-12-20

Hi

Gibts hier News?
Ich stehe aktuell vor dem selben Problem und frage mich ob dies noch immer die "korrekte" Lösung ist?

Ich arbeite auch noch auf 4.7.(7).

Gruss
Martin

Edit: habe es nun mit ajax gelöst. (onchange auf input)

### [#7](https://www.typo3.net/d/111229-fluid-form-editieren-von-verschachteten-model-objekten/7) · ad_on_is · 2013-03-20

Ich bin auch schon am Rande der Verzweiflung mit dem Extbase. Suche genau das Gleiche, allerdings geht's bei mir um's neu neu-anlegen von Objekten und Unterobjekten.

Wenn man von einem funktionierenden MVC-Framework kommt, wo alles mit 1-2 Zeilen erledigt ist, dreht man durch bei der vielen Recherche

> **impgala schrieb:**
>
> Hi
>
> Gibts hier News?
> Ich stehe aktuell vor dem selben Problem und frage mich ob dies noch immer die "korrekte" Lösung ist?
>
> Ich arbeite auch noch auf 4.7.(7).
>
> Gruss
> Martin
>
> Edit: habe es nun mit ajax gelöst. (onchange auf input)

### [#8](https://www.typo3.net/d/111229-fluid-form-editieren-von-verschachteten-model-objekten/8) · derjoerg · 2013-05-22

Vllt hilft dieser Beitrag:

<http://forum.typo3.org/index.php/t/196879/>

### [#9](https://www.typo3.net/d/111229-fluid-form-editieren-von-verschachteten-model-objekten/9) · harald1972 · 2013-05-24

Wie ich diesen Thread grad so lese, fallen mir ein, zwei Dinge auf...

> **robsch schrieb:**
>
> 1.
>
> ```html
> <f:for each="{importConfiguration.properties}" as="p">
>   <td><f:form.textfield property="p.pattern" /></td>
> </f:for>
> ```

> 2.
>
> ```html
> <f:for each="{importConfiguration.properties}" as="properties">
>   <td><f:form.textfield property="properties.{properties.uid}.pattern" /></td>
> </f:for>
> ```

> 3.
>
> ```html
> <f:for each="{configuration.properties}" as="property">
>   <td><f:form.textfield  name="properties[{property.uid}][pattern]" value="{property.pattern}" /></td>
> </f:for>
> ```

Es ist egal, ob du as="p" (wie in 1) oder as="property" (wie in 3) nennst.
Das einzelne Element "properties" (Plural in 2) zu nennen, sorgt zwar für Verwirrung, macht aber eigentlich auch nichts aus. Der Name für die Variable 'as' hat nur Gültigkeit innerhalb der for-Schleife.
Aber auch in Plural (Punkt 2) sind der Container 'configuration.properties' und as="properties" 2 verschiedene Dinge.

Bei Punkt 3 gibt's du den 'name' an. Der wird sonst (siehe 1 und 2) aus der property generiert.
Hier erzeugst du einen numerischen Wert [{property.uid}] Wenn das so stimmt, ist gut.
Für den Fall, daß mir der generierte HTML-Name nicht passt, hab ich meistens einen kleinen ViewHelper geschrieben, der mir den erzeugt.

### [#10](https://www.typo3.net/d/111229-fluid-form-editieren-von-verschachteten-model-objekten/10) · kris_kelvin · 2014-01-30

Falls wieder jemand auf das Problem stößt:
Ich denke ich habe eine einfachere und "sauberere" Lösung als die von robsch, die auf den PropertyMapper verzichtet. Und zwar stelle ich den Fluid-Textfeldern im name=-Atrribut noch das Objekt voran, nicht nur das Unterobjekt. Mit dem Beispiel von robsch würde es dann so aussehen:

```html
<table>	
  <tr>
    <th>Property Id</th>
    <th>Pattern</th>
    <th></th>
  </tr>
  <f:for each="{configuration.properties}" as="property">
    <tr>
      <td>{property.uid}</td>
      <td><f:form.textfield name="configuration[properties][{property.uid}][pattern]" value="{property.pattern}" /></td>
      <td><f:form.hidden name="configuration[properties][{property.uid}][__identity]" value="{property.uid}"/></td>
    </tr>
  </f:for>
</table>
```

Man beachte dass bei name= jetzt configuration[properties] ... steht anstatt properties ... .

Und der Controller sollte dann so aussehen:

```php
<?php
  public function updateAction(Tx_Bla_Domain_Model_Configuration $configuration) {
    $this->configurationRepository->update($configuration);
    $this->flashMessageContainer->add('Your configuration was updated.');
    $this->redirect('import', 'Product');
  }
?>
```

Also genauso, nur ohne Array und ohne PropertyMapper.

Anmerkung: ich habe das nur mit Flow getestet, nicht mit Extbase. Sollte da aber auch funktionieren.

### [#11](https://www.typo3.net/d/111229-fluid-form-editieren-von-verschachteten-model-objekten/11) · xpert911 · 2018-02-25

Ja, es ist mir bewusst, dass diese Thema bereits 4 Jahre alt ist aber ich konnte mit den Hinweisen einen Teil meines Problems lösen. Danke dafür!

Jetzt ist alerdings für mich noch eine Herausforderung geblieben...

Editieren der bereits existenten "properties" funktioniert... was muss ich tun, wenn ich neue properties anlegen möchte? Eine "unsaubere" Lösung mit eigenen Querys kann ich zwar umsetzen aber sicher gibt es hierzu eine bessere=saubere Lösung.

Folgende Versuche wurden im Template new durchgeführt..

1.
<f:form.textfield name="configuration[properties][][pattern]" value="test" />
Ergebnis: Oops... Error durch fluid

2.
<f:form.textfield name="configuration[properties][4][pattern]" value="test" />
Die uid 4 ist noch nicht vergeben ... in der Tabelle property ((1:n) mit configuration.properties verknüpft).
Ergebnis: Kein Fehler bei der createAction und der Datensatz wurde in der verh´knüpften Tabelle property leider auch nicht wie erwartet mit der uid=4 angelegt :(

Irgendwie stehe ich auf dem Schlauch und bin sehr dankbar über eine Erleuchtung von euch. Danke.
Ergebnis: Oops... Error durch fluid

---

Quelle: „Fluid-Form: editieren von verschachteten Model-Objekten?“, typo3.net, https://www.typo3.net/d/111229-fluid-form-editieren-von-verschachteten-model-objekten
Beiträge von Mitgliedern des Forums. Bitte mit Link auf die Diskussion zitieren.
