仓酷云

 找回密码
 立即注册
搜索
热搜: 活动 交友 discuz
查看: 534|回复: 8
打印 上一主题 下一主题

[学习教程] PHP编程:yii_CGridView_ajax_pagination_and_aj...

[复制链接]
精灵巫婆 该用户已被删除
跳转到指定楼层
楼主
发表于 2015-1-16 22:13:43 | 只看该作者 回帖奖励 |正序浏览 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
可以在书上很方便地做标记,及时记下自己的心得体会。本文次要内容:1,一般情形下CGridView完成Ajax分页和排序的道理2,分页和排序没法Ajax的情形剖析3,自界说分页(重写CLinkPager)后怎样完成Ajax分页和排序/***author:php攻城师http://blog.csdn.net/phpgcs***/[php]<?php$this->widget(zii.widgets.grid.CGridView,array(id=>keyword-grid,dataProvider=>$model->search(),CSSFile=>false,template=>{items}<divclass="page_area">{pager}{summary}</div>,pager=>array(cssFile=>false),ajaxUpdate=>true,columns=>array(array(name=>leader_name,value=>$data->event,header=>关头词称号,headerHtmlOptions=>array(width=>130px),),........以上代码完成一个惯例的CGridView,除pager用了自界说的款式。。而在页面的源代码中,我来找出相干的部分:[javascript]<scripttype="text/javascript"src="/chuanmei/assets/f5d36ac5/jquery.ba-bbq.js"></script>[javascript]viewplaincopyprint?<scripttype="text/javascript"src="/chuanmei/assets/fb90bba/gridview/jquery.yiigridview.js"></script><scripttype="text/javascript">/*<![CDATA[*/jQuery(function($){jQuery(#keyword-grida.delete).live(click,function(){if(!confirm(断定要删除这条数据吗?))returnfalse;varth=this;varafterDelete=function(){};$.fn.yiiGridView.update(keyword-grid,{type:POST,url:$(this).attr(href),success:function(data){$.fn.yiiGridView.update(keyword-grid);afterDelete(th,true,data);},error:function(XHR){returnafterDelete(th,false,XHR);}});returnfalse;});jQuery(#keyword-grid).yiiGridView({ajaxUpdate:[1,keyword-grid],ajaxVar:ajax,pagerClass:pager,loadingClass:grid-view-loading,filterClass:filters,tableClass:items,selectableRows:1,pageVar:keyword_page});});/*]]>*/</script>个中会发明yii主动加载了jquery.ba-bbq.js&&jquery.yiigridview.js,和2段代码个中一段是用来完成删除一行数据时弹出提醒框让用户确认是不是删除功效的;一段是最中心关头的用于ajaxupdategrid的,也恰是这部分代码完成了ajax的翻页和排序。/***********我是支解线*******************************/假如发明点击了分页大概排序后,不是ajax体例的(也就是你能够在地点栏中看到每次哀求的经常的url)一个要反省的中央:ajaxUpdate=>,这个参数updateSelector=>,这个参数/***********我是支解线*******************************/一样平常情形下,CLinkPager都没法满意我们的需求,要重写;而重写我这里供应3种体例:1,禁用CGridView本人的Pager,在CGridView以外本人写2,禁用CGridView本人的Pager,重写CGridView文件,将本人的pager写在publicfunctionrenderItems()中3,设置CGridView的pager参数。以下是默许的CLinkPager的模样翻页:<前页123后页>如今我们想要以下的Pager效果第31-40条,共14546条上一页12345678910下一页/***author:php攻城师***/先看第1种重写计划:重写CLinkpager以下:[php]$this->widget(CLinkPager,array(header=>第.($paginationTop->getCurrentPage()*$paginationTop->getPageSize()+1).-.($paginationTop->getCurrentPage()*$paginationTop->getPageSize()+$paginationTop->getPageSize()).条,共.$paginationTop->getItemCount().条,pages=>$paginationTop,itemCount=>$totalItemFoundCount,prevPageLabel=>上一页,cssFile=>false,nextPageLabel=>下一页,footer=>,));个中的pagination在controller中天生[php]$paginationTop=newCPagination($totalItemFoundCount);$paginationTop->pageSize=$pageSize;然后把重写的CLinkPager放在CGridView后面便可。运转后发明一个Bug,就是分页不是Ajax的。不是Ajax的没关系,关头是分页和排序不克不及分离利用了。缘故原由很复杂,分页不是ajax的,而排序是ajax的,两个哀求收回后url不在一个中央,那末分页参数和排序参数就不再一中央,固然没法分离利用。办理计划:一致起来。要末一致为url排序&分页,要末一致为ajax排序&分页。url的复杂,设置ajaxUpdate=>false,ajax的也复杂,只需了解了本文第一部分说的ajax排序的道理,之以是不克不及够ajax分页,是由于我们的分页是重写了,并且还放在了CGridView以外,如许怎样让jQuery(#keyword-grid).yiiGridView({ajaxUpdate:[1,keyword-grid],ajaxVar:ajax,pagerClass:pager,loadingClass:grid-view-loading,filterClass:filters,tableClass:items,selectableRows:1,pageVar:keyword_page});ajaxUpdate的时分还往照应到你写在表面的CLinkPager呢?设置2个参数:ajaxUpdate=>datalist-grid,yw0,updateSelector=>.pagera,theadtha,原本ajaxUpdate的感化局限只是datalist-gird,如今我们告知他还要感化在我们重写在grid表面的分页ul,其id是yw0.updateSelector指定了触发ajaxUpdate这个举措的html元素,也是要包管包括了分页的链接和排序的链接,不然也是没法乐成ajax排序/分页。再看第2种重写计划:下面第一种计划太庞大了把,既然成绩的中心关头是没有把自界说的ClinkPager放在CGridView中,那我们就重写CGridView将其放出来呗。对,的确是可行的。[php]<?phpYii::import(zii.widgets.grid.CGridView);classEbuCGridViewextendsCGridView{/***Rendersthedataitemsforthegridview.*/publicfunctionrenderItems(){if($this->dataProvider->getItemCount()>0$this->showTableOnEmpty){$this->renderCustomerPager();echo"<tableclass="{$this->itemsCssClass}">
";$this->renderTableHeader();ob_start();$this->renderTableBody();$body=ob_get_clean();$this->renderTableFooter();echo$body;//TFOOTmustappearbeforeTBODYaccordingtothestandard.echo"</table>";$this->renderCustomerPager();}else$this->renderEmptyText();}public$paginationTop;public$totalItemCount;public$totalItemFoundCount;publicfunctionrenderCustomerPager(){$paginationTop=$this->paginationTop;$totalItemCount=$this->totalItemCount;$totalItemFoundCount=$this->totalItemFoundCount;echo<divclass="page_area"style="text-align:right;">;echo<divclass="pager">;$this->widget(CLinkPager,array(header=>第.($paginationTop->getCurrentPage()*$paginationTop->getPageSize()+1).-.($paginationTop->getCurrentPage()*$paginationTop->getPageSize()+$paginationTop->getPageSize()).条,共.$paginationTop->getItemCount().条,pages=>$paginationTop,itemCount=>$totalItemFoundCount,prevPageLabel=>上一页,cssFile=>false,nextPageLabel=>下一页,footer=>,));....第3种计划:前2种计划,说假话,都太贫苦了,损坏了yii本身的机制,又在其上填补了半天。。最好的计划,仍是设置CGridView的pager,来完成我们要更庞大的CLinkPager的方针。可是,有些时分还真必需用第1、2种计划;好比我使用的情形是:用Coreseek全文索引查询出数据的id,再用id离开数据库中找出数据,构成CActiveDataProvider,最初用CGridView来展现。我这里的CDbCriteria以下[php]$criteria=newCDbCriteria;$criteria->join=LEFTJOINsite2ASsi**ONt.**=**.domain_hash;$criteria->addInCondition(t.id,$IDARRAY);$criteria->select=array("t.id","t.content","t.pubtime","t.url","t.reply_num","t.retweet_num","site_config.site_name");$criteria->order=FIND_IN_SET(t.id,".join(",",$IDARRAY).");个中变量IDARRAY恰是coreseek失掉的一个id构成的数组假如依照一般的[php]$dataProvider=newCActiveDataProvider(TData,array(criteria=>$criteria,pagination=>array(pageSize=>10,),));是不满意我的需求的。由于我的分页和排序都是在coreseek中完成的,这里用CActiveDataProvider只是供应了以后页(好比每页10笔记录)的10笔记录。end。有更好的倡议和定见,接待提出配合进修。不过语法好学,但是怎么用语法来实现每个人都有每个人的方式,几乎是各有千秋。然而借鉴别人成功的代码,绝对是有益无害,因此,多看那些经过千锤百炼凝出来的经典代码,是进阶的最好方法。
老尸 该用户已被删除
9#
发表于 2015-3-25 10:23:01 | 只看该作者
因为blog这样的可以让你接触更多要学的知识,可以接触用到类,模板,js ,ajax
活着的死人 该用户已被删除
8#
发表于 2015-3-18 02:44:39 | 只看该作者
对于懒惰的朋友,我推荐php的集成环境xampp或者是wamp。这两个软件安装方便,使用简单。但是我还是强烈建议自己动手搭建开发环境。
只想知道 该用户已被删除
7#
发表于 2015-3-11 08:46:30 | 只看该作者
小鸟是第一次发帖(我习惯潜水的(*^__^*) 嘻嘻……),有错误之处还请大家批评指正,另外,前些日子听人说有高手能用php写驱动程序,真是学无止境,人外有人,天外有天。
admin 该用户已被删除
6#
发表于 2015-3-3 02:06:29 | 只看该作者
有位前辈曾经跟我说过,phper 至少要掌握200个函数 编起程序来才能顺畅点,那些不熟悉的函数记不住也要一拿手册就能找到。所以建议新手们没事就看看php的手册(至少array函数和string函数是要记牢的)。
莫相离 该用户已被删除
5#
发表于 2015-2-12 09:07:34 | 只看该作者
为了以后维护的方便最好是代码上都加上注释,“予人方便,自己方便”。此外开发文档什么的最好都弄齐全。我觉得这是程序员必备的素质。虽然会消耗点很多的时间。但是确实是非常有必要的。
山那边是海 该用户已被删除
地板
发表于 2015-2-5 14:42:41 | 只看该作者
使用 jquery 等js框架的时候,要随时注意浏览器的更新情况,不然很容易发生框架不能使用。
第二个灵魂 该用户已被删除
板凳
发表于 2015-1-27 21:52:47 来自手机 | 只看该作者
如果你可以写完像留言板这样的程序,那么你可以去一些别人的代码了,
愤怒的大鸟 该用户已被删除
沙发
发表于 2015-1-19 05:13:18 | 只看该作者
爱上php,他也会爱上你。
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|Archiver|手机版|仓酷云 鄂ICP备14007578号-2

GMT+8, 2024-9-20 22:48

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表