Jump to content

Frontcontroller::init - Cart cannot be loaded or an order has already been placed using this cart


Recommended Posts

Bonjour,

 

Le message "Frontcontroller::init - Cart cannot be loaded or an order has already been placed using this cart" apparait dans les logs pour toutes les commandes quelques soit leur moyen de paiement.

Je suis en PS 1.6.1.1 depuis plus d'1 an en multiboutiques et cet incident persiste depuis la mise à jour vers cette version.

 

J'ai trouvé un sujet traitant de ce problème sur le forum PS : https://www.prestashop.com/forums/topic/466782-cart-cannot-be-loaded-or-an-order-has-already-been-placed-using-this-cart/page-3

 

Est-ce que l'équipe Prestashop peut :

  1. Confirmer l'existence d'un bug qui se produit à l'issue de le confirmation de commande tel que décrit dans le post de kalle@makewebo : So the problem we found is that at the order-confirmation page the id_cart cookie was still set. So in FrontController init() it then checks if that cookie is set and then checks if the cart already been used for an order, which it then has. Then it will write out the error in the log.

     
  2. Valider le bon fonctionnement du correctif apporter pas kalle@makewebo et bellini13 dans le même Post :
    Just add the PaymentModule.php in /override/classes/ folder

Votre réponse (Prestashop) est attendue par un très grand nombre d'utilisateurs et de développeurs.

Si par hasard d'autres utilisateurs de PS ont rencontré ce problème et l'ont résolus , merci de nous faire par de la solution appliquée.

 

Merci pour votre compréhension.

Edited by L E O (see edit history)
Link to comment
Share on other sites

En fait la méthode init() complète doit être celle-là

    public function init()
    {
        parent::init();

        $this->id_cart = (int)(Tools::getValue('id_cart', 0));
        $is_guest = false;

        /* check if the cart has been made by a Guest customer, for redirect link */
        if (Cart::isGuestCartByCartId($this->id_cart)) {
            $is_guest = true;
            $redirectLink = 'index.php?controller=guest-tracking';
        } else {
            $redirectLink = 'index.php?controller=history';
        }

        $this->id_module = (int)(Tools::getValue('id_module', 0));
        $this->id_order = Order::getOrderByCartId((int)($this->id_cart));
	if ($this->context->cookie->id_cart) {
	    $this->context->cookie->__unset('id_cart');
	}
        $this->secure_key = Tools::getValue('key', false);
        $order = new Order((int)($this->id_order));
        if ($is_guest) {
            $customer = new Customer((int)$order->id_customer);
            $redirectLink .= '&id_order='.$order->reference.'&email='.urlencode($customer->email);
        }
        if (!$this->id_order || !$this->id_module || !$this->secure_key || empty($this->secure_key)) {
            Tools::redirect($redirectLink.(Tools::isSubmit('slowvalidation') ? '&slowvalidation' : ''));
        }
        $this->reference = $order->reference;
        if (!Validate::isLoadedObject($order) || $order->id_customer != $this->context->customer->id || $this->secure_key != $order->secure_key) {
            Tools::redirect($redirectLink);
        }
        $module = Module::getInstanceById((int)($this->id_module));
        if ($order->module != $module->name) {
            Tools::redirect($redirectLink);
        }
    }
  • Like 1
Link to comment
Share on other sites

Merci Eolia pour cette réponse SUPER rapide !

 

Questions subsidiaires :

Je mets ça où, à la place de quoi ? Qu'est-ce que cela corrige ?

Est-ce que je dois quand même appliquer le correctif proposé par kalle@makewebo ?

 

Merci ;-)

Link to comment
Share on other sites

Bonjour,

En cherchant, j'ai trouvé une portion de code similaire dans le fichier controllers/front/OrderConfirmationController.php

La différence se situe à la ligne 58 ou les lignes suivantes sont manquantes :

    if ($this->context->cookie->id_cart) {
        $this->context->cookie->__unset('id_cart');
    }

 

Est-ce qu'il s'agit du bon fichier ?

Dois-je seulement ajouter ces lignes pour corriger le pb ?

 

Voici le fichier OrderConfirmationController.php que j'obtiendrai après correction. Je rappelle que je suis sur PS 1.6.1.1.

