Jump to content

Aide développement Module


Recommended Posts

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 

image.png.0eabbdf4a83c411d25ff2d9d1c631f65.png

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

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

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 

image.png.84f3fe854dcdbfb8e2e21937bbb39490.png
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 by Bllidz (see edit history)
Link to comment
Share on other sites

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

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

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

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);
    });
});

image.png.2c773f9aab2a63631edaaf9fcd1f3041.png 

et ça s'affiche bien...

Sauf que après avoir cliqué sur le ok j'ai ça 

image.png.8db38f1412cd1492122b10b46d356267.png

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 by Bllidz (see edit history)
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...