我们的模块将在一个 Drupal 区块中显示信息。为了做到这一点,我们需要实现hook_block() 函数。
记住,我们现在所做的是提供一个 Drupal 将调用的函数。当 Drupal 调用hook_block() 函数时,Drupal 传给它三个参数:
$op 参数将包含 Drupal 期望模块执行的操作的类型信息。虽然我们实现的只是单一的钩子,但它能够执行各种不同的操作。要模块输出有关自身的基本信息吗?还是要显示区块?或者提供一些管理信息?$op 的值将明确操作的类型。
$op 的值可以是下列四个之一:
当执行某个特殊操作时,设定 $delta 参数。当 $op 被设置为 "view",亦即显示区块的操作时,$delta 也将同时设定。$delta 包含有关被显示内容的额外信息。我们在第一例子中不使用这个参数,但本书稍后的例子中将会用到。可以看一下第 4 章的另一个 hook_block() 的实现示例。
注:使用 delta,你可以定义能显示几种不同区块的单个 hook_block() 函数。例如,我们也许可以定义两个 delta——一个用来显示我们的 Goodreads 书架,另一个显示我们的 Goodreads 账户信息。究竟显示哪一个,将取决于传递给goodread_block() 函数的 $delta 值是哪一个。本书的其它模块将使用 delta.
最后,$edit 参数是配置过程中使用的(调用 save 操作时)。因为我们在第一个例子中不实现那个操作,我们不用这个参数。
注:Drupal 的文档十分细致,API文档在 http://api.drupal.org. 更多关于hook_block() 参数的信息参见这个 URL: http://api.drupal.org/api/function/hook_block/6.
所有的钩子方法都要遵守模块命名惯例: <module name>_<hook name>。因此我们的命名为 goodreads_block()。
/** * Implementation of hook_block() */ function goodreads_block($op='list', $delta=0, $edit=array()) { switch ($op) { case 'list': $blocks[0]['info'] = t('Goodreads Bookshelf'); return $blocks; case 'view': $blocks['subject'] = t('On the Bookshelf'); $blocks['content'] = t('Temporary content'); return $blocks; } }
根据 Drupal 的惯例,我们在函数前加了一个文档块。对于钩子,习惯上在文档中指明它实现的是哪个钩子。
随后是我们的函数原型:
function goodreads_block($op='list',$delta=0, $edit=array())
$op, $delta, 和 $edit 参数上面解释过了。每个参数都有一个初始默认值。在这里,我们遵从默认惯例,但如果你愿意,可以把它们定义为其它值。
正如我前面提到的,$op 参数可以设定为几个不同值之一。
我们在这个函数中做什么,在很大程度上取决于 $op 设定为那 4 个值中的哪一个。因此,我们在函数中做的第一件事就是使用 switch 语句判断操作的种类。
在 switch 语句中,每个 case 处理一种不同的操作。目前,我们没有什么管理配置要执行,因此没有处理 configure 或 save 操作的 case。我们只需要处理list 和 view 操作。让我们仔细看看每种情况。
case 'list': $blocks[0]['info'] = t('Goodreads Bookshelf'); return $blocks;
当 Drupal 调用这个钩子时,如果 $op 设为 'list',那么这个模块将返回一个二维数组,内容如下所示:
array( [0]=> ( 'info' => 'Goodreads Bookshelf' ))
这个数组中的每个元素都是一个区块描述字,它提供了关于此区块所实现的功能的信息。对于这个函数能够识别的每个 $delta 值,在此都应有一个相应的项。我们的区块只返回一个值(我们没有使用 delta),因此在区块描述字数组中只有一项。
在关联数组中,一个区块描述字可以包含几个不同的域。有一个是必须的:我们上面设置的 'info' 域。但我们也可以提供有关缓存、默认权重、定位信息等。
注:有关 hook_block() 的方方面面的详细信息,参见API文档:http://api.drupal.org/api/function/hook_block/6
Drupal 使用 'info' 域在模块管理列表上显示一个项,我们在本章的模块安装一节将看到这个模块管理列表。
评论
发表新评论