有時我們想通過批量模式收集使用者輸入。也就是說, 使用者可以為多個模型執行個體輸入資訊並將它們一次性提交。 我們將此稱為 表格輸入(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" 而不是 "name" 作為調用 CHtml::activeTextField 時的第二個參數。
如果有任何驗證錯誤,相應的輸入項將會自動高亮顯示,就像前面我們講解的單模型輸入一樣。
以上就是Yii架構官方指南系列20——使用表單:批量收集表格輸入的內容,更多相關內容請關注topic.alibabacloud.com(www.php.cn)!