Fork me on GitHub

Documentations > Développeurs > Fiches techniques > Le modêle objet de Xoops

Le modêle objet de Xoops


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 :

  • uniformiser la maniêre de programmer et être prês des standards de codage de xoops
  • augmenter la lisibilité du code et ainsi faciliter la maintenance
  • fiabiliser votre code en s'appuyant sur du code xoops maintes fois validé
  • mais aussi bénéficier d'un certain nombre de mécanismes génériques integrés dans Xoops

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.
Open in new window 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 :

  • initVar ($key, $data_type ) permettant d'initialiser la définition d'un attribut
  • setVar($key, $value) qui met á jour l'attribut
  • getVar($kkey) qui restitue la valeur de l'attribut
  • cleanVars () nettoie les attributs des caractêres spéciaux pour les stocker dans la BD

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 :

  • create : création d'un nouvel objet á l'aide de la méthode (référence au pattern fabrique)
  • insert : modification d'un objet
  • delete suppression d'un objet
  • get($id) : accès direct á un objet á l'aide de son identifiant

    • Les différentes implémentations de XoopsObjectHandler des classes du répertoire /kernel introduisent 2 autres méthodes bien utile non présents dans la class mêre :

      • getObjects renvoie sous forme de tableau de xoopsobjet une sélection d'objet á partir d'un ensemble de critêres (class criteria du répertoire /class). Ceci est bien utile pour construire un formulaire de recherche
      • getCount renvoie le nombre d'occurrences d'une sélection d'objets á partir de critêres


      Typiquement voici un exemple de sélection de l'ensemble de privateMsg d' un utilisateur puis l'affichage du sujet et de la date du message :

      $criteria = new Criteria('to_userid'$xoopsUser->getVar('uid'));
      $pms =& $pm_handler->getObjects($criteria);
      foreach (
      $pms as $pm ) {
      echo 
      $pm->getVar('subject').'-'.$pm->getVar('msg_time') ;
      }

      L'utilisation avec un template smarty sera aussi simple en affectant l'ensemble de l'objet :

      $pms =& $pm_handler->getObjects(new Criteria('to_userid'$xoopsUser->getVar('uid')));
      $xoopsTpl->assign('pms',$pm);

      Associé au template smarty :

      <{section name=i loop=$pms}>
      <{
      $pms[i]->varssubject.value}>
      <{
      $pms[i]->varsmsg_time.value}>
      <{/
      section}>

      Class_generator : un générateur três simple.

      Pour éviter le fastidieux codage de l'implémentation de ces 2 classes, nous avons développé un petit générateur qui nous a fait gagné du temps et a fiabilisé et homogénéisé le code de type DAO. Il s'appuie sur un seul template smarty décrivant le fichier des 2 classes implémentent respectivement XoopsObject et XoopsObjectHandler. Le template peux bien entendu être modifié pour prendre en compte les besoins spécifiques.

      Ce générateur utilise uniquement les informations issues de la base de données ce qui impose d'avoir déjá une table de base de donnée sur laquelle s'appuyer. Class_generator génêre un fichier par table de Base de données. Il se base aujourd'hui sur la convention que la table source ne doit posséder qu'une seule clé primaire. Ceci pour générer la méthode du handler getId($maClePrimaire). Une fois le module installé, l'accès au générateur s'effectue dans la partie administration. Dans le formulaire " Générer une class " aprês avoir sélectionné le module sur lequel on travaille et la table de BD existante, le clic sur le bouton " générer " génêre un fichier nommé du nom de la table de BD sélectionnée dans le répertoire /class du module.

      Le module est téléchargable sur le site dev.oryxvet.com

      OryxVet
Licence, certains droits réservés
Partager Twitter Partagez cette article sur GG+
  Voir cet article en format PDF Imprimer cet article Envoyer cet article

Naviguer à travers les articles
Un exemple d'utilisation des classes XoopsObject et XoopsObjectHandler Article suivant
Propulsé avec XOOPS | Graphisme adapté par Tatane, Grosdunord, Montuy337513

107 Personne(s) en ligne (1 Personne(s) connectée(s) sur Documentations) | Utilisateur(s): 0 | Invité(s): 107 | Plus ...