<?php
/*
* 2007-2015 PrestaShop
*
* NOTICE OF LICENSE
*
* This source file is subject to the Open Software License (OSL 3.0)
* that is bundled with this package in the file LICENSE.txt.
* It is also available through the world-wide-web at this URL:
* http://opensource.org/licenses/osl-3.0.php
* If you did not receive a copy of the license and are unable to
* obtain it through the world-wide-web, please send an email
* to license@prestashop.com so we can send you a copy immediately.
*
* DISCLAIMER
*
* Do not edit or add to this file if you wish to upgrade PrestaShop to newer
* versions in the future. If you wish to customize PrestaShop for your
* needs please refer to http://www.prestashop.com for more information.
*
*  @author PrestaShop SA <contact@prestashop.com>
*  @copyright  2007-2015 PrestaShop SA
*  @license    http://opensource.org/licenses/osl-3.0.php  Open Software License (OSL 3.0)
*  International Registered Trademark & Property of PrestaShop SA
*/

class OrderConfirmationControllerCore extends FrontController
{
    public $ssl = true;
    public $php_self = 'order-confirmation';
    public $id_cart;
    public $id_module;
    public $id_order;
    public $reference;
    public $secure_key;

    /**
     * Initialize order confirmation controller
     * @see FrontController::init()
     */
    public function init()
    {
        parent::init();

        $this->id_cart = (int)(Tools::getValue('id_cart', 0));
        $is_guest = false;

        /* check if the cart has been made by a Guest customer, for redirect link */
        if (Cart::isGuestCartByCartId($this->id_cart)) {
            $is_guest = true;
            $redirectLink = 'index.php?controller=guest-tracking';
        } else {
            $redirectLink = 'index.php?controller=history';
        }

        $this->id_module = (int)(Tools::getValue('id_module', 0));
        $this->id_order = Order::getOrderByCartId((int)($this->id_cart));
        
    if ($this->context->cookie->id_cart) {
        $this->context->cookie->__unset('id_cart');
    }

        $this->secure_key = Tools::getValue('key', false);
        $order = new Order((int)($this->id_order));
        if ($is_guest) {
            $customer = new Customer((int)$order->id_customer);
            $redirectLink .= '&id_order='.$order->reference.'&email='.urlencode($customer->email);
        }
        if (!$this->id_order || !$this->id_module || !$this->secure_key || empty($this->secure_key)) {
            Tools::redirect($redirectLink.(Tools::isSubmit('slowvalidation') ? '&slowvalidation' : ''));
        }
        $this->reference = $order->reference;
        if (!Validate::isLoadedObject($order) || $order->id_customer != $this->context->customer->id || $this->secure_key != $order->secure_key) {
            Tools::redirect($redirectLink);
        }
        $module = Module::getInstanceById((int)($this->id_module));
        if ($order->module != $module->name) {
            Tools::redirect($redirectLink);
        }
    }

    /**
     * Assign template vars related to page content
     * @see FrontController::initContent()
     */
    public function initContent()
    {
        parent::initContent();

        $this->context->smarty->assign(array(
            'is_guest' => $this->context->customer->is_guest,
            'HOOK_ORDER_CONFIRMATION' => $this->displayOrderConfirmation(),
            'HOOK_PAYMENT_RETURN' => $this->displayPaymentReturn()
        ));

        if ($this->context->customer->is_guest) {
            $this->context->smarty->assign(array(
                'id_order' => $this->id_order,
                'reference_order' => $this->reference,
                'id_order_formatted' => sprintf('#%06d', $this->id_order),
                'email' => $this->context->customer->email
            ));
            /* If guest we clear the cookie for security reason */
            $this->context->customer->mylogout();
        }

        $this->setTemplate(_PS_THEME_DIR_.'order-confirmation.tpl');
    }

    /**
     * Execute the hook displayPaymentReturn
     */
    public function displayPaymentReturn()
    {
        if (Validate::isUnsignedId($this->id_order) && Validate::isUnsignedId($this->id_module)) {
            $params = array();
            $order = new Order($this->id_order);
            $currency = new Currency($order->id_currency);

            if (Validate::isLoadedObject($order)) {
                $params['total_to_pay'] = $order->getOrdersTotalPaid();
                $params['currency'] = $currency->sign;
                $params['objOrder'] = $order;
                $params['currencyObj'] = $currency;

                return Hook::exec('displayPaymentReturn', $params, $this->id_module);
            }
        }
        return false;
    }

    /**
     * Execute the hook displayOrderConfirmation
     */
    public function displayOrderConfirmation()
    {
        if (Validate::isUnsignedId($this->id_order)) {
            $params = array();
            $order = new Order($this->id_order);
            $currency = new Currency($order->id_currency);

            if (Validate::isLoadedObject($order)) {
                $params['total_to_pay'] = $order->getOrdersTotalPaid();
                $params['currency'] = $currency->sign;
                $params['objOrder'] = $order;
                $params['currencyObj'] = $currency;

                return Hook::exec('displayOrderConfirmation', $params);
            }
        }
        return false;
    }
}

 

