Я использую 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>
Большое спасибо заранее.