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.

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.

<div class="form">
<?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,"[$i]name"); ?></td>
<td><?php echo CHtml::activeTextField($item,"[$i]price"); ?></td>
<td><?php echo CHtml::activeTextField($item,"[$i]count"); ?></td>
<td><?php echo CHtml::activeTextArea($item,"[$i]description"); ?></td>
</tr>
<?php endforeach; ?>
</table>
 
<?php echo CHtml::submitButton('Speichern'); ?>
<?php echo CHtml::endForm(); ?>
</div><!-- form -->

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 $

Be the first person to leave a comment

Please to leave your comment.