當前位置:才華齋>計算機>php語言>

Yii框架form表單用法例項

php語言 閱讀(2.15W)

文章主要介紹了Yii框架form表單用法,例項分析了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程式設計有所幫助。