1

KNP Paginator を使用してページネーションを追加しました。特定の ID のページをレンダリングする 1 つのページを除いて、うまく機能します。ページネーションを追加する前は、このページはうまく機能していました。関数は

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

次のエラーがあります

タイプ エラー: Knp\Bundle\PaginatorBundle\Twig\Extension\PaginationExtension::render() に渡される引数 2 は、C:\xampp\htdocs\ で呼び出される、指定された Knp\Bundle\PaginatorBundle\Pagination\SlidingPagination のインスタンスである必要がありますinventory\var\cache\dev\twig\60\60f10f12ae3f80d30f6ac9425ed3eadb7f6a850a4574537165108f4cd8dfd500.php 行 107

コントローラーのルートは @Route("/order/{id}" で、ページネーターはこの種のルート ?page=2 を使用します。これが問題かどうかはわかりません。

どうすれば解決できますか?

4

2 に答える 2

1

あなたはいくつかの間違いを犯します:

1) 詳細オブジェクトの代わりにクエリ オブジェクトを paginate メソッドに渡すことができます (結果をページ分割するためにクエリを実行する必要はありません: 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())
    );

  }

この助けを願っています

于 2016-10-31T13:23:11.920 に答える