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