Waschou Posted February 19, 2015 Share Posted February 19, 2015 Bonjour, Je ne sais pas si cette partie du forum correspond à mon "problème". Si je me suis trompé, veuillez m'excuser. Je me lance dans la création d'un module depuis quelques jours (débutant, étudiant en informatique), je bloque sur plusieurs choses, internet et le forum étant assez pauvres en information de ce coté. J'ai étudié la doc Prestashop pour comprendre le "squelette" d'un module, ses fonctions obligatoires, ... Pour créer un module de base quoi, mais voici plusieurs choses que je ne trouve pas sur le net. Mon besoin consiste à pouvoir accéder à la base de données en BO. Accéder à des produits uniquement visibles par l'admin. Je dois donc être capable de modifier un produit, d'ajouter un produit ou encore supprimer un produit à partir de mon module (produits comme je le répète non disponibles aux clients, donc non accessibles par l'interface de base de Prestashop). Je sais coder tout cela en dehors de Prestashop, en PHP avec des requêtes SQL. Mais le codage d'un module Prestashop m'est totalement étranger, et malgré ma motivation et mon envie d'apprendre à coder pour Prestashop, je dois l'avouer que je bloque, ce qui commence à me décourager ... Voici donc mes questions pour les développeurs ayant la sympathie de me répondre: -Comment créer mon module uniquement en BO? (J'ai compris que pour ne pas l'afficher en FO, il suffisait juste de ne pas mettre de hook) -Comment créer des input? (pour la création de produit) -Une dernière chose, je ne comprends pas comment faire le lien entre mon fichier mondule.php et le fichier .tpl... Quelqu'un peut m'expliquer? J'ai lu énormément de tutos sur Internet, et je vous avoue que même après cela, je suis toujours bloqué ... Je vous remercie énormément de votre patience ainsi que l'aide future que vous m'apporterez, si toutefois elle est prise en compte. Cela me permettrait de gagner en compétence et de pouvoir les présenter en fin d'année lors d'une épreuve. Cordialement, Waschou Prestashop 1.6.0.11 Link to comment Share on other sites More sharing options...
fred-vinapresta Posted February 19, 2015 Share Posted February 19, 2015 Bonjour, voici déja un tutoriel se rapprochant de ce que vous voulez faire https://www.prestashop.com/forums/topic/226631-astuce-comment-creer-un-onglet-produit-personnalise-en-prestashop/ par ailleurs, je vous conseille d'étudier la classe Product qui permet d'updater des attributs de produits sans passer par des requetes. Vous pourrez tout de meme trouver facilement les bonnes pratiques de Prestashop en base de données avec des fonctions pour persister, modifier supprimer des données en passant par la classe Db de Prestashop Link to comment Share on other sites More sharing options...
samyha Posted February 19, 2015 Share Posted February 19, 2015 Bonjour, Je déplace ton topic dans la section "développement" Link to comment Share on other sites More sharing options...
Waschou Posted February 19, 2015 Author Share Posted February 19, 2015 (edited) Merci Samyha! Merci de votre réponse fred-vinapresta, concernant le tutoriel que vous m'avez conseillé, il ne correspond pas trop à ce que je recherche. Cependant il y a des éléments dont je vais essayer de m'inspirer pour mon propre module. Je jette un coup d’œil aussi à la classe Db, dont je n'avais pas entendu parler jusqu'ici. Merci encore, je vous tiens au courant de mon avancement. Edited February 19, 2015 by Waschou (see edit history) Link to comment Share on other sites More sharing options...
Waschou Posted February 20, 2015 Author Share Posted February 20, 2015 Bonjour, La classe Product est immense, je suis complétement perdu dedans, je n'arrive pas à trouver de quoi m'inspirer pour mon module. De même pour la classe Db. J'essaye de m'inspirer d'autres modules, mais sans succès (je ne saisis pas la logique de leurs codages). N'y a-t-il pas de moyen simple pour faire facilement des boutons input et des menus déroulant à mettre en lien avec la base de données, comme je sais le faire en dehors de Prestashop ? Merci beaucoup de votre aide et de votre patience. Link to comment Share on other sites More sharing options...
fred-vinapresta Posted February 20, 2015 Share Posted February 20, 2015 Bonjour, vous pouvez regarder dans les modules disponibles dans prestashop. Ceux configurables, pour lesquels ont a un formulaire quand on clique sur le bouton configuration du module, disposent de la function: public function getContent() {...} Cette fonction retournera le contenu du formulaire de configuration, vous pouvez lui assigner du code html ex: $html = '<form>....</form>', un template ou bien le renvoyer sur une fonction créant un formulaire avec helperForm ou autres à lire pour l'accès aux tables: https://www.prestashop.com/blog/fr/les-bonnes-pratiques-de-la-classe-db-sur-prestashop-1-5/ Après il existent des dizaines de tutoriaux sur comment faire un modules etc faciles à trouver sur google Link to comment Share on other sites More sharing options...
Waschou Posted February 20, 2015 Author Share Posted February 20, 2015 Merci de votre réponse rapide. Concernant les tutoriaux sur comment faire un module, je pense les avoir tous parcouru/essayé (de 1.5 à 1.6), mais généralement dans ces tutos ils balancent le code sans expliquer sa signification, et c'est bien ça le soucis. J'ai déjà consulté le lien que vous me donnez, je planche dessus depuis hier quand vous m'avez conseillé de regarder la classe Db. Concernant la fonction getContent(), je ne savais pas son utilité. Encore merci de votre aide. Link to comment Share on other sites More sharing options...
J. Danse Posted February 20, 2015 Share Posted February 20, 2015 Voici le genre de sujet qui me fait dire qu'il est temps que je finalise mon bouquin, moi ! Alors, je pense que le plus simple est en effet d'agir comme vous le faites: posez question petit à petit, tenter de comprendre la mécanique au fur et à mesure. En effet, un module s'articule sur deux plans: des hooks (points d'accroches) et des contrôleurs. Les contrôleurs peuvent êtres front ou back office. La méthode getContent() est utile pour une configuration propre au module, ne nécessitant souvent qu'un simple formulaire (sauf exception). Je vous balance du code... Mes excuses, il est que très peu commenté: https://github.com/PrestaEdit/Canvas-Module-Prestashop-15 ; mais il va vous permettre de vous inspirer et d'éventuellement poser des questions en y faisant référence, selon moi. Dans votre cas, je pense que je partirais sur une utilisation d'un ModuleAdminController, par facilité. De même que j'utiliserais un Helperform pour le formulaire/les inputs. Bien entendu, il est possible de faire cela assez simplement et en dénaturant un rien les outils natifs de PrestaShop, mais je pense que cela vous permettra d'en apprendre plus sur la mécanique et de profiter des outils natifs, justement, Link to comment Share on other sites More sharing options...
Waschou Posted February 20, 2015 Author Share Posted February 20, 2015 Merci des explications claires et précises J. Danse! Oui, j'apprends au fur et à mesure que les problèmes viennent à moi, petit à petit. Je me plonge dans votre code de ce pas (Dont j'avais déjà eu le lien via un autre topic, mais je l'avais laissé de coté.). Je vais me fier à vos conseils. Je vous tiens au jus. (Si vous sortez un livre ... Prévenez moi, ça m’intéresse énormément! Difficile de se lancer dans la création de modules sans rien de concret.) Link to comment Share on other sites More sharing options...
J. Danse Posted February 20, 2015 Share Posted February 20, 2015 Pas de soucis ! N'hésitez surtout pas à poser vos questions, même les plus simples et celles que vous pensez "idiotes". Nous sommes tous passés par là ;-) (Je le sortirai, mais je ne sais pas encore quand ni comment donc n'hésitez pas ç poser vos questions au préalable ;-)) Link to comment Share on other sites More sharing options...
Waschou Posted February 20, 2015 Author Share Posted February 20, 2015 Hum, des questions, j'en ai énormément mais j'essaie de trouver les réponses par moi même avant d'appeler à l'aide. Donc si j'ai bien compris, mon module va nécessiter un getContent() pour un coté pratique? Ensuite, dans la continuité, $EXAMPLE_CONF = Tools::getValue('EXAMPLE_CONF'); Dans la variable, on y récupère de la table "Tools" la valeur de 'EXAMPLE_CONF' ... Mais qu'est ce que Example_conf ? (fichier exemple.php ligne 183) Je n'ai pas envie de dire des bêtises. $output = '<h2>'.$this->displayName.'</h2>'; Et ce code si-dessus permet de récupérer dans la variable output le nom du module ... Mais où est réutilisé la variable ? Une dernière question pour la route ... Comment utiliser un HelperForm et un ModuleAdminController ? Pour ce dernier il me semble l'avoir déjà croisé quelque part en parcourant mes fichiers Presta. Merci encore énormément pour ce cours particulier de module! Link to comment Share on other sites More sharing options...
fred-vinapresta Posted February 20, 2015 Share Posted February 20, 2015 En formulaire de configuration, vous pouvez étudier le module homefeatured qui a une configuration assez simple. Vous pourrez y voir que dans sa fonction getContent, il va en premier lieu récuperer les infos envoyées par le fomulaire de configuration si il y en a (isSubmit), et ensuite afficher le formulaire par la fonction return $this->renderForm(); cette fonction renderForm va permettre de créer un fomuaire html facilement grace à la classe HelperForm http://doc.prestashop.com/display/PS15/HelperForm concernant ModuleAdminController : http://www.custommyself.com/prestashop-tutorial-create-a-module-with-an-admin-panel/ Link to comment Share on other sites More sharing options...
J. Danse Posted February 20, 2015 Share Posted February 20, 2015 Pour la méthode getContent() ce n'est pas tant une question de "pratique", par contre. En fait, la méthode getContent() permet de configurer un module. La présence de celle-ci a pour effet de bord de créer un bouton "Configurer" au niveau de la liste des modules, pour le module donné. Dès lors que l'on arrive sur la page de configuration, c'est le contenu retourné par la méthode getContent() qui sera affiché. Ainsi, on peut y afficher un code html, du simple texte ou alors un HelperForm plus poussé. Il s'agit surtout d'y mettre des éléments de configurations/des paramètres. Prenons l'exemple du module blockcategories (https://github.com/PrestaShop/blockcategories/blob/master/blockcategories.php#L97): le formulaire permet deux/trois petites configurations utiles au module mais ne nécessitant pas un contrôleur particulier. Concernant cette ligne de code: $EXAMPLE_CONF = Tools::getValue('EXAMPLE_CONF'); Attention, il n'est pas question de table "tools" (qui n'existe d'ailleurs pas). Il s'agit d'utiliser une méthode de la classe Tools permettant de récupérer la valeur de $_POST['EXAMPLE_CONF'] et/ou de $_GET['EXAMPLE_CONF']. On pourrait très bien l'écrire comme en PHP classique, mais c'est un standard de PrestaShop. EXAMPLE_CONF est le name de l'input retourné via le formulaire (cfr https://github.com/PrestaEdit/Canvas-Module-Prestashop-15/blob/master/views/templates/admin/configure.tpl#L16). Ici, pour le formulaire, on a fait simple en utilisant un fichier de template dans lequel le formulaire est inscrit en "dur". (https://github.com/PrestaEdit/Canvas-Module-Prestashop-15/blob/master/example.php#L208) La variable $output est utilisée à cette ligne, https://github.com/PrestaEdit/Canvas-Module-Prestashop-15/blob/master/example.php#L192. Elle permet de faire un "echo" de son contenu et d'afficher ensuite le formulaire. Pour le HelperForm, c'est un rien plus "complexe". Je vous conseille vivement d'analyser vite fait ce fichier: https://github.com/PrestaShop/PrestaShop/blob/1.6/controllers/admin/AdminPatternsController.php ; celui-ci en particulier car il a l'avantage de vous exposer un ensemble des champs différents, Pour le ModuleAdminController, voici dans l'exemple comment on crée un onglet dans le menu du Back Office: https://github.com/PrestaEdit/Canvas-Module-Prestashop-15/blob/master/example.php#L124 Et voici donc le fichier utilisé: https://github.com/PrestaEdit/Canvas-Module-Prestashop-15/blob/master/controllers/admin/AdminExampleController.php Des commentaires à son sujet feront bientôt leurs apparitions, je pense. Link to comment Share on other sites More sharing options...
Waschou Posted February 23, 2015 Author Share Posted February 23, 2015 Merci encore des explications! Si je pouvais tout écrire en PHP classique ça m'arrangerait bien! Concernant le getContent(), je pensais que c'était un getter tout simplement, je ne pensais pas qu'il était si important. Pour l'explication du bout de code, c'était pour moi une récupération d'une variable dans la base de données, j'étais complétement à coté! Donc je dois faire un getContent() qui return $this->renderForm(); Étant donné que je veux que mon module soit utilisable en BO, je dois faire en sorte que tout soit dans le getContent() qui me permettra d'afficher mon code html et donc mes input, menus déroulants, etc ... ? Parce que vous me dites qu'il sert à Configurer le module, mais il n'y aura rien à configurer dans le mien. Et tout ce qui concerne le html, je dois faire un fichier tpl comme le "configure.tpl" mais comme ceci "nomdumodule.tpl" ? Et donc utiliser $this->getTemplatePath('nomdumodule.tpl')); ? N'ai je pas moyen de "contourner" les normes de Prestashop et de coder en PHP normal le plus gros de mon module? Tout ce qui est requêtes, échanges entre mon formulaire et la base de données ... ? Link to comment Share on other sites More sharing options...
J. Danse Posted February 23, 2015 Share Posted February 23, 2015 Tout dépend de beaucoup, et en premier de votre ré-utilisabilité du module, de vos souhaits et de ce que vous voulez faire au final. Disons qu'on peut toujours "contourner" les standards et les pratiques de programmation PrestaShop. Seulement, ce serait dommage de ne pas profiter des outils fournis (tels que des Helpers) et cela vous permettrait d'en apprendre plus sur le fonctionnement interne et d'en tirer avantage. Si le module est destiné à un seul et unique compte marchand, via une diffusion en direct, vous êtes - je dirais - libre de faire un peu comme vous le sentez. Si l'idée est une diffusion massive, autant vous dire que le respect des standards est très important, sur le coup. Pour le getContent(), il n'y a pas de conventions directes pour le nommage du fichier. Dans l'idée, je l'appelle configure.tpl car il est le template lié à la configuration mais vous pouvez l'appeller comme bon vous semble, du moment que c'est ce nom qui est renseigné dans le module, bien entendu =) La méthode getContent() à pour objectif de fournir un espace de configuration au module. Mais elle ne se limite pas à cela. A ce niveau, tout dépend de la fréquence de vision de votre formulaire et de l'impact que cela peut avoir sur un choix délibéré qui est l'utilisation d'un contrôleur à part (accessible via le menu) ou de la méthode getContent() (accessible via la page modules ou via un accès rapide configuré). A l'heure actuelle, seul vous pouvez en décidez. Je n'ai pas assez d'informations sur l'objectif du module et sur ce que représente son utilisation, je ne peux donc pas vous aiguiller là-dessus. Si jamais vous le pouvez, n'hésitez pas à détaillé un peu plus l'objet et l'objectif du module, afin que je puisse vous aider plus amplement et, peut-être même, vous fournir une structure et des éléments de base pour avancer là-dessus, ce sera surement plus "simple" pour vous, Link to comment Share on other sites More sharing options...
Waschou Posted February 23, 2015 Author Share Posted February 23, 2015 (edited) Pour l'objectif de mon module, c'est de renseigner une table que j'ai créé dans la base de données Presta (qui n'est donc utilisée nulle part), qui regroupe les machines et leurs composants (que je nommerai "machines"), composants étant fournis par l'entreprise pour laquelle je dois faire le module (qui a donc un usage unique). Il s'agit donc de pouvoir ajouter modifier ou supprimer n’importe quelle donnée de la table "machine" à partir du BO (il y en a 10000 environ). Je comptais faire un menu déroulant affichant tous les noms des machines, une fois l'un sélectionné, cela afficherait les composants de la machine dans un nouveau menu déroulant, et une fois l'un des composants sélectionné, cela afficherait ses caractéristiques. On a donc une grosse table modifiable, qui est liée à deux autres tables. La grosse table avec les machines, une autre avec les dimensions des composants (une vingtaine de dimensions sont possibles) enfin une avec les références et description. Donc pour résumer d'abord pouvoir interagir avec la table "machine", puis en fonction de la machine choisie cela affiche ses composants, puis en fonction du composant, afficher des données de la deuxième et troisième table. Je ne peux pas trop en dire plus concernant les machines et les composants mais voici en gros mon projet. Merci beaucoup de l'offre, c'est très gentil mais j'aimerai en apprendre concernant les modules (pour comme je l'ai dis en faire une présentation lors d'une épreuve en fin d'année) et on apprend beaucoup en codage quand on en fait un maximum par sois même. J'espère que c'est compréhensible, c'est vachement compliqué à expliquer clairement. EDIT : Pour faire plus simple : avoir les même fonctionnalités de Phpmyadmin mais en BO Prestashop. Edited February 23, 2015 by Waschou (see edit history) Link to comment Share on other sites More sharing options...
J. Danse Posted February 23, 2015 Share Posted February 23, 2015 C'est déjà bien plus clair, pour moi, en tout cas ! Raison de plus que pour apprendre à faire un module cohérent et correct, niveau PrestaShop, si il s'agit d'une volonté de présentation en TFE ! =) Donc, dans l'idée on à une structuration suivante: Une page unique de présentation des données dans laquelle se trouve: Un formulaire avec liste de sélection (basée sur la table "machines"). Un formulaire avec liste de sélection (basée sur la table "machines/composants") filtrée sur base de la machine sélectionnée. Un formulaire avec liste de sélection (basée sur la table "composants") filtrée sur base du couple machine/composant sélectionné. Une table de donnée (basée sur le composant choisi). Voilà pour le résumé, ce sera plus "simple" pour la suite, Bon, autant dire que vu le nombre d'enregistrements par sélection que vous pouvez avoir, il va être préférable de fonctionner par une méthode AJAX pour la récupération des données des étapes suivant la première sélection, pour bien faire. Dans votre cas, vous pouvez utilisez la méthode getContent() pour réaliser votre besoin. Il n'y a pas forcément lieu d'utiliser un ModuleAdminController. Vous pourrez, chez votre client, configurer un accès rapide voir même un léger ModuleAdminController qui n'aura qu'une intention: redirigé vers la page où se situe le getContent(). Donc, concentrez vous sur cette méthode. Ce sera plus judicieux ! Link to comment Share on other sites More sharing options...
Waschou Posted February 23, 2015 Author Share Posted February 23, 2015 C'est vrai que montré comme ça, c'est plus clair qu'un long pavé. Je ne connais pas du tout Ajax, je vais voir comment ça se présente. Je me fie à vous, j'espère pouvoir finir d'ici Samedi. Je vais faire de mon mieux, je vous tiens au courant de l'avancement. Encore merci du temps consacré à mon projet! (je ne le dirai jamais assez.) Link to comment Share on other sites More sharing options...
J. Danse Posted February 23, 2015 Share Posted February 23, 2015 N'est-ce pas ? =) Encore une raison de faire ce petit module, vous allez voir c'est très utile, relativement aisé et très simple en même temps. Il faudra passer par jQuery.ajax, pour vous mettre sur la voie. D'ici samedi, en étant à temps "plein" dessus ? Vous pouvez le faire ! Vous allez tenir votre objectif, sans soucis ! Pas de soucis ; ma satisfaction résidera dans votre fierté d'accomplissement de vos objectifs et de votre module, =) 1 Link to comment Share on other sites More sharing options...
Waschou Posted February 23, 2015 Author Share Posted February 23, 2015 Oui on peut dire que je suis à temps plein dessus. Je ne suis pas du tout familier avec l'Ajax, c'est possible de faire la même chose en Php normal et par la suite le modifier? Parce que les fonctions Ajax sont en javascript, et bien que j'ai les bases je ne pense pas que ce soit dans mes cordes ... J'ai compris que ça permettait de gagner du temps (la page ne se recharge pas après sélection dans le premier menu déroulant), mais je préfère d'abord obtenir quelque chose de fonctionnel. Link to comment Share on other sites More sharing options...
prestasafe Posted February 23, 2015 Share Posted February 23, 2015 Bonjour, Je comprends tout à fait ton point de vue, il y a pas si lontemps que ça, je débutai dans prestashop et comme toi je savais faire un PHP "pure" mais quand il s'agissait de le passer dans Prestashop, c'était compliqué. D'après moi, la meilleurs façon de se former à Prestashop, c'est de regardais comme sont fait les autres modules mais attention, les bon modules, certains modules sont très mal fait et il ne faut surtout pas s'en inspirer (surtout si on veut publier son module sur le addons). Personnlement je n'utilise pas l'API de prestashop pour créer les formulaire, je passe directement avec Smarty (il est la alors autant l'utiliser). Ce que je fais, ce que j'envoi mes données à smarty puis après je les exploitent dans mon fichier .tpl. Comme t'a dit PrestaEdit, il faut que tu passe dans la method getContent() de ton module. protected function getContent(){ $this->smarty->assign('var','Coucou'); $this->display($this->_path,'monfichier.tpl'); } voila une methode qui envoie une donnée au fichier "monfichier.tpl" puis dans ton tpl tu n'a plus qu'a faire: {$var} et tu aura "coucou" en résultat. Fin bref, ne te décourage pas, on fini toujours pas trouvé des solution, fait comme bon te semble et jette un oeil dans les code existant. Et pour avoir un listing simpatoche de tes produits dans le module, je te conseil d'intégrer le plugin jQuery datatable, ça fait des tableaux dynamique plutot cool. N'hésites pas si tu as besoin ! Link to comment Share on other sites More sharing options...
Waschou Posted February 24, 2015 Author Share Posted February 24, 2015 Bonjour, Merci de votre aide guigui23, j'essaye justement de "copier" (syntaxes, etc...) ce que je peux trouver dans les autres modules afin de faire fonctionner le mien. Cependant, j'ai un petit soucis. J'ai voulu l'installer pour avoir un aperçu et tester directement, mais j'ai eu ce problème là à l'installation du module : [PrestaShop] Fatal error in module file :/home/xxx/www/modules/ajoutproduit/ajoutproduit.php:syntax error, unexpected T_OBJECT_OPERATOR Et quand je regarde ensuite dans mes modules : ajoutproduit (erreur de syntaxe dans /modules/ajoutproduit/ajoutproduit.php) ajoutproduit (classe manquante dans /modules/ajoutproduit/ajoutproduit.php) J'ai mon constructeur, la fonction install, uninstall, et getContent(). Je l'ai zippé puis importé depuis le BO. (Donc dans mon zip j'ai directement mon fichier ajoutproduit.php, ajoutproduit.tpl, et index.php sans dossiers) Qu'est ce qui pourrait poser problème s'il vous plait? Link to comment Share on other sites More sharing options...
prestasafe Posted February 24, 2015 Share Posted February 24, 2015 peux tu afficher ton code que je fasse un test ? Link to comment Share on other sites More sharing options...
Waschou Posted February 24, 2015 Author Share Posted February 24, 2015 <?php if(!defined( '_PS_VERSION_')) exit; class ajoutProduit extends Module{ public function __construct(){ $this--->name = 'ajoutproduitxxx'; $this->tab = 'other'; $this->version = '1.0'; $this->author = 'xxx'; $this->need_instance = 0; parent::__construct(); $this->displayName = $this->l('Module Produits xxx'); $this->description = $this->l('Permet ajout/supression/modification de produits entreprise xxx'); $this->confirmUninstall = $this->l('Etes vous sur de vouloir supprimer ce module?'); } public function install() { if (parent::install() == false) return false; return true; } public function uninstall() { $this->_clearCache('*'); return parent::uninstall(); } protected function getContent() { $this->smarty->assign('var','Coucou'); $this->display($this->_path,'ajoutproduit.tpl'); } } } ajoutproduit.php {$var} ajoutproduit.tpl <?php header("Expires: Mon, 26 Jul 1997 05:00:00 GMT"); header("Expires: Mon, 26 Jul 1997 05:00:00 GMT"); header("Last-Modified: ".gmdate("D, d M Y H:i:s")." GMT"); header("Cache-Control: no-store, no-cache, must-revalidate"); header("Cache-Control: post-check=0, pre-check=0", false); header("Pragma: no-cache"); header("Location: ../"); exit; ?> index.php (xxx étant des informations cachées comme le nom de l'entreprise par exemple.) Merci encore de votre aide à tous les deux. (je me répète je sais! ) Link to comment Share on other sites More sharing options...
Mediacom87 Posted February 24, 2015 Share Posted February 24, 2015 à mon avis la classe doit avoir le même nom que name. Link to comment Share on other sites More sharing options...
Waschou Posted February 24, 2015 Author Share Posted February 24, 2015 (edited) En changeant le name (en mettant le même que la classe), toujours le même problème. Je vous dis quand je trouve le soucis. EDIT : Trouvé : $this--->name = 'ajoutproduitxxx'; à remplacer par $this->name = 'ajoutproduit'; Edited February 24, 2015 by Waschou (see edit history) Link to comment Share on other sites More sharing options...
Mediacom87 Posted February 24, 2015 Share Posted February 24, 2015 heu le tpl c'est une copie de index ? car à par changer le répertoire cela ne fait rien d'autre. Link to comment Share on other sites More sharing options...
Waschou Posted February 24, 2015 Author Share Posted February 24, 2015 Non mon tpl c'est simplement {$var} , l'index que j'ai mis c'est ce que j'ai vu qu'il fallait mettre via les tutos/doc Presta. Link to comment Share on other sites More sharing options...
prestasafe Posted February 24, 2015 Share Posted February 24, 2015 Tout fonctionne maintenant ? Link to comment Share on other sites More sharing options...
Waschou Posted February 24, 2015 Author Share Posted February 24, 2015 Donc oui l'installation est bonne, maintenant avec ce code quand on va dans la configuration du module c'est sensé afficher "Coucou" (si j'ai bien compris), hors ça n'affiche rien du tout. J'avance lentement mais surement! Link to comment Share on other sites More sharing options...
prestasafe Posted February 24, 2015 Share Posted February 24, 2015 (edited) remplace le $this->display($this->_path,'ajoutproduit.tpl'); par return $this->display($this->_path,'ajoutproduit.tpl'); et la ça sera bon je viens de faire le test Edited February 24, 2015 by guigui23 (see edit history) Link to comment Share on other sites More sharing options...
Waschou Posted February 24, 2015 Author Share Posted February 24, 2015 Super ça marche!! Merci beaucoup! Me voilà avec un bon début. Link to comment Share on other sites More sharing options...
Waschou Posted February 24, 2015 Author Share Posted February 24, 2015 Double post, j'en suis désolé. J'ai encore des questions (si toutes fois vous avez le temps d'y répondre, bien entendu) : -Est il possible de faire du php/requêtes SQL directement dans le tpl? (J'imagine que non, vu que c'est pas son but premier...) -Dans le cas d'une réponse négative, pour faire une requête sql, dois-je procéder comme ceci : $sql = Db::getInstance()->execute('SELECT * FROM machine); pour ensuite mettre cette requête dans une variable et la transmettre dans le tpl (Dois je passer par smarty? Par un tableau? ...) -Est ce qu'à l'actualisation du module, le tpl et le .php sont tous les deux actualisés? Donc est il possible d'utiliser les variables $_SESSION (que je trouve extrêmement utiles)? Je fais de mon mieux pour tout trouver sur Internet, mais certains problèmes persistent malgré cela... Link to comment Share on other sites More sharing options...
prestasafe Posted February 24, 2015 Share Posted February 24, 2015 Alors tu peux mais c'est pas jolie, si tu veux faire un SELECT et tout resortir en tableaux (ce qui se fait le plus dans tous les modules) tu faits un $sql = Db::getInstance()->executeS('SELECT * FROM machine); et tu l'envoi à smarty $this->smarty->assign('sql',$sql); puis dans ton TPL si tu veux faire un print_r {$sql|print_r} et voila, pour faire une foreach rien de plus simple dans ton tpl: {foreach from=$sql item=s name=foreachSQL} {$s.mon_champs_de_ma_table} {/foreach} regarde la syntaxe dans les modules, puis ne confond pas // simple requete $sql = Db::getInstance()->execute('SELECT * FROM machine); avec // requete qui retourne un tableau $sql = Db::getInstance()->executeS('SELECT * FROM machine); voila voila Link to comment Share on other sites More sharing options...
Waschou Posted February 24, 2015 Author Share Posted February 24, 2015 Pour les deux requêtes à ne pas confondre, oui j'ai justement remarqué cette différence dans la doc Presta. Je n'arrive pas trop à m'y faire à l'utilisation de smarty, mais j'imagine que ça viendra avec le temps. Merci de la réponse rapide! Link to comment Share on other sites More sharing options...
prestasafe Posted February 24, 2015 Share Posted February 24, 2015 Oui ça viendra mais perso je n'aime pas. Fin bon pour moi c'est le plus flexible pour faire un module. Link to comment Share on other sites More sharing options...
Waschou Posted February 24, 2015 Author Share Posted February 24, 2015 C'est vrai que c'est pratique, mais niveau prise en main c'est pas encore ça... Je pense qu'on peut faire de belles choses une fois qu'on le maitrise (gagner un temps fou, et de la clarté ...). Encore faut il le maitriser. Parce que j'ai beau regarder, il n'est pas utilisé tant que ça par les autres modules (ou bien je suis aveugle?). Link to comment Share on other sites More sharing options...
prestasafe Posted February 24, 2015 Share Posted February 24, 2015 Beaucoup de module l'utilise ou sinon il écrive directement dans le php comme ça: $html = ''; $html .= 'Coucou'; return $html; Mais ça fait du code moins jolie que smarty. Bon après c'est une question d'habitude mais ça fait du code clair. Link to comment Share on other sites More sharing options...
Mediacom87 Posted February 24, 2015 Share Posted February 24, 2015 Attention tout cela est bien plus complexe. Donc l'utilisation de smarty n'était pas possible avant .. je ne sais plus quelle version. Avec l'utilisation des Helpers il n'est pas obligatoire d'avoir un tpl derrière. Après la bonne technique est celle qui permet d'arriver à réaliser ce que l'on veut faire tout simplement. 1 Link to comment Share on other sites More sharing options...
Waschou Posted February 25, 2015 Author Share Posted February 25, 2015 Donc j'ai encore besoin de vous... J'ai fais mon premier menu déroulant, qui affiche toutes les machines. Mon soucis maintenant c'est récupérer soit dans mon fichier php soit dans mon tpl l'information choisie. Donc dans mon form j'ai choisi de renvoyer sur la même page l'option choisie mais impossible d'afficher ce que je viens de récupérer. Comment faire? Merci encore et toujours de votre aide précieuse. Link to comment Share on other sites More sharing options...
prestasafe Posted February 25, 2015 Share Posted February 25, 2015 (edited) En fait ton fichier .tpl et un "calque" du PHP. Donc si tu veux afficher tous les POST dant ton TPL tu n'a qu'a faire dans ton PHP submit est le name de ton input type="submit" if(Tools::isSubmit('submit')){ // equivalent à isset($_POST['submit']) print_r($_POST); } sinon tu peux le faire directement dans smarty {if $smarty.post} {$smarty.post|print_r} {/if} Voila en espérant que cela puisse t'aider. Edited February 25, 2015 by guigui23 (see edit history) Link to comment Share on other sites More sharing options...
J. Danse Posted February 25, 2015 Share Posted February 25, 2015 Et, pour t'aider encore plus: Tools::getValue('input_name') te permettra, dans le PHP, de récupérer la valeur du champ envoyé. Link to comment Share on other sites More sharing options...
Waschou Posted February 25, 2015 Author Share Posted February 25, 2015 Merci de votre aide, mais malheureusement ça ne fonctionne pas, parce que mon form actualise que le tpl quand je choisis une option, et j'ai bien l'impression que le php n'est pas actualisé. <form action="" method="post" id="machine"> <select name="lesmachines" id="lesmachines" onchange="document.forms['machine'].submit();"> Link to comment Share on other sites More sharing options...
prestasafe Posted February 25, 2015 Share Posted February 25, 2015 pour tu ne rajoute pas un <input type="submit" name="submit" value="{l s='Send' mod='ajoutproduit'}" > ? {l s='Send' mod='ajoutproduit'} {* traduction du module via smarty *} Link to comment Share on other sites More sharing options...
YopixelAE Posted February 25, 2015 Share Posted February 25, 2015 Bon, autant dire que vu le nombre d'enregistrements par sélection que vous pouvez avoir, il va être préférable de fonctionner par une méthode AJAX pour la récupération des données des étapes suivant la première sélection, pour bien faire. J.Danse a raison, c'est beaucoup mieux. Voici la doc pour le standard des requêtes : http://doc.prestashop.com/display/PS15/Using+jQuery+and+Ajax 1 Link to comment Share on other sites More sharing options...
J. Danse Posted February 25, 2015 Share Posted February 25, 2015 "que le php n'est pas actualisé" ; ça veut dire quoi, ça ? Comment ça, un "PHP actualisé" ? Link to comment Share on other sites More sharing options...
J. Danse Posted February 25, 2015 Share Posted February 25, 2015 pour tu ne rajoute pas un <input type="submit" name="submit" value="{l s='Send' mod='ajoutproduit'}" > ? Il souhaite faire du refresh à la volée, en fait ;-) Link to comment Share on other sites More sharing options...
prestasafe Posted February 25, 2015 Share Posted February 25, 2015 a ok ! à ce moment la un petit coup de jQuery et c'est bon $(function(){ $('#lesmachines').change(function(e){ var data = $('#machine').serialize(); $.post('{$module_dir}ajax.php', data , function(output){ console.log(output); }); }); }); puis faire un fichier ajax.php à la racine du module et inclure les fichier pour "intégrer" Prestashop include_once('../../config/config.inc.php'); include_once('../../init.php'); print_r($_POST); et la tu traite ton PHP 1 Link to comment Share on other sites More sharing options...
Waschou Posted February 25, 2015 Author Share Posted February 25, 2015 Comment expliquer ... Je pense que mon fichier tpl est rafraichi alors que mon fichier php ne l'est pas (au moment du choix de l'option). Concernant le JQuery et Ajax, comme je l'ai dis je ne suis pas trop familier, je préfère passer dans un premier temps par quelque chose de plus accessible. guigui23, mes excuses mais je n'ai pas compris. Link to comment Share on other sites More sharing options...
YopixelAE Posted February 25, 2015 Share Posted February 25, 2015 mon fichier tpl est rafraichi alors que mon fichier php ne l'est pas Mais c'est normal ! Link to comment Share on other sites More sharing options...
Waschou Posted February 25, 2015 Author Share Posted February 25, 2015 Je n'arrive pas à faire fonctionner le JQuery guigui23 ... Il faut bien le mettre dans le tpl entre <script>...</script> ? Link to comment Share on other sites More sharing options...
prestasafe Posted February 25, 2015 Share Posted February 25, 2015 oui dans le tpl ouvre la console developper de ton navigateur (F12 sur chrome) et regarde dans l'onglet console si tu as une erreur ou un résulat qui s'affiche quand tu change le <select> Link to comment Share on other sites More sharing options...
Waschou Posted February 25, 2015 Author Share Posted February 25, 2015 Apparemment il n'y a pas d’erreurs. Et avec ou sans le code, il n'y a aucune différence dans l'onglet console. Link to comment Share on other sites More sharing options...
prestasafe Posted February 25, 2015 Share Posted February 25, 2015 Et si tu affiche ton code source tu vois bien ton code jquery ?? Link to comment Share on other sites More sharing options...
Waschou Posted February 25, 2015 Author Share Posted February 25, 2015 Oui dans le code source, je vois bien le code jQuery. Link to comment Share on other sites More sharing options...
J. Danse Posted February 25, 2015 Share Posted February 25, 2015 Tiens, Waschou, une question un peu en aparté: dans quel contexte de TFE vous réalisez votre module ? Plus précisément, dans quel secteur d'étude êtes-vous ? Link to comment Share on other sites More sharing options...
Waschou Posted February 25, 2015 Author Share Posted February 25, 2015 L'entreprise pour laquelle je fais ce module travaille dans les pièces d'usures pour engins de travaux publics (godets, ...). Link to comment Share on other sites More sharing options...
J. Danse Posted February 25, 2015 Share Posted February 25, 2015 Merci ; je voulais plutôt parler de toi, niveau études. Je ne sais pas comment appeler cela, chez nous c'est Bachelier/Master en Web, par exemple. C'est juste de la curiosité, =) Link to comment Share on other sites More sharing options...
Waschou Posted February 25, 2015 Author Share Posted February 25, 2015 Ah d'accord. Niveau études, je suis en deuxième année de BTS SIO en spécialité SLAM (BTS développement en gros). Je ne code que depuis 3 ans. Je compte par la suite faire un Master en informatique ou alors me réorienter pour devenir Community Manager. (ou bien les deux, pourquoi pas ) 1 Link to comment Share on other sites More sharing options...
Waschou Posted February 25, 2015 Author Share Posted February 25, 2015 (edited) Concernant le code jQuery, j'ai l'impression qu'il manque une parenthèse ouvrante, ce qui expliquerait que ça ne marche pas. (EDIT : 10 fermantes, 9 ouvrantes selon mon comptage sur développé) Je cherche pour savoir où la mettre. Edited February 25, 2015 by Waschou (see edit history) Link to comment Share on other sites More sharing options...
prestasafe Posted February 25, 2015 Share Posted February 25, 2015 $(function(){ alert('jQuery OK'); $('#lesmachines').change(function(e){ var data = $('#machine').serialize(); $.post('{$module_dir}ajax.php', data , function(output){ console.log(output); }); // end POST }); // end change });// end jQuery Essaye avec ça pour voir si tu as une alert qui se déclenche qui tu actualise ta page ? si l'alert est la ça veut dire que jquery est OK. Si il ya une erreur dans le script tu devrais voir une erreur dans ta console javascript Link to comment Share on other sites More sharing options...
Waschou Posted February 25, 2015 Author Share Posted February 25, 2015 (edited) L'alert se déclenche. Mais il n'y a pas d'erreur dans la console js. EDIT : Mais c'est peut être pas ça qui pose problème, peut être que c'est mon formulaire qui ne va pas ... Edited February 25, 2015 by Waschou (see edit history) Link to comment Share on other sites More sharing options...
prestasafe Posted February 25, 2015 Share Posted February 25, 2015 C'est que y'a un problème ailleurs, tu as mis quoi dans ton ajax.php ? Link to comment Share on other sites More sharing options...
Waschou Posted February 25, 2015 Author Share Posted February 25, 2015 J'ai mis le code que tu m'as dis de mettre. include_once('../../config/config.inc.php'); include_once('../../init.php'); print_r($_POST); Link to comment Share on other sites More sharing options...
Waschou Posted February 25, 2015 Author Share Posted February 25, 2015 (edited) Est ce possible de faire quelque chose du genre : $this->smarty->assign('variable','Tools::getValue('maVariablePost')') ; Et comment vérifier autrement si ma variable de mon formulaire est bien transmise ? EDIT : Après multiples tests, il semblerait que la variable de mon formulaire ne soit pas transmise. <form action="" method="post" id="machine"> <select name="lesmachines" id="lesmachines" onchange="document.forms['machine'].submit();"> <option value="-1">- - - Choisissez une machine - - -</option> {foreach from=$sql item=s name=foreachSQL} <option value="{$s.Modele}">{$s.Marque} - {$s.Modele}</option> {/foreach} </select> </form> Donc mon problème viendrait d'ici. Si quelqu'un peut m'éclairer, je lui serai reconnaissant. (même si j'ai des doutes sur le action="" ) Edited February 25, 2015 by Waschou (see edit history) Link to comment Share on other sites More sharing options...
prestasafe Posted February 25, 2015 Share Posted February 25, 2015 Je crois savoir pourquoi ton jquery ne marche pas, supprime le onchange="document.forms['machine'].submit();" et refait un test Link to comment Share on other sites More sharing options...
Waschou Posted February 26, 2015 Author Share Posted February 26, 2015 (edited) En supprimant cette ligne, la page ne s'actualise pas, et donc la variable n'est pas transférée ... Peut être existe-t-il un autre moyen d'actualiser au choix d'une option ? EDIT : Au final, je suis même pas sur d'avoir fini samedi (heures supp incoming) Edited February 26, 2015 by Waschou (see edit history) Link to comment Share on other sites More sharing options...
Waschou Posted February 26, 2015 Author Share Posted February 26, 2015 (edited) J'ai rajouté : <?php print_r($_POST); ?> dans mon tpl pour voir, mais ça ne retourne rien ... Cependant, quand je fais : <select name="lesmachines" id="lesmachines" onchange="document.location.href=this.value();"> J'ai bien la bonne valeur dans l'URL. EDIT : J'ai aussi essayé de copier le code de J.Danse (que je remercie encore) concernant le formulaire : action="{$request_uri}" $this->context->smarty->assign('request_uri', Tools::safeOutput($_SERVER['REQUEST_URI'])); Sans succès non plus. C'est normal que si je mets du code php dans mon tpl, ça ne marche pas ? J'ai essayé : {php}echo 'Hello world premier'; {/php} <? echo 'Hello world deuxieme'; ?> Le premier me sort une erreur de balise. Le deuxième n'affiche rien. Edited February 26, 2015 by Waschou (see edit history) Link to comment Share on other sites More sharing options...
Waschou Posted February 26, 2015 Author Share Posted February 26, 2015 (edited) C'est bon, j'ai réussi à faire fonctionner {php} en allant dans config/smarty.config.inc.php, et modifier Smarty en SmartyBC : require_once(_PS_SMARTY_DIR_.'SmartyBC.class.php'); $smarty = new SmartyBC(); EDIT : Malgré le fait que le php fonctionne, ça me retourne une erreur : [PrestaShop] Fatal error in module file :/home/xxx/www/tools/smarty/SmartyBC.class.php(464) : eval()'d code: syntax error, unexpected T_ENCAPSED_AND_WHITESPACE, expecting T_STRING or T_VARIABLE or T_NUM_STRING => je cherche d'où ça peut venir ... Edited February 26, 2015 by Waschou (see edit history) Link to comment Share on other sites More sharing options...
YopixelAE Posted February 26, 2015 Share Posted February 26, 2015 (edited) Oublie le PHP dans le TPL ... Voici comment tu peux procéder pour mettre à jour ta page sans reload après le choix selectionné : Edit : mon code est pour le FO, donc vérifie/corrige le chemin include_once('../../../config etc. FICHIER TARGET DE L'APPEL AJAX (ajax.php) <?php include_once('../../../config/config.inc.php'); include_once('../../../init.php'); $action = Tools::getValue('action'); $data = Tools::getValue('data'); if ($action == 'askbase') doSomething($data); function doSomething($data) { $context = Context::getContext(); $context->smarty->assign(array( 'data' => $data )); $my_tpl = $context->smarty->fetch(_PS_MODULE_DIR_.'nomdumodule/views/templates/front/nomdufichiertpl.tpl'); $js = Tools::jsonEncode(array( 'data' => $data, 'my_tpl' => $my_tpl )); print ($js); } FICHIER JS POUR L'APPEL AJAX (monfichierjs.js) $("#IDduSelect").on('change', function () { /** EVENT CAPTURE **/ var data = $(this).val(); var param = { 'action' : 'askbase', 'data' : data }; myRequest(param); }); var myRequest = function (param) { /** DATABASE REQUEST **/ console.log('myRequest inits'); $.ajax({ url: baseDir + 'modules/nomdumodule/functions/ajax.php', data: '&data=' + param.data + '&action=' + param.action, type: 'POST', async: true, dataType: "json", success: function (jsonData) { console.log('success'); // DO SOMETHING } }); return false; }; Edited February 26, 2015 by Yopixel (see edit history) Link to comment Share on other sites More sharing options...
Waschou Posted February 27, 2015 Author Share Posted February 27, 2015 (edited) Merci pour le code. Cependant il faut le modifier pour l'adapter à mon module BO ... Mais vu que je ne m'y connais pas du tout, puis-je avoir un peu plus d'explications concernant ce qu'il faut modifier? Et mon problème persiste. Peu importe la manière utilisée j'ai l'impression que la variable de mon form n'est pas transmise dans mon fichier php ... Encore merci de votre aide, j'en ai réellement besoin. EDIT : Yopixel, tu me dis de modifier le chemin include_once('../../../config/config.inc.php');include_once('../../../init.php'); alors que guigui23 m'a dit de mettre ce chemin dans mon ajax. Edited February 27, 2015 by Waschou (see edit history) Link to comment Share on other sites More sharing options...
Waschou Posted February 27, 2015 Author Share Posted February 27, 2015 Autre problème maintenant mon menu déroulant n'affiche même plus mes machines, et je ne sais plus ce que j'ai modifié. Je vous tiens comme d'habitude, au courant. Link to comment Share on other sites More sharing options...
YopixelAE Posted March 1, 2015 Share Posted March 1, 2015 Yopixel, tu me dis de modifier le chemin include_once('../../../config/config.inc.php'); include_once('../../../init.php'); Alors que guigui23 m'a dit de mettre ce chemin dans mon ajax. Non il a dit : include_once('../../config/config.inc.php'); include_once('../../init.php'); Ce ne sont pas les mêmes chemins ! A vous de vérifier/adapter selon l'endroit où vous placez votre fichier ajax.php Autre problème maintenant mon menu déroulant n'affiche même plus mes machines, et je ne sais plus ce que j'ai modifié. Difficile de deviner pour vous, tenez un historique de vos modifications ! Où postez votre code. 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