From 0226f8f5f430d34b3cead40c4eb7b458933d16c6 Mon Sep 17 00:00:00 2001 From: wei <> Date: Wed, 18 Jan 2006 04:20:26 +0000 Subject: update javascript library and usage in web controls --- .../Web/Javascripts/TJavascriptSerializer.php | 141 +++++++++++++++++++++ 1 file changed, 141 insertions(+) create mode 100644 framework/Web/Javascripts/TJavascriptSerializer.php (limited to 'framework/Web/Javascripts/TJavascriptSerializer.php') diff --git a/framework/Web/Javascripts/TJavascriptSerializer.php b/framework/Web/Javascripts/TJavascriptSerializer.php new file mode 100644 index 00000000..65567762 --- /dev/null +++ b/framework/Web/Javascripts/TJavascriptSerializer.php @@ -0,0 +1,141 @@ + + * $options['onLoading'] = "doit"; + * $options['onComplete'] = "more"; + * $js = new TJavascriptSerializer($options); + * echo $js->toMap(); + * //expects the following javascript code + * // {'onLoading':'doit','onComplete':'more'} + * + * + * For higher complexity data structures use TJSON to serialize and unserialize. + * + * Namespace: System.Web.UI + * + * @author Wei Zhuo + * @version $Revision: 1.3 $ $Date: 2005/11/10 23:43:26 $ + * @package System.Web.UI + */ +class TJavascriptSerializer +{ + protected $data; + + /** + * Serialize php data type into equivalent javascript type. + * @param mixed data to seralize + */ + public function __construct($data) + { + $this->data = $data; + } + + /** + * Converts data to javascript data string + * @return string javascript equivalent + */ + public function toJavascript($strict=false,$toMap=true) + { + $type = 'to_'.gettype($this->data); + return $this->$type($strict,$toMap); + } + + /** + * Coverts PHP arrays (only the array values) into javascript array. + * @param boolean if true empty string and empty array will be converted + * @return string javascript array as string. + */ + public function toList($strict=false) + { + return $this->to_array($strict); + } + + /** + * Coverts PHP arrays (both key and value) into javascript objects. + * @param boolean if true empty string and empty array will be converted + * @return string javascript object as string. + */ + public function toMap($strict=false) + { + return $this->to_array($strict, true); + } + + protected function to_array($strict=false,$toMap=false) + { + $results = array(); + foreach($this->data as $k => $v) + { + if($strict || (!$strict && $v !== '' && $v !== array())) + { + $serializer = new TJavascriptSerializer($v); + $result = $serializer->toJavascript($strict,$toMap); + $results[] = $toMap ? "'{$k}':$result" : $result; + } + } + $brackets = $toMap ? array('{','}') : array('[',']'); + return $brackets[0].implode(',', $results).$brackets[1]; + } + + protected function to_object($strict=false,$toMap=false) + { + if($this->data instanceof TComponent) + return $this->to_component($strict=false,$toMap=false); + + $serializer = new TJavascriptSerializer(get_object_vars($this->data)); + return $serializer->toMap($strict,$toMap); + } + + protected function to_component($strict=false,$toMap=false) + { + throw new TException("component object too complex to serialize"); + } + + protected function to_boolean() + { + return $this->data ? 'true' : 'false'; + } + + protected function to_integer() + { + return "{$this->data}"; + } + + protected function to_double() + { + if($this->data === -INF) + return 'Number.NEGATIVE_INFINITY'; + if($this->data === INF) + return 'Number.POSITIVE_INFINITY'; + return "{$this->data}"; + } + + /** + * Escapes string to javascript strings. If data to convert is string + * and is bracketed with {} or [], it is assumed that the data + * is already a javascript object or array and no further coversion is done. + */ + protected function to_string() + { + //ignore strings surrounded with {} or [], assume they are list or map + if(strlen($this->data)>1) + { + $first = $this->data[0]; $last = $this->data[strlen($this->data)-1]; + if($first == '[' && $last == ']' || + ($first == '{' && $last == '}')) + return $this->data; + } + return "'".preg_replace("/\r\n/", '\n', addslashes($this->data))."'"; + } + + protected function to_null() + { + return 'null'; + } +} + +?> \ No newline at end of file -- cgit v1.2.3