Emuler les fonctions de pré-traitement de thème dans Drupal 5
Date du document en anglais : 22 Avril 2010 - 22h44 - http://drupal.org/node/201587
Drupal 6 a apporté le concept des fonctions de pré-traitement de thèmes. En résumé, ces fonctions permettent aux thèmes, aux moteurs de thèmes, et même aux modules de s'insérer dans le traitement du thème et de manipuler les variables envoyées aux thèmes. Cela remplace la vieille fonction _phptemplate_variables() du moteur de thème de Drupal 5 tout en effectuant le même travail.
Bien que nous ne puissions importer cette nouvelle fonctionnalité dans Drupal 5, il est possible de simplifier _phptemplate_variables() pour qu'elle ressemble à ce qui se fait dans Drupal 6. Plus précisément, nous pouvons diviser _phptemplate_variables()en plusieurs fonctions qui agiront comme les fonctions de pré-traitement de thème de Drupal 6.
Pour obtenir cette simplification, spécifiez la fonction _phptemplate_variables() dans le fichier template.php comme ceci :
<?php
function _phptemplate_variables($hook, $vars) {
$function = 'phptemplate_preprocess_'. str_replace('-', '_', $hook);
if (function_exists($function)) {
$function($vars);
}
return $vars;
}
?>
En premier lieu, nous nous assurons que le theme hook est d'un format pouvant être utilisé comme une partie de nom de fonction, et nous construisons son nom comme il sera appelé par la fonction de pré-traitement. Puis, s'il existe, nous l'appelons avec le tableau $vars. Vous remarquerez la fonction de pré-traitement ne retourne pas de valeur. A la place nous passons le paramètre par référence, comme ceci :
<?php
function phptemplate_preprocess_page(&$vars) {
// Manipulate the $vars array here.
}
?>
Dans le thème, nous pouvons maintenant manipuler n'importe quelle variable du fichier gabarit, ajouter, enlever ou modifier les variables envoyées au gabarit juste en déclarant la fonction adéquate. Bien que cela ne nous apporte aucune nouvelle fonctionnalité, cela reste plus facile à lire et à actualiser qu'une énorme instruction switch, et cela facilitera également une migration ultérieure vers Drupal 6.
Des fichiers variables distincts lorsque la fonction de thème devient ingérable
Lorsque la fonction de gabarit grossit au point de devenir ingérable, on peut la séparer en plusieurs fichiers variable :
<?php
/**
* Intercept template variables
*
* @param $hook
* The name of the theme function being executed
* @param $vars
* A sequential array of variables passed to the theme function.
*/
function _phptemplate_variables($hook, $vars = array()) {
global $user;
$vars['user'] = $user;
$vars['path'] = base_path() . path_to_theme() .'/';
$vars['admin'] = $user->roles[3] || $user->uid == 1 ? TRUE : FALSE;
$vars['moderator'] = $user->roles[4] ? TRUE : FALSE;
$vars['editor'] = $user->roles[5] ? TRUE : FALSE;
$vars['authenticated'] = $user->uid ? TRUE : FALSE;
$vars['theme'] = 'my_theme_name';
// Include broad variables for each hook.
if (file_exists($vars['directory'] .'/'. $hook .'.vars.php')) {
include_once $vars['directory'] .'/'. $hook .'.vars.php';
$function = $vars['theme'] .'_variables_'. str_replace('-', '_', $hook);
$vars = $function($vars);
}
// Specific variables for node types.
if ($hook == 'node') {
if (file_exists($vars['directory'] .'/node-'. $vars['node']->type .'.vars.php')) {
include_once $vars['directory'] .'/node-'. $vars['node']->type .'.vars.php';
$function = $vars['theme'] .'_variables_node_'. $vars['node']->type;
$vars = $function($vars);
}
}
return $vars;
}
?>
Autres améliorations
Ajoutons-lui une commodité supplémentaire :
<?php
function phptemplate_preprocess_node(&$vars) {
$node = $vars['node'];
$type = $node->type;
// general node variables processing
// preprocess by node type
if (function_exists($function = "phptemplate_preprocess_node_$type")) {
$function($node, $vars);
}
}
?>
ce qui nous donne une fonction de pré-traitement différente par type de node, par exemple :
<?php
function phptemplate_preprocess_node_story($node, &$vars) {
// specific story variable processing
}
?>
- Version imprimable
- 5923 lectures
-

Commentaires
Poster un nouveau commentaire