大家晚上好,
我实际上是在网上推送我的symfony2网站而且我遇到了一些问题。我已经设置了knp paginator bundle并且已经按照他们关于安装的说明进行了操作。但事实是我的分页不起作用,因此它只显示第一页上出现的项目。当我点击next / page2时,网址似乎正在行为正确,但网页仍然是“#34; freezed"第一个展示。
这是我的代码(我为自动加载器和内核中的不同软件包设置了所有配置):
// 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:
在检查了我的自动加载和我的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
答案 0 :(得分:1)
好的,所以我找到了或 ONE问题解决方案。事实上,正如我在之前的评论中所说,问题似乎来自路由。 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 }
我不知道这是否是解决此问题的最佳方式,但它有效,而在我的情况下,我不介意暂时使用这样的网址。
我希望这对像我这样的初学者有所帮助!
答案 1 :(得分:0)
注意这段代码
$this->get('request')->query->get('page', 1)/*page number*/
您可以通过此代码获取请求的 _GET 参数的“页面”值,但您必须将“页面”设为Request Attribute
,而不是_GET的值。
换句话说,正确的代码是
$this->get('request')->get('page')
答案 2 :(得分:0)
KnpPaginatorBundle仓库中的example表明您需要将Request $request
作为参数传递给创建$pagination
的控制器方法,在您的情况下为indexAction
。我注意到你没有这个参数。这可能是分页器没有分页的原因。我有完全相同的问题并通过在控制器中包含$request
参数来解决它,如KnpPaginatorBundle repo中的示例所示。此外,您需要记住在控制器类中包含use Symfony\Component\HttpFoundation\Request
。
答案 3 :(得分:0)
我有同样的问题,经过几个小时的搜索,我最终找到解决方案,我们只需要把
$request = Request::createFromGlobals();
获取所需的变量之前和之后,在我的情况下,通过执行
从“GET”获取它 $request->query->get('variable')