Zum Inhalt springen

Übergabe mehrerer Parameter im Controller

Erstellt am 2. November 2011 · 3 Antworten · letzte Antwort am 17. November 2011

Tags: Frage

YinYang ·

Hallo,

Ich bräuchte mal einen Denkanstoß... Folgendes Szenario:
- Ich möchte mehrere Datensätze in einem Formular gleichzeitig bearbeiten.
- Dazu gibt es eine Action die über ein Array die Daten im Frontend anzeigt und die Select-Comboboxen und LineEdits erzeugt.

Hier der Code-Ausschnitt aus dem Temlate:

<f:form method="post" controller="XXX" action="doUpdate" name="result" object="{newXXX}">
[...]

<f:for each="{testArray}" as="test">
  <tr>
    <td>{test.name}</td>
    <td>
      <f:form.select property="test.state" value="{test.state}" options="{0: '- offen -', 1: 'Zugesagt', 2: 'Abgesagt'}" />
    </td>		  
    <td>
       <f:form.textbox name="comment" value="{test.commentary}" />
    </td>
  </tr>
</f:for>

</f:form>

Die Action selber wird ausgeführt und ist wie folgt deklariert:

/**
* @param array $result
* @return void
*/
public function doUpdateAction($result) {
   die(print_r($result));
   $this->redirect('index');
}

Die Funktion selber wird auch ausgeführt, allerdings enthält das Array $result nur einen (den letzten) Eintrag aller Comboboxen und Textedits des Formulars.

Nun die Frage:
Wie bekomme ich den Inhalt ALLER Comboboxen und LineEdits in meine Action zurück?
Hat jemand hier Beispiele, Tipps und Tricks?

Jede Hilfe erwünscht #paralyzed#

jank ·

Du könntest ein Neues Model erstellen, welches n objekte der zu aktualisierenden Models enthalten kann

class Tx_xxx_Domain_Model_Update_Container extends Tx_Extbase_DomainObject_AbstractEntity {
/**
 * items
 *
 * @var Tx_Extbase_Persistence_ObjectStorage<Tx_xxx_Domain_Model_Items>
 */
protected $items;

getItems{...}
setItems{...}
public function __construct(){...}
protected function initStorageObjects(){
$this->items = new Tx_Extbase_Persistence_ObjectStorage();
}
...

}

und in Fluid die for each schleife mit einer iteration ergänzen und diesen als index nutzen:

<f:for each="{items}" as="item" iteration="itarator">
	<f:form.textfield property="item.{itarator.index}.property" value="item.property" />
</f:for>

Zurüch bekommst du dann das Container Objekt und verarbeitest es im Controller.

foreach ($newContainer->getItems as $item){...}

Im Prinzip tust du so, als ob die zu aktualisierenden Objekte Childs eines übergeordneten Objekts sind.
Gespeichert werden dann halt nur die Childs, da du den Container nicht brauchst.
So in die Richtung könnte das klappen.

YinYang ·

Hallo Jank,

Vielen Dank für den Tipp! Das funktioniert jetzt 😃
Eine Frage noch zur Lebenszeit des Objektes Tx_Extbase_DomainObject_AbstractEntity:

Ich habe es im Controller neu angelegt und das items-Feld mit new Tx_Extbase_Persistence_ObjectStorage angelegt.
Bleibt das Objekt dann dauerhaft im Objekt-Storage? (Was ja unnötig wäre, da es ein reines temporäres Objekt für die Datenübergabe ist.)

jank ·

Uff... gute Frage!
Das kann ich dir nicht beantworten.
Ich würde den Vorgang mal mit xdebug überwachen.

Ohne Tabelle wird es ja zumindest nicht in die Datenbank gespeichert.

Vielleicht kann sich da ein echter Experte zu Wort melden... oder du schreibst mal an die Mailinglist.

Ich sehe aber momentan keine andere Möglichkeit einen Satz an Objekten zu übergeben.