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:

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

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:
<?php...... function __construct($param)    {parent::__construct();$password = new TPassword('password');$password->setId('password');$js = 'document.getElementById("password").onkeypress = function() {engine.php?class=LoginForm&method=MyFunction};';TScript::create($js);.....public function myFunction()    {     echo "teste";    }?>

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:

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


OBS: o metodo deve ser estatico

Exemplo:

<?phppublic static function myFunction()    {     echo "teste";    }?>
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:
<?php..$password = new TPassword('password');$password->setId('password');TScript::create("$('input[name=\"password\"]').attr({onkeypress: __adianti_ajax_exec(\"class=LoginForm&method=myFunction\")});");...public static function myFunction()    {     echo "aa";    }?>


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:
<?php>          TScript::create("          var vetor = {login:".$login->getValue().", password:".$password->getValue()."};          $('input[name=\"password\"]').attr({onkeypress: __adianti_ajax_exec(\"class=LoginForm&method=myFunction&params=vetor\")});");?>

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:
<?php        $login = new TEntry('login');        $login->setId('login');        $password = new TPassword('password');        $password->id = 'password';       TScript::create('           $("#password").on("keyup", function(){              var login = $("#login").val();              var password = $("#password").val();                                                     __adianti_ajax_exec("class=LoginForm&method=myFunction&login="+login+"&password="+password);                                         });              ');    public static function myFunction($param)    {        $login = $param['login'];        $password = $param['password'];        echo $login.' '.$password. '<br>';    } ?>
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:
<?phpTScript::create("           $(\"#password\").on(\"keyup\", function(){              var login = $(\"#login\").val();              var password = $(\"#password\").val();                                                     __adianti_ajax_exec(\"class=LoginForm&method=myFunction&login=\"+login+\"&password=\"+password);                                         });              "); ?>

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:
<?phpTScript::create("           $(\\"#password\\").on(\\"keyup\\", function(){              var login = $(\\"#login\\").val();              var password = $(\\"#password\\").val();                                                     __adianti_ajax_exec(\\"class=LoginForm&method=myFunction&login=\\"+login+\\"&password=\\"+password);                                         });              "); ?>

Vamos ver se agora os escapes aparecem!
IF

Vc setou os Ids dos campos?

<?php        $login = new TEntry('login');        $login->setId('login');        $password = new TPassword('password');        $password->id = 'password';?>
IF

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

Com certeza!
<?php$login = new TEntry('login');$login->setId('login');$password = new TPassword('password');$password->setId('password');        TScript::create("           $(\"#password\").on(\"keyup\", function(){              var login = $(\"#login\").val();              var password = $(\"#password\").val();                                                     __adianti_ajax_exec(\"class=LoginForm&method=myFunction&login=\"+login+\"&password=\"+password);                                         });              "); ?>

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

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

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:

<?php                $login = new TEntry('login');            $login->setId('login');            $password = new TPassword('password');            $password->id = 'password';           TScript::create('               $("#password").on("keyup", function(){                  var login = $("#login").val();                  var password = $("#password").val();                                                         __adianti_ajax_exec("class=LoginForm&method=myFunction&login="+login+"&password="+password);                                             });                  ');        public static function myFunction($param)        {            $login = $param['login'];            $password = $param['password'];            echo $login.' '.$password. '<br>';        }   ?>

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

Vlw, qualquer coisa estamos aqui. Abraço