首先,抱歉我的英语...... 所以我想提出一个按类别显示我的文章的请求。 但每次我得到自己的错误。 所以我的控制器是:
public function categorieAction($slug,$page)
{
if ($page < 1) {
throw new NotFoundHttpException('Page "'.$page.'" inexistante.');
}
$nbPerPage = 5;
$listArticles = $this->getDoctrine()
->getManager()
->getRepository('OAHNewsBundle:Article')
->getAvecCategories($slug, $page, $nbPerPage)
;
$nbPages = ceil(count($listArticles)/$nbPerPage);
if ($page > $nbPages) {
throw $this->createNotFoundException("La page ".$page." n'existe pas.");
}
return $this->render('OAHNewsBundle:News:categorie.html.twig',array(
'listArticles' => $listArticles,
'nbPages' => $nbPages,
'page' => $page
));
}
我的存储库:
public function getAvecCategories ($page ,$slug, $nbPerPage )
{
$query = $this -> createQueryBuilder ('a')
->leftjoin ( 'a.categories' , 'c' )
->addselect('c')
->where('c.slug = :slug')
->setParameter('slug', $slug)
->leftjoin('a.image', 'i')
->addselect('i')
->orderBy('a.date', 'DESC')
->getQuery()
;
$query
->setFirstResult(($page-1) * $nbPerPage)
->setMaxResults($nbPerPage)
;
return new Paginator($query, true);
}
}
我的路线:
OAHNews_categorie:
path: /categorie/{slug}/{page}
defaults: { _controller: OAHNewsBundle:News:categorie , page: 1 }
requirements:
page: \d*
我得到的错误:
if ($page > $nbPages) {
throw $this->createNotFoundException("La page ".$page." n'existe pas.");
}
观点:
{% extends "OAHNewsBundle::OAH_layout.html.twig" %}
{% block title %} {{ parent() }} - Index{% endblock %}
{% block body_news %}
{% for article in listArticles %}
<div class="article_des_news">
<div class="row">
<div class="col-sm-3">
<a href="{{path('OAHNews_voir', {'slugarticle':article.slugarticle})}}"><img src='{{ asset(article.image.webPath) }}' alt="{{ article.image.alt}}"/></a>
</div>
<div class="col-sm-9">
<a class="titre_article" href="{{path('OAHNews_voir', {'slugarticle':article.slugarticle})}}">{{article.titre}}
</a>
<p><i class="glyphicon glyphicon-pencil"></i> par {{article.auteur}},
<i class="glyphicon glyphicon-time"> </i> {{article.date|date('d/m/y')}}
{% if not article.categories.empty %}
<i class="glyphicon glyphicon-tag"> </i>
{% for categorie in article.categories %}
{{ categorie.nom }}{% if not loop.last %}, {% endif %}
{% endfor %}
{% endif %}
</p>
{{ article.contenu|truncate(100, false, "...")}}
</div>
</div>
</div>
{% endfor %}
<ul class="pagination pull-right">
{# On utilise la fonction range(a, b) qui crée un tableau de valeurs entre a et b #}
{% for p in range(1, nbPages) %}
<li{% if p == page %} class="active"{% endif %}>
<a href="{{ path('OAHNews_accueil', {'page': p}) }}">{{ p }}</a>
</li>
{% endfor %}
</ul>
{% endblock %}
和我使用的链接:
<ul class="nav nav-pills nav-stacked">
{% for categorie in listCategories %}
<li class='menu'>
<a class="titre_article normalLink" href="{{ path('OAHNews_categorie', {'slug': categorie.slug}) }}">
{{ categorie.nom }}
</a>
</li>
{% endfor %}
</ul>
那么我的要求有什么问题? 谢谢!
答案 0 :(得分:1)
好的我明白了!你正在使用Paginator对象。此对象根本不会提供结果。如果您想获得articles
的数量,您必须这样做:
$listArticles->count()
但请注意,因为您在“现有页面检查”中遇到了一些逻辑问题:您的存储库最多只能返回5个结果,所以如果您尝试访问第二页,您将拥有类似的东西:
$nbPages = ceil($listArticles->count()/$nbPerPage); // [0 - 5] / 5 = 0 or 1
if ($page > $nbPages) { // if (2 > 0 or 1)
throw $this->createNotFoundException("La page ".$page." n'existe pas.");
}
如果您想检查您是否正在访问现有页面,您可以这样做:
if ($listArticles->count() > 0) {
throw $this->createNotFoundException("La page ".$page." n'existe pas.");
}
在您的回程中,您必须通过执行以下操作将结果数组发送到您的模板:
return $this->render('OAHNewsBundle:News:categorie.html.twig',array(
'listArticles' => $listArticles->getIterator(),
'nbPages' => $nbPages,
'page' => $page
));
问题2:由于您的回购品的这一行,您的偏差误差等于-5:
->setFirstResult(($page-1) * $nbPerPage) // $page = 0 so (0-1) * 5 = -5
这是因为你这样定义了getAvecCategories
:
getAvecCategories ($page ,$slug, $nbPerPage ) // page, slug, nbPerPage
你通过反转参数来调用它:
->getAvecCategories($slug, $page, $nbPerPage) // slug, page, nbPerPage
因此php尝试在int中强制转换并返回0。
答案 1 :(得分:0)
路线应为
OAHNews_categorie:
path: /categorie/{slug}/{page}
defaults: { _controller: OAHNewsBundle:News:categorie , page: 1 }
requirements:
page: \d+ <-- change \d* by \d+
在检查前尝试to cast变量:
if (intval($page) > $nbPages) {
throw $this->createNotFoundException("La page ".$page." n'existe pas.");
}
否则,dump($page)
和dump($nbPages)
可以了解您获得的价值,并了解相比失败的原因。