位置: 编程技术 - 正文

Yii中表单用法实例详解(表单的基本语法格式)

编辑:rootadmin

推荐整理分享Yii中表单用法实例详解(表单的基本语法格式),希望有所帮助,仅作参考,欢迎阅读内容。

文章相关热门搜索词:表单ui,表单serialize()方法,表单示例,表单的形式,表单的语法格式,表单的形式,表单的基本语法格式,表单的语法格式,内容如对您有帮助,希望把文章链接给更多的朋友!

本文实例讲述了Yii中表单用法。分享给大家供大家参考,具体如下:

在 Yii 中处理表单时,通常需要以下步骤:

1. 创建用于表现所要收集数据字段的模型类。2. 创建一个控制器动作,响应表单提交。3. 在视图脚本中创建与控制器动作相关的表单。

一、创建模型

在编写表单所需的 HTML 代码之前,我们应该先确定来自最终用户输入的数据的类型,以及这些数据应符合什么样的规则。模型类可用于记录这些信息。正如模型章节所定义的,模型是保存用户输入和验证这些输入的中心位置。

取决于使用用户所输入数据的方式,我们可以创建两种类型的模型。如果用户输入被收集、使用然后丢弃,我们应该创建一个表单模型;

如果用户的输入被收集后要保存到数据库,我们应使用一个Active Record。两种类型的模型共享同样的基类 CModel,它定义了表单所需的通用接口。

1、定义模型类

例如创建为一个表单模型:

LoginForm中定义了三个属性: $username, $password 和$rememberMe。他们用于保存用户输入的用户名和密码,还有用户是否想记住他的登录的选项。由于 $rememberMe 有一个默认的值false,相应的选项在初始化显示在登录表单中时将是未勾选状态。

我们将这些成员变量称为特性(attributes)而不是属性(properties),以区别于普通的属性(properties)。特性(attribute)是一个主要用于存储来自用户输入或数据库数据的属性(propertiy)。

2、声明验证规则

一旦用户提交了他的输入,模型被填充,我们就需要在使用前确保用户的输入是有效的。这是通过将用户的输入和一系列规则执行验证实现的。我们在 rules() 方法中指定这些验证规则,此方法应返回一个规则配置数组。

rules() 返回的每个规则必须是以下格式:其中:

AttributeList(特性列表)是需要通过此规则验证的特性列表字符串,每个特性名字由逗号分隔;Validator(验证器) 指定要执行验证的种类;on 参数是可选的,它指定此规则应被应用到的场景列表;

附加选项 是一个名值对数组,用于初始化相应验证器的属性值。

有三种方式可在验证规则中指定 Validator:

第一, Validator 可以是模型类中一个方法的名字,就像上面示例中的 authenticate 。验证方法必须是下面的结构:第二,Validator可以是一个验证器类的名字,当此规则被应用时,一个验证器类的实例将被创建以执行实际验证。规则中的附加选项用于初始化实例的属性值。验证器类必须继承自 CValidator。

第三,Validator 可以是一个预定义的验证器类的别名。在上面的例子中,required 名字是 CRequiredValidator 的别名,它用于确保所验证的特性值不为空。下面是预定义的验证器别名的完整列表:

boolean: CBooleanValidator 的别名,确保特性有一个 CBooleanValidator::trueva lue 或 CBooleanValidator::falseva lue 值。captcha: CCaptchaValidator 的别名,确保特性值等于 CAPTCHA 中显示的验证码。compare: CCompareva lidator 的别名,确保特性等于另一个特性或常量。email: CEmailValidator 的别名,确保特性是一个有效的Email地址。default: CDefaultValueva lidator 的别名,指定特性的默认值。exist: CExistValidator 的别名,确保特性值可以在指定表的列中可以找到。file: CFileva lidator 的别名,确保特性含有一个上传文件的名字。filter: CFilterValidator 的别名,通过一个过滤器改变此特性。in: CRangeva lidator 的别名,确保数据在一个预先指定的值的范围之内。length: CStringValidator 的别名,确保数据的长度在一个指定的范围之内。match: CRegularExpressionValidator 的别名,确保数据可以匹配一个正则表达式。numerical: CNumberValidator 的别名,确保数据是一个有效的数字。required: CRequiredValidator 的别名,确保特性不为空。type: CTypeva lidator 的别名,确保特性是指定的数据类型。unique: CUniqueva lidator 的别名,确保数据在数据表的列中是唯一的。url: CUrlValidator 的别名,确保数据是一个有效的 URL。

