我试图弄清楚如何在使用表单过滤查询后让分页工作。我已经设置了一个页面,其中它设置为显示所有结果,然后是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>
]
感谢您对此有任何帮助...... :)
答案 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)
好的后代。这是我的答案...... :((我忙于工作)
它提供:
所以这只是一个完整系统的思考。再次为后代,因为你标记另一个答案作为解决方案......
<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>