有时候我们想按批收集用户输入.也就是,用户可以为多个模型实例输入信息然后一次性提交全部.我们之所以把这个称之为 表格输入(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"> echo CHtml::form(); <table> <tr><th>名称</th><th>价格</th><th>数量</th><th>描述</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'); </form> </div><!-- yii表单 -->
注意 : 在上述代码中,我们使用了
"name[$i]"
代替了"name"
来作为 CHtml::activeTextField 的第二参数.
如果有任何校验错误,那么对应的字段将会自动高亮,就像我们先前提到的单模型输入一样.
Signup or Login in order to comment.