ImageVerifierCode 换一换
格式:DOCX , 页数:14 ,大小:24.22KB ,
资源ID:6122275      下载积分:3 金币
快捷下载
登录下载
邮箱/手机:
温馨提示:
快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。 如填写123,账号就是123,密码也是123。
特别说明:
请自助下载,系统不会自动发送文件的哦; 如果您已付费,想二次下载,请登录后访问:我的下载记录
支付方式: 支付宝    微信支付   
验证码:   换一换

加入VIP,免费下载
 

温馨提示:由于个人手机设置不同,如果发现不能下载,请复制以下地址【https://www.bdocx.com/down/6122275.html】到电脑端继续下载(重复下载不扣费)。

已注册用户请登录:
账号:
密码:
验证码:   换一换
  忘记密码?
三方登录: 微信登录   QQ登录  

下载须知

1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。
2: 试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。
3: 文件的所有权益归上传用户所有。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 本站仅提供交流平台,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

版权提示 | 免责声明

本文(yii CActiveForm讲解.docx)为本站会员(b****6)主动上传,冰豆网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知冰豆网(发送邮件至service@bdocx.com或直接QQ联系客服),我们立即给予删除!

yii CActiveForm讲解.docx

1、yii CActiveForm讲解CActiveForm讲解CActiveForm提供了一些方法,这些方法能够方便的去创建一个与数据模型相关联的Form表单。CActiveForm继承自CWidget,所以他需要实现CWidget的init() 和 run() 方法,同时它也实现了一些自己的封装方法。CActiveForm很重要的一个特性就是它支持Ajax校验。我们可以设置CActiveForm的enableAjaxValidation属性为ture来启动Ajax校验。例如,当用户在input框中输入一些值后就会触发Ajax校验。CActiveForm会向服务器提交Ajax请求,用来校验用户当

2、前输入的值。服务器的校验一般是调用模型类Model的validate()方法。如果校验失败,相对应的错误信息将会被返回并显示给用户。即使用户在浏览器禁用javascript,他也会通过整个页面的提交自动回滚到传统的页面验证。在客户端,Yii认为input框可以存在四个状态:初始化,校验,错误和成功。为了区分这些状态,CActiveForm自动指定了不同的CSS样式给包含此input框的HTML element。默认情况下,这些CSS样式类的名字为:validating,error,success。当然我们可以使用CActiveForm的options属性去自定义他们。CActiveForm的提

3、交和校验是基于Ajax模式的。如果你的Form表单中有很大量的数据需要提交,那么这种Ajax模式的提交可能就不那么好了。这种情况下,你可以设计自己轻量级的Ajax校验。使用Yii对JQuery的支持?使用CActiveForm来做Ajax校验,我们需要使用两个JS库:jquery.js和jquery.yiiactiveform.js。他们的位置在工程根目录下:assets5ce53e17文件夹中。不用担心,这些JS库Yii会自动发布到你的工程中。虽然这些动作Yii会悄悄的做,当你必须知道。首先我们来看我们的模型类,这里我们使用CFormModel:class LoginForm extends

4、 CFormModel public $username; public $password; public function rules() return array( array(username, password, required), array(username, authenticate), ); public function authenticate($attribute,$params) if($this-username=admin) $this-addError(username,can not login with admin!); 我们的模型类非常简单,只有user

5、name和passsword两个属性。username的校验规则是不为空,且不能是“admin”,而password的校验规则只是不为空。注意,当我们检查到用户输入的username的值为“admin”时候,校验失败,我们添加错误信息为“can not login with admin”,这段信息会在页面中的Yii提供的error元素中输出。我们可以在rules方法中指定任何一条验证规则的错误信息,我们需要使用message属性。例如:array(username, required,message=not null),当username的内容为空的时候,我们会使用message指定的内容在页

