Featured Posts

lundi 16 janvier 2017

Ajax en front et back office de Prestashop

Aujourd'hui je vais vous montrer comment créer un script client (jquery) ,avec l'utilisation de la méthode ajax, et une partie back (PHP) dans des contrôleurs front office et back office.
Je vais traiter seulement, la démarche spécifique à la création d'un module Prestashop,
Vous pourriez suivre la même démarche pour les contrôleurs natives admin et front de Prestashop

Ajax dans le Back office de Prestashop

Si vous avez un contrôleur admin créé, vous allez passer l'étape suivante sinon vous aurez à créer un contrôleur admin

Créer un appel ajax dans un fichier admin js

  1. Inclure le fichier js, il faut déjà le créer dans nommodule/views/admin/js/script.js, et pour appeler ce fichier dans la page admin de Prestashop ou onglet (tab en anglais),  il faut utiliser la méthode hookDisplayBackOfficeHeader dans le fichier nommodule.php
    exemple :
       public function hookDisplayBackOfficeHeader(){
        if (Tools::getValue('configure') != $this->name)
return;
        $this->context->controller->addJquery(); // si aurait besoin de Jquery
        $this->context->controller->addJS($this->_path.'views/admin/js/script.js');
       }
et enregistrer le hook correspondant dans méthode install du module dans le fichier nommodule.php
$this->registerHook('displayBackOfficeHeader')

