Files
reader/lib/controls/paginator.cfm
T
2025-08-19 17:18:23 +03:00

80 lines
3.6 KiB
Plaintext

<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"/>