PHP Classes

File: jqSajax.class.php

Recommend this page to a friend!
  Classes of winoto satoewarna   jqSajax   jqSajax.class.php   Download  
File: jqSajax.class.php
Role: Class source
Content type: text/plain
Description: jqSajax class
Class: jqSajax
Call PHP functions from Javascript using AJAX
Author: By
Last change: This release add feature to call object in object. Now,jqSajax Support calling object in object with N degrees. Call $class->method1->method2->method3 ... methodN() as $.x_class_method1_method2_method3_ ....methodN()
Date: 16 years ago
Size: 14,534 bytes
 

Contents

Class file image Download
<?php /** * jqSajax :: Sajax use with JQUERY * @version $1.0.2 (13 september 2008) * By winoto (http://satoewarna.com) email:winoto@satoewarna.com @2008 * You can export PHPfunction, your personal function, your method, or your PHP Class * and call it and return value from your AJAX Application * You can return String,Numeric,Array,Object and vice versa * See the readme for detail * * I have built some rich application based on PHP and MySQL (i.e ERP, accounting, inventory, parking, * academic information system, schedulling, portal, medical information system, etc). * I can customize it for You. * * jQuery (http://jquery.com) copyrighted by Jhon Resig (http://ejhon.org) * SAJAX PHP BACKEND copyrighted by Thomas Lackner and ModernMethod (http://www.modernmethod.com/). * serialize and unserialized method original by: Arpad Ray (mailto:arpad@php.net) * for wide encoding support,you can use serialize/unserialize from http://www.phprpc.org/ * you can use JSON class from http://www.JSON.org/json2.js to parse and stringify JSON * **/ class jqSajax{ var $version = '1.0'; var $debug_mode = 0; var $target_id=''; var $export_list = array(); var $request_type = 'POST'; var $js_has_been_shown=0; var $failure_redirect = ''; var $friendly_url =0; //the friendly_url is usefull for GET, if httacess is set to friendy_url and $friendly_url=0, //the result may be the default page (error query occured) var $as_method=1;//export function or method as jqSajax Method var $as_jquery_plugin=0;//export function or method as jQuery Plugin var $asincronous=1;//$asincronous=1 to force javascript wait the result from ajax var $use_json=1;//force to use json function jqSajax($jq=1,$asc=1,$json=1){ if($jq==0){$this->as_method=0;$this->as_jquery_plugin=0;} if($jq==1){$this->as_jquery_plugin=1;$this->as_method=0;} if($jq==2){$this->as_method=1;$this->as_jquery_plugin=0;} $this->asincronous=$asc; $this->use_json=$json; //if($this->as_jquery_plugin)$this->as_method=0; } function getUri($uri='') { if($uri=='')$uri=$_SERVER["REQUEST_URI"]; return $uri; } function checkJson(){ if(function_exists('json_encode') && $this->use_json)return true; else return false; } function getJsRepr($value) { $value=serialize($value); // Escapes a string so it can be safely echo'ed out as Javascript $value = str_replace(array('\\', "'"), array("\\\\", "\\'"), $value); $value = preg_replace('#([\x00-\x1F])#e', '"\x" . sprintf("%02x", ord("\1"))', $value); $value = "'$value'"; return $value; } function processClientReq() { $mode = ""; $obj=isset($_REQUEST['rsobj'])?$_REQUEST['rsobj']:''; if (! empty($_GET["rs"])) $mode = "get"; if (!empty($_POST["rs"])) $mode = "post"; if (empty($mode)) return; $target = ""; if ($mode == "get") { // Bust cache in the head header ("Expires: Mon, 26 Jul 1997 05:00:00 GMT"); // Date in the past header ("Last-Modified: " . gmdate("D, d M Y H:i:s") . " GMT"); // always modified header ("Cache-Control: no-cache, must-revalidate"); // HTTP/1.1 header ("Pragma: no-cache"); // HTTP/1.0 $func_name = $_GET["rs"]; if (! empty($_GET["rsargs"])) $args = $_GET["rsargs"]; else $args = array(); } else { $func_name = $_POST["rs"]; if (! empty($_POST["rsargs"])) $args = $_POST["rsargs"]; else $args = array(); } if($obj!='')$fname=$obj.$func_name; else $fname=$func_name; if (! in_array($fname, $this->export_list)) echo "-:$func_name not callable"; else { if(!$this->checkJson())echo "+:"; //for PHP 5 foreach($args as $key=>$value)$args[$key]=str_replace(array("\\\"", "\\'"), array('"', "'"), $value); if($obj=='')$result = call_user_func_array($func_name, $args); else{ $objg=explode('->',$obj); eval("global \$".$objg[0].';'); foreach($args as $key=>$value)$arg[$key]='\''.$value.'\''; if(isset($arg))$arg2=implode(',',$arg); else $arg2=NULL; eval("\$result=\$$fname($arg2);"); } //echo "var res = " . trim($this->getJsValue($result)) . "; res;"; if(!$this->checkJson())echo "var res = " . trim($this->getJsRepr($result)) . "; res;"; else { if(is_string($result))echo json_encode('"'.addslashes($result).'"'); else echo json_encode($result); //see http://www.json.org/js.html for better solution } //because we use php serialize/unserialize http://www.coolcode.cn/?p=171 //echo "var res = '" . trim(sajax_esc($result)) . "'; res;"; } exit; } function getCommonJs() { $t = strtoupper($this->request_type); if ($t != "" && $t != "GET" && $t != "POST") return "// Invalid type: $t.. \n\n"; ob_start(); ?> var jqSajax = { debug_mode : <?php echo $this->debug_mode ? "true" : "false"; ?>,request_type : "<?php echo $t; ?>", target_id : <?php echo '\''.$this->target_id.'\''; ?>,failure_redirect : "<?php echo $this->failure_redirect; ?>", friendly_url : <?php echo $this->friendly_url ? "true" : "false"; ?>,requests: new Array(),data_return:"", debug:function(text) {if (this.debug_mode)alert(text);}, cancel: function() {for (var i = 0; i < this.requests.length; i++)this.requests[i].abort();}, serialize:function(inp){ var getType=function(inp){var type=typeof inp,match;if(type=='object'&&!inp){return'null'}if(type=="object"){if(!inp.constructor){return'object'}var cons=inp.constructor.toString();if(match=cons.match(/(\w+)\(/)){cons=match[1].toLowerCase()}var types=["boolean","number","string","array"];for(key in types){if(cons==types[key]){type=types[key];break}}}return type};var type=getType(inp);var val;switch(type){case"undefined":val="N";break;case"boolean":val="b:"+(inp?"1":"0");break;case"number":val=(Math.round(inp)==inp?"i":"d")+":"+inp;break;case"string":val="s:"+inp.length+":\""+inp+"\"";break;case"array":val="a";case"object":if(type=="object"){var objname=inp.constructor.toString().match(/(\w+)\(\)/);if(objname==undefined){return}objname[1]=this.serialize(objname[1]);val="O"+objname[1].substring(1,objname[1].length-1)}var count=0;var vals="";var okey;for(key in inp){okey=(key.match(/^[0-9]+$/)?parseInt(key):key);vals+=this.serialize(okey)+this.serialize(inp[key]);count++}val+=":"+count+":{"+vals+"}";break}if(type!="object"&&type!="array")val+=";";return val; }, unserialize:function(inp){ error=0;if(inp==""||inp.length<2){errormsg="";return}var val,kret,vret,cval;var type=inp.charAt(0);var cont=inp.substring(2);var size=0,divpos=0,endcont=0,rest="",next="";switch(type){case"N":if(inp.charAt(1)!=";"){errormsg=""}rest=cont;break;case"b":if(!/[01];/.test(cont.substring(0,2))){errormsg=""}val=(cont.charAt(0)=="1");rest=cont.substring(2);break;case"s":val="";divpos=cont.indexOf(":");if(divpos==-1){errormsg="";break}size=parseInt(cont.substring(0,divpos));if(size==0){if(cont.length-divpos<4){errormsg="";break}rest=cont.substring(divpos+4);break}if((cont.length-divpos-size)<4){errormsg="";break}if(cont.substring(divpos+2+size,divpos+4+size)!="\";"){errormsg=""}val=cont.substring(divpos+2,divpos+2+size);rest=cont.substring(divpos+4+size);break;case"i":case"d":var dotfound=0;for(var i=0;i<cont.length;i++){cval=cont.charAt(i);if(isNaN(parseInt(cval))&&!(type=="d"&&cval=="."&&!dotfound++)){endcont=i;break}}if(!endcont||cont.charAt(endcont)!=";"){errormsg=""}val=cont.substring(0,endcont);val=(type=="i"?parseInt(val):parseFloat(val));rest=cont.substring(endcont+1);break;case"a":if(cont.length<4){errormsg="";return}divpos=cont.indexOf(":",1);if(divpos==-1){errormsg="";return}size=parseInt(cont.substring(1*divpos,0));cont=cont.substring(divpos+2);val=new Array();if(cont.length<1){errormsg="";return}for(var i=0;i+1<size*2;i+=2){kret=this.unserialize(cont,1);if(error||kret[0]==undefined||kret[1]==""){errormsg="";return}vret=this.unserialize(kret[1],1);if(error){errormsg="";return}val[kret[0]]=vret[0];cont=vret[1]}if(cont.charAt(0)!="}"){errormsg="";return}rest=cont.substring(1);break;case"O":divpos=cont.indexOf(":");if(divpos==-1){errormsg="";return}size=parseInt(cont.substring(0,divpos));var objname=cont.substring(divpos+2,divpos+2+size);if(cont.substring(divpos+2+size,divpos+4+size)!="\":"){errormsg="";return}var objprops=this.unserialize("a:"+cont.substring(divpos+4+size),1);if(error){errormsg="";return}rest=objprops[1];var objout="function "+objname+"(){";for(key in objprops[0]){objout+="this['"+key+"']=objprops[0]['"+key+"'];"}objout+="}val=new "+objname+"();";eval(objout);break;default:errormsg=""}return(arguments.length==1?val:[val,rest]); }, fhasilc:function(text){this.debug("the data return is: " + text);var txt = text.replace(/^\s*|\s*$/g,""); if(txt.substring(2,5)=='var')return this.unserialize(eval(txt.substring(2))); }, fhasil:function(text){ jqSajax.debug("PHP method/function Result is: \n"+text); <?php if($this->asincronous){ if($this->checkJson()) echo 'jqSajax.data_return=eval(text);'; else echo 'jqSajax.data_return=text;'; } else { if($this->checkJson()) echo 'var data==eval(text);'; else echo 'var data=jqSajax.fhasilc(text);'; echo 'alert(\'Type: \'+typeof data +\', data:\'+data);'; } ?> }, <?php if($this->as_method)echo $this->getCommonMethod(); ?> do_call:function(func_name, args, obj) { var i,post_data,target_id,uri; this.debug("in jqSajax.do_call()...\nRequest Type: " + this.request_type + "\nTarget Id: " + this.target_id); target_id = this.target_id; if (typeof(this.request_type) == "undefined" || this.request_type == "")this.request_type = "GET"; uri = "<?php echo $this->getUri(); ?>"; if (this.request_type == "GET") { if (uri.indexOf("?") == -1 && this.friendly_url==false)uri += "?rs=" + escape(func_name); else uri += "&rs=" + escape(func_name); uri += "&rst=" + escape(target_id); uri += "&rsrnd=" + new Date().getTime(); uri += "&rsobj=" + obj; for (i = 0; i < args.length; i++)uri += "&rsargs[]=" + escape(args[i]); post_data = null; } else if (this.request_type == "POST") { post_data = "rs=" + escape(func_name); post_data += "&rst=" + escape(this.target_id); post_data += "&rsrnd=" + new Date().getTime(); post_data += "&rsobj=" + obj; for (i = 0; i < args.length; i++)post_data = post_data + "&rsargs[]=" + escape(args[i]); } else this.debug("Illegal request type: " + this.request_type); this.debug("Do requested page with JQUERY ajax..."); this.debug("URI: "+uri); this.debug("Post Data: "+post_data); $.ajax({ async:false, type: this.request_type, url : uri, data: post_data, <?php if($this->checkJson()) echo "dataType:\"json\",\n";?> success:this.fhasil }); } }; <?php $html = ob_get_contents(); ob_end_clean(); return $html; } function showCommonJs() { echo $this->getCommonJs(); } function getOneStub($func_name,$obj='') { ob_start(); //if($obj!='')$pobj=$obj.'_'; if($obj!='')$pobj=preg_replace('/->/','_',$obj); else $pobj=''; ?> function x_<?php echo $pobj.$func_name; ?>(){jqSajax.do_call("<?php echo $func_name; ?>",x_<?php echo $pobj.$func_name; ?>.arguments,"<?php echo $obj; ?>");<?php if($this->asincronous)if($this->checkJson()) echo 'return jqSajax.data_return';else echo 'return jqSajax.fhasilc(jqSajax.data_return)';?>} <?php $html = ob_get_contents(); ob_end_clean(); return $html; } function getOneMethod($func_name,$obj='') { ob_start(); //if($obj!='')$pobj=$obj.'_'; if($obj!='')$pobj=preg_replace('/->/','_',$obj); else $pobj=''; ?> x_<?php echo $pobj.$func_name; ?>:function(){this.do_call("<?php echo $func_name; ?>",this.x_<?php echo $pobj.$func_name; ?>.arguments,"<?php echo $obj; ?>");<?php if($this->asincronous)if($this->checkJson()) echo 'return jqSajax.data_return';else echo 'return jqSajax.fhasilc(jqSajax.data_return)';?>}, <?php $html = ob_get_contents(); ob_end_clean(); return $html; } function getOneJquery($func_name,$obj='') { ob_start(); //if($obj!='')$pobj=$obj.'_'; if($obj!='')$pobj=preg_replace('/->/','_',$obj); else $pobj=''; ?> $.x_<?php echo $pobj.$func_name; ?>=function(){jqSajax.do_call("<?php echo $func_name; ?>",$.x_<?php echo $pobj.$func_name; ?>.arguments,"<?php echo $obj; ?>");<?php if($this->asincronous)if($this->checkJson()) echo 'return jqSajax.data_return';else echo 'return jqSajax.fhasilc(jqSajax.data_return)';?>}; <?php $html = ob_get_contents(); ob_end_clean(); return $html; } function export() { $n = func_num_args(); for ($i = 0; $i < $n; $i++) { $this->export_list[] = func_get_arg($i); } } function exportObj() { $n = func_num_args(); for ($i = 0; $i < $n; $i++) { $name=func_get_arg($i); eval("global \$$name;"); eval("\$method=get_class_methods(\$$name);"); foreach($method as $value)$this->export_list[] = $name.'->'.$value; } } function getCommonMethod() { $html = ""; foreach ($this->export_list as $func) { $dt=explode('->',$func); $cdt=count($dt); if($dt==1)$html .= $this->getOneMethod($dt[0]); else{ //$html .= $this->getOneMethod($dt[1],$dt[0]); $depan=preg_replace('/'.$dt[$cdt-1].'/','',$func); $html .= $this->getOneMethod($dt[$cdt-1],$depan); } } return $html; } function getJs() { $html = ""; if($this->as_jquery_plugin)$this->as_method=0; if($this->as_method)$html .= $this->getCommonJs(); else{ if (! $this->js_has_been_shown) { $html .= $this->getCommonJs(); $this->js_has_been_shown = 1; } foreach ($this->export_list as $func) { $dt=explode('->',$func); $cdt=count($dt); if($this->as_jquery_plugin){ if($cdt==1)$html .= $this->getOneJquery($dt[0]); else { $depan=preg_replace('/'.$dt[$cdt-1].'/','',$func); $html .= $this->getOneJquery($dt[$cdt-1],$depan); } } if(!$this->as_jquery_plugin && !$this->as_method){ if($cdt==1)$html .= $this->getOneStub($dt[0]); else { $depan=preg_replace('/'.$dt[$cdt-1].'/','',$func); $html .= $this->getOneStub($dt[$cdt-1],$depan); } } } } return $html; } function showJs() { echo $this->getJs(); } } ?>