Conheça  A Ferramenta LowCode mais moderna e veloz para desenvolvimento PHP: Adianti Creator
Chamar função PHP em evento onkeypress em JavaScript Alguém já precisou chamar uma função de uma classe usando onkeypress do javascript? Preciso que ele fique executando uma verificação a cada tecla pressionada no campo, esta verificação é feita por uma função na classe do formulário. Estou tentando fazer desta maneira: ...
CG
Chamar função PHP em evento onkeypress em JavaScript  
Alguém já precisou chamar uma função de uma classe usando onkeypress do javascript?
Preciso que ele fique executando uma verificação a cada tecla pressionada no campo, esta verificação é feita por uma função na classe do formulário.

Estou tentando fazer desta maneira:

 
  1. <?php
  2. $js = 'document.getElementById("password").onkeypress = function() { engine.php?class=LoginForm&method=MyFunction
  3. };';
  4. TScript::create($js)
  5. ?>

Já setei o ID do formulário mas ele não executa a função, na verdade ele não executa nada quando pressiono, alguém sabe como resolver?

Curso Dominando o Adianti Framework

O material mais completo de treinamento do Framework.
Curso em vídeo aulas + Livro completo + Códigos fontes do projeto ERPHouse.
Conteúdo Atualizado!


Dominando o Adianti Framework Quero me inscrever agora!

Comentários (15)


MG

ac
AC

Muitas funções do framework tem similares em JavaScript.
Dê uma olhada no funcionamento da função PHP e veja se pode chamar algo em JS diretamente.
Uma outra forma e usar jQuery para chamar um script PHP e executar o que você precisa.
Mas, sugiro que informe melhor o contexto e a sua necessidade, pois, provavelmente existe alguma coisa para cercar isso.

Espero ter ajudado.
CG

Obrigado Americo Carvalho pela resposta, mas receio que o que você escreveu é exatamente o que eu postei como dúvida.
Preciso executar uma função que está numa classe em PHP a cada tecla digitada em um campo do formulário.

