首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 网站开发 > CSS >

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

2012-11-23 
修改 Joomla! 1.5 的 HTML 输出而不动核心文件 (附api文档)现在到了 Joomla! 1.5平台,前面这个方法不灵了。

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

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

?

?

/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 中看出来:

?

?

http://domain/sports.html
http://domain/sports.feed
http://domain/sports/rowing.html
http://domain/sports/rowing.pdf

?

?

你网站上实际的 URL 可能与这些稍有不同,不过我们的重点是想说明:sports.html 结尾的URL 将调用 category 视图的 view.html.php 文件来展示;sports.feed 结尾的URL 将调用 category 视图的 view.feed.php 文件来展示 RSS 供稿内容。提醒一下:目前还不能自定义 feed?和?pdf 输出类型。但是你可以自定义 HTML 输出类型,这正是布局起效的地方。

布局

????? 在每一个视图目录中,都有一个 /tmpl 目录,这里面就是布局文件。这个目录中的每一个 php 文件都代表一种布局。例如, article/tmpl/default.php 就代表文章的默认布局; article/tmpl/form.php 就代表文章的编辑表单布局;category/tmpl/default.php 代表类别的默认布局;category/tmpl/blog.php 代表该类别中的文章以博客形式展示的布局。

?

????? 当添加新的菜单项目时,就能明显看出组件的视图与布局的关系。还用文章组件来举例,当我们创建新菜单项目时,点击“文章”(其实就是 com_content 组件),就会看到如下的画面。树形分支显示了每一种视图以及该视图的若干布局:

?

?

/templates
?????/beez
??????????/html
??????????? /com_content?????????(此目录与组件目录名称相同)
???????????????? /articles?????????????? ?(此目录与视图目录名称相同)
????????????????????? default.php????????? (此文件与布局文件名称相同)
????????????????????? form.php

?

?

从这里可以看出组件“优先输出”的文件结构很简单:/模板名称//html/com_组件_名称/视图_名称/布局_文件_名称.php 。我们来看一个例子:

?

????? rhuk_milkyway 模板没有任何组件的优先输出,如果我们想要对文章的默认布局进行优先输出设计,就这样做:

????? 首先将 /components/com_content/views/article/tmpl/default.php 这个文件复制到这个模板的目录中(需要创建 html 目录因为原来没有),最后实现 /templates/rhuk_milkyway/html/com_content/article/default.php 这个结构。

?

????? 如果我们还想要对类别视图的博客布局进行优先输出设计,就需要将 /components/com_content/views/category/tmpl/blog.php 这个文件复制到 /templates/rhuk_milkyway/html/com_content/category/blog.php 这个位置。

?

????? 在完成了文件复制之后,你就可以按照需求来修改这些文件,以实现你的个性化设计方案。

子布局的优先输出

????? 在某些视图目录中,可以看到某些布局拥有一些文件名前半部分相同的文件。以 category 视图为例,其 blog 布局实际上由三部分组成:一个主布局 blog.php ,两个子布局 blog_item.php 和 blog_links.php。研究一下 blog.php 文件的代码,就能发现它是如何通过 loadTemplate 方法来调用这两种子布局的:

?

echo $this->loadTemplate('item');

?// or

echo $this->loadTemplate('links');?

?

?

????? 在加载子布局时,视图已经知道你所处的上层布局是什么,因此无需写全前缀(在本例中,你只需在代码中写 item,而不用写 blog_item)。

?

????? 我们在这里专门讨论子布局是想说明:当你只想对某个子布局实现优先输出时,无需完全复制那一系列文件。例如,你对 Joomla! 本身的 blog 布局很满意,但是想自定义 item 这个子布局的输出样式,那么就只需复制 /components/com_content/views/category/tmpl/blog_item.php 这个文件到 /templates/rhuk_milkyway/html/com_content/category/blog_item.php?这里即可。当 Joomla! 1.5 处理该视图时,会自动从组件本身的目录(com_content)中读取 blog 布局定义,同时从当前模板的目录中读取 blog_item.php? 定义的子布局。

?

????? 本文基本上是官方文档《理解 Joomla! 1.5 的 模板输出优先性》(作者:Andrew Eddie)的翻译,如果你喜欢看英文原版,可以点击这个链接去阅读。该文档中还提到对模块的布局进行“优先输出”处理的方法,本文未转载。有兴趣的用户可以去看原版。

用优先输出来解决我们的问题

????? 本文开始提到的 szyyw08 在论坛的那个问题,就可以通过对 com_content 组件的?frontpage 视图进行“优先输出”设计来解决。

?

????? 另外,我还想起来很多人在论坛都寻找一种“中国式风格”的首页布局:新闻按照类别列出标题,头条新闻标题的左侧有缩略图(或者每一个标题左侧都有);在同一个类别中列出指定数量的标题之后,显示“更多……”链接;首页上按分栏排列多个这样的新闻列表模块,或者通过“标签页”的形式组合属于相同大类别的小类别;等等……

?

????? 这样的问题,同样可以通过自己设计 frontpage 视图来实现。采用“优先输出”的方法,我们可以设计好自己喜欢的视图布局,然后可以上传到任何一个 Joomla! 1.5 网站去实现同样的风格,也不用担心核心升级会影响这种个性化风格。

?

????? 最后我提醒想要开发 Joomla! 扩展的高手:强烈建议你在开发组件或者模块时遵照MVC 模式来编程。

?

附上api文档

热点排行