亚洲国产日韩欧美一区二区三区,精品亚洲国产成人av在线,国产99视频精品免视看7,99国产精品久久久久久久成人热,欧美日韩亚洲国产综合乱

目錄 搜尋
閱讀前篇 簡(jiǎn)介 Yii 是什么 從 Yii 1.1 升級(jí) 入門 安裝 Yii 運(yùn)行應(yīng)用 第一次問(wèn)候 使用Forms 數(shù)據(jù)庫(kù)應(yīng)用 使用 Gii 生成代碼 進(jìn)階 應(yīng)用結(jié)構(gòu) 概述 入口腳本 應(yīng)用(Applications) 應(yīng)用組件(Application Components) 控制器(Controllers) 模型(Models) 視圖(views) 模塊(Modules) 過(guò)濾器(Filters) 小部件(Widgets) 前端資源(Assets) 擴(kuò)展(Extensions) 請(qǐng)求處理 運(yùn)行概述 啟動(dòng)引導(dǎo)(Bootstrapping) 路由和創(chuàng)建URL 請(qǐng)求(Requests) 響應(yīng)(Responses) Sessions 和 Cookies 錯(cuò)誤處理(Handling Errors) 日志(Logging) 關(guān)鍵概念 組件(Component) 屬性(Property) 事件(Events) 行為(Behaviors) 配置(Configurations) 別名(Aliases) 類自動(dòng)加載(Autoloading) 服務(wù)定位器(Service Locator) 依賴注入容器(Dependency Injection Container) 配合數(shù)據(jù)庫(kù)工作 數(shù)據(jù)庫(kù)訪問(wèn) (Data Access Objects) 查詢生成器(Query Builder) 活動(dòng)記錄(Active Record) 數(shù)據(jù)庫(kù)遷移(Migrations) Sphinx Redis MongoDB Elasticsearch 接收用戶數(shù)據(jù) 創(chuàng)建表單(Creating Forms) 輸入驗(yàn)證(Validating Input) 文件上傳(Uploading Files) 收集列表輸入(Collecting Tabular Input) 多模型的復(fù)合表單(Getting Data for Multiple Models) 顯示數(shù)據(jù) 格式化輸出數(shù)據(jù)(Data Formatting) 分頁(yè)(Pagination) 排序(Sorting) 數(shù)據(jù)提供器(Data Providers) 數(shù)據(jù)小部件(Data Widgets) 客戶端腳本使用(Working with Client Scripts) 主題(Theming) 安全 認(rèn)證(Authentication) 授權(quán)(Authorization) 處理密碼(Working with Passwords) 客戶端認(rèn)證(Auth Clients) 最佳安全實(shí)踐(Best Practices) 緩存 概述 數(shù)據(jù)緩存 片段緩存 頁(yè)面緩存 HTTP 緩存 RESTfull Web服務(wù) 快速入門(Quick Start) 資源(Resources) 控制器(Controllers) 路由(Routing) 格式化響應(yīng)(Response Formatting) 授權(quán)認(rèn)證(Authentication) 速率限制(Rate Limiting) 版本(Versioning) 錯(cuò)誤處理(Error Handling) 開(kāi)發(fā)工具 調(diào)試工具欄和調(diào)試器 使用Gii生成代碼 生成API文檔 測(cè)試 概述(Overview) 配置測(cè)試環(huán)境(Testing environment setup) 單元測(cè)試(Unit Tests) 功能測(cè)試(Function Tests) 驗(yàn)收測(cè)試(Acceptance Tests) 測(cè)試夾具(Fixtures) 高級(jí)專題 高級(jí)應(yīng)用模板 創(chuàng)建自定義應(yīng)用程序結(jié)構(gòu) 控制臺(tái)命令 核心驗(yàn)證器(Core Validators) 國(guó)際化 收發(fā)郵件 性能優(yōu)化 共享主機(jī)環(huán)境 模板引擎 集成第三方代碼 小部件 Bootstrap 小部件 Jquery UI 助手類 概述 Array 助手(ArrayHelper) Html 助手(Html) Url 助手(Url)
文字

使用表單

使用表單

本章節(jié)介紹如何創(chuàng)建一個(gè)讓用戶提交數(shù)據(jù)的表單頁(yè)。該頁(yè)將顯示一個(gè)包含 name 輸入框和 email 輸入框的表單。當(dāng)提交這兩部分信息后,頁(yè)面將會(huì)顯示用戶所輸入的信息。

為了實(shí)現(xiàn)這個(gè)目標(biāo),除了創(chuàng)建一個(gè)操作和兩個(gè)視圖外,還需要?jiǎng)?chuàng)建一個(gè)模型。

貫穿整個(gè)小節(jié),你將會(huì)學(xué)到:

  • 創(chuàng)建一個(gè)模型代表用戶通過(guò)表單輸入的數(shù)據(jù)
  • 聲明規(guī)則去驗(yàn)證輸入的數(shù)據(jù)
  • 在視圖中生成一個(gè) HTML 表單

創(chuàng)建模型