下面我们列出了几个只用这些预定义验证器的示例:

3、安全的特性赋值

在一个类的实例被创建后,我们通常需要用最终用户提交的数据填充它的特性。这可以通过如下块赋值(massive assignment)方式轻松实现:

最后的表达式被称作 块赋值(massive assignment) ,它将 $_POST['LoginForm'] 中的每一项复制到相应的模型特性中。这相当于如下赋值方法:

检测特性的安全非常重要,例如,如果我们以为一个表的主键是安全的而暴露了它,那么攻击者可能就获得了一个修改记录的主键的机会,从而篡改未授权给他的内容。

特性如果出现在相应场景的一个验证规则中,即被认为是安全的。例如:

如上所示, username 和 password 特性在 login 场景中是必填项。而 username, password 和 email特性在 register 场景中是必填项。于是,如果我们在 login 场景中执行块赋值,就只有 username 和 password会被块赋值。因为只有它们出现在 login 的验证规则中。另一方面,如果场景是 register ,这三个特性就都可以被块赋值。

那么为什么我们使用这样一种策略来检测特性是否安全呢?背后的基本原理就是:如果一个特性已经有了一个或多个可检测有效性的验证规则,那我们还担心什么呢?

请记住,验证规则是用于检查用户输入的数据,而不是检查我们在代码中生成的数据(例如时间戳,自动产生的主键)。因此,不要为那些不接受最终用户输入的特性添加验证规则。

Yii中表单用法实例详解(表单的基本语法格式)

有时候,我们想声明一个特性是安全的,即使我们没有为它指定任何规则。例如,一篇文章的内容可以接受用户的任何输入。我们可以使用特殊的 safe 规则实现此目的:还有一个用于声明一个属性为不安全的 unsafe 规则:unsafe 规则并不常用,它是我们之前定义的安全特性的一个例外。

4、触发验证

一旦模型被用户提交的数据填充,我们就可以调用 CModel::validate() 触发数据验证进程。此方法返回一个指示验证是否成功的值。对CActiveRecord 模型来说,验证也可以在我们调用其 CActiveRecord::save() 方法时自动触发。

我们可以通过设置scenario属性来设置场景属性,这样,相应场景的验证规则就会被应用。

验证是基于场景执行的。 scenario属性指定了模型当前用于的场景和当前使用的验证规则集。例如,在 login 场景中,我们只想验证用户模型中的username 和 password 输入;而在 register 场景中,我们需要验证更多的输入,例如 email, address,等。下面的例子演示了如何在 register 场景中执行验证:

规则关联的场景可以通过规则中的 on 选项指定。如果 on 选项未设置,则此规则会应用于所有场景。例如:

第一个规则将应用于所有场景,而第二个将只会应用于 register 场景。

5、提取验证错误

验证完成后,任何可能产生的错误将被存储在模型对象中。我们可以通过调用 CModel::getErrors()和CModel::getError() 提取这些错误信息。这两个方法的不同点在于第一个方法将返回所有 模型特性的错误信息,而第二个将只返回第一个 错误信息。

6、特性标签

当设计表单时,我们通常需要为每个表单域显示一个标签。标签告诉用户他应该在此表单域中填写什么样的信息。虽然我们可以在视图中硬编码一个标签,但如果我们在相应的模型中指定(标签),则会更加灵活方便。

默认情况下 CModel 将简单的返回特性的名字作为其标签。这可以通过覆盖 attributeLabels() 方法自定义。正如在接下来的小节中我们将看到的,在模型中指定标签会使我们能够更快的创建出更强大的表单。

二、创建动作

有了模型,我们就可以开始编写用于操作此模型的逻辑了。我们将此逻辑放在一个控制器的动作中。对登录表单的例子来讲,相应的代码就是:

