JS Calls PHP

Insipirado na biblioteca DWR, resolvi desenvolver um gerador de código javascript em PHP para chamadas a objetos escritos com código PHP.

A idéia é que através de uma configuração simples, o usuário defina uma lista de classes PHP, com seus métodos, expostas para uso no javascript. Dessas classes, ele pode definir quais são os métodos e com qual nome (alias) ele quer trabalhar no javascript. No javascript, o desenvolvedor poderá chamar essa classe com a sintaxe alias.nome_do_metodo([lista_de_parametros]{, função de callback})
Através de manipulação dos dados pela engine do JS Calls PHP, os dados retornados pelo PHP para o javascript são naturalmente acessíveis. Além de string, números e booleans, objetos criados no PHP podem ser retornados através do uso da notação JSON. Com isso, podem ser acessados atributos dos mesmos através da notação nome_do_objeto.nome_do_atributo

A biblioteca é feita em cima da licensa GNU. Ou seja, pode ser usada onde quiser, livremente e de graça, modificada e melhorada.

Versão atual: 0.3

Faça download da biblioteca!

Ou, ainda, veja a lista de testes unitários, que podem servir para estudos.

Configuração

Após fazer download do pacote, você verá os arquivos básicos de utilização (além de outros para exemplos)

  • config.php (arquivo de configuração)
  • index.php
  • JSCallsPHP.js.php (código PHP gerador do código javascript)
  • engine.js
  • .htaccess (usado para possibilitar o uso de um include no javascript para cada classe PHP)

O único arquivo que vocé precisa modificar é o config.php.
Nele são definidas as classes, métodos, apelido usado no javascript e caminho do arquivo. A configuração de uma classe configurada é feita por uma sequencia de arrays, da seguinte forma:

$classes = array(
array( “debug”, “lib”, “DebugUtils”, array( “add” , “mul” , “getArray” ,  “getArrayOfArrays” , “getArrayWithKeyValue” , “getArrayOfArraysWithKeyValue” ) ));

Explicando item por item:

  • debug – apelido usado no javascript para acessar a classe
  • lib – pasta onde se encontra a classe PHP
  • DebugUtils – nome do arquivo que contém a classe (a classe deve ter o mesmo nome do arquivo)
  • array ( “add” ,  “mul” ,  “getArray” ,  “getArrayOfArrays” ,  “getArrayWithKeyValue”,  “getArrayOfArraysWithKeyValue” ) – nome dos métodos expostos

Há também uma variável jsCallsPhpInstallPath que define o caminho no qual está feita a instalação da biblioteca (se possível, coloque o caminho absoluto sem o domínio do site. Por exemplo: “/includes/jscallsphp“)

Classe PHP

Não existe segredo na classe PHP. Ela pode trabalhar da forma que quiser, acessando qualquer banco de dados por exemplo, manipulando qualquer tipo de dados ou com qualquer lógica. A única restrição é que a classe criada deve ter o mesmo nome do arquivo. Na pasta lib do pacote baixado, virá o arquivo DebugUtils.php. O código dela é:

<?php
class DebugUtils {
function __construct() {

}
function add($par1, $par2) {
return $par1 + $par2;
}
function mul($par1, $par2) {
return $par1 * $par2;
}
function getArray() {
return array(”a”, “b”, “c”, “d”, “e”);
}
function getArrayOfArrays() {
return array(array(”a”, “e”, “i”, “o”, “u”), array(”b”, “c”, “d”));
}
function getArrayWithKeyValue() {
return array(”nome”=>”Chris”, “sobrenome”=>”Benseler”);
}
function getArrayOfArraysWithKeyValue() {
return array (array ( “nome” => “Chris” , “sobrenome” => “Benseler” ), array ( “nome” => “Barack” , “sobrenome” => “Obama” ));
}
}
?>

Usando a biblioteca

Só é necessário chamar dois arquivos: engine.js e JSCallsPHP.js.php
A engine.js contém funcões utilitárias internas da biblioteca. O coração da biblioteca mesmo é o JSCallsPHP.js.php; ele que faz a leitura do arquivo de configuração e cria as classes javascript para cada classe PHP, com os respectivos métodos.
No caso da classe DebugUtils do PHP, exposta àcima, é criada uma classe javascript usando o apelido dada a ela no arquivo de configuração (debug) com os métodos definidos no arquivo de configuração (add, mul, etc…).
Acessar os métodos do objeto segue o padrão do javascript: objeto.metodo([parâmetros])
Para aumentar o poder da biblioteca, pode ser passada uma função de callback (retorno) após os parámetros do método. Com isso, caso o método chamado tenha uma valor de retorno, ele pode ser usado nessa função de callback.

Segue abaixo o conteúdo da página de testes que indiquei àcima. Pode-se ver que nela o único trabalho foi criar os links que chamam os métodos da classe debug (que é um objeto que implementa a classe DebugUtils no javascript). Conhecimentos básicos de javascript são suficientes para entender o mesmo.
Caso a sua aplicação trabalhe em cima do Apache (webserver) com mod_rewrite habilitado, ao invés de referenciar o arquivo JSCallsPHP.js.php, você pode fazer uma chamada por classe PHP pelo caminho interface/{apelido_da_classe}.js

<html>
<head>
<script type=”application/javascript” src=”engine.js”></script>
<script type=”application/javascript” src=”JSCallsPHP.js.php”></script>
<!– caso tenha mod_rewrite habilitado, pode chamar através de
<script type=”application/javascript” src=”interface/debug.js”></script>
–>
<script type=”application/javascript”>

function add() {
debug.add(10, 10, function(dataFromServer) {
alert(dataFromServer);
});
}

function mul() {
debug.mul(10, 10, function(dataFromServer) {
alert(dataFromServer);
});
}

