ColdfusionMXPageList菜鸟版教程
最初写的:
1、可以实现的功能:
首页,末页,上一页,下一页以及指定页的跳转。
首页末页有自动隐藏的功能。
跳转下拉菜单动态显示当前页码和总页数。
2、原理
核心原理参考Codefusion MX 附带的Compass Travel例子 中tripdetail.cfm的翻页原理。即假设当前页为第6页,对数据库进行查询,返回数maxRows 定为1,查上一页就是对小于6的数进行倒序查询,得出的结果是5,4,3...,因为只返回一个值,所以就得到了5。其他的同理。
3、使用方法
将代码放入要实现pagelist的地方,用查找替换修改里面的cfsnippets,centers和center_ID,把他们换成实际使用的数据库名,表名和字段名。
4、局限与不足
因为学cf不到一个星期,对cfml还不是很熟悉,所以有些代码还是很繁琐,我觉得不足的地方有:
(1)样式具有局限性,因为采用的是表单form,所以只能用button或图片来显示,不能用单纯的文字。
(2)修改还得要用查找替换。原来设想只改前面数据库定义的三个变量就可以,但后来发现在 cfout 里面使用查询的结果,必须要是确定的值,比如#gotopage.currentrow#,而不能再在里面使用动态参数,请问高手有什幺好的解决办法?
!--- 数据库定义 ---
cfset databasename="cfsnippets" !--- 数据库名 ---
cfset tablename="centers" !--- 表名 ---
cfset targetname="center_ID" !--- 字段名(一般为ID),定义这里的同时,还要用查找替换所有gotopage.center_ID里面的center_ID ---
!--- 处理跳转的动作 ---
cfif IsDefined("Form.RecordID") !--- 判断是否有跳转请求 ---
cfquery name="pageQuery" datasource="#databasename#" maxrows="1"
SELECT #targetname# FROM #tablename#
cfif IsDefined("Form.btnPrev") !--- 前一页页码 ---
WHERE #targetname# #Form.RecordID#
ORDER BY #targetname# DESC
cfelseif IsDefined("Form.btnNext") !--- 后一页页码 ---
WHERE #targetname# #Form.RecordID#
ORDER BY #targetname#
cfelseif IsDefined("Form.btnFirst") !--- 首页页码 ---
ORDER BY #targetname#
cfelseif IsDefined("Form.btnLast") !--- 末页页码 ---
WHERE #targetname# #Form.RecordID#
ORDER BY #targetname# DESC
cfelseif IsDefined("Form.goto") !--- 指定页码 ---
WHERE #targetname# = #Form.goto#
/cfif
/cfquery
cfif pageQuery.RecordCount is 1
cflocation url="#cgi.SCRIPT_NAME#?ID=#pageQuery.center_ID#" !--- 跳转 ---
cfelse
cflocation url="#cgi.SCRIPT_NAME#?ID=#page.RecordID#"
/cfif
/cfif
!--- 获取首页与末页所对应的ID ---
cfquery name="gotopage" datasource="#databasename#"
SELECT #targetname# FROM #tablename#
/cfquery
cfoutput query="gotopage"
cfif gotopage.currentrow is 1
cfset firstid=gotopage.center_ID !--- 首页对应的ID ---
cfelseif gotopage.currentrow is gotopage.recordcount
cfset lastid=gotopage.center_ID !--- 末页对应的ID ---
/cfif
/cfoutput
!--- 获取本页所对应的ID,如没有传递,默认为首页ID ---
cfif isdefined("url.id")
cfset pageid=url.id
cfelse
cfset pageid=firstid
/cfif
!--- 翻页主体部分 ---
form action="#cgi.SCRIPT_NAME#" method="post"
input type="hidden" name="RecordID" value=" cfoutput #pageid# /cfoutput " !--- 隐藏字段传送本页ID ---
!-- 首页/上一页--
cfif pageid neq firstid
input type="submit" name="btnFirst" value="首页"
input type="submit" name="btnPrev" value="上一页"
/cfif
!-- 页数 ,跳转--
B 跳转到: /B 第 select name="goto"
cfoutput query="gotopage"
cfif gotopage.center_ID is pageid
option value="#gotopage.center_ID#" selected #gotopage.currentrow# !--- 使本页的数字处于被选择状态 ---
cfelse
option value="#gotopage.center_ID#" #gotopage.currentrow#
/cfif
/cfoutput
/option /select / cfoutput #gotopage.recordcount# /cfoutput 页
input name="Go" type="submit" value="GO"
!-- 末页/下一页--
cfif pageid neq lastid
input type="submit" name="btnNext" value="下一页"
input type="submit" name="btnLast" value="末页"
/cfif
/form
后来发现不对劲,又进行了修改:
上面的代码只能用来list每页只有一个记录的page,如果一页有多个记录,上面的方法是不行的。
下面是我做了修改的代码,可以实现一个页面放多个记录了,每个页面放多少个记录可以在pagerow里面定义,此外也不需要通过查找替换来更改了,只要把初始化里面的四个参数定为自己相关的内容就行了,别的地方不需要改了。
代码比原来的又精简了不少 :)
!--- 初始化 ---
cfset databasename="cfsnippets" !--- 数据库名 ---
cfset tablename="centers" !--- 表名 ---
cfset targetname="center_ID" !--- 字段名(一般为ID) ---
cfset pagerow=1 !--- 每页记录数 ---
!--- 处理跳转的动作 ---
cfif IsDefined("Form.thispage") !--- 判断是否有跳转请求 ---
cfif IsDefined("Form.btnPrev") !--- 前一页页码 ---
cfset pageQuery=#Form.thispage#-1
cfelseif IsDefined("Form.btnNext") !--- 后一页页码 ---
cfset pageQuery=#Form.thispage#+1
cfelseif IsDefined("Form.btnFirst") !--- 首页页码 ---
cfset pageQuery=1
cfelseif IsDefined("Form.btnLast") !--- 末页页码 ---
cfset pageQuery=#Form.lastpage#
cfelseif IsDefined("Form.goto") !--- 指定页码 ---
cfset pageQuery=#Form.goto#
/cfif
cflocation url="#cgi.SCRIPT_NAME#?page=#pageQuery#" !--- 跳转 ---
/cfif
!--- 获取末页页码 ---
cfquery name="gotopage" datasource="#databasename#"
SELECT #targetname# FROM #tablename#
/cfquery
cfset lastpage=#gotopage.recordcount#\pagerow !--- 末页页码 ---
!--- 获取本页页码,如没有传递,默认为1 ---
cfif isdefined("url.page")
cfset pageid=url.page
cfelse
cfset pageid=1
/cfif
!--- 翻页主体部分 ---
form action="" method="post"
input type="hidden" name="thispage" value=" cfoutput #pageid# /cfoutput " !--- 隐藏字段传送本页ID ---
input type="hidden" name="lastpage" value=" cfoutput #lastpage# /cfoutput " !--- 隐藏字段传送末页页码 ---
!-- 首页/上一页--
cfif pageid neq 1
input type="submit" name="btnFirst" value="首页"
input type="submit" name="btnPrev" value="上一页"
/cfif
!-- 页数 ,跳转--
B 跳转到: /B 第 select name="goto"
cfloop index="pagenumber" from="1" to="#lastpage#"
cfoutput
cfif #pagenumber# is pageid
option value="#pagenumber#" selected #pagenumber# !--- 使本页的数字处于被选择状态 ---
cfelse
option value="#pagenumber#" #pagenumber#
/cfif
/cfoutput
/cfloop
/option /select / cfoutput #lastpage# /cfoutput 页
input name="Go" type="submit" value="GO"
!-- 末页/下一页--
cfif pageid neq lastpage
input type="submit" name="btnNext" value="下一页"
input type="submit" name="btnLast" value="末页"
/cfif
/form
呵呵,一个菜鸟版的pagelist终于完成,十分简单,用的方法也挺笨的。
ColdfusionMXPageList菜鸟版教程