Разбивка на страницы
Разбитие списка постов на страницы применяется на многих сайтах, и в особенности блогах. В Jekyll есть плагин для разбивки на страницы и вы можете автоматически генерировать необходимые для этого каталоги и файлы.
В Jekyll версии 2 разбивка на страницы была встроенной, начиная с версии 3 надо подключать плагин jekyll-paginate
в Gemfile и в _config.yml
.
Разбивка на страницы работает только с HTML -файлами
Разбивка на страницы не работает с файлами Markdown или Textile, только HTML. Но это вряд ли будет проблемой, так как вы используете разбивку для списка постов
Активация разбивки
Для активации разбивки на страницы в вашем блоге надо добавить в _config.yml
следующий параметр, определяющий количество записей на странице:
paginate: 5
Вы также можете определить место назначения для страниц с разбивкой:
paginate_path: "/blog/page:num/"
Это будет считываться в blog/index.html
, каждая страница с разбивкой будет доступна как переменная liquid paginator
, а вывод будет записываться в blog/page:num/
, где num
номер страницы с разбивкой, начиная с 2. Если на сайте 12 постов и задано paginate: 5
, Jekyll создаст blog/index.html
с первыми 5 постами, blog/page2/index.html
со следующими 5 постами и blog/page3/index.html
с двумя последними постами.
Не задавайте постоянную ссылку
Задание постоянной ссылки во вводной вашего блога может нарушить разбивку на страницы.
Доступные атрибуты Liquid
Плагин разбивки на страницы делает доступным объект paginator
и его атрибуты:
Атрибут | Описание |
---|---|
page | номер текущей страницы |
per_page | количество постов на странице |
posts | список постов для текущей страницы |
total_posts | общее количество постов на сайте |
total_pages | количество страниц с разбивкой |
previous_page | номер предыдущей страницы с разбивкой, nil если она отсутствует |
previous_page_path | путь к предыдущей страницы с разбивкой, nil если она отсутствует |
next_page | номер следующей страницы с разбивкой, nil если она отсутствует |
next_page_path | путь к следующей страницы с разбивкой, nil если она отсутствует |
Разбивка на страницы не поддерживает теги и категории
Разбивка перебирает все посты в переменной posts
, независимо от наличия других переменных во вводных постов. Поэтому на данный момент нет возможности для разбивки постов, связанных тегами или категориями. По этой же причине не поддерживается разбивка коллекций.
Рендеринг страниц с разбивкой
Следующая вещь, которую вам надо сделать это непосредственно вывести список постов, используя доступную вам переменную paginator
. Скорее всего, вы захотите это сделать на одной из основных страниц своего сайта. Вот образец простого рендеринга разбитых на страниц постов в файле HTML:
---
layout: default
title: My Blog
---
<!-- Цикл по списку постов, разбитых на страницы-->
{% for post in paginator.posts %}
<h1><a href="{{ post.url }}">{{ post.title }}</a></h1>
<p class="author">
<span class="date">{{ post.date }}</span>
</p>
<div class="content">
{{ post.content }}
</div>
{% endfor %}
<!-- Ссылки на страницы с разбивкой-->
<div class="pagination">
{% if paginator.previous_page %}
<a href="{{ paginator.previous_page_path }}" class="previous">Previous</a>
{% else %}
<span class="previous">Previous</span>
{% endif %}
<span class="page_number ">Page: {{ paginator.page }} of {{ paginator.total_pages }}</span>
{% if paginator.next_page %}
<a href="{{ paginator.next_page_path }}" class="next">Next</a>
{% else %}
<span class="next ">Next</span>
{% endif %}
</div>
Остерегайтесь страницы №1
Jekyll не создает каталог page1
, поэтому код из примера не сможет работать со ссылкой на /page1
. Ниже указан способ решения этой проблемы
Этот фрагмент кода способен обрабатывать страницу один и выводить список со ссылками всех страниц, кроме текущей.
{% if paginator.total_pages > 1 %}
<div class="pagination">
{% if paginator.previous_page %}
<a href="{{ paginator.previous_page_path | prepend: site.baseurl | replace: '//', '/' }}">« Prev</a>
{% else %}
<span>« Prev</span>
{% endif %}
{% for page in (1..paginator.total_pages) %}
{% if page == paginator.page %}
<em>{{ page }}</em>
{% elsif page == 1 %}
<a href="{{ '/index.html' | prepend: site.baseurl | replace: '//', '/' }}">{{ page }}</a>
{% else %}
<a href="{{ site.paginate_path | prepend: site.baseurl | replace: '//', '/' | replace: ':num', page }}">{{ page }}</a>
{% endif %}
{% endfor %}
{% if paginator.next_page %}
<a href="{{ paginator.next_page_path | prepend: site.baseurl | replace: '//', '/' }}">Next »</a>
{% else %}
<span>Next »</span>
{% endif %}
</div>
{% endif %}