Yii框架form表单用法实例


Posted in PHP onDecember 04, 2014

本文实例讲述了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
Post.php model中 有关系

'cids'=>array(self::HAS_MANY,'Relationships','post_id'),

Category.php 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. 该栏目的数据我通过建立Relationship.php的AR能够获取,
_from中表单我是这么写的:
<div 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'); ?>

</div>

问题是我在_form 中不知道要肿么将数据填进去?就是我在更新数据的时候,栏目应该选中才对。

对于view层数据的解耦,抛开checkBoxList,用dropDownList来说举个例子:

1=>分类1,2=>分类2,表现层(view)中可能是''=>请选择,1=>分类1,2=>分类2。通过此,你想到了什么?
关于Behavior是这样的,Behavior只是一种解决方案,稍后再说。目前你要明白的是,你如果要为Model提供一个属性(像cid[]),需要考虑哪几点?(提示:要与CActiveRecord接地气)

希望本文所述对大家基于Yii框架的PHP程序设计有所帮助。

PHP 相关文章推荐
php简单的会话类代码
Aug 08 PHP
php连接mssql数据库的几种方法
Feb 21 PHP
解析PHPExcel使用的常用说明以及把PHPExcel整合进CI框架的介绍
Jun 24 PHP
php数组保存文本与文本反编成数组实例
Nov 13 PHP
php通过正则表达式记取数据来读取xml的方法
Mar 09 PHP
php从数据库查询结果生成树形列表的方法
Apr 17 PHP
PHP创建文件,并向文件中写入数据,覆盖,追加的实现代码
Mar 25 PHP
[原创]php正则删除img标签的方法示例
May 27 PHP
Laravel学习教程之IOC容器的介绍与用例
Aug 15 PHP
laravel实现分页样式替换示例代码(增加首、尾页)
Sep 22 PHP
PHP分页显示的方法分析【附PHP通用分页类】
May 10 PHP
PHP实现新型冠状病毒疫情实时图的实例
Feb 04 PHP
Yii不依赖Model的表单生成器用法实例
Dec 04 #PHP
Yii分页用法实例详解
Dec 04 #PHP
Yii配置文件用法详解
Dec 04 #PHP
yii实现图片上传及缩略图生成的方法
Dec 04 #PHP
Dwz与thinkphp整合下的数据导出到Excel实例
Dec 04 #PHP
yii的CURD操作实例详解
Dec 04 #PHP
Yii的CDbCriteria查询条件用法实例
Dec 04 #PHP
You might like
PHP 代码规范小结
2012/03/08 PHP
基于php无限分类的深入理解
2013/06/02 PHP
简单了解将WordPress中的工具栏移到底部的小技巧
2015/12/31 PHP
Yii2中设置与获取别名的函数(setAlias和getAlias)用法分析
2016/07/25 PHP
快速解决PHP调用Word组件DCOM权限的问题
2017/12/27 PHP
laravel多条件查询方法(and,or嵌套查询)
2019/10/09 PHP
背景音乐每次刷新都可以自动更换
2007/02/01 Javascript
google 搜索框添加关键字实现代码
2010/04/24 Javascript
jquery下动态显示jqGrid以及jqGrid的属性设置容易出现问题的解决方法
2010/10/22 Javascript
用jquery生成二级菜单的实例代码
2013/06/24 Javascript
JQuery拖动表头边框线调整表格列宽效果代码
2014/09/10 Javascript
javascript去除空格方法小结
2015/05/21 Javascript
整理JavaScript对DOM中各种类型的元素的常用操作
2016/05/05 Javascript
JavaScript实现通过select标签跳转网页的方法
2016/09/29 Javascript
Angularjs使用过滤器完成排序功能
2017/09/20 Javascript
webpack多页面开发实践
2017/12/18 Javascript
图片懒加载imgLazyLoading.js使用详解
2020/09/15 Javascript
Vue2.x通用条件搜索组件的封装及应用详解
2019/05/28 Javascript
vue如何自动化打包测试环境和正式环境的dist/test文件
2019/06/06 Javascript
JavaScript arguments.callee作用及替换方案详解
2020/09/02 Javascript
vue下拉刷新组件的开发及slot的使用详解
2020/12/23 Vue.js
python 通过xml获取测试节点和属性的实例
2018/03/31 Python
浅谈pytorch和Numpy的区别以及相互转换方法
2018/07/26 Python
什么是Python包的循环导入
2020/09/08 Python
python 第三方库paramiko的常用方式
2021/02/20 Python
Math.round(11.5)等於多少? Math.round(-11.5)等於多少?
2015/01/27 面试题
项目专员岗位职责
2013/12/04 职场文书
幼教求职信
2014/03/12 职场文书
2014年惩防体系建设工作总结
2014/12/01 职场文书
2014年幼儿园教学工作总结
2014/12/04 职场文书
行政主管岗位职责
2015/02/03 职场文书
2015年高一班主任工作总结
2015/05/13 职场文书
2016年度农村党员干部主题教育活动总结
2016/04/06 职场文书
2019年思想汇报
2019/06/20 职场文书
php微信小程序解包过程实例详解
2021/03/31 PHP
SpringBoot集成Druid连接池连接MySQL8.0.11
2021/07/02 Java/Android