You are not logged in.

Announcement

 Téléchargez la dernière version stable de GLPI      -     Et vous, que pouvez vous faire pour le projet GLPI ? :  Contribuer
 Download last stable version of GLPI                      -     What can you do for GLPI ? :  Contribute

#1 2007-08-24 14:10:16

Julio
Member
Registered: 2007-07-19
Posts: 6

[Crochet] Appel de methode d'instance et de methode de classe

Il s'agit d'un modification à apporter au fichier inc/plugin.function.php. Le but est de pouvoir utiliser des méthodes en tant que crochet. Pour cela, il faudrait utiliser les callbacks definis en php. L'avantage de cette version serait d'éviter de définir une fonction par méthode que l'on souhaite appeler en tant que crochet.

Voila ce que donnerait l'équivalent de la fonction doHook qui permettrait d'effectuer cette modification sans toucher aux appels existants:

function do_hook_callback($name){
    global $PLUGIN_HOOKS;
    $data = func_get_args();

    if (isset($PLUGIN_HOOKS[$name])
            && is_array($PLUGIN_HOOKS[$name])) {
        foreach ($PLUGIN_HOOKS[$name] as $callback) {
            if (is_callable($callback)) {
                call_user_func($callback,$data);
            }
        }
    }
    return $data;
}

Voici un petit exemple pour l'utilisation de cette fonction

function Mafonction($arg){
    echo "Affichage ".__FUNCTION__."<br>";
} 


class MaClasse{

    static function MethodeStatique($arg){
        echo "Affichage ".__METHOD__."<br>";
    }
    
    function Methode($arg){
        echo "Affichage ".__METHOD__."<br>";
    }
}

$maclasse = new MaClasse();

$PLUGIN_HOOKS["test"]["fonction"] = 'mafonction';
$PLUGIN_HOOKS["test"]["statique"] = array('MaClasse','MethodeStatique');
$PLUGIN_HOOKS["test"]["methode"] = array($maclasse,'Methode');

echo "TEST DO_HOOK_CALLBACK<br>";
do_hook_callback('test');

Est-ce que cette modification est susceptible de voir le jour?

Last edited by Julio (2007-08-24 14:11:40)

Offline

#2 2007-08-31 19:39:46

JMD
GLPI - Lead
Registered: 2004-09-13
Posts: 9,180
Website

Re: [Crochet] Appel de methode d'instance et de methode de classe

Bonjour,


Je vais faire le naïf,  mais je ne saisi pas l'avantage réel apporté par votre proposition.

Est-ce que vous pourriez être plus explicite dans vote argumentation sur les avantages procurées par votre proposition ?

Un exemple précis serait apprécié. Un cas d'utilisation.

Bonne soirée.


JMD / Jean-Mathieu Doléans - Glpi-project.org - Association Indepnet
Apportez votre pierre au  projet GLPI   : Soutenir

Offline

#3 2007-09-03 09:58:07

Julio
Member
Registered: 2007-07-19
Posts: 6

Re: [Crochet] Appel de methode d'instance et de methode de classe

La modification que je propose représente avant tout une simplification de l'écriture de certains appels de crochet. Dans mon cas, elle me permet de factoriser la pose des crochets dans une classe mère. Il me faut poser des crochets pour une méthode héritée d'une des fonctions de ma classe mère.  Avec le système actuel, il me faudrait, pour chaque classe fille, créer une fonction qui appelle cette méthode puis poser le crochet qui correspond a cette fonction. Avec la version que je propose, je peux créer la pose de crochet dans ma classe mère ce qui me permet de la factoriser.

Au niveau des possibilités offertes par ce mécanisme, on peut éventuellement paramètrer le comportement du crochet. Je ne vois pas encore d'exemples concrets où cela pourrait servir mais il s'agirait d'utiliser l'instance pour lequel le crochet est défini dans le traitement lui-même.  Par exemple, il pourrait s'agir de définir un crochet sur une classe de log et de modifier le fichier où sont loguer les crochets à l'execution.

En tant qu'exemple concret , je pense qu'il serait possible de refaire le système de nettoyage de table de la classe CommonDBTM de manière plus souple (je fais réference à la méthode cleanRelationData). Le but serait de laisser le controle à la classe fille des actions à effectuer pour le nettoyage. Il faudrait ainsi créer une méthode (par exemple cleanDB )qui récupére les arguments de l'appel du crochet item_delete, et effectue le nettoyage. La pose du crochet s'effectuerait  dans le constructeur sous la forme :

 $PLUGIN_HOOKS["item_delete"]["ma_table"] = array($this,"cleanDB");

Pou conclure, à mon avis, ma proposition pourrait apporter plus de souplesse dans la création des crochets en favorisant l'utilisation des possibilités de la programmation orienté objet.

Le but de ma demande était plus de savoir si je pouvais brancher mes crochets sur des actions de GLPI. Si cette proposition n'est pas retenue,  je trouverai toujours un moyen de cantoner les appels sur le plugin sur lequel je travaille (je pense qu'en posant ma fonction de crochetage en tant que crochet de celle existante, ca doit pouvoir fonctionner)

Last edited by Julio (2007-09-03 09:59:05)

Offline

#4 2007-09-03 10:00:14

tsmr
GLPI-DEV
From: Rennes
Registered: 2005-08-26
Posts: 11,632
Website

Re: [Crochet] Appel de methode d'instance et de methode de classe

Sur quel plugin travailles-tu ? sans indicretion ? tongue


Xavier Caillaud
Blog GLPI Infotel

Offline

#5 2007-09-03 10:20:06

Julio
Member
Registered: 2007-07-19
Posts: 6

Re: [Crochet] Appel de methode d'instance et de methode de classe

Je travaille sur le plugin compte.

La description du projet se trouve ici:
http://glpi-project.org/forum/viewtopic.php?id=7099

Offline

Board footer

Powered by FluxBB