Shopware 6:自定义证书列表分页按钮失效问题求助
Shopware 6自定义证书插件分页无响应问题排查与修复
我开发了一个Shopware 6自定义插件,包含certificate实体,用于在前台展示证书列表。已完成列表视图和分页组件开发,但点击分页按钮无响应、无法跳转。以下是问题代码及修复方案:
核心问题分析及修复
1. Controller中偏移量未根据页码动态计算
当前代码固定设置$criteria->setOffset(1);,未结合page参数动态计算偏移量,导致无论点击哪一页,都只会返回第一页的数据,分页跳转后内容无变化。
修复后的CertificateController.php关键代码:
<?php declare(strict_types=1); namespace Certificate\Storefront\Controller; use Shopware\Core\Framework\Context; use Shopware\Core\Framework\DataAbstractionLayer\EntityRepository; use Shopware\Core\Framework\DataAbstractionLayer\Search\Criteria; use Shopware\Core\Framework\DataAbstractionLayer\Search\Sorting\FieldSorting; use Shopware\Storefront\Controller\StorefrontController; use Certificate\Service\ReadingData; use Symfony\Component\HttpFoundation\Request; use Symfony\Component\HttpFoundation\Response; use Symfony\Component\Routing\Annotation\Route; /** * @Route(defaults={"_routeScope"={"storefront"}}) */ class CertificateController extends StorefrontController { private ReadingData $readingData; private EntityRepository $certificateReposiitory; public function __construct(ReadingData $readingData, EntityRepository $certificateReposiitory) { $this->readingData = $readingData; $this->certificateReposiitory = $certificateReposiitory; } /** * @Route("/certificate", name="frontend.certificate.certificate", methods={"GET"}) */ public function index(Request $request, Context $context): Response { $searchQuery = $request->query->get('search', ''); $currentPage = (int)$request->query->get('page', 1); $limit = 25; $offset = ($currentPage - 1) * $limit; $criteria = new Criteria(); $criteria->setOffset($offset); $criteria->setLimit($limit); $criteria->addSorting(new FieldSorting('name', FieldSorting::ASCENDING)); $result = $this->certificateReposiitory->search($criteria, $context); $total = $result->getTotal(); $pages = ceil($total / $limit); $results = []; if (!empty($searchQuery)) { $results = $this->readingData->readData($searchQuery, $context, $currentPage, $limit); } else { $results = $result->getEntities(); } return $this->renderStorefront('@Certificate/storefront/page/certificate.html.twig', [ 'searchQuery' => $searchQuery, 'results' => $results, 'pages' => $pages, 'currentPage' => $currentPage, 'limit' => $limit, 'total' => $total ]); } }
2. 搜索逻辑未兼容分页参数
当存在搜索查询时,ReadingData::readData方法未接收分页参数,导致搜索结果无法分页,点击分页按钮后仍显示全部搜索结果。
修改ReadingData服务的readData方法:
// Certificate\Service\ReadingData.php public function readData(string $searchQuery, Context $context, int $currentPage = 1, int $limit = 25) { $criteria = new Criteria(); $offset = ($currentPage - 1) * $limit; $criteria->setOffset($offset); $criteria->setLimit($limit); // 添加搜索过滤逻辑,示例: $criteria->addFilter(new \Shopware\Core\Framework\DataAbstractionLayer\Search\Filter\ContainsFilter('name', $searchQuery)); return $this->certificateRepository->search($criteria, $context)->getEntities(); }
3. Twig模板中路由参数错误
模板中searchRoute设置为不存在的frontend.certificate.index,需替换为实际路由frontend.certificate.certificate,否则分页跳转链接生成错误。
修复后的Twig分页代码:
{% sw_include '@Storefront/storefront/component/pagination.html.twig' with { prev_link: currentPage > 1 ? path('frontend.certificate.certificate', {page: currentPage - 1, search: searchQuery}) : null, next_link: currentPage < pages ? path('frontend.certificate.certificate', {page: currentPage + 1, search: searchQuery}) : null, 'currentPage': currentPage, 'total': total, 'limit': limit, 'pages': pages, 'searchRoute': 'frontend.certificate.certificate', 'searchQuery': searchQuery } %}
4. 移除无用参数传递
原代码向Twig传递的criteria变量并非Shopware默认分页组件所需,移除后可避免潜在冲突。
内容的提问来源于stack exchange,提问作者Mahmoud Abdelsattar
相关产品推荐
相关产品推荐

