Login   Register  
PHP Classes
elePHPant
Icontem

File: jqSajax.class.php

Recommend this page to a friend!
Stumble It! Stumble It! Bookmark in del.icio.us Bookmark in del.icio.us
  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: 6 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();
	}
}
?>