查看文章 |
Cakephp应用Jquery&JSON(JSONP)跨域调用实例
2008-04-17 上午 09:48
Json的好处就不累赘了,有说好的,也有说不好的。但是,json的size比xml小大约50%基本都是大家认可的。 从Jquery 1.2开始,增加了JSONP的支持,简单来说,就是提供一种方法可以进行跨域的引用JSON。 首先,应用JSONP需要Client端发起一个JSON的请求。 $.getJSON("http://www.example.com/cates/getXML.json?callback=?", //调用JSONP function(data){ $.each(data.items, function(i,item){ $("<img/>").attr("src", "http://www.example.com/"+item.Post.post_pic_path+item.Post.post_pic_name).appendTo("#home"); }); }); 从Cakephp 1.2开始,对于JSON的支持更加有好。 1. 在Config/router.php文件内增加,这种做的目的就是可以相应.json的请求 Router::parseExtensions('rss', 'json', 'xml'); 2. 在你要应用的Controller内增加一下两个 var $helpers = array('Javascript'); //用来将PHP Array转化为Object var $components = array('RequestHandler'); //用来支持输出定义化的格式 3. 在你要使用的Function中 function getJSON() { $this->RequestHandler->setContent('json', 'text/x-json'); $new1 = $this->getMainNews(1,41,3); $this->set('aPosts', $new1); if(isset($this->params['url']['callback'])) { $callback = $this->params['url']['callback']; $this->set('callback', $callback); } } 4. 增加View层的支持 4.1 增加 layouts/ json/ default.ctp <?php header("Pragma: no-cache"); header("Cache-Control: no-store, no-cache, max-age=0, must-revalidate"); header('Content-Type: text/x-json'); header("X-JSON: ".$content_for_layout); ?> <?php echo $content_for_layout; ?> 4.2 增加 views/ json/ get_j_s_o_n.ctp cates/ get_j_s_o_n.ctp <?php echo $callback?>({ //返回请求JSONP的参数用来匹配 "title": "", "link": "/", "description": "", "modified": "", "generator": "", "items": <?php echo $javascript->object($aPosts); // 将PHP Array转化为Object ?> }) 5. 这样,我们就可以访问/controller/getJSON得到普通的HTML页面,而访问/controller/getJSON.json得到所需要的JSON结果了 |
最近读者: