Код пагинации не сохраняет дополнительные фильтры

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

Вот мой код для фильтрации:

<cfparam name = "site_name" default = ""/>
<cfparam name = "site_cat" default = ""/>
<cfparam name = "site_region" default = ""/>
<cfparam name = "site_area" default = ""/>
<cfparam name = "query_condition" default = ""/>

<cfset flcr = StructNew()/>
<cfset flcr.site_name = "#site_name#"/> 
<cfset flcr.site_cat = "#site_cat#"/> 
<cfset flcr.site_region = "#site_region#"/> 
<cfset flcr.site_area = "#site_area#"/> 

<cfif StructKeyExists(Form,"btn_search")>
    <cfloop collection = "#flcr#" item = "key">
        <cfif #len(trim(flcr[key]))# gt 0>
            <cfset queryCases = ["SITE_NAME","SITE_CAT","SITE_REGION","SITE_AREA"]/>

            <cfif #arraycontains(queryCases,key)# eq "yes">
                <cfif #len(trim(query_condition))# gt 0>
                    <cfset query_condition &= " AND "/>
                <cfelse>
                    <cfset query_condition &= " WHERE "/>
                </cfif>
            </cfif>

            <cfswitch expression = #key#>
                <cfcase value = "SITE_NAME">
                    <cfset site_name = "#flcr[key]#"/>
                    <cfset query_condition &= "site_name LIKE '#flcr[key]#%'" />
                </cfcase>

                <cfcase value = "SITE_CAT">
                    <cfset site_cat = "#flcr[key]#"/>
                    <cfset query_condition &= "site_type LIKE '#flcr[key]#%'"/>
                </cfcase>                

                <cfcase value = "SITE_REGION">
                    <cfset site_region = "#flcr[key]#"/>
                    <cfset query_condition &= "region = '#flcr[key]#'"/>
                </cfcase>                

                <cfcase value = "SITE_AREA">
                    <cfset site_area = "#flcr[key]#"/>
                    <cfset query_condition &= "area = '#flcr[key]#'"/>
                </cfcase>
            </cfswitch>
        </cfif>
    </cfloop>     
</cfif>
<cfset viewAll = "SELECT * FROM tblcellsites" & #query_condition#/>
<cfset orderBy = " ORDER BY site_count"/>
<cfset final_sql = #viewAll# & #orderBy#/>
<cfset final_final_sql = #replace(final_sql,"'","''","all")#/>
<cfset filterQuery = #site.filterQuery(final_sql)#/>

Разбивка на страницы

    <table class="table">
        <thead class="thead-light">
            <tr>
                <th scope="col">Site Count</th>
                <th scope="col">Site Name</th>
                <th scope="col">Region</th>
                <th scope="col">Area</th>
                <th scope="col">Site Type</th>
            </tr>
        </thead>

        <tbody>
            <cfparam name = "pageNum" default = "1"/>
            <cfset viewAllSite = #filterQuery#/>
            <cfset maxRows = 10/>
            <cfset startRow = min( ( pageNum-1 ) * maxRows+1, max( viewAllSite.recordCount,1 ) )/>
            <cfset endRow = min( startRow + maxRows-1, viewAllSite.recordCount )/>
            <cfset totalPages = ceiling( viewAllSite.recordCount/maxRows )/>

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

            <cfoutput query="viewAllSite" startrow="#startRow#" maxrows="#maxRows#">
                <tr>
                    <td>#site_count#</td>
                    <td>#site_name#</td>
                    <td>#region#</td>
                    <td>#area#</td>
                    <td>#site_type#</td>
                </tr>
            </cfoutput>
        </tbody>

    </table>
    <!-- Table Content -->
</div>

<!-- Pagination -->
<div class = "row" align = "center">
    <div class = "col-md-12">
    <cfoutput>
        <cfloop from="1" to="#looperCount#" index="i">
            <span id="#i#" class="current-page"><input type ="submit" name = "btn_page" value ="#i#"></span>
        </cfloop>
    </cfoutput> 
        </form>
    </div>
</div>
<!-- Pagination -->

Я ожидал, что фильтр будет перенесен на следующие страницы, но кажется, что переменные для фильтрации и условия запроса очищаются, когда я добавляю pageNum к своему URL-адресу.

Заранее спасибо.


person MsWiggles    schedule 31.07.2019    source источник
comment
Два быстрых комментария: 1) символы # в вашем первом блоке практически не нужны. raymondcamden.com/2011/06/ 13/ 2) Остерегайтесь SQL-инъекций bobby-tables.com/coldfusion   -  person Shawn    schedule 31.07.2019
comment
А какую версию CF вы используете?   -  person Shawn    schedule 31.07.2019
comment
Я использую CF 2018 :)   -  person MsWiggles    schedule 31.07.2019
comment
Я ожидал, что фильтр будет перенесен на следующие страницы... переменные... очищаются, когда я добавляю pageNum к моему URL-адресу. Это произойдет только в том случае, если вы передадите эти значения в URL/форме, которая переходит на следующую страницу. Я не вижу, где вы строите URL-адрес в приведенном выше коде. Не могли бы вы отредактировать свой вопрос, чтобы включить его?   -  person SOS    schedule 31.07.2019


Ответы (1)


Я просто собираюсь сосредоточиться на части ссылки.

<!-- Pagination -->
<cfoutput>
<div class = "row" align = "center">
    <div class = "col-md-12">
        <form action="?" method="post">
           <input type="hidden" name="site_name" value="#EncodeForHTMLAttribute(site_name)#" />
           <input type="hidden" name="site_cat" value="#EncodeForHTMLAttribute(site_cat)#" />
           <input type="hidden" name="site_region" value="#EncodeForHTMLAttribute(site_region)#" />
           <input type="hidden" name="site_area" value="#EncodeForHTMLAttribute(site_area)#" />


           <cfloop from="1" to="#looperCount#" index="i">
             <input type ="submit" name = "btn_page" value ="#i#" />
           </cfloop>

        </form>
    </div>
</div>
</cfoutput> 
<!--/ Pagination -->

После публикации

После публикации данных проверьте, чтобы убедиться, что вы получаете поля, которые вы ожидаете.

 <cfdump var="#form#">

Вместо создания новой структуры под названием flcr = StructNew() просто используйте структуру form.

ОТ

То, как вы строите SQL, действительно странно. Есть более чистые подходы к этому. Я бы порекомендовал создать вопрос о том, как его очистить

person James A Mohler    schedule 01.08.2019