Diferencia entre revisiones de «Usuario:ManuelRomero/PHP/xjax»

De WikiEducator
Saltar a: navegación, buscar
(Jaxon)
(Página reemplazada por «===Xajax: poner ajax desde el servidor=== ;Qué es ajax Dónde lo pongo? Qué elementos intervienen en una comunicacion ajax ===Usando la librería=== *La instalamos d...»)
Línea 1: Línea 1:
{{:Usuario:ManuelRomero/PHP/xajax/nav}}
+
===Xajax: poner ajax desde el servidor===
===Objetivo===
+
;Qué es ajax
*La intención es que php genere una página html que entrega al cliente y que contenga código ajax, de modo que cuando el cliente lo necesite solicite recargar solo parte de la página.
+
Dónde lo pongo?
*En este caso pretendemos que sea el servidor el que genere este código, y no generarlo directamente en el cliente.
+
Qué elementos intervienen en una comunicacion ajax
*Existen situaciones en las cuales puede ser interesante aplicar esta forma de proceder.
+
===Usando la librería===
 
+
*La instalamos desde composer la librería que queremos utilizar
*Muchas de estas librerías suelen apoyarse en librerías JavaScript como jQuery para la ejecución de código en el cliente.
+
<source lang=json>
*Podemos ver estas librerías en
+
#http://ajaxpatterns.org/PHP_Ajax_Frameworks 
+
#http://www.ribosomatic.com/articulos/top-librerias-ajax-dhtml-y-javascript/
+
*Vamos a estudiar un poco por encima Xajax, por ser una librería de código abierto y de sencillo uso.
+
*Ha estado muchos años caída, pero actualmente se ha recuperado el proyecto y por lo tanto lo vamos a utilizar
+
===Jaxon===
+
*Es una librería basada en xajax adaptada para php-7
+
*En la actualidad (2019) funciona correctamente.
+
*La página oficial:
+
https://www.jaxon-php.org/
+
;Instalación
+
*Podemos instalar con composer montando un '''''composer.json''''' en el directorio del proyecto
+
<source lang=php>
+
{
+
 
"require": {
 
"require": {
 
     "jaxon-php/jaxon-core": "~2.0"
 
     "jaxon-php/jaxon-core": "~2.0"
 
}
 
}
}
 
</source>
 
*Después actualizamos composer
 
<source lang=bash>
 
composer update
 
</source>
 
*Vemos que se ha descargado la librería bajo el directorio vendor
 
;Usando ajax
 
1.- En el servidor cargamos la librería de ajax a través del autoload de composer<nr />
 
<source lang=php>
 
<?php
 
require_once "./vendor/autoload.php";
 
?>
 
</source>
 
2.- Cargamos un objeto de la clase Jaxon a través de la función jaxon() que obtiene un singleton (si ya existía lo recupera, si no, lo crea).<br />
 
<source lang=php>
 
<?php
 
$ajax = jaxon();
 
?>
 
</source>
 
3.- Temas de configuración (MRM pendienete de mirar)<br />
 
4.- Cargamos el código de javascript en el cliente  a través de la librería
 
<source lang=php>
 
<?php
 
echo $ajax->getJs();
 
echo $ajax->getCss();
 
echo $ajax->getScript();?>
 
</source>
 
5.- Creamos en el servidor la función que queremos que sea invocada a través por ejemplo de una clase
 
<source lang=php>
 
class ServidorAjax
 
{
 
    public function saluda(){
 
 
    }
 
}
 
</source>
 
*En ella debemos instaciar un objeto de la clase '''''Response''''' que va a ser lo que se le entregue al cliente cuando solicite datos.
 
*Para ello cargamos la clase y creamos un objeto de la misma
 
*Modificamos su valor
 
*Devolvemos el objeto
 
*Tenemos que dejar esta función disponible para el cliente, para ello hay que hacer una especie de publicación.
 
Para ello necesitamos acceder a la clase Jaxon
 
<source lang=php>
 
  use Jaxon\Response\Response;
 
  use Jaxon\Jaxon;
 
 
