Manchmal wollen wir eine ganze Reihe von Benutzereingaben erfassen, d.h. der Benutzer kann Informationen für mehrere Model-Instanzen auf einmal eingeben und abschicken. Wir nennen dies tabellarische Eingabe, weil die Eingabefelder oft als HTML-Tabelle dargestellt werden.
Um mit tabellarischen Eingaben zu arbeiten, müssen wir zuerst ein Array mit
Model-Instanzen erstellen oder befüllen, je nachdem, ob wir Daten einfügen oder
aktualisieren wollen. Dann beziehen wir die vom Benutzer eingegebenen Daten
von der $_POST-Variable und ordnen sie den einzelnen Model-Instanzen zu.
Im Unterschied zum Vorgehen bei einer einzelnen Model-Instanz, beziehen wir
die Daten mit $_POST['ModelClass'][$i] statt $_POST['ModelClass'].
public function actionBatchUpdate() { // Zu aktualisierende Datensätze abfragen // Es wird davon ausgegangen, dass jeder Datensatz vom // Typ 'Item' ist $items=$this->getItemsToUpdate(); if(isset($_POST['Item'])) { $valid=true; foreach($items as $i=>$item) { if(isset($_POST['Item'][$i])) $item->attributes=$_POST['Item'][$i]; $valid=$valid && $item->validate(); } if($valid) // alle Daten sind gültig // ...Tu hier etwas } // Zeigt den View an und erfasst tabellarische Eingabe $this->render('batchUpdate',array('items'=>$items)); }
Nachdem die Action bereit steht, müssen wir am View batchUpdate
arbeiten, um die Eingabefelder in einer HTML-Tabelle anzuzeigen.
<div class="yiiForm"> <?php echo CHtml::beginForm(); <table> <tr><th>Name</th><th>Preis</th><th>Anzahl</th><th>Beschreibung</th></tr> <?php foreach($items as $i=>$item): <tr> <td><?php echo CHtml::activeTextField($item,"name[$i]"); </td> <td><?php echo CHtml::activeTextField($item,"price[$i]"); </td> <td><?php echo CHtml::activeTextField($item,"count[$i]"); </td> <td><?php echo CHtml::activeTextArea($item,"description[$i]"); </td> </tr> <?php endforeach; </table> <?php echo CHtml::submitButton('Speichern'); <?php echo CHtml::endForm(); </div><!-- yiiForm -->
Beachten Sie, dass wir beim Aufruf von CHtml::activeTextField
"name[$i]" statt "name" als zweiten Parameter benutzen.
Falls ein Fehler bei der Gültigkeitsprüfung auftritt, werden die entsprechenden Eingabefelder automatisch hervorgehoben, wie bereits bei der Einzeleingabe für ein Model beschrieben.
Be the first person to leave a comment
Please login to leave your comment.