philquotes_block()函数获得了名言内容以后,必须为数据添加格式化和风格信息。这必须由使用主题系统的函数来处理。第一阶段的处理由 theme() 函数完成。
上一章我们大概看了看 theme() 函数。不过那时我们更关注主题的创建。此处,我们正在做的是个模块。在模块中,我们想提供一些默认的风格,但是要利用主题系统的功能。这就提供了更高的灵活性:主题开发者可以改变我们的模块的布局,而不必更改我们的代码。
提示:默认主题。通常,已有的主题不会为模块添加的内容提供布局信息。在这种情况下,模块开发者应该提供默认的主题信息。默认主题应该为模块的新内容提供布局信息。
在 philquotes_block() 中调用 theme() 函数时,传递了三个参数:
$content = theme('philquotes_quote', check_plain($item->body), check_plain($item->title));
第一个参数 philquotes_quote 告诉 theme() 函数应该执行哪个主题钩子。theme() 函数将查询主题系统,试图找到一个名为 theme_philquotes_quote() 的函数,或者一个名为 philquotes_quote 的模板。
在 Drupal 的默认安装中,既没有匹配的函数,也没有匹配的主题。但是过一会儿,我们将解决这个问题,创建一个默认的主题函数,作为我们模块的一部分。
下面两个参数是我们想要显示的名言正文和标题。(回忆一下,$item 对象保存着随机名言节点的内容。)
theme() 函数本身并不对后面两个参数进行特殊处理,而是把它们传递给特定的主题钩子(在我们的例子中,是theme_philquotes_quote())。
提示:检查内容。在上一章中,我们了解了 check_plain() 和其它内容检查函数。我们为什么要在这里使用 check_plain() 呢?名言的内容中可能包含 HTML,而有些 HTML 是不安全的。因此,在把数据传递给主题系统之前,应该对其进行转义操作。在本例中,我们需要的是转义的HTML文本,因此使用 check_plain() 函数。
现在 theme() 函数必须找到 theme_philquotes_quote(),但是去哪里找呢?它要查找的一个地方是在当前启用的主题中。在我们的例子中,这就是我们上一章中创建的 Descartes 主题。但是,那个主题中还没有 philquotes_quote 函数或模板。
Drupal的主题系统也会在其它的注册主题中查找。模块可以注册自己的主题函数,让主题系统可以找到这些主题。如果默认主题没有提供处理函数,将使用模块的主题。因为我们的模块增加了需要格式化的新内容,因此我们需要注册一个主题函数,以提供默认风格。
提示:在第二章中,我们创建了 Goodreads 模块。那个模块产生的输出是硬编码的HTML。要想改进那个模块,我们可以使用主题系统,采用我们即将讲述的方法。