function getArray() {
debug.getArray(function(dataFromServer) {
alert(dataFromServer);
});
}

function getArrayOfArrays() {
debug.getArrayOfArrays(function(dataFromServer) {
alert(dataFromServer);
});
}

function getArrayWithKeyValue () {
debug.getArrayWithKeyValue(function(dataFromServer) {
alert(dataFromServer.nome);
alert(dataFromServer.sobrenome);
});
}
function getArrayOfArraysWithKeyValue() {
debug.getArrayOfArraysWithKeyValue(function(dataFromServer) {
for(var i = 0; i<dataFromServer.length; i++) {
alert(dataFromServer[i].nome);
alert(dataFromServer[i].sobrenome);
}
});
}

</script>
</head>

<body>
<h1>JS Calls PHP</h1>
<h2>Exemplode uso – acesso a metodos da classe DebugUtils</h2>

<ul>
<li><a href=”#” onclick=”add(); return false;”>adicionar</a></li>
<li><a href=”#” onclick=”mul(); return false;”>multiplicar</a></li>
<li><a href=”#” onclick=”getArray(); return false;”>retornar array simples</a></li>
<li><a href=”#” onclick=”getArrayOfArrays(); return false;”>retornar array de arrays</a></li>
<li><a href=”#” onclick=”getArrayWithKeyValue(); return false;”>retornar array de dados em formato chave/valor</a></li>
<li><a href=”#” onclick=”getArrayOfArraysWithKeyValue(); return false;”>retornar array de arrays de dados em formato chave/valor</a></li>
</ul>
</body>
</html>

Avalie

1 estrela2 estrelas3 estrelas4 estrelas5 estrelas (No Ratings Yet)

13 Responses to “JS Calls PHP”

  1. Chris B. - idéias e pensamentos » Blog Archive » Novidades na JS Calls PHP says with Wordpress

    [...] JS Calls PHP [...]

  2. Chris B. - idéias e pensamentos » Blog Archive » Consulta de CEP em ajax says with Wordpress

    [...] JS Calls PHP [...]

  3. Chris B. - idéias e pensamentos » Blog Archive » CRUD em ajax says with Wordpress

    [...] JS Calls PHP [...]

  4. Chris B. - idéias e pensamentos » Blog Archive » De onde está vindo o include no seu framework PHP? says with Wordpress

    [...] JS Calls PHP [...]

  5. Chris B. - idéias e pensamentos » Blog Archive » Existe web 2.0 sem ajax? says with Wordpress

    [...] JS Calls PHP [...]

  6. hlino says with Firefox on Windows XP

    Dica: utilize PDO para expandir ainda mais a gama do seu framwork.
    Veja
    http://www.phpro.org/classes/PDO-CRUD.html
    Se utilizar essa abstração para o acesso ao banco, vc será capaz de realizar CRUD com qualquer banco, não somente MySQL.

    []’s

  7. Chris says with Firefox on Mac Os X 10.5

    Parece bacana essa classe! Vou fazer uma integração para testes com a JS Calls PHP! Valeu pela referência!

  8. Micox says with Firefox on Windows XP

    Opa, ótima solução. Só coloque uma dica aí pros utilizadores terem cuidado com a segurança ao permitirem que javascript execute códigos php. hehe.

    Uma sugestão: Não seria melhor colocar as chamadas ao php pelo javascript dentro de um escopo. Tipo no 1o exemplo está:
    alias.nome_do_metodo

    Não seria melhor algo como:
    PHPChrisB.alias.nome_do_metodo()

    Parabéns. Indicarei sempre que ver alguém precisando disso.

  9. Chris says with Firefox on Ubuntu 8.10

    Opá!

    Sobre a segurança, bem… na verdade o javascript só está acessando por uma “interface” código PHP que é executado, claro, no server-side. E essa interface é definida por quem cuida da camada onde está o PHP, logo, não vejo tanta necessidade desse warning! Mas, é algo a se pensar… hehe

    E sobre o lance do escopo, eu pensei nisso, seguindo o exemplo do YUI. Mas, fiquei pensando, e como não pretendo criar essa biblioteca nesse sentido, de inserir mais funcionalidades (lá no YUI, por exemplo, é feito isso para modularizar a biblioteca: tem o YUI.calendar, YUI.colorpicker, etc…). E, novamente, como o “alias” é totalmente customizável, não teria tanto problema de misturar esse objeto representado pelo alias com outros.
    Mas, novamente, é algo a se pensar! Preciso voltar a investir tempo na JS Calls PHP! hehe

    []s, e valeu!

  10. Chris B. - idéias e pensamentos » Utilizando a API do MigreMe por javascript com a JS Calls PHP says with Wordpress

    [...] e outras – para consulta de CEPs, CRUD, etc… – e testes unitários pode ser feito aqui. E a documentação completa da mesma pode ser vista na página principal do projeto! Espero que seja de utilidade para [...]

  11. Chris B. - idéias e pensamentos » Mostrando o potencial da JS Calls PHP #1 says with Wordpress

    [...] Veja a página completa da biblioteca aqui. [...]

  12. Chris B. – idéias e pensamentos » Mostrando o potencial da JS Calls PHP #5 – geolocalização says with Wordpress

    [...] de expor essa classe no config.php (conforme explicado na documentação oficial) sob o nome geo, o único trabalho foi fazer um html que chama o método geoLocation passando o [...]

  13. Tweets that mention Chris B. – idéias e pensamentos » JS Calls PHP -- Topsy.com says with

    [...] this page was mentioned by Chris Benseler (@chrisloki), Chris Benseler (@chrisloki), xkurts (@xkurts), Rafael Guglielmi (@rafaelcg), Igor Frias Vieira (@igorfv) and others. [...]

Leave a Reply