October CMS 开箱即用地包含了分页功能,它与标准模板集成,并为自定义标记提供了完整的灵活性。分页记录与模型分页查询和pager() Twig 函数紧密集成。
分页数据集可以来自组件逻辑、页面或布局中的 PHP 部分,或者来自 Tailor 组件。以下是一个页面从 Tailor 组件请求分页数据的示例,它以每页 10 条记录的方式遍历记录。
url = "/blog"
[collection]
handle = "Blog\Post"{% set posts = collection.paginate(10) %}现在,posts 变量可用。我们可以遍历每条记录并显示分页链接。
<div>
{% for post in posts %}
<h2>{{ post.title }}</h2>
{% endfor %}
</div>
<nav>
{{ pager(posts) }}
</nav>默认情况下,分页将从 ?page 查询字符串中获取当前页码,因此当显示两组或更多组分页数据时,将使用相同的页码。为了解决此问题,请使用 paginateCustom 方法并指定一个唯一的参数名称。
url = "/blog"
[collection blog]
handle = "Blog\Post"
[collection category]
handle = "Blog\Category"{% set posts = blog.paginateCustom(10, 'postPage') %}
{% set comments = comments.paginateCustom(10, 'commentPage') %}设置 withQuery 选项以保留其他分页实例的页码(可选)。
{{ pager(categories, { withQuery: true }) }}这会使查询字符串包含两个页码,例如,?postPage=1&commentPage=2。
要使用自定义分页标记,请从以下文件位置开始,然后将内容复制到主题中的局部文件(partial)内。
| 模板 | 详情 |
|---|---|
default | 渲染默认的分页模板。 位置: ~/modules/system/views/pagination/default.htm |
simple | 仅渲染带有“下一页”和“上一页”按钮的分页。 位置: ~/modules/system/views/pagination/simple.htm |
ajax | 渲染 AJAX 分页记录。 位置: ~/modules/system/views/pagination/ajax.htm |
然后通过将 partial 选项传递给分页器(pager)来将其作为局部文件(partial)渲染。
{{ pager(records, { partial: 'my-custom-pagination' }) }}使用 ajaxPager() Twig 函数通过 AJAX 动态更新分页记录。局部文件(partial)应显示记录并包含分页器,例如,一个名为 latest-posts.htm 的局部文件,其内容如下。
<div>
{% for post in posts %}
<h2>{{ post.title }}</h2>
{% endfor %}
</div>
<nav>
{{ ajaxPager(posts) }}
</nav>然后使用{% ajaxPartial %} Twig 标签在页面上渲染该局部文件(partial)。
url = "/blog"
[collection blog]
handle = "Blog\Post"{% set posts = blog.paginate(10) %}
<h3>最新文章</h3>
{% ajaxPartial 'latest-posts' %}或者,您可以将所有逻辑封装在局部文件(partial)中,使其完全可移植。
[collection blog]
handle = "Blog\Post"{% set posts = blog.paginate(10) %}
<div>
{% for post in posts %}
<h2>{{ post.title }}</h2>
{% endfor %}
</div>
<nav>
{{ ajaxPager(posts) }}
</nav>然后,该局部文件(partial)可以在页面或布局上的任何位置渲染,而无需任何额外配置。
url = "/blog"{% ajaxPartial 'latest-posts' %}加载更多按钮,有时也称为无限加载器,是一种以堆栈形式而非跨多个页面的方式显示记录的方法。
此方法使用 AJAX 局部文件(partial)来追加新内容以及一个自销毁按钮。例如,一个名为 load-more-posts.htm 的局部文件(partial),其内容如下。
{% set posts = blog.paginate(10) %}
<div>
{% for post in posts %}
<h2>{{ post.title }}</h2>
{% endfor %}
</div>
{% if posts.hasMorePages %}
<button
data-request="onAjax"
data-request-update="{ _self: '@' }"
data-request-success="this.remove()"
data-request-data="{ page: {{ posts.currentPage + 1 }} }"
data-attach-loading>
加载更多
</button>
{% endif %}按钮元素利用 AJAX 数据属性的组合来执行追加模式下的自更新,将下一页的页码作为数据传递,并在完成后移除自身。
该局部文件(partial)应使用 {% ajaxPartial %} Twig 标签渲染。
url = "/blog"{% ajaxPartial 'load-more-posts' %}