"System_settings_form" est-il vaudou?


8

Un ami vient de me montrer system_settings_form en action dans un fichier de configuration pour un formulaire.

Le code en question ressemble à ceci (simplifié).

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 ajoute des boutons d'envoi et gère la soumission du formulaire, en enregistrant les variables. Il ajoute également un bouton "Réinitialiser par défaut" - qui réinitialise toutes les variables à la valeur par défaut.

J'ai essentiellement deviné ce qu'il faisait parce qu'il n'y avait pas beaucoup de documentation et mon ami ne savait pas exactement ce qu'il faisait non plus. Ma question est de savoir comment connaît-il les variables à enregistrer / réinitialiser? Ne suis-je pas en train de passer un tableau?

Y a-t-il également une autre magie dans system_settings_form que je devrais connaître?

Réponses:


14

Voir system_settings_form et system_settings_form_submit pour les détails d'implémentation. Dans Drupal 7, le bouton Réinitialiser par défaut est supprimé du formulaire Paramètres système.

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:

Ajouter le bouton Enregistrer la configuration de la soumission et soumettre le rappel à la fonction 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.'));
}

Itère tous les éléments du formulaire et définit des variables pour chaque élément du formulaire avec la clé comme clé d'élément de formulaire et la valeur comme valeur d'élément de formulaire soumise par l'utilisateur lue à l'aide de $ form_state ['values']

Donc, c'est juste un formulaire avec un gestionnaire de soumission qui définit des variables pour toutes les valeurs de formulaire à l'aide de la fonction variable_set.


5
Bonne explication. Si vous êtes confondu par "chaque élément de formulaire avec la clé comme clé d'élément de formulaire", ce qu'il veut dire, c'est que dans votre exemple ci-dessus, $ form ['super_secret_password'] fera que Drupal appellera variable_set ('super_secret_password', ...), car system_settings_form_submit prend le nom de la variable de la clé du tableau ('super_secret_password') de votre formulaire.
greg_1_anderson

1
C'est utile. Pourquoi api.drupal.org ne peut-il pas simplement expliquer ce qu'il fait en anglais simple. Au lieu de cela, il donne simplement le code ... Donc, en résumé, pas vaudou, juste en utilisant mes touches de champ.
Coomie

1
Je pense qu'il vaut la peine de noter que vous ne devriez pas l'utiliser pour stocker de grandes variables car il restera en mémoire pour chaque demande de page, qu'il y ait ou non un variable_get direct. Ils sont tous mis en cache une fois en mémoire. De plus, les gestionnaires de soumission et de validation réguliers fonctionneront sans problème. N'hésitez pas à les ajouter.
AyeshK
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.