我在 Extbase 列表视图中使用
ArrayPaginator
,因为 TYPO3 v11 中不再提供 Fluid 小部件功能。
我目前正在尝试使用 RouteEnhancer 来实现这一点。
我的列表操作仅接收当前页面的整数参数。
RouteEnhancer 的代码如下所示:
RefList:
type: Extbase
limitToPages:
- 142
extension: Ref
plugin: Pi2
routes:
-
routePath: /seite-{page}
_controller: 'Ref::list'
_arguments:
page: currentPage
defaultController: 'Ref::list'
requirements:
page: \d+
aspects:
page:
type: StaticRangeMapper
start: '1'
end: '1000'
我见过很多流体分页小部件的示例,其中包含参数
@widget_0/currentPage
的值 page
。
如果我切换到另一个页面,URL 会正确生成,但列表视图中显示的内容仍然与第 1 页相同。
我在这里缺少什么?
您可以使用 QueryResultPaginator 代替 ArrayPaginator。
路线
routeEnhancers:
RefList:
type: Extbase
extension: Ref
plugin: Pi2
routes:
- routePath: '/'
_controller: 'Ref::list'
- routePath: '/{page}'
_controller: 'Ref::list'
_arguments:
page: current-page
defaultController: 'Ref::list'
aspects:
current-page:
type: StaticRangeMapper
start: '1'
end: '100'
RefController.php 从请求中获取当前页面
public function listAction()
{
$refs = $this->refRepository->findAll();
$currentPage = $this->request->hasArgument('current-page') ? $this->request->getArgument('current-page') : 1;
$paginatedRefs = new QueryResultPaginator($refs, $currentPage, $this->itemsPerPage);
$simplePagination = new SimplePagination($paginatedRefs);
$pagination = $this->buildSimplePagination($simplePagination, $paginatedRefs);
$this->view->assignMultiple([
'refs' => $paginatedRefs,
'pagination' => $pagination,
]);
}
/**
* Build simple pagination
*
* @param SimplePagination $simplePagination
* @param QueryResultPaginator $paginator
* @return array
*/
protected function buildSimplePagination(SimplePagination $simplePagination, QueryResultPaginator $paginator): array
{
$firstPage = $simplePagination->getFirstPageNumber();
$lastPage = $simplePagination->getLastPageNumber();
return [
'lastPageNumber' => $lastPage,
'firstPageNumber' => $firstPage,
'nextPageNumber' => $simplePagination->getNextPageNumber(),
'previousPageNumber' => $simplePagination->getPreviousPageNumber(),
'startRecordNumber' => $simplePagination->getStartRecordNumber(),
'endRecordNumber' => $simplePagination->getEndRecordNumber(),
'currentPageNumber' => $paginator->getCurrentPageNumber(),
'pages' => range($firstPage, $lastPage)
];
}
List.html添加分页模板
<f:for each="{refs.paginatedItems}" as="ref">
<f:render partial="List/ListItem" arguments="{ref: ref}" />
</f:for>
<f:render partial="List/Pagination" arguments="{pagination:pagination, action:'list'}" />
部分列表/分页.html
添加分页链接:上一页
<f:link.action action="{action}" arguments="{current-page:pagination.previousPageNumber}">previous</f:link.action>
添加分页链接:pages
<f:link.action action="{action}" arguments="{current-page:page}">{page}</f:link.action>
添加分页链接:下一步
<f:link.action action="{action}" arguments="{current-page: pagination.nextPageNumber}">next</f:link.action>
我找到了解决方法。 在控制器列表操作内:
$currentPage = (int) ($_GET['tx_ref_pi2']['currentPage'] ?? 1);