Có phải system system_sinstall_form, voodoo không?


8

Một người bạn chỉ cho tôi system_sinstall_form hoạt động trong một tệp cấu hình cho một biểu mẫu.

Mã trong câu hỏi trông như thế này (đơn giản hóa).

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_sinstall_form thêm vào các nút gửi và xử lý việc gửi biểu mẫu, lưu các biến. Nó cũng thêm nút "Đặt lại về mặc định" - đặt lại tất cả các biến về mặc định.

Về cơ bản tôi đã đoán được nó làm gì vì không có nhiều tài liệu ngoài đó và bạn tôi không biết chính xác nó làm gì. Câu hỏi của tôi là làm thế nào để nó biết các biến để lưu / thiết lập lại? Không phải tôi vừa đi qua một mảng sao?

Ngoài ra còn có phép thuật nào khác trong system_sinstall_form mà tôi nên biết không?

Câu trả lời:


14

Xem system_sinstall_formsystem_sinstall_form_submit để biết chi tiết triển khai. Trong nút Drupal 7 Đặt lại về Mặc định được xóa khỏi biểu mẫu Cài đặt hệ thống.

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

System_sinstall_form:

Thêm nút gửi cấu hình lưu và gửi gọi lại cho hàm system_sinstall_form_submit.

system_sinstall_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.'));
}

Lặp lại thông qua tất cả các phần tử biểu mẫu và đặt các biến cho từng phần tử biểu mẫu với khóa là khóa phần tử biểu mẫu và giá trị dưới dạng giá trị phần tử biểu mẫu do người dùng gửi bằng cách sử dụng $ form_state ['value']

Vì vậy, nó chỉ là một biểu mẫu với trình xử lý trình đặt các biến cho tất cả các giá trị của biểu mẫu bằng hàm biến_set.


5
Lời giải thích hay. Nếu bạn bị nhầm lẫn bởi "mỗi phần tử biểu mẫu có khóa là khóa phần tử biểu mẫu", ý nghĩa của nó là trong ví dụ của bạn ở trên, $ form ['super_secret_password'] sẽ khiến Drupal gọi biến_set ('super_secret_password', ...), bởi vì system_sinstall_form_submit lấy tên của biến từ khóa mảng ('super_secret_password') trong biểu mẫu của bạn.
greg_1_anderson

1
Điều này rất hữu ích. Tại sao api.drupal.org không thể giải thích những gì nó làm bằng tiếng Anh. Thay vào đó, nó chỉ cung cấp mã ... Vì vậy, tóm lại không phải là voodoo, chỉ sử dụng các khóa trường của tôi.
Coomie

1
Tôi nghĩ rằng đáng lưu ý rằng bạn không nên sử dụng điều này để lưu trữ các biến lớn vì nó sẽ lưu trong bộ nhớ cho mọi yêu cầu trang bất kể có biến trực tiếp_get cho nó hay không. Tất cả đều được lưu trữ một lần trong bộ nhớ. Ngoài ra, trình xử lý thường xuyên gửi và xác nhận sẽ làm việc mà không có vấn đề. Hãy thêm chúng vào.
AyeshK
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.