Fr Plugin072to078 » History » Version 42

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