/** * Registers a PHP variable/class in JavaScript. * * <p>Example:</p> * <code> * <script type="text/javascript"> * <?php require_once('xoad.php'); ?> * * var arr = <?= XOAD_Client::register(array(1, 2, "string", array("Nested"))) ?>; * * alert(arr); * * </script> * </code> * * @access public * * @param mixed $var Variable/Class name to register. * * @param mixed $params When registering a variable/class you can * provide extended parameters, like class name * and callback URL. * * @return string JavaString code that represents the variable/class. * * @static * */ public static function register($var, $params = null) { $type = XOAD_Utilities::getType($var); if ($type == 'object') { $paramsType = XOAD_Utilities::getType($params); if ($paramsType != 'string') { $callbackUrl = XOAD_Utilities::getRequestUrl(); if ($paramsType == 'a_array') { if (!empty($params['class'])) { $className = $params['class']; } if (!empty($params['url'])) { $callbackUrl = $params['url']; } } } else { $callbackUrl = $params; } if (method_exists($var, XOAD_CLIENT_METADATA_METHOD_NAME)) { call_user_func_array(array(&$var, XOAD_CLIENT_METADATA_METHOD_NAME), array()); } $objectCode = array(); if (empty($className)) { $className = XOAD_Utilities::caseConvert(get_class($var)); } $meta = get_object_vars($var); $objectMeta = null; if (isset($meta['xoadMeta'])) { if (XOAD_Utilities::getType($meta['xoadMeta']) == 'object') { if (strcasecmp(get_class($meta['xoadMeta']), 'XOAD_Meta') == 0) { $objectMeta = $meta['xoadMeta']; unset($meta['xoadMeta']); unset($var->xoadMeta); } } } if (sizeof($meta) > 0) { $attachMeta = array(); foreach ($meta as $key => $value) { if (!empty($objectMeta)) { if (!$objectMeta->isPublicVariable($key)) { unset($meta[$key]); unset($var->{$key}); continue; } } $valueType = XOAD_Utilities::getType($value); if ($valueType == 'object' || $valueType == 's_array' || $valueType == 'a_array') { $var->{$key} = XOAD_SERIALIZER_SKIP_STRING . XOAD_Client::register($var->{$key}, $callbackUrl); } $attachMeta[$key] = $valueType; } $var->__meta = $attachMeta; $var->__size = sizeof($attachMeta); } else { $var->__meta = null; $var->__size = 0; } $var->__class = $className; $var->__url = $callbackUrl; $var->__uid = md5(uniqid(rand(), true)); $var->__output = null; $var->__timeout = null; $serialized = XOAD_Serializer::serialize($var); $objectCode[] = substr($serialized, 1, strlen($serialized) - 2); $objectCode[] = '"__clone":function(obj){xoad.clone(this,obj)}'; $objectCode[] = '"__serialize":function(){return xoad.serialize(this)}'; $objectCode[] = '"catchEvent":function(){return xoad.catchEvent(this,arguments)}'; $objectCode[] = '"ignoreEvent":function(){return xoad.ignoreEvent(this,arguments)}'; $objectCode[] = '"postEvent":function(){return xoad.postEvent(this,arguments)}'; $objectCode[] = '"fetchOutput":function(){return this.__output}'; $objectCode[] = '"setTimeout":function(miliseconds){this.__timeout=miliseconds}'; $objectCode[] = '"getTimeout":function(){return this.__timeout}'; $objectCode[] = '"clearTimeout":function(){this.__timeout=null}'; $classMethods = get_class_methods($var); for ($iterator = sizeof($classMethods) - 1; $iterator >= 0; $iterator--) { if (strcasecmp($className, $classMethods[$iterator]) == 0) { unset($classMethods[$iterator]); continue; } if (strcasecmp($classMethods[$iterator], XOAD_CLIENT_METADATA_METHOD_NAME) == 0) { unset($classMethods[$iterator]); continue; } if (!empty($objectMeta)) { if (!$objectMeta->isPublicMethod($classMethods[$iterator])) { unset($classMethods[$iterator]); continue; } } } if (sizeof($classMethods) > 0) { $index = 0; $length = sizeof($classMethods); $returnValue = ''; foreach ($classMethods as $method) { $methodName = XOAD_Utilities::caseConvert($method); if (!empty($objectMeta)) { $mapMethodName = $objectMeta->findMethodName($methodName); if (strcmp($mapMethodName, $methodName) != 0) { $methodName = $mapMethodName; } } $serialized = XOAD_Serializer::serialize($methodName); $returnValue .= $serialized; $returnValue .= ':'; $returnValue .= 'function(){return xoad.call(this,' . $serialized . ',arguments)}'; if ($index < $length - 1) { $returnValue .= ','; } $index++; } $objectCode[] = $returnValue; } $returnValue = '{' . join(',', $objectCode) . '}'; return $returnValue; } else { if ($type == 's_array' || $type == 'a_array') { foreach ($var as $key => $value) { $valueType = XOAD_Utilities::getType($value); if ($valueType == 'object' || $valueType == 's_array' || $valueType == 'a_array') { $var[$key] = XOAD_SERIALIZER_SKIP_STRING . XOAD_Client::register($var[$key], $params); } } } else { if ($type == 'string') { $paramsType = XOAD_Utilities::getType($params); if ($paramsType == 'string') { if (class_exists($var)) { $classObject = new $var(); $classCode = XOAD_Client::register($classObject, array('class' => $var, 'url' => $params)); $classCode = $var . '=function(){return ' . $classCode . '}'; return $classCode; } } } } } return XOAD_Serializer::serialize($var); }
/** * Serializes a PHP variable into a {@link http://www.json.org JSON} string. * * <p>Example:</p> * <code> * <script type="text/javascript"> * <?php require_once('xoad.php'); ?> * * var arr = <?= XOAD_Serializer::serialize(array(1, 2, "string", array("Nested"))) ?>; * * alert(arr); * * </script> * </code> * * @access public * * @param mixed $var Variable to serialize. * * @return string {@link http://www.json.org JSON} string that * represents the variable. * * @static * */ public static function serialize(&$var) { $type = XOAD_Utilities::getType($var); if ($type == 'bool') { if ($var) { return "true"; } else { return "false"; } } else { if ($type == 'int') { return sprintf('%d', $var); } else { if ($type == 'float') { return sprintf('%f', $var); } else { if ($type == 'string') { if (strlen($var) >= strlen(XOAD_SERIALIZER_SKIP_STRING)) { if (strcasecmp(substr($var, 0, strlen(XOAD_SERIALIZER_SKIP_STRING)), XOAD_SERIALIZER_SKIP_STRING) == 0) { return substr($var, strlen(XOAD_SERIALIZER_SKIP_STRING), strlen($var) - strlen(XOAD_SERIALIZER_SKIP_STRING)); } } // This code is based on morris_hirsch's // comment in utf8_decode function documentation. // // http://bg.php.net/utf8_decode // // Thank you. // $ascii = ''; $length = strlen($var); for ($iterator = 0; $iterator < $length; $iterator++) { $char = $var[$iterator]; $charCode = ord($char); if ($charCode == 0x8) { $ascii .= '\\b'; } else { if ($charCode == 0x9) { $ascii .= '\\t'; } else { if ($charCode == 0xa) { $ascii .= '\\n'; } else { if ($charCode == 0xc) { $ascii .= '\\f'; } else { if ($charCode == 0xd) { $ascii .= '\\r'; } else { if ($charCode == 0x22 || $charCode == 0x2f || $charCode == 0x5c) { $ascii .= '\\' . $var[$iterator]; } else { if ($charCode < 128) { $ascii .= $char; } else { if ($charCode >> 5 == 6) { $byteOne = $charCode & 31; $iterator++; $char = $var[$iterator]; $charCode = ord($char); $byteTwo = $charCode & 63; $charCode = $byteOne * 64 + $byteTwo; $ascii .= sprintf('\\u%04s', dechex($charCode)); } else { if ($charCode >> 4 == 14) { $byteOne = $charCode & 31; $iterator++; $char = $var[$iterator]; $charCode = ord($char); $byteTwo = $charCode & 63; $iterator++; $char = $var[$iterator]; $charCode = ord($char); $byteThree = $charCode & 63; $charCode = ($byteOne * 64 + $byteTwo) * 64 + $byteThree; $ascii .= sprintf('\\u%04s', dechex($charCode)); } else { if ($charCode >> 3 == 30) { $byteOne = $charCode & 31; $iterator++; $char = $var[$iterator]; $charCode = ord($char); $byteTwo = $charCode & 63; $iterator++; $char = $var[$iterator]; $charCode = ord($char); $byteThree = $charCode & 63; $iterator++; $char = $var[$iterator]; $charCode = ord($char); $byteFour = $charCode & 63; $charCode = (($byteOne * 64 + $byteTwo) * 64 + $byteThree) * 64 + $byteFour; $ascii .= sprintf('\\u%04s', dechex($charCode)); } } } } } } } } } } } return '"' . $ascii . '"'; } else { if ($type == 's_array') { $index = 0; $length = sizeof($var); $returnValue = '['; foreach ($var as $value) { $returnValue .= XOAD_Serializer::serialize($value); if ($index < $length - 1) { $returnValue .= ','; } $index++; } $returnValue .= ']'; return $returnValue; } else { if ($type == 'a_array') { $index = 0; $length = sizeof($var); $returnValue = '{'; foreach ($var as $key => $value) { $returnValue .= XOAD_Serializer::serialize($key); $returnValue .= ':'; $returnValue .= XOAD_Serializer::serialize($value); if ($index < $length - 1) { $returnValue .= ','; } $index++; } $returnValue .= '}'; return $returnValue; } else { if ($type == 'object') { $objectVars = get_object_vars($var); return XOAD_Serializer::serialize($objectVars); } } } } } } } return "null"; }