Projet

Général

Profil

Plugin » Historique » Version 14

Marc Leygnac, 21/01/2012 19:12

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 13 Marc Leygnac
* Chaque plugin contient un fichier de paramétrage *plugin.xml* utilisé lors de son "installation" et de sa "désisntallation".
9 1
10 13 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 complétée par une 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
			<item autorisation="A-P-C-S-sec-autre-E-R" titre="Utiliser" description="Déscription du script">index.php</item>
72
			<item autorisation="A" titre="Administrer" description="Administration du plugin">admin.php</item>
73
		</menu>
74
	</administration>
75
</gepinstall>
76
77
</pre>
78
79
80
h2. Structure d'un script PHP d'un plugin
81
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 13 Marc Leygnac
h2. Le fichier functions_....php
125 1
126 13 Marc Leygnac
Un plugin peut contenir un fichier *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 13 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.
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 13 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 alors une chaîne contenet 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 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 13 Marc Leygnac
h2. Plugins, page d'acceuil et barre de menu
183 10 Julien Jocal
184 13 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 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 13 Marc Leygnac
Sur la page d'accueil l'utilisateur trouve un cadre avec la déscription du plugin, puis pour chaque script son titre (support du lien) et sa déscription.
187 10 Julien Jocal
188 13 Marc Leygnac
Pour la barre de menu deux possibilités :
189
* 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 de 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 dont le survol à 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 de la souris fait apparaître la description du script.
191 10 Julien Jocal
192
193
h2. Des idées de plugins :
194
195 1
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
* Bien d'autres idées, laissez vous aller :)
201 14 Marc Leygnac
202
h2. Un exemple pour tout comprendre :