亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 開發 > PHP > 正文

Yii中表單用法實例詳解

2024-05-04 23:41:55
字體:
來源:轉載
供稿:網友
這篇文章主要介紹了Yii中表單用法,結合實例形式較為詳細的分析總結了Yii針對表單的各種常用操作技巧,具有一定參考借鑒價值,需要的朋友可以參考下
 

本文實例講述了Yii中表單用法。分享給大家供大家參考,具體如下:

在 Yii 中處理表單時,通常需要以下步驟:

1. 創建用于表現所要收集數據字段的模型類。
2. 創建一個控制器動作,響應表單提交。
3. 在視圖腳本中創建與控制器動作相關的表單。

一、創建模型

在編寫表單所需的 HTML 代碼之前,我們應該先確定來自最終用戶輸入的數據的類型,以及這些數據應符合什么樣的規則。模型類可用于記錄這些信息。正如模型章節所定義的,模型是保存用戶輸入和驗證這些輸入的中心位置。

取決于使用用戶所輸入數據的方式,我們可以創建兩種類型的模型。如果用戶輸入被收集、使用然后丟棄,我們應該創建一個表單模型;

如果用戶的輸入被收集后要保存到數據庫,我們應使用一個Active Record。兩種類型的模型共享同樣的基類 CModel,它定義了表單所需的通用接口。

1、定義模型類

例如創建為一個表單模型:

class LoginForm extends CFormModel{public $username;public $password;public $rememberMe=false;}

LoginForm中定義了三個屬性: $username, $password 和$rememberMe。他們用于保存用戶輸入的用戶名和密碼,還有用戶是否想記住他的登錄的選項。由于 $rememberMe 有一個默認的值false,相應的選項在初始化顯示在登錄表單中時將是未勾選狀態。

我們將這些成員變量稱為特性(attributes)而不是屬性(properties),以區別于普通的屬性(properties)。特性(attribute)是一個主要用于存儲來自用戶輸入或數據庫數據的屬性(propertiy)。

2、聲明驗證規則

一旦用戶提交了他的輸入,模型被填充,我們就需要在使用前確保用戶的輸入是有效的。這是通過將用戶的輸入和一系列規則執行驗證實現的。我們在 rules() 方法中指定這些驗證規則,此方法應返回一個規則配置數組。