模型類?EntryForm?代表從用戶那請(qǐng)求的數(shù)據(jù),該類如下所示并存儲(chǔ)在?models/EntryForm.php?文件中。請(qǐng)參考類自動(dòng)加載章節(jié)獲取更多關(guān)于類命名約定的介紹。

<?php

namespace app\models;

use yii\base\Model;

class EntryForm extends Model{
    public $name;
    public $email;

    public function rules()
    {
        return [
            [['name', 'email'], 'required'],
            ['email', 'email'],
        ];
    }
}

該類繼承自Yii 提供的一個(gè)基類 yii\base\Model,該基類通常用來(lái)表示數(shù)據(jù)。

補(bǔ)充:yii\base\Model 被用于普通模型類的父類并與數(shù)據(jù)表無(wú)關(guān)。yii\db\ActiveRecord 通常是普通模型類的父類但與數(shù)據(jù)表有關(guān)聯(lián)(譯注:yii\db\ActiveRecord 類其實(shí)也是繼承自 yii\base\Model,增加了數(shù)據(jù)庫(kù)處理)。

EntryForm?類包含?name?和?email?兩個(gè)公共成員,用來(lái)儲(chǔ)存用戶輸入的數(shù)據(jù)。它還包含一個(gè)名為?rules()?的方法,用來(lái)返回?cái)?shù)據(jù)驗(yàn)證規(guī)則的集合。上面聲明的驗(yàn)證規(guī)則表示:

  • name?和?email?值都是必須的
  • email?的值必須滿足email規(guī)則驗(yàn)證

如果你有一個(gè)處理用戶提交數(shù)據(jù)的?EntryForm?對(duì)象,你可以調(diào)用它的 yii\base\Model::validate() 方法觸發(fā)數(shù)據(jù)驗(yàn)證。如果有數(shù)據(jù)驗(yàn)證失敗,將把 yii\base\Model::hasErrors 屬性設(shè)為 ture,想要知道具體發(fā)生什么錯(cuò)誤就調(diào)用 yii\base\Model::getErrors。

<?php$model = new EntryForm();
$model->name = 'Qiang';
$model->email = 'bad';
if ($model->validate()) {
    // 驗(yàn)證成功!
} else {
    // 失??!
    // 使用 $model->getErrors() 獲取錯(cuò)誤詳情
}

創(chuàng)建操作

下面你得在?site?控制器中創(chuàng)建一個(gè)?entry?操作用于新建的模型。操作的創(chuàng)建和使用已經(jīng)在說(shuō)一聲你好小節(jié)中解釋了。

<?php

namespace app\controllers;

use Yii;
use yii\web\Controller;
use app\models\EntryForm;

class SiteController extends Controller{
    // ...其它代碼...

    public function actionEntry()
    {
        $model = new EntryForm;

        if ($model->load(Yii::$app->request->post()) && $model->validate()) {
            // 驗(yàn)證 $model 收到的數(shù)據(jù)

            // 做些有意義的事 ...

            return $this->render('entry-confirm', ['model' => $model]);
        } else {
            // 無(wú)論是初始化顯示還是數(shù)據(jù)驗(yàn)證錯(cuò)誤
            return $this->render('entry', ['model' => $model]);
        }
    }
}

該操作首先創(chuàng)建了一個(gè)?EntryForm?對(duì)象。然后嘗試從?$_POST?搜集用戶提交的數(shù)據(jù),由 Yii 的 yii\web\Request::post() 方法負(fù)責(zé)搜集。如果模型被成功填充數(shù)據(jù)(也就是說(shuō)用戶已經(jīng)提交了 HTML 表單),操作將調(diào)用 yii\base\Model::validate() 去確保用戶提交的是有效數(shù)據(jù)。

補(bǔ)充:表達(dá)式?Yii::$app?代表應(yīng)用實(shí)例,它是一個(gè)全局可訪問(wèn)的單例。同時(shí)它也是一個(gè)服務(wù)定位器,能提供request,response,db?等等特定功能的組件。在上面的代碼里就是使用?request?組件來(lái)訪問(wèn)應(yīng)用實(shí)例收到的?$_POST?數(shù)據(jù)。

用戶提交表單后,操作將會(huì)渲染一個(gè)名為?entry-confirm?的視圖去確認(rèn)用戶輸入的數(shù)據(jù)。如果沒(méi)填表單就提交,或數(shù)據(jù)包含錯(cuò)誤(譯者:如 email 格式不對(duì)),entry?視圖將會(huì)渲染輸出,連同表單一起輸出的還有驗(yàn)證錯(cuò)誤的詳細(xì)信息。

注意:在這個(gè)簡(jiǎn)單例子里我們只是呈現(xiàn)了有效數(shù)據(jù)的確認(rèn)頁(yè)面。實(shí)踐中你應(yīng)該考慮使用 yii\web\Controller::refresh() 或 yii\web\Controller::redirect() 去避免表單重復(fù)提交問(wèn)題。

創(chuàng)建視圖

最后創(chuàng)建兩個(gè)視圖文件?entry-confirm?和?entry。他們會(huì)被剛才創(chuàng)建的?entry?操作渲染。

entry-confirm?視圖簡(jiǎn)單地顯示提交的 name 和 email 數(shù)據(jù)。視圖文件保存在?views/site/entry-confirm.php。

