有時我們想透過批次模式收集使用者輸入。也就是說, 使用者可以為多個模型實例輸入資訊並將它們一次提交。 我們將此稱為 表格輸入(tabular input) ,因為這些輸入項目通常以 HTML 表格的形式呈現。
要使用表格輸入,我們首先需要建立或填入一個模型實例數組,取決於我們是想插入還是更新資料。 然後我們從 $_POST
變數中提取使用者輸入的資料並將其賦值到每個模型。和單一模型輸入稍微不同的一點就是: 我們要用 $_POST['ModelClass'][$i]
提取輸入的資料而不是使用 $_POST['ModelClass']
。
public function actionBatchUpdate() { // 假设每一项(item)是一个 '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 表格中顯示輸入項目。
<p class="form"> <?php echo CHtml::beginForm(); ?> <table> <tr><th>Name</th><th>Price</th><th>Count</th><th>Description</th></tr> <?php foreach($items as $i=>$item): ?> <tr> <td><?php echo CHtml::activeTextField($item,"[$i]name"); ?></td> <td><?php echo CHtml::activeTextField($item,"[$i]price"); ?></td> <td><?php echo CHtml::activeTextField($item,"[$i]count"); ?></td> <td><?php echo CHtml::activeTextArea($item,"[$i]description"); ?></td> </tr> <?php endforeach; ?> </table> <?php echo CHtml::submitButton('Save'); ?> <?php echo CHtml::endForm(); ?> </p><!-- form -->
注意,在上面的程式碼中我們使用了 "[$i]name"
而不是 "::CH