SophieB Posted February 11, 2017 Share Posted February 11, 2017 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 Link to comment Share on other sites More sharing options...
Eolia Posted February 11, 2017 Share Posted February 11, 2017 Regardez les derniers modules hookés dans le backofficeheader... l'un d'eux doit utiliser un nom de variable js commun ou un assign smarty commun et le script se plante de cible... Link to comment Share on other sites More sharing options...
SophieB Posted February 11, 2017 Author Share Posted February 11, 2017 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 More sharing options...
SophieB Posted February 13, 2017 Author Share Posted February 13, 2017 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 More sharing options...
SophieB Posted February 15, 2017 Author Share Posted February 15, 2017 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 More sharing options...
Eolia Posted February 16, 2017 Share Posted February 16, 2017 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 More sharing options...
SophieB Posted February 16, 2017 Author Share Posted February 16, 2017 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 More sharing options...
SophieB Posted March 7, 2017 Author Share Posted March 7, 2017 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 More sharing options...
PascalB67 Posted September 6, 2017 Share Posted September 6, 2017 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 More sharing options...
Recommended Posts
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 accountSign in
Already have an account? Sign in here.
Sign In Now