Yii Framework 开发简明教程(8) 使用FormModel
通过前面的学习,我们了解了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的用法,本例下载。
下面我们创建了一个 LoginForm
(protected/models/LoginForm.php) 模型类用于在一个登录页中收集用户的输入。 由于登录信息只被用于验证用户,并不需要保存,因此我们将 LoginForm
创建为一个 表单模型。
2. 声明验证规则一旦用户提交了他的输入,模型被填充,我们就需要在使用前确保用户的输入是有效的。 这是通过将用户的输入和一系列规则执行验证实现的。我们在
rules()
方法中指定这些验证规则, 此方法应返回一个规则配置数组。3. 安全的特性赋值在一个类的实例被创建后,我们通常需要用最终用户提交的数据填充它的特性。 这可以通过如下块赋值(massive assignment)方式轻松实现:
4. 触发验证一旦模型被用户提交的数据填充,我们就可以调用 CModel::validate() 出发数据验证进程。此方法返回一个指示验证是否成功的值。 对 CActiveRecord 模型来说,验证也可以在我们调用其 CActiveRecord::save() 方法时自动触发。
我们可以使用 scenario 设置场景属性,这样,相应场景的验证规则就会被应用。
验证是基于场景执行的。 scenario 属性指定了模型当前用于的场景和当前使用的验证规则集。 例如,在
login
场景中,我们只想验证用户模型中的username
和password
输入; 而在register
场景中,我们需要验证更多的输入,例如address
, 等。 下面的例子演示了如何在register
场景中执行验证:5. 提取验证错误验证完成后,任何可能产生的错误将被存储在模型对象中。 我们可以通过调用 CModel::getErrors()和CModel::getError() 提取这些错误信息。 这两个方法的不同点在于第一个方法将返回 所有 模型特性的错误信息,而第二个将只返回 第一个 错误信息。
6. 特性标签
当设计表单时,我们通常需要为每个表单域显示一个标签。 标签告诉用户他应该在此表单域中填写什么样的信息。虽然我们可以在视图中硬编码一个标签, 但如果我们在相应的模型中指定(标签),则会更加灵活方便。
默认情况下 CModel 将简单的返回特性的名字作为其标签。这可以通过覆盖 attributeLabels() 方法自定义。 正如在接下来的小节中我们将看到的,在模型中指定标签会使我们能够更快的创建出更强大的表单。
7. 创建动作Action方法
创建好LoginForm 表单Model后,我们就可以为它编写用户提交后的处理代码(对应到Controller中的某个Action方法)。本例使用缺省的SiteController,对应的action为actionLogin.
注意的我们修改了SiteController 的缺省action为login.8. 构建视图编写
login
视图是很简单的,我们以一个form
标记开始,它的 action 属性应该是前面讲述的login
动作的URL。 然后我们需要为LoginForm
类中声明的属性插入标签和表单域。最后, 我们插入一个可由用户点击提交此表单的提交按钮。所有这些都可以用纯HTML代码完成。Yii 提供了几个助手(helper)类简化视图编写。例如, 要创建一个文本输入域,我们可以调用 CHtml::textField(); 要创建一个下拉列表,则调用 CHtml::dropDownList()。
信息: 你可能想知道使用助手的好处,如果它们所需的代码量和直接写纯HTML的代码量相当的话。 答案就是助手可以提供比 HTML 代码更多的功能。例如, 如下代码将生成一个文本输入域,它可以在用户修改了其值时触发表单提交动作。
CHtml::textField($name,$value,array('submit'=>''));不然的话你就需要写一大堆 JavaScript 。
下面,我们使用 CHtml 创建一个登录表单。我们假设变量
$model
是LoginForm
的实例。CSS 样式定义在css目录下,本例使用的为Yii缺省的样式。
从版本 1.1.1 开始,提供了一个新的小物件 CActiveForm 以简化表单创建。 这个小物件可同时提供客户端及服务器端无缝的、一致的验证。使用 CActiveForm, 上面的代码可重写为:
从下篇开始将逐个介绍Yii框架支持的UI组件包括CActiveForm的用法。