收集表格输入

有时我们想通过批量模式收集用户输入。也就是说,用户可以为多个模型实例输入信息并将它们一次性提交。我们将此称为 表格输入(tabular input) ,因为这些输入项通常以 HTML 表格的形式呈现。

要使用表格输入,我们首先需要创建或填充一个模型实例数组,取决于我们是想插入还是更新数据。然后我们从 $_POST 变量中提取用户输入的数据并将其赋值到每个模型。和单模型输入稍有不同的一点就是:我们要使用 $_POST['ModelClass'][$i] 提取输入的数据而不是使用 $_POST['ModelClass']

  1. public function actionBatchUpdate()
  2. {
  3. // 假设每一项(item)是一个 'Item' 类的实例,
  4. // 提取要通过批量模式更新的项
  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="form">
  2. <?php echo CHtml::beginForm(); ?>
  3. <table>
  4. <tr><th>Name</th><th>Price</th><th>Count</th><th>Description</th></tr>
  5. <?php foreach($items as $i=>$item): ?>
  6. <tr>
  7. <td><?php echo CHtml::activeTextField($item,"[$i]name"); ?></td>
  8. <td><?php echo CHtml::activeTextField($item,"[$i]price"); ?></td>
  9. <td><?php echo CHtml::activeTextField($item,"[$i]count"); ?></td>
  10. <td><?php echo CHtml::activeTextArea($item,"[$i]description"); ?></td>
  11. </tr>
  12. <?php endforeach; ?>
  13. </table>
  14.  
  15. <?php echo CHtml::submitButton('Save'); ?>
  16. <?php echo CHtml::endForm(); ?>
  17. </div><!-- form -->

注意,在上面的代码中我们使用了 "[$i]name" 而不是 "name" 作为调用 CHtml::activeTextField 时的第二个参数。

如果有任何验证错误,相应的输入项将会自动高亮显示,就像前面我们讲解的单模型输入一样。

原文: https://www.yiiframework.com/doc/guide/1.1/zh-cn/form.table