Hasta ahora hemos visto que Jaxon-PHP generará funciones Javascript a partir de funciones PHP que hayamos registrado. En apartados anteriores hemos visto un ejemplo básico y ahora vamos a profundizar en este aspecto, analizando como podemos recoger datos de la interfaz de usuario para enviarlos en la petición AJAX. Tal y como se ha tratado en apartados anteriores, podemos registrar una función PHP registrada de la siguiente forma:
function borrarNumero($numero)
{
...
}
jaxon()->register(Jaxon::CALLABLE_FUNCTION, 'borrarnumero');
Jaxon-PHP permitirá usar una función Javascript como la siguiente:
<script>
jaxon_borrarnumero(8);
</script>
Ya sabes que dicha función Javascript cuando es invocada desencadena una petición AJAX al servidor, procesándose en el script denominado backend.php. El nombre del script del servidor donde se procesan las peticiones AJAX de JAXON podría ser otro, el nombre obviamente se puede cambiar en función de la configuración.
Bien, ahora vamos a revisar técnicas para recoger datos de la interfaz de usuario para pasarlos como parámetro en los métodos generados por Jaxon-PHP (como es el caso de jaxon_borrarnumero anterior). En el caso anterior se pasa un literal numérico, pero lo suyo es recoger dichos valores de formularios, como ocurre en el ejemplo siguiente:
<form action="" id="borrarnumero" method="post" onsubmit="return false;"
<label for="nuevo"> Número a borrar: <input type="text" id="numeroABorrar"></label>
<input type="button" value="¡Borrar!">
</form>
<script>
document.querySelector('#borrarnumero input[type=button]').onclick=function()
{
jaxon_borrarnumero(document.getElementById('numeroABorrar').value);
}
</script>
El ejemplo anterior usa formas de recoger datos de formularios ya vistas en apartados anteriores. Jaxon-JS (la parte Javascript de Jaxon) incorpora un objeto llamado jaxon que permite obtener datos de formularios y otros elementos. Al usar la forma jaxon.$(...) desde Javascript se puede indicar el id de un objeto a seleccionar, y luego podemos usar cualquiera de sus atributos DOM (desde value - si es de tipo input - a innerHTML). El código anterior también se podría escribir como sigue:
<script>
document.querySelector('#borrarnumero input[type=button]').onclick=function()
{
jaxon_borrarnumero(jaxon.$('numeroABorrar').value);
}
</script>
Cuando queremos recoger todos los datos de un formulario de golpe podríamos usar jaxon.getFormValues(...), donde habría que especificar el id del formulario que contiene los datos, por ejemplo:
<form id="cambiarnumero" onSubmit="jaxon_cambiarnumero(jaxon.getFormValues('cambiarnumero')); return false;">
Numero actual:
<input id="numero_actual" type="text" name="numero_actual"><BR>
Numero nuevo:
<input id="numero_nuevo" type="text" name="numero_nuevo"><BR>
<input type="submit" value="Cambiar un número por otro">
</form>
En ese caso el método PHP que recibirá los datos AJAX en el backend, recibirá un array asociativo con los datos donde la clave de dada dato es el nombre del atributo, por ejemplo, para el caso anterior se recibirían los datos: $datos['numero_actual'] y $datos['numero_nuevo'].
Además de los casos anteriores podemos generar Javascript desde PHP para obtener dichos datos reduciendo la cantidad de código Javascript a escribir. Por ejemplo, para recoger datos podemos usar la función pm() de Jaxon-PHP:
<?php
use function Jaxon\pm;
$idCampo='numeroABorrar';
?>
<form action="" id="borrarnumero" method="post" onsubmit="return false;"
<label for="nuevo"> Número a borrar: <input type="text" id="<?=$idCampo?>"></label>
<input type="button" value="¡Borrar!">
</form>
<script>
document.querySelector('#borrarnumero input[type=button]').onclick=function()
{
jaxon_borrarnumero(<?=pm()->input($idCampo)?>);
}
</script>
El código se ejecutaría en PHP y generaría código Javascript para recoger el dato de un input. Este componente (pm()) forma parte del Parameter Factory de Jaxon-PHP. Básicamente va a generar el código Javascript visto antes (jaxon.$('numeroABorrar').value), pero nos otorga más flexibilidad a la hora de generar HTML y Javascript de forma dinámica. Además, la función pm() tiene un abanico de funcionalidades que permite recoger datos de una variedad de elementos diferentes.
También podemos escribir código PHP para que nos genere las invocaciones remotas al backend. Por ejemplo:
<?php
use function Jaxon\pm;
use function Jaxon\rq;
?>
<script>
document.querySelector('#borrarnumero input[type=button]').onclick=function()
{
<?=rq()->call('borrarnumero',pm()->input('numeroABorrar'))?>
}
</script>
El método anterior usa el componente rq() que forma parte del Request Factory de Jaxon-PHP. Al usar el método rq()->call(...) se generará el código Javascript equivalente (en el caso anterior jaxon_borrarnumero(...)). Fíjate que se ha combinado el uso de rq() y pm() para integrar ambas funcionalidades.
Adicionalmente el Request Factory de Jaxon-PHP permite generar código Javascript para pedir confirmaciones y realizar verificaciones. Por ejemplo:
<?php
use function Jaxon\pm;
use function Jaxon\rq;
?>
<script>
document.querySelector('#borrarnumero input[type=button]').onclick=function()
{
<?=rq()->call('borrarnumero',pm()->input('numeroABorrar'))->confirm('¿Estas seguro?');?>
}
</script>
Estas técnicas, junto con otras más avanzadas (en las que no vamos a profundizar), permite reducir drásticamente la cantidad de código Javascript a escribir para crear una aplicación con HTML dinámico que use AJAX. Puedes consultar más información sobre el Request Factory y el Parameter Factory aquí:
Documentación sobre el uso de Parameter Factory y Request Factory.