2016-10-31 14 views
1

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

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())); 

    } 

прутик файл

{% 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 %} 

Я следующее сообщение об ошибке

Type error: Argument 2 passed to Knp\Bundle\PaginatorBundle\Twig\Extension\PaginationExtension::render() must be an instance of Knp\Bundle\PaginatorBundle\Pagination\SlidingPagination, array given, called in C:\xampp\htdocs\inventory\var\cache\dev\twig\60\60f10f12ae3f80d30f6ac9425ed3eadb7f6a850a4574537165108f4cd8dfd500.php on line 107

Маршрут контроллер @Route ("/ заказать/{ID}" и Paginator использует этот вид маршрута? page = 2. Я не знаю, если это проблема.

Как это можно решить?

+1

Передайте объект запроса методу paginate вместо объекта details. Вам не нужно выполнять запрос, чтобы разбивать результат: knp сделать это за вас. Затем передайте результат вместо представления объекта объекта – Matteo

+0

Matteo, почему бы вам не опубликовать его как ответ? – Ziumin

+0

привет @ Ziumin сделано. Раньше я отправлял комментарий по мобильному для обмена быстрыми советами – Matteo

ответ

1

Проблема была route.I изменил маршрут и параметры функции, чтобы получить идентификатор и страницы с 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.

Ответ Paginate in KnpPager not work мне очень помогает.

+0

Хороший улов @ Eskinder отметить ответ как принятый – Matteo

1

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

1) Вы можете передать объект запроса к методу постраничного вместо детали объекта (а Вам не нужно выполнить запрос, чтобы постраничного результат: ПКНО сделать это для вы)

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

Я изменил. Ошибок нет. Страница пуста. Поэтому я добавил в файл twig '

Total: {{ details.getTotalItemCount }} records
', а число totoal равно 0. Кстати, мне нужна '$ details = $ query-> getResult();' в форму $ form. – Eskinder

+0

hi @Eskinder Возможно, нет элементов для выбранного идентификатора? – Matteo

+0

привет @Matteo, когда я удаляю код разбивки на страницы. Это работает хорошо. Есть элементы для выбранного идентификатора. – Eskinder

 Смежные вопросы

  • Нет связанных вопросов^_^