getgrav / grav-plugin-pagination

Grav Pagination Plugin
https://getgrav.org
MIT License
27 stars 20 forks source link

Using pagination breaks isFirst/isLast and siblings calculations #52

Closed nbusseneau closed 3 years ago

nbusseneau commented 3 years ago

Hi,

Using pagination breaks theme usage of all of the following functions:

Noticed this because it breaks sibling links in themes:

{% set blog_collection = page.find(header_var('blog_url')|defined(theme_var('blog-page'))).collection() %}
{% if not blog_collection.isLast(page.path) %}
  <a class="btn" href="{{ blog_collection.prevSibling(page.path).url }}"><i class="fa fa-angle-left"></i> {{ 'THEME_QUARK.BLOG.ITEM.PREV_POST'|t }}</a>
{% endif %}

Obviously, this happens because the collection on which the functions operate is the paginated version, instead of the source collection.

I'll be poking around with the intent of PRing a solution (either here or in Grav core I guess), hints are appreciated.

nbusseneau commented 3 years ago

One solution is to disable pagination when retrieving page collection from Twig, by passing false as second parameter:

{% set blog_collection = page.find(header_var('blog_url')|defined(theme_var('blog-page'))).collection('content', false) %}

I'll be closing this and instead propose a PR in default Quark theme for handling this scenario, since pagination is built into Quark by default but does not handle this case.

nbusseneau commented 3 years ago

Actually, Quark handles this properly because it uses Page::nextSibling() and Page::prevSibling(), which themselves use Page::adjacentSibling($direction), which uses an unpaginated collection: https://github.com/getgrav/grav/blob/d4a20c71c2dadf7c843a170975a8161b7f5ce191/system/src/Grav/Common/Page/Page.php#L2490-L2499

The reason I was in need of retrieving collection directly and then using collection-level functions is because I am using a collection with @self.descendants due to my folder structure looking like this:

├───2019
│   ├───11
│   │   ├───foo
│   │   └───bar
│   └───12
│       └───baz
└───2020
    └───01
        └───qux

This does not play well Page::adjacentSibling($direction) since it is based on direct parent collection: $parent->collection('content', false)

Not sure something can nor needs to be done here, I don't think there's a way for a Page to know about its containing collection as it could be in multiple, hence using the direct parent (containing folder) as basis for Page siblings looks rather sound to me. Websites using the Quark theme with another folder structure just have to adapt the template, as did I.