Clean Plugin Hook System

Aim : Use convention instead of declaration

MoYo :

Non je n'étais pas du tout parti la dessus.
- pour uniformiser les noms de fonctions je prenais la convention : plugin_<nom_plugin>_<action> pour tout.
- je ne faisais pas de fonction pour activer des choses mais simplement des activations du genre :
- $PLUGIN_HOOKS['example']['use_menu'] = true; qui activait l'ajout de l'entrée dans le menu et appelait plugin_example_GetSubMenu() pour récupérer un sous-menu éventuel (si la fonction existait)
- $PLUGIN_HOOKS['example']['use_headings'] = true; qui activait le fait d'aller voir si la fonction plugin_example_getHeadings existait pour donner les infos sur les tabs
- $PLUGIN_HOOKS['example']['use_planning'] = true; idem pour les 2 fonctions de planning
- ...

Après dans les appels j'avais des choses du genre doHookXXX($condition,'<action>',$param[,$param2...])
où :
- XXX pour différencier le type de fonction de gestion des Hooks (actions successives ou enchaînées / paramètres en ligne ou en tableau > d'ailleurs la dessus on pourrait dire que tous les params sont dans un tableau et basta)
$condition était la condition à vérfier dans les plugins pour savoir si l'action était ) réaliser pour le plugin
- <action> le nom de l'action pour connaitre la bonne fonction à lancer
- $param le ou les paramètres éventuels

Ca engendrait pas mal de modifs sur les plugins mais le but étant de nettoyer j'y allais à la hache.
Je ne m'étais pas posé la question de rester le plus compatible avec l'existant.
Dans mon souvenir on avait du dire que vu que le système de gestion des plugins change, on pouvait tout nettoyer et repartir sur un nouveau truc quitte a tout modifier.


Ou là je suis pas super clair je pense.
Un exemple :

$data=doHookXXX('use_planning','PopulatePlanning',array("begin"=>$begin,"end"=>$end,"who"=>$who,"who_group"=>$who_group))
doHookYYYY('use_planning','DisplayPlanning',$data)

Une même condition peut engendrer 2 actions.
$input=doHookXXXX('use_item_add','PreItemAdd',$input);
doHookYYYY('use_item_add','ItemAdd',array("type"=>$this->type, "ID" => $newID));


ok donc en gros, on se retrouve avec une fonction qui fait un gros switch/case en fonction de l'action
et il faut modifier tous les prototypes de fonctions dans les plugins aussi.

Les noms des fonctions oui
Les prototypes non si on gère les paramètres en ligne. Oui sur certaines fonctions si on passe tout en tableau.

Pas de switch case dans mon exemple :

if (isset($PLUGIN_HOOKS['use_item_add'])
   && is_array($PLUGIN_HOOKS['use_item_add'])
   && count($PLUGIN_HOOKS['use_item_add']) ){
      foreach ($PLUGIN_HOOKS['use_item_add'] as $plugin => $val ){
         // Pas nécessaire if ($val)
         doOneHook($plugin,"$action",$param);
         // ou suivant le cas : $param = doOneHook($plugin,"$action",$param);
      }
} 

Remi (19/12/2009)

On a augmenté de manière considérable le nombre de table gérées par objet, et donc le nombre de déclenchement de ces hooks.

Il me semblerait intéressant de trouver une solution permettant à un plugin de définir un hook pour 1 type donné (ou une liste de type)

On pourrais imaginer, 1 fonctionnement

$PLUGIN_HOOKS['item_purge']['appliances']
    = array('Profile' => array('PluginFooObject','purgeProfile'), // méthode
                'Computer'=> 'truc-much_purge_item', // Fonction
                'Printer' => 'truc-much_purge_item');

Avec le passage en classe et l'utilisation de méthode de classe comme hook, l'utilisation de noms normalisés me semble moins intéressante.

Beaucoup de hook prennent désormais en seul argument l'objet courant qui contient toutes les informations utiles.
Une généralisation permettrait de n'utiliser que doHook (doHookFunction devenant inutile)