class ServidorAjax
 
{
 
    public function saluda(){
 
        $respuesta = new Response();
 
        $respuesta->alert("Hola cliente desde el servidor");
 
        return $respuesta;
 
    }
 
    }
 
}
 
</source>
 
*Ahora dejamos la función disponible al cliente
 
<source lang=php>
 
// Register an instance of the class with Jaxon
 
$ajax->register(Jaxon::CALLABLE_OBJECT, new ServidorAjax());
 
 
// Call the Jaxon processing engine
 
$ajax->processRequest();
 
</source>
 
*Podemos ver cómo en el cliente está el método saluda disponible
 
 
 
6.-Ahora lo que nos queda es invocarlo desde el cliente y obtener su respuesta
 
*Es decir, ahora queremos que
 
#Ocurra un evento en el cliente
 
#Que invoque sólo a la función '''''saluda''''' del servidor
 
#recoger en el cliente lo que esa función devuelva
 
*Para ello creamos el evento en el cliente, por ejemplo un botón
 
<source lang=html5>
 
<button onclick="ajax_saluda()">Haz click invocar una función ajax</button>
 
</source>
 
*Creamos la función ajax_saluda() en el cliente que invoca al método publicado en el servidor
 
 
 
 
 
$text = ($isCaps) ? 'HELLO WORLD!' : 'Hello World!';
 
Insert javascript and CSS code in the HTML page with calls to
 
 
 
 
 
 
Make sure that the application does not use one of the classes that were deprecated.
 
Install the jaxon-core package with Composer and load the autoloader in the application.
 
Access to the main object with $jaxon = jaxon(), and get response objects by instanciating the Jaxon\Response\Response class.
 
Set the new configuration options with calls to $jaxon->setOption(), especially the core.request.uri and core.language options which replace the $sRequestURI and $sLanguage parameters of the xajax class constructor.
 
 
===Xajax===
 
*Para instalarlo vamos a la página oficial
 
http://www.xajax-project.org/en/home/ si no está disponible ir a esta ubicación de githun
 
https://github.com/Xajax/Xajax
 
*Esta página suele estar con mucha frecuencia hakeada.
 
*En la sección download podemos bajar la versión 0.6 (es beta, pero funciona ok). Para un sitio en producción se recomienda la última estable (0.5)
 
*Nos interesan las carpetas '''''xajax_core''''' y '''''xajax_js''''', las cuales incorporaremos a nuestro proyecto
 
*Además en el fichero php donde  vayamos a usarlo lo incluiremos
 
<source lang=php>
 
