W Drupal 7 lub nowszym użyj zmiennej statycznej obsługiwanej przez drupal_static () .
drupal_static()
jest funkcją, która obsługuje centralne przechowywanie zmiennych statycznych. W odróżnieniu od zmiennych zadeklarowanych za pomocą static
słowa kluczowego obsługiwane zmienne statyczne drupal_static()
są dostępne z każdej funkcji; jest to możliwe, ponieważ drupal_static()
zwraca treść zmiennej przez odwołanie, umożliwiając każdej funkcji jej zmianę.
Załóżmy, że trzeba przekazać wartość między obsługi menu, a następnie wdrożenie hook_block_view () ; możesz użyć następującego kodu.
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.
}
W przypadku, gdy dane wymagają częstszego dostępu, należy użyć statycznej zmiennej lokalnej, która zawierałaby zwracaną wartość drupal_static()
. Ponieważ zmienne statyczne można inicjalizować tylko z wartości literalnej , a zmiennych statycznych nie można przypisywać do odwołań , jedyny działający kod jest podobny do następującego. (Ten kod pochodzi z 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'];
Wartość zwracana z drupal_static()
jest resetowana za każdym razem, gdy ładuje się Drupal; jeśli potrzebujesz wartości, która jest zachowywana między różnymi stronami, musisz użyć tabeli bazy danych do przechowywania wartości lub użyj zmiennej_get () / zmienna_zestaw () .
Drupal 6 nie implementuje drupal_static()
, ale możesz skopiować jego kod w funkcji zdefiniowanej we własnym 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;
}
Przed użyciem zmiennej statycznej z drupal_static()
(lub funkcją cofnięcia portu zdefiniowaną w module) należy pamiętać o następujących kwestiach:
- Kod działa tylko wtedy, gdy kod ustawiający zmienną statyczną działa przed kodem, aby uzyskać jego wartość; jeśli kolejność wykonywania nie jest myśląca, kod nie działa. Gdy kolejność wykonywania nie jest jasno zdefiniowana w dokumentacji Drupala, istnieje ryzyko, że kolejność zmieni się w przyszłych wersjach Drupala; sprawdź, czy kolejność wykonywania nie zmienia się w wersji Drupal, dla której implementujesz swój kod.
- Drupal mógł wdrożyć mechanizm współdzielenia danych między różnymi zaczepami. Na przykład, w przypadku różnych implementacji hook_form_alter () , każda implementacja może współdzielić dane z innymi
hook_form_alter()
implementacjami za pomocą $form_state
; w ten sam sposób procedury obsługi sprawdzania poprawności formularzy i procedury obsługi przesyłania formularzy mogą udostępniać dane przy użyciu $form_state
parametru przekazywanego przez odwołanie. Przed wdrożeniem własnego kodu sprawdź, czy możliwe jest udostępnianie danych przy użyciu innego mechanizmu już wdrożonego przez Drupal w konkretnym przypadku.