ExpAt est extensible. La version actuelle possède un nombre minimal de fonctions/objets, mais elle s'enrichira au cours du temps.
Il reste toutefois possible dans la version actuelle du plugin, d'ajouter ses propres fonctions, via le _public.php de son thème ou d'un plugin donné.
L'approche générale est d'utiliser l'objet $core->expatDict, qui est le dictionnaire du plugin ExpAt
La déclaration d'une fonction est très simple, il suffit d'utiliser le behavior expatDictInit :
$core->addBehavior("expatDictInit",array("myExpat","expatDictInit"));
class myExpat {
public static function expatDictInit($dict) {
$dict->registerFunction(new expatBasicFunction("map_name","function"));
}
}
- map_name est le nom de la fonction tel qu'il devra être entré dans les expressions du template
- function est le nom de la fonction généré dans le template compilé.
Exemple : en déclarant le code
$core->addBehavior("expatDictInit",array("myExpat","expatDictInit"));
function isSame($a,$b) {
return $a==$b;
}
class myExpat {
public static function expatDictInit($dict) {
$dict->registerFunction(new expatBasicFunction("test","isSame"));
}
}
Il devient alors possible de faire un test du type <tpl:If expr="test(entry.id,12)">...</tpl:if>. L'exemple choisi ici est idiot (on peut faire tout bêtement "entry.id==12"à, mais il montre les possibilité d'extension du plugin.
Il est également possible de définir de nouveaux objets, cela fera l'objet d'un nouveau billet...

10 réactions
1 De Franck - 24/09/2010, 10:24
Euh dans l'enregistrement de la fonction, il ne faudrait pas filer plutôt isSame en 2e paramètre ?
2 De Dsls - 24/09/2010, 10:28
Exact m'sieur, c'est corrigé. Merci.
3 De Franck - 24/09/2010, 10:33
Et si la fonction est déclarée dans une classe, un simple "myClass::isSame" suffira ?
4 De Dsls - 24/09/2010, 10:36
Exactement, par exemple actuellement sont enregistrés par défaut :
* ("cut_string","text::cutString")
* ("remove_html","context::remove_html")
* ("encode_html","html::escapeHTML")
5 De phil - 15/10/2010, 16:31
Je suis débutant sous Dotclear, mais j'aurai besoin de votre plugin.
Je n'avais pas de _public.php dans mon thème, j'en ai créé un pour ajouter la fonction php time() :
<?php
if (!defined('DC_RC_PATH')) { return; }
function current_time() {
return time();
}
$core->expatDict->registerFunction(new expatBasicFunction("time","current_time"));
?>
mais ça me donne cette erreur : Fatal error: Call to a member function registerFunction() on a non-object in /dotclear/themes/montheme/_public.php on line 8
il faut quoi en plus dans _public.php pour que ça marche ?
merci pour ce plugin !
Philippe
6 De phil - 15/10/2010, 16:38
sinon j'ai mis le _public.php dans un plugin spécifique "monplugin" et là j'ai une erreur expat :
<!-- expat Compilation error : No such object : -->
avant de rajouter la fonction "current_time" expat me faisait :
<!-- expat Compilation error : No such function : time -->
j'ai l'impression que je progresse mais bon c'est pas encore ça...
Merci de votre aide !
Philippe
7 De phil - 15/10/2010, 16:44
c'est possible de supprimer mon dernier message de 16:38 ?
Je me suis emmêlé les pinceaux j'avais pas mis les () à time dans l'expr en les rajoutants il continue à me dire <!-- expat Compilation error : No such function : time -->
donc la fonction n'est pas prise en compte par dotclear dans mon plugin apparemment.
Philippe
8 De Dsls - 15/10/2010, 17:00
Tu as raison, il y avait un manque quelque part. la 0.3 corrige le problème, j'ai ajouté un behavior pour faire plus propre (voir le billet modifié pour le code à insérer). La 0.3 a été soumise sur dotaddict, mais elle est disponible aussi ici :
http://www.morefnu.org/public/archi...
9 De phil - 15/10/2010, 17:19
super ça marche !
Merci Dsls
Philippe
10 De Gradiva - 17/12/2010, 12:43
J'aimerais qu'on m'explique le problème de l'interface administration?