Esempio n. 1
0
 /**
  * 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);
 }
Esempio n. 2
0
 /**
  * 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";
 }