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 fsockopen写的HTTP下载的类
Feb 22 PHP
PHP中删除变量时unset()和null的区别分析
Jan 27 PHP
php跨服务器访问方法小结
May 12 PHP
thinkPHP3.1验证码的简单实现方法
Apr 22 PHP
CI框架文件上传类及图像处理类用法分析
May 18 PHP
注意!PHP 7中不要做的10件事
Sep 18 PHP
PHP实现压缩图片尺寸并转为jpg格式的方法示例
May 10 PHP
PHP操作redis实现的分页列表,新增,删除功能封装类与用法示例
Aug 04 PHP
Laravel框架实现的批量删除功能示例
Jan 16 PHP
php如何把表单内容提交到数据库
Jul 08 PHP
Laravel 手动开关 Eloquent 修改器的操作方法
Dec 30 PHP
如何利用PHP实现上传图片功能详解
Sep 24 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
新版mysql+apache+php Linux安装指南
2006/10/09 PHP
文件上传的实现
2006/10/09 PHP
ThinkPHP的URL重写问题
2014/06/22 PHP
ThinkPHP跳转页success及error模板实例教程
2014/07/17 PHP
判断、添加和删除WordPress置顶文章的相关PHP函数小结
2015/12/10 PHP
yii2中的rules 自定义验证规则详解
2016/04/19 PHP
完美的php分页类
2017/10/24 PHP
基于jquery的一个拖拽到指定区域内的效果
2011/09/21 Javascript
jquery五角星评分插件示例分享
2014/02/21 Javascript
跟我学习javascript的全局变量
2015/11/16 Javascript
基于jquery实现瀑布流布局
2020/06/28 Javascript
解决Linux无法正常安装与卸载Node.js的方法
2018/01/19 Javascript
浅谈vux之x-input使用以及源码解读
2018/11/04 Javascript
vue 框架下自定义滚动条(easyscroll)实现方法
2019/08/29 Javascript
vue使用echarts图表自适应的几种解决方案
2020/12/04 Vue.js
[01:35]辉夜杯战队访谈宣传片—LGD
2015/12/25 DOTA
[02:42]DOTA2城市挑战赛收官在即 四强之争风起云涌
2018/06/05 DOTA
Python简单实现自动删除目录下空文件夹的方法
2017/08/29 Python
Python实现感知器模型、两层神经网络
2017/12/19 Python
python绘制圆柱体的方法
2018/07/02 Python
python opencv读mp4视频的实例
2018/12/07 Python
Python发送邮件测试报告操作实例详解
2018/12/08 Python
利用nohup来开启python文件的方法
2019/01/14 Python
python新手学习可变和不可变对象
2020/06/11 Python
用python获取txt文件中关键字的数量
2020/12/24 Python
使用Python制作一个数据预处理小工具(多种操作一键完成)
2021/02/07 Python
JustFab加拿大:女鞋、靴子、手袋和服装在线
2018/05/18 全球购物
个性化皮包、小袋、生活配件:Mon Purse
2019/03/26 全球购物
Charles & Colvard官网:美国莫桑石品牌
2019/06/05 全球购物
C,C++的几个面试题小集
2013/07/13 面试题
如何用Java实现列出某个目录下的所有子目录
2015/07/20 面试题
室内拓展活动方案
2014/02/13 职场文书
学校中秋节活动总结
2015/03/23 职场文书
婚庆司仪开场白
2015/05/29 职场文书
2015年党建工作汇报材料
2015/06/25 职场文书
mysql中如何用命令创建联合唯一索引
2022/04/20 MySQL