收集表格输入
有时候我们想按批收集用户输入.也就是,用户可以为多个模型实例输入信息然后一次性提交全部.我们之所以把这个称之为 表格输入(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 的第二参数.
如果有任何校验错误,那么对应的字段将会自动高亮,就像我们先前提到的单模型输入一样.