tristars Posted September 27, 2013 Share Posted September 27, 2013 Bonjour à tous, J'aimerais envoyer une requête SQL juste après une commande passée sur ma boutique. Il s'agit de cette commande, qui me sert à mettre à jour le stock entre deux base de donnée: UPDATE Base1.Table1 Base2.Table2 SET Base1.Table1.ChampA = Base2.Table2.ChampX WHERE Base1.Table1.ChampB = Base2.Table2.ChampY J'aimerais donc, après une commande passée, appeler un fichier php contenant ma requête.. Mais je n'y connais rien ! Une petite idée ? Merci beaucoup !A++ Link to comment Share on other sites More sharing options...
math_php Posted September 30, 2013 Share Posted September 30, 2013 Bonjour Tristars Pour le faire proprement il faudrait faire un module 'quasi vide' avec un hookActionValidateOrder($params). Cordialement Link to comment Share on other sites More sharing options...
tristars Posted September 30, 2013 Author Share Posted September 30, 2013 Oui, tout à fait, mais comment créer ce HOOK ? Tu me pause une colle As-tu un exemple sur lequel je pourrais m'appuyer ou tuto ou autre ? Merci pour ta réponse Link to comment Share on other sites More sharing options...
math_php Posted September 30, 2013 Share Posted September 30, 2013 (edited) Pour te documenter Tu peux te baser sur le module mailalerts, il contient tout ce qu'il faut (et même trop de choses) Pour démarrer sur un module vierge que tu appelleras synchro_stock par exemple tu peux aller voir http://emilienmalbranche.fr/prestashop-ecommerce-tutoriels/tutoriels/lecon-3-creer-un-module-sous-prestashop/ Il y a un générateur de module vide, des fois un peu compliqué à trouvé dans le zip mais sinon très bien. Voilà au boulot Edited September 30, 2013 by math_php (see edit history) Link to comment Share on other sites More sharing options...
tristars Posted October 8, 2013 Author Share Posted October 8, 2013 (edited) Bonjour, J'ai bien suivit le tuto et créé un module avec simplemement un fichier php contenant une requête SQL permettant de faire ma mise à jour. J'ai attaché ce module à mon hookNewOrder. Après une commande, la requête SQL fonctionne bien mais sur mon Front Office, j'ai un message "Etat de commande invalide" ! La commande est en statut "annulé" dans le BO. Pourquoi un tel souci ? Faut-il que je m'attache à un autre hook ? Merci Solution de contournement: J'ai directement mis ma requête SQL dans le fichier order-confirmation.php et cela fonctionne. Qu'en pensez-vous ? Est-ce une solution propre que je peux laisser ? Edited October 8, 2013 by tristars (see edit history) Link to comment Share on other sites More sharing options...
math_php Posted October 9, 2013 Share Posted October 9, 2013 Bonjour Tristars La méthode c'était : public function hookActionValidateOrder($params) J'avais recommandé cette méthode avec le hook le plus 'tardif' sur la commande. New order est lancé avant c'est donc moins bien et moins prudent dans ce cas, comme tu as pu le constater Le mieux reste un hook dans un module avant l'override et bien bien avant la modif d'un fichier (pas propre ). Ca va hypermarcher Link to comment Share on other sites More sharing options...
tristars Posted October 9, 2013 Author Share Posted October 9, 2013 J'ai donc modifié mon module avec la fonction install suivante: public function install() { if(!parent::install() || !$this->registerHook('updateProduct') || !$this->registerHook('ActionValidateOrder')) return false; return true; } Puis la fonction HookActionValidateOrder suivante: public function hookActionValidateOrder($params){ //ma requête sql } Après une commande, je n'ai plus d'erreur dans le Front Office et la commande n'est plus en status "annulé" dans le BO. Ceci est une bonne chose ! Mais ma requête SQL ne s'applique pas ! Comme si la fonction hookActionValidateOrder n'était pas appelée.. (A savoir que ma requête SQL fonctionne bien avec la fonction hookUpdateProduct lors de la modification du produit en BO) Une idée de mon erreur ? Link to comment Share on other sites More sharing options...
math_php Posted October 9, 2013 Share Posted October 9, 2013 (edited) Il faut, dans le BO/Modules, réinitialiser le module pour que Prestashop mettent à jour sa liste de hooks pour les modules à appeler. Si ça ne marche pas je mets un gros var_dump($params); exit; Pour etre bien sûr que Prestashop passe dans ma méthode. Edited October 9, 2013 by math_php (see edit history) Link to comment Share on other sites More sharing options...
tristars Posted October 9, 2013 Author Share Posted October 9, 2013 Où mets-tu ce var_dump($params); exit; ? Link to comment Share on other sites More sharing options...
math_php Posted October 9, 2013 Share Posted October 9, 2013 dans public function hookActionValidateOrder($params){ var_dump($params); exit; } Link to comment Share on other sites More sharing options...
tristars Posted October 9, 2013 Author Share Posted October 9, 2013 Si j'ai bien compris, je met ce var_dump après ma requète SQL comme ceci: public function hookActionValidateOrder($params){ //requête SQL var_dump($params); exit; } Si c'est bien cela, ça ne fonctionne toujours pas.. Une autre idée ? Merci pour ton aide ! Link to comment Share on other sites More sharing options...
math_php Posted October 9, 2013 Share Posted October 9, 2013 Si il n'y a pas de dump à l'écran, Prestashop ne sait pas qu'il faut appeler ton hook. Le module est peut etre mal installé ? Link to comment Share on other sites More sharing options...
tristars Posted October 9, 2013 Author Share Posted October 9, 2013 Si il n'y a pas de dump à l'écran, Prestashop ne sait pas qu'il faut appeler ton hook. Je ne comprend pas ce que tu veux dire par la ? Qu'est ce qu'un dump à l'écran ? Voici le code entier de mon module, peut être vas-tu trouver une erreur ? L'installation semble se dérouler normalement.. <?php if (!defined('_PS_VERSION_')) exit; class Synchro_stock extends Module { public function __construct() { $this->name = 'synchro_stock'; $this->tab = 'Synchro'; $this->version = 1.0; $this->displayName = $this->l('Synchro Stock'); $this->description = $this->l('Synchronise le stock lors dune commande'); parent::__construct(); } public function install() { if(!parent::install() || !$this->registerHook('updateProduct') || !$this->registerHook('ActionValidateOrder')) return false; return true; } public function uninstall() { if (!parent::uninstall()) return false; return true; } public function hookUpdateProduct($params){ // requête SQL } public function hookActionValidateOrder($params){ // requête SQL var_dump($params); exit; } } ?> De plus, si le module était mal installé, il ne fonctionnerait pas non plus sur le hookUpdateProduct, or ici tout fonctionne sur ce hook ! Le hookActionValidateOrder ne s'applique donc pas ici ? Link to comment Share on other sites More sharing options...
math_php Posted October 9, 2013 Share Posted October 9, 2013 Tu n'avais pas dit que le hook UpdateProduct fonctionnait. || !$this->registerHook('ActionValidateOrder')) à changer par (a minuscule) : || !$this->registerHook('actionValidateOrder')) Un dump (ou résultat du var_dump) c'est un affichage brut du contenu d'une variable, un objet, un tableau. C'est juste pour le debug. Pense à réinitialiser ton module dans le BO Si ça marche pas j'installerai ton module dans une de mes boutiques. Link to comment Share on other sites More sharing options...
tristars Posted October 10, 2013 Author Share Posted October 10, 2013 Salut ! Ça ne marche toujours pas.. Le debug du dump ne s'affiche pas non plus. Voici le module: synchro_stock.zip Si tu peux tester je suis preneur Merci beaucoup ! Link to comment Share on other sites More sharing options...
math_php Posted October 10, 2013 Share Posted October 10, 2013 Salut Chez moi ça marche comme ça : <?php if (!defined('_PS_VERSION_')) exit; class Synchro_stock extends Module { public function __construct() { $this->name = 'synchro_stock'; $this->tab = 'Synchro'; $this->version = 1.0; $this->displayName = $this->l('Synchro Stock'); $this->description = $this->l('Synchronise le stock vers sync.fr lors dune commande'); parent::__construct(); } public function install() { if(!parent::install() || !$this->registerHook('updateProduct') || !$this->registerHook('actionValidateOrder')) return false; return true; } public function uninstall() { if (!parent::uninstall()) return false; return true; } public function hookUpdateProduct($params){ file_put_contents('synchro_upd.txt', 'action validate order went here'); } public function hookActionValidateOrder($params){ file_put_contents('synchro_avo.txt', 'action validate order went here'); } } ?> Lorsque je passe une commande, j'ai bien à la racine du site un fichier synchro_avo.txt contenant 'action validate order went here'. Fonctionne en 1.5.5 et à priori avec toutes les 1.5. Bon courage Link to comment Share on other sites More sharing options...
tristars Posted October 24, 2013 Author Share Posted October 24, 2013 Bonjour, Alors sur ma version 1.4.10, j'utilise le hookNewOrder (à la place du hookActionValidateOrder qui fonctionne sur la v1.5) et ma requête SQL est bien exécutée ! Donc on avance Cependant, sur le Front, une page "Etat de commande invalide" apparait lors de la confirmation de la page, bloquant ainsi le client. De plus, le statut de la commande est automatiquement mis sur "annulé" dans le BO. On revient donc à mon problème initial (post #5)Comment faire ? A-t-on fait le tour de toutes les solutions ? Merci beaucoup 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