2014-12-03 3 views
3

Во-первых, я очень новичок в ColdFusion, но изучаю довольно быстро. Поэтому я пытаюсь создать большую базу данных, которая изначально выводит все результаты с 25 строк на страницу и имеет следующую/предыдущую ссылку для навигации по страницам.Coldfusion and Pagination

Все работает нормально, но когда я выполняю поиск, и когда новые результаты показывают примерно на пару страниц, ссылки на страницы не работают. Когда я нажимаю на «следующую» ссылку, она возвращается к исходному экрану всех записей. Как я могу исправить это или что мне нужно сделать, чтобы он работал?

Извините, что я новичок в размещении, и это мой первый. Надеюсь, это лучше.

Мой пагинация код ...

<cfset Next = StartRow + DisplayRows> 
<cfset Previous = StartRow - DisplayRows> 

<cfoutput> 
    <cfif Previous GTE 1> 
    <a href="#CGI.Script_Name#?StartRow=#Previous#"><b>Previous #DisplayRows# Records</b></a> 
    <cfelse> 
    Previous Records 
    </cfif> 
    <b> | </b> 
    <cfif Next lte records.RecordCount> 
    <a href="#CGI.Script_Name#?StartRow=#Next#"><b>Next 
    <cfif (records.RecordCount - Next) lt DisplayRows> 
     #Evalute((records.RecordCount - Next)+1)# 
    <cfelse> 
     #DisplayRows# 
    </cfif>Records</b></a> 
    <cfelse> Next Records 
    </cfif> 
<cfoutput> 

Мой код на вершине ...

<cfparam name="StartRow" default="1"> 
<cfparam name="DisplayRows" default="25"> 

<cfset ToRow = StartRow + (DisplayRows - 1)> 
<cfif ToRow gt records.RecordCount> 
    <cfset ToRow = records.RecordCount> 
</cfif> 

Позвольте мне знать, если вам нужно, чтобы увидеть больше ... спасибо.

+2

Вам необходимо отправить код. Не весь сценарий, а только части, относящиеся к разбивке на страницы. – Leigh

+1

Вам не нужно оценивать() - # (records.recordcount - next) + 1 # будет выводиться просто отлично. –

+1

Я бы изменил ваш параметр страницы, чтобы быть 'PageNumber', а не' StartRow', имеет смысл с точки зрения пользователей ссылаться на pagenumbers, а не на запуск. – Jarede

ответ

0

Вот пример, который я взбивал (извините, если он краток), и он охватывает вещи, которые вы уже обсуждали с Марком. Мне также нравятся примеры Марка <cfloop> (см. Ниже). Lol ... Где бы ни был этот ответ.

Итак, мы имеем:

  • RecordCount запрос (макс)
  • начиная с вашего диапазона
  • заканчивающегося в вашем диапазоне
  • выход на странице

С бонусной pageNum querystring для вашей следующей группировки записей (которая, я думаю, вам нравится).

Тогда это может выглядеть на странице:

<cfparam name="pageNum" default="1"> 

<cfquery name="q" datasource="#application.dsn#"> 
    select * from yourTable 
</cfquery> 

<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)> 

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

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

<br><br> 

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

    #id#<br> 

</cfoutput> 
+0

спасибо за этот код ... это хорошая настройка, и с ней я могу определенно работать. :) – CatherineL

+0

@CatherineL Добро пожаловать! Я решил, что упрощенная/полная упаковка была бы полезной :) Редактировать ... Кроме того, если это решило вашу конкретную проблему, нажмите на эту милую зеленую галочку для меня! –

+0

Я бы нажал на зеленый чек, но это не решило мою проблему. Он по-прежнему сбрасывается на все результаты, когда я нажимаю на следующую страницу или номер. Я все еще выясняю, как это сделать. – CatherineL

0

Вам нужно показать, как вы на самом деле осуществляете навигацию в своем коде - вот где секретный соус похоронен. У вас есть все, что вам нужно (может быть, больше, чем вам нужно).

