TYPO3 v10:如何将 RouteEnhancer 与 ArrayPaginator 一起使用?

问题描述 投票:0回答:2

我在 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 页相同。

我在这里缺少什么?

typo3 extbase typo3-10.x typo3-11.x
2个回答
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>

0
投票

我找到了解决方法。 在控制器列表操作内:

 $currentPage = (int) ($_GET['tx_ref_pi2']['currentPage'] ?? 1);

© www.soinside.com 2019 - 2024. All rights reserved.