[Frage] Childs in Fluid speichern

  • Coreblade Coreblade
    R2-D2
    0 x
    96 Beiträge
    0 Hilfreiche Beiträge
    23. 01. 2014, 10:23

    Hallo zusammen

    Folgendes Szenario:

    Es existiert ein Parent Objekt mit n-Child Objekten. In früheren Fluid Versionen konnte z.B. das erste Element mit {parent.child.0.name} ausgelesen werden und so z.B. einem Textfeld zugewiesen werden. Dies hatte den Vorteil, dass nur das Parent geupdatet werden musste. Seit Fluid 6.1 funktioniert dies allerdings nicht mehr?

    Wie kann ich dies in Fluid elegant lösen ohne die Childs separat abzuspeichern?

    Gruss Coreblade


  • 1
  • toifel toifel
    Jedi-Ratsmitglied
    0 x
    831 Beiträge
    96 Hilfreiche Beiträge
    23. 01. 2014, 15:47

    Das hier könnte helfen: http://www.in2code.de/community/snippet-datenbank/snippets/detail/dynamisches-erzeugen-neuer-objekte/

  • Coreblade Coreblade
    R2-D2
    0 x
    96 Beiträge
    0 Hilfreiche Beiträge
    24. 01. 2014, 07:47

    <f:form.textfield property="mother.children.0.firstName" /> funktioniert eben in Typo3 6.1 nicht mehr! Genau das ist mein Problem. Die ObjectStorage Elemente haben nicht wie vorher Ids von 0 beginnend sondern so etwas: 0000000054758495000000007411942d!

    Ich kann zwar mit:

    1. <f:for each="{mother.children}" as="child" key="count">
    2. <f:form.textfield property="children.{count}.name" />
    3. </f:for>

    machen dass die Eingabe automatisch beim mother-Modell gespeichert wird. Es werden aber nicht wie früher direkt die Werte angezeigt. Ich muss anscheinend die Value auch noch setzen?

    Jemand eine Idee?

    Gruss Coreblade

  • Coreblade Coreblade
    R2-D2
    0 x
    96 Beiträge
    0 Hilfreiche Beiträge
    24. 01. 2014, 08:27

    Habe dies nun halt so gelöst. Wäre um ein Feedback dankbar. Eventuell ist es ja einfacher möglich?

    1. <f:for each="{mother.children}" as="child" key="count">
    2. <f:form.textfield property="children.{count}.name" value="{child.name}" />
    3. <f:form.hidden property="children.{count}.__identity" value="{child.uid}"/>
    4. </f:for>

    Das __identity muss gesetzt werden, damit das vorhandene Element geupdated wird und nicht ein neues gespeichert wird.

    Gruss Coreblade

  • harald1972 harald197...
    Sternenflotten-Admiral
    0 x
    198 Beiträge
    13 Hilfreiche Beiträge
    31. 01. 2014, 12:17

    Hallo Coreblade,

    das Problem, ein ganzes Array mit dem Mutter-Objekt auf einmal zu bearbeiten, kenn ich.
    Ich hab dafür einen Viewhelper geschrieben. Das war noch aus TYPO3 v4.2 und den hab ich abgeleitet von Tx_Fluid_ViewHelpers_Form_[i]irgendein[/i]ViewHelper.
    Für Textfield ist das jetzt \TYPO3\CMS\Fluid\ViewHelpers\Form\TextfieldViewHelper

    Darin die getName() überschrieben...

    1. protected function getName() {
    2. return parent::getName().'['.$this->arguments['child']->getUid().']';
    3. }

    wobei du eventuell Mother und auf jeden Fall Child als Argumente registrieren musst (geht auch als lokaler Param in getName() )

    1. public function initializeArguments() {
    2. parent::initializeArguments();
    3. $this->registerArgument ( 'mother', '/Your/Mother', '', TRUE );
    4. $this->registerArgument ( 'child', '/Your/Child', '', TRUE );
    5. }

    Für den Wert (value) musst du vermutlich auch noch die getValue() überschreiben.

    1. protected function getValue() {
    2. $child = $this->arguments['mother'] ? $this->arguments['mother']->getNameForChild($this->arguments['child']) : NULL;
    3. return $child ? $this->arguments['child']->getName() : '';
    4. }

    Und schlussendlich muss in deine Mutterklasse noch die getNameForChild()-Methode.
    Wenn du soweit alles verstanden hast, ist das dann trivial.

    Unter TYPO3 v6.x habe ich es noch nicht getestet, und die getValue() könnte bei dir evtl. abweichen.

    Gruss Harald

  • 1