A maioria das pessoas não sabe que é possível adicionar mais de um botão do tipo "submit". Mas se você precisa fazer algo como o WordPress, pode ser uma mão na roda!

Múltiplos submits no WordPress

Eu uso uma função em PHP que me ajuda bastante quando preciso fazer algo parecido.

<?php
function get_post_action($name)
{
    $params = func_get_args();
    
    foreach ($params as $name) {
        if (isset($_POST[$name])) {
            return $name;
        }
    }
}
?>

Ela é muito simples, mas extremamente útil. Basta passar os nomes possíveis dos botões e a função retornará qual a ação escolhida. Para usá-la, você pode fazer algo assim:

<?php
switch (get_post_action('save', 'submit', 'publish')) {
    case 'save':
        //save article and keep editing
        break;
    
    case 'submit':
        //save article and redirect
        break;
    
    case 'publish':
        //publish article and redirect
        break;
    
    default:
        //no action sent
}
?>

No seu HTML não precisa de muito. Apenas coloque o atributo name com os valores que você irá verificar.

<form method="post" action="form.php">
    <p>
        <input type="submit" name="save" value="Salvar e continuar editando" /> 
        <input type="submit" name="submit" value="Salvar" /> 
        <input type="submit" name="publish" value="Publicar" />
    </p>
</form>

E por favor, pare de mudar o atributo action do formulário através de Javascript.

Comentários #

#1 Leandro Vieira Pinho disse:
22 Nov 06, 11:46AM

Maravilha Nando, ótima explicação.

Como você mesmo diz, ... "pare de mudar o atributo action do formulário através de Javascript" tem muita gente fazendo isto por aí e desnecessariamente. Talvez da próxima vez elas utilizem o Google e com isso cheguem até esse post :)

Um abraço.

#2 marcus disse:
29 Nov 06, 01:19PM

Sou meio leigo no assunto, mais, me explique melhor sobre a advertencia que
voce deu, "pare de mudar o action atravez de js". Desde já agradeco e já assinei seus feeds!

#3 Nando Vieira disse:
29 Nov 06, 01:29PM

Marcus: imagine que você tenha exatamente a mesma necessidade do WP. Muitas pessoas iriam fazer o seguinte: ao invés de 3 inputs "submit", teriam 3 inputs "button". No evento onclick poderiam colocar funções que alterariam o atributo action do formulário e fariam o envio através de Javascript. Por exemplo:

<form>
<input type="button" value="Save and Continue Editing" onclick="send('save');" />
<input type="button" value="Save" onclick="send('submit');" />
<input type="button" value="Publish" onclick="send('publish');" />
</form>

Aí, com Javascript fariam isso:

<script type="text/Javascript">
function send(action)
{
	switch(action) {
		case 'save':
			url = 'save.php';
			break;
		case 'submit':
			url = 'submit.php';
			break;
		case 'publish':
			url = 'publish.php';
			break;
	}

	document.forms[0].action = url;
	document.forms[0].submit();
}
</script>

O código acima funciona? Sim, funciona. Mas você precisa ter Javascript habilitado. Com a abordagem que eu expliquei você, sem muito esforço, deixa seu código muito mais acessível.

#4 Marcus disse:
17 Dez 06, 04:06PM

Ah sim...agora entendi, muito boa a explicação e nem se fala da implementação, muito pratica e util! Obrigado.

#5 Arthur Furlan disse:
25 Jan 07, 02:48PM

Oi Nando,

Acho que dá para re-escrever essa sua função com apenas uma linha! :)

#6 Arthur Furlan disse:
25 Jan 07, 02:53PM

Oi Nando,

Acho que dá para reescrever essa sua função com um pouco menos de linhas...
http://pastebin.com/867242

:)

#7 Daniel disse:
12 Fev 07, 11:40AM

Ola!
sou novato em PHP e não sei como realizar a chamada para meu arquivo .php na parte da rotina:
case 'save':
//aqui eu preciso chamar meu arquivo salvar.php, como faço isso???
break;

Grato

#8 Nando Vieira disse:
12 Fev 07, 03:51PM

Daniel, você pode dar um require, por exemplo. Isso vai depender muito de como você está fazendo.

#9 Diego disse:
23 Maio 07, 11:22AM

Olá!

"Talvez da próxima vez eles utilizem o Google e com isso cheguem até esse post :)" -Leandro Vieira Pinho

