Como adiciono dois botões de envio a um formulário Drupal 5?
-
05-07-2019 - |
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?
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:
- 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.) - 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. - 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;)