У вас, вероятно, есть где-то код cfoutput или cfloop. Вы могли бы использовать ваш StartRow и displayrows вывести определенное количество строк из записей - например, так:

<Cfoutput query="records" startrow="#next#" maxrows="#displayrows#"> 

... code to output your data goes here 

</cfoutput> 

Если вы используете cfloop он похож.

<Cfloop query="records" startrow="#next#" endrow="#next+displayrows#"> 

...code to output your data. 

</cfloop> 

Вы также можете использовать цикл индекса так:

<cfloop from="#next#" to="#next+displayrows#" index="x"> 

.... your outputs will look like this: 
#records[columname][x]# 

</cfoutput> 

Будем надеяться один из этих образцов будет звонить колокол. Логика, которую вы вставляете в фрагменты кода, создает только начальную точку и определяет, сколько циклов. Это выход, который дразнит выводимые записи.

Также обратите внимание на комментарий - вы почти никогда необходимо evaluate() в вашем коде.

+0

Теперь у меня есть настройка, подобная первой, которую вы указали. Есть ли лучший способ сделать это? – CatherineL

+1

Перечитывая свой вопрос Кэтрин, похоже, что вы не проходите по параметрам поиска. Ссылка Eeach на каждую новую страницу должна повторить запрос _search_ - и, следовательно, вам нужно будет включить переменные поиска в ссылки для разбивки на страницы. Возможно, это твоя проблема? –

+0

Хорошо, я тоже так думал, но не знаю, как это сделать ... есть ли простой способ/пример того, как это сделать? Или вы можете направить меня туда, где я могу узнать, как это сделать? – CatherineL

-1

Я работал на это, используя cfform тег BACK - MORE - HOME кнопки отправки.

На первой странице были запрошены идентификаторы от 1 до 25 и кнопка «Отправить». скрытое поле было граф 25

На следующей странице была НАЧАЛО и больше кнопок Главная имел скрытое поле 1 Далее было скрытое поле подсчета + 25 (50)

На следующей странице была НАЗАД НАЧАЛО и более кнопки Назад имели скрытое поле графа - 25 HOME имел скрытое поле 1 MORE был скрытое поле графского + 25 (75)

и так далее.

запроса используется количество скрытого поля в зависимости от значения кнопки SUBMIT для создания запроса, в котором и вывода 25 строк

<cfif submit IS "NEXT"> 

    <cfset count1 = #count# + 1> 
    <cfset count2 = #count# + 25> 

<cfelseif submit is "BACK"> 

    <cfset count1 = #count# - 26> 
    <cfset count2 = #count#> 

<cfelseif submit is "HOME"> 

    <cfset count1 = 1> 
    <cfset count2 = 25> 

</cfif> 

В запросе

SELECT * 
FROM mytabl 
WHERE ID BETWEEN #count1# AND #count2# 

Дисплей

<table> 
    <cfoutput query="myquery"> 
    <tr> 
     <td> 
     #my data1# 
     </td> 
     <td> 
     #my data2# 
     </td> 
    </cfoutput> 
    </tr> 
    <table> 
+0

Не предполагайте, что id являются смежными, поскольку логика разбиения на страницы ломается, если записи удаляются. В коде может отображаться слишком мало записей или, возможно, вообще нет. Кроме того, всегда используйте 'cfqueryparam'. Он использует переменные связывания для защиты от SQL-инъекций и повышения производительности. – Leigh

+0

Я не знаю, почему я состыкован, пытаясь помочь. В таком случае вы можете быть в числе первых 25 записей, и ваш скрытый может быть последним ID ... Я просто пытался дать CatherineL отправную точку ... – Andy

+0

Я проголосовал за это, потому что это неверно и не будет работать надежно. Кроме того, sql предоставляет базу данных для SQL-инъекции. Скрытый полевой подход страдает одной и той же логической проблемой. Значение ID! = Номер записи. Хотя помощь всегда ценится, важно предоставить точную информацию. Особенно для тех, кто не знаком с языком. – Leigh