如上所示,我们首先创建了一个 LoginForm 模型示例;如果请求是一个 POST 请求(意味着这个登录表单被提交了),我们则使用提交的数据$_POST['LoginForm'] 填充 $model;然后我们验证此输入,如果验证成功,重定向用户浏览器到之前需要身份验证的页面。如果验证失败,或者此动作被初次访问,我们则渲染 login视图,此视图的内容将在后续章节中讲解。

提示: 在 login 动作中,我们使用Yii::app()->user->returnUrl 获取之前需要身份验证的页面URL。 组件Yii::app()->user 是一种 CWebUser (或其子类) ,它表示用户会话信息(例如用户名,状态)。

让我们特别留意一下 login 动作中出现的下面的 PHP 语句:正如我们在 安全的特性赋值 中所讲的,这行代码使用用户提交的数据填充模型。 attributes 属性由 CModel定义,它接受一个名值对数组并将其中的每个值赋给相应的模型特性。因此如果 $_POST['LoginForm']给了我们这样的一个数组,上面的那段代码也就等同于下面冗长的这段 (假设数组中存在所有所需的特性):

注意: 为了使 $_POST['LoginForm'] 传递给我们的是一个数组而不是字符串,我们需要在命名表单域时遵守一个规范。具体的,对应于模型类 C 中的特性 a 的表单域,我们将其命名为 C[a] 。例如,我们可使用LoginForm[username] 命名 username 特性相应的表单域。

现在剩下的工作就是创建 login 视图了,它应该包含一个带有所需输入项的 HTML 表单。

三、创建表单

编写 login 视图是很简单的,我们以一个 form 标记开始,它的 action 属性应该是前面讲述的 login动作的URL。然后我们需要为 LoginForm类中声明的属性插入标签和表单域。最后,我们插入一个可由用户点击提交此表单的提交按钮。所有这些都可以用纯HTML代码完成。

Yii 提供了几个助手(helper)类简化视图编写。例如,要创建一个文本输入域,我们可以调用 CHtml::textField();要创建一个下拉列表,则调用 CHtml::dropDownList()。例如, 如下代码将生成一个文本输入域,它可以在用户修改了其值时触发表单提交动作。下面,我们使用 CHtml 创建一个登录表单。我们假设变量 $model 是 LoginForm 的实例。

上述代码生成了一个更加动态的表单,例如, CHtml::activeLabel()生成一个与指定模型的特性相关的标签。如果此特性有一个输入错误,此标签的CSS class 将变为 error,通过 CSS样式改变了标签的外观。相似的, CHtml::activeTextField() 为指定模型的特性生成一个文本输入域,并会在错误发生时改变它的CSS class。

我们还可以使用一个新的小物件 CActiveForm 以简化表单创建。这个小物件可同时提供客户端及服务器端无缝的、一致的验证。使用 CActiveForm, 上面的代码可重写为:

四、收集表格输入

有时我们想通过批量模式收集用户输入。也就是说,用户可以为多个模型实例输入信息并将它们一次性提交。我们将此称为 表格输入(tabular input) ,因为这些输入项通常以 HTML 表格的形式呈现。

要使用表格输入,我们首先需要创建或填充一个模型实例数组,取决于我们是想插入还是更新数据。然后我们从 $_POST变量中提取用户输入的数据并将其赋值到每个模型。和单模型输入稍有不同的一点就是:我们要使用 $_POST['ModelClass'][$i]提取输入的数据而不是使用 $_POST['ModelClass']。

准备好了这个动作,我们需要继续 batchUpdate 视图的工作以在一个 HTML 表格中显示输入项。

注意,在上面的代码中我们使用了 "[$i]name" 而不是 "name" 作为调用 CHtml::activeTextField 时的第二个参数。

如果有任何验证错误,相应的输入项将会自动高亮显示,就像前面我们讲解的单模型输入一样。

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

CI(Codeigniter)的Setting增强配置类实例 本文实例讲述了Codeigniter的Setting增强配置类。分享给大家供大家参考,具体如下:该增强配置类适用配置项要求比较灵活的项目。可实现预加载配置、

基于PHP技术开发客服工单系统 相关知识:客顺通php在线客服系统v2.0.0PESCMSTicketPESMCSTicket(下称PT)是一款基于GPLv2协议发布的开源客服工单系统。PT基于PESCMS2为核心进行开发,以全新的

