80 lines
3.6 KiB
Plaintext
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> <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> <cfset doMerge=true/>
|
||
</cfif>
|
||
<cfelse>
|
||
<a href="#ATTRIBUTES.thisPage#?nStart=#nPageStartRecordNum##UrlSuffix#">#i#</a>
|
||
<cfset doMerge=false/>
|
||
</cfif>
|
||
<cfelse>
|
||
<b>#i#</b>
|
||
</cfif>
|
||
</cfoutput>
|
||
</cfloop>
|
||
</cfif>
|
||
</cfsavecontent>
|
||
|
||
<cfset "CALLER.#ATTRIBUTES.output#.links"=#pages#/>
|
||
<cfset "CALLER.#ATTRIBUTES.output#.recordsPerPage"=#ATTRIBUTES.recordsPerPage#/>
|
||
|
||
<cfexit method="exittag"/> |