require_once (./xajax_core/xajax_inc.php');
 
</source>
 
*Nosotros usaremos la clase '''''xajax''''', podemos ver su documentación en la misma página sección '''''doc&tutorial'''''
 
http://www.xajax-project.org/en/docs-tutorials/api-docs/xajax-core/xajax-inc-php/xajax/
 
 
===Usando xajax===
 
*Para usar esta tecnología con esta clase
 
<source lang=php>
 
require_once (./xajax_core/xajax_inc.php');
 
 
$miXajax = new xajax();
 
</source>
 
*La clase necesita incluir una serie de código en javascript en la página que vamos a generar, '''''printJavascript()'''''
 
<source lang=php>
 
....
 
$miXajax->printJavascript()
 
</source>
 
*Prueba a ver el resultado de la página con lo escrito hasta ahora. Para ello ejecuta el proyecto, y aunque no aparezca nada, mira el código de la página en el cliente y podrás observar algo parecido
 
{{Plegable|hide|index.php probando el método printJavaScript|
 
<source lang=php>
 
<?php
 
//cargo la librería de xajax
 
require ('xajax_core/xajax.inc.php');
 
 
$ajax = new xajax();
 
$ajax->printJavascript();
 
 
?>
 
<!doctype html>
 
<html lang="en">
 
    <head>
 
        <meta charset="UTF-8">
 
        <title>Probando xajax</title>
 
        <script type="text/javascript" src="valida.js"></script>
 
 
 
    </head>
 
    <body>
 
        <h1> Accede al código fuente de esta página y verás código javascript</h1>
 
 
 
 
    </body>
 
</html>
 
</source>
 
}}
 
{{Plegable|hide|Viendo el resultado del código escrito|
 
<source lang=html5>
 
 
 
<script type="text/javascript" charset="UTF-8">
 
/* <![CDATA[ */
 
try { if (undefined == xajax.config) xajax.config = {}; } catch (e) { xajax = {}; xajax.config = {}; };
 
xajax.config.requestURI = "http://localhost/AppAjax/index.php";
 
xajax.config.statusMessages = false;
 
xajax.config.waitCursor = true;
 
xajax.config.version = "xajax 0.5";
 
xajax.config.defaultMode = "asynchronous";
 
xajax.config.defaultMethod = "POST";
 
xajax.config.JavaScriptURI = "";
 
/* ]]> */
 
</script>
 
<script type="text/javascript" src="xajax_js/xajax_core.js" charset="UTF-8"></script>
 
<script type="text/javascript" charset="UTF-8">
 
/* <![CDATA[ */
 
window.setTimeout(
 
function() {
 
  var scriptExists = false;
 
  try { if (xajax.isLoaded) scriptExists = true; }
 
  catch (e) {}
 
  if (!scriptExists) {
 
  alert("Error: the xajax Javascript component could not be included. Perhaps the URL is incorrect?\nURL: xajax_js/xajax_core.js");
 
  }
 
}, 2000);
 
/* ]]> */
 
</script>
 
<!doctype html>
 
<html lang="en">
 
    <head>
 
        <meta charset="UTF-8">
 
        <title>Probando xajax</title>
 
        <script type="text/javascript" src="valida.js"></script>
 
 
 
    </head>
 
    <body>
 
        <h1> Accede al código fuente de esta página y verás código javascript</h1>
 
 
 
 
    </body>
 
</html>
 
</html>
 
}}
 
*En caso de que la librería de '''''xajax_js''''', no esté en la carpeta actual, hay que confirugarlo
 
<source lang=php>
 
...
 
$miXajax->configure ('javascript URI','./libs/');
 
 
....
 
</source>
 
 
*Podemos también establecer (solo para el desarrollo), que nos dé un traceo del proceso.
 
<source lang=php>
 
...
 
$miXajax->configure ('debug',true);
 
 
....
 
</source>
 
*A continuación debemos registrar aquellas funciones que queremos ejecutar en modo ajax.
 
Es decir el cliente puede solicitar para recargar solo parte de la página que se ejecute una función. Estas funciones las debemos de registrar primero
 
 
<source lang=php>
 
...
 
$ajax->register(XAJAX_FUNCTION, 'saludar');
 
 
....
 
</source>
 
 
*Esto implicará que se en la página html se  crea una función que tiene este nombre con el prefijo '''''xajax_'''''
 
*En el caso anterior se creará una función llamada '''''xajax_saludar(...)'''''
 
*Y para terminar este proceso de configuración, debemos usar el método que se encargue de procesar las llamadas ajax que se reciban.
 
 
<source lang=php>
 
...
 
$ajax->processRequest();
 
 
....
 
</source>
 
*El método '''''processRequest()''''' debe ser invocado antes de sacar ninguna salida '''''ni echo ni código html'''''
 
{{Resumen|
 
<source lang=php>
 
<?php
 
//cargo la librería de xajax
 
require ('xajax_core/xajax.inc.php');
 
 
$ajax = new xajax();
 
 
//Para poder tener una traza de lo que ocurre
 
$ajax->configure('debug',true);
 
//Especificar la ubicación de la librería (En este caso innecesario)
 
$ajax->configure('javascript URI','./');
 
 
//Ahora registramos las funciones que podrán ser invocadas de forma asíncrona desde el cliente
 
$ajax->register(XAJAX_FUNCTION, 'saludar');
 
$ajax->register(XAJAX_FUNCTION, 'otraFuncion');
 
//Estas acciones implicarán que en el html del cliente se creen las funciones xajax_saludar ()  y xajax_otraFuncion()
 
 
//Este método procesará las llamadas que reciba la página  ????
 
//Imporante llamarla antes de que el guión genere ningúna salida.
 
$ajax->processRequest();
 
 
 
//La librería necesita generar código java script en la página que enviamos al cliente
 
$ajax->printJavascript();
 
 
</source>
 
}}
 
 
===Implementando el método xajax en el servidor===
 
*Ahora en el servidor hay que escribir el código de la función que hemos registrado
 
*Implementarmos lo que queremos que haga
 
*Para comunicarnos con el cliente necesitamos un objeto de la clase '''''xajaxReponse()'''''
 
http://www.xajax-project.org/en/docs-tutorials/api-docs/xajax-core/xajaxresponse-inc-php/xajaxresponse/
 
<source lang=php>
 
 
function saludar ($datosDelCliente){
 
 
  $respuesta = new xajaxResponse();
 
 
 
................
 
  return $respuesta;
 
}
 
;Leyendo los datos que vienen del cliente
 
*En el parámetro de la función recibimos un array con todos los input del formulario desde el que se invoca a la función
 
<source lang=php>
 
function saludar ($datosDelCliente){
 
 
  $respuesta = new xajaxResponse();
 
 
//En el formulario del cleinte desde donde se invoca a esta función habrá un input con name  nombre
 
$nombre = $datosDelCliente['nombre'];
 
 
 
................
 
  return $respuesta;
 
}
 
</source>
 
;Indicando acciones en el cliente
 
*por ejemplo podemos poner un mensaje que se visualizará en el cliente
 
*También podemos indicar que se ejecute un script
 
<source lang=php>
 
function saludar ($datosDelCliente){
 
 
  $respuesta = new xajaxResponse();
 
  $respuesta->alert("Este es un mensaje para el cliente");
 
 
................
 
  return $respuesta;
 
}
 
</source>
 
 
;Poniendo datos para el cliente
 
*Una de los objetivos principales será pasar valores al cliente para que actualice la página
 
*Podremos actuar sobre los distintos elementos del html volviendo elementos ocultos o mostrando otros
 
*Para pasar valores usamos el método assign o append
 
<source lang=php>
 
function saludar ($datosDelCliente){
 
 
  $respuesta = new xajaxResponse();
 
  //En el formulario del cleinte desde donde se invoca a esta función habrá un input con name  nombre
 
  $nombre = $datosDelCliente['nombre'];
 
  $msj="Hola $nombre encantado de saludarte");
 
  $respuesta->assign('saludo', 'innerHTML', $msj);
 
................
 
  return $respuesta;
 
}
 
</source>
 
*En el cliente tendremos un elemento con id saludo que se sustituirá por el texto especificado <div id=saludo></div>
 
===Invocando a la función desde el cliente===
 
*Para terminar el proceso lo que nos queda es la parte de cliente
 
*Ahora tenemos que hacer que desde el cliente podamos invocar a este método
 
*En este caso lo vamos a hacer desde un formulario
 
*Nos vamos a crear un formulario donde vamos a invocar a una funcion en el cliente
 
*Esa función es la que va a invocar a la función del servidor
 
*Es importante ahora el id del formulario que va a ser el nombre de array con el que el servidor va a recibir los datos del mismo
 
*Al mismo tiempo establecemos un id para ubicar el lugar donde pongamos el texto que el servidor nos ponga
 
<source lang=html5>
 
 
<form id='datosFormulario' action="javascript:void(null);" onsubmit="saludar();">
 
            Dime tu nombre:
 
            <input type="text" name="nombre" id="nombreCliente">
 
            <input type="submit" value="enviar">
 
            <div id="saludo" ></div>
 
</form>
 
</source>
 
*Ahora queda implementar la función saludar()
 
<source lang=html5>
 
<script type="text/javascript">
 
 
function saludar() {
 
 
 
    // Aquí se hace la llamada a la función registrada de PHP
 
    xajax_saludar(xajax.getFormValues("datosFormulario"));
 
 
    return false;
 
}
 
</script>
 
</source>
 
*Como ya sabéis se recomienda escribir las funciones en un fichero aparte
 
<source lang=html5>
 
  <script type="text/javascript" src="saludar.js"></script>
 
</source>
 
* y ya en el fichero saludar.js escribimos la función
 
 
===Ejemplo===
 
*Hacemos un programa que nos haga o el cuadrado de un número o su raiz cuadrada meditante llamadas ajax
 
 
<source lang=php>
 
<?php
 
//cargo la librería de xajax
 
require ('xajax_core/xajax.inc.php');
 
 
$ajax = new xajax();
 
 
//$ajax->configure('debug',true);
 
//Estas funciones podrán ser invocadas de forma asíncrona desde el cleinte
 
$ajax->register(XAJAX_FUNCTION, 'calcularC');
 
$ajax->register(XAJAX_FUNCTION, 'calcularR');
 
 
//Este método procesará las llamadas que reciba la página  ????
 
//Imporante llamarla antes de que el guión genere ningúna salida.
 
$ajax->processRequest();
 
 
//$ajax->configure('javascript URI','./');
 
//La librería necesita generar código java script en la página que envíamos al cliente
 
$ajax->printJavascript();
 
 
 
 
 
 
 
function calcularC($datos) {
 
    $respuesta = new xajaxResponse();
 
    $num = $datos['cuadradoServidor'];
 
    $r = $num*$num;
 
    $respuesta->alert("Calculando Cuadrado .....");
 
    $respuesta->assign('valorC', 'innerHTML', $r);
 
    return $respuesta;
 
}
 
 
function calcularR($datos) {
 
    $respuesta = new xajaxResponse();
 
    $num=$datos['raizServidor'];
 
    $rtdo = sqrt($num);
 
    $respuesta->alert("Calculando Raiz .....");
 
    $respuesta->assign('valorR', 'innerHTML', $rtdo);
 
    return $respuesta;
 
}
 
?>
 
 
<!doctype html>
 
<html lang="en">
 
    <head>
 
        <meta charset="UTF-8">
 
        <title>Probando xajax</title>
 
        <script type="text/javascript" src="valida.js"></script>
 
 
 
    </head>
 
    <body>
 
        <form id='datosC' action="javascript:void(null);" onsubmit="calcularCuadrado();">
 
            Calcula Cuadrado:
 
            <input type="text" name="cuadradoServidor" id="cuadradoCliente">
 
            <input type="submit" value="calcular Cuadrado" name="calcularC">
 
            <div id="valorC" ></div>
 
        </form>
 
        <hr/>
 
 
        <form id='datosR' action="javascript:void(null);" onsubmit="calcularRaiz();">
 
            Calcula Raiz:
 
            <input type="text" name="raizServidor" id="raizCliente">
 
            <input type="submit" value="calcular Raiz" name="calcularR">
 
            <div id="valorR" ></div>
 
        </form>
 
        <hr />
 
   
 
 
    </body>
 
</html>
 
</source>
 
 
<source lang=javascript>
 
/*
 
* To change this license header, choose License Headers in Project Properties.
 
* To change this template file, choose Tools | Templates
 
* and open the template in the editor.
 
*/
 
 
 
 
function calcularCuadrado() {
 
    // Se cambia el botón de Enviar y se deshabilita
 
    //  hasta que llegue la respuesta
 
  // xajax.$('enviar').disabled = true;
 
  // xajax.$('enviar').value = "Procesando.....";
 
 
    // Aquí se hace la llamada a la función registrada de PHP
 
    xajax_calcularC(xajax.getFormValues("datosC"));
 
 
    return false;
 
}
 
 
function calcularRaiz() {
 
    // Se cambia el botón de Enviar y se deshabilita
 
    //  hasta que llegue la respuesta
 
  // xajax.$('enviar').disabled = true;
 
  // xajax.$('enviar').value = "Procesando.....";
 
 
    // Aquí se hace la llamada a la función registrada de PHP
 
    xajax_calcularR(xajax.getFormValues("datosR"));
 
 
    return false;
 
}
 
 
</source>
 
 
{{Actividad|
 
*Vamos a hacer una validación de un formulario en el servidor usando ajax
 
<source lang=html5>
 
<span class='error'>Debe tener más de 3 caracteres.</span>
 
<span class='error'>Debe ser mayor de 5 caracteres o no coinciden.</span>
 
<span class='error'>La dirección de email no es válida.</span>
 
 
</source>
 
</source>
 +
Debemos tener los ficheros javascript que utiliza
  
*Para ello vamos a tener las siguientes funciones en php
+
https://github.com/jaxon-php/jaxon-js
}}
+
https://www.jaxon-php.org/docs/usage/installation.html
*Descargamos los ficheros de github git clone git:/githib.com/MAlejandroR/xajax
+

Revisión de 09:28 17 feb 2019

Xajax: poner ajax desde el servidor

Qué es ajax

Dónde lo pongo? Qué elementos intervienen en una comunicacion ajax

Usando la librería

  • La instalamos desde composer la librería que queremos utilizar

Idioma no válido.

Necesita especificar un idioma como esto: <source lang="html4strict">...</source>

lenguajes soportados para sintaxis remarcada:

4cs, 6502acme, 6502kickass, 6502tasm, 68000devpac, abap, actionscript, actionscript3, ada, algol68, apache, applescript, apt_sources, arm, asm, asp, asymptote, autoconf, autohotkey, autoit, avisynth, awk, bascomavr, bash, basic4gl, bf, bibtex, blitzbasic, bnf, boo, c, c_loadrunner, c_mac, caddcl, cadlisp, cfdg, cfm, chaiscript, cil, clojure, cmake, cobol, coffeescript, cpp, cpp-qt, csharp, css, cuesheet, d, dcl, dcpu16, dcs, delphi, diff, div, dos, dot, e, ecmascript, eiffel, email, epc, erlang, euphoria, f1, falcon, fo, fortran, freebasic, freeswitch, fsharp, gambas, gdb, genero, genie, gettext, glsl, gml, gnuplot, go, groovy, gwbasic, haskell, haxe, hicest, hq9plus, html4strict, html5, icon, idl, ini, inno, intercal, io, j, java, java5, javascript, jquery, kixtart, klonec, klonecpp, latex, lb, ldif, lisp, llvm, locobasic, logtalk, lolcode, lotusformulas, lotusscript, lscript, lsl2, lua, m68k, magiksf, make, mapbasic, matlab, mirc, mmix, modula2, modula3, mpasm, mxml, mysql, nagios, netrexx, newlisp, nsis, oberon2, objc, objeck, ocaml, ocaml-brief, octave, oobas, oorexx, oracle11, oracle8, oxygene, oz, parasail, parigp, pascal, pcre, per, perl, perl6, pf, php, php-brief, pic16, pike, pixelbender, pli, plsql, postgresql, povray, powerbuilder, powershell, proftpd, progress, prolog, properties, providex, purebasic, pycon, pys60, python, q, qbasic, rails, rebol, reg, rexx, robots, rpmspec, rsplus, ruby, sas, scala, scheme, scilab, sdlbasic, smalltalk, smarty, spark, sparql, sql, stonescript, systemverilog, tcl, teraterm, text, thinbasic, tsql, typoscript, unicon, upc, urbi, uscript, vala, vb, vbnet, vedit, verilog, vhdl, vim, visualfoxpro, visualprolog, whitespace, whois, winbatch, xbasic, xml, xorg_conf, xpp, yaml, z80, zxbasic


"require": {
    "jaxon-php/jaxon-core": "~2.0"
}

Debemos tener los ficheros javascript que utiliza

https://github.com/jaxon-php/jaxon-js https://www.jaxon-php.org/docs/usage/installation.html