- 相關(guān)推薦
Yii框架form表單用法實(shí)例
文章主要介紹了Yii框架form表單用法,實(shí)例分析了Yii中form表單的實(shí)現方法與相關(guān)技巧,非常具有實(shí)用價(jià)值,需要的朋友可以參考下。
使用表單
在 Yii 中處理表單時(shí),通常需要以下步驟:
1. 創(chuàng )建用于表現所要收集數據字段的模型類(lèi)。
2. 創(chuàng )建一個(gè)控制器動(dòng)作,響應表單提交。
3. 在視圖腳本中創(chuàng )建與控制器動(dòng)作相關(guān)的表單。
一、創(chuàng )建模型
在編寫(xiě)表單所需的 HTML 代碼之前,我們應該先確定來(lái)自最終用戶(hù)輸入的數據的類(lèi)型,以及這些數據應符合什么樣的規則。模型類(lèi)可用于記錄這些信息。正如模型章節所定義的,模型是保存用戶(hù)輸入和驗證這些輸入的中心位置。
取決于使用用戶(hù)所輸入數據的方式,我們可以創(chuàng )建兩種類(lèi)型的模型。如果用戶(hù)輸入被收集、使用然后丟棄,我們應該創(chuàng )建一個(gè)表單模型; 如果用戶(hù)的輸入被收集后要保存到數據庫,我們應使用一個(gè)Active Record。兩種類(lèi)型的模型共享同樣的基類(lèi) CModel ,它定義了表單所需的通用接口。
1、定義模型類(lèi)
例如創(chuàng )建為一個(gè)表單模型:
復制代碼 代碼如下:
class LoginForm extends CFormModel
{
public $username;
public $password;
public $rememberMe=false;
}
LoginForm 中定義了三個(gè)屬性: $username, $password 和 $rememberMe。他們用于保存用戶(hù)輸入的用戶(hù)名和密碼,還有用戶(hù)是否想記住他的登錄的選項。由于 $rememberMe 有一個(gè)默認的值 false,相應的選項在初始化顯示在登錄表單中時(shí)將是未勾選狀態(tài)。
我們將這些成員變量稱(chēng)為特性(attributes)而不是屬性(properties),以區別于普通的屬性(properties)。特性(attribute)是一個(gè)主要用于存儲來(lái)自用戶(hù)輸入或數據庫數據的屬性(propertiy)。
2、聲明驗證規則
一旦用戶(hù)提交了他的輸入,模型被填充,我們就需要在使用前確保用戶(hù)的輸入是有效的。這是通過(guò)將用戶(hù)的輸入和一系列規則執行驗證實(shí)現的。我們在 rules() 方法中指定這些驗證規則,此方法應返回一個(gè)規則配置數組。
復制代碼 代碼如下:
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 應該是一個(gè)布爾值
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','錯誤的用戶(hù)名或密碼。');
}
}
rules() 返回的每個(gè)規則必須是以下格式:
復制代碼 代碼如下:
array('AttributeList', 'Validator', 'on'=>'ScenarioList', ...附加選項)
其中的參數:
AttributeList(特性列表)是需要通過(guò)此規則驗證的特性列表字符串,每個(gè)特性名字由逗號分隔;
Validator(驗證器) 指定要執行驗證的種類(lèi);
on 參數是可選的,它指定此規則應被應用到的場(chǎng)景列表;
附加選項 是一個(gè)名值對數組,用于初始化相應驗證器的屬性值。
二、form表單更新數據時(shí)候選值問(wèn)題
category表和post表是多對多,有個(gè)中間表relationships,分別記著(zhù)category_id和post_id
Post.php model中 有關(guān)系
復制代碼 代碼如下:
'cids'=>array(self::HAS_MANY,'Relationships','post_id'),
Category.php model中有方法:
復制代碼 代碼如下:
static public function getAllCategory(){
return CHtml::listData(self::model()->findAll(), 'id', 'name');
}
比如現在我要更新一條數據,這條數據的欄目有兩個(gè),假設該文章id是21,是屬于兩個(gè)欄目,那么在relationship表中的數據就應該是
復制代碼 代碼如下:
id post_id category_id
1 21 1
2 21 2
其中id是流水,該文章的category是1和2. 該欄目的數據我通過(guò)建立Relationship.php的AR能夠獲取,
_from中表單我是這么寫(xiě)的:
復制代碼 代碼如下:
<p class='row'>
<?php echo $form->labelEx($model,'cid'); ?>
<?php echo $form->checkBoxList($model,'cid',
Category::getAllCategory(),array(
'style'=>'display:inline;',
'separator'=>"<br />n",
'template'=>'{input}{label}',
'labelOptions'=>array('style'=>'display:inline')));
?>
<?php echo $form->error($model,'cid'); ?>
</p>
問(wèn)題是我在_form 中不知道要腫么將數據填進(jìn)去?就是我在更新數據的時(shí)候,欄目應該選中才對。
對于view層數據的解耦,拋開(kāi)checkBoxList,用dropDownList來(lái)說(shuō)舉個(gè)例子:
1=>分類(lèi)1,2=>分類(lèi)2,表現層(view)中可能是''=>請選擇,1=>分類(lèi)1,2=>分類(lèi)2。通過(guò)此,你想到了什么?
關(guān)于Behavior是這樣的,Behavior只是一種解決方案,稍后再說(shuō)。目前你要明白的是,你如果要為Model提供一個(gè)屬性(像cid[]),需要考慮哪幾點(diǎn)?(提示:要與CActiveRecord接地氣)
希望本文所述對大家基于Yii框架的PHP程序設計有所幫助。
【Yii框架form表單用法實(shí)例】相關(guān)文章:
PHP中Yii框架之表單驗證規則06-08
如何讓php提交form表單11-06
form表單中屬性及功能應用10-12
php提交form表單處理方法07-12
Yii2創(chuàng )建表單(ActiveForm)方法09-16
htmlfrom的含義以及form的用法08-30