Explications

Ainsi pour le plugin ItsaRiddle j'ai besoin d'aller modifier le contenu du post à la volée donc j'avais mis ça :

if ($GLOBALS['core']->blog->settings->sItsaRiddle_Ok)
{
$GLOBALS['core']->addBehavior('coreBlogGetPosts',
array('BehaviorsItsaRiddle','coreBlogGetPosts'));
}

class BehaviorsItsaRiddle
{
public static function coreBlogGetPosts(&$rs)
{
$rs->extend('rsItsaRiddle');
}
}

Ce qui permettait au core de dotclear d'appeler ça au moment opportun :

class rsItsaRiddle
{
public static function getContent($rs,$absolute_urls=false)
{
global $core;

...


Mais voilà en faisant ça mes smilies n'était plus remplacés par leur imagette ! (les flux n'étaient plus tronqués non plus) Après une recherche dans le code de dotclear j'ai découvert que c'était à moi d'appeler la fonction de la classe définie précédemment en fait :

rsExtPostPublic::getContent($rs,$absolute_urls);

elle même se chargeant d'appeler la fonction de la classe originelle le cas échéant :

rsExtPost::getContent($rs,$absolute_urls);

Remarques

Ce mode de fonctionnement rend donc hasardeux la possibilité par exemple de remplacer totalement la fonction d'affichage des smilies car si un plugin s'est inséré entre le votre et la fonction initiale, vous ne pouvez pas l'empêcher d'appeler cette fonction ...

Solutions

Conclusion il faut sauvegarder la fonction de la classe avant de l'écraser, et l'appeler dans sa propre fonction. Ainsi si plusieurs plugins utilisent cette méthode tous les enrichissements seront gardés LOL


Voici le code que j'utilise : (il faut aussi penser à la fonction getExcerpt)

class BehaviorsItsaRiddle
{
public static function coreBlogGetPosts(&$rs)
{
$f = $rs->extensions();
$GLOBALS['PrvExtCItsaRiddle'] = $f['getContent'];
$GLOBALS['PrvExtEItsaRiddle'] = $f['getExcerpt'];

$rs->extend('rsItsaRiddle');
}
}

class rsItsaRiddle
{
public static function getContent($rs,$absolute_urls=false)
{
global $core;

$c = call_user_func_array($GLOBALS['PrvExtCItsaRiddle'],
array($rs,$absolute_urls));
...