Fr Plugin072to078 » History » Version 41

yllen, 01/12/2011 10:32 AM

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 5 remi
h2. Database
16 5 remi
17 2 tsmr
h3. CleanDB
18 1 remi
19 2 tsmr
Le coeur a subi d'importantes modification au niveau base de données :
20 2 tsmr
21 2 tsmr
https://forge.indepnet.net/wiki/glpi/CleanDbStudy
22 2 tsmr
23 1 remi
24 41 yllen
h2. Règle de nommage des tables d'un plugin
25 41 yllen
26 40 yllen
*Nom de table d'un objet*
27 40 yllen
glpi_plugin_nomduplugin_objets (le nom de l'objet doit être au pluriel)
28 40 yllen
> ex: glpi_plugin_monplugin_profiles
29 40 yllen
30 40 yllen
*Nom de table d'un sous-objet*
31 40 yllen
glpi_plugin_nomduplugin_objetsousobjets (le nom de l'objet doit être au singulier et celui du sous-objet au pluriel)
32 40 yllen
> ex: glpi_plugin_monplugin_profiletypes
33 40 yllen
34 40 yllen
*Nom de table de 2 objets liés*
35 40 yllen
glpi_plugin_nomduplugin_objets1_objets2 (les noms des 2 objets liés doivent être au pluriel)
36 40 yllen
> ex: glpi_plugin_monplugin_profiles_entities
37 1 remi
38 1 remi
39 1 remi
40 41 yllen
41 41 yllen
42 41 yllen
h2. Modification des fonctions du coeur
43 41 yllen
44 41 yllen
h3. CommonDBTM
45 41 yllen
46 41 yllen
h4. showFormHeader
47 41 yllen
48 41 yllen
Nouvelle fonction (factorisation du code)
49 1 remi
<pre>
50 41 yllen
function showFormHeader ($options=array())
51 1 remi
</pre>
52 1 remi
53 1 remi
Nouveau fonctionnement :
54 41 yllen
* passage par défaut des form sur 2 colonnes
55 1 remi
* ouverture des <form, <div (tabsbody) et <table (tab_cadre_fixe)
56 41 yllen
* champs cachés : entities_id, _no_message_link, template_name et is_template 
57 1 remi
58 41 yllen
Conseil : à utiliser conjointement avec showFormButtons
59 2 tsmr
60 41 yllen
h4. showFormButtons
61 1 remi
62 1 remi
Nouvelle fonction (factorisation du code)
63 1 remi
64 1 remi
<pre>
65 41 yllen
function showFormButtons ($options=array())
66 1 remi
</pre>
67 1 remi
68 1 remi
Fonctionnement :
69 1 remi
* fermeture des <form, <div et <table
70 3 remi
* champs cachés : id
71 3 remi
72 41 yllen
h4. can / check
73 3 remi
74 3 remi
Nouveau prototype
75 3 remi
76 1 remi
<pre>
77 1 remi
function can($ID,$right,&$input=NULL)
78 3 remi
function check($ID,$right,&$input=NULL)
79 3 remi
</pre>
80 1 remi
81 1 remi
Le paramètre $input, uniquement requis lors d'un ajout, attend les valeurs à ajouter (souvent le $_POST) et pas uniquement l'entité cible.
82 1 remi
83 41 yllen
h4. cleanDBonPurge
84 1 remi
85 12 remi
Les méthodes fournies par le coeur (cleanRelationData/cleanRelationTable) nettoient les enregistrements liés des tables lors de la suppression d'un objet.
86 11 remi
* glpi_contracts_items (if registered in 'contract_types')
87 15 remi
* glpi_documents_items (doc_types)
88 14 remi
* glpi_infocoms (infocom_types)
89 41 yllen
* glpi_networkports et glpi_networkports_networkports (netport_types)
90 41 yllen
* glpi_reservationitems (reservation_types)
91 14 remi
* glpi_tickets (helpdesk_types)
92 14 remi
93 14 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 *registerPluginType*.
94 11 remi
95 41 yllen
96 41 yllen
97 41 yllen
98 41 yllen
h4. getSearchOptions
99 11 remi
100 21 remi
Cette nouvelle méthode doit retourner les options de recherche pour le type courant.
101 21 remi
102 8 tsmr
h2. Variables de session
103 2 tsmr
104 2 tsmr
<pre>
105 2 tsmr
$_SESSION["glpiview_ID"] remplacé par $_SESSION["glpiis_ids_visible"] 
106 2 tsmr
</pre>
107 1 remi
108 8 tsmr
h2. Utilisation Mbstring pour gérer UTF8
109 7 tsmr
110 6 tsmr
<pre>
111 1 remi
substr remplacé par utf8_substr
112 9 tsmr
</pre>
113 17 tsmr
<pre>
114 17 tsmr
utf8_decode remplacé par decodeFromUtf8
115 17 tsmr
</pre>
116 17 tsmr
<pre>
117 17 tsmr
utf8_encode remplacé par encodeFromUtf8
118 17 tsmr
</pre>
119 17 tsmr
<pre>
120 17 tsmr
strtolower remplacé par utf8_strtolower
121 17 tsmr
</pre>
122 17 tsmr
<pre>
123 17 tsmr
strtoupper remplacé par utf8_strtoupper
124 17 tsmr
</pre>
125 9 tsmr
126 9 tsmr
h2. Configuration
127 9 tsmr
128 9 tsmr
<pre>
129 9 tsmr
$CFG_GLPI["mailing"] remplacé par $CFG_GLPI["use_mailing"]
130 6 tsmr
</pre>
131 10 tsmr
132 18 remi
h2. Fonctions supprimées
133 1 remi
134 28 remi
Liste alphabétique :
135 28 remi
136 28 remi
|| *Ancienne fonction* || *Alternative* ||
137 28 remi
|| addDeviceDocument()        || DocumentItem->add() ||
138 28 remi
|| addDeviceContract()        || ContractItem->add() ||
139 28 remi
|| cleanCache(); || ||
140 28 remi
|| dropdownRequestType(...);   || dropdownValue('glpi_requesttypes', ...) ||
141 28 remi
|| getDocumentLink()           || Document->getDownloadLink() ||
142 28 remi
|| getRequestTypeName(...)     || getDropdownName('glpi_requesttypes',...) ||
143 29 remi
|| getContractSuppliers()      || Contract->getSuppliersNames()         || 
144 32 remi
|| registerPluginTypers()      || Plugin::registerClass()         || 
145 28 remi
|| showContractAssociated()    || Contract::showAssociated() ||
146 28 remi
|| showDocumentAssociated()    || Document::showAssociated() ||
147 31 remi
|| showInfocomForm()           || Infocom::showForItem() ||
148 28 remi
|| showSaveBookmarkButton(...) || Bookmark::showSaveButton(...) ||
149 33 walid
|| dropdownNoneReadWrite(...) || Profile::dropdownNoneReadWrite(...) ||
150 36 walid
|| getPlanningState(...) || TicketPlanning::getState(...) ||
151 36 walid
|| dropdownPlanningState(...) || TicketPlanning::dropdownState(...) ||
152 36 walid
|| dropdown(...) || CommoDropdown::dropdown(...) ||
153 36 walid
|| dropdownValue(...) || CommonDropdown::dropdownValue(...) ||
154 36 walid
|| dropdownNoValue(...) || CommonDropdown::dropdownNoValue(...) ||
155 36 walid
|| getDropdownName(...) || CommonDropdown::getDropdownName(...) ||
156 35 walid
157 27 remi
h2. Classes renommées
158 27 remi
159 27 remi
<pre>
160 27 remi
Enterprise => Supplier
161 27 remi
</pre>
162 18 remi
163 21 remi
h2. HOOK supprimés
164 21 remi
165 21 remi
* plugin_example_getAddSearchOption() : remplacé par la méthode getSearchOptions du type et le hook plugin_example_getAddSearchOptions
166 21 remi
167 21 remi
h2. HOOK ajoutés
168 21 remi
169 21 remi
* plugin_example_getAddSearchOptions($itemtype) retourne les options de recherche ajoutées par le plugin aux types existants
170 21 remi
171 38 ddurieux
h2. Hooks sur des actions de GLPI
172 38 ddurieux
173 38 ddurieux
Modification des hooks sur les actions de GLPI
174 38 ddurieux
On passe de 
175 38 ddurieux
<pre>
176 38 ddurieux
$PLUGIN_HOOKS['pre_item_add']['nomduplugin'] = 'plugin_pre_item_update_nomduplugin';
177 38 ddurieux
</pre>
178 38 ddurieux
179 38 ddurieux
à 
180 38 ddurieux
181 38 ddurieux
<pre>
182 38 ddurieux
$PLUGIN_HOOKS['pre_item_add']['nomduplugin'] = array('Computer' =>'plugin_pre_item_update_nomduplugin');
183 38 ddurieux
</pre>
184 12 remi
185 12 remi
h2. Tâche planifiée
186 12 remi
187 12 remi
Le hook *'cron'* n'est plus utilisé
188 12 remi
189 12 remi
Lors de l'installation un plugin peut enregistrer une tâche en utilisant
190 12 remi
<pre>
191 12 remi
   CronTask::Register('pluginame', 'taskname', DAY_TIMESTAMP, array('param'=>50));
192 12 remi
</pre>
193 12 remi
La suppression est automatiquement réalisée par le coeur lors de la désinstallation du plugin.
194 12 remi
195 12 remi
Il devrait ensuite fournir 1 fonction
196 12 remi
<pre>
197 12 remi
function plugin_example_cron_info($name)
198 12 remi
</pre>
199 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)
200 12 remi
201 12 remi
Et pour chaque tâche, une fonction d'exécution
202 12 remi
<pre>
203 12 remi
function plugin_example_cron_sample_run($task)
204 12 remi
</pre>
205 12 remi
L'objet $task permet d'enregistrer des évenements ($task->log) et des statistiques ($task->add/setVolume)
206 12 remi
Le code retour doit être : 0 (rien à faire), >0 (terminé) ou <0 (à continuer)