Jelix propose un système de mapping relationnel objet, jDao, basé sur le pattern DAO.
Le pattern DAO se base sur deux types d'objets : un objet "record", contenant
des données (représentant un enregistrement), et un objet "factory", qui permet
de récupérer des listes de records, ou de créer, sauver, effacer des records.
Concrètement avec jDao, un fichier XML DAO vous permet de définir un record et
une factory, qui agiront sur une ou plusieurs tables en même temps. Vous y
définissez donc le mapping : quel champs de la table ira dans quelle propriété
du record, ainsi que le type de donnée, les clés, sur quelles tables s'effectue
le mapping, selon quelles jointures, etc...
À partir de ce fichier, jDao génère à la volée deux classes basées respectivement
sur jDaoRecordBase et jDaoFactoryBase (qui sont stockées dans un fichier PHP
dans le cache de Jelix), dans lesquelles sont fournies toutes les méthodes et
requêtes SQL principales **en dur**. En effet, contrairement à d'autres systèmes
de mapping, les requêtes SQL sont donc générées une seule fois, et non pas
dynamiquement à chaque appel de pages. Cela permet de meilleures performances.
Dans le fichier XML de DAO, vous pouvez aussi définir vos propres méthodes d'accès aux données, et jDao générera les méthodes et requêtes correspondantes dans la factory du DAO.
===== Créer un premier DAO =====
Vous disposez d'une commande pour créer un fichier DAO, basé sur une table existante. Elle a la syntaxe suivante :
createdao //nom_module// //nom_dao// //nom_table//
Nous avons précédemment créé une table news, et nous allons créer un DAO appelé "news", dans le module "news". Tapez donc :
php cmd.php createdao news news news
Vous obtenez alors un fichier @@F@actu.org/modules/news/daos/news.dao.xml@@. (vous pouvez bien sûr aussi le créer à la main).
Son contenu est le suivant :
C'est un contenu très simple, et bien sûr il existe d'autres attributs et balises pour l'enrichir et le personnaliser. Pour l'instant, nous allons nous en tenir là.
===== Lister les news =====
Nous allons maintenant utiliser ce DAO pour récupérer la liste des news. Nous allons donc demander à jDao la factory de ce DAO, et appeler sa méthode @@M@findAll()@@ prédéfinie. Pour ce faire, on fait appel à @@M@jDao::get()@@ :
$fact = jDao::get('news~news');
$liste = $fact->findAll();
En paramètre de @@M@jDao::get()@@, on donne le sélecteur du DAO (qui a pour nom "news", et dans le module news) : "news~news". Elle nous renvoie la factory de ce DAO. et en appelant la méthode @@M@findAll()@@, on récupère toute la liste des records.
En fait, il ne s'agit pas vraiment d'une liste, mais d'un objet @@C@jDbResultSet@@, qui est un itérateur sur les résultats de la requête correspondante.
Intégrons ça dans notre contrôleur :
function index() {
$rep = $this->getResponse('html');
// on définit un titre de page
$rep->title = 'Dernières actualités';
// creation d'un objet template pour le contenu spécifique
$tpl = new jTpl();
$fact = jDao::get('news~news');
$liste = $fact->findAll();
// on assigne la liste des news dans notre template spécifique
$tpl->assign('liste', $liste);
// assignation du resultat du template listenews à la variable $MAIN
$rep->body->assign('MAIN', $tpl->fetch('listenews'));
return $rep;
}
On donne la liste des enregistrement à notre template spécifique à l'action, via une variable de template grâce à la méthode @@M@assign@@. Modifions notre template spécifique @@F@listenews.tpl@@ :
Dernières actualités
{foreach $liste as $news}
{$news->sujet} | {$news->news_date} |
{/foreach}
Vous découvrez ici le tag de template {foreach}, qui fonctionne exactement comme le foreach php. Pour afficher des valeurs, il suffit de mettre le nom de la variable de template précédé par un //$//, et encadré par des accolades.
La liste renvoyée par @@M@findAll@@ est une liste d'objets record, tels qu'ils sont définis dans le fichier XML. Ils ont donc les propriétés @@P@id_news@@, @@P@sujet@@, @@P@texte@@ et @@P@news_date@@.
Affichez à nouveau la page avec :
http://localhost/actu.org/www/index.php/news/
Vous devriez voir la liste des news.
Remarque : si vous avez des problèmes d'affichage des accents, essayez de mettre @@force_encoding=on@@ dans le fichier @@F@profiles.ini.php@@.