¿Cómo paso datos entre ganchos que no interactúan?


10

¿Cómo paso datos entre ganchos que no interactúan entre ellos, o entre una devolución de llamada de menú y un gancho?

En el caso de que los dos ganchos tengan un parámetro en común, y ese parámetro se pasa por referencia, eso es fácil. ¿Qué hago cuando los ganchos, o la devolución de llamada del menú y el gancho, no obtienen un parámetro común?

Respuestas:


12

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 staticpalabra 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_statepará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.

Realmente aprecio la respuesta dada aquí para el póster original. Sin embargo, mi preocupación es que me dicen que el uso de variables estáticas de drupal no se escala muy bien, para sitios que manejan muchas solicitudes, debido al hecho de que todo el conjunto de variables se carga cada vez, para cada sesión (o algo así como eso.) Me lo dijo un colega que había estado trabajando en un problema de rendimiento relacionado con esto. ¿Qué piensas? Aconsejaron que usar el caché de Drupal sería una mejor manera de pasar las variables (suponiendo que no sean necesarias después de que el código de destino haya recibido los datos)
therobyouknow

@therobyouknow "para sitios que manejan muchas solicitudes, debido al hecho de que todo el conjunto de variables se carga cada vez", esa es la tabla de variables , y no ninguna variable estática, que es algo completamente diferente. Las variables estáticas tienen un impacto insignificante en el rendimiento. Incluso en la tabla de variables, tendrías que abusar mucho del sistema para causar problemas. Economist.com puede tener fácilmente varios 100k hits en una hora, todos los cuales cargan la tabla de variables. Las variables no son un problema, pero por supuesto, solo almacenamos pequeñas piezas de información en cada variable.
Letharion
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.