Dans le fichier script.js, mettre :

          var id_product = $('input[name="id_product"]').val();
                  $.ajax({
                     type: "POST",
                     url: currentIndex + "&token=" + token,
                         dataType: 'json',
                           data: {
                                     controller: 'AdminNomModuleNomController',
                                       action: 'GetProductInformations',
                                         ajax: true,
                                          id_product: id_product,
                                       },
                                       success: function(result) {
                                                 if (result.status == 'ok'){
                                                     $('#id_product').html(result.productInformations.id_product); 
                                                                               $('#link').html(result.productInformations.link); 
                                                                       }
                                                                          else
                                                                                alert('error');
                                                                }
                                                });


                            Créer un contrôlleur admin

                            Dans le dossier /nom_module/controllers/admin vous aurez à créer un fichier de nom 
                            AdminNomModuleNomControllerController.php
                            Où NomModule est le nom du module et NomController est le nom du contrôleur admin

                            Et mettre

                            class AdminNomModuleNomControllerController extends ModuleAdminController{
                                public function __construct(){
                                parent::__construct();
                                $this->context = Context::getContext();
                                }

                            public function ajaxProcessGetProductInformations() {
                            
                                    if ((int) Tools::getValue("id_product") > 0) {
                            
                                        $id_product = (int) Tools::getValue("id_product");
                            
                                        $product = new Product((int) Tools::getValue("id_product"), false, $this->context->language->id, $this->context->shop->id);
                            
                                        $row = array();
                            
                                        $row['id_product'] = $id_product;
                            
                                        $product_informations = Product::getProductProperties($this->context->language->id, $row);
                            
                                        if ($product_informations)
                            
                                            $json = array(
                                                        'productInformations' => $product_informations);
                                                        'status' =>'ok'
                                                   );
                            
                            
                                        else
                                            $json = array(
                            
                                                        'status' => 'error',
                            
                                                        'message' => $this->l('Erreur de sauvegarde.')
                            
                                         );
                            
                                         die(Tools::jsonEncode($json));
                            
                            
                                          break;
                            
                                   }

                            }
                            PS: il ne faut oublier de créer le lien de menu correspondant dans le fichier nommodule.php

                            par exemple utiliser ce code:

                            $tab = new Tab();
                            $languages = Language::getLanguages(false);
                            foreach ($languages as $language)
                            $tab->name[$language['id_lang']] = 'Le nom de mon onglet';
                            $tab->class_name = 'AdminMonModuleNomControleur'; //controller a creer correspondant au contenu de l'onglet
                            $tab->module = 'monmodule'; //nom du module
                            $tab->id_parent = Tab::getIdFromClassName('AdminOrders'); //mettre l'id de l'onglet parent de votre onglet
                            
                            
                            if (!$tab->add())
                            return false;
                            


                            Ajax dans le Front office de Prestashop

                            Si vous avez créer un contrôlleur front, alors vous pouvez omettre l'étape suivante

                            Créer un contrôlleur front

                            Dans le dossier /nom_module/controllers/front vous aurez à créer un fichier de nom 
                            default.php


                            class ModuleNameDefaultModuleFrontController extends ModuleFrontController
                            {     public function initContent(){
                                parent::initContent(); 
                                     if (Tools::getValue('ajax')){
                                         $id_product = (int) Tools::getValue("id_product"); 
                            $product_informations = Product::getProductProperties($this->context->language->id, $row);
                              
                            
                                         if ($product_informations)
                                             $json = array('productInformations' => $product_informations);
                            
                                         else
                                             $json = array(
                            
                                                        'status' => 'error',
                            
                                                        'message' => $this->l('Erreur de sauvegarde.')
                            
                                         );
                            
                                         die(Tools::jsonEncode($json));
                            }
                            }
                            Default est le nom du contrôleur.

                            Créer un appel ajax dans un le fichier tpl

                            Dans votre fichier tpl qui doit appeler l'ajax mettre
                            var id_product = $('input[name="id_product"]').val();
                            $.ajax({
                            type: "POST",
                            url: '{$link->$this->context->getModuleLink('nommodule', 'default')}',
                            async: false,
                            cache: false,
                            data: "product_id="+id_product+"&ajax=1",
                            success: function(html){
                                                $("#pricet").html(html.price);
                                                $('#link').html(result.productInformations.link);
                                            },
                            error: function() {alert("ERROR:");}

                            });

                            Comme ça je vous ai montré aujourd'hui comment développer avec ajax en Prestashop, pour les pages admin et les pages front.
                            N'hésitez pas à mettre vos questions en commentaires.
                            Si vous avez n'importe quel travail sur Prestashop, n'hésitez pas à envoyer un mail à tarek.fellah@gmail.com pour un devis gratuit dans les 24h.



                            mardi 2 août 2016

                            Troupe miami Sfax: quand la collaboration avec eux devient un echec

                            Nous faisons de la publicité sponsorisé sur facebook avec notre société OXYGENE TECHNOLOGIES.
                            Nous avons eu une mésaventure de travailler avec le chef du troupe miami, Mr Khalil Safi,
                            En fait, on nous n'a pas payé, jusqu'à la date de rédaction de ce billet,  pour la publicité qu'on lui a faite.
                            Il s'agit d'une somme de 100DT dûe pour la publicité des galas organisé en mois de Mars dans l'hôtel Nahr El Founoun, voir en détails les images d'en dessous.
                            A chaque fois qu'on les demande de payer le montant dû, Mr Khalil Safi nous répond qu'il a pleins de dettes, et lorsqu'on lui a demandé de nous faire un chèque, il a refusé, en s'argumentant que son carnet de chèque est épuisé.
                            Dernier update, il nous a dit de revenir vers lui en mis Août 2016.
                            Alors  pour ceux qui voudraient collaborer avec eux, il faut absolument, leur demander un chèque avant de commencer le travail.
                            L'anecdote, lorsque on lui a demandé quand est ce vous allez payer, il répond toujours qu'il est de bonne famille "احنا ولاد عايلات و ماناش قلابة"
                            Voici les preuves des publications sponsorisés sur facebook
                            Troupe miami preuve de paiement




                            Des publicités sponsorisés au total de 84,38$ qui équivaut à 186.65DT (date 02/08/2016)
                            Le Mr nous a payé seulement 25DT et nous a donné 3 tickets qui valent à 75DT.
                            Je lui a fait un prix hors norme, total de 200DT, mais le MR, Khalil Safi, le chef d'orchestre du troupe Miami, ne mérite pas cet avantage.
                            J'ai voulu partager mon expérience, vu que le Mr ne m'a pas laissé aucun choix, facture non payé depuis mars 2016 alors que nous sommes en Août, il a de l'argent pour payer des artistes à des milliers de dinars, mais pas de nous payer un montant de 100DT.

                            En conclusion, pour ce Mr, ou d'autres il faut se méfier et demander un chèque si le client n'a pas de liquidités, car malheureusement, les gens sont devenus malhonnêtes et irresponsables.