第 11 部分: 使用 Drupal 中的分类法

相关联接:Drupal使用者中文社区[  http://drupaluser.cn ]
提供专业的Drupal资源,Drupal模块介绍,Drupal主题制作,Drupal开发文档。



Drupal 的灵活特性之一就是它的分类法系统。这提供了为 Web 站点建立结构的功能;然后可以使用这个结构支持组织和导航。许多人认为这正是 Drupal 的独到之处。

分类法(Taxonomy) 。这个词源自希腊语,意思是 “分类”。在过去,分类法只是对生物进行分类的学科,但是后来应用到了更广泛的领域。它可以指事物的分类,也可以指分类所遵循的原理。

本文中的信息不应该解释为严格的开发规则,而是应该作为为 Web 站点建立结构的起点。

分类

Drupal 中的分类法用来将内容与类别关联起来。这会将相似的内容收集到命名的组中,然后可以以各种方式使用这些组。常见的用途包括站点导航、内容组织、内容的样式化以及更专门的搜索。良好的分类法使用户能够非常容易地导航到相似的内容,以及将内容分组显示。

Drupal 的分类法使 Web 站点管理员能够创建对 Web 站点内容进行分类的方法,并使用分类改进用户的体验。总的来说,有两种提供分类的方法:使用一套预定义的固定的类别,或者让用户在运行时自由地添加标记并创建类别。

固定的类别
如果决定使用一套固定的类别,那么一定要充分了解用户以及他们如何使用 Web 站点上的信息。固定类别集的一大优点是,它是受到控制的,理想情况下可以反映信息的组织和访问方式。它受到很好的控制,但是不够灵活。

受控词汇表 是一个明确列举出的词汇列表。这个列表由一个受控词汇表注册机构控制,并可以从那里获得。受控词汇表中的所有词汇都应该具有无歧义、无重复的定义。这是一个设计目标,但是在实践中可能实现不了。

自由地添加标记
Drupal 也允许用户自由地添加标记,这就允许用任意词汇对内容进行分类。通过允许用户自己对内容进行分类或者加标记,他们可以定义自己的分类方案。用户可以使用他 们熟悉的分类。希望其他用户也使用同一套类别,这样就很容易找到内容之间的联系。但是,这种方式不总是有效的,而且它可能会导致相似的内容被加上不同的标 记,因此在分类法系统提供的导航中不集中在一起。在自由分类和为所有用户应用固定类别之间需要进行权衡。

允许用户给他们的数据自由地加标记的 Web 站点常常被称为 folksonomy

Folksonomy 。这是一种基于互联网的信息检索方法,它由协作生成的可以随时添加的标签组成,这些标签对 Web 页面、在线照片和 Web 链接等内容进行分类。
当今的许多 Web 站点允许用户对他们创建的内容进行分类或加标记。 Flickrdel.icio.us 是两个较早采用这种技术对图像和书签进行分类的 Web 站点。Folksonomy 允许它们的用户为自己的内容创建信息性标记集,而且用户可以选择最适合他们的描述。但是,用户的词汇可能相互不一致。这是一个热门的领域,关于这种方式的 优点和缺点有许多有意思的讨论。(参见 Peter MerholzLouis Rosenfeld。)

例 如,del.icio.us 是一个存储书签的 Web 站点。可以存储自己的书签并从任何 Web 浏览器访问它们,这很不错,但是这个系统的真正优点是可以通过一个通用的标记系统查看并访问别人的书签。标记允许人们使用任意多的单词标识他们的内容。 del.icio.us 将分类(或加标记)描述为:

“标记只是一个用来描述书签的单词。与文件夹不同,可以根据需要组合它们,并可以使用任意数量的标记。这种方式可以更好地组织书签,使用户能够方便地在 Web 上寻找感兴趣的内容。”

无论是使用固定的类别集,还是启用自由标记,对内容进行分类都可以大大改进用户体验。用户不但可以更轻松地找到他们自己的内容,还可以找到社区中的相关信息,如果不进行分类,这是不可能的。

一种实际方法

在站点上有效地使用分类法系统要求管理员在初始词汇表定义和后续的内容创建任务方面多做一些工作。但是,在完成初始定义之后,可以快速地搜索已经分类的内容,发现相似的信息。

最初,我们没有为 IBC Web 站点使用分类法系统。在开始学习 Drupal 系统时,分类法系统并不是需要首先理解的部分。相反,我们将 第 2 部分 中描述的信息体系结构映射到我们认为需要的节点类型,然后创建模块来处理每种节点类型。在本文中,我们将重新设计并重新实现 announcement 模块来利用分类法系统。这使用户能够快速地找到关于特定主题领域的公告,并轻松地查看相关的公告。

许多纯粹主义者主张一种 “正确的” 内容分类方法。但是,从实际的角度来看,使用任何分类法(即使是不完整或不一致的)都可以显著改进 Web 站点。与开始使用分类法相比,确保分类法的精确性并没有那么重要。

本 文的其余部分描述 Drupal 中与分类法相关的概念及其实现方式。我们将使用 Drupal 管理界面创建词汇表及其词汇。然后使用定义的分类法改进 announcement 模块,提供定制的导航和组织。还描述一些与分类法系统进行交互的方法,并使用分类法影响内容的样式。

Drupal 中的分类法

根据 Drupal 所述,在 Web 站点上有三个与分类法相关的主要任务:

  • 管理 系统中的类别
  • 按照类别对内容进行 组织,让用户能够看到相似的内容
  • 导航 到具有相似标记的内容
一个管理界面允许具有权限的用户轻松地创建分类法。然后,内容创建者就可以在编辑过程中用适当的分类法类别给内容加标记。Drupal 还提供了许多支持和扩展核心分类法系统的模块。

词汇表和词汇

Drupal 中的基本分类法结构是词汇表(vocabulary)。词汇表包含在对内容进行分类时使用的属性和关系。词汇表中的条目是词汇(term)。 词汇表示站点中内容的类别。在创建内容时,可以将内容与一个或多个词汇关联起来,然后用户、管理员或 Drupal 模块就可以在任何地方使用这些词汇。分类法系统支持许多词汇表,每个词汇表具有自己的一套词汇。这样就能够根据多个词汇表对内容进行分类,这在显示、控制 和管理信息方面提供了很大的灵活性。

在词汇表中,有两种词汇间关系:

  • 层次化关系(垂直关系),这是标准的父 - 子关系。层次化关系由管理员启用,并由词汇编辑人员选择。
  • 关联关系(水平关系),这些关系表示词汇之间的相似性,就像词典中一样。关联关系是通过在词汇之间创建同义词创建的。

图 1 以黑线表示词汇表中的层次化关系,以蓝色显示关联关系。


图 1. 词汇表中相关词汇的典型表示方法,层次化关系(黑色)和关联关系(蓝色)
词汇表中相关词汇的典型表示方法,层次化关系和关联关系

词汇表属性

在定义词汇表时,可以修改一些属性,包括:

Hierarchy(层次结构)
可 以为词汇表指定一个树结构。可以禁用层次结构并采用平面结构。如果启用层次结构,那么有两种选择:单一层次结构或多重层次结构。单一层次结构是大多数用户 所熟悉的,比如文件系统浏览器。多重层次结构允许一个词汇有多个父词汇。这样,词汇就会出现在树结构中的多个位置;例如,快捷方式或符号链接的文件夹或文 件会出现在文件浏览器中的多个位置。这样就可以更方便地访问词汇及其内容,但是也可能困扰缺乏经验的用户。
Related terms(相关词汇)
相关词汇(即同义词)用来将词汇表中的不同词汇联系起来。它就像词典中的同义词一样。 glossary 模块是一个使用同义词的示例。
Free tagging(自由标记)
可以为词汇表启用自由标记。当选择这个属性时,用户通过输入词汇来进行分类,而不是从预定义的词汇列表中进行选择。
Multiple select(多重选择)
这 个系统的一个出色特性是,在对内容进行分类时,可以在词汇表中启用多重选择。通过使用这种多重分类方法,可以从多个视角访问和显示内容。这为内容导航和查 看提供了更大的灵活性。为了启用这个特性,需要在编辑词汇表时选中 “multiple select” 复选框。在为词汇表启用自由标记时,总是启用这个特性。
Required(必需)
如果选择了必需属性,那么在编辑节点时,与这个词汇表相关联的每个节点类型都必须指定一个词汇。在编辑期间,这迫使所有节点都必须加上标记。

词汇属性

在定义新词汇时,有两个相关的属性:

Parent(父词汇)
可 以为这个词汇指定父词汇。这个属性的表示形式依赖于定义词汇表的方式。如果词汇表禁用了层次结构,那么不显示父词汇的选择。如果它是单一层次结构,那么从 一个下拉列表中进行选择。如果它是多重层次结构,那么显示一个可以进行多重选择的列表,可以在按住 Ctrl 时进行点击来选择多个父词汇。如果这个词汇处于顶级,那么选择 <root> 作为父词汇。
Synonyms(同义词)
可以为这个词汇输入同义词的名称。同义词包括词汇的缩写或其他拼写方式。在对话框中每行输入一个同义词。这些同义词的一种用途是应用在模块的搜索钩子中;这样就可以在搜索中包含给定关键词的同义词,从而产生更宽泛的搜索结果列表。




回页首


创建分类法

在本节中,我们将创建自己的词汇表和词汇。本系列的 第 2 部分 介绍了为 Web 站点创建公认的信息体系结构的方法,这可以作为分类法的基础。我们将使用 Drupal 管理界面(见 图 2)创建词汇表和词汇。可以通过 administer/categories 菜单(例如 http://ibc.development/admin/taxonomy)进入这个界面。目前,还没有定义任何词汇表。


图 2. 用于管理类别的管理界面
用于管理类别的管理界面

在这个示例中,我们将创建一个 IBC 词汇表,它用来组织 Web 站点上的公告。首先,在这个面板上选择 Add Vocabulary,这会显示一个用来指定词汇表属性的面板。如 图 3 所示,我们将这个词汇表命名为 IBC,为 Announcement 节点类型启用它,启用 Single 层次结构,并允许给定的节点进行词汇的 Multiple select

管理员还可以将这个词汇表指定为必需的;这样的话,当编辑人员创建节点时,必须从这个词汇表中选择一个词汇。IBC 词汇表的描述见图 3。


图 3. 创建用来组织 Web 站点上的公告的 IBC 词汇表
创建用来组织 Web 站点上的公告的 IBC 词汇表

创建了这个词汇表之后,它就出现在一个主列表中,见 图 4


图 4. Web 站点上词汇表的列表
Web 站点上词汇表的列表

为了开始在特定词汇表中添加词汇,在主列表页面上选择这个词汇表的 Add terms图 5 显示的界面允许输入多个词汇。可以在这里提供:

  • Parent,在这个词汇表中的父词汇。(如果这个词汇处于顶级,那么选择 <root>。)
  • Name,这个词汇的名称。
  • Description,由其他模块或 feed 使用的描述。
  • Synonyms,包括拼写的变体、缩写和其他相似的词汇。
  • Weight(权值),具有较低权值的词汇将出现在具有较高权值的词汇前面。
对于这个示例,我们的词汇表包含以下词汇: General、Workgroup、Conference、MembersWebsite。这些词汇将用来对公告进行分类。

图 5. 编辑 IBC 词汇表中的词汇
编辑 IBC 词汇表中的词汇

添加所有词汇之后,可以通过选择 List 来列出特定词汇表的词汇,见 图 6。在这里,我们添加了词汇 ConferenceGeneralMembersWebsiteWorkgroup


图 6. 列出 IBC 词汇表中的词汇
列出 IBC 词汇表中的词汇




回页首


分类法和内容创建

现在,在为 Web 站点创建公告时,可以将这个节点与这个词汇表中的词汇关联起来。Edit 视图中出现一个称为 Categories 的新部分,见 图 7。这个部分允许为公告分派一个或多个来自 IBC 词汇表的词汇。在这里,我们分派了词汇 Conference


图 7. 创建公告并将它归入一个类别
创建公告并将它归入一个类别

如果一个公告与多个类别相关联,那么可以通过按 Shift 时点击或按 Ctrl 时点击选择多个词汇,见 图 8。在这里,我们分派了词汇 GeneralWebsite


图 8. 创建公告并将它归入多个类别
创建公告并将它归入多个类别

现在已经定义了分类法,并将内容与词汇关联起来了。分类法系统会自动地根据词汇 ID 对内容进行过滤。在 图 9 中,我们访问 URL http://ibc.development/taxonomy/term/13 来显示标着词汇 Website 的所有内容。不幸的是,需要知道词汇 ID,才能使用这种方法显示内容。但是,可以 为 URL 路径设置别名,这样就可以使用分类法词汇名称而不是 ID。还可以提供到命名类别的导航链接。


图 9. 使用 URL 显示一个类别中的内容
使用 URL 显示一个类别中的内容

在下一节中,我们将介绍一种使用新的区块模块按照词汇对公告进行分类的程序方法。





回页首


分类法函数

创建了分类法并将内容与词汇关联起来之后,就可以创建更相关的内容显示,从而对内容进行定制和改进用户体验。在本节中,将讨论如何以程序方式与分类法进行交互。

有几个函数可以以程序方式操作分类法词汇表和词汇。以下函数可以帮助访问 分类法信息:

taxonomy_get_children 寻找一个词汇 ID 的所有子词汇。
taxonomy_get_parents 寻找一个给定词汇 ID 的所有父词汇。
taxonomy_get_parents_all 寻找一个给定词汇 ID 的所有祖先。
taxonomy_get_related 寻找与一个给定词汇 ID 相关的所有词汇对象。
taxonomy_get_synonyms 返回一个给定词汇 ID 的同义词的数组。
taxonomy_get_synonym_root 返回以给定字符串作为同义词的词汇对象。
taxonomy_get_term 返回与一个词汇 ID 匹配的词汇对象。
taxonomy_get_term_by_name 尝试将一个字符串映射到现有的词汇,比如用来建立术语表。
taxonomy_get_tree 创建一个词汇表的层次化表示。
taxonomy_get_vocabularies 返回所有词汇表对象的数组。
taxonomy_get_vocabulary 返回与一个词汇表 ID 匹配的词汇表对象。

为了保存 词汇表和词汇,可以使用以下函数:

taxonomy_save_term 以程序方式保存一个词汇。
taxonomy_save_vocabulary 以程序方式保存一个词汇表。

hook_taxonomy

特殊的钩子 hook_taxonomy 使模块能够反映分类法中的变化。当修改词汇或词汇表时,就涉及到这个钩子。这个钩子决定执行哪种操作,以及是在词汇表还是在词汇上执行这个操作。

更多信息参见 分类法函数





回页首


以程序方式将分类法词汇添加到节点中

刚 才提到的保存词汇和词汇表的函数接受一个数组参数,它们在数据库中更新或插入一个词汇或词汇表元素。这个数组包含 ID(词汇或词汇表 ID)、名称、描述和权值。例如,能够在添加或删除节点时添加或删除词汇表词汇。比如在动态构建工作组或会议导航菜单时,可以使用这些函数在词汇表中自动 地添加或删除与工作组或会议对应的词汇。

清单 1 演示如何在第一次保存工作组时动态地创建一个词汇。可以使用相似的代码在删除工作组时删除词汇。在删除工作组时,还可能希望删除用 term_node 表中的这个词汇分类的节点的关联关系。


清单 1. 在 IBC 词汇表中动态地添加词汇
                
function workgroup_insert($node) {
...
$voc = taxonomy_get_vocabulary_by_name('IBC');
$vid = $voc->vid;
$edit = array ("vid" => $vid, "name" => $node->title);
$msg = taxonomy_save_term($edit);
}

// support function to get the vocabulary by its name (not vid)
function taxonomy_get_vocabulary_by_name ($name) {
$results = db_query('SELECT * FROM {vocabulary} WHERE name = "%s"', $name);
if (db_num_rows($results) > 0) {
return db_fetch_object($results);
}
else {
return null;
}
}

这个新的 taxonomy_get_vocabulary_by_name 函数应该放在 taxonomy.module 中。





回页首


对内容进行组织和导航

Drupal 会自动地创建用特定词汇分类的所有节点的视图。如果访问 URL http://<yoursite>/taxonomy/term/13,就会显示标记词汇 ID 为 13 的所有节点,见 图 9

这并不是一个非常容易使用的界面。为了以更加用户友好的方式处理分类法导航,我们将借用 taxonomy_dhtml 模块中的功能。我们对 announcement 模块进行扩展,添加一个显示 IBC 词汇表、词汇和已分类内容的额外区块。

首先启用这个区块。在 图 10 中,administer -> blocks 面板(http://<yoursite>/admin/block)显示所有区块,包括定义的所有词汇表。启用 IBC 词汇表并将它添加到右边栏区块中,设置权值为 -9。这会使它显示在右边栏中较高的位置,就在最近更新的公告下面。


图 10. 指定 IBC 词汇表在右边栏中的区块位置
指定 IBC 词汇表在右边栏中的区块位置

图 11 显示在边栏中选择 Website(词汇 13)的效果。边栏列出 IBC 词汇表的每个词汇。词汇旁边是用它分类的节点的数量。每个词汇下面是分类内容的列表。


图 11. 新公告的区块模块 —— 显示词汇表、词汇和已分类的公告
新公告的区块模块 —— 显示词汇表、词汇和已分类的公告

我们对这个演示做了几个假设。IBC 词汇表只用来对公告进行分类,但是也可以轻松地用于对其他节点类型进行分类。在这个示例中,没有使用词汇的层次结构。在用户界面上,通常使用最近公告区块或公告词汇表区块,但是不同时使用这两者。根据这些假设,在 清单 2 中重新定义了 announcement 区块(原来在 第 6 部分 的清单 9 中定义)。


清单 2. 新的 announcement 区块,增加了支持词汇表导航的函数
                
function announcement_block($op = 'list', $delta = 0, $edit = array()) {
global $user;
if ($op == 'list') {
$blocks[0]['info'] = t('Recently updated announcements');
$blocks[1]["info"] = t('List nodes in the IBC vocabulary');
return $blocks;
}
else if ($op == 'view') {
$block = array();
switch ($delta) {
case 0:
$announcement_items = array();
if (user_access('access content')) {
$q = 'SELECT … ';
$now = time();
$items = variable_get('announcement_block_max_list_count', 3);
while (db_num_rows($announcements) > 0 and
$announcement = db_fetch_object($announcements)) {
$announcement_items[] = $announcement;
}
}
$block['subject'] = t('Announcements');
$block['content'] = theme('announcement_block_list', $announcement_items);
break;
case 1:
if (user_access("access content")) {
$vocabulary = taxonomy_get_vocabulary_by_name('IBC');
$block["subject"]= t('IBC');
$block["content"]= _announcement_vocab($vocabulary->vid);
}
}
return $block;
}
}

list 操作中,用 delta 值 1 注册了 IBC 词汇表。这会显示在 administer/blocks 界面中,见 图 10

启用之后,view 操作在这个新的边栏中显示 IBC 词汇表词汇。在显示 IBC 词汇表区块时,传递给区块钩子函数的 $delta 参数是 1。taxonomy_dhtml 模块使用一种不同的技术,它循环遍历所有词汇表,并在以词汇表的 vid 为索引的单独区块中显示各个词汇表。在这里,我们仅仅使用 taxonomy_get_vocabulary_by_name 函数获得 IBC 词汇表,并使用支持函数 _announcement_vocab()(见 清单 3),这个函数生成要列出的词汇。


清单 3. 为词汇表生成词汇
                
function _announcement_vocab($vocabulary_id, $op = NULL) {
$tree = taxonomy_get_tree($vocabulary_id);
foreach ($tree as $term) {
$url = "taxonomy/term/$term->tid";
if ($op) {
$url .= "/$op";
}
$link = l(t($term->name), $url, array("title" => t($term->description)));
$out .= _taxonomy_depth($term->depth, "&nbsp;")."- $link";
$count = taxonomy_term_count_nodes($term->tid);
if ($count) {
$out .= " ($count)";
$out .= _announcement_by_terms($term->tid);
}
else {
$out .= " (0)";
}
$out .= "<br />";
}
return $out;
}

对于每个词汇,它在边栏中创建一个链接。点击词汇就将显示一个页面,其中显示用这个词汇分类的所有节点。它使用分类法函数 taxonomy_term_count_nodes() 统计分类的节点数量并将这个数量显示在词汇旁边。然后对于每个词汇,使用 _announcement_by_terms() 函数准备每个分类的节点的链接,见 清单 4


清单 4. 返回用传递的词汇 ID 分类的公告
                
function _announcement_by_terms($tid) {
$result = '';
$tids = array( $tid );
$nodes = taxonomy_select_nodes($tids, 'or', 0, FALSE);
while ($r = db_fetch_object($nodes)) {
$url = "announcements/". $r->nid;
$result .= "<br/>&nbsp; - &nbsp;" .
l($r->title, $url, array("title" => t($r->title)));
}
return $result;
}

在这里,我们使用 taxonomy_select_nodes() 函数获得用词汇 ID $tid 分类的所有节点(在这个示例中只包括公告)。然后,创建与这个词汇一起显示的链接。

关于使用分类法进行导航的更多信息请参见 参考资料





回页首


使用分类法进行样式化

第 7 部分 解释了如何设置在 page.tpl.php 文件中定义的 body 元素的 class 属性值。可以使用这种方法自动地修改页面的表示方式,例如在显示新部分的内容时。这种方法使用一个 PHP 分支语句,根据 URL 中的第一个参数设置 class 属性值。第 7 部分中的 清单 5 给出了代码。

在本节中,我们提供一种使用专门定义的词汇表定义 class 属性值的方法。这样就能够通过 Drupal 管理界面控制这个词汇表,进而控制 Web 站点中特定区域的样式,而不需要修改 page.tpl.php 模板中的代码。

首先定义新的词汇表,它用来描述 IBC 内容类型与 Web 站点主要部分(home、workgroups、conferences 和 members)的关系。我们需要一个单选的单一层次结构的词汇表,它称为 IBC Section Hierarchy。我们按照本文前面描述的方法创建这个词汇表。然后添加那些定义 Web 站点部分的词汇,这些词汇是通过 第 2 部分 中的分析过程收集的。在这些词汇下面添加子词汇,这些词汇表示将出现在这些 Web 站点部分中的内容的节点类型名称。图 12 显示这个词汇表的样子。


图 12. IBC Section Hierarchy 词汇表中的词汇列表
IBC Section Hierarchy 词汇表中的词汇列表

可以看到 announcements 出现在 home 下面。在 IBC Web 站点的信息体系结构中,我们将全站点范围的内容(比如公告、关于信息和联系信息)分组在一般性的 home 部分中。在用户界面中,它们采用与主页相同的样式。

我们不使用第 7 部分中的代码,而是使用 清单 5 中的代码演示如何使用上面的词汇表定义 Web 页面的 BODY 元素的 class 属性值。


清单 5. 使用词汇表设置 page.tpl.php 中 body 元素的 class 属性值
                
...
<?php
$page_type = '';
if (!$is_front) {
if (arg(0) == 'node' && arg(2) == NULL) {
$terms = taxonomy_node_get_terms(arg(1));
}
else {
$terms = taxonomy_get_term_by_name(arg(0));
}
foreach ($terms as $term) {
$tid = $term->tid;
break;
}
$parents = taxonomy_get_parents($tid);
foreach ($parents as $parent) {
$section = $parent->name;
break;
}
$page_type = ($section?$section:$term->name);
}
else {
$page_type = 'home';
}
?>
<body class="<?php print $page_type; ?>" >
...

如果要显示首页,那么 class 属性值默认设置为 home。如果不是显示首页,那么需要判断与给定 URL 相关联的分类法词汇。与前面的方法不同,我们要检查泛型 Drupal URL,比如 /node/123。对于这些 URL,将节点 ID 传递给 taxonomy_node_get_terms() 函数,从而获得与这个 URL 相关联的词汇对象的数组。如果 URL 不是泛型 Drupal URL,比如 /announcements/123,那么使用 taxonomy_get_term_by_name() 函数获得与这个 URL 相关联的词汇对象的数组。

在获得的词汇对象数组上执行 foreach 循环,找到词汇 ID $tid。找到了与这个 URL 相关联的词汇 ID 之后,需要检查这个词汇是否有父词汇。将词汇 ID 传递给 taxonomy_get_parents() 函数,从而获得父词汇对象的数组。通过使用相似的 foreach 循环,可以用父词汇的名称设置 $section 变量。因此,如果 URL 是 /announcements/123,那么使用 announcements 的词汇 ID 检索父词汇名称,得到的是 home

现在建立 $page_type 变量,我们使用这个变量设置 class 属性值。如果找到了父词汇,就使用它的名称。如果没有找到父词汇,就使用与这个 URL 相关联的词汇名称。只要维护好适当的词汇表(比如上面这样的词汇表),能够将 URL 的第一个参数映射到相关联的节点词汇,就可以控制页面的样式。

结束语

本 文描述了如何使用分类法和标记在 Web 站点上创建有意义的用户体验。介绍了 Drupal 中使用的术语,并提供了几个利用分类法系统的示例。我们尝试了程序式方法,展示了开发人员可以使用的几种技术。在开始使用分类法系统之后,您会发现利用其 灵活性的新方法。您可以进一步了解扩展分类法系统的许多模块(参见 参考资料)。

在下一篇文章中,将学习如何把 Web 站点部署到生产环境中。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值