Extend coreBlogGetPosts
Par Akh le mercredi, 30 décembre 2009, 14:44 - Lien permanent
Je me suis fait avoir sur ce coup !
En utilisant la possibilité
d'étendre le contenu des posts, je pensais que cela fonctionnait comme
les behaviors, une sorte d'empilage des appels de fonction ... Que
nenni c'est du remplacement point !
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
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));
...
Commentaires
Je ne connais pas ce sujet mais ça ressemble à l'idée du plugin stacker : http://jean-christophe.dubacq.fr/po...
Merci Moe pour ce lien !
Je ne connaissais pas (bien-sûr
et cela m'aurait évité un bug et de passer beaucoup de temps dessus), ce plugin est intéressant, ainsi que d'autres de cet auteur ...
Seul bémol je ne souhaite pas spécialement imposer l'utilisation d'un autre plugin en sus, par contre si la demande existe il faudra que j'envisage de laisser la possibilité aux administrateurs de l'utiliser plutôt que ma petite solution, ce qui ne m'apparaît pas spécialement difficile ...
Par contre, il me semble que cette subtilité de fonctionnement n'est pas connu de tous, et je n'ai pas trouvé d'endroit pour aborder ce type de question, finalement très (trop) technique interne au fonctionnement de dotclear ...
En effet, je ne vois pas trop où dans la documentation on pourrait parler du plugin Stacker. Je crois que la meilleure façon de le faire connaître est que les plugins compatibles avec Stacker parlent de cette possibilité dans leur aide ou dans leur documentation.
Je pense qu'il manque à dotclear un endroit pour discuter des plugins et du core, trouver de l'aide, des explications, partager des informations (tel ce plugin Stacker). Tout ceci pour éviter les bugs et améliorer le produit ... Je proposerai bien qu'une catégorie du forum dotclear y soit consacré spécifiquement technique / développement et donc non utilisation, ce sont des discussions différentes
Concernant Stacker pour l'instant je ne fais rien ...
Connais-tu Dotclear Lab ? Ça rassemble de nombreux contributeurs avec qui tu peux parler de technique : http://lab.dotclear.org/wiki/WikiSt...
Tu peux aussi proposer ton idée d'un nouveau sous-forum.
Oui je m'y suis inscrit, le SVN, le Wiki, le Trac et la lettre d'information ne sont pas adaptées (enfin j'en ai l'impression). Mais tu as raison je vais surement proposer un sous-forum (je trouvais pas l'appellation tout à l'heure
Tu préférerais quel moyen de communication ? Le forum ?
Tout à fait, disponible à toute heure, gardant une trace complète des échanges et modéré au besoin.
Ton histoire me rappelle un ticket (#797).
Bonne année.
Osku tu as tout à fait raison, cela rejoint la remarque de Moe.
Cela prouve que je ne suis pas assez doué pour utiliser le trac ou que celui-ci n'est pas tout-à-fait adapté, au choix
(le côté transversal n'est pas des plus pratique).
Je remonterai surement cette info sur le forum maintenant qu'il y a un coin des sorciers
.
Merci & Bonne Année aussi