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!

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.
- Permalink
- Trackback
- Comentários (34)
- Ao som de: Bad Religion – Struck a Nerve
Textos escritos por
Comentários #
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.
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!
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
onclickpoderiam colocar funções que alterariam o atributoactiondo 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.
Ah sim...agora entendi, muito boa a explicação e nem se fala da implementação, muito pratica e util! Obrigado.
Oi Nando,
Acho que dá para re-escrever essa sua função com apenas uma linha! :)
Oi Nando,
Acho que dá para reescrever essa sua função com um pouco menos de linhas...
http://pastebin.com/867242
:)
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
Daniel, você pode dar um require, por exemplo. Isso vai depender muito de como você está fazendo.
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!
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.
......
boa dica!!!
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.
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!
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.
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.
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.
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
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!
Achei ótimo mas se eu quiser
enviar parametros como save.php?acao=3
dá erro!!!
Utilizei a função mencionada acima com os exemplos, mas no IE nao tá passando o valor do button.
Alguem ja passou por isso?
DEUS abençoe aqueles que dividem seus conhecimentos a quem procura.
Sua idéia e explicações são simples e claras.
Agradeço.
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?
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
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
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.
Mandou muito bem, parabens
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ó?
Conheço html faz 2 anos e nunca tinha visto estes 2 botões extras de submits... :D
Parabéns!
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...
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
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
[...] 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 [...]
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
Testado e aprovado. Funciona muito bem.
Obrigado.
Deixe um comentário