Jump to content

Instancier des classes


Recommended Posts

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 264
PHP Notice:  Trying to get property of non-object in /home/britishcarcentre/www/classes/stock/StockManager.php on line 265
PHP Notice:  Trying to get property of non-object in /home/britishcarcentre/www/classes/stock/StockManager.php on line 266
PHP 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.

<?php
include_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

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

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

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

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

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

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 by Vinum (see edit history)
Link to comment
Share on other sites

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 264

Notice: Trying to get property of non-object in /home/www/classes/stock/StockManager.php on line 265

Notice: Trying to get property of non-object in /home/www/classes/stock/StockManager.php on line 266

Fatal error: Uncaught exception 'PrestaShopException' with message 'Property StockMvt->id_employee is empty' in /home/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('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

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

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

  • 2 weeks later...

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

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

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