Erfassen tabellarischer Eingaben ================================ Manchmal muss man eine ganze Reihe gleichartiger Eingabewerten erfasst werden. Der Anwender kann also die Daten für mehrere Modelinstanzen auf einmal eingeben und absenden. Dies nennt man *tabellarische Eingabe*, weil die Eingabefelder in diesem Fall oft in einer Tabelle dargestellt werden. Für solche tabellarische Eingaben muss zunächst ein Array mit Modelobjekten erstellt bzw. befüllt werden, je nachdem ob die Daten eingefügt oder aktualisiert werden sollen. Die gesendeten Formulardaten werden dann nacheinander aus `$_POST` gelesen und in den jeweiligen Modelinstanzen zugewiesen. Im Gegensatz zum vorher beschriebenen Verfahren bei einem einzelnen Model werden die Daten hier jeweils aus `$_POST['ModelClass'][$i]` statt `$_POST['ModelClass']` gelesen. ~~~ [php] public function actionBatchUpdate() { // Zu aktualisierende Datensätze abfragen // Die Datensätze seien vom Modeltyp 'Item' $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=$item->validate() && $valid; } if($valid) // alle Daten sind gültig // ...Daten werden hier weiter verarbeitet } // Zeigt den View an und erfasst tabellarische Eingabe $this->render('batchUpdate',array('items'=>$items)); } ~~~ Ist die Action entsprechend erstellt, müssen im View `batchUpdate` die Eingabefelder in einer HTML-Tabelle angezeigt werden. ~~~ [php]
$item): ?>
NamePreisAnzahlBeschreibung
~~~ Beachten Sie, dass beim Aufruf von [CHtml::activeTextField] `"[$i]name"` statt `"name"` verwendet wird. Genau wie beim View für einfache Models werden auch hier die fehlerhaften Eingabefelder automatisch hervorgehoben.
$Id: form.table.txt 2783 2010-12-28 16:20:41Z qiang.xue $