Во-первых, извините за мой английский... Поэтому я хочу сделать запрос, чтобы показать свою статью по категориям. Но каждый раз, когда я просто получаю свою собственную ошибку. Итак, мой контроллер:
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>
Так что же не так с моей просьбой? Спасибо !
Ладно, я понял ! Вы используете объект 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
:
getAvecCategories ($page ,$slug, $nbPerPage ) // page, slug, nbPerPage
И вы вызываете его, инвертируя аргументы:
->getAvecCategories($slug, $page, $nbPerPage) // slug, page, nbPerPage
Поэтому php попытается запустить slug в int и вернуть 0.
Маршрут должен быть
OAHNews_categorie:
path: /categorie/{slug}/{page}
defaults: { _controller: OAHNewsBundle:News:categorie , page: 1 }
requirements:
page: \d+ <-- change \d* by \d+
Попробуйте ввести переменную перед проверкой:
if (intval($page) > $nbPages) {
throw $this->createNotFoundException("La page ".$page." n'existe pas.");
}
Else, dump($page)
и dump($nbPages)
чтобы узнать, какое значение вы получите, и понять, почему сбой не удалось.
intval()
. Я обновил ответ.