/** * * @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; }
/** * 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); }