Apakah "system_settings_form" voodoo?

8

Seorang teman baru saja menunjukkan kepada saya system_settings_form beraksi dalam file konfigurasi untuk formulir.

Kode yang dimaksud terlihat seperti ini (disederhanakan).

function my_module_generateAdminForm($form){
  $form = array();
  $form['super_secret_password'] = array(
    '#type' => 'textfield',
    '#title' => t('Headline'),
    '#default_value' => variable_get('super_secret_password','password'),
  );
  system_settings_form($form);
}

system_settings_form menambahkan tombol kirim dan menangani pengiriman formulir, menyimpan variabel. Itu juga menambahkan tombol "Reset ke default" - yang me-reset semua variabel ke default.

Saya pada dasarnya menebak apa yang dilakukannya karena tidak ada banyak dokumentasi di luar sana dan teman saya juga tidak tahu persis apa fungsinya. Pertanyaan saya adalah bagaimana cara mengetahui variabel yang akan disimpan / direset? Bukankah saya hanya melewatkan array?

Juga ada sihir lain di system_settings_form yang harus saya ketahui?

Coomie
sumber

Jawaban:

14

Lihat system_settings_form dan system_settings_form_submit untuk detail implementasi. Di Drupal 7 tombol Reset ke Default dihapus dari formulir Pengaturan Sistem.

function system_settings_form($form) {
  $form['actions']['#type'] = 'actions';
  $form['actions']['submit'] = array(
    '#type' => 'submit',
    '#value' => t('Save configuration'),
  );

  if (!empty($_POST) && form_get_errors()) {
    drupal_set_message(t('The settings have not been saved because of the errors.'), 'error');
  }
  $form['#submit'][] = 'system_settings_form_submit';
  // By default, render the form using theme_system_settings_form().
  if (!isset($form['#theme'])) {
    $form['#theme'] = 'system_settings_form';
  }
  return $form;
}

Bentuk System_settings:

Tambahkan tombol simpan konfigurasi Kirim dan kirim kembali ke fungsi system_settings_form_submit.

system_settings_form_submit:

function system_settings_form_submit($form, &$form_state) {
  // Exclude unnecessary elements.
  form_state_values_clean($form_state);

  foreach ($form_state['values'] as $key => $value) {
    if (is_array($value) && isset($form_state['values']['array_filter'])) {
      $value = array_keys(array_filter($value));
    }
    variable_set($key, $value);
  }

  drupal_set_message(t('The configuration options have been saved.'));
}

Iterasi melalui semua elemen formulir dan set variabel untuk setiap elemen formulir dengan kunci sebagai kunci elemen formulir dan nilai sebagai nilai elemen formulir yang dikirimkan pengguna dibaca menggunakan $ form_state ['values']

Jadi, itu hanya formulir dengan menyerahkan penangan yang menetapkan variabel untuk semua nilai formulir menggunakan fungsi variable_set.

Anil Sagar
sumber
5
Penjelasan yang bagus. Jika Anda bingung oleh "setiap elemen formulir dengan kunci sebagai kunci elemen formulir", yang ia maksudkan adalah bahwa dalam contoh Anda di atas, $ form ['super_secret_password'] akan menyebabkan Drupal memanggil variabel_set ('super_secret_password', ...), karena system_settings_form_submit mengambil nama variabel dari kunci array ('super_secret_password') dari formulir Anda.
greg_1_anderson
1
Ini sangat membantu. Mengapa api.drupal.org tidak bisa menjelaskan apa yang dilakukannya dalam bahasa Inggris. Sebaliknya itu hanya memberikan kode ... Jadi dalam ringkasan bukan voodoo, cukup gunakan kunci bidang saya.
Coomie
1
Saya pikir perlu dicatat bahwa Anda tidak boleh menggunakan ini untuk menyimpan variabel besar karena akan tetap ada di memori untuk setiap permintaan halaman tidak peduli ada variabel_get langsung untuk itu atau tidak. Mereka semua di-cache sekali dalam memori. Juga, penangan yang sah dan validasi penangan akan bekerja tanpa masalah. Jangan ragu untuk menambahkannya.
AyeshK