Ist "system_settings_form" Voodoo?

8

Ein Freund hat mir gerade system_settings_form in Aktion in einer Konfigurationsdatei für ein Formular gezeigt.

Der betreffende Code sieht folgendermaßen aus (vereinfacht).

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 fügt Übermittlungsschaltflächen hinzu und behandelt die Formularübermittlung, wobei die Variablen gespeichert werden. Außerdem wird die Schaltfläche "Auf Standard zurücksetzen" hinzugefügt, mit der alle Variablen auf den Standardwert zurückgesetzt werden.

Ich habe im Grunde genommen erraten, was es tut, weil es nicht viele Dokumentationen gibt und mein Freund auch nicht genau weiß, was es tut. Meine Frage ist, woher es die Variablen kennt, die gespeichert / zurückgesetzt werden sollen. Übergebe ich nicht einfach ein Array?

Gibt es auch eine andere Magie in system_settings_form, über die ich Bescheid wissen sollte?

Coomie
quelle

Antworten:

14

Einzelheiten zur Implementierung finden Sie unter system_settings_form und system_settings_form_submit . In Drupal 7 wird die Schaltfläche Auf Standard zurücksetzen aus dem Formular Systemeinstellungen entfernt.

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:

Fügen Sie die Schaltfläche zum Speichern der Konfiguration von Add hinzu und senden Sie den Rückruf an die Funktion 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.'));
}

Durchläuft alle Formularelemente und legt Variablen für jedes Formularelement fest, wobei der Schlüssel als Formularelementschlüssel und der Wert als vom Benutzer übermittelter Formularelementwert mit $ form_state ['values'] gelesen werden.

Es handelt sich also nur um ein Formular mit Submit-Handler, das mithilfe der Funktion variable_set Variablen für alle Formularwerte festlegt.

Anil Sagar
quelle
5
Gute Erklärung. Wenn Sie durch "jedes Formularelement mit Schlüssel als Formularelementschlüssel" verwirrt sind, bedeutet dies, dass $ form ['super_secret_password'] in Ihrem obigen Beispiel Drupal veranlasst, variable_set ('super_secret_password', ...) aufzurufen. weil system_settings_form_submit den Namen der Variablen aus dem Array-Schlüssel ('super_secret_password') Ihres Formulars übernimmt.
Greg_1_anderson
1
Das ist hilfreich. Warum kann api.drupal.org nicht einfach erklären, was es in einfachem Englisch macht? Stattdessen gibt es nur den Code ... Also zusammenfassend nicht Voodoo, nur mit meinen Feldschlüsseln.
Coomie
1
Ich denke, es ist erwähnenswert, dass Sie dies nicht zum Speichern großer Variablen verwenden sollten, da es für jede Seitenanforderung im Speicher bleibt, unabhängig davon, ob es ein direktes variable_get dafür gab oder nicht. Sie werden alle einmal im Speicher zwischengespeichert. Regelmäßige Submit- und Validierungshandler funktionieren problemlos. Fühlen Sie sich frei, sie hinzuzufügen.
AyeshK