我的请求

时间:2015-11-13 10:11:11

标签: php symfony

首先,抱歉我的英语...... 所以我想提出一个按类别显示我的文章的请求。 但每次我得到自己的错误。 所以我的控制器是:

 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>

那么我的要求有什么问题? 谢谢!

2 个答案:

答案 0 :(得分:1)

好的我明白了!你正在使用Paginator对象。此对象根本不会提供结果。如果您想获得articles的数量,您必须这样做:

$listArticles->count()

根据the doc of the class

但请注意,因为您在“现有页面检查”中遇到了一些逻辑问题:您的存储库最多只能返回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)可以了解您获得的价值,并了解相比失败的原因。