Paginate перетасованный массив с Pagerfanta - PullRequest
0 голосов
/ 06 октября 2018

У меня есть страница, которая отображает 6 пунктов (учреждения в моем случае) в каждом разбитом на страницы разделе (следовательно, на каждой странице).Я отображаю элементы в случайном порядке, используя shuffle.Я использую Symfony 4 и Pagerfanta для нумерации страниц.Проблема, с которой я сталкиваюсь, заключается в том, что каждый раз, когда я перехожу на следующую страницу, мой запрос снова перетасовывается.Рандомизация порядка - не проблема, проблема в том, что это происходит каждый раз, когда пользователь переходит на следующую страницу.Это должно происходить только на первой странице и оставаться в таком порядке.Я прочитал подобный вопрос здесь, но проблема в том, что все решения, по-видимому, подразумевают совершенно новый paginator.Есть ли способ использовать оба пагерфанта и решить мою проблему?

Мой код прямо сейчас:

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;
}

Живой пример моей проблемы

Ответы [ 3 ]

0 голосов
/ 12 октября 2018

Я полагаю, что иногда учреждения повторяются несколько раз на разных страницах, и в этом проблема.

Специальное решение состоит в том, чтобы перетасовать учреждения только на данной странице.Мы будем избегать повторения учреждений на нескольких страницах (на первой странице всегда будут одни и те же учреждения, но в разном порядке).Пользователи смогут видеть все элементы.

Например, вы можете сделать это с новым адаптером:

ShuffleArrayAdapter.php

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

Я не уверен, подходит ли вам это решение, но оно самое быстрое.

0 голосов
/ 15 ноября 2018

Я использовал предложение 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 ]);
0 голосов
/ 10 октября 2018

Если вы рандомизируете результат, то единственным реальным способом было бы выполнить ваш вызов БД в первый раз, а затем сохранить строки (или просто идентификаторы) в сеансе var или каком-либо другом хранилище.Затем вы можете ссылаться на этот результат каждый раз.Возможно, это даже ускорит вашу страницу!

Обратите внимание, что даже если у вас был перемешанный случайный случай, вам все равно придется сначала извлекать каждую запись.

...