Hallo ihr Lieben,
ich habe da ein Problem, welches ich auch nach langer Recherche noch nicht lösen konnte.
Ausgangssituation:
Ich entwickle eine Extension unter Typo3 6.2. Die Extension zeigt für eingeloggte Benutzer Prüfungen an, für die sie sich anmelden können. Je nach Benutzer werden unterschiedliche und verschieden viele Kurse angeboten. Aus diesem Grund habe ich ein dynamisches Formular, mit Hilfe einer for-Schleife, in Tabellenform erstellt. Die Tabelle besteht lediglich aus drei Spalten: Fach, Pruefer und einer Checkbox. Die Checkbox dient zur Anmeldung.
Problem:
Da sich ein Benutzer gleichzeitig für mehrere Prüfungen anmelden kann (durch Ankreuzen der Checkboxen), müssen mehrere Objekte für das Model Kea erzeugt werden und somit mehrere Datensätze in die Datenbank geschrieben werden. Im Moment wird nach dem Speichern nur ein Datensatz in die Db geschrieben und zwar der letzte des Schleifendurchlaufs.
Hier mein aktueller Code:
...
<f:form action="create" name="newKea" object="{newKea}">
<table class="tx_kea" >
<tr>
<th><f:/>Fach</th>
<th><f:/>Prüfer</th>
<th><f:/>Anmeldung</th>
</tr>
<f:for each="{anmeldungs}" as="anmeldungen">
<tr>
<td><f:form.hidden property="fach" value="{anmeldungen.fach}"/>{anmeldungen.fach}</td>
<td><f:form.hidden property="pruefer" value="{anmeldungen.pruefer}"/
{anmeldungen.pruefer}</td>
<td><f:form.checkbox property="anmeldung" value="1"
checked="{anmeldungen.angemeldet} == '1'"/></td>
</tr>
</f:for>
</table>
<f:form.submit name="keaSpeichernButton" value="Speichern"/>
</f:form>
public function createAction(\HSPF\Kea\Domain\Model\Kea $newKea) {
$this->keaRepository->add($newKea);
$this->redirect('list');
}
Ich würde mich sehr freuen, wenn mir jemand weiterhelfen könnte!
hallo kiwi,
ich behaupte jetzt einfach mal dass das an folgendem liegt:
Alle deine Kurse befinden sich in einem einzigen Formular.
Du hast es zwar in einer Schleife ausgegeben, aber es wird alles auf einmal zurückgeschickt.
Deine Formularelemente "heißen" aber bei jedem Kurs gleich (siehe property), heißt es wird nicht zwischen den Kursen unterschieden.
Ich denke dass deswegen einfach immer der letzte Wert genommen wird.
Irgendwie sowas. Vielleicht musst du das ganze generell ein wenig anders aufbauen.
Gruß
Eduard
Hallo Eduard,
vielen Dank für deine schnelle Antwort.
Vom Grundaufbau fällt mir leider gar keine andere Herangehensweise ein. Ich benötige ja die Schleife um meine Kurse aus dem Array anzulesen. Und zu jedem Kurs in der Schleife benötige ich eine Checkbox. Oh je, bin gerade echt planlos :-(
Theoretisch denke ich, dass ich die Daten eigentlich in ein mehrdimensionales Array packen sollte und dies dann an die createAction übergeben. Nur wie?
Ein einzelnes Formular pro Schleifendurchlauf erstellen geht ja auch nicht, sonst hätte ich für jeden Kurs einen Speichern Button. Oder?
Kannst du mir da noch etwas konkreter auf die Sprünge helfen? Oder hat noch jemand eine Idee für mein Problem?
was wird den ausgeworfen, wenn du das $newKea debuggst das vom Formular zurückkommt.
Vielleicht ist da ja alles drin und du kannst es in einer Schleife im Controller getrennt weitergeben.
Ich weiß es nicht. Nur mal so n Vorschlag 🙂
Gruß
Eduard
Sorry Eduard, das hätte ich vielleicht noch dazu schreiben sollen. Ich habe mir das Objekt $newKea bereits angeschaut. Leider ist da nur der Inhalt aus dem letzten Scheifendurchlauf drin, also das was auch in die Db geschrieben wird. Aber trotzdem vielen Dank für deine Idee! 🙂
Also ich denke man könnte in der fluid Schleife die zusammengehörigen felder mit der selben fortlaufenden Zahl nummerieren und das ganze dann im Controller mit Hilfe der Zahlen wieder zusammenschustern um es dann auch wieder mit einer Schleife zu speichern. Aber das wäre denke ich zu viel Aufwand und wahrscheinlich auch überhaupt nicht sauber gelöst.
Ich glaube wenn Du der Property hinten [] anhängst (vielleicht war das auch anders), erkennt er diese Property als Array und in der Ausgabe wird dann hinten sogar noch [_identity] oÄ angehängt. Mit rumspielen habe ich das zumindest mal so bei mir hinbekommen, dass die Fluid Ausgabe super aussah, aber das Speichern hat damals irgendwie trotzdem nicht funktioniert bei mir.
Wenn du in einem Formular z.B. dreimal einen "input name='uid'" hast,
wird IMMER nur der Inhalt des letzten Feldes verschickt werden,
und zwar völlig egal, ob du Fluid oder was auch immer nutzt.
Dein Datenmodell spiegelt nicht das wieder, was du eigentlich darstellen willst.
Fang von vorne an und baue deine Modelle neu, beschäftige dich mit DDD.
Ist dir das zuviel des Guten, baue deine Extension mit einem anderen Framework,
z.B. als gute alte piBase-Extension.
Niemand MUSS eine Extension mit extbase/fluid bauen,
nur weil es z.Zt. gehyped wird.
Vielen Dank für die ganzen Antworten!
@Schweriner: Das mit den Klammern habe ich auch schon ausprobiert aber dann bekomme ich folgende Fehlermeldung: #1297759968: Exception while property mapping at property path "":It is not allowed to map property "fach[". You need to use $propertyMappingConfiguration->allowProperties('fach[') to enable mapping of this property.
@jenses: Ich verstehe nicht wie du das meinst, dass mein Datenmodell nicht das wiederspiegelt, was ich darstellen möchte. Ich wüsste nicht wie ich das Modell oder das Formular anders aufbauen sollte. Im FE ist der Aufbau so wie ich ihn möchte, mein Modell enthält alle Attribute die ich benötige und um die for-Schleife führt kein Weg, wenn ich ein Array ausgeben möchte. Wie würdest du dir die Herangehensweise vorstellen? Kann man mein Problem nicht einfach mit einem mehrdimensionalen assoziativen Array lösen, in das die "Objekte/Formulare" gespeichert werden, welches nach dem submit an die Action übergeben wird? Irgendwie mit einem Index oder so?
Nochmals vielen Dank
Steffi
Ich würde es mit einer piBase-Extension machen :-)
Vielleicht ist das hier brauchbar:
#106852
Als ich mal mit dem Beispiel sjr_offers eine extbase-Ext gebastelt habe,
waren es zum Schluß mehrere Wochen Arbeitsaufwand statt der früher üblichen 2-3 Tage,
dank der sehr guten Dokumentation :p