Merci

Edited by L E O (see edit history)
Link to comment
Share on other sites

Malgré l'ajout de ces quelques lignes dans le script OrderConfirmationController.php, le problème persiste.

Lors de la dernière commande enregistrée, j'ai encore le log : Frontcontroller::init - Cart cannot be loaded or an order has already been placed using this cart

Que faire ?

Est-ce qu'il faut vider un cache pour que les modifs soient effectives ou autres ?

Edited by L E O (see edit history)
Link to comment
Share on other sites

Si ce ne sont que les logs qui vous ennuient, commentez la ligne 307 de FrontController.php:

if (Validate::isLoadedObject($cart) && $cart->OrderExists()) {
                //$errorLog = Tools::displayError('Cart cannot be loaded or an order has already been placed using this cart', false);
                //PrestaShopLogger::addLog('Frontcontroller::init - '.$errorLog, 1, null, 'Cart', (int)$this->context->cookie->id_cart, true);
                unset($this->context->cookie->id_cart, $cart, $this->context->cookie->checkedTOS);
                $this->context->cookie->check_cgv = false;
            }

Mais plus important, pour supprimer le die() débile où le client se retrouve avec une page blanche alors qu'il a juste fait un back avec son navigateur, ca se passe dans paymentmodule.php, vers la ligne 838, 2 lignes à commenter et rajouter les lignes suivantes:

            if (self::DEBUG_MODE) {
                PrestaShopLogger::addLog('PaymentModule::validateOrder - End of validateOrder', 1, null, 'Cart', (int)$id_cart, true);
            }
	    unset($this->context->cookie->id_cart, $this->context->cart, $this->context->cookie->checkedTOS);
            $this->context->cookie->check_cgv = false;
            return true;
        } 
	else {
            $error = Tools::displayError('Cart cannot be loaded or an order has already been placed using this cart');
            //PrestaShopLogger::addLog($error, 4, '0000001', 'Cart', intval($this->context->cart->id));
            //die($error);
	    unset($this->context->cookie->id_cart, $this->context->cart, $this->context->cookie->checkedTOS);
            $this->context->cookie->check_cgv = false;
	    Tools::redirect('index.php?controller=history');
        }
Edited by Eolia (see edit history)
  • Like 1
Link to comment
Share on other sites

Merci Eolia pour ta réponse.

 

Ce n'est pas le log qui me pose problème mais son origine que je cherche à corriger.

 

Tu n'as pas répondu à ma question concernant la méthode init() : de quel fichier s'agit il ?

Si c'est OrderConfirmationController.php alors la modification ne corrige rien apparemment (le log est toujours là donc le problème persiste).

 

Je vais tester la suppression du die() effectivement débile, surtout en version de production.

 

Si quelqu'un d'autre à des infos sur le sujet, nous sommes évidemment preneurs.

 

Merci à vous.

Link to comment
Share on other sites

Heu... le log c'est une information qui a été rajouté dans ces versions, mais à part le die(), pour les autres cas c'est transparent pour le client puisque son cookie->cart est réinitialisé

 

Ne vous prenez pas la tête pour rien, il y a des bugs beaucoup plus handicapants dans ces versions (arrondis, retours, stocks avancés, multi-boutique, etc...)

Link to comment
Share on other sites

Je suis entièrement d'accord avec toi !

 

Prestashop est une mine de BUGS très handicapante pour qui veut travailler sérieusement au développement de e-business.

Je me bats tous les jours avec ce monstre chronophage pour essayer de colmater les brèches de ses lacunes : multiboutiques, commandes erronées, arrondis, etc...

 

Et je pense migrer vers une solution payante mais vraiment faite pour les pros et pas pour jouer à la dînette.

 

Encore merci Eolia pour tes infos.

Link to comment
Share on other sites

Bonjour 

 

Moi j'ai un bug , ou les mails de confirmation de commande sont de temps en temps en dollars et de temps en temps en euros 

 

Sachant que j'ai sur Prest seulement l'euros comme devise 

 

Quelqu'un connait une solution ?

 

Merci a tous 


C'est lié a la meme erreur : Frontcontroller::init - Cart cannot be loaded or an order has already been placed using this cart

Link to comment
Share on other sites

  • 4 months later...

bonjour,

 

je vous fait part de mon expérience aussi sur ce message d'erreur on ne sait jamais car il y a différentes raisons qui génère ce bug j'ai l'impression et le log est le même pour tout le monde.....

 

