[本文转自:梦溪笔记]

Joomla 是一个优秀的CMS系统,她可以让你快速的完成一个网站的建设,她提供组件,模块,模板能够满足你大部分的网站需求。而组件在其中举足轻重。

一、基本知识

组件(component ) 用于显示页面的主要数据。Joomla的组件采用的是MVC架构设计。 在一个页面请求产生时,其URL中可能包括task, view, layout等信息。我在这里就是要讨论这个task和view. 一般URL中如果含有task就不会含有view, 这里因为joomla认为task就完成一个特定的任务,比如说数据库操作,有效性验证等, 而view是负责显示数据。通常的设计是task里完成任务处理后,会调用setRedirect方法引导向一个view来显示数据。其实在joomla里,如果URL中没有指定task的话,会默认task为display。

二、问题

在项目中,需要在页面的meta数据里包含Open graphic protocol 数据。Open graphic protocol 用于给社交网络提供要分享的数据描述。 如果你的页面是通过task来完成的,然后 在task里通过setRedirect根据数据跳转到不同的view进行授权验证, 然后验证通过后显示数据页面的话,你可能会遇到这种问题:你需要分享这个页面,你在这个页面的meta数据里添加了Open graphic protocol 数据,你希望分享到facebook, google+等社交网站时,你会发现在分享页面显示的数据和图片并不是你想要显示页面的数据。

三、解决方案

上面的问题是因为Open graphic protocol 数据获取并不支持跳转,如果遇到跳转,一般都会去网站首页拾取数据,而这并不是我们想要的。引起这个问题就是setRedirect。 setRedirect的原理是发送给浏览里的HTML头中包含了跳转指令。而解决上面的问题的方法是不使用setRedirect, 而是使用display. 每一个JControllerLegacy都有一个display方法,你只要设置input里的view, layout, 以及其他你要传递过去的数据,然后调用display方法就可。

下面是示例代码:

    /**
* 内部跳转,用于代替setRedirect. 为什么要这样子做呢?
* 因为 setRedirect他会发送一个http头到浏览器,让浏览
* 进行跳转,这样一来就多了一个网络请问, 这是其一。最
* 为主要的是setRedirect在某些不支持浏览器redirect的情况
* 下达不到效果,例如:open graphic protocal
*
* @param type $view 要显示的view
* @param type $layout 要显示的layout, 默认为NULL
*/
protected function internalRedirect($view, $layout=null){
$this->input->set("view", $view);
$this->input->set("layout", $layout);
return $this->display();
} public function checkAvailable(){
//其他的业务代码
$this->input->set('tmpl', 'doexam');
return $this->internalRedirect("doexam", $layout);
}

上面的代码是写在你的Controller里的。函数internalRedirect通过设置$input(这个input是指url的输入参数) 中的view, layout,然后直接调用JControllerLegecy的display方法来显示页面。

在checkAvailable方法中,在调用internalRedirect之前,还设置了其他 view需要的参数。

梦溪的一个朋友说他在做他的一个网站 时遇到了这样的问题,我们讨论并分析了Joomla的实现代码,发现其实这个解决挺容易, 只要你熟悉Joomla组件开发。如果你有问题,可以找我一起交流

希望本文能够解决你所遇到的问题。

最新文章

  1. nginx访问量统计
  2. 卡通图像变形算法(Moving Least Squares)附源码
  3. 监控平台项目之CSS总结——基于angularjs、bootstrap、jquery等框架
  4. FROM_UNIXTIME()和UNIX_TIMESTAMP()函数的区别
  5. 问题Initial SessionFactory creation failed.org.hibernate.HibernateException: /hibernate.cfg.xml not found解决方法
  6. Kalendar server Beijing Tiandiyuandian Technology Limited 果然是木马
  7. NDK 提示"undefined reference to xxx“的解决办法
  8. SGU185 - Two Shortest
  9. JavaEE学习笔记---数据库操作篇
  10. cocos2d-x 在mac下执行 demo
  11. (三)一个工作任务引起的乱战——udp通信
  12. hdoj 1395 2^x mod n = 1 【暴力】
  13. 淘淘商城学习笔记 之 上传图片到远程服务器,图片的回显出现的bug
  14. datatable 多字段 排序;
  15. First Unique Character in a String
  16. ssh框架总结之action接收参数的三种方式
  17. git基础介绍
  18. 【C++ Primer 第10章】 10.4.1 插入迭代器
  19. 小程序util工具
  20. LeetCode(10):正则表达式匹配

热门文章

  1. POP-一个点击带有放大还原的动画效果
  2. 类 this指针 const成员函数 std::string isbn() const {return bookNo;}
  3. 洛谷 [P3265] 装备购买
  4. 标准C程序设计七---22
  5. MYSQL 中GROUP BY
  6. grafana 安装 和 Nginx 、EL 联调
  7. Spring Boot集成Spring Data Reids和Spring Session实现Session共享(多个不同的应用共用一个Redis实例)
  8. Python的未来和Python的意义 & pypy & JIT
  9. 用Meta 取消流量器缓存方便调试
  10. Type cannot use 'try' with exceptions disabled