Jump to content

Premier module: ajout d'un dropdown dans les produits d'une commande


Recommended Posts

Bonjour et bonne année.

Je suis en train de créer mon premier module Prestashop 1.7.5.2, qui doit permettre de configurer le status de chaque article dans une commande (par exemple préparé, en rupture de stock, en réapprovisionnement). Je viens du monde OsCommerce, autant dire que la philosophie change grandement et qu'en plus je n'ai jamais travaillé sur Symphony (quoique brièvement avec Zend Framework).

J'ai créé la partie permettant de créer ces status dans la bdd, avec le texte pour chaque langue. J'essaye maintenant de rajouter une combobox dans la backend de gestion de chaque commande, dans la liste des articles. J'ai suivi des indications pour les HOOKS trouvées dans la doc ainsi que plusieurs sites mais je n'y arrive pas.

Coici une partie du code de la classe:

public function install()
    {
			
        return parent::install() && $this->registerHook('displayAdminOrderContentOrder') && $this->_installSql() && $this->_installTab();
    }

public function hookDisplayAdminOrderContentOrder($params)
    {
		foreach ( $params['products'] as &$product ){ 
						$product['current_stock'] .= ' XXX';
		}
	}

Première chose que je ne comprends pas: s'il y a plusieurs articles dans la commande, seul le dernier possède les 3 "XXX" après le nombre en stock. Un var_dump à chaque boucle affiche pourtant des XXX pour chaque article. Je pense n'avoir pas utilisé le bon HOOK mais de la liste des HOOKs ça semble pourtant le plus adéquat.

Autre chose que je n'ai pas réussi à trouver, c'est comment rajouter une combobox dans cette liste en prenant les infos d'une base de données (j'ai essayé avec order_state->id_order_state,order_state_lang->name avant de créer mes propres tables ) mais je n'ai pas trouvé d'information de comment ajouter un composant dans une liste existante sans devoir tout refaire.

Merci pour votre aide.

Edited by bedford (see edit history)
Link to comment
Share on other sites

Aucune chance que le XXX affiché provienne du code que tu dévoiles.

Ce hook est un display, il doit donc retourner quelque chose à afficher

Les hooks en général (celui-ci particulièrement) passent les informations params par valeur et non par référence donc tes ajouts sont perdus

Pour modifier l'affichage (mettre une combo), il te faut faire un override de la vue ou partie de la vue de la page BO.

Edited by doekia (see edit history)
Link to comment
Share on other sites

2 hours ago, doekia said:

Aucune chance que le XXX affiché provienne du code que tu dévoiles.

Ce hook est un display, il doit donc retourner quelque chose à afficher

Les hooks en général (celui-ci particulièrement) passent les informations params par valeur et non par référence donc tes ajouts sont perdus

Pour modifier l'affichage (mettre une combo), il te faut faire un override de la vue ou partie de la vue de la page BO.

Merci doekia,

j'essaye de faire un override de la vue dans mon module mais ça ne prend pas le fichier tpl dans le sous-répertoire de mon module. ça m'inquiète car je vois dans les réponses du forum que les ovveride de template d'admin se font dans le sous-dossier override et pas monmodule/override !

J'ai copié les fichiers
   /adminXXX/themes/default/template/controllers/orders/view/view.tpl
  /adminXXX/themes/default/template/controllers/orders/_product_line.tpl
dans  le répertoire suivant:
   /modules/monmodule/override/controllers/admin/templates/orders/helpers/view/view.tpl
  /modules/monmodule/override/controllers/admin/templates/orders/helpers/_product_line.tpl

et j'ai modifié le chemin du include dans view.tpl pour qu'il prenne celui de monmodule mais il continue de prendre le template de base de l'admin.

EDIT 16:16
Je confirme que l'on peut overrider le template d'admin en mettant le template dans le dossier override:
/override/controllers/admin/templates/orders/helpers/view/view.tpl (Remplacer le chemin de _product_line.tpl)
/override/controllers/admin/templates/orders/helpers/_product_line.tpl

