Bllidz Posted July 5, 2021 Share Posted July 5, 2021 (edited) Bonjour, Je suis actuellement entrain de développer mon 1er module (version 1.7.6.9). J'ai regardé la doc , et quelques tuto https://newslang.ch/blog/guide-complet-creer-module-prestashop-1-7/ https://pierrebelin.fr/blog/guide-complet-creer-module-prestashop/ Mon module a /aura pour but d'envoyer par mail un document pré-défini à l'email défini. Je m'explique, ce module créer une nouvelle table dans la bdd, qui stockera l'email et le nom , exemple je souhaite envoyer la facture a la comptable de mon client, il faudra d'abord que j'aille enregistré l'email de la comptable lié à ce client et ensuite aller dans les détails de la commande et sélectionner l'email et cliquer sur envoyer. Donc pour ce faire j'ai greffé mon module à plusieurs hook , qui sont : 'displayAdminOrder' et 'displayAdminCustomers'. Dans le displayAdminCustomers, c'est ici que je souhaite entrer les emails des clients autre que leur email de compte (ex: comptable, ect...) et dans le displayAdminOrder c'est ici que je sélectionnerai l'email que je souhaite et cliquer sur envoyer qui enverra selon l'email soit l'ar soit la facture ect.. Pour l'instant je bloque, J'ai dans dans mon hook AdminCustomers l'appel d'un tpl public function hookDisplayAdminCustomers($params) { return $this->display(__FILE__, 'customer.tpl'); //affiche mon tpl } Dans ce tpl il y'a ce qui me permet d'afficher le block pour pouvoir enregistrer l'email de la comptable <div style =" margin-left:15px;box-shadow: 2px 2px 8px 0 rgba(0,0,0,.2); background: #fff; padding: 1.563rem 1.25rem; margin-bottom: 1.563rem;"> <br> <h4>email de la comptable: </h4> <td><input type="text" name="emailComptable" class="emailComptable" id="emailComptable" value="[email protected]" style="display : inline-block; width:80%;" /> <br/> <br/> <button type="button" class="btn btn-default submitadd_compta" style="display : inline-block; width:80%; margin-left: 2%;" > <i class="icon-ok"></i> {l s='Enregister' d='Admin.Actions'} </button> </td> <div> Et du coup l'affichage donne L'affichage bon je changerai tout ça plus tard. Donc la actuellement je souhaiterai que quand je clique enregistrer l'email écrite aille dans ma BDD. donc pour ce faire : J'ai crée un fichier Comptable.js qui se trouve dans modules/jv_mails/views/js /*Modif Jérémy*/ $('button.submitadd_compta').unbind('click').click(function(e) { e.preventDefault(); var emailComptable =$('#emailComptable').val(); query = 'ajax=1&token='+token+'&action=add_compta&id_customer='+id_customer+'&emailComptable='+emailComptable+'&'; //envoi de l'id_customer par tokeb $.ajax({ type:'POST', //Methode POST url: admin_order_tab_link, cache: false, dataType: 'json', data : query, success: function(data) { if (data.result) { console.log('ok'); } else jAlert(data.error); } }); return false; }); //} /*Modif Jérémy*/ et un fichier AdminComptable.php dans modules/jv_mails/controllers/admin qui lui comporte : public function ajaxProcessadd_compta() { $id_customer = Tools::getValue('id_customer'); $mail_compta =Tools::getValue('mail_compta'); return $sql= Db::getInstance()->execute('INSERT INTO `'._DB_PREFIX_.'jv_mail` (id_customer,mail_compta) VALUES ('.$id_customer.''.$mail_compta.')' ; //Requete sql afin d'insert var_dump($id_customer); var_dump($mail_compta); die(); } Cependant je ne vois pas comment faire le lien entre mon tpl et mon js et controller . afin que quand j'appuis sur mon Bouton ça exécute cette fonction et envoie les infos avec le js. Merci de toute aide pour ce module (et à la fin je le mettrai a disposition de tous pour ce qui ça intéresse ) Ma version 1.7.6.9 Edited July 5, 2021 by Bllidz (see edit history) 1 Link to comment Share on other sites More sharing options...
Julien Posted July 6, 2021 Share Posted July 6, 2021 Bonjour Bllidz, Alors si j'ai bien compris ton problème il te faut: 1- Insérer ton fichier JS dans le backoffice, je te conseil de passer par le hook "displayBackOfficeHeader" dans ton module : /** * Add JS to back office header */ public function hookDisplayBackOfficeHeader() { $this->context->controller->addJS($this->_path.'views/js/admin.js'); } 2- Dans ton JS il te faut créer un appelle en POST lors du clique sur le bouton vers l'url du fichier traitant l'enregistrement, l'url ressemblera à: var data= "?action=updateEmail&[email protected]&id_customer=1"; $.post("'.$this->context->shop->physical_uri.$this->context->shop->virtual_uri.'modules/'.$this->name.'/ajax_'.$this->name.'.php", data); avec data comprenant l'email du comptable et l'id customer par exemple. 3- Traiter l'enregistrement, dans l'exemple au dessus je vais appeler un fichier ajax_nom_de_ton_module.php: <?php /* * 2007-2015 PrestaShop * * NOTICE OF LICENSE * * This source file is subject to the Academic Free License (AFL 3.0) * that is bundled with this package in the file LICENSE.txt. * It is also available through the world-wide-web at this URL: * http://opensource.org/licenses/afl-3.0.php * If you did not receive a copy of the license and are unable to * obtain it through the world-wide-web, please send an email * to [email protected] so we can send you a copy immediately. * * DISCLAIMER * * Do not edit or add to this file if you wish to upgrade PrestaShop to newer * versions in the future. If you wish to customize PrestaShop for your * needs please refer to http://www.prestashop.com for more information. * * @author PrestaShop SA <[email protected]> * @copyright 2007-2015 PrestaShop SA * @license http://opensource.org/licenses/afl-3.0.php Academic Free License (AFL 3.0) * International Registered Trademark & Property of PrestaShop SA */ include_once('../../config/config.inc.php'); include_once('../../init.php'); include_once('mon_module.php'); $pageDivioseoBlog = new Mon_Module(); if (Tools::getValue('action') == 'updateEmail' && Tools::getValue('email')) { // TRAITEMENT } Bon je pense que tu devrais ajouter une clé de sécurité dans ton appelle JS, tu peux regarder du côté du module image slider de prestashop qui utilise ce genre d'appelle pour le Drag & Drop des slides côté backoffice. En espérant que ca te sera utile ! Julien Link to comment Share on other sites More sharing options...
Bllidz Posted July 7, 2021 Author Share Posted July 7, 2021 (edited) Bonjour Julien, Merci de ton aide, j'ai ajouté l'appel du js et le hook dans l'installation. J'ai repris ton aide pour le js pour que ça donne $('button.submitadd_compta').click(function(e) { e.preventDefault(); var email =$('#emailComptable').val(); var data= "?action=updateEmail&email="+email+"&id_customer="+id_customer+"&"; $.post("'.$this->context->shop->physical_uri.$this->context->shop->virtual_uri.'modules/'.$this->name.'/ajax_'.$this->name.'.php", data); }); j'ai ajouté un fichier ajax_jv_mails.php a la racine comme indique le chemin dans le js Mais j'ai du coup une erreur dans ma console Qui correspond à cette ligne $('button.submitadd_compta').click(function(e){ J'ai vu que c'était une erreur du a un manque de jquerry Est-ce que tu aurais une idée ? ps: je glisse le zip du module à son stade pour que ce soit plus simple jv_mails.zip Edited July 8, 2021 by Bllidz (see edit history) Link to comment Share on other sites More sharing options...
Julien Posted July 8, 2021 Share Posted July 8, 2021 (edited) Hello, Je ne sais pas trop pourquoi tu n'as pas de JQuery , mais personnellement lorsque j'utilise un petit bout de JQuery j'utilise une fonction dans le contrôleur de mon module: /** * Header of admin configuration page, for drag and drop sort */ public function getHeaderHTML() { if (Tools::getValue('controller') != 'AdminModules' && Tools::getValue('configure') != $this->name) { return; } $this->context->controller->addJqueryUI('ui.sortable'); /* Style & js for fieldset 'slides configuration' */ $html = '<script type="text/javascript"> $(function() { $('button.submitadd_compta').click(function(e) { e.preventDefault(); var email =$('#emailComptable').val(); var data= "?action=updateEmail&email="+email+"&id_customer="+id_customer+"&"; $.post("'.$this->context->shop->physical_uri.$this->context->shop->virtual_uri.'modules/'.$this->name.'/ajax_'.$this->name.'.php", data); }); }); </script>'; return $html; } Et j'appelle cette fonction avant le contenu de ma page dans ta fonction getContent(): public function getContent() { // RESTE DE TON CODE return $this->getHeaderHTML() . $this->output . $this->renderForm(); } J'espère que ca fera l'affaire ! Bonne journée EDIT: J'ai téléchargé ton module mais je n'ai pas assez de temps pour regarder en détails, essais avec la solution au dessus ca devrait fonctionner ! Et pense à indenter ton code c'est très indigeste haha Si tu compte diffuser ton module il faut toujours éviter d'écrire le nom de tables en dure comme "ps_mail" mais toujours utiliser le préfix qui peut changer: '. _DB_PREFIX_ .'mail Edited July 8, 2021 by Julien (see edit history) Link to comment Share on other sites More sharing options...
Bllidz Posted July 8, 2021 Author Share Posted July 8, 2021 4 hours ago, Julien said: Hello, Je ne sais pas trop pourquoi tu n'as pas de JQuery , mais personnellement lorsque j'utilise un petit bout de JQuery j'utilise une fonction dans le contrôleur de mon module: /** * Header of admin configuration page, for drag and drop sort */ public function getHeaderHTML() { if (Tools::getValue('controller') != 'AdminModules' && Tools::getValue('configure') != $this->name) { return; } $this->context->controller->addJqueryUI('ui.sortable'); /* Style & js for fieldset 'slides configuration' */ $html = '<script type="text/javascript"> $(function() { $('button.submitadd_compta').click(function(e) { e.preventDefault(); var email =$('#emailComptable').val(); var data= "?action=updateEmail&email="+email+"&id_customer="+id_customer+"&"; $.post("'.$this->context->shop->physical_uri.$this->context->shop->virtual_uri.'modules/'.$this->name.'/ajax_'.$this->name.'.php", data); }); }); </script>'; return $html; } Et j'appelle cette fonction avant le contenu de ma page dans ta fonction getContent(): public function getContent() { // RESTE DE TON CODE return $this->getHeaderHTML() . $this->output . $this->renderForm(); } J'espère que ca fera l'affaire ! Bonne journée EDIT: J'ai téléchargé ton module mais je n'ai pas assez de temps pour regarder en détails, essais avec la solution au dessus ca devrait fonctionner ! Et pense à indenter ton code c'est très indigeste haha Si tu compte diffuser ton module il faut toujours éviter d'écrire le nom de tables en dure comme "ps_mail" mais toujours utiliser le préfix qui peut changer: '. _DB_PREFIX_ .'mail Merci , je test ce soir chez moi et je te redis en éditant ce message Quote J'ai téléchargé ton module mais je n'ai pas assez de temps pour regarder en détails, essais avec la solution au dessus ca devrait fonctionner ! Et pense à indenter ton code c'est très indigeste haha Pour l'indentation je sais.. c'est mon problème 😂même mes profs me le disent.. je vais tester ça ce soir Après a vu d'oeil va y'avoir un problème de guillemet sur le $html mais bon ça je vais m'amuser pendant 5 minutes avec. Quote Si tu compte diffuser ton module il faut toujours éviter d'écrire le nom de tables en dure comme "ps_mail" mais toujours utiliser le préfix qui peut changer: '. _DB_PREFIX_ .'mail Bonne remarque tu fais bien de me le dire. je vais y apporter tout ces petits changements et j'éditerai ce post afin de savoir si tout fonctionne ou non En tout cas merci à toi Julien Link to comment Share on other sites More sharing options...
Bllidz Posted July 13, 2021 Author Share Posted July 13, 2021 (edited) Update: J'ai du coup rajouté cette partie: '<script type="text/javascript"> $(function() { $('button.submitadd_compta').click(function(e) { e.preventDefault(); var email =$('#emailComptable').val(); var data= "?action=updateEmail&email="+email+"&id_customer="+id_customer+"&"; $.post("'.$this->context->shop->physical_uri.$this->context->shop->virtual_uri.'modules/'.$this->name.'/ajax_'.$this->name.'.php", data); }); }); </script>' dans un document texte et que je mets dans la variable grace à un : $html = file_get_contents('./txt_varHtml.txt'); Mais le problème est toujours là, toujours pas de Jquery après ce n'est peut-être pas la bonne méthode pour la variable Html d'y mettre ce texte. Je vais me pencher dessus aujourd'hui pour résoudre ce problème car j'étais sur autre chose ces derniers jours et pas vraiment eu le temps de m'y plonger dedans. CDT Edited July 13, 2021 by Bllidz (see edit history) Link to comment Share on other sites More sharing options...
Bllidz Posted July 13, 2021 Author Share Posted July 13, 2021 (edited) Bon le problème vient de customer à priori, vu que j'ai mit le tpl du hookDisplayAdminCustomers dans le hookDisplayAdminOrder. Car dans le admin js j'ai mit une alert au clique du bouton: $(document).ready(function() { $('button.submitAdd_compta').click(function(e){ e.preventDefault(); alert("je suis le test du module"); var email =$('#emailComptable').val(); var data= "?action=updateEmail&email="+email+"&id_customer="+id_customer+"&"; $.post("'.$this->context->shop->physical_uri.$this->context->shop->virtual_uri.'modules/'.$this->name.'/ajax_'.$this->name.'.php", data); }); }); et ça s'affiche bien... Sauf que après avoir cliqué sur le ok j'ai ça je ne sais pas pourquoi le AdminDashboard est appelé ? et au dessus c'est la redirection qui est dans le Post mais qui n'arrive pas à ce charger As tu une idée de pourquoi le controller de dashboard est appelé et pourquoi aussi du coup y'a une erreur de Jquery seulement dans le client ? Merci par avance jv_mails.zip Edited July 13, 2021 by Bllidz (see edit history) 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