【问题标题】:Symfony 3 - KNP paginator error - Route issue?Symfony 3 - KNP 分页器错误 - 路由问题?
【发布时间】:2017-03-13 13:12:35
【问题描述】:

我使用 KNP Paginator 添加了一个分页。除了为特定 ID 呈现页面的页面外,它运行良好。在我添加分页之前,此页面运行良好。函数是

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

我有以下错误

类型错误:参数 2 传递给 Knp\Bundle\PaginatorBundle\Twig\Extension\PaginationExtension::render() 必须是 Knp\Bundle\PaginatorBundle\Pagination\SlidingPagination,给定数组, 叫进来 C:\xampp\htdocs\inventory\var\cache\dev\twig\60\60f10f12ae3f80d30f6ac9425ed3eadb7f6a850a4574537165108f4cd8dfd500.php 在第 107 行

控制器路由是@Route("/order/{id}" 分页器使用这种路由?page=2。不知道是不是这个问题。

我该如何解决?

【问题讨论】:

  • 将查询对象而不是详细信息对象传递给分页方法。您无需执行 rhe 查询即可对结果进行分页:knp 为您完成。然后将结果传递给视图而不是详细信息对象
  • Matteo,你为什么不把它作为答案发布?
  • 嗨@Ziumin 完成。以前我通过手机发表评论以分享快速提示

标签: php symfony pagination knpmenubundle knppaginator


【解决方案1】:

你犯了一些错误:

1)您可以将查询对象传递给分页方法而不是详细信息对象(您不需要执行查询以对结果进行分页: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())
    );

  }

希望有帮助

【讨论】:

  • 我变了。没有错误。页面是空的。所以我添加到树枝文件&lt;div class="count"&gt; &lt;strong&gt;Total: {{ details.getTotalItemCount }} records&lt;/strong&gt; &lt;/div&gt;,总数为0。顺便说一下,我需要$details = $query-&gt;getResult();到$form的形式。
  • 嗨@Eskinder 可能没有所选ID的项目?
  • 嗨@Matteo 当我删除分页代码时。它运作良好。有所选 ID 的项目。
  • @Eskinder 尝试对查询结果进行分页(而不是查询)分页器支持两者(只是一种优化)。看看会发生什么
  • 这就是我之前所做的。我得到了错误。$result = $paginator-&gt;paginate( $details, $request-&gt;query-&gt;get('page', 1)/*page number*/, 5/*limit per page*/ );
【解决方案2】:

问题是路由。我更改了路由和函数参数以从 url 检索 id 和 page。我进行了以下更改以使其正常工作。

/**
  * 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
    );

我没有在 $pagination 中使用 get(page,1),而是使用了 $page。

Paginate in KnpPager not work的回答对我帮助很大。

【讨论】:

猜你喜欢
  • 1970-01-01
  • 2017-11-28
  • 1970-01-01
  • 1970-01-01
  • 2018-08-22
  • 2011-06-16
  • 2017-09-10
  • 2011-05-20
  • 1970-01-01
相关资源
最近更新 更多