Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

pageParameterName not supported #815

Open
verticka opened this issue Oct 18, 2024 · 13 comments
Open

pageParameterName not supported #815

verticka opened this issue Oct 18, 2024 · 13 comments
Labels

Comments

@verticka
Copy link

Bug Report

Q A
BC Break yes
Bundle version 6.6.1
Symfony version 7.1.5
PHP version 8.3.4

Summary

Parameter "pageParameterName" is not supported in links

Current behavior

Exemple with bootstrap 4: link is /suivi?page=2

How to reproduce

$paginator->paginate($repo->relanceDemande(),$request->query->getInt('pageRelanceDemande',1),50,['pageParameterName'=>'pageRelanceDemande']);

Expected behavior

link : /suivi?pageRelanceDemande=2

@garak
Copy link
Collaborator

garak commented Oct 18, 2024

I just tried and see that the expected behaviour is what I get.
Please provide more information.

@verticka
Copy link
Author

your new knp_pagination_query function no longer supports "pageParameterName"

@garak garak added bug and removed Help user labels Oct 18, 2024
@garak
Copy link
Collaborator

garak commented Oct 18, 2024

The link is generated correctly for me, but the page is not advancing indeed.
Do you have a solution for that? Could you propose a fix?

@verticka
Copy link
Author

Yes i have copied Older version
in my local template and change in configuration

@Jalliuz
Copy link

Jalliuz commented Oct 28, 2024

Same problem here:
When looking at this twig function
new TwigFunction('knp_pagination_query', [PaginationRuntime::class, 'getQueryParams']),
The getQeuryParams does not take the current paginator options into account and we always get the default 'page' instead of 'my-custom-page-name'

@garak
Copy link
Collaborator

garak commented Oct 28, 2024

Could you try this patch on your vendor knp-paginator-bundle dir?
After that, passing the pagination as the third argument of the knp_pagination_query Twig method should work.

--- a/src/Twig/Extension/PaginationRuntime.php
+++ b/src/Twig/Extension/PaginationRuntime.php
@@ -113,16 +113,18 @@ final class PaginationRuntime implements RuntimeExtensionInterface
      * @param int $page
      * @return array<string, mixed>
      */
-    public function getQueryParams(array $query, int $page): array
+    public function getQueryParams(array $query, int $page, ?SlidingPaginationInterface $pagination = null): array
     {
+        $pageName = $pagination?->getPaginatorOption('page_name') ?? $this->pageName;
+
         if ($page === 1 && $this->skipFirstPageLink) {
-            if (isset($query[$this->pageName])) {
-                unset($query[$this->pageName]);
+            if (isset($query[$pageName])) {
+                unset($query[$pageName]);
             }
 
             return $query;
         }
 
-        return array_merge($query, [$this->pageName => $page]);
+        return array_merge($query, [$pageName => $page]);
     }
 }

if you confirm it works, I'll release a patch version later today

@verticka
Copy link
Author

Hello,
It doesn't work because I can't find the variable to put in your template model

It work for me :

`public function getQueryParams(array $query, int $page, ?string $pageParameterName = null): array
{
$pageName = $pageParameterName ?? $this->pageName;

    if ($page === 1 && $this->skipFirstPageLink) {
        if (isset($query[$pageName])) {
            unset($query[$pageName]);
        }

        return $query;
    }



    return array_merge($query, [$pageName => $page]);
}`

on Twig function add pageParameterName
knp_pagination_query(query, previous,pageParameterName)

@garak
Copy link
Collaborator

garak commented Oct 30, 2024

The variable is the pagination object passed to your template

@Jalliuz
Copy link

Jalliuz commented Oct 30, 2024

The solution of Vertica works indeed

public function getQueryParams(
    array $query,
    int $page,
    ?string $pageParameterName = null,
): array {
    $pageName = $pageParameterName ?? $this->pageName;

    if ($page === 1 && $this->skipFirstPageLink) {
        if (isset($query[$pageName])) {
            unset($query[$pageName]);
        }

        return $query;
    }
    return array_merge($query, [$pageName => $page]);
}

And in all places (all templates) change
knp_pagination_query(query, page) to knp_pagination_query(query, page, pageParameterName)

@garak
Copy link
Collaborator

garak commented Oct 30, 2024

I'm sure it works, but it would force use to extract the pageParameterName to be passed everywhere. Moreover, it's not future-proof: if one day we find in the need of another option, we would be forced to add a new argument.

@steveWinter
Copy link

@garak the issue with your proposed solution is that in the templates of the bundle we have no access to the SlidingPaginationInterface object.

For example, using the Bootstrap 5 template, getQueryParams is called via the twig function knp_pagination_query like this:

<li class="page-item">
    <a class="page-link" href="{{ path(route, knp_pagination_query(query, pageCount - 1)) }}">{{ pageCount - 1 }}</a>
</li>

And the parameters which are passed to the template are generated from the call to twig function knp_pagination_render which has parsed the SlidingPaginationInterface object into an array of parameters for the template - which as @Jalliuz points out includes pageParameterName.

I understand your concern about needing to pass pageParameterName 'everywhere' but if not that, then it has to be the SlidingPaginationInterface object which gets passed 'everywhere' and while this will make adding future requriements easier, it means changing the way the parameters in knp_pagination_render are computed.

If you're sure that's the way that you'd like to approach things, I can create a PR (because this bug is causing problems with an upstream library I'm trying to implement)?

@steveWinter
Copy link

PS I would also add, that using pageParameterName was how it was done in v5 - the same block form the template I shared above in v5 looked like this

<li class="page-item">
    <a class="page-link" rel="prev" href="{{ path(route, query|merge({(pageParameterName): previous})) }}">&laquo;&nbsp;{{ 'label_previous'|trans({}, 'KnpPaginatorBundle') }}</a>
 </li>

@garak
Copy link
Collaborator

garak commented Dec 5, 2024

I see your point.
Probably we should pass the entire set of options to the PaginationRuntime constructor, while currently we pass only a few.

Can you propose a PR?

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
Projects
None yet
Development

No branches or pull requests

4 participants