Fr Plugin072to078 » History » Version 53

« Previous - Version 53/67 (diff) - Next » - Current version
yllen, 01/21/2011 01:12 PM


Migration d'un plugin de GLPI 0.72 vers 0.78

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.
Pour mettre à jour un plugin en 0.78, plusieurs étapes sont nécessaires :

  • Modification des tables et champs utilisés
  • Modification des noms de fichiers
  • Insertion des fonctions dans les classes
  • Prise en charge des modifications de fonctions du cœur
  • Nouveaux hooks disponibles
  • Modification de la gestion des objets de type dropdown (listes déroulantes)

Database

CleanDB

Le coeur a subi d'importantes modification au niveau base de données :

https://forge.indepnet.net/wiki/glpi/CleanDbStudy

MODIFICATIONS A EFFECTUER DANS LES PLUGINS

Règle de nommage des tables d'un plugin

Nom de table d'un objet
glpi_plugin_nomduplugin_objets (le nom de l'objet doit être au pluriel)

ex: glpi_plugin_monplugin_profiles

Nom de table d'un sous-objet
glpi_plugin_nomduplugin_objetsousobjets (le nom de l'objet doit être au singulier et celui du sous-objet au pluriel)

ex: glpi_plugin_monplugin_profiletypes

Nom de table de 2 objets liés
glpi_plugin_nomduplugin_objets1_objets2 (les noms des 2 objets liés doivent être au pluriel)

ex: glpi_plugin_monplugin_profiles_entities

Règle de nommage des pages d'un plugin

A chaque table du plugin doit correspondre un fichier object.class (objet au singulier)

ex: table glpi_plugin_monplugin_profiles => fichier profile.class

Modification dans les fichiers .class

Règle de nommage des class d'un plugin : new PluginNomdemonpluginProfile(); (nom de la class au singulier)

La fonction __construct () listant uniquement le nom de la table et le type n'est plus nécessaire

Hook.php

function plugin_monplugin_get_headings

function plugin_monplugin_headings

Changement des paramètres d'appel de ces 2 fonctions ($type,$ID,$withtemplate => $item,$withtemplate)

function plugin_monplugin_get_headings($item,$withtemplate) {

   $type = get_class($item);
   if ($type == 'Profile') {

function plugin_monplugin_headings_actions

Changement des paramètres d'appel de la fonction ($type => $item)

setup.php

function plugin_monplugin_init

Ajout des noms de class du plugin dans les types généraux du coeur

    
registerPluginType('typedemonplugin', 'PLUGIN_MONPLUGIN_TYPE', 'PluginMonpluginObjet',
                      array('classname'              => 'PluginMonpluginObjet',
                            'tablename'              => 'glpi_plugin_appliances_appliances',
                            'searchpage'             => 'index.php',
                            ...

devient
Plugin::registerClass('PluginMonpluginProfile, array('classname' => 'PluginMonpluginObjet',
                                               ...

Modification des hooks sur les actions de GLPI

$PLUGIN_HOOKS['pre_item_add']['monplugin'] = 'plugin_pre_item_adde_monplugin';

devient
$PLUGIN_HOOKS['pre_item_add']['monplugin'] = array('Computer' =>'plugin_pre_item_update_monplugin');
 $PLUGIN_HOOKS['pre_item_delete']['monplugin'] = 'plugin_pre_item_monplugin_delete'; 

devient
 $PLUGIN_HOOKS['pre_item_purge']['monplugin'] = objet => function
ou
$PLUGIN_HOOKS['pre_item_purge']['monplugin'] = objet => array('Class', 'Méthode')); 

Chargement de l'environnement du plugin

 useplugin('monplugin',true);

devient
 Plugin::load('monplugin', true);

Méthodes obligatoires

candelete....

MODIFICATIONS DU COEUR IMPACTANT LES PLUGINS

CommonDBTM

showFormHeader

Nouveau prototype

function showFormHeader ($options=array())

Nouveau fonctionnement :
  • passage par défaut des form sur 2 colonnes
  • ouverture des <form, <div (tabsbody) et <table (tab_cadre_fixe)
  • champs cachés : entities_id, _no_message_link, template_name et is_template

Conseil : à utiliser conjointement avec showFormButtons

showFormButtons

Nouvelle fonction (factorisation du code)

function showFormButtons ($options=array())
Fonctionnement :
  • fermeture des <form, <div et <table
  • champs cachés : id

can / check

Nouveau prototype

function can($ID,$right,&$input=NULL)
function check($ID,$right,&$input=NULL)

Le paramètre $input, uniquement requis lors d'un ajout, attend les valeurs à ajouter (souvent le $_POST) et pas uniquement l'entité cible.

cleanDBonPurge

Les méthodes fournies par le coeur (cleanRelationData/cleanRelationTable) nettoient les enregistrements liés des tables lors de la suppression d'un objet.
  • glpi_contracts_items (if registered in 'contract_types')
  • glpi_documents_items (doc_types)
  • glpi_infocoms (infocom_types)
  • glpi_networkports et glpi_networkports_networkports (netport_types)
  • glpi_reservationitems (reservation_types)
  • glpi_tickets (helpdesk_types)

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.

Changement du nom des types d'objet

A vérifier dans le define.php (PROFILE_TYPE => 'Profile', COMPUTER_TYPE => 'Computer',.....)

Dropdowns

L'appel des dropdowns à changer.
Vérifier dans le dropdown.class pour la nouvelle écriture
(ex : dropdownyesno => Dropdown::showYesNo)

A REVOIR

getSearchOptions

Cette nouvelle méthode doit retourner les options de recherche pour le type courant.

Variables de session

$_SESSION["glpiview_ID"] remplacé par $_SESSION["glpiis_ids_visible"] 

Utilisation Mbstring pour gérer UTF8

substr remplacé par utf8_substr

utf8_decode remplacé par decodeFromUtf8

utf8_encode remplacé par encodeFromUtf8

strtolower remplacé par utf8_strtolower

strtoupper remplacé par utf8_strtoupper

Configuration

$CFG_GLPI["mailing"] remplacé par $CFG_GLPI["use_mailing"]

Fonctions supprimées

Liste alphabétique :

Ancienne fonction Alternative
addDeviceDocument() DocumentItem->add()
addDeviceContract() ContractItem->add()
cleanCache();
dropdownRequestType(...); dropdownValue('glpi_requesttypes', ...)
getDocumentLink() Document->getDownloadLink()
getRequestTypeName(...) getDropdownName('glpi_requesttypes',...)
getContractSuppliers() Contract->getSuppliersNames()
registerPluginType() Plugin::registerClass()
showContractAssociated() Contract::showAssociated()
showDocumentAssociated() Document::showAssociated()
showInfocomForm() Infocom::showForItem()
showSaveBookmarkButton(...) Bookmark::showSaveButton(...)
dropdownNoneReadWrite(...) Profile::dropdownNoneReadWrite(...)
getPlanningState(...) TicketPlanning::getState(...)
dropdownPlanningState(...) TicketPlanning::dropdownState(...)
dropdown(...) CommoDropdown::dropdown(...)
dropdownValue(...) CommonDropdown::dropdownValue(...)
dropdownNoValue(...) CommonDropdown::dropdownNoValue(...)
getDropdownName(...) CommonDropdown::getDropdownName(...)

Classes renommées

Enterprise => Supplier

HOOK supprimés

  • plugin_example_getAddSearchOption() : remplacé par la méthode getSearchOptions du type et le hook plugin_example_getAddSearchOptions

HOOK ajoutés

  • plugin_example_getAddSearchOptions($itemtype) retourne les options de recherche ajoutées par le plugin aux types existants
  • 0.78.2 : plugin_example_searchOptionsValues($params = array()) permet de faire des recherche sur le moteur avec un drodpdown particulier (interne au plugin)
  • 0.78.2 : plugin_example_displayConfigItem($type,$ID,$data,$num) Permet de personnaliser le style du <td> dans la liste des objets

Tâche planifiée

Le hook 'cron' n'est plus utilisé

Lors de l'installation un plugin peut enregistrer une tâche en utilisant

   CronTask::Register('pluginame', 'taskname', DAY_TIMESTAMP, array('param'=>50));

La suppression est automatiquement réalisée par le coeur lors de la désinstallation du plugin.

Il devrait ensuite fournir 1 fonction

function plugin_example_cron_info($name)

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)

Et pour chaque tâche, une fonction d'exécution

function plugin_example_cron_sample_run($task)

L'objet $task permet d'enregistrer des évenements ($task->log) et des statistiques ($task->add/setVolume)
Le code retour doit être : 0 (rien à faire), >0 (terminé) ou <0 (à continuer)