Le fichier setup.php sert à définir :
  • le comportement général du plugin (fonctionnalités du coeur utilisées)
  • les fonctions dont le plugin a besoin afin de pouvoir être installé

Ce fichier doit contenir au minimum 4 fonctions :

plugin_init_<plugin_name>()
  • Déclaration du ou des types du plugin
  • Déclaration de l'affichage
  • Hook des actions effectuées sur les objets du coeur
  • Utilisation du cron
  • Utilisation du planning
  • Utilisation des actions massives (massiveactions)
  • Intégration avec le Helpdesk
  • Ajout de javascript et CSS personalisé
plugin_version_<plugin_name>()
  • Nom
  • Version
  • Auteur
  • Version minimale
  • Version maximale
plugin_<plugin_name>_check_prerequisites()
  • Vérification des prérequis pour installer le plugin
plugin_<plugin_name>_check_config()
  • Vérification d'une config de GLPI nécessaire à l'installation du plugin

Hooks sur des actions de GLPI

Un plugin peut se greffer sur chaque action réalisée dans GLPI pour effectuer ses propres traitements.
Pour cela on indique les noms des fonctions à exécuter à ce moment là.
  • Ajout d'un objet :
  • Avant l'insertion en base :
$PLUGIN_HOOKS['pre_item_add']['<plugin_name>'] = 'plugin_pre_item_add_<plugin_name>';
  • Après l'insertion en base :
$PLUGIN_HOOKS['item_add']['<plugin_name>'] = 'plugin_item_add_<plugin_name>';
  • Mise à jour d'un objet :
  • Avant la mise à jour en base :
$PLUGIN_HOOKS['pre_item_update']['<plugin_name>'] = 'plugin_pre_item_update_<plugin_name>';
  • Après la mise à jour en base :
$PLUGIN_HOOKS['item_update']['<plugin_name>'] = 'plugin_item_update_<plugin_name>';
  • Suppression d'un objet :
  • Avant l'action de suppression (physique ou mise à la corbeille) :
$PLUGIN_HOOKS['pre_item_delete']['<plugin_name>'] = 'plugin_pre_item_delete_<plugin_name>';
  • Après l'action de suppression (physique ou mise à la corbeille) :
$PLUGIN_HOOKS['item_delete']['<plugin_name>'] = 'plugin_item_delete_<plugin_name>';
  • Purge d'un objet :
  • Avant la suppression de l'objet de la base :
$PLUGIN_HOOKS['pre_item_purge']['<plugin_name>'] = 'plugin_pre_item_purge_<plugin_name>';
  • Après la suppression de l'objet en base :
$PLUGIN_HOOKS['item_purge']['<plugin_name>'] = 'plugin_item_purge_<plugin_name>';
  • Restauration d'un objet :
  • Avant la restauration de l'objet :
$PLUGIN_HOOKS['pre_item_restore']['<plugin_name>'] = 'plugin_pre_item_restore_<plugin_name>';
  • Après la restauration de l'objet :
$PLUGIN_HOOKS['item_restore']['<plugin_name>'] = 'plugin_item_restore_<plugin_name>';

Hooks sur l'authentification LDAP

  • Effectuer des opérations supplémentaires afin de déclarer un utilisateur authentifié ou pas :
$PLUGIN_HOOKS['restrict_ldap_auth']['<plugin_name>'] = 'plugin_authentication_restrict_ldap_auth_<votre plugin>';
  • Effectuer des opérations supplémentaires afin de déclarer un utilisateur authentifié ou pas :
$PLUGIN_HOOKS['retrieve_more_data_from_ldap']['<plugin_name>'] = 'plugin_retrieve_more_data_from_ldap_<votre plugin>';

Intégration visuelle

  • Indique si le plugin doit être affiché dans la liste des plugins du menu de l'interface "Helpdesk" :
