在第二章中,我们开发了一个模块,它具有 .info 和 .module 文件。对于所有模块来说,这些文件都是要有的。现在我们开始为模块编写 .info 和 .module 文件。
我们的模块将命名为 philquotes,并且(正如所料)将存放在drupal/sites/all/modules/philquotes 目录下。
在那个目录下,我们首先创建一个标准的模块 .info 文件:
; $Id$ name = "Philosophy Quotes" description = "Dynamic display of philosophy quotes." core = 6.x php = 5.1
上面的代码中没什么陌生的内容。它与第二章中我们创建的模块遵循同样的格式。
下面,我们开始编写 philquotes.module 文件:
<?php // $Id$ /** * @file * Module for dynamic display of pithy philosophy quotes. */ /** * Implementation of hook_help() */ function philquotes_help($path, $arg) { if ($path == 'admin/help#philquotes') { $txt = 'This module displays philosophical quotes in blocks. '. 'It assumes the existence of a content type named "quote".'; return '<p>'. t($txt) .'</p>'; } }
上面的代码实现了 hook_help(),提供有关模块的帮助信息。这与我们在第二章中编写的代码相似。
与第二章中的模块一样,我们的 philquotes 模块主要目的是提供区块内容。
接下来,我们实现 hook_block()——控制区块中显示什么内容的钩子。(这个钩子的介绍也在第二章。)
这就是我们的区块钩子:
/** * Implementation of hook_block(). */ function philquotes_block($op = 'list', $delta = 0, $edit = array()) { switch ($op) { case 'list': $blocks[0]['info'] = t('Philosophical Quotes'); return $blocks; case 'view': $item = _philquotes_get_quote(); if(!empty($item)) { $content = theme('philquotes_quote', check_plain($item->body), check_plain($item->title)); $blocks['subject'] = t('Pithy Quote'); $blocks['content'] = $content; return $blocks; } } }
p
这个函数的大部分看起来都很熟悉。如果传入钩子的操作($op)是list,它只是简单地返回有关使用这个钩子的区块的信息。在我们的例子中,只有一个区块。
对我们来说,更重要的case是上面高亮的部分。如果传入的操作是 view,模块应该返回一些内容,以便显示给用户。这些内容被包裹在 $blocks 变量中。
研究这个 hook_block() 的实现时,我们重点关注上面高亮的部分。
当生成一个区块送去显示时,每个区块条目包含两部分信息:一个标题和一些内容。我们的区块标题将总是 Pithy Quote,但是,内容是通过两个步骤生成的:
在上面的代码中,这是用下面两条语句实现的:
$item = _philquotes_get_quote(); if(!empty($item) { $content = theme('philquotes_quote', check_plain($item->body), check_plain($item->title)); // ... }
提示:我们用 !empty($item) 确保返回的条目不是 NULL,如果是 NULL 则表示没有可用的名言了。当 $item 为 NULL 时,我们将不返回任何值,区块根本不会显示出来。
第一条语句执行了一次数据库查询,第二条语句进行主题化处理。下面进行我们详细说明。
评论
发表新评论