Fr Plugin072to078 » History » Version 44

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