Coldfusion MX PageList 菜鸟版教程

    最初写的: 

    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终于完成,十分简单,用的方法也挺笨的。