Le modêle objet de Xoops
Catégorie : Fiches techniques

Le modêle objet de XOOPS

par Oryxvet

Le modêle objet de xoops est basé sur 2 classes XoopsObject et XoopsObjectHandler toutes les deux codées dans le fichier /kernel/object.php. Ces 2 classes forment la couche d'accès aux données persistantes telle qu'elle est décrite dans le DAO pattern. C'est en les spécialisant que l'on implémente le modêle pour une entité particuliêre (souvent associé á une seule table de BD) comme le font toutes les classes du répertoire kernel qui constitue le noyau de xoops. J'encourage fortement les programmeurs de nouveaux modules xoops s'appuyant sur des tables de BD á utiliser ce modêle.

Les raisons d'utiliser ces 2 classes sont multiples :

XoopsObject possêde tous les services relatifs á la gestion d'un objet (une instance de la classe) et de ses attributs (getter et setter) alors que XoopsObjectHandler sert de manipulateur ou de contrôleur des instances (insertion, modification ou sélection d'objets.
Dans une premiêre partie, je décris en détail ces 2 classes en prenant exemple sur une classe du noyau xoops XoopsPrivmessage qui s'appuie sur la table priv_msgs puis dans une seconde partie je présente un petit générateur de code de ce modêle.

XoopsObjectHandler et XoopsObject

Nous allons utiliser comme exemple la table priv_msgs qui permet d'envoyer des message privés entre membres du portail.
Figure 1 : Decription de la table priv_msgs

XoopsObject est la classe mêre permettant de manipuler les attributs d'un objet données. Il s'appuie sur le tableau $vars pour manipuler les attributs de l'objet. $vars contient les attributs de l'objet sous la forme clé, valeur. La clé désigne le nom de l'attribut c'est á dire souvent le nom d'une colonne de la table de BD. XoopsObject offre des mécanismes génériques d'accès aux données ; ses principales méthodes sont :

La classe associée au Privmessage ne doit ainsi définir que les attributs qu'elle veut gérer

class XoopsPrivmessage extends XoopsObject
{

/**
 * constructor
 **/
    
function XoopsPrivmessage()
    {
        
$this->XoopsObject();
        
$this->initVar('msg_id'XOBJ_DTYPE_INTnullfalse);
        
$this->initVar('msg_image'XOBJ_DTYPE_OTHER'icon1.gif'false100);
        
$this->initVar('subject'XOBJ_DTYPE_TXTBOXnulltrue255);
        
$this->initVar('from_userid'XOBJ_DTYPE_INTnulltrue);
        
$this->initVar('to_userid'XOBJ_DTYPE_INTnulltrue);
        
$this->initVar('msg_time'XOBJ_DTYPE_OTHERnullfalse);
        
$this->initVar('msg_text'XOBJ_DTYPE_TXTAREAnulltrue);
        
$this->initVar('read_msg'XOBJ_DTYPE_INT0false);
    }
}

Il existe plusieurs intérêts d'utiliser un tableau plutôt qu'autant d'attribut de classe que de variables (couramment fait en java). Il est plus efficace en terme de temps d'exécution de manipuler de tels tableaux car ce modêle est plus proche de la structure de la requête http postée. En travaillant sur un tableau on économise le déchargement du tableau en variable. La requête (issue par exemple d'un formulaire de mise á jour d'un objet) s'utilise directement pour charger un objet. Voici un exemple ou par convention les champs HTML vont être nommés comme le nom des attributs.

$pm =& $pm_handler->get($idPm); // Récupération de l'objet 
$pm->setVars(($_post) ; // Mise Ã¡ jour de l'objet Ã¡ partir de la requête 
$pm_handler ->insert($pm) ; // mise Ã¡ jour physique dans la BD

C'est un peu lourd puisque l'on passe toute la requête mais le setVars fera le " ménage " en vérifiant si la clé est un attribut géré par la class. Une autre solution est de parcourir les vars de la class pour l'aller chercher que ceux dont on a besoin :

foreach ($pm->getVars() as $key => $value) {
  if (isset(
$_POST[$key])) { 
    
$pm->setVar($key,$_POST[$key]);
  }
}

Quelque soit l'option choisie, en passant l'objet au handler, la mise á jour est stockée dans la BD :

$pm_handler ->insert($pm) ;

XoopsObjectHandler est une classe abstraite qui une fois implantée permet de manipuler les objets d'une class particuliêre (maclasse) étendant la class xoopsObject. Ce Handler (ou manipulateur) peut se récupérer á l'aide de la méthode xoops_gethandler du fichier /include/function.php en passant le nom de la classe maclasse que l'on veut manipuler. Attention toutefois car cette méthode se base sur une convention de nom, il faut avoir nommé le handler xoopsmaclasseHandler. On peut aussi simplement instancier la class.

$pm_handler =& xoops_gethandler('privmessage');
// Ou bien 
$pm_handler = new XoopsPrivmessageHandler($xoopsDB)

Voici les principales méthodes proposées par ce handler qu'il s'agit d'implémenter :

<a href="http://creativecommons.org/licenses/by-nc-sa/2.0/fr/" title="Licence, certains droits réservés"><img src="http://www.frxoops.org/images/cdr_bouton.gif" alt="Licence, certains droits réservés" /></a>