Prestashop : nombre de produits par page

Sous Prestashop, vous avez par défaut 10 produits qui s’affichent sur les pages de catégorie. Si vous avez beaucoup d’articles dans votre boutique ou si tout simplementla sélection de produits par page par défaut ne vous convient pas, vous avez la possibilité de le modifier. Comme je le disais, 10 produits par défaut sont définis et les paginations suivantes sont 20 produits par page et 50 produits par page.

produits page prestashop

 

Pour modifier les choix de la liste déroulante, nous allons surcharger la classe FrontController.php. Créer un fichier FrontController.php dans le dossier www/override/classes/ et insérez le code suivant :

 

<?php
class FrontController extends FrontControllerCore
{
	public function pagination($nbProducts = 10)
	{
		if (!self::$initialized)
			$this->init();

		$nArray = (int)(Configuration::get('PS_PRODUCTS_PER_PAGE')) != 10 ? array((int)(Configuration::get('PS_PRODUCTS_PER_PAGE')), 8, 12, 16) : array(8, 12, 16);
		// Clean duplicate values
		$nArray = array_unique($nArray);
		asort($nArray);
		$this->n = abs((int)(Tools::getValue('n', ((isset(self::$cookie->nb_item_per_page) AND self::$cookie->nb_item_per_page >= 10) ? self::$cookie->nb_item_per_page : (int)(Configuration::get('PS_PRODUCTS_PER_PAGE'))))));
		$this->p = abs((int)(Tools::getValue('p', 1)));

		$current_url = tools::htmlentitiesUTF8($_SERVER['REQUEST_URI']);
		//delete parameter page
		$current_url = preg_replace('/(\?)?(&)?p=\d+/', '$1', $current_url);

		$range = 2; /* how many pages around page selected */

		if ($this->p < 0)
			$this->p = 0;

		if (isset(self::$cookie->nb_item_per_page) AND $this->n != self::$cookie->nb_item_per_page AND in_array($this->n, $nArray))
			self::$cookie->nb_item_per_page = $this->n;

		if ($this->p > ($nbProducts / $this->n))
			$this->p = ceil($nbProducts / $this->n);
		$pages_nb = ceil($nbProducts / (int)($this->n));

		$start = (int)($this->p - $range);
		if ($start < 1)
			$start = 1;
		$stop = (int)($this->p + $range);
		if ($stop > $pages_nb)
			$stop = (int)($pages_nb);
		self::$smarty->assign('nb_products', $nbProducts);
		$pagination_infos = array(
			'products_per_page' => (int)Configuration::get('PS_PRODUCTS_PER_PAGE'),
			'pages_nb' => $pages_nb,
			'p' => $this->p,
			'n' => $this->n,
			'nArray' => $nArray,
			'range' => $range,
			'start' => $start,
			'stop' => $stop,
			'current_url' => $current_url
		);
		self::$smarty->assign($pagination_infos);
	}
}

 

Pour modifier le nombre de produits, modifiez la ligne 9. Vous n’êtes pas non plus limité à 3 choix, vous pouvez en avoir plus : array(4, 8, 12, 16, 20, 24);

 

 

Edit :

Afficher tous les produits

Suite à une demande en commentaire, voici le code pour insérer également l’option “Tous” qui comme son nom l’indique, permet d’afficher tous les produits.

Le code à placer dans votre FrontController.php est le même que le précédent, excepté pour la ligne 9 :

$nArray = (int)(Configuration::get('PS_PRODUCTS_PER_PAGE')) != 10 ? array((int)(Configuration::get('PS_PRODUCTS_PER_PAGE')), 3 => 3, 4 => 4, 'Tous' => 1000) : array(3, 4, 1000);

 

Vous remarquerez qu’il y a un système de key => value. C’est à dire que vous pouvez mettre le texte que vous souhaitez pour telle ou telle nombre de produits affichés. L’option “Tous” affiche en fait au maximum 1000 produits. Vous pouvez mettre 100000 pour être tranquille mais je pars du principe que très peu de personnes ont 1000 produits dans une seule et unique catégorie.

Par ailleurs, il est nécessaire de modifier le fichier pagination.tpl de votre thème (à la ligne 93 chez moi).

Avant :