如何使用微信公众平台开发模式实现多客服 其实微信公众平台的多客服功能已经出来好久了,并且一出来的时候我就已经为自己的公众号实现了,原本以为大家都已经会了,但是今天还是有人问

标签: 表单的基本语法格式

本文链接地址:https://www.jiuchutong.com/biancheng/284338.html 转载请保留说明!

上一篇:Yii中创建自己的Widget实例(创建自定义对象主要哪几种方法,并写出基本语法结构?)

下一篇:CI(Codeigniter)的Setting增强配置类实例

  • 生产调味料用什么手续
  • 股权转让后企业注销个人所得税怎么处理
  • 同一控制下的长期股权投资入账成本
  • 如何做好存货管理,从哪方面去做
  • 疫情期间公司买水
  • 车险退到对公账户会计分录是
  • 下列不属于流动资产的
  • 社保和公积金是从工资里面扣吗
  • 土地补偿款涉及哪些法律
  • 印花税没有计提直接付了怎么做账
  • 未达账项怎么做会计分录
  • 管理费用现金流量表中属于
  • 办公设备折旧年限及残值率
  • 企业生产设备发生的日常维修费用
  • 安全费用支出范围包括
  • 企业财产保险费率的影响因素
  • 给个人支付劳务报酬怎么做账
  • 小规模时取得的专票在一般纳锐人之后可以抵扣吗
  • 营改增后的增值税税目税率表
  • 小微企业享受优惠
  • 总包分包差额征税是什么意思
  • 收到未抵扣的红字发票
  • 低价购买债权后可否向债务人全额主张债务
  • 成本费用调整法
  • 主营业务收入和其他业务收入的区别
  • 企业所得税利润怎么算
  • 关联方之间借款利息怎么开票
  • 个人独资企业生活费用扣除
  • 无法加载响应数据 对于预检请求没有可显示的内容
  • linux怎么改桌面背景
  • 公司给员工交纳社保
  • 保证合同的担保范围包括
  • 不要运行指定的Windows应用程序怎么设置win10教程
  • linux virt-manager
  • 对公账户存款利息要交增值税吗
  • 出口退税一般退什么税
  • php中通过什么属性可以获取数组中元素的个数
  • 塔卡夫斯基镜子
  • php如何使用
  • php操作json文件
  • 时序21-21-21-47
  • Pytorch深度学习实战3-7:详解数据加载DataLoader与模型处理
  • phpcms视频教程
  • 差旅费包干是什么意思
  • 零余额账户什么时候开始停用
  • 增值税电子发票怎么下载
  • php注册系统
  • 增值税普票能抵税吗
  • 科技局创业扶持资金
  • 内资企业如何进国企
  • sql server的数据库
  • 代理进口货物如何确定增值税纳税人
  • 投资性房地产用三栏式吗
  • 将税后利润首先用于增加投资
  • 企业发生亏损,可在( )年内连续弥补
  • 收客户利息怎么处理
  • 营业外收支主要有哪些
  • 差旅费报销单是谁填写的
  • 企业对外购和自己的区别
  • sql server减法
  • vista win
  • xp系统的存储在哪里
  • backupnotify.exe是什么文件的进程 backupnotify进程安全吗
  • windows7怎么画画
  • win7系统屏幕保护设置禁用如何开启
  • win7电脑老是自动重启是什么原因
  • 拉伸设置
  • ztree拖动
  • jquery 随机函数
  • linux同名文件
  • windows下安装nas
  • bootstrap基础教程书籍
  • js创建对象的方法有哪些
  • 一个简单的javaweb项目
  • jquery通过属性值获取元素
  • 国家税务总局的局长什么级别
  • 豪车超过多少钱要多加税
  • 学费减免政策
  • 缴纳了车辆购置税能退吗
  • 收到12366的短信
  • 免责声明:网站部分图片文字素材来源于网络,如有侵权,请及时告知,我们会第一时间删除,谢谢! 邮箱:opceo@qq.com

    鄂ICP备2023003026号

    网站地图: 企业信息 工商信息 财税知识 网络常识 编程技术

    友情链接: 武汉网站建设