class LoginForm extends CFormModel{public $username;public $password;public $rememberMe=false;private $_identity;public function rules(){return array(array('username, password', 'required'), //username 和 password 為必填項array('rememberMe', 'boolean'), //rememberMe 應該是一個布爾值array('password', 'authenticate'), //password 應被驗證(authenticated));}public function authenticate($attribute,$params){$this->_identity=new UserIdentity($this->username,$this->password);if(!$this->_identity->authenticate())$this->addError('password','錯誤的用戶名或密碼。');}}

rules() 返回的每個規則必須是以下格式:

復制代碼代碼如下:
array('AttributeList', 'Validator', 'on'=>'ScenarioList', ...附加選項)

其中:

 

AttributeList(特性列表)是需要通過此規則驗證的特性列表字符串,每個特性名字由逗號分隔;
Validator(驗證器) 指定要執行驗證的種類;
on 參數是可選的,它指定此規則應被應用到的場景列表;

附加選項 是一個名值對數組,用于初始化相應驗證器的屬性值。

有三種方式可在驗證規則中指定 Validator:

第一, Validator 可以是模型類中一個方法的名字,就像上面示例中的 authenticate 。驗證方法必須是下面的結構:

復制代碼代碼如下:
public function 驗證器名稱($attribute,$params) { ... }

第二,Validator可以是一個驗證器類的名字,當此規則被應用時,一個驗證器類的實例將被創建以執行實際驗證。規則中的附加選項用于初始化實例的屬性值。驗證器類必須繼承自 CValidator。

 

第三,Validator 可以是一個預定義的驗證器類的別名。在上面的例子中,required 名字是 CRequiredValidator 的別名,它用于確保所驗證的特性值不為空。下面是預定義的驗證器別名的完整列表:

boolean: CBooleanValidator 的別名,確保特性有一個 CBooleanValidator::trueva lue 或 CBooleanValidator::falseva lue 值。
captcha: CCaptchaValidator 的別名,確保特性值等于 CAPTCHA 中顯示的驗證碼。
compare: CCompareva lidator 的別名,確保特性等于另一個特性或常量。
email: CEmailValidator 的別名,確保特性是一個有效的Email地址。
default: CDefaultValueva lidator 的別名,指定特性的默認值。
exist: CExistValidator 的別名,確保特性值可以在指定表的列中可以找到。
file: CFileva lidator 的別名,確保特性含有一個上傳文件的名字。
filter: CFilterValidator 的別名,通過一個過濾器改變此特性。
in: CRangeva lidator 的別名,確保數據在一個預先指定的值的范圍之內。
length: CStringValidator 的別名,確保數據的長度在一個指定的范圍之內。
match: CRegularExpressionValidator 的別名,確保數據可以匹配一個正則表達式。
numerical: CNumberValidator 的別名,確保數據是一個有效的數字。
required: CRequiredValidator 的別名,確保特性不為空。
type: CTypeva lidator 的別名,確保特性是指定的數據類型。
unique: CUniqueva lidator 的別名,確保數據在數據表的列中是唯一的。
url: CUrlValidator 的別名,確保數據是一個有效的 URL。

下面我們列出了幾個只用這些預定義驗證器的示例:

// 用戶名為必填項array('username', 'required'),// 用戶名必須在 3 到 12 個字符之間array('username', 'length', 'min'=>3, 'max'=>12),// 在注冊場景中,密碼password必須和password2一致。array('password', 'compare', 'compareAttribute'=>'password2', 'on'=>'register'),// 在登錄場景中,密碼必須接受驗證。array('password', 'authenticate', 'on'=>'login'),

3、安全的特性賦值

在一個類的實例被創建后,我們通常需要用最終用戶提交的數據填充它的特性。這可以通過如下塊賦值(massive assignment)方式輕松實現:

$model=new LoginForm;if(isset($_POST['LoginForm']))$model->attributes=$_POST['LoginForm'];

最后的表達式被稱作 塊賦值(massive assignment) ,它將 $_POST['LoginForm'] 中的每一項復制到相應的模型特性中。這相當于如下賦值方法:

foreach($_POST['LoginForm'] as $name=>$value){if($name 是一個安全的特性)$model->$name=$value;}

檢測特性的安全非常重要,例如,如果我們以為一個表的主鍵是安全的而暴露了它,那么攻擊者可能就獲得了一個修改記錄的主鍵的機會,從而篡改未授權給他的內容。

特性如果出現在相應場景的一個驗證規則中,即被認為是安全的。例如:

array('username, password', 'required', 'on'=>'login, register'),array('email', 'required', 'on'=>'register'),

如上所示, username 和 password 特性在 login 場景中是必填項。而 username, password 和 email特性在 register 場景中是必填項。于是,如果我們在 login 場景中執行塊賦值,就只有 username 和 password會被塊賦值。因為只有它們出現在 login 的驗證規則中。另一方面,如果場景是 register ,這三個特性就都可以被塊賦值。

// 在登錄場景中$model=new User('login');if(isset($_POST['User']))$model->attributes=$_POST['User'];// 在注冊場景中$model=new User('register');if(isset($_POST['User']))$model->attributes=$_POST['User'];

那么為什么我們使用這樣一種策略來檢測特性是否安全呢?背后的基本原理就是:如果一個特性已經有了一個或多個可檢測有效性的驗證規則,那我們還擔心什么呢?

請記住,驗證規則是用于檢查用戶輸入的數據,而不是檢查我們在代碼中生成的數據(例如時間戳,自動產生的主鍵)。因此,不要為那些不接受最終用戶輸入的特性添加驗證規則。

有時候,我們想聲明一個特性是安全的,即使我們沒有為它指定任何規則。例如,一篇文章的內容可以接受用戶的任何輸入。我們可以使用特殊的 safe 規則實現此目的:

復制代碼代碼如下:
array('content', 'safe')

還有一個用于聲明一個屬性為不安全的 unsafe 規則:
復制代碼代碼如下:
array('permission', 'unsafe')

unsafe 規則并不常用,它是我們之前定義的安全特性的一個例外。

 

4、觸發驗證

一旦模型被用戶提交的數據填充,我們就可以調用 CModel::validate() 觸發數據驗證進程。此方法返回一個指示驗證是否成功的值。對CActiveRecord  模型來說,驗證也可以在我們調用其 CActiveRecord::save() 方法時自動觸發。

我們可以通過設置scenario屬性來設置場景屬性,這樣,相應場景的驗證規則就會被應用。

驗證是基于場景執行的。 scenario屬性指定了模型當前用于的場景和當前使用的驗證規則集。例如,在 login 場景中,我們只想驗證用戶模型中的username 和 password 輸入;而在 register 場景中,我們需要驗證更多的輸入,例如 email, address,等。下面的例子演示了如何在 register 場景中執行驗證:

// 在注冊場景中創建一個 User 模型。等價于:// $model=new User;// $model->scenario='register';$model=new User('register'); //給模型類添加參數,該參數就是要觸發的驗證場景// 將輸入的值填充到模型$model->attributes=$_POST['User'];// 執行驗證if($model->validate())  // 如果輸入有效...else...

規則關聯的場景可以通過規則中的 on 選項指定。如果 on 選項未設置,則此規則會應用于所有場景。例如:

public function rules(){return array(array('username, password', 'required'),array('password_repeat', 'required', 'on'=>'register'),array('password', 'compare', 'on'=>'register'),);}

第一個規則將應用于所有場景,而第二個將只會應用于 register 場景。

5、提取驗證錯誤

驗證完成后,任何可能產生的錯誤將被存儲在模型對象中。我們可以通過調用 CModel::getErrors()和CModel::getError()  提取這些錯誤信息。這兩個方法的不同點在于第一個方法將返回所有 模型特性的錯誤信息,而第二個將只返回第一個 錯誤信息。

6、特性標簽

當設計表單時,我們通常需要為每個表單域顯示一個標簽。標簽告訴用戶他應該在此表單域中填寫什么樣的信息。雖然我們可以在視圖中硬編碼一個標簽,但如果我們在相應的模型中指定(標簽),則會更加靈活方便。

默認情況下 CModel 將簡單的返回特性的名字作為其標簽。這可以通過覆蓋 attributeLabels() 方法自定義。正如在接下來的小節中我們將看到的,在模型中指定標簽會使我們能夠更快的創建出更強大的表單。

二、創建動作

有了模型,我們就可以開始編寫用于操作此模型的邏輯了。我們將此邏輯放在一個控制器的動作中。對登錄表單的例子來講,相應的代碼就是:

public function actionLogin(){$model=new LoginForm;if(isset($_POST['LoginForm'])){// 收集用戶輸入的數據$model->attributes=$_POST['LoginForm'];// 驗證用戶輸入,并在判斷輸入正確后重定向到前一頁if($model->validate())$this->redirect(Yii::app()->user->returnUrl); //重定向到之前需要身份驗證的頁面URL}// 顯示登錄表單$this->render('login',array('model'=>$model));}

如上所示,我們首先創建了一個 LoginForm 模型示例;如果請求是一個 POST 請求(意味著這個登錄表單被提交了),我們則使用提交的數據$_POST['LoginForm'] 填充 $model;然后我們驗證此輸入,如果驗證成功,重定向用戶瀏覽器到之前需要身份驗證的頁面。如果驗證失敗,或者此動作被初次訪問,我們則渲染 login視圖,此視圖的內容將在后續章節中講解。

提示: 在 login 動作中,我們使用Yii::app()->user->returnUrl  獲取之前需要身份驗證的頁面URL。 組件Yii::app()->user 是一種 CWebUser (或其子類) ,它表示用戶會話信息(例如用戶名,狀態)。

讓我們特別留意一下 login 動作中出現的下面的 PHP 語句:

復制代碼代碼如下:
$model->attributes=$_POST['LoginForm'];

正如我們在 安全的特性賦值 中所講的,這行代碼使用用戶提交的數據填充模型。 attributes 屬性由 CModel定義,它接受一個名值對數組并將其中的每個值賦給相應的模型特性。因此如果 $_POST['LoginForm']給了我們這樣的一個數組,上面的那段代碼也就等同于下面冗長的這段 (假設數組中存在所有所需的特性):

 

$model->username=$_POST['LoginForm']['username'];$model->password=$_POST['LoginForm']['password'];$model->rememberMe=$_POST['LoginForm']['rememberMe'];

注意: 為了使 $_POST['LoginForm'] 傳遞給我們的是一個數組而不是字符串,我們需要在命名表單域時遵守一個規范。具體的,對應于模型類 C 中的特性 a 的表單域,我們將其命名為 C[a] 。例如,我們可使用LoginForm[username] 命名 username 特性相應的表單域。

現在剩下的工作就是創建 login 視圖了,它應該包含一個帶有所需輸入項的 HTML 表單。

三、創建表單

編寫 login 視圖是很簡單的,我們以一個 form 標記開始,它的 action 屬性應該是前面講述的 login動作的URL。然后我們需要為 LoginForm類中聲明的屬性插入標簽和表單域。最后,我們插入一個可由用戶點擊提交此表單的提交按鈕。所有這些都可以用純HTML代碼完成。

Yii 提供了幾個助手(helper)類簡化視圖編寫。例如,要創建一個文本輸入域,我們可以調用 CHtml::textField();要創建一個下拉列表,則調用 CHtml::dropDownList()。
例如, 如下代碼將生成一個文本輸入域,它可以在用戶修改了其值時觸發表單提交動作。

復制代碼代碼如下:
CHtml::textField($name,$value,array('submit'=>''));

下面,我們使用 CHtml  創建一個登錄表單。我們假設變量 $model 是 LoginForm 的實例。

 

上述代碼生成了一個更加動態的表單,例如, CHtml::activeLabel()生成一個與指定模型的特性相關的標簽。如果此特性有一個輸入錯誤,此標簽的CSS class 將變為 error,通過 CSS樣式改變了標簽的外觀。相似的, CHtml::activeTextField() 為指定模型的特性生成一個文本輸入域,并會在錯誤發生時改變它的CSS class。

我們還可以使用一個新的小物件 CActiveForm  以簡化表單創建。這個小物件可同時提供客戶端及服務器端無縫的、一致的驗證。使用 CActiveForm, 上面的代碼可重寫為:

beginWidget('CActiveForm'); ?>errorSummary($model); ?>label($model,'username'); ?>textField($model,'username') ?>label($model,'password'); ?>passwordField($model,'password') ?>checkBox($model,'rememberMe'); ?>label($model,'rememberMe'); ?>endWidget(); ?>

四、收集表格輸入

有時我們想通過批量模式收集用戶輸入。也就是說,用戶可以為多個模型實例輸入信息并將它們一次性提交。我們將此稱為 表格輸入(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 表格中顯示輸入項。

NamePriceCountDescription$item): ?>

注意,在上面的代碼中我們使用了 "[$i]name" 而不是 "name" 作為調用 CHtml::activeTextField 時的第二個參數。

如果有任何驗證錯誤,相應的輸入項將會自動高亮顯示,就像前面我們講解的單模型輸入一樣。

希望本文所述對大家基于Yii框架的PHP程序設計有所幫助。



注:相關教程知識閱讀請移步到PHP教程頻道。
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
欧美在线亚洲在线| 日韩国产在线播放| 日韩电影中文字幕在线观看| 成人性生交大片免费看视频直播| 欧美中文字幕在线视频| 国产精品三级在线| 国产ts人妖一区二区三区| 国产精品久久久久久影视| 欧美激情精品久久久久久黑人| 成人黄色片在线| 国产999在线观看| 午夜精品久久久久久久99热浪潮| 精品欧美国产一区二区三区| 国产精品视频网站| 欧美黑人一级爽快片淫片高清| 亚洲视频在线播放| 欧美激情视频网站| 久久中文字幕视频| 一本色道久久综合狠狠躁篇怎么玩| 8x拔播拔播x8国产精品| 国产成人精品在线| 欧美日韩高清在线观看| 国产精品18久久久久久首页狼| 国语自产精品视频在免费| 国产精品久久久久久久美男| 欧美国产在线电影| 日韩美女视频免费在线观看| 最近2019中文字幕在线高清| 国产精品久久一| 国产精品扒开腿做| 日韩美女写真福利在线观看| 国产精品va在线播放我和闺蜜| 成人高h视频在线| 97在线免费观看| 亚洲国产精品嫩草影院久久| 一区二区三区www| 日本精品一区二区三区在线播放视频| 国产一区二区在线免费| 欧美性黄网官网| 国产精品视频资源| 日韩专区在线观看| 久久国产色av| 亚洲免费人成在线视频观看| 国产精品一区二区久久久| 1769国内精品视频在线播放| 97在线看免费观看视频在线观看| 欧美大片免费观看在线观看网站推荐| 国产一区二区成人| 国产欧美久久久久久| 国产亚洲人成网站在线观看| 91中文精品字幕在线视频| 亚洲精品久久久久久久久久久久久| 97久久伊人激情网| 精品久久久av| 久久亚洲国产成人| 欧美日韩裸体免费视频| 国产精品一区二区久久精品| 欧美日韩午夜剧场| 亚洲一区国产精品| 成人a在线视频| 国产成人亚洲综合| 中文字幕日韩在线观看| 国产日本欧美一区二区三区| 国产精品户外野外| 日韩在线视频中文字幕| 91亚洲人电影| 亚洲激情第一页| 欧美日韩不卡合集视频| 久久精品99久久香蕉国产色戒| 91干在线观看| 日本一区二区三区四区视频| 欧美一区二区三区四区在线| 91热福利电影| 一区二区三区 在线观看视| 欧美精品久久久久a| 粗暴蹂躏中文一区二区三区| 亚洲福利小视频| 日本不卡免费高清视频| 亚洲国产精品女人久久久| 国产精品入口免费视频一| 久久人人爽人人爽人人片亚洲| 色综合老司机第九色激情| 久久久久免费精品国产| 欧美精品在线播放| 91精品视频免费看| 午夜精品一区二区三区在线播放| 91av福利视频| 国产精品久久久999| 亚洲欧美一区二区三区四区| 国产福利成人在线| 永久免费看mv网站入口亚洲| 中文字幕久精品免费视频| 亚洲伊人一本大道中文字幕| 国产精品永久免费在线| 精品国内亚洲在观看18黄| 在线观看视频99| 国产精品一二三在线| 日韩电影中文 亚洲精品乱码| 国语对白做受69| 欧美网站在线观看| 欧美亚洲国产成人精品| 中文字幕在线视频日韩| 国产精品久久久久久一区二区| 欧美国产在线电影| 欧美精品在线观看| 欧美一级电影在线| 97在线视频免费观看| 亚洲影院高清在线| 国产午夜精品视频| 亚洲欧洲成视频免费观看| 日韩成人av在线播放| 一区二区三区四区视频| 91牛牛免费视频| 国内自拍欧美激情| 国产精品入口夜色视频大尺度| 日本久久久久久| 亚洲人成网在线播放| 国产精品专区第二| 91精品国产99久久久久久| 国产精品爱啪在线线免费观看| 中文字幕精品av| 日韩中文字幕精品视频| 91av中文字幕| 大桥未久av一区二区三区| 高清一区二区三区四区五区| 深夜福利国产精品| 欧美二区乱c黑人| 久久精品最新地址| 岛国av一区二区在线在线观看| 欧美一区二区大胆人体摄影专业网站| 国产综合在线看| 欧美xxxwww| 日韩av免费在线| 亚洲男人的天堂在线| 26uuu日韩精品一区二区| 91久久精品一区| 不卡伊人av在线播放| 国产精品一久久香蕉国产线看观看| 日韩性生活视频| 亚洲欧美在线一区| 成人精品视频久久久久| 精品自在线视频| 日日狠狠久久偷偷四色综合免费| 亚洲а∨天堂久久精品喷水| 日韩在线视频网| 国产日韩精品入口| 久久精品国产v日韩v亚洲| 日韩成人网免费视频| 美女国内精品自产拍在线播放| 久久91亚洲精品中文字幕| 黑人巨大精品欧美一区二区三区| 久久久久久久久久久免费精品| 国产成人拍精品视频午夜网站| 成人黄色生活片| 国产亚洲人成网站在线观看| 91理论片午午论夜理片久久| 92裸体在线视频网站| 欧美一级大片在线观看| 久久免费视频在线观看| 欧美日韩国产麻豆| 久久国产精品久久久久久| 欧美三级xxx| 亚洲国产中文字幕在线观看| 91免费欧美精品|