Exatamente meu caso, como não sei de cor o código javascript e perdi o código, fui procurar novamente, até achar como fazer em PHP. Gostei muito mesmo!! Vlw ai pela ajuda!

#10 GustavoPaes.Net disse:
09 Jul 07, 12:03AM

Múltiplos botões 'submit' em um formulário...

Como criar vários botões submit em um formulário e fazer com que cada um realize uma função diferente? Veja no Simples Idéias.

......

#11 Jaison disse:
20 Jul 07, 01:45AM

boa dica!!!

#12 Jaqueline Benedicto disse:
24 Ago 07, 12:02PM

Olá amigo,
Parabéns pelo seu belo artigo, eu precisava de exatamente isto e funcionou corretamente, estou publicando seu artigo no meu blog, colocando os devidos créditos de autoria.

#13 Tarcisio disse:
07 Set 07, 09:32AM

Muito obrigado.

Me ajudou bastante.
Procurei no google e achei exatamente o que queria.

Antes usava o javascript, porem, agora não mais o farei!

Abraço!

#14 Leandro Vieira Pinho disse:
02 Out 07, 11:46PM

Nando,

Hoje, percebi o seguinte: se o usuário não clicar em nenhum dos botões para submeter o formulário, e utilizar a tecla enter para tal, o primeiro botão do tipo submit é levado em consideração.

Com isso, posso executar um código relacionado ao primeiro botão em um hora indevida, e deixar de executar o código relacionado ao terceiro botão, por exemplo, quando deveria.

Tem alguma idéia com relação a este cenário? Se pensar em JavaScript, como por exemplo bloquear a tecla enter.

Um abraço.

#15 Nando Vieira disse:
03 Out 07, 09:22AM

Leandro,

Se você pensar, um formulário deve sempre ter um comportamento padrão de submit. É assim que funciona mesmo com um único botão. Agora, se for algo extremamente importante, que não pode ser enviado de forma alguma, faço sempre o seguinte: sem javascript, envio o formulário; a tela que receberá o request exibe uma mensagem de confirmação.

Para àqueles que estiverem com javascript, no onsubmit do formulário você adiciona uma parâmetro hidden que receberá o valor do botão clicado; no caso do enter, este valor irá vazio, então você saberá que nenhum botão foi clicado.

O controle de executar a ação ou não está atrelado ao parâmetro enviado (ou não) por javascript.

#16 scharles disse:
19 Jun 08, 03:51PM

olá, eu gostaria de saber como aplica esta função em um script de verdade...
usa ele como classe ou aplica direto no codigo?
se puder faça um pequeno script pra gente testar e entender melhor.

#17 Anderson disse:
11 Jul 08, 08:09PM

Olá Nando,

Por favor, você poderia dar um exemplo mais completo sobre o fato do submit ser usado para fins múltiplos.

Estou há dois dias quebrando a cabeça para resolver isso no meu formulário. Eu preciso que no mesmo formulário haja dois submit, um para ALTERAR os dados de determinado registro do meu banco, e outro, caso o usuário deseje, para reinserir no banco com alguma modificação ou não os mesmos dados exibidos.

Agradeço antecipadamente.

Anderson

#18 Anderson disse:
12 Jul 08, 12:04PM

Bom dia Nando,

Ontem à noite mesmo eu consegui, graças a deus, resolver essa questão aqui dos multiplos SUBMIT.

Quando se dá um "name" ao submit, dá para resgatá-lo com o $_POST ou $_GET, sem grandes problemas.

Se alguém precisar do meu código, me mande um e-mail (andersonbortolai@gmail.com).

Valeu!

#19 Israel disse:
16 Jul 08, 05:32PM

Achei ótimo mas se eu quiser
enviar parametros como save.php?acao=3
dá erro!!!

#20 Thiago disse:
14 Out 08, 06:25PM

Utilizei a função mencionada acima com os exemplos, mas no IE nao tá passando o valor do button.
Alguem ja passou por isso?

#21 Flavio disse:
18 Maio 09, 01:23AM

DEUS abençoe aqueles que dividem seus conhecimentos a quem procura.

Sua idéia e explicações são simples e claras.

Agradeço.

#22 villas disse:
20 Out 09, 08:53AM

