液体和算术

5

我正在处理分页问题,想知道是否有方法指示Liquid仅显示5页。我的期望输出是:

<< 第 5 6 7 8 9 页 共 30 页 >>

目前的逻辑可以正常工作,但是它会显示所有30多页。

{% for count in (2..paginator.total_pages) %}
    {% if count == paginator.page %}
        <span class="current">{{ count }}</span>
    {% else %}
        <a href="/page/{{ count }}/" class="pagenavi-page" title="{{ count }}">{{ count }}</a>
    {% endif %}
{% endfor %}

我希望能够使2和paginator.total_pages成为动态的值,我已经尝试过。
{% for count in ((paginator.page - 2)..(paginator.page + 2)) %} 

然而,这段代码实际上并没有进行数学计算,如果paginator.page = 5,则循环是5..5,并且不能提供预期的结果。 我可以想出逻辑,使其不会产生负数并按预期工作,但我该如何在其中进行数学方程?

4个回答

4

您需要在paginator.total_pages上使用过滤器进行算术运算,并使用capture标签将结果保存在变量中。一旦您有了起始页和结束页,就可以像平常一样编写for循环:

{% capture page_start %}{{ paginator.page | minus: 2 }}{% endcapture %}
{% capture page_end %}{{ paginator.page | plus: 2 }}{% endcapture %}

{% for count in (page_start..page_end) %}
     {% comment %} ... do your thing ... {% endcomment %}
{% endfor %}

谢谢你的回答,我明白了。但是在设置循环时,我遇到了另一个错误。我需要能够检查page_end是否大于总页数。{% if page_end > paginator.total_pages %} {% assign page_end = paginator.total_pages %} {% endif %}上述代码给我带来了以下错误Liquid Exception: comparison of String with 37 failed in index.html有没有一种方法可以在Liquid中实现这个功能? - Joseph Crawford
我解决了这个问题,只需要在Jekyll中扩展pagination.rb并添加pager_start和pager_end变量以及计算即可。 - Joseph Crawford
对于寻找更现代化、兼容GitHub Pages且不涉及Ruby编程的谷歌员工,请查看此链接。声明:答案由我撰写。 - Shadowen

1
我正在使用Bootstrap 3.0.3制作网站。我使用以下代码进行分页。它具有您要寻找的相同效果。我上面发布的代码就是您要寻找的,但我还是会在这里发布我的Bootstrap分页代码。
{% if paginator.total_pages != 1 %} 
{% if paginator.total_pages < 7 %}
        <div class="page-body col-md-12">
          <ul class="pagination pagination-centered">
            {% if paginator.total_pages >= 10 %} 
            {% if paginator.previous_page %}
                <li>
                  <a href="{{ site.url }}/">&laquo;&laquo;</a>
                </li>
            {% else %}
              <li class="disabled">
                <a>&laquo;&laquo;</a>
              </li>
            {% endif %}
            {% endif %}
            {% if paginator.previous_page %}
              {% if paginator.previous_page == 1 %}
                <li>
                  <a href="{{ site.url }}/">&laquo;</a>
                </li>
              {% else %}
                <li>
                  <a href="{{ site.url }}/page{{paginator.previous_page}}">&laquo;</a>
                </li>
              {% endif %}
            {% else %}
              <li class="disabled">
                <a>&laquo;</a>
              </li>
            {% endif %}
            {% if paginator.page == 1 %}
              <li class="active">
                <a>1</a>
              </li>
            {% else %}
              <li>
                <a href="{{ site.url }}/">1</a>
              </li>
            {% endif %}
            {% for count in (2..paginator.total_pages) %}
              {% if count == paginator.page %}
                <li class="active">
                  <a>{{count}}</a>
                </li>
              {% else %}
                <li>
                  <a href="{{ site.url }}/page{{count}}">{{count}}</a>
                </li>
              {% endif %}
            {% endfor %}
            {% if paginator.next_page %}
              <li>
                <a href="{{ site.url }}/page{{paginator.next_page}}">&raquo;</a>
              </li>
            {% else %}
              <li class="disabled">
                <a>&raquo;</a>
              </li>
            {% endif %}
            {% if paginator.total_pages >= 10 %} 
            {% if paginator.next_page %}
              <li>
                <a href="{{ site.url }}/page{{paginator.total_pages}}">&raquo;&raquo;</a>
              </li>
            {% else %}
              <li class="disabled">
                <a>&raquo;&raquo;</a>
              </li>
            {% endif %}
            {% endif %}
          </ul>
        </div>
{% else %}

