Arhn - архитектура программирования

Как правильно использовать Pagerfanta для разбивки на страницы в Symfony2

Я читал, что Pagerfanta является предпочтительным плагином для разбивки на страницы для Symfony2, но у меня возникли проблемы с его корректной работой. Я скачал код для pagerfanta и PagerfantaBundle и установил их, как описано в файле readme WhiteOctober Github и в этом руководстве. Я почти уверен, что код в моем контроллере в порядке, но что-то не так с моим файлом шаблона.

Мой код контроллера:

public function indexAction($page =  null)
{
    ...
    $query = $em->createQuery('SELECT something FROM some_table');
    $adapter = new DoctrineORMAdapter($query);
    $pager =  new Pagerfanta($adapter);
    $pager->setMaxPerPage(10);
    if (!$page)    $page = 1;
    try  {
        $pager->setCurrentPage($page);
    }
    catch(NotValidCurrentPageException $e) {
      throw new NotFoundHttpException('Illegal page');
    }
    return $this->render('MyBundle:MyEntity:index.html.twig', array(
        'pager' => $pager,
    ));
}

В моем шаблоне:

...
<table>
  {% for object in pager.currentPageResults %}
    <tr>
      <td>{{ object.attribute1 }}</td>
      <td>{{ object.attribute2 }}</td>
      <td>{{ object.attribute3 }}</td>
    </tr>
  {% endfor %}
</table>

{% if pager.haveToPaginate %}
  {{ pagerfanta(pager) }}
{% endif %}

Когда я захожу на страницу, я получаю список первых 10 объектов. Однако рендеринг пейджера — это всего лишь ПредыдущийСледующий как одно слово (не ссылки и не страницы 1, 2, 3 и т. д.).

Если я добавлю ?page=2 к URL-адресу, он не отобразит следующие 10 элементов в списке.

Я не изменил маршрут по сравнению с тем, что был до того, как добавил код разбиения на страницы, потому что в документации сказано:

Маршруты генерируются автоматически для текущего маршрута с использованием переменной «page» для распространения номера страницы.

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

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

10.09.2012

  • Включает ли шаблон маршрута атрибут страницы? т.е. /articles/{page} 10.09.2012
  • Обновление: похоже, проблема с контроллером. В частности, DocrtineORMAdapter не работает должным образом (т. е. $pagerfanta->getNbResults() возвращает 0 — следовательно, нет страниц между предыдущей и следующей). В документации указано, что параметр, передаваемый конструктору, может быть Query или QueryBuilder, но я подозреваю, что правильным является только последний. Когда я меняю на $pagerfanta = new Pagerfanta(new ArrayAdapter($query->getResult()), он возвращает правильное количество результатов. @AdrienBrault - я внес предложенное вами изменение в шаблон маршрута, и теперь оно работает, но в этом нет необходимости. 11.09.2012
  • Итак, у меня все еще остались вопросы, почему ?page= не добавляется автоматически к маршруту в соответствии с документацией и почему не применяется css (теперь пагинатор выглядит как Previous123Next, без пробелов или форматирования) 11.09.2012

Ответы:


1

Я думаю, что ваше приложение не знает, как преобразовать ?page=2 в действие контроллера.

Включите {page} в свой маршрут (как ответил @AdrienBrault), который вы хотите разбить на страницы.

как это:

my_index:
  pattern:  /{page}
  defaults: { _controller: MyTestBundle:Object:index, page: 1 }
  requirements:
    _method:  GET
    page: \d+

PagerFantaBundle (я думаю) попытается угадать правильный маршрут.

Работал на меня.

26.09.2012
  • Это работает, но на самом деле это можно сделать с параметрами запроса, как задал OP. Просто добавьте Request $request к действию и получите $page от $request->get('page', 1) 16.08.2013
  • Метод запроса get проходит через все параметры (запрос, атрибуты и запрос). Официально рекомендуется избегать этого, когда вы знаете, откуда берется параметр: в этом случае вам нужно будет использовать $request->query->get('page', 1). 09.10.2015

  • 2

    Мне пришлось использовать «currenPage» вместо «page» в моей маршрутизации, и я нашел способ сделать это:

    {{ pagerfanta(pager, 'my_pager_view', {'pageParameter':'[currentPage]'}) }}

    22.02.2017
    Новые материалы

    Коллекции публикаций по глубокому обучению
    Последние пару месяцев я создавал коллекции последних академических публикаций по различным подполям глубокого обучения в моем блоге https://amundtveit.com - эта публикация дает обзор 25..

    Представляем: Pepita
    Фреймворк JavaScript с открытым исходным кодом Я знаю, что недостатка в фреймворках JavaScript нет. Но я просто не мог остановиться. Я хотел написать что-то сам, со своими собственными..

    Советы по коду Laravel #2
    1-) Найти // You can specify the columns you need // in when you use the find method on a model User::find(‘id’, [‘email’,’name’]); // You can increment or decrement // a field in..

    Работа с временными рядами спутниковых изображений, часть 3 (аналитика данных)
    Анализ временных рядов спутниковых изображений для данных наблюдений за большой Землей (arXiv) Автор: Рольф Симоэс , Жильберто Камара , Жильберто Кейрос , Фелипе Соуза , Педро Р. Андраде ,..

    3 способа решить квадратное уравнение (3-й мой любимый) -
    1. Методом факторизации — 2. Используя квадратичную формулу — 3. Заполнив квадрат — Давайте поймем это, решив это простое уравнение: Мы пытаемся сделать LHS,..

    Создание VR-миров с A-Frame
    Виртуальная реальность (и дополненная реальность) стали главными модными терминами в образовательных технологиях. С недорогими VR-гарнитурами, такими как Google Cardboard , и использованием..

    Демистификация рекурсии
    КОДЕКС Демистификация рекурсии Упрощенная концепция ошеломляющей О чем весь этот шум? Рекурсия, кажется, единственная тема, от которой у каждого начинающего студента-информатика..