Plugin » Historique » Version 15
Marc Leygnac, 22/01/2012 11:51
1 | 13 | Marc Leygnac | h1. Coder un plugin pour GEPI |
---|---|---|---|
2 | 1 | ||
3 | 10 | Julien Jocal | |
4 | 13 | Marc Leygnac | * Chaque plugin est stocké dans un sous-dossier du dossier *mod_plugins* de GEPI. Le nom du dossier du plugin, défini dans le fichier *plugin.xml*, ne comporte ni point ni accent, et les espaces sont remplacés par des tirets bas "_". |
5 | 1 | ||
6 | 13 | Marc Leygnac | * La mise en fonction d'un plugin consiste à copier son dossier dans le dossier *mod_plugins*, puis en mode administrateur (Gestion des modules/Gérer les plugins) à "installer" et à "ouvrir" le plugin (un plugin peut être "installé" sans nécessairement être ouvert). |
7 | 1 | ||
8 | 15 | Marc Leygnac | * Chaque plugin contient un fichier de paramétrage *plugin.xml* utilisé lors de son "installation" et de sa "désinstallation". |
9 | 1 | ||
10 | 15 | Marc Leygnac | * La gestion des droits est assurée par une méthode verifDroits() (propre au module Plugins) qui consulte la table *plugins_autorisations*, et éventuellement cette gestion est complétée par la fonction *calcul_autorisation_...()*. |
11 | 10 | Julien Jocal | |
12 | 13 | Marc Leygnac | * Les tables de la base GEPI utilisées par le module Plugins sont *plugins* (liste des plugins présents), *plugins_menus* (page d'accueil et barre de menu) et *plugins_autorisations*. |
13 | 1 | ||
14 | 13 | Marc Leygnac | * Un plugin ne doit pas modifier la structure des tables GEPI, et doit, lors de sa désinstallation, replacer GEPI (tables et fichiers) dans l'état où il se trouvait lors de son installation. |
15 | 1 | ||
16 | 13 | Marc Leygnac | h2. Structure et contenu du fichier *plugin.xml* |
17 | 1 | ||
18 | 13 | Marc Leygnac | Ce fichier, obligatoirement encodé en UTF-8 (sauf s'il ne comporte que des caractères ASCII 7 bits), est lu lors de l'installation ou de la désinstallation du plugin (Gestion des modules/Gérer les plugins). |
19 | 1 | ||
20 | <pre> |
||
21 | 13 | Marc Leygnac | |
22 | <?xml version="1.0" encoding="UTF-8"?> |
||
23 | |||
24 | <gepinstall type="plugin"> |
||
25 | <!-- nom du dossier contenant les fichiers du plugin --> |
||
26 | <nom>plugin_example</nom> |
||
27 | <creationDate>02 2012</creationDate> |
||
28 | <auteur>A. Turing</auteur> |
||
29 | <licence>GNU/GPL</licence> |
||
30 | <auteurCourriel>at@gepi.com</auteurCourriel> |
||
31 | <auteurSite>www.at.fr</auteurSite> |
||
32 | <version>1.0</version> |
||
33 | <versiongepi>1.5.5</versiongepi> |
||
34 | <description>Plugin example</description> |
||
35 | <installation> |
||
36 | <!-- requêtes SQL exécutées à l'installation du plugin --> |
||
37 | <requetes> |
||
38 | <requete> |
||
39 | CREATE TABLE IF NOT EXISTS `plugin_example` ( |
||
40 | `id_plugin_example` int(11) NOT NULL AUTO_INCREMENT, |
||
41 | `login` varchar(50) NOT NULL, |
||
42 | `nom` varchar(50) NOT NULL, |
||
43 | `prenom` varchar(50) NOT NULL, |
||
44 | PRIMARY KEY (`id_plugin_example`), |
||
45 | UNIQUE KEY `login` (`login`) |
||
46 | ) ENGINE=MyISAM ; |
||
47 | </requete> |
||
48 | </requetes> |
||
49 | </installation> |
||
50 | <desinstallation> |
||
51 | <!-- requêtes SQL exécutées à la désinstallation du plugin --> |
||
52 | <requetes> |
||
53 | <requete> |
||
54 | DROP TABLE `plugin_example`; |
||
55 | </requete> |
||
56 | </requetes> |
||
57 | </desinstallation> |
||
58 | <administration> |
||
59 | <fichier> |
||
60 | <!-- les autorisations qui suivent, portant sur le satut de l'utilisateur, peuvent être |
||
61 | confirmées/affinées dans la fonction calcul_autorisation_plugin_example() du fichier |
||
62 | functions_plugin_example.php --> |
||
63 | <nomfichier autorisation="A-P-C-S-sec-autre-E-R">index.php</nomfichier> |
||
64 | <nomfichier autorisation="A">admin.php</nomfichier> |
||
65 | <nomfichier autorisation="A">autre_script.php</nomfichier> |
||
66 | </fichier> |
||
67 | <menu> |
||
68 | <!-- liste des accès aux scripts du plugin apparaissant sur la page d'accueil et dans |
||
69 | la barre de menu, si la fonction calcul_autorisation_plugin_example() est définies ces |
||
70 | accès doivent y être confirmés et éventuellement affinés --> |
||
71 | 15 | Marc Leygnac | <item autorisation="A-P-C-S-sec-autre-E-R" titre="Utiliser" description="Description du script">index.php</item> |
72 | 13 | Marc Leygnac | <item autorisation="A" titre="Administrer" description="Administration du plugin">admin.php</item> |
73 | </menu> |
||
74 | </administration> |
||
75 | </gepinstall> |
||
76 | |||
77 | </pre> |
||
78 | |||
79 | |||
80 | 15 | Marc Leygnac | h2. Structure d'un script PHP de plugin |
81 | 13 | Marc Leygnac | |
82 | <pre> |
||
83 | |||
84 | <?php |
||
85 | 1 | $niveau_arbo = "2"; |
|
86 | 13 | Marc Leygnac | |
87 | // Fichiers d'initialisation |
||
88 | // (attention au chemin des fichiers en fonction de l'arborescence) |
||
89 | 1 | include("../../lib/initialisationsPropel.inc.php"); |
|
90 | 9 | include("../../lib/initialisations.inc.php"); |
|
91 | 1 | include("../plugins.class.php"); |
|
92 | |||
93 | // Resume session |
||
94 | $resultat_session = $session_gepi->security_check(); |
||
95 | if ($resultat_session == 'c') { |
||
96 | 13 | Marc Leygnac | header("Location: ../../utilisateurs/mon_compte.php?change_mdp=yes"); |
97 | 1 | die(); |
|
98 | } else if ($resultat_session == '0') { |
||
99 | 13 | Marc Leygnac | header("Location: ../../logout.php?auto=1"); |
100 | 1 | die(); |
|
101 | } |
||
102 | |||
103 | 13 | Marc Leygnac | // vérification des autorisations (définies dans plugin.xml) |
104 | $user_auth = new gepiPlugIn("plugin_example"); |
||
105 | 1 | $user_auth->verifDroits(); |
|
106 | 9 | ||
107 | 1 | ||
108 | 13 | Marc Leygnac | //**************** EN-TETE ***************** |
109 | $titre_page = "Titre de la page"; |
||
110 | require_once("../../lib/header.inc"); |
||
111 | //**************** FIN EN-TETE ************* |
||
112 | 1 | ||
113 | 13 | Marc Leygnac | ?> |
114 | 1 | ||
115 | 13 | Marc Leygnac | // code PHP du script |
116 | // ... |
||
117 | 1 | ||
118 | 13 | Marc Leygnac | <?php |
119 | include("../../lib/footer.inc.php"); |
||
120 | ?> |
||
121 | 1 | ||
122 | 13 | Marc Leygnac | </pre> |
123 | 1 | ||
124 | 15 | Marc Leygnac | h2. Le script functions_....php |
125 | 1 | ||
126 | 15 | Marc Leygnac | Un plugin peut contenir un script *functions_nom_du_plugin.php* (où 'nom_du_plugin' est le nom défini dans *plugin.xml*) dans lequel on peut définir les fonctions suivantes. |
127 | 1 | ||
128 | 13 | Marc Leygnac | h3. Fonction calcul_autorisation_...() |
129 | 1 | ||
130 | 15 | Marc Leygnac | Cette fonction, dont le nom doit être de la forme *calcul_autorisation_nom_du_plugin*, attend deux paramètres : un login utilisateur et le nom d'un script du plugin (avec ou non le chemin d'accès). En fonction du résultat qu'elle renvoie l'utilisateur connecté aura, sur sa page d'accueil et dans la barre de menu, accès ou non au script. Cette fonction ne prend pas en compte le chemin d'accès aux scripts, donc si le plugin contient des sous-dossiers il faut veiller à ce que les noms des scripts passés en paramètre soient distincts. |
131 | 1 | ||
132 | 13 | Marc Leygnac | Exemple : |
133 | 1 | ||
134 | 13 | Marc Leygnac | <pre> |
135 | 1 | ||
136 | 13 | Marc Leygnac | function calcul_autorisation_plugin_example($login,$chemin_script) |
137 | { |
||
138 | $script=basename($chemin_script); |
||
139 | switch ($script) |
||
140 | { |
||
141 | // Dès lors que la fonction calcul_autorisation_... est définie |
||
142 | // il faut y confirmer les autorisations définies dans plugin.xml |
||
143 | // (ou les affiner) pour les scripts devant être accessibles |
||
144 | // depuis la page d'accueil et depuis la barre de menu. |
||
145 | // Ici tous les utilisateurs ont accès à index.php |
||
146 | case "index.php": |
||
147 | return true; |
||
148 | break; |
||
149 | // Ici seul l'administrateur ayant installé le plugin peut l'administrer |
||
150 | case "admin.php": |
||
151 | return ($_SESSION['login']==getSettingValue("admin_plugin_example")); |
||
152 | break; |
||
153 | default: |
||
154 | return false; |
||
155 | } |
||
156 | } |
||
157 | 9 | ||
158 | 13 | Marc Leygnac | </pre> |
159 | 9 | ||
160 | 13 | Marc Leygnac | h3. Fonctions ante_installation...(), post_installation...(), ante_desinstallation...(), post_desinstallation...() |
161 | 9 | ||
162 | 15 | Marc Leygnac | Ces fonctions, quand elles sont définies, sont exécutées respectivement avant et après "installation", avant et après "désinstallation" du plugin. Elles doivent retourner un chaîne vide si leur exécution s'est correctement déroulée, ou une chaîne contenant un message d'erreur qui sera affiché au début de la page de gestion des plugins. Si une erreur se produit à l'exécution de ante_installation...() ou de ante_desinstallation...() alors il n'est pas procédé à l'installation ou la désinstallation du plugin. |
163 | 9 | ||
164 | 13 | Marc Leygnac | Exemple : |
165 | 1 | ||
166 | 13 | Marc Leygnac | <pre> |
167 | 1 | ||
168 | 13 | Marc Leygnac | function post_installation_plugin_example() |
169 | { |
||
170 | if (saveSetting("admin_plugin_example",$_SESSION['login'])) return ""; |
||
171 | else return "Impossible d'enregistrer dans la table 'setting'"; |
||
172 | } |
||
173 | 1 | ||
174 | 13 | Marc Leygnac | function post_desinstallation_plugin_example() |
175 | { |
||
176 | if (mysql_query("DELETE FROM `setting` WHERE `NAME`='admin_plugin_example'")) return ""; |
||
177 | else return "Impossible de supprimer dans la table 'setting' : ".mysql_error(); |
||
178 | } |
||
179 | 10 | Julien Jocal | |
180 | 13 | Marc Leygnac | </pre> |
181 | 10 | Julien Jocal | |
182 | 15 | Marc Leygnac | h2. Plugins, page d’accueil et barre de menu |
183 | 10 | Julien Jocal | |
184 | 15 | Marc Leygnac | Les utilisateurs ont accès au script d'un plugin, en fonction des autorisations définies dans le fichier *plugin.xml* et éventuellement dans la fonction *calcul_autorisation_...()*, par des liens sur la page d'accueil ou dans la barre de menu. Les intitulés de ces liens sont définis dans le fichier *plugin.xml* : description du plugin dans la section <description>, et pour chaque script titre et description dans la section <menu>. |
185 | 10 | Julien Jocal | |
186 | 15 | Marc Leygnac | Sur la page d'accueil l'utilisateur trouve un cadre avec la description du plugin, puis pour chaque script son titre (support du lien) et sa description. |
187 | 10 | Julien Jocal | |
188 | 13 | Marc Leygnac | Pour la barre de menu deux possibilités : |
189 | 15 | Marc Leygnac | * si l'utilisateur n'a accès qu'à un seul script alors dans le menu Plugins il trouve un lien dont l'intitulé est la description du plugin, et dont un survol par la souris fait apparaître la description du script ; |
190 | * si l'utilisateur a accès à plusieurs scripts alors de le menu Plugins il trouve une entrée dont l'intitulé est la description du plugin et dont le survol par la souris déroule un sous-menu. Ce sous-menu est composé des liens vers chaque script, liens dont l'intitulé est le titre du script et dont un survol par la souris fait apparaître la description du script. |
||
191 | 10 | Julien Jocal | |
192 | |||
193 | h2. Des idées de plugins : |
||
194 | |||
195 | 15 | Marc Leygnac | Ce n'est pas ce qui manque : |
196 | * la page blanche du PP pour chacun de ses élèves ; |
||
197 | * intégrer du code pour initialiser GEPI à partir d'un ENT (ou de toute autre source externe) ; |
||
198 | * un lieu de réunion pour chaque équipe éducative qui pourrait ainsi laisser des infos avant un conseil ou pour aider celui qui prépare le conseil de classe ; |
||
199 | * un tchat d'échange entre professeurs ; |
||
200 | * et bien d'autres idées, laissez vous aller :) |
||
201 | 14 | Marc Leygnac | |
202 | h2. Un exemple pour tout comprendre : |