{% assign page_start = paginator.page | minus: 2 %}
{% assign page_end = paginator.page | plus: 2 %}
{% if page_end > paginator.total_pages %}
{% assign page_end = paginator.total_pages %}
{% assign page_start = paginator.page | minus: 4 %}
{% endif %}
{% if page_start < 2 %}
{% assign page_end = paginator.page | plus: 3 %}
{% assign page_start = paginator.page | minus: 1 %}
{% endif %}
{% if page_start == 0 %}
{% assign page_end = paginator.page | plus: 4 %}
{% assign page_start = paginator.page %}
{% endif %}

<div class="page-body col-md-12">
    <ul class="pagination pagination-centered">
    {% if paginator.total_pages > 5 %} 
    {% if paginator.previous_page %}
        <li>
          <a href="{{ site.url }}/">&laquo;&laquo;</a>
        </li>
    {% else %}
      <li class="disabled">
        <a>&laquo;&laquo;</a>
      </li>
    {% endif %}
    {% endif %}
    {% if paginator.previous_page %}
      {% if paginator.previous_page == 1 %}
        <li>
          <a href="/">&laquo;</a>
        </li>
      {% else %}
        <li>
          <a href="/page{{paginator.previous_page}}">&laquo;</a>
        </li>
      {% endif %}
    {% else %}
      <li class="disabled">
        <a href="#">&laquo;</a>
      </li>
    {% endif %}
    {% if page_start == 1 %}
    {% assign page_end = paginator.page | plus: 4 %}
    {% assign page_start = 2 %}
    {% if paginator.page == 1 %}
      <li class="active">
        <a href="#">1</a>
      </li>
    {% else %}
      <li>
        <a href="/">1</a>
      </li>
    {% endif %}
    {% endif %}
    {% for count in (page_start..page_end) %}
      {% if count == paginator.page %}
        <li class="active">
          <a href="#">{{count}}</a>
        </li>
      {% else %}
        <li>
          <a href="/page{{count}}">{{count}}</a>
        </li>
      {% endif %}
    {% endfor %}
    {% if paginator.next_page %}
      <li>
        <a href="/page{{paginator.next_page}}">&raquo;</a>
      </li>
    {% else %}
      <li class="disabled">
        <a href="#">&raquo;</a>
      </li>
    {% endif %}
    {% if paginator.total_pages > 5 %} 
    {% if paginator.next_page %}
      <li>
        <a href="{{ site.url }}/page{{paginator.total_pages}}">&raquo;&raquo;</a>
      </li>
    {% else %}
      <li class="disabled">
        <a>&raquo;&raquo;</a>
      </li>
    {% endif %}
    {% endif %}
  </ul>
</div>
{% endif %}
{% endif %}

1
我正在使用Jekyll构建博客,遇到了类似的情况。根据我在Liquid wiki上找到的信息,可以使用limitoffset迭代给定集合的子集。
下面的示例反映了您的特定情况,并且应该在每个页面上都能正常工作,从第一页到最后一页。
{% capture start %}{{ paginator.page | minus: 3 }}{% endcapture %}

{% for i in (1..paginator.total_pages) limit: 5 offset: start %}
    ...
{% endfor %}

0

试试这个替代方案

{% if paginator.total_pages < 7 %}
{% if paginator.page == 1 %}
        <span class="current bold">1</span>
{% else %}
        <a href="{{ site.url }}/">1</a>
{% endif %}
{% for count in (2..paginator.total_pages) %}
    {% if count == paginator.page %}
        <span class="current bold">{{ count }}</span>
    {% else %}
        <a href="/page{{ count }}/" class="pagenavi-page" title="{{ count }}">{{ count }}</a>
    {% endif %}
{% endfor %}
{% else %}
{% assign page_start = paginator.page | minus: 2 %}
{% assign page_end = paginator.page | plus: 2 %}
{% if page_end > paginator.total_pages %}
{% assign page_end = paginator.total_pages %}
{% assign page_start = paginator.page | minus: 4 %}
{% endif %}
{% if page_start < 2 %}
{% assign page_end = paginator.page | plus: 3 %}
{% assign page_start = paginator.page | minus: 1 %}
{% endif %}
{% if page_start == 0 %}
{% assign page_end = paginator.page | plus: 4 %}
{% assign page_start = paginator.page %}
{% endif %}
{% if page_start == 1 %}
{% assign page_end = paginator.page | plus: 4 %}
{% assign page_start = 2 %}
{% if paginator.page == 1 %}
        <span class="current bold">1</span>
{% else %}
        <a href="{{ site.url }}/">1</a>
{% endif %}
{% endif %}
{% for count in (page_start..page_end) %}
    {% if count == paginator.page %}
        <span class="current bold">{{ count }}</span>
    {% else %}
        <a href="/page{{ count }}/" class="pagenavi-page" title="{{ count }}">{{ count }}</a>
    {% endif %}
{% endfor %} 
{% endif %}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接