drupal6开发指南

JavaScript 中的名字空间

所有 Drupal 专用的 JavaScript 共享一个共同的名字空间(namespace)。名字空间是有组织的命名结构,表示了各种代码片段之间的关系。

如果不使用名字空间,那么函数名将存储在全局名字空间中:getURL(), toString(), 等等。因为这些名字很常见,因此易于产生冲突——多个JavaScript 库可能会使用相同的函数名。

名字空间减少了冲突的可能,它使用明确命名的一个对象或若干对象做为容器。函数和变量存储在对象中,并使用点操作符访问。

因此,上面的示例可以使用完整的名字空间进行调用:

Philquotes.toString();
Philquotes.getURL();

因为 toString() 和 getURL() 包含在 Philquotes 对象中,为了访问这些函数,我们必须指明完整的名字空间。

提示:名字空间可以很简单,如上例所示。但是,也可以用名字空间组织出对象、函数和变量的层次体系。这个层次体系中的函数调用方式看起来象这样:RSSFeeds.reader.getURL(rssUrl)。

用 Drupal 检测 JavaScript 支持

对于两个步骤中的第一个,我们将使用 Drupal 的 JavaScript 库。

前面介绍的 jQuery 库是随着 Drupal 发布的,不过它包含非 Drupal 专用的代码。与 Drupal 紧耦合的 JavaScript 存储在几个不同的 JavaScript 文件中。而所有的核心函数,都在 drupal/misc/drupal.js 中。

用 jQuery 修改 HTML

philquotes 模块的 hook_block() 实现 (在 philquotes.module 中) 创建了一个如下的 HTML 区块:

 

jQuery 简介

jQuery 是最具创新性的 JavaScript 函数库。它运用一种叫做 Fluent Interface 的面向对象设计模式,jQuery 使得一系列函数调用可以协同工作,从而构造出复杂的查询。

jQuery 查询什么呢?通常,它用于查询 DOM 树。

DOM (Document Object Model) 树是一种数据结构,它定义了文档的结构——通常是 HTML 或 XML 文档。文档被显示为树形结构,第一个文档是 root。其 API 已被标准化 (参见 http://w3.org)。

DOM 以其复杂的对象模型而闻名。jQuery 提供的 API 更简洁更易用。

但是,它的使用方式不仅仅是查询。它有一套 AJAX 工具,这些工具用于事件处理、耀眼的效果、以及其它一些有用的工具函数。在这一章中,我们将用到其中一些。

接续以前的drupal话题

在上一章中我们编写了一个模块,从自定义内容类型中读取数据、并显示为区块内容。这个模块使用了我们创建的 Quote 内容类型。为了给我们的新内容类型提供布局信息,我们创建了一个默认主题作为模块的一部分。我们编写的主题代码生成必要的 HTML 和 CSS 以显示名言。

提示:在上一章末尾,我们为 Descartes 主题添加了一个模板,覆写了模块的默认主题。不过,在本章中,我们将继续使用默认主题。你必须取消 Descartes 主题中针对 philquotes 的修改,以便继续使用默认的主题。

当我们的 philquotes 模块在区块中显示时,一条名言显示为区块的内容。输出类似下面:

插图 5-1

现在我们要扩充 philquotes 模块。

我们将为它添加新特性:不必重新装入页面就可以刷新名言。为了做到这一点,我们将使用 Drupal JavaScript API 以及 jQuery 库的几个特性。

第四章drupal小结

在本章中,我们把第二章中学会的有关模块的知识,与第三章中学会的有关主题的知识综合起来。我们创建了一个提供默认主题的新模块。

除此之外,我们创建了一个简单的自定义内容类型,第一次接触到了 Drupal 的数据库API。至此,我们为今后的模块开发奠定了坚实的基础。

在随后的章节中,我们的讲述主线开始分支,创建一些更复杂的模块。在下一章中,我们将继续开发 Philosophy Quotes 模块,加入一些复杂的 JavaScript 和 AJAX 功能。随后,我们将讲述管理接口,在第六章中创建一个管理模块。在第七章,我们将深入学习数据库 API,创建一个丰富的内容类型。

用drupal模板覆写布局

除了能覆写 CSS 指令以外,主题开发者还可以覆写模块的默认主题钩子。例如,我们可以在 Descartes 主题中创建一个简单的模板文件,以覆写 philquotes 模块的 theme_philquotes_quote() 函数提供的布局。

为了让主题引起意识到,这个模板是为了覆写 theme_philquotes_quote() 钩子,必须把它命名为 philquotes_quote.tpl.php。

做为示例,我们可以创建一个简单的模板drupal/sites/all/themes/descartes/philqyotes_quote.tpl.php,内容如下所示:

 

覆写drupal默认主题的CSS

如果我们查看一个使用了 philquotes 区块的页面的 <head/> 部分,我们将看到有个 link 指向模块的样式表:

 

快速澄清几个drupal问题

现在,我们已经接触了太多的术语。“主题”(theme)这个词有变模糊的危险。所以,让我们暂停片刻,澄清我们将要做的工作。

到目前为止,我们一直在编写一个模块。在这个模块中,我们创建了一个默认主题。这个默认主题为模块的内容提供布局。当站点的主题(可能是 Descartes, Bluemarine, Garland 或其它主题)没有为这个模块的内容提供处理设施时,这个默认主题就会起作用。

现在,我们要偏离讨论主线,编写一个主题。我们把工作目录从drupal/sites/all/modules 切换到 drupal/sites/all/themes.

在前一章中,我们创建了 Descartes 主题,它使用 PHPTemplate 模板把内容处理为 HTML。这里,我们要再次讨论那个主题(这里讨论的步骤也可应用于其它主题)。

我们将修改那个主题,它将以另一种形式表现从 philquotes 模块中取出的名言。换句话说,我们要覆写模块的默认主题。

我们将学习两种实现方法。一种方法只覆写 CSS 样式,另一种将使用PHPTemplates 覆写主题钩子。

在drupal主题中覆写默认样式

在模块中使用主题系统的主要优势之一是,为主题开发者提供了一种能力,使他们不仅可以使用模块,还可以随意修改模块内容的样式。在这里,我们要看看如何在主题中修改模块内容样式。

同步内容
|