$PLUGIN_HOOKS['helpdesk_menu_entry']['<plugin_name>'] = true;
  • Indique si le plugin doit être affiché dans la liste des plugins du menu de l'interface "Centre de contrôle" :
$PLUGIN_HOOKS['menu_entry']['<plugin_name>'] = true;

Le menu plugins renvoie vers la racine du plugins, donc vers le fichier index.php.

  • Définit si nécessaire les sous-menus pour l'interface "Centre de contrôle" :
$PLUGIN_HOOKS['submenu_entry']['<plugin_name>'][ACTION] = LINK;
  • ACTION définit l'élément affiché dans le sous-menu. Des actions par défaut sont définies dans GLPI (add, search, template, showall et summary).

Pour ces actions des icônes standard seront utilisées. Mais vous pouvez aussi choisir d'afficher un texte ou une icône personnelle (cf. plugin example).

ou :

  • Définit si nécessaire les sous-menus pour l'interface "Centre de contrôle" :
$PLUGIN_HOOKS['submenu_entry']['<plugin_name>'][ACTION][OPTION] = LINK;

Il est possible d'afficher un lien personnalisé en fonction du paramètre OPTION. Cela permet de pouvoir changer le lien en fonction de la sous rubrique dans laquelle on se trouve.

  • Page de l'arborescence du plugin apparaissant dans Configuration / Plugins :
$PLUGIN_HOOKS['config_page']['<plugin_name>'] = 'config.php';
  • Fonction définissant les actions réalisées par les onglets des différents types de GLPI. Elle renvoie un tableau contenant le liste des fonctions correspondantes aux actions renvoyées par la fonction plugin_get_headings_<plugin_name> :
$PLUGIN_HOOKS['headings_action']['<plugin_name>'] = 'plugin_headings_actions_<plugin_name>';
  • Fonction définissant les entrées dans les onglets des différents types de GLPI :
$PLUGIN_HOOKS['headings']['<plugin_name>'] = 'plugin_get_headings_<plugin_name>';

0.72 : 2 types supplémentaires peuvent être utilisés : central et prefs pour l'affichage sur la page d'accueil de l'interface "Centre de contrôle" et des préférences utilisateurs.
La liste complète des types est disponible dans le fichier config/define.php de GLPI.

  • Fonction définissant les actions réalisées par les onglets des différents types de GLPI. Elle renvoie un tableau contenant le liste des fonctions correspondantes aux actions renvoyées par la fonction plugin_get_headings_<plugin_name> :
$PLUGIN_HOOKS['headings_action']['<plugin_name>'] = 'plugin_headings_actions_<plugin_name>';

Helpdesk

