Zum Inhalt springen

Kindobjekte (n:m) im Formular des Elternobjekts bearbeiten

Erstellt am 18. Oktober 2011 · 4 Antworten · letzte Antwort am 19. Oktober 2011

Tags: Fluid, Frage

alisha ·

Hallo,
Ich habe ein Objekt Tanzpaar, das 3 n:m - Verknüpfungen zu anderen Objekten hat: Kurs, Teilnehmer1 und Teilnehmer2

Ich möchte nun ein Formular erzeugen, in das alle Angaben zu teilnehmer1 und teilnehmer2 (einmalig) bearbeitet werden können.

Im Vorfeld erzeuge ich bereits das tanzpaar und die Datensätze für Kurs, Teilnehmer1 und Teilnehmer2 und vergebe ein paar Standardwerte. Am ende der createAction von Tanzpaar rufe ich die editAction auf:

$this->redirect('edit', 'Tanzpaar', Null, array('kurs'=>$kurs, 'teilnehmer1'=>$teilnehmer1, 'teilnehmer2'=>$teilnehmer2, 'tanzpaar'=>$newTanzpaar));

Die Parameter werden auch richtig übergeben, ich kann Werte von Kurs oder Teilnehmern auslesen.

<f:form method="post" action="update" name="tanzpaar" object="{tanzpaar}" arguments="{kurs : kurs, teilnehmer1 : teilnehmer1, teilnehmer2 : teilnehmer2}">

Nun möchte ich die Felder der Teilnehmer bearbeiten lassen:

<label for="name">Name 1 *</span>
</label>
	<f:form.textfield property="teilnehmer1.name" /> <br />
usw.

Wenn ich das Formular absende, erhalte ich folgende Fehlermeldung:

transformToObject() accepts only numeric values and arrays.

InvalidArgumentException thrown in file
..\typo3\sysext\extbase\Classes\Property\Mapper.php in line 308.

24 Tx_Extbase_Property_Mapper::transformToObject("mein Name", "Tx_ext_Domain_Model_Teilnehmer", "teilnehmer1"

und ich hab keine Ahnung warum...
Hat jemand eine Idee?

danke und gruß

alisha ·

Ich habe nur zwar rausgefunden, dass ich die Teilnehmer nicht nochmal extra mitführen muss als Argument und wie ich trotzdem die Daten auslesen kann

<f:if condition="{tanzpaar.teilnehmer1}">
	<f:for each="{tanzpaar.teilnehmer1}" as="tn1">
<f:form.textfield property="teilnehmer1.name" value="{tn1.name}"/> <br />
...
</f:for>
</f:if>

aber trotzdem kommt beim Speichern immer noch die Fehlermeldung:
#1251814355: transformToObject() accepts only numeric values and arrays. bezogen auf den Namen des Teilnehmers1

Hat niemand eine Idee? bin langsam am Verzweifeln...

freshman17 ·

du kannst debuggen und zwar wird die Exception in Tx_Extbase_Property_Mapper::transformToObject geworfen. Lass dir die Parameter der Methode ausgeben evtl. hilft es dir den Fehler zu verstehen.

PS: zeid doch mal bitte dein Model mit den betreffenden Eigenschaften.

alisha ·

Hallo Freshman,
die Fehlermeldung hatte ich oben schon ausgegeben, kann man noch weitere Infos holen?

die übergebenen Parameter

Tx_Extbase_Property_Mapper::transformToObject("meinName", "Tx_Ahdancecourses_Domain_Model_Teilnehmer", "teilnehmer1"

"meinName" muss wohl in einem Array sein, vermute ich.

ich hab es auch mit property teilnehmer1.0.name ausprobiert, was mir logisch erscheint, aber auch nicht weiterhilft...

Mein Model bzw. die Eigenschaften:

/**
	 * kurs
	 *
	 * @var Tx_Extbase_Persistence_ObjectStorage<Tx_ext_Domain_Model_Kurs>
	 */
	protected $kurs;

	/**
	 * teilnehmer1
	 *
	 * @var Tx_Extbase_Persistence_ObjectStorage<Tx_ext_Domain_Model_Teilnehmer>
	 */
	protected $teilnehmer1;

	/**
	 * teilnehmer2
	 *
	 * @var Tx_Extbase_Persistence_ObjectStorage<Tx_ext_Domain_Model_Teilnehmer>
	 */
	protected $teilnehmer2;

/**
	 * __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->kurs = new Tx_Extbase_Persistence_ObjectStorage();
		
		$this->teilnehmer1 = new Tx_Extbase_Persistence_ObjectStorage();
		
		$this->teilnehmer2 = new Tx_Extbase_Persistence_ObjectStorage();
	}

und dann noch die ganzen setter und getter, add und remove-Methoden

Meintest du das?

freshman17 ·

Schon klar warum es nicht geht, schau:

<f:form.textfield property="teilnehmer1.name" />

hier sagst du Fluid das "teilnehmer1" eine Eigenschaft "name" hat was natürlich falsch ist. "teilnehmer1" ist bei dir vom Typ "Tx_Extbase_Persistence_ObjectStorage" und nicht vom Typ "Tx_ext_Domain_Model_Teilnehmer" 😉

Es gibt dazu in der Liste einen Workaround aber keine Ahnung ob das funktioniert.

http://lists.typo3.org/pipermail/typo3-project-typo3v4mvc/2010-September/006739.html