Symfony 3 — ошибка пагинатора KNP — проблема с маршрутом?

Я добавил нумерацию страниц, используя KNP Paginator. Это работает хорошо, за исключением одной страницы, которая отображает страницу с определенным идентификатором. Эта страница работала хорошо, прежде чем я добавил нумерацию страниц. функция была

public function orderDetailAction($id)

Для нумерации страниц я добавил запрос.

 /**
* Display order detail
*
*@Route("/order/{id}", name="requestitem_order")
*@Method("GET")
*/
public function orderDetailAction(Request $request, $id)
{
$em = $this->getDoctrine()->getManager()->getRepository('ECAInventoryBundle:RequestItem');
$query = $em->createQueryBuilder('r')
->innerJoin('r.item','i')
->select('i.name')
->addSelect('r.quantity')
->addSelect('i.id')
->addSelect('r.date')
->addSelect('r.remark')
->where('i.id = :ID')->setParameter('ID', $id)
->orderBy('r.date', 'DESC')
->getQuery();

$details = $query->getResult();

$paginator = $this->get('knp_paginator');
$result = $paginator->paginate(
$details,
$request->query->get('page', 1)/*page number*/,
5/*limit per page*/
);

$form = $this->createFormBuilder($details)
->add('id', TextType::class, array('attr' =>array('class' =>'form-control', 'style' =>'margin-bottom:15px')))
->add('name', TextType::class, array('attr' =>array('class' =>'form-control', 'style' =>'margin-bottom:15px')))
->add('quantity', TextType::class, array('attr' =>array('class' =>'form-control', 'style' =>'margin-bottom:15px')))
->add('date', DateType::class, array('attr' =>array('class' =>'form-control', 'style' =>'margin-bottom:15px')))
->add('remark', TextareaType::class, array('attr' =>array('class' =>'form-control', 'style' =>'margin-bottom:15px', 'required' => false),'empty_data'  => null))
->getForm();

return $this->render('requestitem/order_details.html.twig', array('details'=> $details, 'form' => $form->createView()));

}

Файл Twig

{% extends 'base.html.twig' %}

{% block body %}
{% set Name = '' %}
{% for detail in details %}
{% set Name = detail.name %}
{% endfor %}

<h1>Detail</h1>
<h2>{{Name}}</h2>

<table class="table table-striped">
<thead>
<tr>
<th scope="row">Quantity</th>
<th scope="row">Date</th>
<th scope="row">Remark</th>
</tr>
</thead>
<tbody>

{% for detail in details %}
<tr>
<td>{{ detail.quantity}}</td>
<td>{{ detail.date|date('d M Y') }}</td>
<td>{{ detail.remark}}</td>
</tr>
{% endfor %}

</tbody>
</table>
{# display navigation #}
<div class="navigation text-center">
{{ knp_pagination_render(details) }}
</div>
<hr />
<a href="{{ path('requestitem_balance')}}" class="btn btn-default">Back to Balance</a>
{% endblock %}

У меня следующая ошибка

Ошибка типа: аргумент 2 передан
Knp \ Bundle \ PaginatorBundle \ Twig \ Extension \ PaginationExtension :: Render ()
должен быть примером
Knp \ Bundle \ PaginatorBundle \ Pagination \ SlidingPagination, задан массив,
называется в
C: \ XAMPP \ HTDOCS \ инвентаризации \ вар \ кэш \ DEV \ веточка \ 60 \ 60f10f12ae3f80d30f6ac9425ed3eadb7f6a850a4574537165108f4cd8dfd500.php
по линии 107

Маршрут контроллера — @Route («/ order / {id}», и paginator использует этот тип маршрута? Page = 2. Я не знаю, в этом ли проблема.

Как я могу решить это?

1

Решение

Вы делаете некоторую ошибку:

1) Вы можете передать объект запроса в метод paginate вместо объекта details (вам не нужно выполнять запрос, чтобы разбить результат на страницы: knp сделает это за вас)

2) Вам нужно передать результат в представление вместо объекта подробностей.

Так что измените ваш контроллер следующим образом:

**
* Display order detail
*
*@Route("/order/{id}", name="requestitem_order")
*@Method("GET")
*/
public function orderDetailAction(Request $request, $id)
{
$em = $this->getDoctrine()->getManager()->getRepository('ECAInventoryBundle:RequestItem');
$query = $em->createQueryBuilder('r')
->innerJoin('r.item','i')
->select('i.name')
->addSelect('r.quantity')
->addSelect('i.id')
->addSelect('r.date')
->addSelect('r.remark')
->where('i.id = :ID')->setParameter('ID', $id)
->orderBy('r.date', 'DESC')
->getQuery();

$paginator = $this->get('knp_paginator');

$result = $paginator->paginate(
$query,  // (1) pass the query instead of the result (better performance)
$request->query->get('page', 1)/*page number*/,
5/*limit per page*/
);

$form = $this->createFormBuilder($details)
->add('id', TextType::class, array('attr' =>array('class' =>'form-control', 'style' =>'margin-bottom:15px')))
->add('name', TextType::class, array('attr' =>array('class' =>'form-control', 'style' =>'margin-bottom:15px')))
->add('quantity', TextType::class, array('attr' =>array('class' =>'form-control', 'style' =>'margin-bottom:15px')))
->add('date', DateType::class, array('attr' =>array('class' =>'form-control', 'style' =>'margin-bottom:15px')))
->add('remark', TextareaType::class, array('attr' =>array('class' =>'form-control', 'style' =>'margin-bottom:15px', 'required' => false),'empty_data'  => null))
->getForm();

return $this->render('requestitem/order_details.html.twig', array(
'details'=> $result,  // (2) pass the result of the pagination
'form' => $form->createView())
);

}

Надеюсь это поможет

1

Другие решения

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

/**
* Display order detail
*
*@Route("/order/{id}/{page}", name="requestitem_order", defaults={"page": 1})
*@Method("GET")
*/
public function orderDetailAction($id, $page)
{
$em = $this->getDoctrine()->getManager()->getRepository('ECAInventoryBundle:RequestItem');
$query = $em->createQueryBuilder('r')
->innerJoin('r.item','i')
->select('i.name')
->addSelect('r.quantity')
->addSelect('i.id')
->addSelect('r.date')
->addSelect('r.remark')
->where('i.id = :ID')->setParameter('ID', $id)
->orderBy('r.date', 'DESC')
->getQuery();

$details = $query->getResult();

$paginator = $this->get('knp_paginator');
$pagination = $paginator->paginate(
$details,
$page,
5
);

Вместо использования get (page, 1) в $ pagination, я использую $ page.

Ответ Пагинация в KnpPager не работает помогите мне много

1

По вопросам рекламы [email protected]