Pour ma part je suis en prestashop 1.6.1.11 donc dernière version. J'ai fait une migration des datas (commande, clients, etc....car le site datait et les mises à jour successive avait rendu la base non conforme (oui oui le processus de mise à jour est comment dire a revoir ? :) , champ en trop, en moins etc.....

 

J'avais donc déplacé toute les datas sans avoir déplacé les paniers. Du coup lors des tests je rencontrai en permanence l'erreur décrite :

 

Frontcontroller::init - Cart cannot be loaded or an order has already been placed using this cart

 

En faite après avoir fait une commande test, le panier se vidait coté front office mais il était bien visible depuis le backoffice. La numérotation des paniers ayant redémarrer à 0, il associait ce nouveau panier à une vieille commande en base.

 

Après récupération des paniers depuis mon vieux site plus de soucis.

 

Voila bonne journée !

Link to comment
Share on other sites

  • 1 month later...

Bonjour à tous , 

 

J'ai le même problème de log, mais le pire c'est que mes clients ne reçoivent pas de conformation de paiement.

J'ai branché mon prestashop à un SMTP donc je vois passer les mails et donc seuls les mails de confirmation de paiement ne partent pas.

 

C'est un peu embêtant de faire du ecommerce sans pouvoir prévenir son client que son paiement à été accepté ... ça génère de la déception et des clients qui s'en vont.

 

Merci pour votre retour et votre aide

Cordialement

Link to comment
Share on other sites

  • 4 weeks later...

Meme probleme sur prestashop 1.6.11

Les produits commandés n'apparaissent pas dans la commande.

Pas de statut pour la commande donc pas de confirmation pour le client

et dans les logs 

 

Frontcontroller::init - Cart cannot be loaded or an order has already been placed using this cart

 

Ca fait plusieurs mois que ca dure et c'est 1 commande sur 3/4 environ 

 

 Meme problème avec paypal et payplug

Quelqu'un à une solution

Frontcontroller::init - Cart cannot be loaded or an order has already been placed using this cart
Link to comment
Share on other sites

Ne mélangez pas tout^^

 

Ce message, dans les logs, signifie que quelqu'un, après avoir passé commande a effectué un retour arrière ou a rafraichi la page (et donc renvoyé le formulaire) mais le panier a déjà été validé en commande donc c'est normal.

 

Pour les commandes vides, c'est un problème sur un module hooké sur le validateorder, donc rien à voir avec le paiement. (S'il y avait un souci avec le paiement en retour, la commande ne serait pas créée)

 

Regardez donc du côté des modules, il y en a au moins un qui doit générer une erreur dans le error.log d'Apache aux dates et heures des dites commandes.

Link to comment
Share on other sites

  • 1 month later...

Bonjour, à tous, je rencontre un souci similaire, Un ajout au panier, et quand ont va sur le panier, il est indiqué panier vide.

 

J'ai aussi ce message: Frontcontroller::init - Cart cannot be loaded or an order has already been placed using this cart

 

J'ai migré en début d'année avec un module d'un prestashop vers un autre prestashop.

 

Tous fonctionnait bien, mais depuis plusieurs jours j'ai ce problème.

Mais un fois connecté, plus de problème.

 

Cela peut-il venir des numéro de panier?

Link to comment
Share on other sites

  • 2 years later...
  On 6/20/2017 at 10:55 AM, Manu-shop said:

Bonjour, à tous, je rencontre un souci similaire, Un ajout au panier, et quand ont va sur le panier, il est indiqué panier vide.

 

J'ai aussi ce message: Frontcontroller::init - Cart cannot be loaded or an order has already been placed using this cart

 

J'ai migré en début d'année avec un module d'un prestashop vers un autre prestashop.

 

Tous fonctionnait bien, mais depuis plusieurs jours j'ai ce problème.

Mais un fois connecté, plus de problème.

 

Cela peut-il venir des numéro de panier?

Expand  

Bonjour, j'ai le même problème, je n'arrive pas à savoir d'où ça vient. Quelqu'un peut il me guider ?

En vous remerciant

Link to comment
Share on other sites

Trouver pourquoi^^

Ça peut être sa taille qui est trop grosse (classique avec le module "Produits déjà vus"), un module qui le réinitialise, un bug de code dans votre version, une mauvaise configuration de domaine... Il y a plein de raisons possibles.

Link to comment
Share on other sites

Ben ce n'est pas un dossier mais un petit fichier envoyé dans le navigateur de chaque utilisateur et il ne faut pas le vider justement, c'est lui qui conserve l'historique du client, son identifiant de panier etc.

Si vous n'y connaissez rien il faudrait demander à quelqu'un du métier car ça ne se debugue pas en 5 min ce genre de choses.

Link to comment
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
×
×
  • Create New...