Yii 框架提供了強大的表單驗證機制,基於模型層的 rules() 方法定義驗證規則,配合視圖層的 CActiveForm 小部件自動生成表單並顯示錯誤提示。本文通過一個完整的用戶註冊案例,展示視圖、模型、控制器三層的協作流程。
文件:protected/views/user/register.php
<?php $form = $this->beginWidget('CActiveForm'); ?>
<!-- 用戶名 -->
<?php echo $form->labelEx($model, 'username'); ?>
<?php echo $form->textField($model, 'username'); ?>
<?php echo $form->error($model, 'username'); ?>
<br>
<!-- 密碼 -->
<?php echo $form->labelEx($model, 'password'); ?>
<?php echo $form->passwordField($model, 'password'); ?>
<?php echo $form->error($model, 'password'); ?>
<br>
<!-- 確認密碼 -->
<?php echo $form->labelEx($model, 'password2'); ?>
<?php echo $form->passwordField($model, 'password2'); ?>
<?php echo $form->error($model, 'password2'); ?>
<br>
<!-- 郵箱 -->
<?php echo $form->labelEx($model, 'email'); ?>
<?php echo $form->textField($model, 'email'); ?>
<?php echo $form->error($model, 'email'); ?>
<br>
<!-- 性別(單選) -->
<?php echo $form->labelEx($model, 'sex'); ?>
<?php echo $form->radioButtonList($model, 'sex', array(1=>'男', 2=>'女'), array("separator"=>" ")); ?>
<br>
<!-- 年級(下拉選擇) -->
<?php echo $form->labelEx($model, 'grade'); ?>
<?php echo $form->dropDownList($model, 'grade', array(0=>"--請選擇--", 1=>"2010級", 2=>"2011級", 3=>"2012級")); ?>
<?php echo $form->error($model, 'grade'); ?>
<br>
<!-- 愛好(多選) -->
<?php echo $form->labelEx($model, 'hobby'); ?>
<?php echo $form->checkBoxList($model, 'hobby', array(1=>"籃球", 2=>"足球", 3=>"排球"), array("separator"=>" ")); ?>
<?php echo $form->error($model, 'hobby'); ?>
<!-- 提交按鈕 -->
<?php echo CHtml::submitButton('提交'); ?>
<?php $this->endWidget(); ?>
關鍵點: 所有表單字段通過 $form-> 方法綁定模型屬性,error() 自動顯示驗證失敗信息。
文件:protected/models/User.php
class User extends CActiveRecord {
public $password2; // 非數據庫字段,僅用於表單驗證
public static function model($className = __CLASS__) {
return parent::model($className);
}
public function tableName() {
return '{{user}}'; // 自動識別表前綴
}
public function attributeLabels() {
return array(
"username" => "姓名",
"password" => "密碼",
"password2" => "確認密碼",
"email" => "郵箱",
"sex" => "性別",
"grade" => "年級",
"hobby" => "愛好",
);
}
public function rules() {
return array(
array("username", "required", "message" => "用戶名不能為空"),
array("password", "required", "message" => "密碼不能為空"),
// 密碼比對驗證
array("password2", "compare", "compareAttribute" => "password", "message" => "兩次密碼不一致"),
// 郵箱格式驗證
array("email", "email", "allowEmpty" => false, "message" => "郵箱格式不正確"),
// 年級範圍驗證
array("grade", "in", "range" => array(1,2,3), "message" => "請選擇年級"),
// 自定義驗證方法:愛好至少選 2 個
array("hobby", "checkHobby"),
);
}
// 自定義驗證方法
public function checkHobby() {
$len = strlen($this->hobby); // 注意:checkBoxList 提交為逗號分隔字符串
if ($len < 3) { // 簡易判斷,實際應用建議用 count(explode(','))
$this->addError("hobby", "愛好至少為 2 個以上");
}
}
}
核心驗證類型:
required:必填compare:比對兩字段值email:郵箱格式in:值在指定範圍內自定義方法:方法名對應 rules 最後一項,通過 addError() 添加錯誤文件:protected/controllers/UserController.php
public function actionAdd() {
$user = new User();
if (isset($_POST['User'])) {
// 處理多選框數組轉字符串存儲
if (is_array($_POST['User']['hobby'])) {
$_POST['User']['hobby'] = implode(",", $_POST['User']['hobby']);
}
$user->attributes = $_POST['User']; // 批量賦值
if ($user->save()) {
echo 'success';
} else {
echo 'error';
}
}
$this->renderPartial("register", array("model" => $user));
}
流程說明:
save() 成功則入庫,失敗自動保留錯誤信息回顯表單Yii 的表單驗證核心在於模型層:
attributes 批量賦值自動映射rules() 定義,支持內置驗證器與自定義方法CActiveForm 自動綁定錯誤顯示public 屬性即可參與驗證本例展示了 Yii 表單驗證的標準 MVC 協作模式:視圖負責渲染與綁定,模型封裝業務規則與驗證邏輯,控制器處理請求流轉。掌握 CActiveForm、rules()、自定義驗證方法及多選框數據處理,能快速構建健壯的表單交互功能。