Lançado Adianti Framework 7.6!
Clique aqui para saber mais
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?

Pacotão Dominando o Adianti Framework 7
O material mais completo de treinamento do Framework.
Curso em vídeo aulas + Livro completo + Códigos fontes do projeto ERPHouse.
Conteúdo Atualizado! Versão 7.4


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

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

Vlw, qualquer coisa estamos aqui. Abraço