- 1
[Opened] [Jelix 1.3RC2]Appeler une methode d'un module à partir d'un autre module
Posted by Mindiell on 09/22/2011 16:53
Bon, je voudrais juste savoir si c'est possible. De ce que je comprends au niveau de Jelix, c'est un moyen simple de mettre en oeuvre ce que je veux faire, mais pas sur que cela soit le meilleur moyen :)
Je rappelle que je débute au niveau des FrameWorks et du MVC, et donc forcément avec Jelix !
Ce que je souhaite faire :
- Dans mon application, on peut rajouter un module pour rajouter des fonctionnalités à mon application
- Sur ma page d'accueil, je souhaite pouvoir afficher des cadres résumant un de ces modules (vous savez, un de ces cadres qui donne la météo, le cours de bourse, ou des infos de l'appli)
Un exemple :
- Je rajoute un module du type surveillance des logs
- Je demande à voir son widget sur ma page d'accueil (je suis l'admin de l'appli)
- Lorsque j'arrive sur ma page d'accueil j'ai les dix derniers logins utilisés, l'heure de login et si le login a réussi ou échoué (nombre de tentatives)
Mon idée :
- Mettre une action widget dans chaque module qui permet de renvoyer le résultat d'une zone widget globale (tous les widgets doivent se ressembler sur le cadre et tout) (mais située où, là je m'y perds un peu)
- Dans ma page d'accueil (module_principal~default:index tout bêtement pour le moment), je fais alors appel à chaque action (ou méthode donc) widget de chaque module souhaité. Dans le cas exemple ci-dessus un truc du genre :
$rep->body->assign('CONTENT', jSelectorFactory::create('act:demo~default')->widget());
Alors je ne sais pas si je suis très clair, mais il faut que j'y repense à tête reposée je crois. Si vous avez des idées, suggestions, critiques, n'hésitez pas ! merci !
Mindiell
[Opened] [Jelix 1.3RC2]Appeler une methode d'un module à partir d'un autre module
Posted by foxmask on 09/22/2011 17:34
Ce que tu veux faire se résume à jEvent::notifiy();
Dans chaque module tu places un jEvent::notify('MonBoWidGet'); puis dans le listener (que tu créés) tu ajoutes une methode onMonBoWidget qui recuperes les reponses (et les infos) pour les disposées comme bon te semble.
cf la doc
* http://jelix.org/articles/fr/manuel-1.3/events
et un tuto toujours d'actu
* http://jelix.org/articles/fr/tutoriels/modules/jevent
@GitHub - Forum HaveFnuBB! powered by Jelix - Le Booster Jelix !
[Opened] [Jelix 1.3RC2]Appeler une methode d'un module à partir d'un autre module
Posted by laurentj on 09/22/2011 21:06
Oui il faut utiliser les events.
Par contre, Foxmask, tu te trompe "de sens" :-). C'est la page d'accueil qui doit notifier un event, indiquant alors qu'elle veut afficher des widgets. Chaque module doit alors avoir un listener qui réponde à cet event, en renvoyant le contenu du widget qu'il veut afficher.
@mindiell : le comportement que je viens de décrire, est exactement ce que fait le module master_admin pour afficher des widgets sur la page d'accueil de l'admin. Voir la doc de master_admin et le code source du module. ainsi que la doc sur les events.
[Opened] [Jelix 1.3RC2]Appeler une methode d'un module à partir d'un autre module
Posted by Mindiell on 09/23/2011 10:56
Ok, merci... J'ai vu les events dans la doc, mais je voulais être sûr que l'idée de base était la bonne. Je vais m'y plonger tout de suite...
Mindiell
[Opened] [Jelix 1.3RC2]Appeler une methode d'un module à partir d'un autre module
Posted by foxmask on 09/23/2011 12:00
exact ; j'avais pas les idées claires :)
@GitHub - Forum HaveFnuBB! powered by Jelix - Le Booster Jelix !
[Opened] [Jelix 1.3RC2]Appeler une methode d'un module à partir d'un autre module
Posted by Mindiell on 09/23/2011 12:06
Tout simplement génial et hyper-simple : moins de 5 minutes à mettre en place un truc basique...
Par contre, l'évènement est lancé à tous les modules ? Donc quid si plusieurs utilisent un listener avec le même nom ? Et donc, dans ce cas, je ne peut pas utiliser un truc du genre :
$event = jEvent::notify('evenement');
Parce que dans mon cas, c'est l'utilisateur qui choisit les modules à afficher en page d'accueil, donc j'aurais aimé pouvoir faire un truc du genre :
$event1 = jEvent::notify('module1', 'evenement');
Mindiell
[Opened] [Jelix 1.3RC2]Appeler une methode d'un module à partir d'un autre module
Posted by Mindiell on 09/23/2011 12:19
Test réalisé avec "succès" :)
Fatal error: Cannot redeclare class widgetListener in C:\Documents and Settings\Administrator\My Documents\web\anemono\modules\test\classes\widget.listener.php on line 28
Donc il faut bien des listeners nommés différemment....
Humm, oubliez ce que j'ai dit, c'est encore mieux :
- Les classes doivent avoir des noms différents (logique en fait)
- Les réponses sont mises à la chaine dans l'évènement grâce à la fonction Add
Donc tous les modules peuvent répondre à un même évènement. Reste à gérer, au sein du module, qu'il doit apparaitre ou pas. puisqu'on ne peut pas appeler un évènement spécifiquement à un module, sauf à créer un évènement spécifique (type "event_module"). Mais cette solution me parait plus lourde pour le concepteur d'un nouveau module.
Bref, que du bon ! Merci Laurent !
Mindiell
[Opened] [Jelix 1.3RC2]Appeler une methode d'un module à partir d'un autre module
Posted by Mindiell on 09/23/2011 15:03
Je floode un peu, mais c'est pour dire que j'ai réussi à faire ce que je voulais et que c'est vraiment puissant ce framework (d'autres font peut-être pareil hein, j'en sais rien ^^).
Grosso modo, mon listener renvoit un tableau qui est la liste des paramètres utilisés sur une zone widget du module principal qui récupère le contenu n fois (autant que de widgets) et assigne le résultat complet à la zone du template principal.
C'est super puissant et simplissime à la fois : Bravo encore une fois ! :)
Mindiell
[Opened] [Jelix 1.3RC2]Appeler une methode d'un module à partir d'un autre module
Posted by Mindiell on 09/23/2011 15:41
Petite remarque :
Je suis obligé de faire un
jLocale::get('module~codefichier.codechaine');
en lieu et place d'un simple
jLocale::get('codefichier.codechaine'); au sein de mon listener alors que celui-ci est "logiquement" placé dans le bon module. Ou alors il est exécuté dans l'environnement du déclencheur de l'évènement et c'est normal...
Mindiell
- 1