<?phpuse yii\helpers\Html;
?>
<p>You have entered the following information:</p>

<ul>
    <li><label>Name</label>: <?= Html::encode($model->name) ?></li>
    <li><label>Email</label>: <?= Html::encode($model->email) ?></li>
</ul>

entry?視圖顯示一個(gè) HTML 表單。視圖文件保存在?views/site/entry.php。

<?phpuse yii\helpers\Html;
use yii\widgets\ActiveForm;
?><?php $form = ActiveForm::begin(); ?>

    <?= $form->field($model, 'name') ?>

    <?= $form->field($model, 'email') ?>

    <div class="form-group">
        <?= Html::submitButton('Submit', ['class' => 'btn btn-primary']) ?>
    </div>

<?php ActiveForm::end(); ?>

視圖使用了一個(gè)功能強(qiáng)大的小部件?yii\widgets\ActiveForm 去生成 HTML 表單。其中的?begin()?和?end()?分別用來(lái)渲染表單的開(kāi)始和關(guān)閉標(biāo)簽。在這兩個(gè)方法之間使用了 yii\widgets\ActiveForm::field() 方法去創(chuàng)建輸入框。第一個(gè)輸入框用于 “name”,第二個(gè)輸入框用于 “email”。之后使用 yii\helpers\Html::submitButton() 方法生成提交按鈕。

嘗試下

用瀏覽器訪問(wèn)下面的 URL 看它能否工作:

http://hostname/index.php?r=site/entry

你會(huì)看到一個(gè)包含兩個(gè)輸入框的表單的頁(yè)面。每個(gè)輸入框的前面都有一個(gè)標(biāo)簽指明應(yīng)該輸入的數(shù)據(jù)類型。如果什么都不填就點(diǎn)擊提交按鈕,或填入格式不正確的 email 地址,將會(huì)看到在對(duì)應(yīng)的輸入框下顯示錯(cuò)誤信息。

驗(yàn)證錯(cuò)誤的表單

輸入有效的 name 和 email 信息并提交后,將會(huì)看到一個(gè)顯示你所提交數(shù)據(jù)的確認(rèn)頁(yè)面。

輸入數(shù)據(jù)的確認(rèn)頁(yè)

效果說(shuō)明

你可能會(huì)好奇 HTML 表單暗地里是如何工作的呢,看起來(lái)它可以為每個(gè)輸入框顯示文字標(biāo)簽,而當(dāng)你沒(méi)輸入正確的信息時(shí)又不需要刷新頁(yè)面就能給出錯(cuò)誤提示,似乎有些神奇。

是的,其實(shí)數(shù)據(jù)首先由客戶端 JavaScript 腳本驗(yàn)證,然后才會(huì)提交給服務(wù)器通過(guò) PHP 驗(yàn)證。yii\widgets\ActiveForm 足夠智能到把你在EntryForm?模型中聲明的驗(yàn)證規(guī)則轉(zhuǎn)化成客戶端 JavaScript 腳本去執(zhí)行驗(yàn)證。如果用戶瀏覽器禁用了 JavaScript, 服務(wù)器端仍然會(huì)像actionEntry()?方法里這樣驗(yàn)證一遍數(shù)據(jù)。這保證了任何情況下用戶提交的數(shù)據(jù)都是有效的。

警告:客戶端驗(yàn)證是提高用戶體驗(yàn)的手段。無(wú)論它是否正常啟用,服務(wù)端驗(yàn)證則都是必須的,請(qǐng)不要忽略它。

輸入框的文字標(biāo)簽是?field()?方法生成的,內(nèi)容就是模型中該數(shù)據(jù)的屬性名。例如模型中的?name?屬性生成的標(biāo)簽就是?Name。

你可以在視圖中自定義標(biāo)簽:

<?= $form->field($model, 'name')->label('自定義 Name') ?><?= $form->field($model, 'email')->label('自定義 Email') ?>

補(bǔ)充:Yii 提供了相當(dāng)多類似的小部件去幫你生成復(fù)雜且動(dòng)態(tài)的視圖。在后面你還會(huì)了解到自己寫小部件是多么簡(jiǎn)單。你可能會(huì)把自己的很多視圖代碼轉(zhuǎn)化成小部件以提高重用,加快開(kāi)發(fā)效率。

總結(jié)

本章節(jié)指南中你接觸了 MVC 設(shè)計(jì)模式的每個(gè)部分。學(xué)到了如何創(chuàng)建一個(gè)模型代表用戶數(shù)據(jù)并驗(yàn)證它的有效性。

你還學(xué)到了如何從用戶那獲取數(shù)據(jù)并在瀏覽器上回顯給用戶。這本來(lái)是開(kāi)發(fā)應(yīng)用的過(guò)程中比較耗時(shí)的任務(wù),好在 Yii 提供了強(qiáng)大的小部件讓它變得如此簡(jiǎn)單。

下一章你將學(xué)習(xí)如何使用數(shù)據(jù)庫(kù),幾乎每個(gè)應(yīng)用都需要數(shù)據(jù)庫(kù)。
上一篇: 下一篇: