[Frage] Relationen bei create in Fluid anlegen

  • Gernott Gernott
    Jedi-Meister
    0 x
    271 Beiträge
    3 Hilfreiche Beiträge
    28. 11. 2014, 15:43

    Hallo,

    ich habe ein Bestellformular gemacht, mit folgenden Objekten:
    - Booking: Besteht aus diversen Eingabefeldern und 1:n Relation zu Position.
    - Position: Besteht aus einem Feld 'quantity' und n:1 Relation zu Product.
    - Product: Besteht aus diversen Feldern wie title, price,...

    Im Frontend nutze ich Booking=>new,create für ein Bestellformular. Oberhalb der Bestell-Formularfelder gebe ich alle Products aus. Jedes Product hat ein Eingabefeld für die Bestellmenge (quantity).

    Mit Absenden des Formulares, soll somit das Booking gespeichert werden und weiters alle Positions (mit quantity und product-relation).

    Das Fluid dazu sieht so aus:

    1. <f:form.hidden property="positions.{product.uid}.product" value="{product.uid}" />
    2. <f:form.textfield property="positions.{product.uid}.quantity" type="number" value="0" />

    Die Action im Controller so:

    1. /**
    2. * action new
    3. *
    4. * @param \XXX\Extkey\Domain\Model\Booking $newBooking
    5. * @ignorevalidation $newBooking
    6. * @return void
    7. */
    8. public function newAction(\XXX\Extkey\Domain\Model\Booking $newBooking = NULL) {
    9. $products = $this->productRepository->findCheaperThan($this->settings['cheaperThan']);
    10. $this->view->assign('products', $products);
    11. }

    So, nun zum Problem:
    Wenn ich das Formular absende und alle Pflichtfelder befülle, funktioniert alles perfekt. Es wird alles wie gewünscht in die Datenbank gespeichert.
    Wenn ich allerdings ein Pflichtfeld leer lasse, erscheint bei den Produkten folgender Fehler, anstatt des quantitiy Eingabefeldes: Quantity No value found for key "TYPO3\CMS\Fluid\ViewHelpers\FormViewHelper->formObject"

    Mein Verdacht: Da es mehrere Produkte gibt, werden ja je Bestellung genauso viele Positions angelegt. Damit sich die einzelnen Positions nicht gegenseitig überschreiben, ist also ein Array nötig. Dieses habe ich in Fluid mit der {product.uid} geschafft, zb hier im property:
    <f:form.hidden property="positions.{product.uid}.product" value="{product.uid}" />
    Nach dem Absenden existiert die Position mit der Product uid aber nicht. Nur welche fortlaufende ID ist hier die korrekte? Ein iterator in f:for-Tag liefert das gleiche Ergebnis bzw. Problem.

    Ich hoffe ich konnte das Problem gut erläutern und jemand kann mir weiterhelfen.

    Danke und liebe Grüße
    Gernot


  • 1
  • ironpfu ironpfu
    R2-D2
    0 x
    99 Beiträge
    1 Hilfreiche Beiträge
    13. 08. 2015, 16:09

    Hallo,
    gibt es inzwischen eine Lösung?
    Ich stehe gerade vor exakt dem gleichen Problem:
    http://www.typo3.net/forum/thematik/zeige/thema/120717/
    Dank LG Jürgen

  • Ei-Dotter Ei-Dotter
    Jedi-Ritter
    0 x
    137 Beiträge
    1 Hilfreiche Beiträge
    09. 12. 2015, 01:42

    Ich habe das gleiche Problem, hat schon jemand eine Lösung?

  • harald1972 harald197...
    Sternenflotten-Admiral
    0 x
    198 Beiträge
    13 Hilfreiche Beiträge
    17. 12. 2015, 09:02

    Hallo Gernott,

    die newAction des - ich tipp mal auf den - BookingController, assigned zwar die products (cheaper than what?). Allerdings sollte die newBooking auch assigned werden. Woher soll die Action sonst wissen, worum es geht?

    Oberhalb der Bestell-Formularfelder gebe ich alle Products aus. Jedes Product hat ein Eingabefeld für die Bestellmenge (quantity).

    Die Eingabefelder sollten imho im Formular sein, denn dieses Formular und nur (der Inhalt) dieses Formular wird an die createAction weitergegeben.

    Irgendwo mein ich, sowas ähnliches ("positions.{product.uid}.product" ) schonmal gemacht zu haben, das Problem kommt mir bekannt vor - müsste ich aber erst suchen.

    Gruß
    Harald

  • Ei-Dotter Ei-Dotter
    Jedi-Ritter
    0 x
    137 Beiträge
    1 Hilfreiche Beiträge
    23. 01. 2016, 15:33

    Also ich habe das jetzt wie folgt gelöst:

    statt:

    <f:form.textfield...
    <f:form.select ...
    <f:form.upload ...

    habe ich mir eigene ViewHelper geschrieben und binde die Felder jetzt so ein:

    <o:form.textfield ...
    <o:form.select ...
    <o:form.upload ...

    Die ViewHelper selbst sind eigentlich ganz billig:

    <?php
    namespace Vendor\Extname\ViewHelpers\Form;

    use TYPO3\CMS\Fluid\ViewHelpers\Form\TextfieldViewHelper as OriginalTextfieldViewHelper;
    /**
    * Class TextfieldViewHelper
    */
    class TextfieldViewHelper extends OriginalTextfieldViewHelper {
    }

    Das einzige was ich in der Klasse mache ist eine Funktion getValue() definieren, da musst Du vermutlich mal schauen ob Du das so 1:1 übernehmen kannst:

    protected function getValue($convertObjects = TRUE) {
    // $value = parent::getValue($convertObjects);
    $value = NULL;
    $property = $this->arguments['property'];
    $property_array = explode('.', $property);
    $value = $_POST['tx_extname_tablename']['newTablename'][$property_array[0]][$property_array[1]][$property_array[2]];
    if ($convertObjects) {
    $value = $this->convertToPlainValue($value);
    }
    return $value;
    }

  • 1