Jump to content

Impossible de créer une commande dans le backoffice (erreur js)


Recommended Posts

Bonsoir,

j'ai un problème que je tourne dans tous les sens depuis 2 jours sans succès, je viens donc demander vos lumières ;-)

 

Je m'occupe d'un site en prestashop 1.5.6.1 qui tourne bien en frontoffice.

 

La version de php est 5.6.3

 

Il y a quelques temps, j'ai remarqué que je ne pouvais plus créer une commande depuis le backoffice:

- lorsque je recherche un client depuis le formulaire de recherche de clients, j'ai bien la liste des clients avec le bouton "choisir" qui s'affiche (cf capture)

- lorsque je clique sur "choisir", cela devrait afficher la liste des paniers et commandes de ce client, mais ça ne fonctionne pas. J'ai une erreur dans la console javascript :

 



Uncaught TypeError: Cannot read property 'found' of null
    at Object.success (index.php?controller=AdminOrders&addorder&token=6255b76…:803)
    at o (jquery-1.7.2.min.js:2)
    at Object.fireWith [as resolveWith] (jquery-1.7.2.min.js:2)
    at w (jquery-1.7.2.min.js:4)
    at d (jquery-1.7.2.min.js:4)
    at Object.send (jquery-1.7.2.min.js:4)
    at Function.ajax (jquery-1.7.2.min.js:4)
    at setupCustomer (index.php?controller=AdminOrders&addorder&token=6255b76…:788)
    at HTMLAnchorElement.onclick (index.php?controller=AdminOrders&addorder&token=6255b76…:1)


 

J'ai remonté toute la chaîne :

- le clic sur le bouton appelle la fonction js setupCustomer, 

- qui fait un appel ajax à la fonction searchCarts dans AdminCartsController

- qui va récupérer les paniers et commandes dans la bdd. Jusque là tout va bien.

- ce qui cloche, c'est que cette fonction fait appel à Tools::jsonEncode($to_return), et c'est là qu'est l'erreur => cette fonction Tools::jsonEncode renvoie une erreur, d'où le 'property 'found' of null' dans la console...

- je suis allée voir cette fonction:

 



public static function jsonEncode($data)
{
if (function_exists('json_encode')){
return json_encode($data);
}
else
{
include_once(_PS_TOOL_DIR_.'json/json.php');
$pear_json = new Services_JSON();
return $pear_json->encode($data);
}
}


 

elle fait appel à json_encode($data), et cette fonction json_encode renvoie une erreur "recursion detected"

j'ai essayé de supprimer le premier if, pour ne laisser que l'appel à l'autre alternative, mais cela me provoque une erreur 500. 

Et je ne peux pas voir à quoi ça correspond cette erreur, car si j'active le mode define('_PS_MODE_DEV_', true); , je n'ai plus l'erreur js dans la console...

 

Je n'y comprends vraiment rien...

 

Je précise que j'ai vidé le cache, désactivé les CCC, désactivé les modules non natifs et récemment installés, désactivé les override...

 

J'ai le même pb sous Edge et Firefox

 

Cette fonctionnalité fonctionnait il y  a quelques mois...

 

J'espère vraiment que quelqu'un aura une idée pour m'aider, car je ne sais plus quoi faire...

 

