Remarquez que tous les mécanismes décrits ne sont pas utilisé sur ce site, mais plusieurs sites utilisent ce développement et mettent en oeuvre cette mécanique selon les besoins et les envies.

Le thème à été transformé pour présenter trois colonnes. L'une reprend le contenu, l'autre les fonctions de navigation, et la troisième des fonctions annexes. Cette troisième colonne n'est d'ailleurs pas systématique. L'objectif est de présenter clairement et distinctement les articles, proposer des liens sur un contenu relatif, et de positionner les outils de navigation génériques utiles au repérage dans le site.

Pour faciliter l'usage du site, certaines fonctions peuvent être mises en avant lors de l'affichage de certaines pages. Ce mécanisme est basé sur le constat simple : Il me paraît normal d'inciter un utilisateur à poursuivre sa visite en lui proposant un type de navigation approprié. Ainsi par exemple le calendrier peut ne pas être présent si il n'est pas opportun.

Le contenu des colonnes dépend de la page affichée. C'est à dire en langage Dotclear, que le mode d'affichage ('home', 'cat', 'post', 'day', 'month'... ) est exploité pour déterminer le remplissage de ces colonnes.

Techniquement cela se traduit par l'implantation d'une fonction générant le code XHTML à la demande. Un paramètre décrit le résultat escompté.

function bar($items="", $prefixe="") {
  
  global $blog, $ath;

  $wcr = "
";
  $aItems = preg_split ("/[\s,]+/", $items);
  
  foreach ( $aItems as $item ) { 
  
  list($itemId,$itemAtt) = split ('[/.-]', $item.'/');
  
  switch (trim($itemId)) { 
		
  case 'titletext':
    // Le code correspondant
    break;

  case 'languages': 
    if (strpos(' '.$itemAtt,'Title')>0) {
      dcLangList('<div id="'.$prefixe.'languages"><h2>'. __('Languages') .'</h2><ul>%s</ul></div>'.$wcr); 
   } else {        
     dcLangList('<div id="'.$prefixe.'languages"><ul>%s</ul></div>'.$wcr); 
    }        
    break; 
  
// etc... 

Cette fonction est appelé avec une chaine d'identifiant comme paramètre.

$sidebar = "search/Title, calendar/Title, categories/Title, archives/Title, syndicate/Title, links/Title, themes/Title";

bar($sidebar,"");
ou pour la troisième colonne :
$outbar = "search/Title, calendar/Title, tagcloud/Title";

if ($outbar != '') {
  bar($outbar,"outbar");
}

Il suffit par la suite de remplir les variables $sidebar et $outbar avec les valeurs appropriées en fonction du mode en utilisant une structure conditionnelle, ou comme je j'ai fait, inclure un fichier dynamiquement en construisant son nom en fonction du de la variable $mode (attention dans ce cas pour éviter les problèmes de CSS/cross scripting call, il faut filtrer la variable avant de l'utiliser. Et pour tenir compte du plugin paginnation, il faut utiliser $dc_orig_mode).

if ($mode == 'pagination') {
	$dc_mode = $dc_orig_mode;
}else{
	$dc_mode = $mode;
} 
					 
if (file_exists($theme_path.'/vars-'.$dc_mode.'.inc')) { 
  include ($theme_path.'/vars-'.$dc_mode.'.inc');
}

if ($dc_mode == 'cat') {
  if (file_exists($theme_path.'/vars-'.$cat_id.'.inc')) { 
	  include ($theme_path.'/vars-'.$cat_id.'.inc');
	}
}

Pour completer ce dispositif, j'ai défini dans ces fichiers inclus un tableau des feuilles de style à appeler.

// dans les fichiers inclus:
$style = $GLOBALS['theme_uri'].$GLOBALS['__theme'].'/layout.css '.
            $GLOBALS['theme_uri'].$GLOBALS['__theme'].'/style.css '.
            $GLOBALS['theme_uri'].$GLOBALS['__theme'].'/addon.css '.
            dc_app_url.'/share/gallery/themes/default/gallery.css';

//Dans l'entête du thème
  $wcr = "
";

  if ($style != '') {
    $styleItems = preg_split ("/[\s,]+/", $__style);
    foreach ( $styleItems as $styleItem ) {
 			if ($styleItem != '') {
		  	echo '<link rel="stylesheet" type="text/css" href="'.$styleItem.'" media="screen" />'.$wcr;
			}
		} 	  
  }

Quelques remarques en vrac

Dans les codes fournis vous avez remarqué que n'utilise pas le mélange des codes PHP et HTML, c'est volontaire. Cela me permet de limiter les génération de caractères au strict nécessaire. Je considère que le code envoyé aux navigateurs doit être lisible par les navigateurs et que pour cela il n'y a aucun besoin d'inclure des espaces de tabulation, des retours à la ligne, ou des commentaire XHTML. Ces règles de présentation n'ont d'utilité que pour la lecture humaine. Le gain en taille peut représenter 30% du volume total. (Néanmoins j'inclus en fin de ligne la variable $wcr qui est initialisée avec « » lors du debugage.)

Toujours dans les codes présentés, vous aurez remarqué l'usage des fonctions de translations permettant la traduction de l'interface, les tests systématiques de la présence d'un plugin avant son utilisation, ainsi que les tests d'existences des fichiers avant leur inclusion.

Les évolutions possible de ce code

Une fois la mécanique en place, il est plus facile de changer le contenu des colonnes. Les changements s'effectue en modifiant les variables $sidebar, $outbar ou $style, il devrait être possible et facile de faire une interface conviviale accessible par la partie administration du site. Cette interface pourrait permettre de définir les éléments présents, ainsi que leur ordre d'apparition.

Les portions de code générant le XHTML de chaque élément contenues dans la structure switch de la fonction bar(), pourraient être stockées séparément et être directement définies via les plugins voire être récuperés dans un flux XML. Un premier pas vers l'implentation des Widget dont parle Pep ?

De nombreux ajouts et modification aux fonctions de base est réalisé en remplacant des portions de code normalement inclus dans /layout/fonctions.php. Pour faciliter ces réécriture, je propose de rassembler l'ensemble des fonctions de ce fichier dans un objet layout. Cet objet pourrait être instancié ou redéfini en profitant de l'héritage pour compléter les fonctions. Ainsi un thème pourrait continuer à utiliser la fonction dcCatList(), alors même qu'un plugin aurait redéfini cette fonction (exemple: MultiCat, Table des matières).

Dernière remarque (pour l'instant) : Je n'ai pas pour l'instant l'intention de diffuser l'ensemble des sources de ce thème prêts à l'emploi.

  • D'une part par conviction. Si j'adhère à la philosophie « logiciel libre », je retient la notion de partage des connaissances dans ces fondements. Je ne vois donc pas comme possible la diffusion large de mon travail à des inconnus n'apportant rien, ni même un bonjour ou un merci.
  • D'autre part ce site, comme bien d'autre est en chantier. Le chantier évoluant de jour en jour, il me paraît difficile de diffuser une version utilisable de ces codes sans assistance. Et je n'ai pas envie d'apporter cette assistance.
  • Et dernièrement, l'implantation de ces codes remet parfois en question le code originel de Dotclear. Ce logiciel ne m'appartenant pas, et étant maintenu par ailleurs, je ne souhaite pas réaliser un fork risquant de semer la zizanie dans la « communauté » d'utilisateurs.

Donc pour résumer, j'explique ce que j'ai fait, comment je l'ai réalisé, libre à chacun de s'en inspirer pour bricoler son site.