{foreach from=$nArray item=nValue}
    {if $lastnValue <= $nb_products}
        <option value="{$nValue|escape:'htmlall':'UTF-8'}" {if $n == $nValue}selected="selected"{/if}>{$nValue|escape:'htmlall':'UTF-8'}</option>
    {/if}
    {assign var="lastnValue" value=$nValue}
{/foreach}

 

Maintenant :

{foreach from=$nArray key="key" item=nValue}    
    {if $key == '0'}
        <option value="{$nValue|escape:'htmlall':'UTF-8'}" {if $n == $nValue}selected="selected"{/if}>{$nValue|escape:'htmlall':'UTF-8'}</option>
    {else}
        <option value="{$nValue|escape:'htmlall':'UTF-8'}" {if $n == $nValue}selected="selected"{/if}>{$key|escape:'htmlall':'UTF-8'}</option>
    {/if}
{/foreach}

 

 

A vous de jouer ;)

Téléchargement automatique de WordPress et modules
Prestashop : affichage d'un produit indisponible dans le panier

21 Comments on “Prestashop : nombre de produits par page”

  1. Bonjour,

    c’est très clair et bien fait. De mon côté, je cherche à limiter le nombre de produit par page et retirer le menu déroulant (10;20 ou 50). Avez-vous une solution ?

    Merci d’avance et bonne continuation.

    1. Bonjour,

      Personnellement je passerais par les préférences de Prestashop pour limiter le nombre de produits par page : Préférences > Produits > Produits par page.

      Si il y a plus de produits dans la catégorie (catalogue) que le nombre de produits qui doivent s’afficher, les produits s’afficheront dans la catégorie en fonction du type de tri sélectionné. Préférences > Produits > Tri par défaut.

      Puis, je cacherais le menu déroulant en CSS en ajoutant dans le global.css le code display:none; à form.pagination

      De cette façon, si par la suite vous devrez ajouter à nouveau ce menu déroulant, il faudra juste supprimer une ligne de CSS sans toucher au template directement.

      En espérant vous avoir aidé.

      1. Bonjour,

        merci pour votre réponse rapide. J’ai environ 35 produits max par catégorie, donc en mettant 50 produits je suis bon.

        Par contre, j’ai plusieurs form.pagination dans mon global.css et je ne suis pas super doué, lequel dois-je prendre ?

        Merci encore.

      2. Si je me souviens bien, de base il n’y a qu’un form.pagination.
        Il y a aussi du style pour d’autres éléments appartenants à la forme : form.pagination label, form.pagination select, form.pagination option etc.

        Pour être sûr, vous pouvez mettre ce code tout en bas du fichier global.css :
        form.pagination { display:none; }

      3. Merci, c’est exactement ça, mais en fait, il faudrait que j’affiche 10 produits par page avec la possibilité de consulter la page 1,2,3 ou 4 ….

        C’est un peu confus. Le but étant de prévoir un fond de page pour 10 produits et ainsi ne pas donner la possibilité au client d’afficher plus de 10 produits mis de naviguer sur 4 pages pour 33 produits …

        Je ne sais pas si je suis très clair.

        En tout cas merci encore.

  2. Il y a deux choses : un filtre sur le nombre de produits et la pagination des catégories.
    La pagination et le filtre sont gérés par des fichiers et des fonctions différentes.
    Nativement, tous les thèmes de Prestashop incluent la pagination.

    Le fait de régler le nombre de produits par page va modifier le nombre de pages en fonction du nombre de produits présents dans la catégorie.

    Dans votre cas, il faudra mettre 10 produits par page et cacher le menu déroulant.
    Par contre, j’imagine que si c’est une image de fond et qu’il n’y a que 3 produits, il y aura 7 emplacements vides. Mais ceci n’est pas le sujet, je vous laisse régler ça ;)

    1. Nickel, en fait,j’avais mis 50 produits, mais en mettant 10, j’ai bien les numéros de page.

      Merci beaucoup, et pour info, j’ai une rubrique sans produits et le scroll s’arrête aux modules de côté.

      Merci encore et bonne continuation, je vais garder votre site en favori.

      Cordialement.

  3. Bonjour,

    Merci pour cette très bonne astuce, néanmoins, quand on utilise le module advanced_search4 et que l’on sélectionne un critère, la mise en forme repart comme si la modification (l’ajout du Front controler) n’était pas existante.

    Avez-vous une idée pour régler ce problème ?

    Merci,
    Ludovic

    1. Bonjour,
      Je n’utilise pas le module et je ne le possède pas.
      Je ne peux donc pas regarder mais il peut y avoir une incompatibilité quelque part.
      Avez-vous testé ce module sur une version de base ?
      Lorsque vous modifiez le nombre de produits par page, des paramètres sont ajoutées dans l’url. Par exemple : ?n=20&id_category=5
      Et comme votre module utilise la navigation à facette (entre autre), il ajoute d’autres paramètres dans l’url (je présume). Peut être qu’il ne conserve tout simplement pas les paramètres précédents.

      1. Bonjour,

        Merci de votre réponse, j’ai résolu ce problème (qui n’en était pas vraiment un).

        Voici la solution, si cela peut servir à d’autres.

        En fait le module advanced_search 4 propose dans l’onglet “comportement” une ligne qui demande le nombre de produit à afficher par page qu’il suffit de renseigner à sa convenance.

        Bonne journée,
        Ludovic

  4. Bonjour, l’info à l’air pas mal en revanche pour moi cela n’a pas fonctionné, en revanche j’avais d’autres surcharges peut-être peut-il y avoir des conflits?

    1. Pour toutes les catégories, la méthode simple est de passer par le back-office : Préférences > Produits > Produits par page et de mettre un grand nombre. Si c’est pour une catégorie en particulier, il va falloir bidouiller les fichiers sources :/

      1. Ah je me disais, ça ne pouvait pas être aussi facile :p
        J’ai mis à jour l’article pour expliquer comment faire (cf partie ‘Edit’).

      2. ok Merci beaucoup ça marche. Parcontre j’ai un petit soucis, lorsque je modifie la ligne 9.

        alors ça ne me renvois que les deux premières valeurs dans la liste déroulante… 10 et 50… je ne comprends pas si j’ai fait une érreur quelques part.

        deuxième question pourquoi modifier pagination.tpl ?

      3. Cela ne fonctionne pas car vous n’avez justement pas modifié pagination.tpl.
        A la base, il n’y a que des valeurs. Nous avons modifié les fichiers sources de façon à attribuer une valeur à une clé.
        Le fichier pagination.tpl de base ne prend pas en compte les clés, donc il ne va vous afficher que les nombres dont la clé est identique à la valeur (en gros). C’est pour cette raison que dans votre cas, il n’affiche que 10 et 50.

  5. Bonjour Jérôme,
    merci pour ton tutorial. J’ai trouvé ton site web en recherchant comment supprimer cette possibilité dans Prestashop.
    Sais-tu comment faire pour supprimer (totalement) la possibilité de choisir le nombre de produits par page ? C’est à dire supprimer le “Lister : produits par page”, plus le menu déroulant sous Prestashop 1.5.3.1 STP ?
    Merci pour ta réponse.
    Cordialement

    1. Je n’ai plus cette fonctionnalité sur ma 1.5. D’ailleurs il me semble que le thème de base ne le possède pas non plus.
      J’avais l’habitude d’aller dans le pagination.tpl et de commenter les lignes qui appellent cette fonctionnalité :

      {if $nb_products > 10}
          
      [...]
      {/if}
  6. Bonjour,

    Je n’arrive pas à reproduire cette surcharge sur un PrestaShop 1.5.4.1 …

    J’ai recopié la function pagination du fichier /www/classes/controller/FrontController.php …

    Je l”ai mise dans un nouveau fichier /www/override/classes/controller/FrontController.php à l’intérieur d’une class FrontController extends FrontControllerCore

    J’ai fait les modifs à la ligne qui va bien pour les nouvelles valeurs, mais rien ne change dans mon front …

    J’ai essayé de mettre ce nouveau fichier dans d’autres répertoires (/override/classes/, /override/controllers/front, …) mais rien non plus …

    J’ai raté quelque chose ?

    Merci d’avance

Laisser un commentaire

Votre adresse de messagerie ne sera pas publiée. Les champs obligatoires sont indiqués avec *