Pergunta

Eu tenho dois botões de envio no meu formulário. Um é o botão de envio normal que chama `my_form_submit` like-ah-so:

$form['fieldset']['submit'] = array(
  '#type' => 'submit',
  '#value' => 'Show Applications',
);

Quero adicionar outro botão que enviará o formulário, mas chame um manipulador de envio diferente. Há alguma maneira de fazer isso? Eu olhei para adicionar o #submit propriedade para um elemento como-ah-so:

$form['fieldset']['evil_plan'] = array(
  '#type' => 'submit',
  '#value' => 'Big Red Button',
  '#submit' => array('steal_formula_for_icantbeliveitsnotbutter'),
);

Esperando chamar a função `Steal_formula_for_icantBeliveitsNotbutter`, mas sem trabalho. Quando clico no botão Big Red, a função Normal `my_form_subMit` é chamada, que reduz meu plano para tirar milhões de um substituto de manteiga. Quem pode esclarecer essa bagunça escura?

Foi útil?

Solução

Para o Drupal 5, esta é a única solução:

function my_form_submit($form_id, $form_values) {
  if ($form_values['op'] == 'Show Applications') {
    // handle 'Show Applications' submission
  }
  elseif ($form_values['op'] == 'Big Red Button') {
    // handle 'Big Red Button' submission
  }
}

o mesmo para my_form_validate.

No Drupal 6, isso pode ser mais fácil com os recém -introduzidos Manipuladores #SubMIT e #Validate para os botões de formulário.

Outras dicas

Editar: Uma verificação mais próxima da documentação da API dos formulários revelou que minha resposta inicial abaixo é válida para o Drupal 6, mas apenas parcialmente válido para o Drupal 5. Comparando o Drupal 5 docs com o Drupal 6 Docs Mostra que, no Drupal 5, você só pode registrar funções de retorno de chamada no formulário - a propriedade '#submit' de um botão é apenas um booleano indicando que o botão deve ser tratado como um botão de envio. Então adicionando Os retornos de chamada 'por botão' são um recurso apenas DRUPAL 6!

Para a pergunta dada, isso significa que existe apenas a opção if/elseif sugerida por mach retornos de chamada).


(resposta inicial)

Existem vários mecanismos em ação aqui:

  1. Enviar (e validar) retornos de chamada pode ser registrado para botões individuais, mas também para o próprio formulário ($form['#submit']). Os registrados para o formulário são chamados para cada botão de envio, os registrados para um botão individual apenas para esse. (NOTA: IMPORTANTE DRUPAL 5/6 DIFERENÇA AQUI, veja Editar abaixo.)
  2. O manuseio de formulário padrão (envie e valide funções nomeado após o formulário) funciona por Drupal adicionando automaticamente retornos de chamada para aqueles aos formulários '#submit' e '#validate' matrizes.
  3. O registro usa matrizes para permitir várias funções de envio/validação chamadas uma após a outra (na mesma ordem que aparecem na matriz).

Portanto, no seu caso, você pode fazer o switch if/elseif sugerido por machado, ou precisará despertar os retornos de chamada 'globais' para o formulário, movendo -o explicitamente para o botão de envio padrão:

$form['fieldset']['submit']['#submit'] = $form['#submit'];
unset($form['#submit'];

(a mesma coisa para validar retornos de chamada)

Depois disso, seu exemplo postado para o Big Red Button que executa o Plano Mal deve funcionar conforme o esperado;)

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top