Como uso um retorno de chamada de envio em um formulário de configurações de administrador do Drupal?

14

Estou usando esse código para criar meu formulário 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);
}

Mas percebo que se eu fizer isso:

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

Não posso sair Suponho que isso ocorre porque system_settings_form()cuida do envio. Como recupero meu controle? Preciso fazer algum processamento personalizado nesse manipulador _submit ...

Aditya MP
fonte
Tentei adicionar uma '#submit'propriedade, $formmas isso também não ajudou.
Aditya MP
3
Ah, desculpe, isso realmente funcionou! Eu fiz $form['#submit'] = array('custom_food_orders_admin_submit');e agora está funcionando. Obrigado!
Aditya MP

Respostas:

30

O manipulador de envio padrão de $form_id . '_submit'apenas acionamentos se nenhum outro manipulador de envio tiver sido definido.

Como system_settings_form () define um manipulador de envio, o manipulador padrão não é acionado; portanto, você deve especificar se deseja usá-lo.

Você pode fazer assim:

/**
 * 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.
}

Adicionar seu manipulador de envio dessa maneira significa que o seu será executado antes do manipulador de envio system_settings_form ().

Se você deseja que o seu seja executado, em vez 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);

Faz:

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

Certifique-se de não fazer isso:

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

porque isso substituiria o manipulador de envio system_sttings_form (), o que anularia o objetivo de usar a função system_settings_form () em primeiro lugar.

rooby
fonte