답변:
Drupal 7 이상에서는 drupal_static ()으로 처리되는 정적 변수를 사용하십시오 .
drupal_static()
정적 변수에 대한 중앙 저장소를 처리하는 함수입니다. static
키워드를 사용하여 선언 된 변수와 달리 처리 된 정적 변수 drupal_static()
는 모든 함수에서 액세스 할 수 있습니다. 이것은 drupal_static()
변수의 내용을 참조로 반환하여 모든 함수가 변수를 변경할 수 있기 때문에 가능 합니다.
메뉴 핸들러와 hook_block_view () 구현 사이에 값을 전달해야한다고 가정하십시오 . 다음 코드를 사용할 수 있습니다.
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.
}
데이터에 더 자주 액세스해야하는 경우에서 반환 된 값을 포함하는 정적 로컬 변수를 사용해야합니다 drupal_static()
. 으로 정적 변수 만 리터럴 값에서 초기화 할 수 있습니다 , 그리고 정적 변수가 참조에 할당 할 수 없습니다 유일한 작업 코드는 다음 중 하나와 유사하다. (이 코드는 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'];
에서 반환 된 값 drupal_static()
은 Drupal이 부트 스트랩 할 때마다 재설정됩니다. 다른 페이지간에 유지되는 값이 필요한 경우 데이터베이스 테이블을 사용하여 값을 저장하거나 variable_get () / variable_set ()을 사용해야 합니다 .
Drupal 6은을 구현하지 않지만 drupal_static()
자신의 모듈에 정의 된 함수로 코드를 복사 할 수 있습니다.
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;
}
정적 변수 drupal_static()
(또는 모듈에 정의 된 후면 포트 함수)를 사용하기 전에 다음 사항을 고려해야합니다.
hook_form_alter()
사용하여 다른 구현 과 데이터를 공유 할 수 있습니다 $form_state
. 동일한 방식으로 양식 유효성 검증 핸들러 및 양식 제출 핸들러 $form_state
는 참조로 전달되는 매개 변수를 사용하여 데이터를 공유 할 수 있습니다 . 자체 코드를 구현하기 전에 Drupal이 특정 사례에 대해 이미 구현 한 다른 메커니즘을 사용하여 데이터를 공유 할 수 있는지 확인하십시오.