L E O Posted June 4, 2015 Share Posted June 4, 2015 Bonjour à tous, j'ai développé un petit module qui me sert à mettre à jour automatiquement le statut des commandes expédiées via TNT. Ce module fonctionnait parfaitement mais depuis quelques jours il sort en erreur avec le message suivant : PHP Notice: Trying to get property of non-object in /home/britishcarcentre/www/classes/stock/StockManager.php on line 264PHP Notice: Trying to get property of non-object in /home/britishcarcentre/www/classes/stock/StockManager.php on line 265PHP Notice: Trying to get property of non-object in /home/britishcarcentre/www/classes/stock/StockManager.php on line 266PHP Fatal error: Uncaught exception 'PrestaShopException' with message 'Property StockMvt->id_employee is empty' in /home/britishcarcentre/www/classes/ObjectModel.php:846 Stack trace:#0 /home/www/classes/ObjectModel.php(260): ObjectModelCore->validateFields()#1 /home/www/classes/ObjectModel.php(464): ObjectModelCore->getFields()#2 /home/www/classes/ObjectModel.php(425): ObjectModelCore->add(true, false)#3 /home/www/classes/stock/StockManager.php(281): ObjectModelCore->save()#4 /home/www/classes/order/OrderHistory.php(218): StockManagerCore->removeProduct('12222', '0', Object(Warehouse), '1', '3', true, 1106)#5 /home/www/modules/tntsynchro/tnt_synchro.class.php(142): OrderHistoryCore->changeIdOrderState(4, 1106)#6 /home/www/modules/tntsynchro/tnt_synchro.class.php(94): tnt_synchroclass->change_etat(1106, '4')#7 /home/www/modules/tntsynchro/cron_tnt.php(14): tnt_synchrocl in /home/www/classes/ObjectModel.php on line 846 Visiblement il lui manque des objets qui ne sont pas déclarés. Voici l'entête du script lancé via crontab. Je précise que je ne suis pas un as de la POO. En cherchant un peu j'ai vaguement compris qu'il me manquait les 2 classes Employee.php et Link.php (pourquoi celles-ci) mais je ne sais pas comment les instancier proprement. <?phpinclude_once(dirname(__FILE__).'/../../config/config.inc.php');include_once(dirname(__FILE__).'/../../init.php');require_once(dirname(__FILE__).'/tnt_synchro.class.php');$tnt_synchroclass = new tnt_synchroclass();$tnt_synchroclass->init(); $result_1 = $tnt_synchroclass->synchro_to_exped(); echo '<pre>'.$result_1.'</pre>'; $result_2 = $tnt_synchroclass->synchro_to_livre(); echo '<pre>'.$result_2.'</pre>';?> Merci d'avance pour votre aide ! Link to comment Share on other sites More sharing options...
J. Danse Posted June 4, 2015 Share Posted June 4, 2015 Cela ressemble surtout à un soucis de contexte ; les classes sont présentes mais le contexte n'est pas initialisé. L'employée est donc inexistant, par exemple. Un rajout de Context::getContext() après les require devrait peut-être aidé, je pense. Link to comment Share on other sites More sharing options...
L E O Posted June 4, 2015 Author Share Posted June 4, 2015 Merci pour cette première réponse rapide. C'est effectivement ce que je pense aussi, il manque des classes. J'ai ajouté Context::getContext(); donc maintenant j'ai ça en entête : include_once(dirname(__FILE__).'/../../config/config.inc.php');include_once(dirname(__FILE__).'/../../init.php');require_once(dirname(__FILE__).'/tnt_synchro.class.php');Context::getContext(); Le résultat est identique Une autre idée ? Link to comment Share on other sites More sharing options...
J. Danse Posted June 4, 2015 Share Posted June 4, 2015 Il faudrait voir pour le rajouter également dans le tnt_synchro_class.php éventuellement. A voir où il n'est pas initialisé, à dire vrai :-/ Link to comment Share on other sites More sharing options...
L E O Posted June 4, 2015 Author Share Posted June 4, 2015 Malheureusement c'est pareil. J'ai oublié de préciser que la version de PS est 1.6.0.9 Link to comment Share on other sites More sharing options...
Vinum Posted June 4, 2015 Share Posted June 4, 2015 Bonjour, Si vous appelez le fichier à l'aide d'une tache cron, il n'y a aucun context créé. Donc il faut soit en créer un soit le plus simple c'est d'envoyer dans vos paramètres d'url votre id_employee. Link to comment Share on other sites More sharing options...
L E O Posted June 5, 2015 Author Share Posted June 5, 2015 Merci Vinum, j'ai essayé de lancer mon script à la main avec cette commande : curl http://mondomaine.com/modules/tntsynchro/cron_tnt.php?id_employee=13 L'id 13 étant admin. Mais cela ne fonctionne toujours pas. D'ailleurs je ne sais pas si ?id_employee=13 est autorisé. Quelle serait la bonne syntaxe ? Sinon comment créer un environnement dans mon script ? Merci d'avance pour votre aide. Pour info, j'ai vraiment besoin de trouver la solution parce que les commandes de mon client s'accumulent et leur statut reste à "Préparation en cours". Link to comment Share on other sites More sharing options...
Vinum Posted June 5, 2015 Share Posted June 5, 2015 Il faudrait voir ton script afin de savoir comment tu utilises ton id_employee. Link to comment Share on other sites More sharing options...
Eolia Posted June 5, 2015 Share Posted June 5, 2015 Si l'id_employee n'est pas vraiment important il suffit de lancer une requête qui récupère le 1er employé valide et continuer le script ainsi Ou mieux, créer un employée Cron et affecter son ID dans le script, comme ça vous savez quelles tâches ont été effectuées en cron ou par des véritables employés^^ Link to comment Share on other sites More sharing options...
Vinum Posted June 10, 2015 Share Posted June 10, 2015 (edited) Bonjour, Le seul endroit ou je pense que le id_employee devrait être utilisé est dans ta function change_etat() public function change_etat($id_order, $id_order_state) { $idTochange = (int)$id_order; $orderHistory = new OrderHistory(); $orderHistory->id_order = (int)$id_order; $orderHistory->changeIdOrderState((int)$id_order_state, $idTochange); $orderHistory->save(); } essaie ça : public function change_etat($id_order, $id_order_state) { $idTochange = (int)$id_order; $orderHistory = new OrderHistory(); $orderHistory->id_order = (int)$id_order; $orderHistory->id_employee = $id_employee; // que tu as récupéré avant avec Tools::getValue('id_employee') et passé dans l'url appelée par ta cron $orderHistory->changeIdOrderState((int)$id_order_state, $idTochange); $orderHistory->save(); } Edited June 10, 2015 by Vinum (see edit history) Link to comment Share on other sites More sharing options...
L E O Posted June 10, 2015 Author Share Posted June 10, 2015 Merci Vinum, j'ai essayé avec ta correction en ajoutant ceci dans la classe: class tnt_synchroclass {... public $id_employee;... public function init(){... $this->id_employee = Tools::getValue('id_employee');... public function change_etat($id_order, $id_order_state) {... $orderHistory->id_employee = $this->id_employee;... Appel depuis cette commande : curl http://monsite.fr/modules/tntsynchro/cron_tnt.php?id_employee=13 Le résultat : Notice: Trying to get property of non-object in /home/www/classes/stock/StockManager.php on line 264Notice: Trying to get property of non-object in /home/www/classes/stock/StockManager.php on line 265Notice: Trying to get property of non-object in /home/www/classes/stock/StockManager.php on line 266Fatal error: Uncaught exception 'PrestaShopException' with message 'Property StockMvt->id_employee is empty' in /home/www/classes/ObjectModel.php:846Stack trace:#0 /home/www/classes/ObjectModel.php(260): ObjectModelCore->validateFields()#1 /home/www/classes/ObjectModel.php(464): ObjectModelCore->getFields()#2 /home/www/classes/ObjectModel.php(425): ObjectModelCore->add(true, false)#3 /home/www/classes/stock/StockManager.php(281): ObjectModelCore->save()#4 /home/www/classes/order/OrderHistory.php(218): StockManagerCore->removeProduct('2760', '0', Object(Warehouse), '3', '3', true, 1106)#5 /home/www/modules/tntsynchro/tnt_synchro.class.php(148): OrderHistoryCore->changeIdOrderState(4, 1106)#6 /home/www/modules/tntsynchro/tnt_synchro.class.php(97): tnt_synchroclass->change_etat(1106, '4')#7 /home/www/modules/tntsynchro/cron_tnt.php(14): tnt_synchrocla in /home/www/classes/ObjectModel.php on line 846 Commentaires : 1- Je ne comprends pas pourquoi le scriptss a besoin de la classe StockManager qui n'a rien à voir avec le statut des commandes 2 - pourquoi est-ce qu'il veut supprimer des produits removeProduct ? 3 - J'ai aussi passé la valeur de l'employé en dur : $orderHistory->id_employee = 13 et lancé le script avec php -f www/modules/tntsynchroeniac/cron_tnt.php mais le résultat est sensiblement identique. Link to comment Share on other sites More sharing options...
Vinum Posted June 11, 2015 Share Posted June 11, 2015 Regarde dans les fonctions $orderHistory->changeIdOrderState((int)$id_order_state, $idTochange); $orderHistory->save(); si le stock manager est utilisé. je pense d'ailleurs que tu n'as pas besoin de faire $orderHistory->save(); Link to comment Share on other sites More sharing options...
L E O Posted June 12, 2015 Author Share Posted June 12, 2015 Après une fine analyse de mon script, je me suis aperçu qu'une variable mal initialisée était à l'origine des erreurs rencontrées. Tout fonctionne bien maintenant. Merci pour votre aide précieuse. Est-il possible de supprimer ce post ou de masquer le code de mon script ? Link to comment Share on other sites More sharing options...
L E O Posted June 26, 2015 Author Share Posted June 26, 2015 Je relance le sujet après avoir corrigé les petites erreurs de mon script. En résumé, la situation est la suivante : le script est lancé en dehors de prestashop (cron) et par conséquent l'objet $context n'est pas complet. Il lui manque les infos de l'employé (id, nom, prénom) ce qui provoque l'erreur décrite précédemment dans la fonction removeProduct de la classe StockManager.php. Pour remédier à cela j'ai ajouté ces lignes dans StockManager.php avant la création du tableau $mvt_params où se produit l'erreur : if (!isset($context->employee->id)) { $id_employee = 13; $employee_firstname = 'Admin'; $employee_lastname = 'ENIAC';} else { $id_employee = $context->employee->id; $employee_firstname = $context->employee->firstname; $employee_lastname = $context->employee->lastname;} et j'ai modifié $mvt_params = array( avec ces lignes: 'id_employee' => $id_employee, //$context->employee->id,'employee_firstname' => $employee_firstname, //$context->employee->firstname,'employee_lastname' => $employee_lastname, //$context->employee->lastname, Maintenant mon script fonctionne parfaitement bien. Cependant, j'aurais préféré ne pas modifier la classe StockManager.php pour éviter d'avoir à refaire cela lors des prochaines mises à jour. D'où ma question : Comment faire pour initialiser les valeurs de id_employee, employee_firstname, employee_lastname dans l'objet $context sans avoir à modifier les classes de prestashop ? Merci par avance pour vos réponses. Link to comment Share on other sites More sharing options...
Vinum Posted June 29, 2015 Share Posted June 29, 2015 Bonjour, Il me semble avoir déjà répondu. Soit tu envois id_employee dans l'url de ta tache cron et ensuite tu crées l'objet employee : $employee=new Employee($id_employee); pour pouvoir récuperer toutes les infos de cet employee. Ou tu crées le context en envoyant l'id_shop dans l'url de la tache cron. Pour créer le context: Shop::setContext(Shop::CONTEXT_SHOP, $id_shop); $context=Context::getContext(); 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