收集表格输入

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

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

  1. public function actionBatchUpdate()
  2. {
  3. // 批处理模式中,收集用于更新的项
  4. // 假定每项都是模型类 'Item' 的
  5. $items=$this->getItemsToUpdate();
  6. if(isset($_POST['Item']))
  7. {
  8. $valid=true;
  9. foreach($items as $i=>$item)
  10. {
  11. if(isset($_POST['Item'][$i]))
  12. $item->attributes=$_POST['Item'][$i];
  13. $valid=$valid && $item->validate();
  14. }
  15. if($valid) // 所有的项都是有效的
  16. // ...在这里干点什么
  17. }
  18. // 显示视图收集表格输入
  19. $this->render('batchUpdate',array('items'=>$items));
  20. }

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

  1. <div class="yiiForm">
  2. <?php echo CHtml::form(); ?>
  3. <table>
  4. <tr><th>名称</th><th>价格</th><th>数量</th><th>描述</th></tr>
  5. <?php foreach($items as $i=>$item): ?>
  6. <tr>
  7. <td><?php echo CHtml::activeTextField($item,"name[$i]"); ?></td>
  8. <td><?php echo CHtml::activeTextField($item,"price[$i]"); ?></td>
  9. <td><?php echo CHtml::activeTextField($item,"count[$i]"); ?></td>
  10. <td><?php echo CHtml::activeTextArea($item,"description[$i]"); ?></td>
  11. </tr>
  12. <?php endforeach; ?>
  13. </table>
  14.  
  15. <?php echo CHtml::submitButton('Save'); ?>
  16. </form>
  17. </div><!-- yii表单 -->
注意 : 在上述代码中,我们使用了 "name[$i]" 代替了 "name" 来作为 CHtml::activeTextField 的第二参数.

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

创建表单

使用数据库: 概述

原文: https://www.yiichina.com/doc/guide/1.0/form.table