Bagaimana cara mengirim data di antara kait yang tidak berinteraksi?

10

Bagaimana cara mengirim data di antara kait yang tidak berinteraksi di antara mereka, atau antara panggilan balik menu dan sebuah kait?

Dalam kasus kedua kait memiliki parameter yang sama, dan parameter tersebut dilewatkan dengan referensi, itu mudah. Apa yang saya lakukan ketika kait, atau menu panggilan balik dan kait, tidak mendapatkan parameter umum?

Letharion
sumber

Jawaban:

12

Dalam Drupal 7, atau lebih tinggi, gunakan variabel statis yang ditangani dengan drupal_static () .
drupal_static()adalah fungsi yang menangani penyimpanan pusat untuk variabel statis. Berbeda dari variabel yang dideklarasikan menggunakan statickata kunci, variabel statis yang ditangani drupal_static()dapat diakses dari setiap fungsi; ini dimungkinkan karena drupal_static()mengembalikan konten variabel dengan referensi, memungkinkan setiap fungsi mengubahnya.

Misalkan Anda perlu memberikan nilai antara penangan menu, dan implementasi hook_block_view () ; Anda bisa menggunakan kode berikut.

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.
}

Dalam hal data perlu diakses lebih sering, Anda harus menggunakan variabel lokal statis yang akan berisi nilai yang dikembalikan drupal_static(). Karena variabel statis hanya dapat diinisialisasi dari nilai literal , dan variabel statis tidak dapat ditetapkan ke referensi , satu-satunya kode yang bekerja mirip dengan yang berikut. (Kode ini diambil dari 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'];

Nilai yang dikembalikan dari drupal_static()diset ulang setiap kali bootstrap Drupal; jika Anda membutuhkan nilai yang disimpan antara halaman yang berbeda, maka Anda perlu menggunakan tabel database untuk menyimpan nilai, atau menggunakan variabel_get () / variable_set () .

Drupal 6 tidak menerapkan drupal_static(), tetapi Anda dapat menyalin kodenya dalam fungsi yang didefinisikan dalam modul Anda sendiri.

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;
}

Sebelum menggunakan variabel statis dengan drupal_static()(atau fungsi porting belakang didefinisikan dalam modul Anda), Anda harus mempertimbangkan hal-hal berikut:

  • Kode hanya berfungsi ketika kode yang mengatur variabel statis berjalan sebelum kode untuk mendapatkan nilainya; jika perintah eksekusi bukan yang dipikirkan, kode tidak berfungsi. Ketika urutan eksekusi tidak didefinisikan secara jelas dalam dokumentasi Drupal, ada risiko urutan perubahan dalam versi Drupal yang akan datang; periksa perintah eksekusi tidak berubah dalam versi Drupal yang Anda gunakan untuk menerapkan kode Anda.
  • Drupal bisa menerapkan mekanisme untuk berbagi data di antara kait yang berbeda. Misalnya, dalam kasus implementasi yang berbeda dari hook_form_alter () , setiap implementasi dapat berbagi data dengan hook_form_alter()implementasi lainnya menggunakan $form_state; dengan cara yang sama, form handler validasi, dan handler form submission, dapat berbagi data menggunakan $form_stateparameter yang dilewatkan oleh referensi. Sebelum menerapkan kode Anda sendiri, verifikasi dimungkinkan untuk berbagi data menggunakan mekanisme berbeda yang sudah diterapkan oleh Drupal untuk kasus tertentu.
kiamlaluno
sumber
Sangat menghargai jawaban yang diberikan di sini untuk poster aslinya. Namun kekhawatiran saya adalah bahwa saya diberitahu bahwa menggunakan variabel statis drupal tidak skala dengan sangat baik - untuk situs yang menangani banyak permintaan, karena fakta bahwa seluruh rangkaian variabel dimuat setiap kali, untuk setiap sesi (atau sesuatu seperti itu.) Saya diberitahu ini oleh seorang kolega yang telah mengerjakan masalah kinerja yang terkait dengan ini. Bagaimana menurut anda? Mereka menyarankan bahwa menggunakan cache Drupal akan menjadi cara yang lebih baik untuk melewati variabel (dengan asumsi mereka tidak diperlukan setelah data telah diterima oleh kode tujuan)
therobyouknow
@therobyouknow "untuk situs yang menangani banyak permintaan, karena fakta bahwa seluruh rangkaian variabel dimuat setiap kali" itulah tabel variabel , dan bukan variabel statis, yang merupakan hal yang sama sekali berbeda. variabel statis sendiri memiliki dampak kinerja yang dapat diabaikan. Bahkan dalam tabel variabel, Anda harus banyak menyalahgunakan sistem untuk menyebabkan masalah. Economist.com dapat dengan mudah memiliki beberapa klik 100 ribu dalam satu jam, yang semuanya memuat tabel variabel. Variabel bukan masalah, tetapi tentu saja, kami hanya menyimpan informasi kecil di setiap variabel.
Letharion