¿Es "system_settings_form" vudú?

8

Un amigo me mostró system_settings_form en acción en un archivo de configuración para un formulario.

El código en cuestión se ve así (simplificado).

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 agrega botones de envío y maneja el envío del formulario, guardando las variables. También agrega un botón "Restablecer valores predeterminados", que restablece todas las variables a sus valores predeterminados.

Básicamente adiviné lo que hace porque no hay mucha documentación y mi amigo tampoco sabe exactamente qué hace. Mi pregunta es ¿cómo sabe las variables para guardar / restablecer? ¿No estoy pasando una matriz?

¿También hay alguna otra magia en system_settings_form que deba conocer?

Coomie
fuente

Respuestas:

14

Consulte system_settings_form y system_settings_form_submit para obtener detalles sobre la implementación. En Drupal 7, el botón Restablecer a valores predeterminados se elimina del formulario Configuración del 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:

Agregue el botón Enviar configuración de guardar y envíe la devolución de llamada a 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.'));
}

Itera a través de todos los elementos de formulario y establece variables para cada elemento de formulario con clave como clave de elemento de formulario y valor como valor de elemento de formulario enviado por el usuario leído usando $ form_state ['values']

Por lo tanto, es solo un formulario con un controlador de envío que establece variables para todos los valores del formulario utilizando la función variable_set.

Anil Sagar
fuente
55
Buena explicación. Si está confundido con "cada elemento de formulario con clave como clave de elemento de formulario", lo que quiere decir es que en su ejemplo anterior, $ form ['super_secret_password'] hará que Drupal llame a variable_set ('super_secret_password', ...), porque system_settings_form_submit toma el nombre de la variable de la clave de matriz ('super_secret_password') de su formulario.
greg_1_anderson
1
Esto es de ayuda. ¿Por qué no puede api.drupal.org simplemente explicar lo que hace en inglés simple? En cambio, solo da el código ... Entonces, en resumen, no es vudú, solo uso mis teclas de campo.
Coomie
1
Creo que vale la pena señalar que no debe usar esto para almacenar grandes variables, ya que permanecerá en la memoria para cada solicitud de página, sin importar que haya una variable_get directa para ello o no. Todos se almacenan en caché una vez en la memoria. Además, los controladores de envío y validación regulares funcionarán sin problemas. Siéntase libre de agregarlos.
AyeshK