Je n'ai pas trouvé comment faire pour que ce soit fait dans mon module et ça m'intéresse toujours, je laisse donc pour l'instant à pas résolu car pour moi ce n'est pas une solution convenable. En espérant que quelqu'un puisse m'aider à mettre ces templates dans le dossier du module.

Edited by bedford (see edit history)
Link to comment
Share on other sites

  • 1 month later...

Up !!! J'ai réussi à ajouter le dropdown dans produt_line.tpl.php mais je ne vois pas où je dois ajouter le champ dans une requête pour qu'elle se remplisse (une table spécifique product_order_status). J'ai déjà rapatrié les status de articles commandés depuis mon OsCommerce et je dois ensuite lier la valeur à l'article commandé.

J'aimerais conserver la possibilité d'upgrader prestashop, en évitant des hack qui ne le rendraient pas possible.

Merci pour toute aide.

Edited by bedford
added information (see edit history)
Link to comment
Share on other sites

quelle aide peux-tu espérer?

On ne connait rien de ton code spécifique.

Et pour aller jusque'au bout de ma pensée. Comment peux-tu penser poser les pieds sur la lune alors que tu n'as aucune compréhension des principes de base d'aérodynamique?

Link to comment
Share on other sites

1 hour ago, doekia said:

quelle aide peux-tu espérer?

On ne connait rien de ton code spécifique.

Et pour aller jusque'au bout de ma pensée. Comment peux-tu penser poser les pieds sur la lune alors que tu n'as aucune compréhension des principes de base d'aérodynamique?

J'essaye en vain de comprendre la structure même des modules Prestashop. J'ai lu la doc (un mix de PS 1.5, 1.6, 1.7...) j'ai essayé des modules et des tutos que j'ai pu trouver sur le web (la plupart pour 1.6, on ne s'en rend compte qu'après avoir tout essayé en vain)...

Je viens du monde OsCommerce, que j'ai upgradé pendant plus de 10 ans ! Pas de POO, pas de framework et j'avoue que ma logique POO est plus que rouillée, mais j'ai d'excellentes notions de PHP/MySQL.

J'en viens donc à poster sur le forum car la logique de certaines choses m'échappent. Je voulais en faire un module, afin de ne pas toucher au coeur de PS, mais je ne trouve pas toute l'info, ou seulement par brides, et là je bloque.

Après avoir lu la doc PS pour les programmeurs et ne pas y avoir trouvé toutes les réponses, si quelqu'un peut me proposer un site qui explique comment créer un module 1.7 qui touche à l'existant, sans pour autant aller toucher le coeur, je suis preneur.

En ce qui me concerne l'état d'avancement de mon module:
j'ai réussi à créer une page où je peux enregistrer dans une table de la BDD un texte (multilangue) pour chaque status de produit ("en attente de préparation", "préparé", "backorder"...).
Dans la gestion d'une commande, j'ai réussi à ajouter un dropdown pour chaque produit.
Ce que j'essaye maintenant c'est de remplir chaque dropdown avec les enregistrements de ma table de la BDD, sans toucher au coeur de PS 1.7.

Edited by bedford
Updated answer (see edit history)
Link to comment
Share on other sites

Un module, et ce quelque soit le version ne touche pas au coeur.

Il utilise le framework, donc appelle les methodes des objets dont il a besoin

Dans certains cas, çà ne suffit pas et le module doit, soit s'insérer dans un hook, soit construire une override.

 

Si je crois avoir compris ton problème, c'est que tu veux faire une module mais ensuite traiter une action backoffice. Dans ce cas ton module doit intégrer son propre FrontController qui devra/pourra traiter toute la réponse comme bon lui semble

Pour la partie affichage seul (besoin de 90% des modules), il suffit de s'insérer dans un hook display et de contruire son propre contenu et de le renvoyer en réponse de ce hook

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