首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >用Pagerfanta分页处理混叠数组

用Pagerfanta分页处理混叠数组
EN

Stack Overflow用户
提问于 2018-10-06 13:38:23
回答 3查看 949关注 0票数 2

我有一个页面,在页面的每个分页部分(因此每个页面)上显示6个项目(在我的例子中是机构)。我使用shuffle以随机顺序显示项目。我使用Symfony 4和Pagerfanta作为分页。我面临的问题是,每次我进入下一页时,我的查询都会再次被洗牌。随机排序不是问题,问题是每次用户进入下一页时都会发生这种情况。它应该只发生在第一页,并保持该顺序。我在这里读过一个相似问题,但问题是,所有的解决方案似乎都意味着一个全新的分页器。有没有办法既使用页面幻想又解决我的问题?

我现在的代码:

InstitutionController.php

代码语言:javascript
复制
 // 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

代码语言:javascript
复制
//...
    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;
}

我问题的活生生的例子

EN

回答 3

Stack Overflow用户

发布于 2018-10-10 15:06:39

如果将结果随机化,那么唯一真正的方法是第一次执行DB调用,然后将行(或仅in )存储在会话变量或其他存储中。然后,您可以每次引用该结果。可能也会加快你的页面速度!

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

票数 0
EN

Stack Overflow用户

发布于 2018-10-12 14:52:20

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

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

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

ShuffleArrayAdapter.php

代码语言:javascript
复制
class ShuffleArrayAdapter extends ArrayAdapter
{
    public function getSlice($offset, $length)
    {
        return shuffle(array_slice($this->array, $offset, $length));
    }
}

我不确定这个解决方案是否适合你,但它是最快的。

票数 0
EN

Stack Overflow用户

发布于 2018-11-15 14:41:00

我使用了session 1978 in的建议,将随机顺序存储在一个会话变量中。我只是想向大家展示一下,对于那些遇到这个问题的人来说,这是如何做到的。PaginationHelper.php保持不变,控制器现在如下所示:

代码语言:javascript
复制
//..

$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 ]);
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/52679629

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档