getgrav/grav-plugin-pagination

Using pagination breaks isFirst/isLast and siblings calculations

nbusseneau opened this issue · 2 comments

Hi,

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

  • Collection::isFirst($path)
  • Collection::isLast($path)
  • Collection::prevSibling($path)
  • Collection::nextSibling($path)

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.

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.

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.