使用Pagerfanta对随机数组进行分页



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

我现在的代码:

机构控制.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]);

分页助手.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;
}

我的问题的活生生的例子

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

请注意,即使您有一个种子洗牌,您仍然需要先获取每条记录。

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

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

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

ShuffleArrayAdapter.php

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

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

我使用了Delboy1978uk的建议,将随机顺序存储在会话变量中。我只是想向那些遇到这个问题的人展示如何做到这一点。分页助手.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 ]);

最新更新