En Drupal 7, o superior, use una variable estática manejada con drupal_static () .
drupal_static()
es una función que maneja un almacenamiento central para variables estáticas. A diferencia de las variables declaradas usando la static
palabra clave, las variables estáticas manejadas con drupal_static()
son accesibles desde cada función; Esto es posible porque drupal_static()
devuelve el contenido de la variable por referencia, permitiendo que cada función lo altere.
Suponga que necesita pasar un valor entre un controlador de menú y la implementación de hook_block_view () ; podrías usar el siguiente código.
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.
}
En el caso de que sea necesario acceder a los datos con mayor frecuencia, debe usar una variable local estática que contendría el valor devuelto drupal_static()
. Como variables estáticas sólo pueden ser inicializadas de valor literal y variables estáticas no se pueden asignar a las referencias , el código sólo de trabajo es similar a la siguiente. (Este código está tomado 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'];
El valor devuelto desde drupal_static()
se restablece cada vez que Drupal arranca; Si necesita un valor que se conserve entre diferentes páginas, debe usar una tabla de base de datos para almacenar el valor, o usar variable_get () / variable_set () .
Drupal 6 no se implementa drupal_static()
, pero puede copiar su código en una función definida en su propio módulo.
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;
}
Antes de usar una variable estática con drupal_static()
(o la función portada definida en su módulo), debe tener en cuenta estas consideraciones:
- El código funciona solo cuando el código que establece la variable estática se ejecuta antes que el código para obtener su valor; Si el orden de ejecución no es el pensado, el código no funciona. Cuando el orden de ejecución no está claramente definido en la documentación de Drupal, existe el riesgo de que el orden cambie en futuras versiones de Drupal; compruebe que el orden de ejecución no cambia en la versión de Drupal para la que está implementando su código.
- Drupal podría haber implementado un mecanismo para compartir datos entre diferentes ganchos. Por ejemplo, en el caso de diferentes implementaciones de hook_form_alter () , cada implementación puede compartir datos con otras
hook_form_alter()
implementaciones usando $form_state
; del mismo modo, los controladores de validación de formularios y los controladores de envío de formularios pueden compartir datos utilizando el $form_state
parámetro que se pasa por referencia. Antes de implementar su propio código, verifique que sea posible compartir datos utilizando un mecanismo diferente ya implementado por Drupal para el caso específico.