"System_settings_form" è voodoo?


8

Un amico mi ha appena mostrato system_settings_form in azione in un file di configurazione per un modulo.

Il codice in questione è simile al seguente (semplificato).

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 aggiunge i pulsanti di invio e gestisce l'invio del modulo, salvando le variabili. Aggiunge inoltre un pulsante "Ripristina predefiniti" che ripristina tutte le variabili sui valori predefiniti.

Fondamentalmente ho indovinato cosa fa perché non c'è molta documentazione là fuori e il mio amico non sa esattamente cosa faccia neanche. La mia domanda è: come conosce le variabili da salvare / ripristinare? Non sto solo passando un array?

Inoltre c'è qualche altra magia in system_settings_form che dovrei conoscere?

Risposte:


14

Vedi system_settings_form e system_settings_form_submit per i dettagli di implementazione. In Drupal 7 il pulsante Ripristina predefiniti viene rimosso dal modulo Impostazioni di sistema.

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:

Aggiungi la configurazione Salva pulsante Invia e invia callback alla funzione 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.'));
}

Scorre tutti gli elementi del modulo e imposta le variabili per ciascun elemento del modulo con chiave come elemento chiave e valore come valore dell'elemento modulo inviato dall'utente letto usando $ form_state ['valori']

Quindi, è solo un modulo con il gestore di invio che imposta le variabili per tutti i valori del modulo usando la funzione variabile_set.


5
Buona spiegazione Se sei confuso da "ogni elemento del modulo con chiave come chiave dell'elemento del modulo", ciò che significa è che nel tuo esempio sopra, $ form ['super_secret_password'] farà sì che Drupal chiamerà variabile_set ('super_secret_password', ...), perché system_settings_form_submit prende il nome della variabile dalla chiave dell'array ('super_secret_password') del modulo.
greg_1_anderson,

1
Questo è utile Perché api.drupal.org non può semplicemente spiegare cosa fa in parole povere. Invece dà solo il codice ... Quindi, in sintesi, non voodoo, solo usando i miei tasti di campo.
Coomie,

1
Penso che valga la pena notare che non dovresti usarlo per archiviare variabili di grandi dimensioni poiché rimarrà in memoria per ogni richiesta di pagina, indipendentemente dal fatto che ci sia o meno una variabile diretta. Tutti vengono memorizzati nella cache una volta nella memoria. Inoltre, i gestori di invio e convalida regolari funzioneranno senza problemi. Sentiti libero di aggiungerli.
AyeshK,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.