Jump to content

Modules MERE et FILLES


Recommended Posts

Coucou ^^

Comme certain le savent, je développe un module permettant de placer des élément publicitaires un peu partout sur le site.

La version actuelle, et comme tout autre module, ne permet d'avoir qu'un seul emplacement dans chaque hook, qui nécessiterais donc d'avoir plusieurs modules à gérer séparément pour afficher deux choses différentes à deux endroits différents d'un même hook (la colonne de droite, par exemple).


Il m'a été beaucoup demandé si je ne pouvais pas permettre de placer plusieurs éléments, et la solution de les placer les uns à la suite des autres ne me plais pas.

C'est pourquoi j'ai travaillé sur une façon de séparer ces éléments, et maintenant, ce soir, je suis capable de vous dire que ça marche parfaitement. Ainsi, on installe un module "MERE" qui gérera lui même ses modules "FILLES", tant au niveau de l'installation, la configuration, ou la suppression. Dans mon cas, le module de publicité gérera les emplacements dans divers hook pour placer des publicités. c'est lui qui décidera qui affichera quoi, mais les "filles" auront une position indépendantes de la mère ou des autres filles.


Comment je ne suis pas égoïste, j'ai fait en sorte de généraliser mes modifications afin qu'elles puissent servir à d'autres modules, à condition de s'entendre sur certaines 'conventions', si ça intéresse quelqu'un.

Le prix à payer est la modifications de deux fichiers du noyau (/classes/Module.php) et (/admin/tabs/AdminModulesPositions.php), ainsi que l'ajout de deux colonnes dans la table ps_module.


Si vous êtes un créateur de module et que vous cherchez cette déclinaison mère/fille, ou que vous êtes tout simplement curieux, je vous invites à me contacter pour voir comment ça marche.

Link to comment
Share on other sites

Oui, Pierre-Yves, si le dossier d'un module est situé dans le dossier /modules/, et qu'on inscrit dans la table ps_module une ligne portant le nom de ce module, il sera présent dans le backoffice, tu imagines bien que j'y ai tout de suite pensé.

Seulement, le but de ma manipulation, c'est de n'avoir QU'UN module présent dans le backoffice, possédant PLUSIEURS inscriptions au même hook, et dont les positions dans les hooks sont configurables dans le backoffice à l'endroit où se situe les autres modules !! et ça complique un peu les choses.

Certes, il serait possible de créer des dossier dans /modules/ pour chacune de ses positions, mais je me REFUSE à polluer ainsi le dossier /modules/ de pleins de petits dossiers. Je veux donc placer les classes "filles" dans le dossier "mère" de mon module.

Or, Prestashop réalise différents tests pour la validation d'un module ainsi que la création d'un objet de la classe du module. Ainsi, pour créer une instance d'un module, on passe par deux méthodes :

Validation::isModuleName($moduleName) qui vérifie que le nom du module ne contient que des caractères alphabétiques (+ - et _, je crois), ce qui interdit l'astuce "je met comme nom de module toto/tata comme ça il ira chercher la classe dans le dossier toto de mon module, ralala que je suis intelligent et vil !!"

file_exists(_PS_MODULE_DIR_.$moduleName.'/'.$moduleName.'.php'), ce qui ... bah.... oblige la classe de nom "$moduleName" à se trouver dans un fichier portant son nom dans un dossier portant tout aussi bien son nom, et dans le dossier des modules.


Alors tu pourrais me dire "tout ça pour que /modules/ ne soit pas submergé de dossiers "filles".

Et bah oui :D. De plus, je ne veux pas qu'un module fille apparaisse dans la liste des modules (seulement la mère), mais que le module fille apparaisse bien dans les positions.

Link to comment
Share on other sites

Tu as pas tout compris à ce que je voulais dire :P

Il est clair qu'il ne faut pas s'amuser à ajouter des dossiers dans le /modules/. Mais par contre, ce que tu peux essayer (je n'ai pas tester) c'est d'ajouter une nouvelle entrée pour ton module dans la table "ps_hook_module"... Comme cela, tu n'as qu'un seul et unique module mais qui est greffer plusieurs fois au même Hook :)

Link to comment
Share on other sites

AAAH, pour la table ps_hook_module... je suis d'accord, mais moi ça ne m'arrange pas d'avoir plusieurs appels à la même fonction hookFooter (par exemple), à cause de ce que je dois mettre dans les emplacements, donc j'étais partit sur la modif... maintenant je peux p'tête forcer un peu dans ce sens, si ça peut éviter la modification je suis totalement pour.

ça m'énerve de pas voir ce genre de trucs, me sens stupide maintenant :P

Link to comment
Share on other sites

hmm, pasque je dois en gérer l'affichage en sachant à quel position je me trouve, puisque je fais en sorte que l'affichage soit aléatoire ou ordonné et défini par l'utilisateur. dans le cas de l'ordonné, je dois trouver une manière de "compter" le nombre d'appel à la fonction du hook correspondant et en définir donc l'affichage de la xième image. dans le cas de l'aléatoire, je dois faire encore plus attention, car je ne peux pas me contenter de prendre une image au hasard, mais aussi ne pas en prendre une qui a déjà été mise, et...

Bref, un joli casse tête, que j'avais résolu avec mon histoire de classe fille (un emplacement possède un ID, le module mère est inscrit dans le hook head et créé des fonction javascript modifiant le div d'un certain ID après avoir déterminée en UNE fois tous les emplacements, et les fille exécutent les fonctions javascript correspondante à leur chargement. clair et efficace, puis complexe maintenant si j'ai qu'un seul appel. maintenant que j'y repense, c'est pour ça que je voulais plusieurs classes ><)


