Enregistrer des objets et des fonctions PHP
- Version 4.x
- Version 3.x
- Version 2.x
Avant de pouvoir appeler une classe ou une fonction PHP avec javascript, celle-ci doit etre enregistrée, ou déclarée.
Pour cela on utilise la fonction register()
de Jaxon.
Enregistrer une instance d'une classe
Pour enregistrer un objet, on appelle la fonction register
avec le paramètre Jaxon::CALLABLE_OBJECT
.
use Jaxon\Jaxon;
use Jaxon\Response\Response;
class HelloWorld
{
public function sayHello($isCaps)
{
$response = new Response();
$text = ($isCaps) ? 'HELLO WORLD!' : 'Hello World!';
$response->assign('div2', 'innerHTML', $text);
return $response;
}
public function setColor($sColor)
{
$response = new Response();
$response->assign('div2', 'style.color', $sColor);
return $response;
}
}
$jaxon = jaxon();
$jaxon->register(Jaxon::CALLABLE_OBJECT, new HelloWorld());
Après avoir été enregistré, les méthodes publiques de l'objet sont dans une classe javascript nommée JaxonHelloWorld
.
Le préfixe Jaxon
peut être changé à l'aide de l'option de configuration core.prefix.class
.
Voici le code javascript généré par Jaxon.
JaxonHelloWorld = {};
JaxonHelloWorld.sayHello = function() {
return jaxon.request(
{ jxncls: 'HelloWorld', jxnmthd: 'sayHello' },
{ parameters: arguments }
);
};
JaxonHelloWorld.setColor = function() {
return jaxon.request(
{ jxncls: 'HelloWorld', jxnmthd: 'setColor' },
{ parameters: arguments }
);
};
Voici un exemple de code HTML qui appelle des méthodes de la classe PHP exportée avec Jaxon.
<input type="button" value="Say Hello" onclick="JaxonHelloWorld.sayHello(0)" />
<input type="button" value="Set Color" onclick="JaxonHelloWorld.setColor('red')" />
Enregistrer une fonction
Pour enregistrer une fonction, on appelle la fonction register
avec le paramètre Jaxon::USER_FUNCTION
.
use Jaxon\Jaxon;
use Jaxon\Response\Response;
function hello_world($isCaps)
{
$response = new Response();
$text = ($isCaps) ? 'HELLO WORLD!' : 'Hello World!';
$response->assign('div2', 'innerHTML', $text);
return $response;
}
$jaxon->register(Jaxon::USER_FUNCTION, "hello_world");
Après avoir été enregistrée, cette fonction peut être appelée en javascript avec le nom jaxon_hello_world()
.
Le préfixe jaxon_
peut être changé à l'aide de l'option de configuration core.prefix.function
.
Voici le code javascript généré par Jaxon, et envoyé dans le navigateur.
jaxon_hello_world = function() {
return jaxon.request(
{ jxnfun: 'helloWorld' },
{ parameters: arguments }
);
};
Voici un exemple de code HTML qui appelle la fonction PHP enregistrée avec Jaxon.
<input type="button" value="Submit" onclick="jaxon_hello_world()" />
Une méthode d'une classe peut aussi être enregistrée comme une fonction.
Pour cela, le deuxième paramètre de la fonction register()
doit être un tableau, comme dans l'exemple suivant.
use Jaxon\Jaxon;
use Jaxon\Response\Response;
class HelloWorld
{
public function sayHello($isCaps)
{
$response = new Response();
$text = ($isCaps) ? 'HELLO WORLD!' : 'Hello World!';
$response->assign('div2', 'innerHTML', $text);
return $response;
}
}
$hello = new HelloWorld;
$jaxon->register(Jaxon::USER_FUNCTION, array("hello_world", $hello, "sayHello"));
<input type="button" value="Submit" onclick="jaxon_hello_world()" />
Si le tableau contient 2 éléments, la fonction javascript générée aura le même nom que la méthode.
$jaxon->register(Jaxon::USER_FUNCTION, array($hello, "sayHello"));
<input type="button" value="Submit" onclick="jaxon_sayHello()" />
Définir les options des requêtes Jaxon
Des options supplémentaires peuvent être passées aux classes lors de leur enregistrement, et ajoutées aux appels en javascript. Elles permettent de changer le comportement des requêtes Jaxon, sans changer la façon dont elles sont appelées.
En pratique, ces options sont ajoutées dans les fonctions javascript générées par Jaxon.
// Options des classes
$jaxon->register(Jaxon::CALLABLE_OBJECT, new HelloWorld(), [
'setColor' => [
'name' => "'value'"
],
'*' => [
'name' => "'value'"
]
]);
// Options des fonctions
$jaxon->register(Jaxon::USER_FUNCTION, "hello_world", [
'name' => "'value'"
]);
Les options sont définies dans un tableau dont les index sont sont leurs noms. Notons que pour définir une option de type chaîne de caractères, les quotes sont inclues dans sa valeur.
Pour les classes, chaque groupe d'options est lui-même indexé par le nom de la méthode à laquelle elles s'appliquent, ou bien par *
si les options s'appliquent à toutes les méthodes.
L'option mode
par exemple permet de définir si les requêtes Jaxon sont asynchrones ou pas.
$jaxon->register(Jaxon::CALLABLE_OBJECT, new HelloWorld(), [
'setColor' => [
'mode' => "'synchronous'"
],
'*' => [
'mode' => "'asynchronous'"
]
]);
Le code javascript généré est le suivant.
JaxonHelloWorld.sayHello = function() {
return jaxon.request(
{ jxncls: 'HelloWorld', jxnmthd: 'sayHello' },
{ parameters: arguments, mode: 'asynchronous' }
);
};
JaxonHelloWorld.setColor = function() {
return jaxon.request(
{ jxncls: 'HelloWorld', jxnmthd: 'setColor' },
{ parameters: arguments, mode: 'synchronous' }
);
};