0 follower

收集表格输入

有时候我们想按批收集用户输入.也就是,用户可以为多个模型实例输入信息然后一次性提交全部.我们之所以把这个称之为 表格输入(tabular input) 是因为输入的字段通常出现在一个HTML表格里.

要使用表格输入,我们首先需要使用模型实例创建或者填充一个数组,这取决于我们是插入还是更新数据.然后我们从$_POST 变量里取出用户输入的数据,再将他们分配到各个模型中.这和从单模型输入中取出数据有一点微小的差异,那就是我们使用 $_POST['ModelClass'][$i] 取出数据而不是 $_POST['ModelClass'].

public function actionBatchUpdate()
{
    // 批处理模式中,收集用于更新的项
    // 假定每项都是模型类 '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)  // 所有的项都是有效的
            // ...在这里干点什么
    }
    // 显示视图收集表格输入
    $this->render('batchUpdate',array('items'=>$items));
}

准备好了动作,我们需要 batchUpdate 视图在一个 HTML 表中显示输入框.

<div class="yiiForm">
<?php echo CHtml::form(); ?>
<table>
<tr><th>名称</th><th>价格</th><th>数量</th><th>描述</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'); ?>
</form>
</div><!-- yii表单 -->

注意 : 在上述代码中,我们使用了 "name[$i]" 代替了 "name" 来作为 CHtml::activeTextField 的第二参数.

如果有任何校验错误,那么对应的字段将会自动高亮,就像我们先前提到的单模型输入一样.