收集表格输入


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

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

  1. [php]
  2. public function actionBatchUpdate()
  3. {
  4. // 假设每一项(item)是一个 'Item' 类的实例,
  5. // 提取要通过批量模式更新的项
  6. $items=$this->getItemsToUpdate();
  7. if(isset($_POST['Item']))
  8. {
  9. $valid=true;
  10. foreach($items as $i=>$item)
  11. {
  12. if(isset($_POST['Item'][$i]))
  13. $item->attributes=$_POST['Item'][$i];
  14. $valid=$valid && $item->validate();
  15. }
  16. if($valid)  // 如果所有项目有效
  17. // ...则在此处做一些操作
  18. }
  19. // 显示视图收集表格输入
  20. $this->render('batchUpdate',array('items'=>$items));
  21. }

准备好了这个动作,我们需要继续 batchUpdate 视图的工作以在一个 HTML 表格中显示输入项。

  1. [php]
  2. <div class="form">
  3. <?php echo CHtml::beginForm(); ?>
  4. <table>
  5. <tr><th>Name</th><th>Price</th><th>Count</th><th>Description</th></tr>
  6. <?php foreach($items as $i=>$item): ?>
  7. <tr>
  8. <td><?php echo CHtml::activeTextField($item,"[$i]name"); ?></td>
  9. <td><?php echo CHtml::activeTextField($item,"[$i]price"); ?></td>
  10. <td><?php echo CHtml::activeTextField($item,"[$i]count"); ?></td>
  11. <td><?php echo CHtml::activeTextArea($item,"[$i]description"); ?></td>
  12. </tr>
  13. <?php endforeach; ?>
  14. </table>
  15.  
  16. <?php echo CHtml::submitButton('Save'); ?>
  17. <?php echo CHtml::endForm(); ?>
  18. </div><!-- form -->

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

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