Prestashop : votre panier se vide ?

On retrouve souvent ce sujet de conversation sur les forums dédiés à Prestashop. Il est certain que de nombreux facteurs peuvent en être à l’origine.

Je vous expose ici un cas qui peut arriver principalement aux marchands, ou bien aux clients assidus de votre boutique Prestashop.

En effet, il peut apparaître un problème d’ajout au panier lorsque vous visitez de nombreuses pages de votre site provoquant ce problème de panier qui se vide.

L’origine de ce bug est lié au poids que votre cookie Prestashop a atteint ; poids qui a été alourdi par la module blockviewed qui vient stocker dans le cookie une immense liste d’ID produits que vous avez visité.

Ceci va donc faire atteindre à votre cookie la taille limite autorisé par les navigateur (autour de 4096 octects).

Pour corriger ce problème, 2 solutions sont possibles :

  1. Mettre en place à l’enregistrement  du cookie, un contrôle et une réduction du nombre d’ID de pages vues de la variable « viewed »
  2. Ou bien surcharger le module blockviewed pour qu’il effectue lui-même ce contrôle.

En limitant à une valeur des 15 derniers ID, vous ne rencontrerez plus le problème de ce panier qui se vide !

Dans le cas de la modification du module, donc à rajouter dans la classe « Override/modules/blockviewed/blockviewed.php »


	public function hookHeader($params)
	{
		$id_product = (int)Tools::getValue('id_product');
		$productsViewed = (isset($params['cookie']->viewed) && !empty($params['cookie']->viewed)) ? array_slice(array_reverse(explode(',', $params['cookie']->viewed)), 0, Configuration::get('PRODUCTS_VIEWED_NBR')) : array();
		if ($id_product && !in_array($id_product, $productsViewed))
		{
			$product = new Product((int)$id_product);
			if ($product->checkAccess((int)$this->context->customer->id))
			{
                            $currentCookieValues = array();
				if (isset($params['cookie']->viewed) && !empty($params['cookie']->viewed)) {
                                    $currentCookieValues = explode(",", $params['cookie']->viewed);
                                }
                                $currentCookieValues[] = ','.(int)$id_product;
                                $params['cookie']->viewed = implode(",", array_slice($currentCookieValues, max(0, count($currentCookieValues) - 15), 15));
			}
		}
		$this->context->controller->addCSS(($this->_path).'blockviewed.css', 'all');
	}