Fr Plugin072to078 » History » Version 53

yllen, 01/21/2011 01:12 PM

1 37 tsmr
h1. Migration d'un plugin de GLPI 0.72 vers 0.78
2 1 remi
3 4 remi
{{toc}}
4 4 remi
5 39 tsmr
Entre la version 0.72 et la version 0.78 de GLPI de nombreux changements ont été implémentés, autant sur la base de données que sur la structure des fichiers. L'utilisation de l'auto-chargement de classes simplifie grandement le codage de plugins.
6 39 tsmr
Pour mettre à jour un plugin en 0.78, plusieurs étapes sont nécessaires :
7 39 tsmr
8 39 tsmr
 * Modification des tables et champs utilisés
9 39 tsmr
 * Modification des noms de fichiers
10 39 tsmr
 * Insertion des fonctions dans les classes
11 39 tsmr
 * Prise en charge des modifications de fonctions du cœur
12 39 tsmr
 * Nouveaux hooks disponibles
13 39 tsmr
 * Modification de la gestion des objets de type dropdown (listes déroulantes)
14 1 remi
15 42 yllen
16 5 remi
h2. Database
17 5 remi
18 2 tsmr
h3. CleanDB
19 1 remi
20 2 tsmr
Le coeur a subi d'importantes modification au niveau base de données :
21 2 tsmr
22 2 tsmr
https://forge.indepnet.net/wiki/glpi/CleanDbStudy
23 2 tsmr
24 41 yllen
25 40 yllen
26 43 yllen
27 43 yllen
28 43 yllen
h1. MODIFICATIONS A EFFECTUER DANS LES PLUGINS
29 43 yllen
30 43 yllen
31 43 yllen
h2. Règle de nommage des tables d'un plugin
32 43 yllen
33 43 yllen
*Nom de table d'un objet*
34 43 yllen
glpi_plugin_nomduplugin_objets (le nom de l'objet doit être au pluriel)
35 43 yllen
> ex: glpi_plugin_monplugin_profiles
36 43 yllen
37 43 yllen
*Nom de table d'un sous-objet*
38 43 yllen
glpi_plugin_nomduplugin_objetsousobjets (le nom de l'objet doit être au singulier et celui du sous-objet au pluriel)
39 43 yllen
> ex: glpi_plugin_monplugin_profiletypes
40 43 yllen
41 43 yllen
*Nom de table de 2 objets liés*
42 43 yllen
glpi_plugin_nomduplugin_objets1_objets2 (les noms des 2 objets liés doivent être au pluriel)
43 43 yllen
> ex: glpi_plugin_monplugin_profiles_entities
44 43 yllen
45 43 yllen
46 45 yllen
h2. Règle de nommage des pages d'un plugin
47 43 yllen
48 45 yllen
A chaque table du plugin doit correspondre un fichier  object.class (objet au singulier)
49 45 yllen
> ex: table glpi_plugin_monplugin_profiles  => fichier profile.class
50 43 yllen
51 45 yllen
52 52 yllen
h2. Modification dans les fichiers .class
53 52 yllen
54 52 yllen
Règle de nommage des class d'un plugin : new PluginNomdemonpluginProfile(); (nom de la class au singulier)
55 52 yllen
56 52 yllen
La fonction __construct () listant uniquement le nom de la table et le type n'est plus nécessaire
57 52 yllen
58 52 yllen
59 52 yllen
60 52 yllen
61 45 yllen
h2. Hook.php
62 45 yllen
63 45 yllen
h3. function plugin_monplugin_get_headings
64 45 yllen
65 45 yllen
h3. function plugin_monplugin_headings
66 45 yllen
67 45 yllen
68 45 yllen
Changement des paramètres d'appel de ces 2 fonctions ($type,$ID,$withtemplate => $item,$withtemplate)
69 45 yllen
<pre>
70 45 yllen
function plugin_monplugin_get_headings($item,$withtemplate) {
71 45 yllen
72 45 yllen
   $type = get_class($item);
73 45 yllen
   if ($type == 'Profile') {
74 45 yllen
</pre>
75 45 yllen
76 45 yllen
77 45 yllen
h3. function plugin_monplugin_headings_actions
78 45 yllen
79 45 yllen
Changement des paramètres d'appel de la fonction ($type => $item)
80 45 yllen
81 45 yllen
82 45 yllen
83 45 yllen
h2. setup.php
84 45 yllen
85 45 yllen
h3. function plugin_monplugin_init
86 45 yllen
87 45 yllen
Ajout des noms de class du plugin dans les types généraux du coeur
88 45 yllen
89 45 yllen
<pre>    
90 45 yllen
registerPluginType('typedemonplugin', 'PLUGIN_MONPLUGIN_TYPE', 'PluginMonpluginObjet',
91 45 yllen
                      array('classname'              => 'PluginMonpluginObjet',
92 45 yllen
                            'tablename'              => 'glpi_plugin_appliances_appliances',
93 45 yllen
                            'searchpage'             => 'index.php',
94 45 yllen
                            ...
95 45 yllen
</pre>
96 45 yllen
devient
97 45 yllen
<pre>
98 45 yllen
Plugin::registerClass('PluginMonpluginProfile, array('classname' => 'PluginMonpluginObjet',
99 45 yllen
                                               ...
100 45 yllen
101 45 yllen
</pre>
102 1 remi
103 1 remi
Modification des hooks sur les actions de GLPI
104 52 yllen
105 45 yllen
<pre>
106 45 yllen
$PLUGIN_HOOKS['pre_item_add']['monplugin'] = 'plugin_pre_item_adde_monplugin';
107 1 remi
</pre>
108 52 yllen
devient
109 45 yllen
<pre>
110 45 yllen
$PLUGIN_HOOKS['pre_item_add']['monplugin'] = array('Computer' =>'plugin_pre_item_update_monplugin');
111 45 yllen
</pre>
112 45 yllen
113 52 yllen
 
114 50 yllen
<pre> $PLUGIN_HOOKS['pre_item_delete']['monplugin'] = 'plugin_pre_item_monplugin_delete'; </pre>
115 52 yllen
devient
116 50 yllen
<pre> $PLUGIN_HOOKS['pre_item_purge']['monplugin'] = objet => function
117 50 yllen
ou
118 45 yllen
$PLUGIN_HOOKS['pre_item_purge']['monplugin'] = objet => array('Class', 'Méthode')); </pre>
119 45 yllen
120 1 remi
121 51 yllen
h2. Chargement de l'environnement du plugin
122 45 yllen
123 51 yllen
<pre> useplugin('monplugin',true);</pre>
124 52 yllen
devient
125 51 yllen
<pre> Plugin::load('monplugin', true);</pre>
126 51 yllen
127 51 yllen
128 51 yllen
h2. Méthodes obligatoires
129 52 yllen
130 51 yllen
candelete....
131 45 yllen
132 45 yllen
133 45 yllen
134 45 yllen
135 40 yllen
h1. MODIFICATIONS DU COEUR IMPACTANT LES PLUGINS
136 42 yllen
137 41 yllen
h2. CommonDBTM
138 42 yllen
139 41 yllen
h3. showFormHeader
140 1 remi
141 45 yllen
Nouveau prototype
142 41 yllen
<pre>
143 1 remi
function showFormHeader ($options=array())
144 41 yllen
</pre>
145 1 remi
146 1 remi
Nouveau fonctionnement :
147 1 remi
* passage par défaut des form sur 2 colonnes
148 1 remi
* ouverture des <form, <div (tabsbody) et <table (tab_cadre_fixe)
149 1 remi
* champs cachés : entities_id, _no_message_link, template_name et is_template 
150 41 yllen
151 1 remi
Conseil : à utiliser conjointement avec showFormButtons
152 41 yllen
153 42 yllen
h3. showFormButtons
154 41 yllen
155 1 remi
Nouvelle fonction (factorisation du code)
156 1 remi
157 1 remi
<pre>
158 1 remi
function showFormButtons ($options=array())
159 1 remi
</pre>
160 1 remi
161 1 remi
Fonctionnement :
162 1 remi
* fermeture des <form, <div et <table
163 1 remi
* champs cachés : id
164 3 remi
165 42 yllen
h3. can / check
166 1 remi
167 1 remi
Nouveau prototype
168 1 remi
169 1 remi
<pre>
170 42 yllen
function can($ID,$right,&$input=NULL)
171 42 yllen
function check($ID,$right,&$input=NULL)
172 42 yllen
</pre>
173 42 yllen
174 42 yllen
Le paramètre $input, uniquement requis lors d'un ajout, attend les valeurs à ajouter (souvent le $_POST) et pas uniquement l'entité cible.
175 42 yllen
176 42 yllen
h3. cleanDBonPurge
177 42 yllen
178 42 yllen
Les méthodes fournies par le coeur (cleanRelationData/cleanRelationTable) nettoient les enregistrements liés des tables lors de la suppression d'un objet.
179 1 remi
* glpi_contracts_items (if registered in 'contract_types')
180 42 yllen
* glpi_documents_items (doc_types)
181 42 yllen
* glpi_infocoms (infocom_types)
182 42 yllen
* glpi_networkports et glpi_networkports_networkports (netport_types)
183 42 yllen
* glpi_reservationitems (reservation_types)
184 1 remi
* glpi_tickets (helpdesk_types)
185 1 remi
186 1 remi
Il n'est donc plus utile de le prévoir dans la méthode *cleanDBonPurge* du type, mais de s'assurer de l'enrichissement des tableaux lors du *Plugin::registerClass*.
187 42 yllen
188 42 yllen
189 52 yllen
h3. Changement du nom des types d'objet
190 42 yllen
191 42 yllen
A vérifier dans le define.php (PROFILE_TYPE => 'Profile', COMPUTER_TYPE => 'Computer',.....)
192 44 yllen
193 44 yllen
194 52 yllen
h3. Dropdowns
195 52 yllen
196 53 yllen
L'appel des dropdowns à changer. 
197 53 yllen
Vérifier dans le dropdown.class pour la nouvelle écriture
198 53 yllen
(ex : dropdownyesno => Dropdown::showYesNo) 
199 42 yllen
200 42 yllen
201 42 yllen
202 42 yllen
203 42 yllen
h1. A REVOIR
204 41 yllen
205 41 yllen
h4. getSearchOptions
206 11 remi
207 21 remi
Cette nouvelle méthode doit retourner les options de recherche pour le type courant.
208 17 tsmr
209 17 tsmr
h2. Variables de session
210 17 tsmr
211 17 tsmr
<pre>
212 17 tsmr
$_SESSION["glpiview_ID"] remplacé par $_SESSION["glpiis_ids_visible"] 
213 17 tsmr
</pre>
214 17 tsmr
215 17 tsmr
h2. Utilisation Mbstring pour gérer UTF8
216 17 tsmr
217 17 tsmr
<pre>
218 17 tsmr
substr remplacé par utf8_substr
219 17 tsmr
</pre>
220 9 tsmr
<pre>
221 9 tsmr
utf8_decode remplacé par decodeFromUtf8
222 9 tsmr
</pre>
223 9 tsmr
<pre>
224 9 tsmr
utf8_encode remplacé par encodeFromUtf8
225 6 tsmr
</pre>
226 10 tsmr
<pre>
227 18 remi
strtolower remplacé par utf8_strtolower
228 1 remi
</pre>
229 28 remi
<pre>
230 28 remi
strtoupper remplacé par utf8_strtoupper
231 28 remi
</pre>
232 28 remi
233 28 remi
h2. Configuration
234 28 remi
235 28 remi
<pre>
236 28 remi
$CFG_GLPI["mailing"] remplacé par $CFG_GLPI["use_mailing"]
237 28 remi
</pre>
238 29 remi
239 32 remi
h2. Fonctions supprimées
240 28 remi
241 28 remi
Liste alphabétique :
242 31 remi
243 28 remi
|| *Ancienne fonction* || *Alternative* ||
244 33 walid
|| addDeviceDocument()        || DocumentItem->add() ||
245 36 walid
|| addDeviceContract()        || ContractItem->add() ||
246 36 walid
|| cleanCache(); || ||
247 36 walid
|| dropdownRequestType(...);   || dropdownValue('glpi_requesttypes', ...) ||
248 36 walid
|| getDocumentLink()           || Document->getDownloadLink() ||
249 36 walid
|| getRequestTypeName(...)     || getDropdownName('glpi_requesttypes',...) ||
250 36 walid
|| getContractSuppliers()      || Contract->getSuppliersNames()         || 
251 48 tsmr
|| registerPluginType()      || Plugin::registerClass()         || 
252 27 remi
|| showContractAssociated()    || Contract::showAssociated() ||
253 27 remi
|| showDocumentAssociated()    || Document::showAssociated() ||
254 27 remi
|| showInfocomForm()           || Infocom::showForItem() ||
255 27 remi
|| showSaveBookmarkButton(...) || Bookmark::showSaveButton(...) ||
256 27 remi
|| dropdownNoneReadWrite(...) || Profile::dropdownNoneReadWrite(...) ||
257 18 remi
|| getPlanningState(...) || TicketPlanning::getState(...) ||
258 21 remi
|| dropdownPlanningState(...) || TicketPlanning::dropdownState(...) ||
259 21 remi
|| dropdown(...) || CommoDropdown::dropdown(...) ||
260 21 remi
|| dropdownValue(...) || CommonDropdown::dropdownValue(...) ||
261 21 remi
|| dropdownNoValue(...) || CommonDropdown::dropdownNoValue(...) ||
262 21 remi
|| getDropdownName(...) || CommonDropdown::getDropdownName(...) ||
263 21 remi
264 21 remi
h2. Classes renommées
265 21 remi
266 38 ddurieux
<pre>
267 38 ddurieux
Enterprise => Supplier
268 38 ddurieux
</pre>
269 38 ddurieux
270 38 ddurieux
h2. HOOK supprimés
271 38 ddurieux
272 38 ddurieux
* plugin_example_getAddSearchOption() : remplacé par la méthode getSearchOptions du type et le hook plugin_example_getAddSearchOptions
273 38 ddurieux
274 38 ddurieux
h2. HOOK ajoutés
275 38 ddurieux
276 38 ddurieux
* plugin_example_getAddSearchOptions($itemtype) retourne les options de recherche ajoutées par le plugin aux types existants
277 47 tsmr
* 0.78.2 : plugin_example_searchOptionsValues($params = array()) permet de faire des recherche sur le moteur avec un drodpdown particulier (interne au plugin)
278 47 tsmr
* 0.78.2 : plugin_example_displayConfigItem($type,$ID,$data,$num) Permet de personnaliser le style du <td> dans la liste des objets
279 38 ddurieux
280 12 remi
281 12 remi
h2. Tâche planifiée
282 12 remi
283 12 remi
Le hook *'cron'* n'est plus utilisé
284 12 remi
285 12 remi
Lors de l'installation un plugin peut enregistrer une tâche en utilisant
286 12 remi
<pre>
287 12 remi
   CronTask::Register('pluginame', 'taskname', DAY_TIMESTAMP, array('param'=>50));
288 12 remi
</pre>
289 12 remi
La suppression est automatiquement réalisée par le coeur lors de la désinstallation du plugin.
290 12 remi
291 12 remi
Il devrait ensuite fournir 1 fonction
292 12 remi
<pre>
293 12 remi
function plugin_example_cron_info($name)
294 12 remi
</pre>
295 12 remi
Qui retourne un tableau à 2 entrées pour la tâche $name comprenant 'description' (description localisée de la tâche) et 'parameter' (optionnel, description localisée du paramètre)
296 12 remi
297 12 remi
Et pour chaque tâche, une fonction d'exécution
298 12 remi
<pre>
299 12 remi
function plugin_example_cron_sample_run($task)
300 12 remi
</pre>
301 12 remi
L'objet $task permet d'enregistrer des évenements ($task->log) et des statistiques ($task->add/setVolume)
302 12 remi
Le code retour doit être : 0 (rien à faire), >0 (terminé) ou <0 (à continuer)