Disectando Sajax
Tanto buzz acerca de Ajax por aquí, Ajax por acá, que decidí tomar el toro por las astas y me pusé a buscar por ahí
Como soy un perezoso sin remedio, busque para partir la implementación más breve, que parece ser Sajax. En estos momentos, está en su versión 0.10, la cual se puede ver (para PHP) en esta dirección.
Los conceptos fundamentales son bastante simples
- El lenguaje de servidor se encarga de crear tanto la parte del servidor como la del cliente, o sea, el Javascript necesario
- Las funciones del lado del servidor deben "registrarse", para ser aceptadas por la aplicación
- El javascript generado tiene una parte "estática", que podría incluirse en un sajax.js, digamos, y una parte "dinámica", generada por el propio php. Esta tiene relación con generar funciones "stub", que tienen el mismo nombre de la función del servidor, precedidas por "x_"
- La función a llamar desde javascript tiene el formato
x_funcion(arg1,arg2,...,callback)
Donde callback es una función que recibe el texto generado por la función del servidor
Y eso es todo. Debo reconocer que cumple a cabalidad con el principio KISS.
Como soy un complicado por naturaleza, se me ocurrió de inmediato hacer una versión en javascript independiente, basada en un objecto singleton. La gracia estaría en que el javascript quedaría absolutamente independiente del lenguaje del servidor, pudiendo acceder a cualquier recurso de red con total libertad. A continuación, les muestro la implementación de la clase oSajax en Javascript.
- var oSajax = {
- debug_mode: false,
- request_type: "GET",
- uri: "",
- debug: function (text) {
- if (this.debug_mode) {
- alert("RSD: " + text)
- }
- },
- init: function () {
- this.debug("sajax_init_object() called..")
- var A;
- try {
- A=new ActiveXObject("Msxml2.XMLHTTP");
- } catch (e) {
- try {
- A=new ActiveXObject("Microsoft.XMLHTTP");
- } catch (oc) {
- A=null;
- }
- }
- if(!A && typeof XMLHttpRequest != "undefined") {
- A = new XMLHttpRequest();
- }
- if (!A) {
- this.debug("Could not create connection object.");
- }
- return A;
- },
- do_call: function () {
- var i, x, n;
- var post_data;
- var callback=null;
- var uri = this.uri;
- var al = arguments.length;
- var args=new Array();
- if(!al) {
- alert("Necesito por lo menos un argumento");
- } else {
- func_name = arguments[0];
- if(al>1) {
- callback=arguments[1];
- for(i=2;i<al;i++) {
- args.push(arguments[i]);
- }
- }
- }
- if (this.request_type == "GET") {
- if (uri.indexOf("?") == -1) {
- uri = uri + "?rs=" + escape(func_name);
- } else {
- uri = uri + "&rs=" + escape(func_name);
- }
- for (i = 0; i < args.length; i++) {
- uri = uri + "&rsargs[]=" + escape(args[i]);
- }
- uri = uri + "&rsrnd=" + new Date().getTime();
- post_data = null;
- } else {
- post_data = "rs=" + escape(func_name);
- for (i = 0; i < args.length; i++) {
- post_data = post_data + "&rsargs[]=" + escape(args[i]);
- }
- }
- x = this.init();
- x.open(this.request_type, uri, true);
- if (this.request_type == "POST") {
- x.setRequestHeader("Method", "POST " + uri + " HTTP/1.1");
- x.setRequestHeader("Content-Type", "application/x-www-form-urlencoded");
- }
- var self=this;
- x.onreadystatechange = function() {
- if (x.readyState != 4) {
- return;
- }
- self.debug("received " + x.responseText);
- var status;
- var data;
- status = x.responseText.charAt(0);
- data = x.responseText.substring(2);
- if (status == "-") {
- alert("Error: " + data);
- } else if(callback) {
- callback(data);
- }
- }
- x.send(post_data);
- this.debug(func_name + " uri = " + uri + "/post = " + post_data);
- this.debug(func_name + " waiting..");
- delete x;
- }
- }
El script de "servidor", en serv.php
- include "Sajax.php";
- function multiply($x, $y) {
- return $x * $y;
- }
- sajax_init();
- sajax_export("multiply");
- sajax_handle_client_request();
Y el script en html
- <script language="JavaScript" src="sajax.js"></script>
- <html>
- <head>
- <title>Multiplier</title>
- <script>
- function do_multiply_cb(z) {
- document.getElementById("z").value = z;
- }
- function do_multiply() {
- // get the folder name
- var x, y;
- x = document.getElementById("x").value;
- y = document.getElementById("y").value;
- oSajax.uri="serv.php";
- oSajax.debug_mode=true;
- oSajax.do_call("multiply",do_multiply_cb,x,y);
- }
- </script>
- </head>
- <body>
- <input type="text" name="x" id="x" value="2" size="3">
- *
- <input type="text" name="y" id="y" value="3" size="3">
- =
- <input type="text" name="z" id="z" value="" size="3">
- <input type="button" name="check" value="Calculate"
- onclick="do_multiply(); return false;">
- </body>
- </html>
La gracia es que el archivo Sajax.php no se altera para nada y hacemos la implementación del javascript y del php absolutamente independientes una de otra. El servidor podría estar en ruby o en c y el html no se daría ni cuenta....
Para no ser malas personas, incluyo este mismo script a continuación, para que hagan la prueba
* =aquí pueden encontrar el archivo .tgz con los archivos utilizados. La verdad, esto es llegar y llevar :)
| Adjunto | Tamaño |
|---|---|
| disectando_sajax.tgz | 2.82 KB |
- 4316 lecturas

Justo que me estaba interesando entender ¿que diablos es el AJAX? y tambien encontre ese Toolkit, je.
Aprop. ¡ Viva el SMARTY ! ... jejejejeje
Que eres malo Ochovio. No nombres al Emperados acá....
Viva la fuerza, Xipe!
Hola
primero que nada dejame felicitarte por tu pagina la cual es un gran aporte para la comunidad de programadores.
Te cuento, estoy tratando de crear un formulario en php que se paresca a los webforms de .NET los cuales funcionan de manera muy parecida a sajax o quisas ya lo implementan.
Para lo cual modifique el ejemplo que muestras en el cual envio el rut a la funcion php la cual busca en la bd y devuelve una cadena separada por ";", mi funcion javascript recibe esta cadena y mediante un split separo el resultado y envio cada parte del arreglo a un campo del formulario, asi de esta manera muestro los datos de un usuario si este existiera, al tratar de ingresarlo al sistema.
Use el mismo procedimiento para grabar a un nuevo usuario y funciono sin problemas pero cuando quiero tener las 2 funciones en el mismo formulario me emite errores, ayer intente adjuntarte el codigo pero la pagina se cayo.
Espero me puedas ayudar al respecto o darme una url donde exista un ejemplo de webform ya que las que encontre no me ilustraron mucho.
Gracias y suerte!
Víctor!!
Víctor:
Ya te envíe mi correo, para que puedas mandarme el código. Veré si puedo hacer algo...
hola, necesito urgente saber si hay una funcion en php bajo que servidor esta corriendo la direccion de cualquier pagina que coloque. les agredeceria muchisimo si me ayudan...
Erik Blanco
Hola si les interesa una aplicacion creada por mi sin necesidad de ToolKit aqui se las dejo
http://www.ribosomatic.com/articulos/aplicacion-con-ajax-y-php-100-funcional/
Saludos
Enviar un comentario nuevo