KNP 分页链接卡在第 1 页
Posted
技术标签:
【中文标题】KNP 分页链接卡在第 1 页【英文标题】:KNP Pagination links stucked on page 1 【发布时间】:2014-04-23 23:29:04 【问题描述】:大家晚上好,
我实际上正在将我的 symfony2 网站推送到网上,但我遇到了一些问题。我已经设置了 knp 分页器捆绑包,并按照他们的说明进行了安装。但事实是我的分页不起作用,因此它只显示第一页上出现的项目。当我单击 next/page2 时,url 似乎表现正确,但页面仍然“冻结”第一次显示。
这是我的代码(我已经为自动加载器和内核中的不同包设置了所有配置):
// Controller/HomeController.php (used for the homepage)
<?php
namespace Pf\Bundle\BlogBundle\Controller;
use Symfony\Bundle\FrameworkBundle\Controller\Controller;
class HomeController extends Controller
public function indexAction()
$em = $this->get('doctrine.orm.entity_manager');
$dql = "SELECT a FROM PfBlogBundle:Projects a ORDER by a.id DESC";
$query = $em->createQuery($dql);
$paginator = $this->get('knp_paginator');
$pagination = $paginator->paginate(
$query,
$this->get('request')->query->get('page', 1)/*page number*/,
8/*limit per page*/
);
return $this->render('PfBlogBundle:Default:home.html.twig', array('pagination'=>$pagination));
和树枝
// Default/home.html.twig
% extends '::home.html.twig'%
% block body %
<div id="works">
<div class="container">
<div class="row-fluid">
<div class="span12">
% for project in pagination %
<div class="span3">
<div class="workBlocks">
<img src=" project.thumbnail " />
<div class="workCaption">
<h3> project.title </h3>
<a href=" path('pf_blog_project', 'id': project.id) ">See</a>
</div><!-- end workCaption -->
</div><!-- end workBlocks -->
</div><!-- end span3 -->
% endfor %
</div>
# display navigation #
knp_pagination_render(pagination)
</div><!-- end row -->
</div>
</div><!-- end works -->
% endblock %
我看不出我哪里错了。非常感谢所有帮助;)
编辑:
// this is the route I want to use...
pf_blog_index:
path: /
defaults: _controller: PfBlogBundle:Home:index
(编辑)好吧,我将继续提供更多细节,因为我无法弄清楚出了什么问题:
所以在我的供应商中,我有以下文件夹结构:
knplabs:
knp 组件 knp 菜单 knp-menu-bundle knp-paginator-bundle在检查了我的自动加载和我的 AppKernel 之后,我有了关于文档所需的内容..
在我的 composer.json 中:
"require":
"knplabs/knp-components": "1.2.*@dev",
"knplabs/knp-menu-bundle": "2.0.*@dev",
"knplabs/knp-paginator-bundle": "dev-master"
,
在 app/autoload.php 我有
$loader->registerNamespaces(array(
'Knp\\Component' => __DIR__.'/../vendor/knp-components/src',
'Knp\\Bundle' => __DIR__.'/../vendor/bundles',
));
最后,在我的 AppKernel.php
$bundles = array(
new Knp\Bundle\MenuBundle\KnpMenuBundle(),
new Knp\Bundle\PaginatorBundle\KnpPaginatorBundle(),
);
编辑:
这也是我在 app/config.yml
中的设置knp_paginator:
page_range: 3 # default page range used in pagination control
default_options:
page_name: page # page query parameter name
sort_field_name: sort # sort field query parameter name
sort_direction_name: direction # sort direction query parameter name
distinct: true # ensure distinct results, useful when ORM queries are using GROUP BY statements
template:
pagination: KnpPaginatorBundle:Pagination:twitter_bootstrap_pagination.html.twig # sliding pagination controls template
sortable: KnpPaginatorBundle:Pagination:sortable_link.html.twig # sort link template
【问题讨论】:
你能粘贴你的路由吗? 代码没问题,我能想象的唯一原因是您在子请求中调用控制器(在树枝中使用渲染),因此请求中没有参数。尝试使用var_dump($this->get('request')->query->all());
转储请求参数
我不确定你的意思..?对不起:/
实际上 var 转储返回:array(0) 我明白了这一点..这意味着它没有找到要排序的对象吗?这可能是由于我的自定义查询吧?抱歉,如果这些问题听起来很愚蠢,但学习所有这些并不总是那么容易,我会确保我理解。谢谢
好吧,即使我做了一个更“通用”的请求,结果也保持不变..我的页面上什么也没有发生:/ $repository = $this->getDoctrine() ->getRepository('PfBlogBundle :项目'); $query = $repository->findAll();
【参考方案1】:
好的,所以我找到了或一个解决我的问题的方法。事实上,正如我在之前的 cmets 中所说,问题似乎来自于路由。 Knp bundle 并没有有效地理解索引路由。因此,我修改了我的控制器,以便使用我的 indexAction() 进行重定向。这对我有用:
// Controller\HomeController.php
<?php
namespace Pf\Bundle\BlogBundle\Controller;
use Symfony\Bundle\FrameworkBundle\Controller\Controller;
use Symfony\Component\HttpFoundation\Request;
class HomeController extends Controller
public function indexAction()
return $this->redirect($this->generateUrl('pf_blog_index2'));
public function listAction()
$em = $this->get('doctrine.orm.entity_manager');
$dql = "SELECT a FROM PfBlogBundle:Projects a ORDER by a.id DESC";
$query = $em->createQuery($dql);
$paginator = $this->get('knp_paginator');
$pagination = $paginator->paginate(
$query,
$this->get('request')->query->get('page', 1)/*page number*/,
8 /*limit per page */
);
// Puis modifiez la ligne du render comme ceci, pour prendre en compte l'article :
return $this->render('PfBlogBundle:Default:home.html.twig', array('pagination'=>$pagination));
// src/..../.../.../config/routing.php
pf_blog_index:
path: /
defaults: _controller: PfBlogBundle:Home:index
pf_blog_index2:
path: /home
defaults: _controller: PfBlogBundle:Home:list
我不知道这是否是解决此问题的最佳方法,但它确实有效,就我而言,我暂时不介意拥有这样的网址。
希望对像我这样的初学者有所帮助!
【讨论】:
【参考方案2】:注意这段代码
$this->get('request')->query->get('page', 1)/*page number*/
您通过此代码获取请求的 _GET 参数的“页面”值,但您必须将“页面”作为Request Attribute
,而不是作为_GET 的值。
换句话说,正确的代码是
$this->get('request')->get('page')
【讨论】:
【参考方案3】:KnpPaginatorBundle repo 中的example 表明您需要将Request $request
作为参数传递给创建$pagination
的控制器方法,在您的情况下为indexAction
。我注意到你没有这个参数。这可能是分页器不分页的原因。我遇到了完全相同的问题,并通过在控制器中包含 $request
参数来解决它,如 KnpPaginatorBundle repo 中的示例所示。此外,您需要记住在控制器类中包含use Symfony\Component\HttpFoundation\Request
。
【讨论】:
【参考方案4】:我也有同样的问题,找了好几个小时,终于找到解决办法了,我们只需要把
$request = Request::createFromGlobals();
在获取所需变量之前和之后,在我的情况下,通过执行从“GET”获取它
$request->query->get('variable')
【讨论】:
以上是关于KNP 分页链接卡在第 1 页的主要内容,如果未能解决你的问题,请参考以下文章