Mehrere gleiche Objekte in einem Formular speichern [Gelöst]

  • shooby shooby
    T3PO
    0 x
    24 Beiträge
    0 Hilfreiche Beiträge
    17. 08. 2011, 16:58

    Neuer Tag, neues Problem:

    Ich habe ein Objekt, das mehrere Unterobjekte haben kann. Jetzt möchte ich gerne beliebig viele Unterobjekte in einem View Formular bearbeiten können und dann abspeichern können.

    Die View sieht momentan so aus:

    1. <tr>
    2. <td>1. </td>
    3. <td><f:form.textarea property="point" cols="35" rows="4" value="bla"/></td>
    4. </tr>
    5. <tr>
    6. <td>2. </td>
    7. <td><f:form.textarea property="point" cols="35" rows="4" value="blubb"/></td>
    8. </tr>

    Jetzt hab ich ja jeweils die gleiche Property. Die Methode zum speichern sieht dann so aus:

    1. $audit->addFormField($newFormFields);
    2. $this->auditRepository->update($audit);

    Da speichert er ja nur das zweite Objekt.

    Wie kann ich jetzt mehrere Objekte von der View in den Controller übergeben und in einer Schleife dem Aggregat zuordnen?

    Vielen Dank für die Hilfe!


  • 1
  • shooby shooby
    T3PO
    0 x
    24 Beiträge
    0 Hilfreiche Beiträge
    18. 08. 2011, 14:58

    es gibt ein Beispiel in Jochen Raus Extension sjr_offers. Da übergibt er viele attndanceFees in einem Array an den Controller.

    1. <div class="singleAttendanceFee">
    2. <input size="6" type="text" name="tx_sjroffers_list[attendanceFees][amount][]" value="" />
    3. <input size="16" type="text" name="tx_sjroffers_list[attendanceFees][comment][]" value="" />
    4. </div>

    Davon gibt es dann viele Divs...

    Der Controller sieht wie folgt aus:

    1. public function createAction(Tx_SjrOffers_Domain_Model_Organization $organization, Tx_SjrOffers_Domain_Model_Offer $newOffer, array $attendanceFees = array()) {
    2. if ($this->accessControllService->backendAdminIsLoggedIn() || $this->accessControllService->isLoggedIn($organization->getAdministrator())) {
    3. $newOffer = $this->createAndAddAttendanceFees($newOffer, $attendanceFees);
    4. ...
    5. }
    6.  
    7. protected function createAndAddAttendanceFees( Tx_SjrOffers_Domain_Model_Offer $offer, array $attendanceFees = array()) {
    8. foreach ($attendanceFees['amount'] as $key => $amount) {
    9. if (!empty($amount)) {
    10. $offer->addAttendanceFee(new Tx_SjrOffers_Domain_Model_AttendanceFee($amount, $attendanceFees['comment'][$key]));
    11. }
    12. }
    13. return $offer;
    14. }

    Wie funktioniert das mit der Übergabe des Arrays?? Kann mir das jemand erklären? Habe das versucht auf mein Projekt zu übertragen, aber mein Array ist leer :(

  • shooby shooby
    T3PO
    0 x
    24 Beiträge
    0 Hilfreiche Beiträge
    23. 08. 2011, 10:05

    okay.. Problem gelöst

    solution:

    wie schon vermutet liegt der Schlüssel im name-Parameter.

    1. <input size="6" type="text" name="tx_sjroffers_list[attendanceFees][amount][]" value="" />

    Extbase pusht dann automatisch den Inhalt des Input Fields in das Array $attendanceFees. Wichtig ist dabei der Namespace vor der Array Bezeichnung. Korrekte Syntax ist hier: tx_EXTKEY_PLUGIN[ARRAY][VALUE][]. Das letzte [] pusht dann den Inhalt.

    In meinem Fall war das der richtige Tag:

    1. <textarea name="tx_kmaudit_kmaudit_plannedlist[formFields][point][]" cols="35" rows="4">...

    Extension Bezeichnung ist "kmaudit" und plugin ist "kmaudit_plannedlist"

    Nun kann ich das Array im Controller auswerten und nacheinander in das Aggregate-Root-Objekt adden und dieses dann persistieren. TOP!!

  • 1