Views page - last page gets wrong number

Created on 10 April 2025, about 1 month ago

Problem/Motivation

I have a paginated view that has 37 total pages. We're showing 5 page links at a time, along with first/prev last/next links. This is the HTML:

<ul class="pagination">
<li class="page  active"><a class="pagination__link" href="?page=0">1</a></li>
<li class="page "><a class="pagination__link" href="?page=1">2</a></li>
<li class="page "><a class="pagination__link" href="?page=2">3</a></li>
<li class="page "><a class="pagination__link" href="?page=3">4</a></li>
<li class="page "><a class="pagination__link" href="?page=4">5</a></li>
<li class="pagination-next"><a href="?page=1" aria-label="Next page"></li>
<li class="pagination-last"><a href="?page=37" aria-label="Last page"></li>
</ul>

When tome rewrites the pagination links, the last page is turned into "/page/47"

<ul class="pagination">
<li class="page  active"><a class="pagination__link" href="/news/page/1">1</a></li>
<li class="page "><a class="pagination__link" href="/news/page/2">2</a></li>
<li class="page "><a class="pagination__link" href="/news/page/3">3</a></li>
<li class="page "><a class="pagination__link" href="/news/page/4">4</a></li>
<li class="page "><a class="pagination__link" href="/news/page/5">5</a></li>
<li class="pagination-next"><a href="/news/page/1" aria-label="Next page"></li>
<li class="pagination-last"><a href="/news/page/47" aria-label="Last page"></li>
</ul>

I narrowed this down to the str_replace() calls in the PagerPathSubscriber, listener when it goes to replace the href of ?page=3 with /news/page/4 it replaces the regular pagination_link and the partial match in pagination_last.

Steps to reproduce

Have a view with enough content that the start of the href for the first/next/prev/last links is a partial match for one of the numeric pagination links

Proposed resolution

I fixed it by enclosing the href with quotes during the replacement calls.

      $html = str_replace([
        sprintf('href="%s"', $original_href),
        sprintf(htmlentities('href="%s"'), $original_href)
      ], [
        sprintf('href="%s"', $new_href),
        sprintf('href="%s"', $new_href)
      ], $html);

Remaining tasks

I will submit a merge request

User interface changes

None

API changes

None

Data model changes

None

πŸ› Bug report
Status

Active

Version

1.13

Component

Code

Created by

πŸ‡ΊπŸ‡ΈUnited States omerida

Live updates comments and jobs are added and updated live.
Sign in to follow issues

Merge Requests

Comments & Activities

Production build 0.71.5 2024