文章主要介紹了Yii框架form表單用法,例項分析了Yii中form表單的實現方法與相關技巧,非常具有實用價值,需要的朋友可以參考下。
使用表單
在 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 引數是可選的,它指定此規則應被應用到的場景列表;
附加選項 是一個名值對陣列,用於初始化相應驗證器的屬性值。
二、form表單更新資料時候選值問題
category表和post表是多對多,有個中間表relationships,分別記著category_id和post_id
model中 有關係
複製程式碼 程式碼如下:
'cids'=>array(self::HAS_MANY,'Relationships','post_id'),
model中有方法:
複製程式碼 程式碼如下:
static public function getAllCategory(){
return CHtml::listData(self::model()->findAll(), 'id', 'name');
}
比如現在我要更新一條資料,這條資料的欄目有兩個,假設該文章id是21,是屬於兩個欄目,那麼在relationship表中的資料就應該是
複製程式碼 程式碼如下:
id post_id category_id
1 21 1
2 21 2
其中id是流水,該文章的category是1和2. 該欄目的資料我通過建立的AR能夠獲取,
_from中表單我是這麼寫的:
複製程式碼 程式碼如下:
<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>
問題是我在_form 中不知道要腫麼將資料填進去?就是我在更新資料的時候,欄目應該選中才對。
對於view層資料的解耦,拋開checkBoxList,用dropDownList來說舉個例子:
1=>分類1,2=>分類2,表現層(view)中可能是''=>請選擇,1=>分類1,2=>分類2。通過此,你想到了什麼?
關於Behavior是這樣的,Behavior只是一種解決方案,稍後再說。目前你要明白的是,你如果要為Model提供一個屬性(像cid[]),需要考慮哪幾點?(提示:要與CActiveRecord接地氣)
希望本文所述對大家基於Yii框架的PHP程式設計有所幫助。