Comme vous avez pu le constater, ce site utilise les sous-catégories. C'est vrai que pour l'instant l'avantage que cela procure est faible (peu d'articles, peu de thématiques abordées, bref un désert ordonné). J'ai laissé aussi les informations de debugage affichées (cf. "Debug" et "class.mysql"). Or un simple examen succinct des requêtes SQL exécutées à chaque affichage de page, laisse apercevoir une utilisation du SGBD par le plugin Gallery sur les pages où aucune image n'est présente. Bien sur ceux ne sont que quelques requêtes, mais les petits ruisseaux faisant les grandes rivières...

Pourquoi, je parle du Plugin Gallery dans ce billet ? Tout simplement parce c'est un excellent développement présentant de nombreuses qualités (fiabilité, fonctionnalité, évolution, ... consommation). Alors je le cite en exemple pour essayer d'en prendre le meilleur et d'éviter ses désagréments. J'aurai pu en citer un autre ou même ne pas en citer, mais il se trouve que celui-ci est installé sur ce blog.

Revenons à nos moutons. Pour générer la liste des catégories est sous-catégories il faut lancer une requête SQL puis parcourir le recorset résultat. Pour déterminer le chemin il faut lancer une requête SQL puis construire le chemin en parcourant le recordset résultat. Mon idée est de limiter le nombre d'accès au SGBD en construisant simultanément la liste hiérarchique des catégories et le chemin.

Plusieurs idées, et quelques problèmes

Dans DotClear les fonctions constituant un plugin sont contenues dans une classe non instanciée. Pour le plugin sous-catégories cela donne un code du type :

[php]
/*
 * dcCategorietree - Plugin pour DotClear
 * Copyright (C) 2005 Jerome Lauriol / filtrage.net - Mars 2005
 * 
*/

class dcCategorieTree {

  function dcextCatListTree(...) {
  }

  function dcAutrefonction () {
  }
}

et l'appel dans le template s'effectue en mentionnant la class de l'objet :

[php]
...
   // dcCatList(); 
   dcCategorietree:: dcextCatListTree(...);
...

Or si ce mécanisme est très pratique à l'usage, il présente l'inconvénient de ne pas initialiser de variables de type objet(dcCategorietree). D'où l'impossibilité de stocker dans l'objet une quelconque valeur. Si l'on veut garder de coté une variable, il faut :

  • soit utiliser une variable globale.
  • soit initialiser un objet de type dcCategorietree pour y stocker en son sein notre variable, outrepassant les schéma mis en place lors du développement de DotClear.

Ne pouvant me résoudre à l'une ou l'autre de ces solutions, j'ai imaginé une fonction retournant simultanément plusieurs valeurs rangées dans un tableau, et de stocker le résultat de cette fonction lors du premier appel dans le template. Une commande echo() permet l'utilisation future de ces valeur.

Ce qui donne le code suivant dans template.php :

[php]
// au début de script :
$aCat = dcCategorieTree::dcextCatListTree(
  '',             
  array(),        
  '<ul>%s</ul>',   
  '<li class="%3$s"><a href="%1$s">%4$s</a>%5$s %2$s</li>',   
  '<li class="%3$s"><a href="%1$s"><strong>%4$s</strong></a>%5$s %2$s</li>',  
  array('url','sub','class','cat_libelle','cat_desc'), 
  false  
);

// avec :
//   id cat start
//   array content filtered cat
//   format of set
//   format d'un item normal
//   format de  l'item actif
//   Arguments pour les formats item
//   pas d'echo


// Pour l'affichage du chemin
  echo '<div id="path">'.$aCat['path'].'</div>';


// dans la sidebar pour l'affichage de la liste

  // dcCatList(); 
  echo $aCat['tree']; 
?>

On peut remarquer le nombre de paramètre à passer. La plupart ayant des valeurs par défaut cela ne devrait pas poser de problèmes tout en permettant une souplesse de fonctionnement.

Cela change un peu le classique appel de fonction à partir du template. Mais pour une utilisation simple (sans affichage du chemin par exemple) il est tout à fait possible de faire un simple appel du type :

[php]
// dans la sidebar pour l'affichage de la liste

  // dcCatList();
  dcCategorieTree::dcextCatListTree(.......,'tree'); 

Cette partie visiteur étant maintenant opérationnelle je passe à la partie administration.