Peut-être quelqu'un a-t-il déjà résolu ce genre de pb? (j'ai lu beaucoup de topics avec un problème proche du mien, mais jamais de solution :`(

 

Bonne soirée

 

Sophie

 

post-531411-0-57568800-1486772703_thumb.png

Link to comment
Share on other sites

Merci pour votre réponse.

 

Donc j'ai désactivé les modules présents dans backofficeheader (et j'en ai profité pour dégreffer 2 modules (ogone et authorized net) qui étaient greffés là mais pas activés), mais le problème en venait pas de là.

 

Par contre, j'ai poussé un peu les recherches sur les overrides. Jusqu'alors je les avais désactivés via le bouton dans Performances;

 

Là j'ai modifié les noms de fichiers d'override en leur ajoutant __ avant le nom, et j'ai trouvé le coupable : un override de la classe Cart.php, qui a été installé pour faire fonctionner le module "Livraison gratuite" d'Emmanuel Marichal et l'affichage du montant restant avant gratuité dans le panier.

 

Voici l'override:

<?php

class Cart extends CartCore 
{

	public $freelivery_remaining = null;

  public function getSummaryDetails($id_lang = null, $refresh = false)
  {
    $summary = parent::getSummaryDetails($id_lang, $refresh);

		if (!isset($this->context))
			$this->context = Context::getContext();

		if (!$this->context->cart)
			return $summary;

		$ps_free_price = Tools::convertPrice(Configuration::get('PS_SHIPPING_FREE_PRICE'), Currency::getCurrencyInstance($this->context->cart->id_currency));

		$total = $summary['total_products_wt'];
		if ((int)Configuration::get('FREELIVERY_CALCULATION_RULE'))
			$total += $summary['total_discounts'];

		$ps_remaining = $ps_free_price - $total;

		if ($summary['total_shipping'] == 0 || ($total >= $ps_free_price && $ps_free_price > 0))
			$summary['free_ship'] = 0;
		else if ($ps_remaining < $this->freelivery_remaining && $ps_free_price > 0)
			$summary['free_ship'] = $ps_remaining;
		else
			$summary['free_ship'] = (float)$this->freelivery_remaining;

    return $summary;
  }
	
	
}

Mais, ça n'a pas tout résolu: j'arrive maintenant à afficher les paniers et commandes, mais c'est la suite qui bloque:

 

- quand je clique sur un des boutons "utiliser ce panier", j'obtiens le message suivant dans la console:


Uncaught TypeError: Cannot read property 'toFixed' of undefined
    at formatCurrency (tools.js:63)
    at Object.<anonymous> (index.php?controller=AdminOrders&addorder&token=6255b76…:977)
    at Function.each (jquery-1.7.2.min.js:2)
    at updateCartProducts (index.php?controller=AdminOrders&addorder&token=6255b76…:969)
    at displaySummary (index.php?controller=AdminOrders&addorder&token=6255b76…:1049)
    at Object.success (index.php?controller=AdminOrders&addorder&token=6255b76…:685)
    at o (jquery-1.7.2.min.js:2)
    at Object.fireWith [as resolveWith] (jquery-1.7.2.min.js:2)
    at w (jquery-1.7.2.min.js:4)
    at d (jquery-1.7.2.min.js:4)

- et ça bloque aussi lorsque j'essaie d'ajouter un produit avec le bloc "rechercher un produit": la liste des produits s'affiche quand je commence à taper un nom, mais lorsque je clique sur "ajouter au panier j'ai une erreur:

 

Uncaught TypeError: Cannot read property 'toFixed' of undefined
    at formatCurrency (tools.js:63)
    at Object.<anonymous> (index.php?controller=AdminOrders&addorder&token=6255b76…:977)
    at Function.each (jquery-1.7.2.min.js:2)
    at updateCartProducts (index.php?controller=AdminOrders&addorder&token=6255b76…:969)
    at displaySummary (index.php?controller=AdminOrders&addorder&token=6255b76…:1049)
    at Object.success (index.php?controller=AdminOrders&addorder&token=6255b76…:1117)
    at o (jquery-1.7.2.min.js:2)
    at Object.fireWith [as resolveWith] (jquery-1.7.2.min.js:2)
    at w (jquery-1.7.2.min.js:4)
    at XMLHttpRequest.d (jquery-1.7.2.min.js:4)
formatCurrency @ tools.js:63
(anonymous) @ index.php?controller=AdminOrders&addorder&token=6255b76…:977
each @ jquery-1.7.2.min.js:2
updateCartProducts @ index.php?controller=AdminOrders&addorder&token=6255b76…:969
displaySummary @ index.php?controller=AdminOrders&addorder&token=6255b76…:1049
success @ index.php?controller=AdminOrders&addorder&token=6255b76…:1117
o @ jquery-1.7.2.min.js:2
fireWith @ jquery-1.7.2.min.js:2
w @ jquery-1.7.2.min.js:4
d @ jquery-1.7.2.min.js:4

pourtant, le panier est créé en bdd, car lorsque je reviens sur la page de création de commande, je vois ce nouveau panier dans la liste...

 

Je précise que j'ai essayé après avoir désactivé le module "Livraison gratuite", mais ç an'a rien changé...

 

Merci encore de m'aider sur ce problème bien tordu ;-)

 

Sophie

Link to comment
Share on other sites

Bon, j'ai trouvé d'où venait le deuxième problème :

 

Dans AdminCartsController.php dans la fonction getCartSummary(), il manquait ces 2 lignes:

$product['numeric_price'] = $product['price'];
$product['numeric_total'] = $product['total'];

Je ne comprends pas pourquoi elles avaient disparu, pourtant la création de commande depuis le BO avait fonctionné avant...

 

Il me reste maintenant à comprendre pourquoi l'override sur Cart.php bloque l'affichage des paniers et commandes, car j'ai besoin du module Livraison Gratuite...

Link to comment
Share on other sites

Suite de mes aventures prestasopiennes, au cas où cela intéresserait quelqu'un ;-)

 

L'origine du bug js qui empêchait de lister les paniers et commandes sur la pagre de création de commande depuis le BO était tout simplement due à .... la version de php!!!

 

Il y a quelques mois, je l'avais passé de 5.4 à 5.6, tout me semblait ok, mais en fait non...

 

Je suis donc redescendue à 5.4, et ça fonctionne à nouveau... En espérant que ça n'ait pas cassé autre chose...

 

Du coup, il me vient une question subsidiaire: où peut-on savoir la version maximum (ou minimum) de php nécessaire pour un module donné?

 

Sur la page des addons de prestashop, on indique la/ les versions prestashop compatibles, mais aucune indication sur la version de php...

Link to comment
Share on other sites

Y a un super bug qui n'a jamais été corrigé dans Tools.js depuis 5 ans maintenant...

 

ligne 63, remplacez:

price = parseFloat(price.toFixed(10));

par:

    // BUG !!!! price = parseFloat(price.toFixed(10));
	if(!price)
		price = price.toFixed(10);
	price = parseFloat(price);

Le bug ne viens pas de la version php^^

la 5.6 est simplement moins permissive sur les codes moisis

Link to comment
Share on other sites

Merci pour le tuyau :-)

 

j'ai modifié le code dans tools.js (en mettant:

 if(!price)
        price = price.toFixed(6);
    price = parseFloat(price);

parce que j'avais (6) au lieu de (10=) dans le code d'origine...

 

Mais quand je remonte la version de php à 5.6 (et même 5.5), j'ai à nouveau un bug lorsque que je clique sur "choisir", impossible d'afficher les paniers et commandes:

 

Uncaught TypeError: Cannot read property 'found' of null
    at Object.success (index.php?controller=AdminOrders&addorder&token=6255b76…:803)
    at o (jquery-1.7.2.min.js:2)
    at Object.fireWith [as resolveWith] (jquery-1.7.2.min.js:2)
    at w (jquery-1.7.2.min.js:4)
    at d (jquery-1.7.2.min.js:4)
    at Object.send (jquery-1.7.2.min.js:4)
    at Function.ajax (jquery-1.7.2.min.js:4)
    at setupCustomer (index.php?controller=AdminOrders&addorder&token=6255b76…:788)
    at HTMLAnchorElement.onclick (index.php?controller=AdminOrders&addorder&token=6255b76…:1)

C'est le bug que je croyais avoir résolu en début de ce post :`(

 

Il n'y aurait pas un autre code pourri qui traine qqpart dans prestashop ?

 

Ou alors c'est dans un module...

Link to comment
Share on other sites

  • 3 weeks later...

J'ai enfin résolu mon problème de création de commande qui ne fonctionnait pas depuis le BO.

 

Après des recherches plus poussées, j'ai trouvé l'explication du bug.
La voici:
 
- lorsque je supprimais l'override de Cart.php, cela fonctionnait à nouveau...
 
- lorsque je rétrogradais ma version de php de 5.6 à 5.4, cela fonctionnait, même avec l'override de Cart.php présent.
 
En fait, les données renvoyées par la fonction displayAjaxSearchCarts() de AdminCartsController.php provoquaient une erreur json lorsqu'on est en php 5.5+ et que l'override de Cart.php était présent...
 
En comparant ces données, j'ai remarqué que lorsqu'on a l'override de Cart.php, il y a toute une portion de code en plus dans le tableau renvoyé par ajaxReturnVars() (dans AdminCartsController.php, appelée par displayAjaxSearchCarts() ): il y a une entrée supplémentaire 'context' => dans le tableau, et c'est ce qui fait planter la fonction Tools::jsonEncode() quand on est en php 5.5+. Lorsqu'on est en php 5.4, cette entrée est également présente, mais cela ne fait pas planter la fonction Tools::jsonEncode().
 
Dans l'override de Cart.php , c'est la partie de code suivante qui créait la nouvelle entrée 'context':
 
if (!isset($this->context))
$this->context = Context::getContext();
 
if (!$this->context->cart)
return $summary;
 
Quand je commentais ces lignes, je peux à nouveau créer une commande dans le BO.
 
Avec, l'aide du développeur du module qui utilise cet override, j'ai pu corriger le bug en remplaçant ce code ci-dessus dans l'override de Cart.php par celui-ci:
 
if (!Module::isEnabled('freelivery'))
return $summary;

if (!isset(Context::getContext()->cart))
return $summary;

J'avais le même problème sur une boutique Prestashop 1.6, je l'ai résolu en mettant à jour le module Freelivery Livraison gratuite => version 1.4.2

 

J'espère que ça pourra être utile à d'autres ;-)

Link to comment
Share on other sites

  • 5 months later...

Bonjour, 

Il semble que l'ajout de commande et/ou l'ajout d'articles dans une commande dans le BO soit un réel problème. 

J'ai la même chose dans une boutique avec Colissimo Flexibilite et pas moyen de trouver la solution. 

Un conflit avec un message : You have included the Google Maps API multiple times on this page. This may cause unexpected errors...

Qui ne mène nul part.  

Même la désactivation des modules n'a rien donné ! De toute façon il semble que la désactivation soit ... bidon. 

Bref a part réécrire presta, je ne vois pas. 

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...