使用Pagerfanta对混洗后的数组进行分页

时间:2018-10-06 13:38:23

标签: php symfony pagerfanta

我有一个页面,在该页面的每个分页部分(因此每个页面)上显示6个项目(在我的情况下是机构)。我使用shuffle以随机顺序显示项目。 我使用Symfony 4和Pagerfanta进行分页。我面临的问题是,每当我转到下一页时,我的查询就会再次被打乱。随机化顺序不是问题,问题在于每次用户转到下一页时都会发生。它应该只在第一页上发生并保持该顺序。我在这里读过similar question,但问题是所有解决方案似乎都暗示着一个全新的分页器。有没有办法同时使用pagerfanta和解决我的问题?

我现在的代码:

InstitutionController.php

 // I query for the list of items (institutions)
 $q = $request->query->get('q');
 $query = $institutionRepository->searchAndSortPublished($q);

 // I randomize the order of institutions
 shuffle($query);

 $pagerfanta = $paginationHelper->paginate($request, $query, 6);

 return $this->render('institution/index.html.twig', [ 'paginator' => $pagerfanta, 'institutions' => $query, 'q' => $q]);

PaginationHelper.php

//...
    public function paginate($request, $array, $maxPerPage = 10)
{
    $page = $request->query->get('page', 1);
    $adapter = new ArrayAdapter($array);
    $pagerfanta = new Pagerfanta($adapter);
    $pagerfanta->setMaxPerPage($maxPerPage);
    $pagerfanta->setCurrentPage($page);

    return $pagerfanta;
}

Live example of my problem

3 个答案:

答案 0 :(得分:0)

如果要随机化结果,那么唯一的真实方法是第一次进行数据库调用,然后将行(或仅ID)存储在会话var或其他存储中。然后您可以每次参考该结果。实际上还可以加快您的页面速度!

请注意,即使您拥有随机播放的种子,您仍需要首先获取每条记录。

答案 1 :(得分:0)

我想有时候机构会在不同的页面上重复几次,这就是问题所在。

临时解决方案是仅在给定页面上改组机构。我们将避免在几页上重复机构(第一页上始终是相同的机构,但顺序不同)。用户将能够看到所有项目。

例如,您可以使用新适配器进行此操作:

ShuffleArrayAdapter.php

class ShuffleArrayAdapter extends ArrayAdapter
{
    public function getSlice($offset, $length)
    {
        return shuffle(array_slice($this->array, $offset, $length));
    }
}

我不确定该解决方案是否适合您,但这是最快的。

答案 2 :(得分:0)

我使用了Delboy1978uk的建议,将随机顺序存储在会话变量中。我只是想向那些也遇到此问题的人展示如何做到这一点。 PaginationHelper.php 保持不变,控制器现在看起来像这样:

//..

$query = $institutionRepository->findAll();

// set the random order in a session variable if it hasn't been set yet.
if (!$session->has('institution_order')) {
    shuffle($query);

    // set the session variable.
    $session->set('institution_order', $query);
}

// the random order per session per user.
$radomizedOrder = $session->get('institution_order');
$pagerfanta = $paginationHelper->paginate($request, $radomizedOrder, 6);

return $this->render('institution/index.html.twig', [ 'paginator' => $pagerfanta ]);