Как установить «ограничение на страницу» knp_paginator внутри ветки, используя symfony - PullRequest
0 голосов
/ 01 апреля 2020

Я использую KNP_PAGINATOR в моем Symfony v.5 проекте, работающем локально. До сих пор я был в состоянии запустить paginator и запустить без проблем. Теперь мне нужно разрешить пользователям выбирать, сколько результатов они хотят видеть на странице в своем браузере. Очевидно, я уже установил это значение в контроллере, но как я могу изменить это значение в зависимости от взаимодействия пользователя с приложением?

Что я смог сделать до сих пор: получив {{dump(pagination)}} внутри ветки, он показывает что есть параметр с именем: numItemsPerPage , который в настоящее время установлен на 2 (для целей тестирования, поскольку у меня не много фиктивных данных внутри БД). Я могу изменить это так:

    {{ pagination.setParam('numItemsPerPage', 3) }}

или даже так:

{% do pagination.setParam('numItemsPerPage', 3) %}

Оба из них изменят вывод дампа на новое значение для указанного 'numItemsPerPage'. вот так:

    Knp\Bundle\PaginatorBundle\Pagination\SlidingPagination {#1074 ▼
  -route: "cat_products"
  -params: array:5 [▼
    "direction" => "desc"
    "sort" => "p.id"
    "page" => "1"
    "id" => "1"
    "numItemsPerPage" => 3
  ]
  -pageRange: 5
  -template: "@KnpPaginator/Pagination/twitter_bootstrap_v4_pagination.html.twig"
  -sortableTemplate: "@KnpPaginator/Pagination/sortable_link.html.twig"
  -filtrationTemplate: "@KnpPaginator/Pagination/filtration.html.twig"
  #currentPageNumber: 1
  #numItemsPerPage: 2
  #items: array:2 [▶]
  #totalCount: 5
  #paginatorOptions: array:6 [▶]
  #customParameters: array:3 [▶]
}

Но это никак не влияет на фактическое количество элементов, отображаемых на странице!

Вот мой репозиторий:

/**
 * @param string|null $catId
 */
public function getPrdsViaCatId(?string $catId): QueryBuilder
{
    $qb = $this->createQueryBuilder('p') //product
    ->innerJoin('p.category', 'pc') // p=product, pc=product category, ps=product sub-category
    ->innerJoin('p.sub_category', 'ps')
    ->addSelect('pc')
    ->addSelect('ps');
    if ($catId) {
        $qb->andWhere('pc.id = :catId')
            ->andWhere('pc.is_active = :pctrue')
            ->andWhere('ps.is_active = :pstrue')
            ->andWhere('p.is_active = :ptrue')
            ->setParameter('catId', $catId)
            ->setParameter('pctrue', true)
            ->setParameter('pstrue', true)
            ->setParameter('ptrue', true)
        ;
    }
    return $qb
        // ->orderBy('pc.id', 'DESC')
    ;
}

Контроллер :

//start of pagination processing
    $query = $prdRepo->getPrdsViaCatId($id);
    $pagination = $paginator->paginate(
        $query, /* query NOT result */
        $request->query->getInt('page', 1)/*page number*/,
        2/*limit per page*/
    );

и, наконец, в веточку:

<div class="limitPerPage">
                    <select>
                        <option value="10">Show 10 items</option>
                        <option value="20">Show 20 items</option>
                        <option value="30">Show 30 Items</option>
                    </select>
                </div>
                <div class="sorting mr-auto">
                    <select id="sortSelect">
                          <option value="">Sort results</option>
                        {{ knp_pagination_sortable(pagination, 'ID 0-9', 'p.id', {}, {'direction': 'asc'}) }}
                        {{ knp_pagination_sortable(pagination, 'ID 9-0', 'p.id', {}, {'direction': 'desc'}) }}
                        {{ knp_pagination_sortable(pagination, 'Name', 'p.name')|raw }}
                    </select>
                </div>

                {% if pagination %}
                        {% for prd in pagination %}
                           <!-- content goes here -->
                        {% endfor %}
                {% endif %}
<div class="pagination">
                        {{ knp_pagination_render(pagination) }}
                    </div>

Большое спасибо заранее.

...