Voilà, voilà... Fin de l'aventure...

 

Fermeture de kolossaldrupal.org dans...


Bonjour tout le monde,

Drupal évolue, les versions changent et Kolossaldrupal.org était essentiellement consacré à la version 6 de Drupal.

Autant dire que les infos présentées ici commencent à dater...

Faute de temps, je ne peux plus garder le site Kolossaldrupal à jour...

Je vous aurais bien proposé de reprendre le flambeau mais... c'est tellement simple de nos jours de se faire son propre site à soi...Pourquoi s'embêter alors ? :-)

Ce site restera donc en l'état, tel qu'il était en 2011...

Ah la la ! Cela ne nous rajeunit pas !

Manuel Vila - Avril 2016

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 == 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
}
?>