Je note que ce terme apparu avec l'apparition des langages fonctionnels ( ML, OCaml, Lisp , Common Lisp, Scheme ), désignait un mécanisme précis dans lequel la fonction exécutée retournait un résultat. Maintenant avec l'implantation de ce type de mécanisme dans de nombreux logiciels écrits en langage procédural ou objet, cela ne semble plus être une obligation.
Dans Dotclear 1x
Ce mécanisme n'est pas pour l'instant implanté dans Dotclear (branche 1.x). Une information sur le sujet a été publiée sur le wiki du projet initialement en Avril 2004, la version actuelle de cette note décrit en partie l'implantation prévue. L'implantation était prévue pour ce soir, mais dans les fait seul des prémices d'implantation sont visibles dans la branche de développement rocki-dev.
Dans Dotclear2 (Aoraki)
Le système de callback est opérationnel ! Mais seul les événements déclencheurs utilisés par les développeurs de la dcTeam sont actuellement pris en compte.
Le système repose sur l'utilisation de deux fonctions de l'objet $core : addBehavior() et callBehavior().
Les fonctions pouvant être appelées doivent être encapsulées dans une classe conteneur. Par convention cette classe est nommée par l'identifiant du plugin suffixé ' Behaviors' ( exemple : dummyBehaviors pour le plugin dummy) et les fonctions avec l'identifiant de l'évènement (exemple : BeforeCommentCreate )
Les fonctions ainsi définies doivent accepter les paramètres adéquats et éventuellement produire un affichage (ça dépend des cas d'utilisation, il n'y a pas de règle générale). Pour savoir exactement comment écrire ces fonctions, en l'absence de documentation précise le mieux est de consulter le code (en espérant qu'il n'y aura pas trop de changement).
Exemples d'utilisation :
Exemple 1 : enregistrer une fonction devant être appelée juste avant l'enregistrement d'un commentaire :
$core->addBehavior('publicBeforeCommentCreate',array('dummyBehaviors','BeforeCommentCreate'));
avec la classe
# BEHAVIORS
class dummyBehaviors
{
public static function BeforeCommentCreate(&$cur)
{
// --ici le traitement de l'évènement --
// le paramètre $cur contient les données du commentaire devant être enregistré.
}
}
Exemple 2 : Définir dans un plugin, un événement déclencheur.
$core->callBehavior('id_de_l_evenement',$param1,$param2);
Remarques
- Aucun contrôle permet de détecter les conflits pouvant survenir (identifiant erroné, boucle infinie, ...).
- Le nombre d'événements déclencheurs actifs dans cette version béta est limitée. La liste prévisionnelle des événements pris en compte dans les versions futures n'est pas connue.
- L'ordre d'exécution des fonctions appelées n'est pas prédéfini. Ainsi si l'on veut développer de façon isolée des fonctions agissant toutes en réponse au même événement déclencheur il est impossible de connaître l'ordre d'exécution. ( Une ruse peut-être ? )
Annexe
Liste des callback définis dans la version béta Dotclear2 (Aoraki)
Administration des billets
- adminPageHTMLHead
- Localisation de l'appel : inc/admin/lib.dc.pages.php
- Paramètres : (aucun)
- Affichage possible
- adminPageHTMLHead
- Localisation de l'appel : inc/admin/lib.dc.pages.php
- Paramètres : (aucun)
- Affichage possible
- loginPageHTMLHead
- Localisation de l'appel : admin/auth.php
- Paramètres : (aucun)
- Affichage possible
- adminBeforePostUpdate
- Localisation de l'appel : admin/post.php
- Paramètres : $cur : cursor (post),$post_id
- adminAfterPostUpdate
- Localisation de l'appel : admin/post.php
- Paramètres : $cur : cursor (post),$post_id
- adminBeforePostCreate
- Localisation de l'appel : admin/post.php
- Paramètres : $cur : cursor (post)
- adminAfterPostCreate
- Localisation de l'appel : admin/post.php
- Paramètres : $cur : cursor (post),$post_id
- adminPostHeaders
- Localisation de l'appel : admin/post.php
- Paramètres : (aucun)
- Affichage possible
- adminPostFormSidebar
- Localisation de l'appel : admin/post.php
- Paramètres : $post
- Affichage possible
- adminPostForm
- Localisation de l'appel : admin/post.php
- Paramètres : $post
- Affichage possible
- adminBeforeUserUpdate
- Localisation de l'appel : admin/preference.php
- Paramètres : $cur : cursor (user), userID
- adminAfterUserUpdate
- Localisation de l'appel : admin/preference.php
- Paramètres : $cur : cursor (user), userID
- adminPreferencesHeaders
- Localisation de l'appel : admin/preference.php
- Paramètres : (aucun)
- Affichage possible
- adminPreferencesForm
- Localisation de l'appel : admin/preference.php
- Paramètres : $core
- Affichage possible
- adminBeforeUserUpdate
- Localisation de l'appel : admin/user.php
- Paramètres : $cur : cursor (user) ,$user_id
- adminAfterUserUpdate
- Localisation de l'appel : admin/user.php
- Paramètres : $cur : cursor (user) ,$user_id
- adminBeforeUserCreate
- Localisation de l'appel : admin/user.php
- Paramètres : (aucun)
- adminAfterUserCreate
- Localisation de l'appel : admin/user.php
- Paramètres : $cur : cursor (user) ,$user_id
- adminUserHeaders
- Localisation de l'appel : admin/user.php
- Paramètres : (aucun)
- Affichage possible
- adminUserForm
- Localisation de l'appel : admin/user.php
- Paramètres : $rs : recordset (user)
- Affichage possible
Plugins par défaut
- adminInitWidgets
- Localisation de l'appel : plugins/widgets/index.php
- Paramètres : $widget
Partie publique
- coreBlogConstruct
- Localisation de l'appel : inc/core/class.dc.blog.php
- Paramètres : $blog
- coreBlogGetPosts
- Localisation de l'appel : inc/core/class.dc.blog.php
- Paramètres : $rs : recordset (blog)
- coreBlogGetComments
- Localisation de l'appel : inc/core/class.dc.blog.php
- Paramètres : $rs : recordset (comment)
- coreInitWikiPost
- Localisation de l'appel : inc/core/class.dc.core.php
- Paramètres : $wiki2xhtml
- coreInitWikiSimpleComment
- Localisation de l'appel : inc/core/class.dc.core.php
- Paramètres : $wiki2xhtml
- coreInitWikiComment
- Localisation de l'appel : inc/core/class.dc.core.php
- Paramètres : $wiki2xhtml
- publicBeforeTrackbackCreate
- Localisation de l'appel : inc/core/class.dc.trackback.php
- Paramètres : $cur : cursor (comment)
- publicAfterTrackbackCreate
- Localisation de l'appel : inc/core/class.dc.trackback.php
- Paramètres : $cur : cursor (comment) , $comment_id
- publicPrepend
- Localisation de l'appel : public/prepend.php
- Paramètres : $core
- publicBeforeCommentCreate
- Localisation de l'appel : public/lib.urlhandlers.php
- Paramètres : $cur : cursor (comment)
- publicAfterCommentCreate
- Localisation de l'appel : public/lib.urlhandlers.php
- Paramètres : $cur : cursor (comment) , $comment_id
Commentaires
Je fais mon widget ThemeSwitcher, (démo à l'adresse que j'indique). Et je dois utiliser le callback "publicPrepend". Je l'utilise donc bien comme il faut. Mais malheureusement, la méthode associée au Behavior n'est pas appellée :(. Je peux tester cela avec un echo 'toto';. Cela ne marche pas !!!
IngolmoQuelqu'un aurait une idée ? Ce Callback fonctionnerait-il différemment des autres ?
C'est bon, j'ai trouvé...
IngolmoComme quoi, ca aide de poster des commentaires sur de sbillets, ca nous aide à réfléchir :D
Merci beaucoup pour cette doc sur les callback!
olivierOui, merci beaucoup ! Tu devrais te proposer en tant que rédacteur de la doc officielle ;-)
NiKo