L'ajout d'un widget consiste simplement à ajouter deux nouveaux comportements (behaviors) initDefaultWidgets et initWidget qui respectivement permettent d'ajouter un widget dans la liste des widgets disponibles et qui permettent d'initaliser un widget. Cela se fait simplement avec le code suivant:
<?php
$core->addBehavior('initWidgets',array('AboutPageWidgets','initWidgets'));
$core->addBehavior('initDefaultWidgets',array('AboutPageWidgets','initDefaultWidgets'));
class AboutPageWidgets
{
public static function initWidgets(&$w) {
}
public static function initDefaultWidgets(&$w,&$d) {
}
}
?>
La méthode initDefaultWidgets n'attend qu'un paramètre qui est le tableau dans lequel ajouté le nouveau widget. On va l'ajouter dans le tableau $d['extra']. La méthode initWidget crée le widget (méthode create) et permet de fixer des paramètres. On va mettre un titre à notre widget. La méthode create attend trois paramètres : le namespace, un titre et une fonction de callback (ce sera une méthode static de la classe AboutPageWidgets). La fonction de callback gère l'affichage proprement dit en fonction des paramètres et du titre. Cela donne cela:
<?php
$core->addBehavior('initWidgets',array('AboutPageWidgets','initWidgets'));
$core->addBehavior('initDefaultWidgets',array('AboutPageWidgets','initDefaultWidgets'));
class AboutPageWidgets
{
public static function initWidgets(&$w) {
$w->create('about_page',__('About'),array('AboutPageWidgets','about'));
$w->about_page->setting('title',__('Title:'),__('About'));
}
public static function initDefaultWidgets(&$w,&$d) {
$d['extra']->append($w->about_page);
}
public static function about(&$w) {
global $core;
if (!$core->blog->settings->aboutpage_active
or !$core->blog->settings->get('aboutpage_post_id')) {
return;
}
$res = '<div id="about">';
$res .= '<a';
if ($core->url->type==$core->url->getBase('about')) {
$res .= ' class="about"';
}
$res .= ' href="'.$core->blog->url.$core->url->getBase('about');
$res .= '"><span>'.html::escapeHTML($w->title).'</span></a></div>';
return $res;
}
}
?>
Rien de bien complexe. Tout le "sale" boulot est fait par le plugin widgets!