Czy „system_settings_form” jest voodoo?

8

Znajomy właśnie pokazał mi system_settings_form w akcji w pliku konfiguracyjnym formularza.

Kod, o którym mowa, wygląda tak (uproszczony).

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 dodaje przyciski przesyłania i obsługuje przesyłanie formularza, zapisując zmienne. Dodaje także przycisk „Resetuj do domyślnych” - który resetuje wszystkie zmienne do domyślnych.

Zasadniczo zgadłem, co robi, ponieważ nie ma tam zbyt wiele dokumentacji, a mój przyjaciel też nie wie dokładnie, co robi. Moje pytanie brzmi: skąd zna zmienne do zapisania / zresetowania? Czy po prostu nie przekazuję tablicy?

Czy jest jeszcze jakaś inna magia w system_settings_form, o której powinienem wiedzieć?

Coomie
źródło

Odpowiedzi:

14

Zobacz szczegóły dotyczące implementacji system_settings_form i system_settings_form_submit . W Drupal 7 przycisk Reset to Default jest usuwany z formularza System Settings.

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_settings_form:

Dodaj Zapisz Zapisz przycisk Prześlij i prześlij wywołanie zwrotne do funkcji 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.'));
}

Iteruje przez wszystkie elementy formularza i ustawia zmienne dla każdego elementu formularza z kluczem jako kluczem elementu i wartością jako odczytaną przez użytkownika wartość elementu formularza odczytaną za pomocą $ form_state ['wartości']

Jest to tylko formularz z modułem obsługi przesyłania, który ustawia zmienne dla wszystkich wartości formularza za pomocą funkcji zmienna_zestaw.

Anil Sagar
źródło
5
Dobre wytłumaczenie. Jeśli jesteś zdezorientowany przez „każdy element formularza z kluczem jako klucz elementu formularza”, oznacza to, że w powyższym przykładzie $ form [„super_seret_hasło”] spowoduje, że Drupal wywoła zestaw zmiennych („super_seret_hasło”, ...), ponieważ system_settings_form_submit pobiera nazwę zmiennej z klucza tablicy („super_secret_password”) formularza.
greg_1_anderson
1
To jest pomocne. Dlaczego api.drupal.org nie może po prostu wyjaśnić, co robi w prostym języku angielskim. Zamiast tego po prostu podaje kod ... Podsumowując, nie voodoo, tylko używając moich kluczy pól.
Coomie
1
Myślę, że warto zauważyć, że nie należy tego używać do przechowywania dużych zmiennych, ponieważ pozostaną one w pamięci dla każdego żądania strony, bez względu na to, czy był do tego bezpośredni_zmiennik. Wszystkie są buforowane raz w pamięci. Regularne przesyłanie i sprawdzanie procedur obsługi będzie działać bez problemu. Możesz je dodać.
AyeshK