Joomla中的Task 和view 深入学习

[本文转自:梦溪笔记]

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组件开发。如果你有问题,可以找我一起交流

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

时间: 2024-10-10 08:46:05

Joomla中的Task 和view 深入学习的相关文章

Linux中的task,process, thread 简介

本文的主要目的是介绍在Linux内核中,task,process, thread这3个名字之间的区别和联系.并且和WINDOWS中的相应观念进行比较.如果你已经很清楚了,那么就不用往下看了. LINUX版本:2.6.18ARCH: X86 首先要明确的是,按照LKD 2里面的说法,LINUX和其他OS 比如WINDOWS, SOLARIS之间一个很大的不同是没有严格定义的线程(thread).那么你也许会问,如果LINUX中没有线程,那么如何来表示类似WINDOWS 线程的那种执行观念呢?答案是

“jquery中each方法和选择器”的学习笔记

<head> <title></title> <script src="jquery-1.4.2.js" type="text/javascript"></script> <script type="text/javascript"> $(function() { //alert($("div").text()); //对数组元素使用匿名函数进行逐个处理.

xcode6中导航栏 控制view用程序编写

1.新建个视图控制器用来管理视图 2.新建个按钮 通过按钮把新的view压入栈中 爽歪歪是个按钮  一点击它  直接进入第二界面   在第二界面自动生成个返回按钮 xcode6中导航栏 控制view用程序编写,布布扣,bubuko.com

机器学习算法中如何选取超参数:学习速率、正则项系数、minibatch size

机器学习算法中如何选取超参数:学习速率.正则项系数.minibatch size 本文是<Neural networks and deep learning>概览 中第三章的一部分,讲机器学习算法中,如何选取初始的超参数的值.(本文会不断补充) 学习速率(learning rate,η) 运用梯度下降算法进行优化时,权重的更新规则中,在梯度项前会乘以一个系数,这个系数就叫学习速率η.下面讨论在训练时选取η的策略. 固定的学习速率.如果学习速率太小,则会使收敛过慢,如果学习速率太大,则会导致代价

Android中如何将子View的坐标转换为父View的坐标

最近打算照着Android的Launcher2源码写一个精简的带有拖动功能的Launcher.在分析DragLayer类的时候发现了一个有趣方法——getDescendantCoordRelativeToSelf.通过一下两篇文章的介绍和自己的实验,总算是弄清楚了该方法的原理. http://blog.csdn.net/hahajluzxb/article/details/8165258 http://www.cnblogs.com/platte/p/3534279.html 下面主要分析一下代

JavaSE中线程与并行API框架学习笔记——线程为什么会不安全?

前言:休整一个多月之后,终于开始投简历了.这段时间休息了一阵子,又病了几天,真正用来复习准备的时间其实并不多.说实话,心里不是非常有底气. 这可能是学生时代遗留的思维惯性--总想着做好万全准备才去做事.当然,在学校里考试之前当然要把所有内容学一遍和复习一遍.但是,到了社会里做事,很多时候都是边做边学.应聘如此,工作如此,很多的挑战都是如此.没办法,硬着头皮上吧. 3.5 线程的分组管理 在实际的开发过程当中,可能会有多个线程同时存在,这对批量处理有了需求.这就有点像用迅雷下载电视剧,假设你在同时

#define中 #与##的神奇用法linux学习 (转)

#define中 #与##的神奇用法linux学习 (转) #define f(a,b) a##b #define d(a) #a #define s(a) d(a) void main( void ) { puts(d(f(a,b))); puts(s(f(a,b))); } 输出结果: f(a,b) ab 分析: ##把两个符号连起来 #a指把a当成符号,就是把#后面的看成字符串 # 和 ## 操作符是和#define宏使用的. 使用# 使在#后的首个参数返回为一个带引号的字符串. 例如,

java中常见的输入输出流案例学习

字节输入流: 1.FileInputStream 用途:从文件系统中的文件获得输入字节,常用于读取图像.声音等原始字节流,读取字符流可考虑使用FileReader 详细构造函数与常用方法可参考API文档,网上已经有中文版的API了,我是个E文盲,伤不起 这里介绍一个最常见的方法: read(byte[] b, int off, int len) 从此输入流中将最多 len 个字节的数据读入一个 byte 数组中. ->off:b字节数组中的偏移量 小知识:数组偏移量,比如a[1,2,3,4,5]

(转).NET 4.5中使用Task.Run和Parallel.For()实现的C# Winform多线程任务及跨线程更新UI控件综合实例

http://2sharings.com/2014/net-4-5-task-run-parallel-for-winform-cross-multiple-threads-update-ui-demo 在C# WINFORM的开发中,难免会遇到多线程的开发以提高程序的执行效率.自己刚才开始在做多线程的开发时也遇到了很多这方面的问题,比如:如何使用并实现多线程功能.跨线程更新UI控件等问题.还记得最初使用的是System.Threading命名空间下的Thread类来实现的: C# 1 2 3