W3Cschool
恭喜您成為首批注冊(cè)用戶
獲得88經(jīng)驗(yàn)值獎(jiǎng)勵(lì)
有時(shí)你需要在一個(gè)表單中以單一的形式處理多個(gè)模型。例如,有多個(gè)設(shè)置,每個(gè)設(shè)置存儲(chǔ)為一個(gè) name-value,并通過(guò)?Setting
?活動(dòng)記錄模型來(lái)表示。 這種形式也常被稱為“列表輸入”。與此相反,處理不同模型的不同類型,在多模型同時(shí)輸入章節(jié)中介紹。
下面展示了如何在 Yii 中收集列表輸入。
在三種不同的情況下,所需處理的略有不同:
與之前介紹的單一模型表單相反,我們現(xiàn)在用的是一個(gè)數(shù)組類的模型。這個(gè)數(shù)組將每個(gè)模型傳遞到視圖并以一種類似于表格的方式來(lái)顯示表單字段。 我們使用 yii\base\Model 助手類方法來(lái)一次性地加載和驗(yàn)證多模型數(shù)據(jù):
讓我們從控制器的動(dòng)作開始:
<?php
namespace app\controllers;
use Yii;
use yii\base\Model;
use yii\web\Controller;
use app\models\Setting;
class SettingsController extends Controller
{
// ...
public function actionUpdate()
{
$settings = Setting::find()->indexBy('id')->all();
if (Model::loadMultiple($settings, Yii::$app->request->post()) && Model::validateMultiple($settings)) {
foreach ($settings as $setting) {
$setting->save(false);
}
return $this->redirect('index');
}
return $this->render('update', ['settings' => $settings]);
}
}
在上面的代碼中,當(dāng)用模型來(lái)從數(shù)據(jù)庫(kù)獲取數(shù)據(jù)時(shí),我們使用 yii\db\ActiveQuery::indexBy() 來(lái)讓模型的主鍵成為一個(gè)數(shù)組的索引。 其中 yii\base\Model::loadMultiple() 用于接收以 POST 方式提交的表單數(shù)據(jù)并填充多個(gè)模型, yii\base\Model::validateMultiple() 一次驗(yàn)證多個(gè)模型。 正如我們之前驗(yàn)證的模型,使用了?validateMultiple()
,現(xiàn)在通過(guò)傳遞?false
?作為 yii\db\ActiveRecord::save() 的一個(gè)參數(shù)使其不會(huì)重復(fù)驗(yàn)證兩次。
現(xiàn)在在?update
?視圖的表單:
<?php
use yii\helpers\Html;
use yii\widgets\ActiveForm;
$form = ActiveForm::begin();
foreach ($settings as $index => $setting) {
echo $form->field($setting, "[$index]value")->label($setting->name);
}
ActiveForm::end();
在這里,我們?yōu)槊總€(gè)設(shè)置渲染了名字和一個(gè)帶值的輸入。重要的是給 input name 增加添加適當(dāng)?shù)乃饕?因?yàn)檫@是由 yii\base\Model::loadMultiple() 來(lái)決定以哪些值來(lái)填補(bǔ)哪個(gè)模型。
創(chuàng)造新的記錄與修改記錄很相似,除部分實(shí)例化模型不同之外:
public function actionCreate()
{
$count = count(Yii::$app->request->post('Setting', []));
$settings = [new Setting()];
for($i = 1; $i < $count; $i++) {
$settings[] = new Setting();
}
// ...
}
在這里,我們創(chuàng)建了一個(gè)初始的?$settings
?數(shù)組包含一個(gè)默認(rèn)的模型,所以始終至少有一個(gè)文本字段是可見的。 此外,我們?yōu)槊總€(gè)可能會(huì)收到的輸入行添加更多的模型。
在視圖中,可以使用 JavaScript 來(lái)動(dòng)態(tài)地添加新的輸入行。
注意:此章節(jié)正在開發(fā)中。
還沒有內(nèi)容。
TBD
Copyright©2021 w3cschool編程獅|閩ICP備15016281號(hào)-3|閩公網(wǎng)安備35020302033924號(hào)
違法和不良信息舉報(bào)電話:173-0602-2364|舉報(bào)郵箱:jubao@eeedong.com
掃描二維碼
下載編程獅App
編程獅公眾號(hào)
聯(lián)系方式:
更多建議: