Czasami mamy potrzebę zbierania danych wejściowych użytkownika w trybie wsadowym. Inaczej mówiąc, użytkownik może wprowadzić informacje dla wielu instancji modelu oraz przesłać je wszystkie naraz. Nazywamy to tablicowymi danymi wejściowymi (ang. tabular input, ponieważ pola wejściowe są często prezentowane w tabeli HTML.
Aby pracować z tablicowymi danymi wejściowymi, musimy najpierw stworzyć lub też
wypełnić tablice modeli instancji, w zależności od tego czy wstawiamy dane
czy też aktualizujemy je. Otrzymujemy wtedy dane wejściowe użytkownika ze zmiennej
$_POST
oraz przypisujemy je do każdego modelu. Drobną różnicą pomiędzy w stosunku
do danych wejściowych jednego modelu jest to, że otrzymujemy dana przy użyciu
$_POST['ModelClass'][$i]
zamiast $_POST['ModelClass']
.
public function actionBatchUpdate()
{
// zwracanie pozycji, które będą aktualizowane w trybie wsadowym
// przy założeniu, że każda pozycja jest klasą modelu '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
// ...rób coś tutaj
}
// wyświetl widok do zbierania tabelarycznych danych wejściowych
$this->render('batchUpdate',array('items'=>$items));
}
Mając gotową akcję, musimy popracować nad widokiem batchUpdate
aby wyświetlić
pola wejściowe za pomocą tabeli HTML.
<div class="yiiForm"> echo CHtml::beginForm(); <table> <tr><th>Nazwa</th><th>Cena</th><th>Ilość</th><th>Opis</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 -->
Zauważ, że w powyższym przykładzie użyliśmy "name[$i]"
zamiast "name"
jako
drugi parametr podczas wywoływania metody CHtml::activeTextField.
Jeśli wystąpił tutaj jakiś błąd sprawdzania danych, odpowiednie pole wejściowe zostanie podświetlone automatycznie, tak jak to było w przypadku pojedynczego modelu opisanego wcześniej.
Signup or Login in order to comment.