分页持久性(到位)与表格

时间:2014-12-11 15:07:21

标签: forms coldfusion pagination

我试图弄清楚如何在使用表单过滤查询后让分页工作。我已经设置了一个页面,其中它设置为显示所有结果,然后是3个下拉形式以过滤结果。我设置了每个页面上显示25行的prev / next链接。执行搜索并单击prev / next后,将返回显示所有结果。我还在努力学习CF,我一直在寻找和尝试不同的方法来实现这一点。我正在寻找一个快速的例子或方向,以便我可以学习如何做这个部分。我试图缩短它。如果您需要查看更多代码,请与我们联系。

以下是一些代码......

<cfparam name="FORM.persType" type="string" default="%">
<cfquery name="r" datasource="#datasourcename#">
    SELECT *
    FROM Table
    WHERE
    Sector LIKE '#FORM.persType#'
    ORDER BY ID
</cfquery>

<!--- pagination setup --->
<cfset perpage = 25>
<cfparam name="url.start" default="1">
<cfif not isNumeric(url.start) or url.start lt 1 or url.start gt r.recordCount or  round(url.start) neq url.start>
    <cfset url.start = 1>
</cfif>

<cfset totalPages = ceiling(r.recordCount / perpage)>
<cfset thisPage = ceiling(url.start / perpage)>
<cfset thisPage = Int(start / 25) + 1>

Here's the output and pagination part...
<cfoutput query="r" startrow-"#url.start#" maxrows="#perpage#">
<tr>
    <td>#r.reqStatus#</td>
    <td>#r.lastName#</td>
    <td>#r.firstName#</td>
</tr>
</cfoutput>
</table>

<!--- Pagination --->
[
<cfif url.start gt 1>
<cfset link = cgi.script_name & "?start=" & (url.start - perpage)>
<cfoutput><a href="#link#">Previous Page</a></cfoutput>
<cfelse>
Previous Page
</cfif>
/
<cfif (url.start + perpage - 1) lt r.recordCount>
<cfset link = cgi.script_name & "?start=" & (url.start + perpage)>
<cfoutput><a href="#link#">Next Page</a></cfoutput>
<cfelse>
Next Page
</cfif>
]

感谢您对此有任何帮助...... :)

2 个答案:

答案 0 :(得分:4)

凯瑟琳 - 这是你之前提出过的问题和答案。使用每个分页链接,您需要传递搜索参数。每一个都是一个新的请求,必须&#34;重新过滤&#34;。

以下是帮助您入门的线索:

在您执行LIKE查询的顶部,将代码更改为以下内容:

<cfparam name="FORM.persType" type="string" default="%">
<cfif structkeyexists(url,'persType')>
    <cfset FORM.perstype = url.persType/>
</cfif>

这将允许您提交一个&#34;表格&#34;元素或者&#34; url&#34; element - 它们在CF中被视为单独的范围。

然后,在您的分页部分中,将您的分页链接更改为以下内容:

<cfset link = cgi.script_name & "?start=" & (url.start - perpage) & "&persType=" & FORM.perstype/>

确保为代表分页的每个链接执行此操作。

完成后,您将传递用户选择的任何内容&#34; persType&#34;以及每个分页链接 - 这将允许您的查询成功重新运行并过滤。

还有一个注意事项 - 在您的描述中,您说您正在通过三个下拉列表进行过滤。每个下拉列表都将作为单独的变量,需要&#34;传递&#34;像上面的模式。祝你好运!

答案 1 :(得分:1)

好的后代。这是我的答案...... :((我忙于工作)

它提供:

  • 新参数集
  • 新的baseURL变量
  • 允许过滤的表单(基于我本地的表格)

所以这只是一个完整系统的思考。再次为后代,因为你标记另一个答案作为解决方案......

<cfparam name="url.pageNum" default="1">
<cfparam name="url.isDraft" default="-1">
<cfparam name="url.showNav" default="-1"> 

<cfquery name="q" datasource="#application.dsn#">
SELECT * 
FROM table  <!--- you may need more than just a simple select.--->
WHERE 1=1
<cfif url.isDraft eq 0>
AND isDraft = 0
</cfif>
<cfif url.showNav eq 0>
AND showNav = 0
</cfif>                   
</cfquery>

<cfoutput>
<form action="" method="get">
    <lable>Filter Pages that are still being drafted</lable>
    <select name="isDraft">
        <option value="-1">Pick One</option>
        <option value="1" <cfif url.isDraft eq 1>selected</cfif>>Yes</option>
        <option value="0" <cfif url.isDraft eq 0>selected</cfif>>No</option>
    </select>
    <label>Filter Pages that Should or should not show up in nagivation</label>
    <select name="showNav">
        <option value="-1">Pick One</option>
        <option value="1" <cfif url.showNav eq 1>selected</cfif>>Yes</option>
        <option value="0" <cfif url.showNav eq 0>selected</cfif>>No</option>
    </select>      
    <input type="submit" name="" value="submit">
</form><br>
</cfoutput>

<cfset maxRows=10>
<cfset startRow=min( ( pageNum-1 ) * maxRows+1, max( q.recordCount,1 ) )>
<cfset endRow=min( startRow + maxRows-1, q.recordCount )>
<cfset totalPages=ceiling( q.recordCount/maxRows )>

<!--- PaginationBaseUrl will change --->

<cfif url.isDraft eq 1 OR url.showNav eq 0>
    <cfset setBaseLink='./?isDraft='&url.isDraft&'&showNav='&url.showNav&'&'>
<cfelse>
    <cfset setBaseLink='./?'>
</cfif> 

<cfset loopercount = round( q.recordCount/10 )>

<cfoutput>
    <cfloop from="1" to="#looperCount#" index="i">
            <a href="#setBaseLink#pageNum=#i#">#i#</a>
    </cfloop>
</cfoutput> 

<br><br>

<cfoutput
    query="q" 
    startrow="#startRow#"
    maxrows="#maxRows#">

    #id#<br>

</cfoutput>