打zZ~瞌睡 Menu

Joomla教程(三)—— 组件和模块

1. Joomla组件渲染流程
在Joomla中,组件可以说是最大的功能模块。一个组件分为两部分:前台和后台。后台主要用于对对应内容的管理,前台主要用于前台页面的呈现和响应各种操作。其文件目录分别对应于JOOMLAROOT/administrator/components和JOOMLAROOT/components。组件有自己的命名规则,文件夹名须命名为com_组件名,组件的访问也是单文件入口,入口文件为com_组件名/组件名.php,如components/com_content/content.php。上次讲到的URL中的option参数就是定义当前页面使用的是哪个组件,如option=com_content&view=category&id=64,它会先调用content.php,再由router.php路由到category视图,再调用相应的Model层取出ID=64的分类的信息,渲染之后呈现在模板中的jdoc:include type=”component”的位置上。

本教程主要讲Joomla的工作流程,让大家对Joomla是如何工作的有大概的了解,有了这些概念,再进行代码编写就会得心应手了。

2. Joomla模块
与组件(Component)不同的是,模块(Module)是不能通过URL直接访问的,而是通过后台对模块的设置,根据菜单ID(URL中的Itemid)来判断当前页面应该加载哪些模块。所以它主要用于显示内容,而一些表单提交后的处理动作一般是放在组件中去处理的。因此,模块通常都是比较简单的程序,文件结构也很清晰易懂,如modules/mod_login模块中的文件结构如下

mod_login.xml            # 模块配置及安装使用的文件
mod_login.php            # 模块入口文件,以mod_模块名.php命名,可以看作Controller层
helper.php               # 辅助文件,通常数据操作会放在这里,可以看作Model层
tmpl/                    # 模板文件夹,View层
|_ default.php           # 默认模板
|_ default_logout.php    # 退出登录模板

3. 模块在后台的设置
进入后台,打开Extensions > Module Manager,可以看到网站的模块列表。我们打开一个,看一下相关配置项,如Login Form(ID: 16)

  • `Module`页签中显示的是该模块的配置项,如Pre-text/Show Greeting/Show Title等,这里我们主要先看Position的信息,这个字段定义了该模块要在页面中的哪个位置显示,如position-7对应着模板首页里的
  • `Menu Assignment`页签中可以设置该模块要在哪些页面显示,是根据菜单来定义的,有4个选项:所有页面显示、所有页面都不显示、只在选中的页面显示、在选中的页面之外的页面显示
  • `Module Permissions`页签中可以设置访问权限
  • `Advanced`页签中有更多的设置项
Joomla会根据URL中的Itemid(菜单ID)参数,来判断当前页面需要显示哪些模块,再把各个模块渲染到正确的位置上。

4. 模块调用的另外一个参数
在模板的首页文件中,我们会看到调用模块时有如下代码

jdoc:include type="modules" name="position-7" style="well"

这里多了一个style参数,这个其实是一个显示前的预处理动作,在当前模板文件夹中的html/modules.php中定义,打开这个文件我们就能看到有一个modChrome_well的函数,程序不是很复杂,只是在显示前对html做了下预处理,大家了解一下即可。用到的时候不是很多,但是关键时候你会觉得它非常方便。

5. 模块的另外一种调用方法
有时候会需要在程序里调用一个模块来显示,可以用以下程序来调用

# 该程序会显示所有设置在position位置上的模块,当然也会根据菜单ID来判断是否加载
$modules = & JModuleHelper::getModules('position');
foreach($modules as $module){
	echo JModuleHelper::renderModule($module, array('style' => 'well'))
}

6. 不推荐使用的模块调用方法
如果你看其他教程,还有另外一种调用模块的方法,就是在文章里使用如下代码

{loadposition myposition}   # myposition为位置
{loadmodule moduletype}     # moduletype为模块类型

该方法会绕过菜单ID的限制,加载对应的模块,另外此种写法对不熟悉Joomla的内容管理人员来说相对陌生,因为不推荐使用。作为使用Joomla建站的开发人员,我们应该规划出更好的页面结构,尽可能将一些配置项转为图形界面管理,而非代码方式管理。

7. 各部分的View覆写
HTML的输出其实是依赖于当前模板的,通过刚才的讲解我们可以看到每个组件、每个模块都有自己的View层,这样其实就脱离了Joomla的模板,在更换模板时就可能会出现问题。因此推荐将各部分的View层放到Joomla的模板中覆写,这样有利于

  1. 如果有需要,升级时只升级Module本身,不会影响到View的输出
  2. 改版时我们只需要新建一套模板,测试成功后使用新的模板即可,降低了代码的耦合性

具体方法请参照JOOMLAROOT > templates > beez3 > html