spec/lib/controls/paginator.cfm
2025-06-02 16:16:51 +03:00

80 lines
3.6 KiB
Plaintext
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

<cfparam name="nStart" type="integer" default="1"/>
<cfparam name="ATTRIBUTES.recordCount" type="integer"/>
<cfparam name="ATTRIBUTES.recordsPerPage" type="integer"/>
<cfparam name="ATTRIBUTES.thisPage" type="string" default=""/>
<cfparam name="ATTRIBUTES.addtionalUrlParams" type="string" default=""/>
<cfparam name="ATTRIBUTES.self" type="string" default=""/>
<!---<cfparam name="ATTRIBUTES.fwx" type="string" default=""/>--->
<cfparam name="ATTRIBUTES.output" type="string" default="paginator"/>
<!--- Исключение: рассчитанный индекс страницы превышает количество существующих страниц - надо возвращаться на первую --->
<cfset nPages = Int((ATTRIBUTES.recordCount-1)/ATTRIBUTES.recordsPerPage)+1/>
<cfset nCurrentPage = Int((nStart-1)/ATTRIBUTES.recordsPerPage)+1/>
<cfif nStart GT ATTRIBUTES.recordCount>
<cfset nStart=1/>
</cfif>
<cfset UrlSuffix=""/>
<cfif len(ATTRIBUTES.addtionalUrlParams) GT 0>
<cfset UrlSuffix="&#ATTRIBUTES.addtionalUrlParams#"/>
</cfif>
<cfif len(ATTRIBUTES.self) GT 0>
<cfset UrlSuffix="&track=#ATTRIBUTES.self#"/>
</cfif>
<cfset somePages=3/>
<cfsavecontent variable="pages">
<cfif ATTRIBUTES.recordCount GT ATTRIBUTES.recordsPerPage>
<cfset doMerge = false/>
<cfloop index="i" from="1" to="#nPages#">
<cfset nPageStartRecordNum=(i-1)*ATTRIBUTES.recordsPerPage+1>
<!---
схема, которая обеспечивает дихотомический поиск
первые несколько страниц (не менее 2)
если есть разрыв - многоточие
посередине
если есть разрыв - многоточие
несколько страниц до текушей
текущую без ссылки
несколько страниц после текущей
если есть разрыв - многоточие
посередине
если есть разрыв - многоточие
последние несколько страниц
--->
<!---Можно сделать на многоточии ссылку на середину интервала!--->
<!---Хочется добиться, чтобы при хождении вперед-назад значения повторялись--->
<!---забавный эффект, когда остается разрыв в 1 страницу, а там все равно многоточие--->
<cfoutput>
<cfif i NEQ nCurrentPage>
<cfif i GT somePages AND (nCurrentPage-i) GT somePages>
<cfif NOT doMerge><!---*** неуклюже--->
<cfset nMidPage = ceiling(nCurrentPage/2)/>
<cfset nMidStartRecord = (nMidPage-1)*ATTRIBUTES.recordsPerPage+1/>
<a href="#ATTRIBUTES.thisPage#?nStart=#nMidStartRecord##UrlSuffix#" title="#nMidPage#">...</a>&nbsp;<cfset doMerge=true/>
</cfif>
<cfelseif (i-nCurrentPage) GT somePages AND (nPages-i) GT somePages>
<cfif NOT doMerge>
<cfset nMidPage = ceiling((nCurrentPage+nPages)/2)/>
<cfset nMidStartRecord = (nMidPage-1)*ATTRIBUTES.recordsPerPage+1/>
<a href="#ATTRIBUTES.thisPage#?nStart=#nMidStartRecord##UrlSuffix#" title="#nMidPage#">...</a>&nbsp;<cfset doMerge=true/>
</cfif>
<cfelse>
<a href="#ATTRIBUTES.thisPage#?nStart=#nPageStartRecordNum##UrlSuffix#">#i#</a>&nbsp;
<cfset doMerge=false/>
</cfif>
<cfelse>
<b>#i#</b>&nbsp;
</cfif>
</cfoutput>
</cfloop>
</cfif>
</cfsavecontent>
<cfset "CALLER.#ATTRIBUTES.output#.links"=#pages#/>
<cfset "CALLER.#ATTRIBUTES.output#.recordsPerPage"=#ATTRIBUTES.recordsPerPage#/>
<cfexit method="exittag"/>