鍍金池/ 教程/ PHP/ 收集列表輸入
查詢構(gòu)建器
HTTP 緩存
單元測試
資源
數(shù)據(jù)庫遷移
Fixtures
收集列表輸入
認證
助手類
緩存
數(shù)據(jù)緩存
最佳安全實踐
響應(yīng)格式
使用 Gii 生成代碼
服務(wù)定位器
性能優(yōu)化
資源
多模型的復(fù)合表單
控制器
Html 幫助類
運行機制概述
快速入門
屬性(Property)
使用表單
配置測試環(huán)境
數(shù)據(jù)提供者
使用數(shù)據(jù)庫
授權(quán)
輸入驗證
類自動加載(Autoloading)
版本
響應(yīng)
Sessions 和 Cookies
數(shù)組助手類
創(chuàng)建你自己的應(yīng)用程序結(jié)構(gòu)
文件上傳
路由
收發(fā)郵件
模型
小部件
更上一層樓
頁面緩存
請求
片段緩存
排序
處理密碼
數(shù)據(jù)小部件
模塊
事件
控制器
從 Yii 1.1 升級
應(yīng)用組件
驗收測試
入口腳本
總覽
Url 幫助類
行為
速率限制
控制臺命令
依賴注入容器
視圖
功能測試
錯誤處理
過濾器
主題
應(yīng)用主體
引入第三方代碼
共享托管環(huán)境
測試
擴展
路由
使用模板引擎
核心驗證器(Core Validators)
分頁
數(shù)據(jù)庫訪問 (DAO)
配置
創(chuàng)建表單
日志
安裝 Yii
客戶端腳本使用
組件(Component)
說聲 Hello
運行應(yīng)用
數(shù)據(jù)格式器
認證
錯誤處理
別名(Aliases)
Active Record
啟動引導(dǎo)(Bootstrapping)
國際化

收集列表輸入

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

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

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

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

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

  • [[yii\base\Model::loadMultiple()|Model::loadMultiple()]] 將數(shù)據(jù)加載到一個數(shù)組中。
  • [[yii\base\Model::validateMultiple()|Model::validateMultiple()]] 驗證一系列模型。

更新一組固定的記錄

讓我們從控制器的動作開始:

<?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]);
    }
}

在上面的代碼中,當用模型來從數(shù)據(jù)庫獲取數(shù)據(jù)時,我們使用 [[yii\db\ActiveQuery::indexBy()|indexBy()]] 來讓模型的主鍵成為一個數(shù)組的索引。其中 [[yii\base\Model::loadMultiple()|Model::loadMultiple()]] 用于接收以 POST 方式提交的表單數(shù)據(jù)并填充多個模型,[[yii\base\Model::validateMultiple()|Model::validateMultiple()]] 一次驗證多個模型。正如我們之前驗證的模型,使用了 validateMultiple(),現(xiàn)在通過傳遞 false 作為 [[yii\db\ActiveRecord::save()|save()]]的一個參數(shù)使其不會重復(fù)驗證兩次。

現(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)槊總€設(shè)置渲染了名字和一個帶值的輸入。重要的是給 input name 增加添加適當?shù)乃饕?,因為這是由 [[yii\base\Model::loadMultiple()|Model::loadMultiple()]] 來決定以哪些值來填補哪個模型。

創(chuàng)建一組動態(tài)的新記錄

創(chuàng)造新的記錄與修改記錄很相似,除部分實例化模型不同之外:

public function actionCreate()
{
    $count = count(Yii::$app->request->post('Setting', []));
    $settings = [new Setting()];
    for($i = 1; $i < $count; $i++) {
        $settings[] = new Setting();
    }

    // ...
}

在這里,我們創(chuàng)建了一個初始的 $settings 數(shù)組包含一個默認的模型,所以始終至少有一個文本字段是可見的。此外,我們?yōu)槊總€可能會收到的輸入行添加更多的模型。

在視圖中,可以使用 JavaScript 來動態(tài)地添加新的輸入行。

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

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

還沒有內(nèi)容。

TBD

上一篇:查詢構(gòu)建器下一篇:處理密碼