Il est possible de rendre un objet visible dans le Helpdesk (c'est à dire de pouvoir déclarer un incident sur celui-ci).

  • permet de rendre au moins un type du plugin accessible depuis le Helpdesk. La définition des objets qui sont disponibles se fait dans la fonction plugin_<plugin_name>_assignToTicket dans le fichier hook.php :
$PLUGIN_HOOKS['assign_to_ticket']['<plugin_name>']=1;

Pour qu'un objet soit visible dans la liste "Mes matériels" il faut :

  • que l'option linkuser_types soit à true dans registerNewType et qu'un champs FK_users existe dans la table de l'objet

et/ou

  • que l'option linkgroup_types soit à true dans registerNewType et qu'un champs FK_groups existe dans la table de l'objet

Planning

Deux fonctions peuvent être définies et permettent de peupler le planning qui sera affiché et de définir comment les éléments seront affichés :

  • Ajouter des évènements au planning :
$PLUGIN_HOOKS['planning_populate']['<plugin_name>']="plugin_planning_populate_<plugin_name>";
  • Gère l'affichage d'un évènement dans le planning :
$PLUGIN_HOOKS['display_planning']['<plugin_name>']="plugin_display_planning_<plugin_name>";

Cron

Vous pouvez ajouter une tache planifiée par plugin au cron interne de GLPI.
Pour cela il suffit de définir :

$PLUGIN_HOOKS['cron']['<plugin_name>'] = DAY_TIMESTAMP;

Cette directive lancera dans hook.php la fonction {{{cron_plugin_<plugin_name>}}} de manière régulière en tache de fond (ici tous les jours).

Exemple : toutes les 30 minutes :

$PLUGIN_HOOKS['cron']['<plugin_name>'] = 30*60

ou
$PLUGIN_HOOKS['cron']['<plugin_name>'] = 30*MINUTE_TIMESTAMP

ou
$PLUGIN_HOOKS['cron']['<plugin_name>'] = HOUR_TIMESTAMP/2;

Redirection

L'appel à la page de connexion permet une redirection automatique (par exemple pour une accès lors de l'envoi d'un lien par mail).
Vous pouvez effectuer une redirection automatique vers une page de votre plugin en définissant :

$PLUGIN_HOOKS['redirect_page']['<plugin_name>']="PAGE_TO_REDIRECT.php";

l'appel à index.php?redirect=plugin_<plugin_name>_IDTOREDIRECT redirigera vers plugins/PLUGINNAME/PAGE_TO_REDIRECT.php?ID=IDTOREDIRECT

Gestion des array_push

  • Pour un dropdown arborescent il vous faut spécifier que la table est de ce type :
array_push($CFG_GLPI["dropdowntree_tables"],"glpi_dropdown_plugin_<plugin_name>");
  • Si c'est un dropdown séparé pour chaque entité :
array_push($CFG_GLPI["specif_entities_tables"],"glpi_dropdown_plugin_<plugin_name>");

Définition d'un nouveau type d'objet

  • Pour cela vous pouvez utiliser la fonction registerPluginType (qui remplace pluginNewType) :
registerPluginType('example',    // Nom du plugin
    'PLUGIN_EXAMPLE_TYPE',    // Chaine définissant le type
    1001,            // numéro du type
    array(            // Attributs
        'classname'  => 'pluginExample',    // Nom de la classe
        'tablename'  => 'glpi_plugin_example',    // Nom de la table
        'formpage'   => 'example.form.php',    // Formulaire de saisie
        'searchpage' => 'example.php',        // Forumlaire de recherche
        'typename'   => 'Example',        // Nom du type
        'deleted_tables' => false,        // gestion des "deleted" 
        'template_tables' => false,        // destion des "is_template" 
        'specif_entities_tables' => false,    // objet défni dans une entité
        'recursive_type' => false,        // Objet récursif
        'reservation_type' => false,        // Gestion des reservations
                'linkuser_types' => true,               // Permet à l'objet d'êtee visible dans le menu "Mes matériels" comme objet attaché à un utilisateur (droit "Liaison avec les matériels pour la création de tickets" 
                'linkgroup_types' => true,               // Permet à l'objet d'êtee visible dans le menu "Mes matériels" comme objet attaché à un utilisateur (droit "Voir les matériels des groupe(s) associé(s)")
                'massiveaction_noupdate' => true,        //Ne propose pas pour ce type de menu "Modifier" dans les modifications massives
                'massiveaction_nodelete' => true,        //Ne propose pas pour ce type de menu "Supprimer" dans les modifications massives
                'doc_types' => true,        //A partir de 0.72.1 : liaison avec les documents
                'helpdesk_visible_types' => true        //A partir de 0.72.1 : règler la visibilité d'un objet dans le helpdesk
    ));

Les attributs vides (ou faux) peuvent être omis.

Les numéros des types de plugins sont réservables par tranche de 100 ici : PluginTypesReservation. Ils démarrent à partir de 1000.

Définir des actions de modification massive

Par défaut les actions de type : modifier / supprimer / purger / restaurer sont accessibles depuis les listes.

  • Pour ajouter des actions spécifiques il faut tout d'abord ajouter :
$PLUGIN_HOOKS['use_massive_action']['<plugin_name>']=1;