Drupal 6 – les bonnes pratiques pour créer un thème pour drupal 6.x



Dans un article précédent, on avait une méthode simple, efficace mais finalement assez risquée de créer un thème sur Drupal en détournant un thème existant. Deux raisons à cela :

  • Vous ne savez pas grand chose du code que vous allez trouver, la question qui vous viendra à l’esprit est bien evidemment « est-ce la façon dont vous auriez procéder ? »
  • En créant votre thème, vous produirez un thème maigre livré sans matière grasse, sans poudre aux yeux, sans chichi et sans fichier inutile… Bref, vous saurez intervenir en cas de pépin comme dirait Francis Heaulmes !

NDLR: Ainsi, comme dit ma grand-mère, « un petit chez soi vaut mieux qu’un grand chez les autres ». Le principe s’applque pour le logement comme pour le thème Drupal.

Leveraging Drupal: Getting Your Site Done Right

Leveraging Drupal: Getting Your Site Done Right

Un excellent livre sur le CMS Drupal, qui prend vraiment le partie d'une approche pragmatique et efficace. Rien n'est laissé de côté sur la compréhension de Drupal (thème, module...etc) mais il n'y a rien de superflu non plus. Par ailleurs, une chose rare qui mérite d'être signalée c'est une application concrète de la méthode Agile avec "User storie", "Acceptance Test" pour mener à bien le développement d'un site sous Drupal. Un livre très complet.

Genre(s) : , , , , , , , , , , , , , , , , , ,
Auteur(s) :
Edition(s) :

A faire ou à ne pas faire…

Pour répertorier et se rappeler ces mauvaises pratiques, je vous invite tout de même jeter un œil sur cet article.
Comprendre en 5 minutes les principes du thème drupal
Tout d’abord, il vaut mieux ne pas déplier son thème dans le répertoire usuel de publication. Pour résumer, cette prartique dans un dilemme simple et inquisiteur de ce qu’il faut faire ou pas. Schématiquement, le choix du répertoire pour votre thème est le suivant :
1. BON drupal >> sites >> all >> themes >> lenomdemontheme
2. PAS BON drupal >> themes

Dans le scénario « 1. BON », vous devrez créer le répertoire themes car il n’existe pas.

Créer un fichier .info

Dans un « theme » drupal 6.x, on va créer un fichier .info. Ce fichier recèle les informations indispensable au CMS Drupal sur la nature du thème et de son fonctionnement.

  • name, le nom, il s’agit du nom du thème (majuscule ou minuscule, avec ou sans accent)
  • description, une description un peu à la manières des themes wordpress
  • core, la version de drupal sur lequel cela marche
  • engine, très souvent « phtemplate », c’est devenu quasiment un standard
  • regions [left] = Left sidebar, il s’agit de la colonne de gauche de votre futur template. Vous disposez d’autres positions comme right, content, header, footer, content. En général, il en existe un certain nombre par défaut : right, content, header, footer.

Le découpage en regions

Ce découpage a pur but de vous permettre ultérieurement de faire appel à l’aide de la variable $left directement dans un fichier .tpl.php. Fichir dont on verra la création plus loin dans l’article.

Apres le découpage, où enfouir le .info

Il faut enregistrer ce fichier .infoavec le nom de votre thème lenomdemontheme.info

Un modèle de fichier .info

name = Un thème de plus dans l'univers
description = un magnifique thème multi colonne, inspiré par cobra, tout désigné pur un blog.
 screenshot = screenshot.png
core = 6.x
engine = phptemplate
regions[left] = Left sidebar
regions[right] = Right sidebar
regions[content] = Content
regions[header] = Header
regions[footer] = Footer

Vous pouvez ajouter une image dans ce même répertoire , c’est plus fun… La taille est de 150 pixels de large par 90 pixels de hauteur.
screenshot = screenshot.png

A NOTER : le fichier doit avoir le même nom que votre répertoire situé dans themes. Ainsi, on enregistrera le fichier au nom de lenomdemontheme.info dans le repertoire drupal >> sites >> all >> themes >> lenomdemontheme

Créer un fichier page.tpl.php

Il est certain que la création d’un fichier page.tpl.php dans Drupal 6.x est loin d’être une obligation mais c’est fortement recommandé car cela vous offre un contrôle sur votre thème. On se cantonnera pour créer ce fichier à un assortiment de xhtml/CSS, qui donnera l’apparence de votre site. Dans cette page, il n’ ya aura plus qu’à imprimer des variables Drupal à l’intérieur de la page.

Variables drupal ?

Pour mémoire, nous sommes dans le moteur phptemplate, ainsi donc on va pouvoir passer des « pseudo-variables » qui sont souvent la marque de fabrique et le propre des moteur de templates (template engine). Pour information, c’est une notion qui existe par exemple dans des frameworks comme CodeIgniter ou Smarty.

A la différence du CMS Drupal, dans CodeIgniter, il ne s’agit pas de véritables variables mais plus d’éléments en « plain text » facilement imprimables et manipulables. Éléments qui s’impriment dans les vues de votre site MVC. Cela élimine du même coup la complexité de PHP. On peut par exemple confier la construction de ces vues à un graphique même ou un intégrateur html.

Quelques exemples de variables Drupal

Quelques-unes de ces variables sont vraiment indispensables.

$head_title, le nom du site
$head, ce que contient la balise head du site
$styles, cette variable insère la feuille de style du site
$scripts, cette variable insère les scripts javascript du site
$closure, cette variable clôt les scripts exécutés dans votre thème Drupal. Il est vivement recommandé de la mettre avant </body>

Lire son template Drupal 6.x

Il existe 3 choses importantes dont il faut se souvenir pour analyser et constituer un thème Drupal.