une solution de facilité seraient de définir le contenu des emplacements dans la base de données et la modifier... mais... ça veux dire la modifier à chaque fois qu'une personne rafraichi sa page... avec 150 visites simultanées par jour, ça va être drôle, tiens...


du coup, je vais faire quelques tests, mais je suis sur que la variable $params donnée à toutes les fonctions hook contiendra une information dont je pourrais me servir, et me permettra de faire ce que je veux ;)

Link to comment
Share on other sites

Bon, j'ai donc fait cette double inscription, et, effectivement, il est fort probable que le module apparaisse à deux endroit dans le même Hook.

Seulement, sans toucher à un seul fichier du noyau, il n'y a qu'une seule position configurable dans la partie "POSITION" des modules.

et ça ne me plais pas.

groumph.

Tant pis, mon module aura la particularité de gérer "ses" positions dans les configurations. Je ne vais pas imposer un changement d'un fichier du noyau si je peux l'éviter en ajourant un peu de configuration de mon coté.

Link to comment
Share on other sites

Salut, félicitation et merci pour ton module que j'utilise souvent, que ce soit pour l'affichage de bannières pub ou pour l'affichage d'autres élements.

J'ai une suggestion a faire pour les prochaine versions : Ajouter la possibilité de mettre plusieurs "ads" dans un même bloc avec un affichage aléatoire / rotatif des "ads".

PS : Sur le CMS Guppy, il existe un module dans le genre "Total Ban" qui au niveau fonctionnalité me rapelle un peu le tien en mieux : http://leconte-sylvain.hpsam.info/articles.php?pg=397&lng=fr

@++

Link to comment
Share on other sites

Hmm, au niveau de l'aléatoire, Fre-do, j'ai prévu de faire ainsi :

Un hook (colonne de droite, gauche, etc...) pourra contenir plusieurs emplacements, et plusieurs éléments. Ses éléments s'afficheront soit l'un à la suite de l'autre (le premier élément de la liste dans l'emplacement le plus haut, etc...), soit totalement aléatoire.

Link to comment
Share on other sites

Bonjour,

Il reste effectivement la contrainte de savoir le nombre d'appel effectué au hook pour ton module...
Mais pour cela rien de plus simple! => Utilise les variables ;).

Avec une variable globale, tu n'as plus aucun soucis... Tu incrémentes ta variable à chaque fois que ton hook est appelé, comme cela, tu sais à chaque fois à quel appel tu es.

Pour l'aléatoire, rien de plus simple... Tu crée une variable (array) dans lequel tu mets les ID (je sais pas comment fonctionne ton module) qui ont déjà été affichés... Lorsque ton hook est appelé, tu prends un ID a affiché aléatoirement, et ensuite tu regarde s'il est dans le tableau. Si oui, tu prend l'ID suivant ;)

Tu comprends ?

S'il te faut un coup de main, hésites pas!

Link to comment
Share on other sites

Merci Pierre-Yves, mais j'ai déjà résolu le problème des appels au hook (avec à peu près la même méthode), et quand à l'aléatoire, j'ai pas dit que j'avais un problème :P

Non, ce qui me tracasse le plus, c'est qu'on se retrouve dans le backoffice avec une position de module qui n'est pas réglable. si en soit c'est pas gênant puisque je peux moi-même gérer ce déplacement... peut-être que ça peux gêner les autres modules, et ça ça me tracasse un peu plus (en effet, dans la position, je ne peux PAS bouger mon module s'il est en double (ou plus)).

Link to comment
Share on other sites

hmm, je confirme, avec la solution "simplifiée" (sans modification backoffice), le positionnement des modules est tout chamboulé (certains modules n'apparaissent plus à cause de ça dans la positionnement, et il est impossible de bouger mon module).

Je vais donc être dans l'obligation de faire une modification d'un fichier du noyau pour corriger ça.

Mais, encore une fois, ça ne me plais pas.


Ce que je pourrais faire, à la rigueur...

C'est un module qui permettra de faire cette configuration de la position "corrigée", dont il faudrait se servir à la place du positionnement.

idée à creuser ;)

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