6、面上显示错误信息。当然我们可以使用中文,如果出现乱码,可以这样设置:array(username, required,message=iconv(gb2312,utf-8,不能为空)你将main.php里的app配置加上language=zh_cn,系统默认的提示就是中文的了!其他验证规则案例:array(title, content, status, required),array(title, length, max=128),array(status, in, range=array(0, 1, 2),array(tags, match, pattern=/ws,+$/,message=

7、Tags can only contain word characters.),我们的页面代码如下:beginWidget(CActiveForm, array(id=login-form,enableAjaxValidation=true,action=array(site/login); ? labelEx($model,username); ? textField($model,username); ? error($model,username); ? labelEx($model,password); ? passwordField($model,password); ? error

8、($model,password); ? endWidget(); ?对于每一个模型属性的页面表示来说,我们都会有一个Label来说明其属性名,还有一个input框用来输入该属性值,最后有个error元素来显示校验失败时的错误信息。Yii对Form及其子元素封装的太多,我们将以上php代码翻译成静态页面为:Username *Password *Yii的Ajax的校验效果是通过CSS来实现的,上文提到一个input框可以存在四个状态:初始化,校验,错误和成功。每个状态对应不同CSS样式类。初始化和校验这两个状态我们不需要关心,我们只注重用户校验失败和成功时,该input框的CSS样式。此外当校

9、验失败的时候,我们还要定义错误信息的样式,从翻译过来的静态文本来来,我们需要定义errorMessage类。以下是我的CSS类:/*标签是否换行*/.form label font-size:12px; display:block; /*属性是否必填项,客户端根据model的rule方法而定*/.form span.required color:red; /*校验出错时标签CSS样式*/.form .error label color:#FFCC33; /*校验出错时输入框的CSS样式*/.form .error input background:#FEE; border-color:#C00

10、; /*校验出错时错误信息的CSS样式,我们可以设置其display属性让其不换行。*/.form .errorMessage display:inline; color:red; font-size:12px; /*校验成功时标签CSS样式*/.form .success label color:#000000; /*校验成功时输入框的CSS样式*/.form .success input background:#E6EFC2; border-color:#C6D880; 以上的CSS注释已经很详细了,我们来看看校验流程,首先我们需要先渲染我们的页面:$model = new LoginFo

11、rm;$this-render(index,array(model=$model);注意,这里我们必须使用render()方法对其进行渲染。我们的actionLogin如下:public function actionLogin() $model = new LoginForm; /ajax validate if(isset($_POSTajax) & $_POSTajax=login-form) echo CActiveForm:validate($model); Yii:app()-end(); /submit handle and validate if(isset($_POSTLog

12、inForm) $model-attributes = $_POSTLoginForm; if($model-validate() /no business logic handle $this-renderPartial(success); Yii:app()-end(); $this-render(index,array(model=$model);当input框失去焦点的时候,页面会向服务器提交Ajax请求,服务器端就会根据模型类LoginForm中定义的校验规则就其就行验证。如果校验成功,则input框会按指定的success样式类去显示,如果校验失败,则input框会按指定的erro

13、r样式类去显示,同时还会按照errorMessage指定的样式类显示错误信息。需要注意的是,如果我们对用户输入的信息进行了校验,而且有可能校验失败,但是用户在校验失败的情况下,仍然可以提交Form表单。所以当用户提交Form表单的处理代码中,我们仍需要对用户的输入进行校验。CActiveForm其他组件的使用1 textArea这个组件没有太多讲的,主要注意行列的属性配置,使用代码:textArea($model,textArea,array(rows=10,cols=50); ?2 fileField虽然Yii封装了这个组件,但是它并没有做更多的支持,它的上传需要更多的配置,它也不支持Aja

14、x校验。使用代码:fileField($model,fileField); ?3 radioButtonList这是一个radio集合组件。使用代码:radioButtonList($model,radioButtonList, array(1=Male,0=Female), array(separator= ,labelOptions=array(class=radiolabel)?Yii框架封装的元素集合组件大致为4个参数:$model,$property,$data,$htmlOptios前面两个参数是我们关联模型类和指定的属性。第三个参数是一个数组,他是元素集合组件的数据来源

15、,上面的代码中配置了两个数组元素,则会对应生成两个radio,radio的值为1或者0,radio的标签为Male或者Female。Yii默认将两个radio之间使用间隔,即两个radio不在同一行上,我们可以使用separator属性更改其间隔方式,这里我们使用空格符来间隔两个radio,这样他们显示在同一行上。另外在同一个radio中,其标签和实体也是换行的,原因在于标签会换行,我们可以给label标签添加CSS样式,改变其display值为inline将其与radio实体排列在一行。radioButtonList对应模型类中的属性值不是数组,只是一个单一数值或者字符而已,虽然他是一个集合

16、组件,但是他是单选的,所以最终只有一个单一值提交服务器端。另外值得注意的是,Yii封装的这些组件的初始值不能够在标签中设置,Yii自动会从模型类中读取属性值,然后在组件上显示出来。所以,如果你想在页面渲染前初始化一些组件的默认值,那么你可以直接初始化模型类就可以了。4 checkBoxList这是一个checkBox集合组件,使用代码:checkBoxList($model,checkBoxList, array(1=Football,2=Music,3=Game,4=basketball), array(separator= ,labelOptions=array(class=ch

17、eckboxlabel)?这个组件同上,唯一不同的是这个组件是多选的,所以他对应的模型类的属性应该是一个数组。这个组件将你选中的每个checkBox的值构造成一个数组提交服务器端。例如我们选中了Football和Game,那个该组件构造的数组将是array(1,3),没有选中的checkBox不会被构造进这个数组中。反之从服务器段读取数组,然后显示该组件也是同样的道理。5 listBox本质上它是一个select,但是它会显示所有的option。使用代码如下:listBox($model,listBox, array(1=Football,2=Music,3=Game,4=basketball

18、), array(size=8,multiple=false,class=listbox) )?需要说明的属性size表示该select的大小,虽然我只定义了4个option,但是我仍然想让它占据8个option的高度。属性multiple为是否多选。属性class为select的CSS样式类,但是貌似不起作用。在需要说明的一点是,虽然它可以单选和多选,但是他对应的模型类的属性始终是一个数组。6 dropDownList本质上它是一个真正意义上select,因为他不会显示所有的option,使用代码如下: findAll(array(order=age);$list = CHtml:listD

19、ata($models,id,username);echo $form-dropDownList($model,dropDownList,$list,array(empty=Select a user) )?这个组件的使用跟select差不多,对应模型层的属性是一个单一数值或者字符,而不是数组。属性empty指定了select的第一个option,相当于初始化值。这里我们需要说明的是以上这些集合组件的数据来源。本质上其实我们就是查询数据库,将结果集封装成一个数组,其实查询数据结果集本来就是一个数组。这里我们使用AR类person按年龄查询所有的记录,然后使用CHtml的listData方法将查

20、询记录中的id字段和username字段构造成一个简单的数组$list,然后我们只需要在dropDownList的标签配置中应用即可。最后我们介绍一下服务器端获取页面数据,因为我们已经将模型类和我们的页面标签相关联,所以使用标签显示模型类属性或者从显示标签中获取模型类属性是十分简单的。在服务器端我们获取页面数据的时候,可以使用如下代码:$model = new Form;$model-attributes = $_POSTForm;以上代码会将用户提交的数据自动填充到模型类的属性中,这个方式称为安全特性分配。首先我们的页面中必须已经将标签和模型类Form关联。需要注意的是$_POST的参数就是

21、模型类的名称Form,而不是标签名称。最重要的问题在于我们模型类中的属性必须是安全的,否则我们的安全特性分配将会失败。指定模型类中的属性为安全的是通过实现模型类中的Rules方法,即校验规则方法。我们可以直接将模型类的指定属性指定为”safe”或者指定其他校验规则,因为Yii因为如果一个属性通过某个校验后它就可以被认为是安全的了。public function rules() return array( array(property,safe) );CactiveDataProvider讲解CactiveDataProvider是基于ActiveRecord的一个数据提供者,同时它也继承自CD

22、ataProvider。它提供了ActiveRecord对象的集合。我们可以使用“modelClass”属性指定CactiveDataProvider所要提供的ActiveRecord对象的类型。CactiveDataProvider可以使用AR方法CActiveRecord:findAll从数据库中检索信息。它还可以使用criteria来指定查询条件,排序以及分页等等。CActiveDataProvider的时候方法如下:$dataProvider=new CActiveDataProvider(Post, array(criteria=array(condition=status=1 AN

23、D tags LIKE :tags,params=array(:tags=$_GETtags),with=array(author),),pagination=array(pageSize=20,currentPage=0,),);在Yii的blog案例中,很很多地方用到了CactiveDataProvider,尤其是在读取很多数据且需要分页的情况下,CactiveDataProvider是很出色的。CactiveDataProvider只是一个数据的集合,并不是一个显示组件,所以在blog案例中,它是和CGridView一起使用的,CGridView确切的说是一个使用表格显示数据的widge

24、t。其实包含了很多的封装,在这里我们不是用CGridView,只使用CActiveDataProvider来进行分页查询。使用CActiveDataProvider进行分页查询最重要的是“currentPage”属性,默认它是0。在以上的CActiveDataProvider使用代码中,我们配置了它的两个属性:criteria和pagination。Criteria属性值就是CDbCriteria类的实例,而pagination值并非一个CPagination类的实例,而是一个数组而已。实例化CPagination类需要表中记录总数作为参数。以下是我action的代码:public funct

25、ion actionPage() $currentPage = 0; $pageSize = 5; if(isset($_GETid) $currentPage = $_GETid; $criteria = new CDbCriteria(array(order=age desc,); $pagination = array(currentPage=$currentPage,pageSize=$pageSize,); $dataProvider = new CActiveDataProvider(person,array(pagination=$pagination,criteria=$cri

26、teria,); $totalItemCount = $dataProvider-getTotalItemCount(); $pageCount = ceil($totalItemCount/$pageSize); $itemCount = $dataProvider-getItemCount(); $page = array(totalItemCount=$totalItemCount,pageCount=$pageCount,itemCount=$itemCount,currentPage=$currentPage,); $data = $dataProvider-getData(); $this-render(all,array(data=$data,page=$page,);以上代码我们将数据信息data和分页信息page分开存放,并传递到被渲染的页面。上文提到了“currentPage”,其实是CPagination类的一个属性,它默认

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1