PHP开发框架Yii Framework教程(8) 使用FormModel2013-01-24 csdn mapdigit通过前面的学习,我们了解了Yii Web应用的基本组成部分,也会编写像Hangman猜单词游戏这样简单的应用。在第一个例子 Yii Framework 开发简明教程(1) 第一个应用Hello World 我们介绍了Yii Web应用采用MVC模型,也说明了本教程目的是通过不 同的视角(主要是通过开发Windows应用C++,C#程序员的角度)帮助Windows 桌面应用或ASP.Net程序员较快的掌握PHP Yii Framework应用程序框架。前面我们介绍了通过CHtml创建View(页面视图Form),通过CController来处理用户提交事件 ,和Windows 桌面应用或ASP.Net做个类比, Yii 中视图View (HTML Form) 类似于WinForm或是Asp.Net 的Page。 控制类 Controller类似Windows桌面应用或Asp.Net的事件处理(Code-Behind)类。不同的是Asp.Net和Windows 桌面应用可以为UI中各 个UI组件,比如文本框,按钮定义Id,然后为不同的UI组件添加事件处理。PHP应用或是Yii应用没有对应的机制可以为定义在 HTML Form中的UI组件定义一个Id,并为UI组件定义事件处理。 然而Yii 框架提供了CFormModel 可以支持类似的功能,简单的 说,通过CFormModel,可以为HTML Form 中的UI小组件定义变量,并且可以在其控制类Controller中访问这些变量。每个Yii View(Form)一般都提供一个“提交”按钮(Submit Button),用户点击这个“提交按钮”触发CController对象对应的 actionXXX 方法,在actionXXX 方法中可以通过CFormModel来访问HTML Form的UI组件的值。前面教程中说过Yii中的模 型(Model)是 CModel 或其子类的实例。模型用于保持数据以及与其相关的业务逻辑,Yii 实现了两种类型的模型:表 单模型和 Active Record。二者均继承于相同的基类 CModel。表单模型是 CFormModel 的实例。表单模型用于保持从用 户的输入获取的数据。 这些数据经常被获取,使用,然后丢弃。例如,在一个登录页面中, 我们可以使用表单模型用于表示由 最终用户提供的用户名和密码信息。更多详情,请参考 使用表单。本篇介绍CFormModel的用法,Active Record (AR) 是一种用于通过面向对象的风格抽象化数据库访问的设计模式。 每个 AR 对象是一个CActiveRecord 或其子类的实例。代表数 据表中的一行。 行中的字段对应 AR 对象中的属性。更多关于 AR 的细节请阅读 Active Record. 后面介绍数据库使用时再介 绍。本篇使用一个简单的登录界面来介绍FormModel的用法,本例下载。1. 定义模型类下面我们创建了一个 LoginForm (protected/models/LoginForm.php) 模型类用于在一个登录页中收集用户的输入。 由于登 录信息只被用于验证用户,并不需要保存,因此我们将 LoginForm 创建为一个 表单模型。
class LoginForm extends CFormModel { public $username; public $password; public $rememberMe=false; }2. 声明验证规则一旦用户提交了他的输入,模型被填充,我们就需要在使用前确保用户的输入是有效的。 这是通过将用户的输入和一系列规则执行验证实现的。我们在 rules() 方法中指定这些验证规则, 此方法应返回一个规则配置 数组。
class LoginForm extends CFormModel { public $username; public $password; public $rememberMe=false;private $_identity;public function rules() { return array( array("username, password", "required"), array("rememberMe", "boolean"), array("password", "authenticate"), ); }public function authenticate($attribute,$params) { $this->_identity=new UserIdentity($this->username, $this->password); if(!$this->_identity->authenticate()) $this->addError("password","错误的用户名或密码。"); } }上述代码指定:username 和 password 为必填项, password 应被验证(authenticated),rememberMe 应该是一 个布尔值。rules() 返回的每个规则必须是以下格式:
array("AttributeList", "Validator", "on"=>"ScenarioList", ...附加选项)