0 follower

Odczytywanie tablicowych danych wejściowych

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">
<?php echo CHtml::beginForm(); ?>
<table>
<tr><th>Nazwa</th><th>Cena</th><th>Ilość</th><th>Opis</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('Save'); ?>
<?php 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.