- 浏览: 13625403 次
- 性别:
- 来自: 洛杉矶
文章分类
- 全部博客 (1994)
- Php / Pear / Mysql / Node.js (378)
- Javascript /Jquery / Bootstrap / Web (435)
- Phone / IOS / Objective-C / Swift (137)
- Ubuntu / Mac / Github / Aptana / Nginx / Shell / Linux (335)
- Perl / Koha / Ruby / Markdown (8)
- Java / Jsp (12)
- Python 2 / Wxpython (25)
- Codeigniter / CakePHP (32)
- Div / Css / XML / HTML5 (179)
- WP / Joomla! / Magento / Shopify / Drupal / Moodle / Zimbra (275)
- Apache / VPN / Software (31)
- AS3.0/2.0 / Flex / Flash (45)
- Smarty (6)
- SEO (24)
- Google / Facebook / Pinterest / SNS (80)
- Tools (22)
最新评论
-
1455975567:
xuezhongyu01 写道wocan23 写道我想问下那个 ...
Mysql: LBS实现查找附近的人 (两经纬度之间的距离) -
xuezhongyu01:
wocan23 写道我想问下那个111.1是怎么得来的我也看不 ...
Mysql: LBS实现查找附近的人 (两经纬度之间的距离) -
18335864773:
试试 pageoffice 在线打开 PDF 文件吧. pag ...
jquery在线预览PDF文件,打开PDF文件 -
青春依旧:
opacity: 0.5; 个人喜欢这种方式!关于其他css特 ...
css透明度的设置 (兼容所有浏览器) -
July01:
推荐用StratoIO打印控件,浏览器和系统的兼容性都很好,而 ...
搞定网页打印自动分页问题
修改 Joomla! 1.5 的 HTML 输出而不动核心文件 (附api文档)
现在到了 Joomla! 1.5 平台,前面这个方法不灵了。不过,Joomla! 开发团队早就给出了更好的方案,总结起来就是3个字母:MVC。
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 来实现,只能是不同的“布局”。
模板与布局
接下来还要区分一下“模板”与“布局”的关系。模板主要是为网页设定一个结构框架。在这个框架之内,指定了组件和模块的显示位置。而在这些位置上,具体如 何展示信息,是由布局(模块)或者视图与布局的组合(组件)来决定的。
上图是 Joomla! 默认模板 rhuk_milkyway 的结构外观(通过访问 http://域名/index.php?tp=1 就能看到这些模块位置)。你可以清楚地看到哪些模块在哪个位置,以及组件在什么位置输出。然而,“实 际上”这些位置将来输出什么内容,不是模板决定的,而是由“布局”决定的。
组件的输出类型及布局的优先性
要理解布局的优先性,我们先要理解组件的文件结构。尽管一个组件有多个部分,分别负责不同的功能,我们只需要看看 /views 目录下的文件。下面是 com_content 组件视图目录的一部分:
/components |
在 /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
|
你网站上实际的 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 组件),就会看到如下的画面。树形分支显示了每一种视图以及该视图的若干布局:
你可能注意到了,尽管 /tmpl 目录中还有其它文件,但是没有在这个列表上出现,例如 article 视图的 pagebreak.php 文件。这是因为该布局的 XML 文件(本例中是 pagebreak.xml)中的命令隐藏了该布局(甚至可以是该视图),不在这个列表中出现。关于这种隐藏命令另有教程介绍,此处不赘述。
在理解并掌握了上述知识后,我们现在来实战一下:创建自定义的优先输出的布局。
复制或者创建布局文件
布局的优先性只在当前模板有效,而且想要优先输出的布局文件必须位于该模板的 /html 目录中。例如,对于 rhuk_milkyway 模板来说,就位于 /templates/rhuk_milkyway/html/ 目录中;对于 JA Purity 模板来说,就位于 /templates/ja_purity/html/ 目录中;对于 Beez 模板来说,就位于 /templates/beez/html/ 目录中。
(译者注:本文所谓的“优先输出”是指,对于某个符合 MVC 设计结构的组件来说,它已经自带若干布局;如果我们在当前模板中重新设计了该组件的某些布局,则 Joomla! 1.5 会优先使用模板文件夹中定义的布局,忽略组件自带的布局。这就是“优先输出”。)
再次强调:当你为某个模板创建了“优先输出”,该优先性只在这个模板上有效,对其它模板就无效。例如,rhuk_milkyway 模板没有任何组件的优先输出,当你使用此模板时,所看到的前台是各个组件的原样输出(组件作者所设定的);当你使用 Beez 模板时,前台几乎每一个组件的外观都已被该模板中定义的优先输出所控制(模板设计者个性化了);JA Purity 模板介于上述两者之间,只有部分组件被创建了优先输出,而且也只是这些组件的部分视图。
布局优先性的实现要求布局文件必须按照特定的方式来上传。以 Beez 模板为例,我们可以在它目录中看到下面的文件结构:
/templates |
从这里可以看出组件“优先输出”的文件结构很简单:/模板名称//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文档
- joomla_class.pdf (529.2 KB)
- 下载次数: 144
发表评论
-
Magento: 后台显示图片不能找到 Image file was not found on product tab
2016-08-30 02:22 2879I was uploading some images f ... -
理解WordPress的PingBack和TrackBack
2016-08-26 02:21 5666pingback和trackback的功 ... -
零基础 Amazon Web Services (AWS) 入门教程图文版(四)
2016-06-07 11:40 978自上一篇之后,5天过去了,这篇文章总算是挤出来了... 其实 ... -
零基础 Amazon Web Services (AWS) 入门教程图文版(三)
2016-06-07 11:41 1997原则上WDCP安装好了,就可以直接使用了,FTP、MySQL ... -
零基础 Amazon Web Services (AWS) 入门教程图文版(二)
2016-06-07 01:33 946上一篇讲到,主机正常运转了。但是此时如果直接访问公网IP是 ... -
零基础 Amazon Web Services (AWS) 入门教程图文版(一)
2016-06-07 01:31 21544现在小站唯一的流量都靠AWS这个关键词了,刚好要用AWS重新 ... -
零基础 Amazon Web Services (AWS) 入门教程 (列表)
2016-06-07 01:32 2030在 Amazon Web Services 上托 ... -
Magento 1.9:新订单通知 Admin Order Notifier
2016-06-02 02:48 798Here is a little Mag ... -
Magento 1.9.X 系列教程
2016-05-14 02:44 2242Magento安装下载教学: Magento教程 1 ... -
Magento: 产品页面下jquery change函数失效 Call javascript function onchange product option
2016-05-05 06:39 1690明显的原因是change函数跟magento默认的oncha ... -
Magento: 判断是否为手机浏览 Optimise Web's Mobile Detect Class for Magento
2016-04-29 07:01 1118项目地址:Optimise Web's Mobile Det ... -
Magento: Gird 和 form 区域 Module Development Series – Magento Admin Module
2016-04-28 02:39 632In this tutorial, we are goi ... -
Magento: addAttributeToFilter 和 addFieldToFilter 的区别 Difference between addAttri
2016-04-28 02:34 980addAttributeToFilter is use ... -
Magento: 后台获取menu链接 Getting the admin panel urls
2016-04-28 02:34 733The url for customer page in t ... -
Magento : 调用文件上传 upload file frontend
2016-04-27 01:25 1315bool mkdir ( string $pathname ... -
Magento: 自定义用户登录导向页面 Redirect Customer to Previous Page After Login
2016-04-26 02:45 1815Configuration Settings – L ... -
Magento: 代替flash上传 How to disable Flash uploader in Magento (product images and
2016-04-06 05:04 10831. 替换产品页flash上传按钮 - 使用 Du ... -
Magento: 在客户账户中添加自定义链接 My Account Add Link
2016-04-05 14:05 1193This extension add new link an ... -
Magento: 根据产品属性加载产品信息 Load A Category or Product by an Attribute
2016-03-26 01:35 894Load a Product by ID <?ph ... -
Magento模块开发之数据库SQL操作方法说明
2016-03-26 01:31 1287今天主要来看Magento中的Mysql4/Resource ...
相关推荐
你的 Joomla! 1.5 网站安全吗?你是否知道已经有很多 Joomla 网站被黑客攻击了?就连国内某著名 Joomla 知识网站前不久也惨遭黑手,首页被替换成黑客的标语。 虽然说没有绝对的安全,但是如果采取一定的措施,总是...
Joomla!1.5 网站备份Akeeba 3.2.10,可以帮助您备份您的joomla!1.5.x网站程序。有备无患!
精通 Joomla 1.5 扩展和架构开发,翻译本 学习Joomla! 1.5 扩展开发 ,翻译本
這是一個葡萄酒莊園的Joomla! 1.5 模板,配色清新。
Kickstart for Joomla!1.5.x, 配合AKEEBA 使用,用于恢复JOOMLA !1.5 程序
Joomla! 1.5 Cookbook.pdf
Joomla! 1.5 Top Extensions Cookbook
绝对真实!... 1.5 template design, PDF英文版本, 作者:PACKT PUBLISHING 资源太难找了,终于找到了,不好意思,5分下载,希望大家能多支持,我分太少了,一会还上传另一本 Joomla! 1.5 cookbook
Joomla! 1.5 模块、组件开发较深入的教程。全面覆盖了Joomla! 框架的核心。
SuperBlogger is a new powerful plugin adding blogging functionality to Joomla! 1.5 articles. The plugin integrates popular services like Disqus.com (for comments) and Twitter, along with commonly used...
本教程主要为大家介绍Joomla! 1.5生成中文PDF的解决方案。
[PACKT]最新出品Joomla!1.5扩展开发教程,包括如何使用PHP创建Joomla Module、Component、Plug-in的详细介绍,为学习Joomla扩展开发的上手教程。
详细介绍了Joomla!1.5网站防黑9条戒律:1.备份;2.对照“Joomla 管理员安全问题列表”补漏;3.用jSecure插件把后门关紧;4.及时更新Joomla核心到最新版本等等。
不错的joomla!1.5图片展示组件集合,需要的朋友可以下来看看,里面有十二个组件,希望可以帮到你~
Improve the rankings of your Joomla! site in the search engine result pages such as Google, Yahoo, and Bing Improve your web site SEO performance by gaining and producing incoming links to your web ...
教程!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
Joomla! is an award-winning content management system with a powerful extension system. This makes it easy for third-party developers to build code extending Joomla\'s core functionality ...