Tem como colocar em 1 dos botões um comando para reconhecer onClick E/OU onEnter (nem sei se existe) e em outros 2 somente onClick ? - a intenção é deixar default no ENTER uma certa página manja?

#23 Djonatan disse:
22 Out 09, 01:58PM

Ola, li teu exemplo e nao compreendi muito bem como ele lida com o direcionamento para o script...
o que preciso e exatamente isso, listo ocorrencias do banco e quero dois botoes pra decidir entre alterar ou adicionar instancia ao que foi selecionado

Pelo oq eu entendi seria necessario apenas:
q o action do form apontasse para um arquivo contendo o switch? e como eu faria para reencaminhar todos os campos que eu quero passar via POST?

Pra mim faltaram poucos detalhes da tua explicacao pra compreender o funcionamento correto! espero que ainda esteja ativo pra tirar algumas duvidas

#24 Joao Paulo disse:
25 Nov 09, 08:28AM

Excelente, realmente simples e bem util! Eu não sei como eu pude viver até hoje sem esse código rsrs.

Realmente uma ótima dica!!! Meus parabéns

#25 Silvio Matos disse:
01 Dez 09, 11:59AM

Nando
Achei simples e funcional a sua idéia.
Mesmo assim, preciso de apena um botão para fazer tudo.

No meu caso, são duas submissões: uma para um banco de dados de cadastro de usuário, que já está funcionando. E a outra para um outro banco de dados, de um autoresponder.

#26 Haruan disse:
10 Mar 10, 12:25PM

Mandou muito bem, parabens

#27 murilo disse:
17 Mar 10, 11:54AM

Olá, Nando Vieira ,gostei muito do artigo, Estava já a algum tempo procurando por isto,
mas preciso saber mais uma coisa que eu tentei implementar aqui mas nao consegui, você poderia ver isto para mim?, estou desesperado procurando isto e não consigo de jeito nenhum, rss.

É simples, gostaria de fazer este formulário só que passando mais de um valor, tipo , tenho 3 botoes, um deletar , um alterar e outro inserir, em uma lista de noticias.
e estas noticias, cada uma tem um id diferente, então eu teria que passar dois valores -
1) se é alterar/ deletar ou inserir
2) pegar o id daquela notícia que quero alterar, deletar ou inserir

então eu teria que passar no valor do input onde está assim -

colocar assim -

ai eu pensei em fazer um explode para pegar os dois valores, assim -

function get_post_action($name)
{
$params = func_get_args();

foreach ($params as $name) {
if (isset($_POST[$name])) {

$separa = explode("@",$name);
$var_recupera_id_display = $separa[0];
$opcao_display = $separa[1];

return $opcao_display;

}
}
}
...

mas nao deu certo, será que tem algum jeito de pegar dois valores como eu penso ao invés de um valor só?

#28 Tylër disse:
19 Abr 10, 06:26PM

Conheço html faz 2 anos e nunca tinha visto estes 2 botões extras de submits... :D

Parabéns!

#29 rudimar disse:
09 Maio 10, 12:21PM

mas se eu tenho o seguinte form, que trabalha com AJAX...

como tenho 2 botes...como especificaria para chamar as funcoes que estao especificadas no form acima.. ou seja...
o que eu colocaria nos cases..., conforme abaixo...

