예제 #1
0
 /**
  *
  * @access	public
  *
  * @return	string
  *
  */
 public function findMethodName($methodName)
 {
     if (!empty($this->methodsMap)) {
         $name = XOAD_Utilities::caseConvert($methodName);
         if (isset($this->methodsMap[$name])) {
             return $this->methodsMap[$name];
         }
     }
     return $methodName;
 }
예제 #2
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);
 }