algorithm - Freemarker 分页 - 或者只是点击页面的通用算法

标签 algorithm pagination freemarker

 p - is request parameter where the page number is given by user

<#assign totalPages =searchResult.getTotalPages()>
<#assign lastPage = 0>

<#list totalPages as curPage>
    <#if p=curPage>
         <a href="#" class="selected">${p}</a>
         <#assign lastPage = curPage?number>
    <#else>
         <a href="/search.html?q=${q?html}&amp;p=${curPage}">${curPage}</a>
    </#if>
</#list>

这将打印这样的链接

1 2 3 4 5 6 7 8 9 10 11 - and the list keeps going to the last page lets say 100

我想完成的是这些情况(<x> 中的数字是用户选择的 p - 页面):

Case A: 
1 <2> 3 4 5 ... 100

Case B:
1 ... 11 12 <13> 14 15 ... 100

Case C:
1 ... <96> 97 98 99 100

关于如何在上面的 freemarker 代码中执行此操作的任何想法?伪代码也可以。

最佳答案

这里有两个辅助函数 maxmin 以及一个我称为 pages 的宏:

<#function max x y>
    <#if (x<y)><#return y><#else><#return x></#if>
</#function>
<#function min x y>
    <#if (x<y)><#return x><#else><#return y></#if>
</#function>
<#macro pages totalPages p>
    <#assign size = totalPages?size>
    <#if (p<=5)> <#-- p among first 5 pages -->
        <#assign interval = 1..(min(5,size))>
    <#elseif ((size-p)<5)> <#-- p among last 5 pages -->
        <#assign interval = (max(1,(size-4)))..size >
    <#else>
        <#assign interval = (p-2)..(p+2)>
    </#if>
    <#if !(interval?seq_contains(1))>
     1 ... <#rt>
    </#if>
    <#list interval as page>
        <#if page=p>
         <${page}> <#t>
        <#else>
         ${page} <#t>
        </#if>
    </#list>
    <#if !(interval?seq_contains(size))>
     ... ${size}<#lt>
    </#if>
</#macro>

当用一系列页码和当前页调用时,这个宏产生,例如

<@pages 1..100 2 />
<@pages 1..100 13 />
<@pages 1..100 96 />
<@pages 1..3 2 />

以下输出(删除了一些空格):

1 <2> 3 4 5 ... 100
1 ... 11 12 <13> 14 15 ... 100
1 ... <96> 97 98 99 100 
1 <2> 3 

关于algorithm - Freemarker 分页 - 或者只是点击页面的通用算法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6391668/

相关文章:

algorithm - 在给定范围内查找随机数,排除某些可能的数字

javascript - 为什么 If 语句为 hashTable 返回 undefined?

algorithm - 证明优先队列操作的时间复杂度

python - Django Rest Framework 按指定的 GET 参数分页

xml - 使用 XSD 确保 XML 验证中的字符串不为空

algorithm - SlopeOne 算法可以用来解决这个问题吗?

javascript - 如何排序和过滤 AngularJS 中使用 UI Bootstrap Pagination 分页的所有记录

cakephp - 如何使用 CSS 设置 CakePHP 中使用的分页器的样式?

java - 电子邮件与 strut 集成

javascript - 如何使用 HTML 创建 netsuite 电子邮件模板并在其中使用 freemaker 来访问用户数据