玩转Drupal模块:Hook System运作简介

来源:互联网 发布:淘宝店铺店名可以改吗 编辑:程序博客网 时间:2024/06/05 14:21

模块系统是drupal很重要的运作方式,drupal依靠着少少的核心程序,便能让模块能做到任何事情。

drupal只有21个档案在include里头,每次必会loading进来,其他的全都放在modules。
也就是说,除了那几只档案以外,全部的东西都把他当成module在写。诸如CMS最基本的功能,文章管理、评论、讨论区、分类…等的功能,全部都写在 module里,include里头所提供的是各种api,档案处理函式、数据库存取、窗体生成…等等,这样的分层,module便可以专心的开发各种功能。

当然,这样的架构不够令人注目。有许多web app架构,对于模块 (module)、插件(plug-in)…等的运作,通常是让他们各自为政,自己干自己的事情。多是用核心提供的object和function,加上 module自己额外的code,达到module要做到的额外功能。但是drupal的核心运作却不是如此。

drupal处理使用的程序为modules/user.module。如果今天想要在看用户数据的同时,也想看看所有使用者过去发表文章的list,那该怎么写呢?

直接一点,更改user.modue,在显示时,顺便去文章数据库抓相关的数据?然而这样却不是一个好方式,今天任何想要对用户增加新功能的时候,都得trace一次user.module的code,看懂他在干啥,然后把新的code安插在合适的地方… 最后可能增加user.module的复杂度,增加维护那支module的难度,共同开发时,更是一个危险的方式。


第二种方式
,重写一个新的浏览页面,重新写一个SELECT的语句,让SELECT的时候除了用户信息,也把文章数据一起抓出来,然后显示到不同的页面。但是这样很浪费,明明跟user.module重复的功能达到一半以上,那是不是之后要新增功能,都得重写一次呢?

上面两种方式在drupal中也都可以达成,然而熟悉Drupal的人却不会如此。Drupal的开发者很聪明,他的模块系统(module system)考虑到了模块再利用这一点,每个模块都视为可以再利用的资源,只要写module的人想写,透过模块系统便可以跟所有的module交互作用。


第三种方式
以modules/user.module为例,他即是处理包含新增、修改、删除、注册、登入….等所有与用户相关的功能。在进行每个重要的功能时,user.module都会呼叫一个函式去扫所有的module,看看是否有其他的module要在user.module进行此动作时,也进行一些其他想要做的事情,这就是drupal重要的Hook System。
example:

在drupal user.module里头可以找到如下的程序代码

function user_view($uid = 0) {

// … skip

// moudle_invoke扫描所有的module

// 看看有没有modulename_user这个function

// 有个话就看’view’这个功能的部份要加上什么

foreach (module_list() as $module) {

if ($data = module_invoke($module, ‘user’, ‘view’, ”, $account)) {

   // do something…

}

}

// … skip

}

所以,第三种方式,不用重写,也不用改到user.module,只要自己新增module和写一个function,便可以轻松让浏览用户信息时,加上过往文章。

example:

新增自己的module,与hook system紧密运作
新增sample.module

function sample_user($type, &$edit, &$user, $category = NULL) {

if ($type == ‘view’) {

return /*过往文章,型别为一数组*/;

}

}

这就是drupal把众多主要功能都写成module的原因,让所有模块之间都可以交互利用,或是写给别人利用,或是利用别人的module,像积木一样推砌成想要的功能,却又不浪费资源

原创粉丝点击