Jump to content

Création module BO


Recommended Posts

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

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

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

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

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

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

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

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

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

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. :D

 

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. :rolleyes:

$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

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

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

Merci encore des explications!

 

Si je pouvais tout écrire en PHP classique ça m'arrangerait bien! :D

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

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

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

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

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. :D

 

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

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, =)

  • Like 1
Link to comment
Share on other sites

Oui on peut dire que je suis à temps plein dessus. :D

 

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

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

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 :

  1. ajoutproduit (erreur de syntaxe dans /modules/ajoutproduit/ajoutproduit.php)
  2. 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

<?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

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

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

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

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. :D

 

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

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.

  • Like 1
Link to comment
Share on other sites

Donc j'ai encore besoin de vous... :D

 

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

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

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

 

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

  • Like 1
Link to comment
Share on other sites

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

  • Like 1
Link to comment
Share on other sites

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. :huh:

Link to comment
Share on other sites

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 :) )

  • Like 1
Link to comment
Share on other sites

$(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

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

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

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

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

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

 

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

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...