收集列表輸入(Collecting Tabular Input)

2018-02-24 15:40 更新

收集列表輸入

有時(shí)你需要在一個(gè)表單中以單一的形式處理多個(gè)模型。例如,有多個(gè)設(shè)置,每個(gè)設(shè)置存儲(chǔ)為一個(gè) name-value,并通過(guò)?Setting?活動(dòng)記錄模型來(lái)表示。 這種形式也常被稱為“列表輸入”。與此相反,處理不同模型的不同類型,在多模型同時(shí)輸入章節(jié)中介紹。

下面展示了如何在 Yii 中收集列表輸入。

在三種不同的情況下,所需處理的略有不同:

  • 從數(shù)據(jù)庫(kù)中更新一組固定的記錄
  • 創(chuàng)建一個(gè)動(dòng)態(tài)的新記錄集
  • 更新、創(chuàng)建和刪除一頁(yè)記錄

與之前介紹的單一模型表單相反,我們現(xiàn)在用的是一個(gè)數(shù)組類的模型。這個(gè)數(shù)組將每個(gè)模型傳遞到視圖并以一種類似于表格的方式來(lái)顯示表單字段。 我們使用 yii\base\Model 助手類方法來(lái)一次性地加載和驗(yàn)證多模型數(shù)據(jù):

  • yii\base\Model::loadMultiple() 將數(shù)據(jù)加載到一個(gè)數(shù)組中。
  • yii\base\Model::validateMultiple() 驗(yàn)證一系列模型。

更新一組固定的記錄

讓我們從控制器的動(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)建一組動(dòng)態(tài)的新記錄

創(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)地添加新的輸入行。

把更新,創(chuàng)建和刪除結(jié)合在一個(gè)頁(yè)面上

注意:此章節(jié)正在開發(fā)中。

還沒有內(nèi)容。

TBD

以上內(nèi)容是否對(duì)您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號(hào)
微信公眾號(hào)

編程獅公眾號(hào)