• Revista PROGRAMAR: Já está disponível a edição #53 da revista programar. Faz já o download aqui!

-IceBurn-

Submeter um form automáticamente com JavaScript

18 mensagens neste tópico

Boas!

É assim, eu não sei se o que pretento é possível fazer, pelo menos até agora ainda não consegui...

Portanto, estou a fazer um sistema de Newsletter + RSS feeds em php e no painel da administração tenho obviamente

o ficheiro que envia as newsletters, portanto, o administrador elabora a newsletter, e depois tem 2 selects

um que define quantos emails são enviados de cada vez e o intervalo entre os  envios.

Vamos supor, ele selecciona enviar 100 emails e pausar o envio durante 10 minutos, no final dos 10 minutos,

o script enviaria os próximos 100 emails e por ai adiante...

Até aqui tudo bem, já tenho o código todo feito, só que e em relação a essa pausa de 10 minutos utilizei

uma contagem decrescente em java script, que enquanto esse contador não chegar a zero o botão para

enviar os próximos 100 emails fica em estado de disable, tornando-se apenas clicável findo os referidos 10 minutos.

Tudo certo, funciona perfeitamente. mas eu não estou a gostar muito do sistema assim e queria que ficasse

tudo automatizado, ou seja, o administrador introduzia as opções para o envio do email, clicava uma única vez no botão

enviar e não tinha que estar constantemente, de 10 em 10 minutos a clicar em Continuar...

Portanto eu gostaria de saber se existe alguma forma em JavaScript de submeter um form automaticamente.

Os campos do form são apenas hidden fields, que já tem os valores definidos quando o script faz a primeira pausa.

Métodos que NÃO quero utilizar:

->http-redirect (meta-tag) (Apenas quero utilizar o método post)

->função sleep(); do php (Iria subcarregar o servidor)

->body onload (parece que o body onload me dá problemas com a função flush(); do php)

Obrigado desde já.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

em javascript existe um método que invoca um outro método ao fim de um determinado tempo (em milisegundos):

Exemplo:

setTimeout("metodo()", 500);

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

E seria possivel aplicar isso ao que pretendo?

Porque eu tenho um setInterval que me faz a contagem decrescente e torna

o botão submit clicável, a dúvida é se existe a possibilidade de submeter o form

automáticamente quando a contagem atingir Zero.

Portanto, o que eu fiz até agora foi isto:

<script type="text/javascript">
var i=<?=$_POST['contador'];?>;
function setDL(){
document.forms[0].enviar.disabled=false;
document.forms[0].enviar.value="CONTINUAR";
 }
function countdown(){
 i--;
document.forms[0].enviar.value=i;
if(i==0){
setDL();
clearInterval(thecount);
}
}
thecount=setInterval("countdown()",1000);
window.onload=countdown;
</script>

<form id="MyForm" action="<?=$_SERVER['PHP_SELF'];?>" method="post">
<p>
<input type="hidden" name="nid" value="<?=$_POST['nid'];?>"/>
<input type="hidden" name="contador" value="<?=$_POST['contador'];?>"/>
<input type="hidden" name="intervalo" value="<?=$_POST['intervalo'];?>"/>
<input type="hidden" name="pg" value="<?=$next;?>"/>
<input style="width: 4cm; font-weight: bold;" name="enviar" id="enviar" type="submit" value="Aguarde..." disabled="disabled"/>
</p>
</form>

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

faz

window.onload = submeter;

e depois cria o método:

function submeter(){

    document.forms[0].submit();

    setTimeOut(600000);                <---- 10 minutos

}

em princípio é isso... testa e diz se não funcionar

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Ok, vou experimentar e já digo alguma coisa.

Obrigado.  ;)

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

isto teria de dar:

window.onload = submeter;

function submeter(){
     document.forms[0].submit();
     setInterval(submeter, 600000);
}

Mas realmente depender do browser para este tipo de coisas não é ideal... porque não usas um cron (linux) ou schedule (windows) que corre o php x em x tempo?

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Eu experimentei e não consegui dessa forma, realmente a página é actualizada,

