收集表格式輸入 ======================== 有時我們想通過批量模式收集使用者輸入。也就是說, 使用者可以為多個模型實體輸入訊息並將它們一次性提交。 我們將此稱為 *表格式輸入(tabular input)* ,因為這些輸入項通常以 HTML 表格的形式呈現。 要使用表格式輸入,我們首先需要建立或填入一個模型實體陣列,取決於我們是想插入還是更新資料。 然後我們從 `$_POST` 變數中擷取使用者輸入的資料並將其賦值到每個模型。和單模型輸入稍有不同的一點就是: 我們要使用 `$_POST['ModelClass'][$i]` 擷取輸入的資料而不是使用 `$_POST['ModelClass']`。 ~~~ [php] 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 表格中顯示輸入項目。 ~~~ [php]
$item): ?>
NamePriceCountDescription
~~~ 注意,在上面的程式碼中我們使用了 `"[$i]name"` 而不是 `"name"` 作為調用 [CHtml::activeTextField] 時的第二個參數。 如果有任何驗證錯誤,相應的輸入項將會自動高亮顯示,就像前面我們講解的單一模型輸入一樣。
$Id$