日期:2014-05-17  浏览次数:20725 次

修改 Joomla! 1.5 的 HTML 输出而不动核心文件 (附api文档)

现在到了 Joomla! 1.5 平台,前面这个方法不灵了。不过,Joomla! 开发团队早就给出了更好的方案,总结起来就是3个字母:MVC。

?

?

MVC
 in php Programming

MVC in php Programming

?

MVC 等几个概念

????? MVC 是Model-View-Controller (模型-视图-控制器)的缩写。这是 Joomla! 1.5 采纳的一种新型的 Web 程序编写模式。MVC 这三个字同时也蕴含了一种理念:更加灵活的外观设计。其中的 V 字母就是完美解决外观布局问题的答案。

?

????? 长期以来,Joomla! 就因为其外观布局无法自由设计而遭诟病。现在,得益于MVC的帮助,彻底控制网页外观风格的力量重新回到了模板设计人员的手中。

?

????? 首先弄清楚两个概念:CSS 只能改变页面“样式”,例如颜色、字体、背景等等,它不能改变“布局”,也就是页面上各种组成部分的结 构 。这是由 HTML 的输出来控制的,例如文章展示为博客形式还是列表形式,就无法通过 CSS 来调整。以前如果要改变页面的布局,就必须手动修改Joomla! 核心文件的 HTML 代码。这样会引发一个潜在风险:当你网站核心升级时,新的文件可能会覆盖掉旧版本,从而使你的 Hack 结果消失。而 MVC 的出现,使得这个烦恼一去不复返。设计人员再也不需要修改 Joomla! 的核心文件了,也不必担心网站升级会抹杀个性化设计。

?

????? 我们姑且称 MVC 中的 View 为“视图”,扩展套件在前台呈现各种不同类型数据的方式就是它的视图。但是它的外观表现不止一种,我们称之为不同的“布局”。举例来 说,com_content 这个组件控制着文章系统,它能够呈现不同的数据:文章,或者类别,或者单元。前台形式可以是单篇文章展示,可以是多篇文章的标题列表,可以是多篇文章的 Blog 形式排列。这就是说,com_content 组件的视图有多种布局 。也就是说,真正在前台展示的是布局。

?

????? 那么,我们如果要改变前台的 HTML 输出,就只需修改布局。在进行这个操作之前,我们必须记住:一个组件可以有多种视图,每个视图又可以有多种布局。视图包含了一系列固定的信息,而布局可以 通过不同的形式来展示这些信息。例如:文章组件(com_content)的“类别”视图包含很多文章,这些文章可以用列表来显示,也可以用表格来显示 (可能还有其它形式),这就是说,类别视图既有“列表”这种布局,也有“表格”这种布局。

?

????? 模块就相对简单多了。模块一般都是以一种方式展示一种信息。因此模块没有视图,它们只有布局。有些模块作者甚至可以在后台参数中为他的模块提供几种布局来 供选择。例如:登录模块的“姓名”和“密码”输入框是垂直排列,还是水平排列,这就无法通过 CSS 来实现,只能是不同的“布局”。

?

模板与布局

????? 接下来还要区分一下“模板”与“布局”的关系。模板主要是为网页设定一个结构框架。在这个框架之内,指定了组件和模块的显示位置。而在这些位置上,具体如 何展示信息,是由布局(模块)或者视图与布局的组合(组件)来决定的。

?

?

Frontpage Template Positions of Joomla! 1.5

Frontpage Template Positions of Joomla! 1.5

?

?

????? 上图是 Joomla! 默认模板 rhuk_milkyway 的结构外观(通过访问 http://域名/index.php?tp=1?就能看到这些模块位置)。你可以清楚地看到哪些模块在哪个位置,以及组件在什么位置输出。然而,“实 际上”这些位置将来输出什么内容,不是模板决定的,而是由“布局”决定的。

?

组件的输出类型及布局的优先性

????? 要理解布局的优先性,我们先要理解组件的文件结构。尽管一个组件有多个部分,分别负责不同的功能,我们只需要看看 /views 目录下的文件。下面是 com_content 组件视图目录的一部分:

?

?

/components
???? /com_content
???????? /views
?????????? ?/articles
???????????????? /tmpl
????????????????????? default.php?? ?(这是一个布局)
????????????????????? form.php??? ?(这是一个布局)
?????????????????? view.html.php (这是输出HTML的视图)
?????????????????? view.pdf.php? (这是输出PDF的视图)
????????? /category
?????????????? /tmpl
????????????????????? blog.php??? (布局)
????????????????????? blog_items.php (子布局)
???????????????????? default.php?(布局)
????????????????? view.html.php?(HTML 视图)
????????????????? view.feed.php?(RSS feed 视图)

?

?

????? 在 /views 目录中,每一种视图都有自己的目录。com_content 组件还有另外三个视图我们没有列出来,它们是存档(archive)、首页(frontpage)和单元(section)。

输出类型

????? 继续上面的例子。在 /articles 目录中有很多文件。与 /category 视图目录比较一下,就会发现都有一个共同文件就是 view.html.php。这就是我们所说的视图文件。由于输出类型不同,可以有多个不同的视图文件。这些视图文件的命名规律 是:view.output_type.php,这里 output_type 就是输出类型,可以是 html、feed、pdf、raw?或者 error。当我们需要该视图的HTML输出时,就会调用 view.html.php 文件;当我们需要该视图的 RSS 输出时,就会调用 view.feed.php 文件。

?

????? 如果将全局设置中的SEF启用、同时启用Apache的 mod_rewrite 、启用给URL添加后缀,那么这些不同输出类型的影响就能从 URL 中看出来:

?

?