¿Cómo uso una devolución de llamada de envío en un formulario de configuración de administrador de Drupal?

14

Estoy usando este código para hacer mi formulario de administrador:

function custom_orders_admin(){
  $form = array();

  $form['custom_ignore_terms']['ignore_terms'] = array(
    '#type' => 'checkboxes',
    '#title' => t('Don\'t display these'),
    '#default_value' => variable_get('custom_ignore_terms', array()),
    '#options' => drupal_map_assoc($termTypes),
    '#description' => t("Choose the terms you do not want displayed."),
    '#required' => FALSE,
  );

  return system_settings_form($form);
}

Pero noto que si hago esto:

function custom_orders_admin_submit($form, &$form_state) {
  exit(var_dump($form_state));
}

No puedo salir Supongo que esto se debe a que system_settings_form()se encarga de enviar. ¿Cómo recupero mi control? Necesito hacer un procesamiento personalizado en ese controlador _submit ...

Aditya MP
fuente
Intenté agregar una '#submit'propiedad $formpero eso tampoco ayudó.
Aditya MP
3
¡Oh, perdón, eso realmente funcionó! Lo hice $form['#submit'] = array('custom_food_orders_admin_submit');y ahora está funcionando. ¡Gracias!
Aditya MP

Respuestas:

30

El controlador de envío predeterminado $form_id . '_submit'solo se activa si no se ha configurado ningún otro controlador de envío.

Debido a que system_settings_form () establece un controlador de envío, el controlador predeterminado no se activa, por lo que debe especificarlo si desea usarlo.

Puedes hacerlo así:

/**
 * A custom form.
 */
function custom_form() {
  $form = array();

  $form['custom_form_field'] = array(
    '#type' => 'textfield',
    '#title' => t('Custom form field'),
    '#default_value' => variable_get('custom_form_field', ''),
  );

  // Set a submit handler manually because the default submit handler
  // gets overridden by the system_settings_form() submit handler.
  $form['#submit'][] = 'custom_form_submit';

  return system_settings_form($form);
}

/**
 * Submit handler for the custom form.
 */
function custom_form_submit($form, &$form_state) {
  // Submit code here.
}

Agregar su controlador de envío de esta manera significa que el suyo se ejecutará antes que el controlador de envío system_settings_form ().

Si quieres que el tuyo se ejecute después, en lugar de:

// Set a submit handler manually because the default submit handler
// gets overridden by the system_settings_form() submit handler.
$form['#submit'][] = 'custom_form_submit';

return system_settings_form($form);

Hacer:

$form = system_settings_form($form);
$form['#submit'][] = 'custom_form_submit';
return $form;

Sin embargo, asegúrese de no hacer esto:

$form = system_settings_form($form);
$form['#submit'] = array('custom_form_submit');
return $form;

porque eso sobreescribiría el controlador de envío system_sttings_form (), lo que anularía el propósito de usar la función system_settings_form () en primer lugar.

robo
fuente