mas as variáveis POST não são passadas, logo o script não continua a executar o envio.

Não uso um cron, porque não faz sentido utilizar um cron para uma coisa destas.

Entretanto estou a tentar com AJAX, e já consegui alguns resultados, vamos lá ver no que é que isto vai dar....

Muito obrigado aos dois pelas sugestões.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Se precisares de ajuda a nivel de AJAX diz que eu ajudo-te :)

Já agora não sei se  conheces mas se quiseres que o AJAX se torne MUITO simples usa o Prototype Framework simples de usar e com alguma documentação online. :)

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Ia sugerir AJAX, mas já venho tarde..! Além da prototype, tens o jquery, que é similar na filosofia e também muito bom, além de bastante mais levezinho.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

um cron não faz sentido?! boa! Eu é continuo a achar é que o javascript é que não faz qualquer sentido. Principalmente quando estamos a falar de um email queue. Estar dependente de um cliente Web que actualize X em X tempo para que vá mandando os emails das novas notícias e vá esvaziando a queue é completamente descabido e pouco fiável. Poderia escrever uma serie de coisas que podem correr mal mas não vou fazer mais comentários

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

um cron não faz sentido?! boa! Eu é continuo a achar é que o javascript é que não faz qualquer sentido. Principalmente quando estamos a falar de um email queue. Estar dependente de um cliente Web que actualize X em X tempo para que vá mandando os emails das novas notícias e vá esvaziando a queue é completamente descabido e pouco fiável. Poderia escrever uma serie de coisas que podem correr mal mas não vou fazer mais comentários

Não, não faz. Acontece que o que todo o processo de envio dos emails é executado com o PHP, o java script apenas vai servir para intervalar o envio dos emails e não enviar 3000 emails assim de rajada, percebes?

Portanto, o funcionamento do script é este, o administrador elabora a newsletter, ao submeter a newsletter é guardada na base de dados e aparece-lhe um menu em que ele vai seleccionar o número de emails a enviar de cada vez e o intervalo entre o envio desses emails.

Ou seja ele pode por exemplo seleccionar o envio dos primeiros 100, quando o envio desses 100 emails estiver completo é que entra o javascript com uma contagem decrescente baseada com o valor do intervalo seleccionado pelo administrador, ao terminar esse tempo, o java script 'dispara' e dá indicação ao PHP para continuar e enviar os próximos 100 emails e por aí adiante até que todos os emails sejam enviados, com a particularidade do administrador poder visualizar o envio dos emails á medida que vão sendo enviados em que tambem é apresentado o resultado do envio.

Para alem disto, vai continuar a ter um botão para se não quiser esperar pelo timeout do javascript poder continuar o envio manualmente.

Eu não sou adepto de JavaScript, dentro dos possiveis faço sempre tudo utilizando PHP, mas há que ver as coisas, e momento em que uma solução em JavaScript seja mais funcional e ao mesmo tempo segura, acima de tudo segura então não vou estar a inventar porque não vale a pena.

Agora podes dizer que pode correr mal com o JavaScript, mas que importa, mesmo que o JavaScript falhe, o administrador continua a ter um botão para prosseguir com o envio dos emails. E se fossemos por aí, o PHP tambem não é infalível, imaginemos que quando está a enviar os emails, o servidor lembra-se de ter um downtime.... Nada é 100% eficaz, mas há que tomar decisões e na minha maneira de pensar não vejo nenhum motivo para não adoptar JavaScript para uma função tão básica, estando o verdadeiro 'motor PHP' por trás a controlar as coisas.

Agora por exemplo, se o objectivo fosse agendar o envio de emails para uma data futura, aí sim, fazia todo o sentido, mas não é o caso. Utilizo alguns cron jobs em sites, e essa ideia tambem me passou pela cabeça quando estava a fazer o script, mas rapidamente me apercebi que não seria a opcção ideal.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Mais um comentário então. :-D