switch (get_post_action('save', 'submit', 'publish')) {
case 'sim':
//o que eu colocaria aqui para substituir a linha do form acima...contendo a chamada de todas as funcoes...

#30 alcione morais disse:
11 Maio 10, 10:05PM

parabens muito legal tua ideia dos botoes muitiplos a gente esta construindo um pramework php para configurar acesso a banco de dados sem necessidades de se mexer em codigo pra criar aplicativos e sua ideia ajudou um pouquinho .

abraço

#31 murilo disse:
21 Maio 10, 06:30PM

e ai nando, eu fiz uma pergunta pra vc , a pergunta numero #27 , então cara, me ajuda ai neste negocio, estou precisando resolver isto.
valeu

#32 Multiplos Submits em formulário (html/php) | Leandro Chaves disse:
29 Maio 10, 06:19PM

[...] Hoje procurando uma melhor forma de agilizar um carrinho de comprar de um site, me deparei com este post do blog Simples Ideias e achei muito útil. a possibilidade de variar a ação apenas mudando o [...]

#33 roberto disse:
16 Jul 10, 11:18AM

Por favor, gostaria de saber como faço para enviar um formulário sem para que não apareça no momento do envio a mensagem:

- o formulário esta sendo enviado por e-mail e não está criptografado.

Obrigado

Roberto

#34 Felipe Lima disse:
13 Ago 10, 06:06PM

Testado e aprovado. Funciona muito bem.
Obrigado.

#35 Alexandre disse:
24 Nov 10, 01:10AM

Muito boa a dica, mas, uma dúvida.

Estou recebendo 'Headers already sent'. Saberia me ajudar?

Obrigado.

#36 Armando Akio disse:
24 Dez 10, 09:08AM

Cara, fantastico, parabens pelo post, pela iniciativa, deixo aqui o meu agradecimento abraços a todos

#37 Leandro Sciola disse:
06 Jan 11, 10:34AM

Parabéns!!! Mais uma vez a simplicidade venceu...

#38 Arthur disse:
19 Jan 11, 12:20AM

nossa muito legal essa funçao..

eu já tinha feito uma parada dessas de vários(2) botões em "um" só formulário..
na verdade só parecia isso. eu na verdade fazia duas tags pra cada btn com seus respectivos actions...
só não funciona quando tem outros inputs.. mais ai eu chamava os values de um dos forms de variáveis e no segundo form dava as mesmas values, sendo as inputs todas em hidden.. ai funcionou..

fazia isso pq não gosto de misturar php com java se eu puder eu não faço.. mas ai achei esse site pqp massa!

nunca fiz nada tão simples e elegante como essa função hehehe

Obrigado!

#39 Suzane Gross disse:
22 Jul 11, 10:32PM

"Talvez da próxima vez elas utilizem o Google e com isso cheguem até esse post"

Eu procurei no Google rsrs... e veio como primeiro resultado :O

Muito obrigada pela dica. Com certeza será muito útil!

#40 luciano disse:
19 Ago 11, 05:32PM

seria exatamente o que queria, porém tenho vários submits com o mesmo nome, por exemplo "Excluir"
como faria nesse caso ? posso utiliza o "id" do submit ? pois preciso excluir registros com array.

#41 Stênio Elson disse:
17 Out 11, 02:30AM

Como o amigo #14 Leandro Vieira Pinho disse, quando o usuário aperta enter o primeiro submit é levado em consideração, e qualquer código que você tenha feita em php não pode mudar isso, MAS existe uma artimanha, minha dica é, se você fez um botão exclusivo para um input dentro do formulário, coloque uma cópia do input deste botão no início do formulário, e com o css deixe-o em position fixed com visibility hidden. Foi assim que eu resolvi meu problema.

#42 Stênio Elson disse:
17 Out 11, 02:30AM

Apesar de este ser um post de 2006 esta resolvendo problemas até hoje, obrigado.

#43 Ale disse:
22 Out 11, 04:28PM

Parabens pela dica, especialmente por compartilhar!!
Sucessos.

#44 Fred disse:
11 Jan 12, 10:16AM

Nando estou utilizando esta função para fazer uma pagina de alteração de registros do bd. Utilizo dois forms: o primeiro form é onde disbonibilizo as buscas e o segundo (na mesama página) onde coloco o regustro para edição. Porém qnd executo o primeiro form com method="post" action="", ele executa todo o primeiro formulário e com isto limpa os dados que o usuário informou e em seguida monta, logo abaixo o fomulário de edição

o segundo form tenho case: Submit, dentro deste case monto o segundo form.

teria alguma idéia de como executar primeiro form sem limpar os dados?

#45 Allan Cristhian Kath Kipfer disse:
16 Jan 12, 05:05PM

Ola, posso usar este metodo, usando o form em 1.php
e o codigo de verificação em 2.php?
vai funcionar de boa?
EX:

posso usar assim?

Deixe um comentário





Não é aceito código HTML: adicione-o no pastie.org ou paste.milk-it.net e poste apenas o link.

Se este é seu primeiro comentário, ele terá que ser aprovado antes de ser exibido.

JavaScript Avançado

O JavaScript é a única linguagem que muitos acreditam saber sem nunca terem parado para realmente aprendê-la. Neste workshop rápido você entenderá de verdade todos os conceitos avançados do JavaScript em 4 horas puramente práticas.

Saiba mais Fechar

Conheça também o HOWTO