E a princípio até o presente momento, não há um método nos componentes TEntry ou TPassword que é equivalente ao onkeypress do javascript (fica a sugestão) então é necessário executar um script para resolver, o detalhe é que não consegui fazer funcionar ainda, olhei alguns exemplos para testar, mas ainda não consegui.
A ideia é assim:
 
  1. <?php
  2. ...
  3. ...
  4. function __construct($param) {
  5. parent::__construct();
  6. $password = new TPassword('password');
  7. $password->setId('password');
  8. $js = 'document.getElementById("password").onkeypress = function() {engine.php?class=LoginForm&method=MyFunction};';
  9. TScript::create($js);
  10. ...
  11. ..
  12. public function myFunction()
  13. {
  14. echo "teste";
  15. }
  16. ?>

Eu estou usando o método setExitAction para chamar a função quando sai o foco do componente, mas para ficar melhor preciso que execute a função enquanto a pessoa digita!
Desde já agradeço!
WP

Use a função do adianti mesmo para executar metodos no servidor (PHP)
__adianti_ajax_exec < basta informar class=SuaClass&method=seu_metodo_estatico&parametros_adicionais=alguma_coisa

Exemplo:

 
  1. <?php
  2. ...
  3. ......
  4. ........
  5. $js = 'document.getElementById("password").onkeypress = function() { __adianti_ajax_exec("class=LoginForm&method=MyFunction&algum_parametro_adicional=2"); };';
  6. ?>


OBS: o metodo deve ser estatico

Exemplo:

 
  1. <?php
  2. public static function myFunction()
  3. {
  4. echo "teste";
  5. }
  6. ?>
CG

Obrigado William!
Clareou bastante aqui, mas ainda não funcionou!
Da maneira que você colocou ele continua não chamando a função da classe, mas eu fiz desse jeito então:
 
  1. <?php
  2. ..
  3. $password = new TPassword('password');
  4. $password->setId('password');
  5. TScript::create("$('input[name=\"password\"]').attr({onkeypress: __adianti_ajax_exec(\"class=LoginForm&method=myFunction\")});");
  6. ...
  7. public static function myFunction()
  8. {
  9. echo "aa";
  10. }
  11. ?>


Desse jeito ele imprime o "aa" sem eu ter pressionado nenhuma tecla, como se executasse sozinho no formulário, mas pelo menos ele chamou a função do PHP.
O que é curioso é que me parece que executa somente uma vez, não consigo saber se está executando.
Daí uma outra dúvida, como posso pegar os caracteres que estão sendo digitados nos formulários e enviar para esse método que é chamado no onkeypress?
Como o formulário está vazio, obviamente eu preciso a cada tecla pressionada pegar o que está sendo digitado nos campos e enviar para o método que preciso, como são 2 campos eu tentei criar um vetor em javascript assim:
 
  1. <?php>
  2. TScript::create("
  3. var vetor = {login:".$login->getValue().", password:".$password->getValue()."};
  4. $('input[name=\"password\"]').attr({onkeypress: __adianti_ajax_exec(\"class=LoginForm&method=myFunction&params=vetor\")});");
  5. ?>

Porém fica sempre em branco os valores dos campos.. não sei se é assim que se pega os valores dos campos também.
Alguém poderia dar uma ajuda?
Obrigado
IF

Olá Carlos. Tenta assim:
 
  1. <?php
  2. $login = new TEntry('login');
  3. $login->setId('login');
  4. $password = new TPassword('password');
  5. $password->id = 'password';
  6. TScript::create('
  7. $("#password").on("keyup", function(){
  8. var login = $("#login").val();
  9. var password = $("#password").val();
  10. __adianti_ajax_exec("class=LoginForm&method=myFunction&login="+login+"&password="+password);
  11. });
  12. ');
  13. public static function myFunction($param)
  14. {
  15. $login = $param['login'];
  16. $password = $param['password'];
  17. echo $login.' '.$password. '<br>';
  18. }
  19. ?>
CG

Boa noite Ivan!

Muito obrigado pela resposta!!
Eu estava explorando o keyup para ver como implementar, mas não funcionou!
Copiei exatamente como você postou e ainda nada.. até dei uns "escape" nas aspas pra ver se era isso:
 
  1. <?php
  2. TScript::create("
  3. $(\"#password\").on(\"keyup\", function(){
  4. var login = $(\"#login\").val();
  5. var password = $(\"#password\").val();
  6. __adianti_ajax_exec(\"class=LoginForm&method=myFunction&login=\"+login+\"&password=\"+password);
  7. });
  8. ");
  9. ?>

Mas não.. olhei o html que gerou pra ver se por acaso tinha gerado algo errado:
<script language="JavaScript"> $("#password").on("keyup", function(){ var login = $("#login").val(); var password = $("#password").val(); __adianti_ajax_exec("class=LoginForm&method=myFunction&login="+login+"&password="+password); }); </script>


Mas parece que o script está correto mas não aparece o resultado na tela.
O que será que estou esquecendo??
Desde já muito obrigado pela ajuda!!
CG

O forum tirou os "escapes" mas tem:
 
  1. <?php
  2. TScript::create("
  3. $(\\"#password\\").on(\\"keyup\\", function(){
  4. var login = $(\\"#login\\").val();
  5. var password = $(\\"#password\\").val();
  6. __adianti_ajax_exec(\\"class=LoginForm&method=myFunction&login=\\"+login+\\"&password=\\"+password);
  7. });
  8. ");
  9. ?>

Vamos ver se agora os escapes aparecem!
IF

Vc setou os Ids dos campos?

 
  1. <?php
  2. $login = new TEntry('login');
  3. $login->setId('login');
  4. $password = new TPassword('password');
  5. $password->id = 'password';
  6. ?>
IF

Talvez o echo não esteja imprimindo na function, faça uma alteração usando o TMessage para testar a saída:
 
  1. <?php
  2. public static function myFunction($param)
  3. {
  4. $login = $param['login'];
  5. $password = $param['password'];
  6. new TMessage('info',$login.'-'.$password);
  7. }
  8. ?>
CG

Com certeza!
 
  1. <?php
  2. $login = new TEntry('login');
  3. $login->setId('login');
  4. $password = new TPassword('password');
  5. $password->setId('password');
  6. TScript::create("
  7. $(\"#password\").on(\"keyup\", function(){
  8. var login = $(\"#login\").val();
  9. var password = $(\"#password\").val();
  10. __adianti_ajax_exec(\"class=LoginForm&method=myFunction&login=\"+login+\"&password=\"+password);
  11. });
  12. ");
  13. ?>

Tanto o TEntry e o TPassword tem o método setId.
IF

Carlos, o id do password deve ser atribuido assim:
 
  1. <?php
  2. $password->id = 'password';
  3. ?>

Não sei o porque , mas atribuindo com setId(), o TPassword não acata. É só dar uma olhada no código HTML gerado.
CG

Verdade Ivan.. eu olhei o seu código e pensei .."ele digitou errado".. e mantive o setId.. mas quando coloquei da sua forma.. ele chama o método e apareceu algumas coisas.

( ! ) Fatal error: Uncaught exception 'ReflectionException' with message 'Method LoginForm::onExitUser=444() does not exist' in E:wampwwwgecon5libadianticoreAdiantiCoreApplication.php on line 46
( ! ) ReflectionException: Method LoginForm::onExitUser=444() does not exist in E:wampwwwgecon5libadianticoreAdiantiCoreApplication.php on line 46

Estou usando o método para popular um TCombo..está funcionando porque estou chamando ele pelo setExitAction do TPassword.. mas queria que executasse toda vez que a pessoa ficasse digitando.
Eu digito o login: 444 e quando passo pro campo password e digito qualquer tecla.. aparece a mensagem acima.. mas já é alguma coisa o método está chamando, você sabe o que é esse erro?
Muito obrigado pela ajuda Ivan!
CG

Ivan.. testei novamente.. era os meus "escapes".. removi eles e funcionou que é uma beleza!
Cara.. muito obrigado!
Era isso mesmo que precisava!!

Vou postar novamente aqui o código para alguém que precise disso um dia:

 
  1. <?php
  2. $login = new TEntry('login');
  3. $login->setId('login');
  4. $password = new TPassword('password');
  5. $password->id = 'password';
  6. TScript::create('
  7. $("#password").on("keyup", function(){
  8. var login = $("#login").val();
  9. var password = $("#password").val();
  10. __adianti_ajax_exec("class=LoginForm&method=myFunction&login="+login+"&password="+password);
  11. });
  12. ');
  13. public static function myFunction($param)
  14. {
  15. $login = $param['login'];
  16. $password = $param['password'];
  17. echo $login.' '.$password. '<br>';
  18. }
  19. ?>

Obrigado mais uma vez!!!! :)))
IF

Vlw, qualquer coisa estamos aqui. Abraço