Si vous travaillez sur un projet avec Symfony2.3 et que vous désirez faire une liste paginée SEO friendly avec le bundle KnpPaginatorBundle, voici la marche à suivre !
Comme expliqué sur l’excellent article de Google Webmaster Central, la pagination doit bien se gérer au niveau des headers de votre page.
Cela permet de lutter contre le contenu dupliqué, et il s’agit d’un moyen simple d’expliquer au robots d’indexation que cette page contient une liste paginée.
Avec symfony et le bundle KnpPaginatorBundle voici comment j’ai résolu ce probleme :
Dans mon controller j’ai rajouté ces lignes
$paginator = $this->get('knp_paginator'); $target = range('a', 'u'); $slice = $paginator->paginate($target, $this->get('request')->query->get('pages', 1), 3);
puis je passe la variable $slice à twig :
return $this->render('McwCmsBundle:Default:search.html.twig', array( 'listResultat' => $listResultat, ... 'slice' => $slice, ));
J’ai ensuite créé un template qui contient le code HTML à insérer dans le head de ma page :
{# metatag.htm.twig#} {% if pageCount > 1 %} {% if first is defined and current != first %} <link rel="first" href="{{ url(route, query|merge({(pageParameterName): first})) }}" /> {% endif %} {% if previous is defined %} <link rel="prev" href="{{ url(route, query|merge({(pageParameterName): previous})) }}" /> {% endif %} {% if next is defined %} <link rel="next" href="{{ url(route, query|merge({(pageParameterName): next})) }}" /> {% endif %} {% if last is defined and current != last %} <link rel="last" href="{{ url(route, query|merge({(pageParameterName): last})) }}" /> {% endif %} {% endif %}
Dans mon layout.html.twig j’ai placé dans le header ce code là :
{% if slice is defined %} {{ knp_pagination_render(slice, 'TonBundle:TonDossier:metatag.htm.twig')|raw }} {% endif %}