Ibland vill man kunna samla in användarinmatning satsvis (batch mode). Det vill säga, användaren kan mata in information som tillhör flera modellinstanser och skicka in dem alla på en gång. Detta kallas tabulär inmatning eftersom inmatningsfälten ofta organiseras i en HTML-tabell.
För att arbeta med tabulär inmatning behöver vi först skapa eller tilldela
värden i en array av modellinstanser, beroende på ifall vi infogar eller
uppdaterar data. Därefter återhämtas användarinmatning från $_POST
-variabeln
och tilldelas respektive modellinstans. En liten skillnad mot inmatning av en
enstaka modellinstans är att vi hämtar in inmatningen med användning av
$_POST['ModelClass'][$i]
i stället för $_POST['ModelClass']
.
public function actionBatchUpdate()
{
// retrieve items to be updated in a batch mode
// assuming each item is of model class '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=$valid && $item->validate();
}
if($valid) // all items are valid
// ...do something here
}
// displays the view to collect tabular input
$this->render('batchUpdate',array('items'=>$items));
}
Med åtgärden på plats behövs arbete på vyn batchUpdate
för att presentera
inmatningsfälten i form av en HTML-tabell.
<div class="yiiForm"> echo CHtml::beginForm(); <table> <tr><th>Name</th><th>Price</th><th>Count</th><th>Description</th></tr> foreach($items as $i=>$item): <tr> <td> echo CHtml::activeTextField($item,"name[$i]"); </td> <td> echo CHtml::activeTextField($item,"price[$i]"); </td> <td> echo CHtml::activeTextField($item,"count[$i]"); </td> <td> echo CHtml::activeTextArea($item,"description[$i]"); </td> </tr> endforeach; </table> echo CHtml::submitButton('Save'); echo CHtml::endForm(); </div><!-- yiiForm -->
Notera att i ovanstående används "name[$i]"
i stället för "name"
som andra
parameter i anropet till CHtml::activeTextField.
Om det uppstår något valideringsfel kommer motsvarande inmatningsfält att framhävas automatiskt, precis som tidigare beskrivits i fråga om inmatning av en enstaka modellinstans.
Signup or Login in order to comment.