Eu tenho exemplos em ambientes reais feito num cron que corre um php e funciona perfeitamente. o cron executa x em x tempo para saber se existem novas mailings ou algum job por fazer. Os utilizadores têm site de adminitração e página de estado.

No caso de ser por javascript, se a pessoa ficar sem rede fica agarrada. O que sinceramente é ridículo. Mas ainda bem que gostas dessa solução pelo menos é uma.

Eu pessoalamente prefiro ter um serviço no lado do servidor, ou no cliente, que nao dependa de HTML e Javascript. A solução básica é um cron + php mas também tenho serviços específicos a correr para esse genero de coisas. Em pouco mais que 5 minutos crias um Thread a correr como serviço ondemand para fazer este genero de coisas mesmo em PHP sem necessidade de cron ao barulho.

Só para esclarecer um assunto. Eu estou a responder porque achas que não faz sentido um serviço específico a fazer este tipo de trabalho, seja ele cron ou Thread, e achas aceitável por Javascript. E eu acho exactamente o contrário por varios motivos. e larga experiencia em aplicações web, e mais importante pela fiabilidade. Agora quem vai implementar não sou eu. Eu fazia de outra maneira e já dei uma sugestão e opinião e sobre isso posso.te ajudar a esclarecer mais qualquer coisa.

No fim és tu que tem de escolher a maneira que achas mais correcto e implementá-la.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Pronto, ok, temos opiniões diferentes, não vale a pena insistir mais nisto se não nunca mais saimos daqui...

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Obrigado a todos que responderam e deram as suas opiniões e sugestões.  :)

Já consegui fazer o que queria, utilizando AJAX, não recorrendo a nenhum dos frameworks referidos.

Thanks!

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Ainda bem que conseguiste o que queres. Só falta agora testares isso muito bem e chegares à conclusão que o que queres fazer é tipicamente uma questão de servidor, isto é, estou a dar toda a razão ao kimus.

Não faz sentido ser acção do cliente, ainda por cima javascript. Enfim, quero apenas deixar a impressão que, embora funcione, não é a opção correcta.

Mas é opção tua, e por isso, força. Ainda bem que tens o problema resolvido.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Então eu vou voltar a repetir o que já disse, e deixo aqui os aspectos mais importantes....

1) O que envia os emails é unicamente o PHP movido pela função while(), o AJAX somente actualiza a página que mostram os resultados.

2) O código está preparado de maneira que se por algum motivo falhar o envio de um email, é imediatamente logado numa tabela para posterior envio.

3)  Eu não confio em JavaScript, apenas o utilizo como auxiliar e raramente recoro a esse método.

4) Mesmo que falhe a electricidade, até pode cair uma bomba em cima do PC  :cheesygrin:, se um email não for enviado, automaticamente fica a informação na BD e o administrador  poderá enviar esse mesmo email posteriormente.

4-a) Se por algum motivo falhar o javascript, o administrador pode cancelar o envio imediatamente e enviar depois os emails restantes ou, se preferir, continuar o envio manualmente.

Neste momento eu penso que o titulo do tópico vos está a iludir... ao fim ao cabo, está lá o form, mas, de momento serve apenas para o administrador enviar os emails manualmente, todas as variáveis já estão bem definidas antes sequer do AJAX entrar em acção.

Depois disto, caso surgam dúvidas avisem, se for necessário eu crio propositamente um código (se estiver com disposição e tempo para tal) para mostrar o funcionamento e para de uma vez por todas lhes mostar que o AJAX não está a fazer nada que ponha em risco o envio dos emails.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

A questão não é se está a fazer algo que coloque o envio em risco, nunca foi esse o problema. Mas o tópico já vai fora de contexto, muito por culpa minha, e a discussão fica por aqui. Neste tópico pelo menos.

Novamente, ainda bem que te conseguiram ajudar e que tens o que querias a funcionar.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Crie uma conta ou ligue-se para comentar

Só membros podem comentar

Criar nova conta

Registe para ter uma conta na nossa comunidade. É fácil!


Registar nova conta

Entra

Já tem conta? Inicie sessão aqui.


Entrar Agora