Pour comprendre ce mode d’affichage de votre thème grâce au code ci-dessous, il faut lire « si il existe une $sidebar_left alors imprime le contenu de cette colonne de gauche définie dans notre fichier .info »

1. Affichage ou non – imprime le contenu de la colonne de gauche

<?php if ($left) { ?><div id="sidebar-left">
  <?php print $left ?>
</div><?php } ?>

2. le plat de résistance – imprime la variable $content
Cette variable va contenir le contenu principal de vos pages.

	<?php print $content ?>

3. rappel des autres variables importantes à faire figure dans votre fichier page.tpl.php

	<?php 
	print $messages;
	print $help;
	print $content;
	print $footer;
 
	// à faire figurer toujours en bas de votre template
	print $closure;
 
 
 
	?>

En gardant en mémoire ces 3 points, il vous faudra compléter votre thème afin. Là encore, deux façons de faire, vous pouvez lister toutes ces variables puis injecter votre code xhtml/css ou vous inspirer d’un thème existant pour isoler les variables.

NB : Un bon article sur les « must-have » d’un thème drupal.  » Anatomy of a Drupal 6 theme  »
http://drupal.org/node/171194

un exemple de code source du fichier page.tpl.php du thème ZEN

	<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
	<html xmlns="http://www.w3.org/1999/xhtml" lang="<?php print $language ?>" xml:lang="<?php print $language ?>">
 
	<head>
	  <title><?php print $head_title ?></title>
	  <?php print $head ?>
	  <?php print $styles ?>
	  <?php print $scripts ?>
	  <script type="text/javascript"><?php /* Needed to avoid Flash of Unstyle Content in IE */ ?> </script>
	</head>
 
	<body>
 
	<table border="0" cellpadding="0" cellspacing="0" id="header">
	  <tr>
	    <td id="logo">
	      <?php if ($logo) { ?><a href="<?php print $base_path ?>" title="<?php print t(&#x27;Home&#x27;) ?>"><img src="<?php print $logo ?>" alt="<?php print t(&#x27;Home&#x27;) ?>" /></a><?php } ?>
	      <?php if ($site_name) { ?><h1 class=&#x27;site-name&#x27;><a href="<?php print $base_path ?>" title="<?php print t(&#x27;Home&#x27;) ?>"><?php print $site_name ?></a></h1><?php } ?>
	      <?php if ($site_slogan) { ?><div class=&#x27;site-slogan&#x27;><?php print $site_slogan ?></div><?php } ?>
	    </td>
	    <td id="menu">
	      <?php if (isset($secondary_links)) { ?><?php print theme(&#x27;links&#x27;, $secondary_links, array(&#x27;class&#x27; =>&#x27;links&#x27;, &#x27;id&#x27; => &#x27;subnavlist&#x27;)) ?><?php } ?>
	      <?php if (isset($primary_links)) { ?><?php print theme(&#x27;links&#x27;, $primary_links, array(&#x27;class&#x27; =>&#x27;links&#x27;, &#x27;id&#x27; => &#x27;navlist&#x27;)) ?><?php } ?>
	      <?php print $search_box ?>
	    </td>
	  </tr>
	  <tr>
	    <td colspan="2"><div><?php print $header ?></div></td>
	  </tr>
	</table>
 
	<!-- to be continued -->
 
 
	<?php if ($closure_region): ?>
      <div id="closure-blocks"><?php print $closure_region; ?></div>
    <?php endif; ?>
 
    <?php print $closure; ?>
 
  </div></div> <!-- /#page-inner, /#page -->
 
</body>
</html><?php if ($closure_region): ?>

Créer un fichier CSS style.css

Il vous restera à créer un fichier CSS dans votre répertoire de thème pour peaufiner l’affichage. Pour information, voici un extrait de la css du thème zen

	/* $Id: zen.css,v 1.1.2.27 2008/09/14 09:28:14 johnalbin Exp $ */
 
	/*
	 * ZEN STYLES
	 *
	 * This is an example stylesheet. Sub-themes should NOT include the zen/zen.css
	 * file, but instead copy this CSS to their own stylesheets.
	 *
	 * In this stylesheet, we have included all of the classes and IDs from this
	 * theme's tpl.php files. We have also included many of the useful Drupal core
	 * styles to make it easier for theme developers to see them.
	 *
	 * Many of these styles are over-riding Drupal's core stylesheets, so if you
	 * remove a declaration from here, the styles may still not be what you want
	 * since Drupal's core stylesheets are still styling the element. See the
	 * drupal5-reference.css file for a list of all Drupal 5.x core styles.
	 *
	 * In addition to the style declarations in this file, other Drupal styles that
	 * you might want to override or augment are those for:
	 *
	 *   Book Navigation  See line 74  of Zen's drupal5-reference.css file
	 *   Forum            See line 197 of Zen's drupal5-reference.css file
	 *   Menus            See line 667 of Zen's drupal5-reference.css file
	 *   News Aggregator  See line 20  of Zen's drupal5-reference.css file
	 *   Polls            See line 287 of Zen's drupal5-reference.css file
	 *   Search           See line 320 of Zen's drupal5-reference.css file
	 *   User Profiles    See line 945 of Zen's drupal5-reference.css file
	 */
 
 
	/** body **/
	  body
	  {
	    margin: 0;
	    padding: 10px;
	  }
 
	  #page
	  {
	  }
 
	  #page-inner
	  {
	  }
 
	/** header **/
	  #header
	  {
	  }
 
	  #header-inner
	  {
	  }
 
	  #logo-title /* Wrapper for logo, website name, and slogan */
	  {
	  }
	/* to be continued */

Pour aller plus loin