Dans Drupal 7 ou supérieur, utilisez une variable statique gérée avec drupal_static () .
drupal_static()
est une fonction qui gère un stockage central pour les variables statiques. Différemment des variables déclarées à l'aide du static
mot - clé, les variables statiques gérées avec drupal_static()
sont accessibles depuis toutes les fonctions; cela est possible car drupal_static()
renvoie le contenu de la variable par référence, permettant à chaque fonction de le modifier.
Supposons que vous devez passer une valeur entre un gestionnaire de menus et l'implémentation de hook_block_view () ; vous pouvez utiliser le code suivant.
function mymodule_menu() {
return array('path/%' => array(
'page callback' => 'mymodule_callback_function',
'page arguments' => array(1),
));
}
function mymodule_callback_function($data) {
$data_passer = &drupal_static('mymodule_block_data');
$data_passer = $data;
// Other logic specific to this page callback.
}
function mymodule_block_view($delta = '') {
// $data_passer will now contain the value of $data, from above.
$data_passer = &drupal_static('mymodule_block_data');
// Change the block content basing on the content of $data_passer.
}
Dans le cas où les données doivent être consultées plus fréquemment, vous devez utiliser une variable locale statique qui contiendrait la valeur renvoyée par drupal_static()
. Comme les variables statiques ne peuvent être initialisées qu'à partir de la valeur littérale et que les variables statiques ne peuvent pas être affectées à des références , le seul code de travail est similaire au suivant. (Ce code est extrait de user_access () .)
// Use the advanced drupal_static() pattern, since this is called very often.
static $drupal_static_fast;
if (!isset($drupal_static_fast)) {
$drupal_static_fast['perm'] = &drupal_static(__FUNCTION__);
}
$perm = &$drupal_static_fast['perm'];
La valeur renvoyée par drupal_static()
est réinitialisée à chaque démarrage de Drupal; si vous avez besoin d'une valeur qui est conservée entre différentes pages, vous devez utiliser une table de base de données pour stocker la valeur, ou utiliser variable_get () / variable_set () .
Drupal 6 n'est pas implémenté drupal_static()
, mais vous pouvez copier son code dans une fonction définie dans votre propre module.
function &mymodule_static($name, $default_value = NULL, $reset = FALSE) {
static $data = array(), $default = array();
// First check if dealing with a previously defined static variable.
if (isset($data[$name]) || array_key_exists($name, $data)) {
// Non-NULL $name and both $data[$name] and $default[$name] statics exist.
if ($reset) {
// Reset pre-existing static variable to its default value.
$data[$name] = $default[$name];
}
return $data[$name];
}
// Neither $data[$name] nor $default[$name] static variables exist.
if (isset($name)) {
if ($reset) {
// Reset was called before a default is set and yet a variable must be
// returned.
return $data;
}
// First call with new non-NULL $name. Initialize a new static variable.
$default[$name] = $data[$name] = $default_value;
return $data[$name];
}
// Reset all: ($name == NULL). This needs to be done one at a time so that
// references returned by earlier invocations of drupal_static() also get
// reset.
foreach ($default as $name => $value) {
$data[$name] = $value;
}
// As the function returns a reference, the return should always be a
// variable.
return $data;
}
Avant d'utiliser une variable statique avec drupal_static()
(ou la fonction de portage arrière définie dans votre module), vous devez garder ces considérations à l'esprit:
- Le code ne fonctionne que lorsque le code qui définit la variable statique s'exécute avant le code pour obtenir sa valeur; si l'ordre d'exécution n'est pas celui de la pensée, le code ne fonctionne pas. Lorsque l'ordre d'exécution n'est pas clairement défini dans la documentation Drupal, il y a un risque que l'ordre change dans les futures versions de Drupal; vérifiez que l'ordre d'exécution ne change pas dans la version Drupal pour laquelle vous implémentez votre code.
- Drupal aurait pu mettre en place un mécanisme pour partager des données entre différents hooks. Par exemple, dans le cas de différentes implémentations de hook_form_alter () , chaque implémentation peut partager des données avec d'autres
hook_form_alter()
implémentations en utilisant $form_state
; de la même manière, les gestionnaires de validation de formulaire et les gestionnaires de soumission de formulaire peuvent partager des données à l'aide du $form_state
paramètre transmis par référence. Avant d'implémenter votre propre code, vérifiez qu'il est possible de partager des données en utilisant un mécanisme différent déjà implémenté par Drupal pour le cas spécifique.