现在的位置: 首页 > 综合 > 正文

Drupal专业开发指南 第14章 在Drupal中使用分类(Drupal taxonomy)(3)

2013年01月13日 ⁄ 综合 ⁄ 共 5720字 ⁄ 字号 评论关闭

分类函数

           
译者:老葛  Eskalate科技公司

下面的部分将解释在你的模块可能用到的分类常用函数。

 

 

取回关于词汇表的信息

下面部分所列的内置函数用来取回词汇表的相关信息,信息的形式可以是词汇表数据对象或者是关于这些对象的数组。

 

taxonomy_get_vocabulary($vid)

这个函数取回一个单个的词汇表(参数$vid是该词汇表的ID),返回的是一个词汇表对象。它还在内部缓存了词汇表对象,这样多次调用同一个词汇表对象并不费事。

 

taxonomy_get_vocabularies($type)

taxonomy_get_vocabularies($type)函数取回所有的词汇表对象。参数$type将取回的词汇表限定在给定的节点类型上;比如,blog。这个函数返回一个词汇表对象数组。

 

添加、修改、和删除词汇表

下面的函数用于创建、修改、和删除词汇表。它们返回一个状态代码,代码为Drupal常量SAVED_UPDATEDSAVED_NEW、或SAVED_DELETED中的一个。

 

taxonomy_save_vocabulary(&$vocabulary)

这个函数用来创建一个新的词汇表或者更新一个已存在的词汇表。参数$vocabulary是一个关联数组(注意它不是一个词汇表对象!),包含以下键:

 


name: 词汇表的名字。


description: 词汇表的描述。


help: 一个帮助文本,展现在节点创建表单中这个词汇表的字段的下面。


nodes: 一个数组,包含了这个词汇表应用到的所有节点类型。


hierarchy: 设为0意味着没有层级,设为1意味着单个层级,设为2意味着多层级。


relations: 设为0意味着禁用关联词语,设为1意味着允许关联词语。


tags: 设为0意味着禁用自由标签,设为1意味着启用自由标签。


multiple: 设为0意味着不可以对词语进行多选,设为1意味着允许多选。


required:
设为0意味着节点案提交时不选词语也能提交(这将引入一个默认的None词语),设为1意味着节点提交前必须选一个词语。


weight: 词汇表的重量;它影响分类字段集中节点提交表单的位置,


module: 负责这个词汇表的模块的名字。如果没有传递这个键,那么它的值默认为taxonomy(分类)。


vid: 词汇表ID。如果没有传递这个键,那么将创建一个新的词汇表。

 

taxonomy_save_vocabulary(&$vocabulary)函数返回SAVED_NEW
或者 SAVED_UPDATED。

 

taxonomy_del_vocabulary($vid)

这个函数的参数$vid是词汇表的ID。删除一个词汇表的同时,会删除词汇表中的所有词语,通过为每个词语调用taxonomy_del_term()来删除词语。taxonomy_del_vocabulary($vid)函数返回SAVED_DELETED。

 

 

取回关于词语的信息

下面所列的内置函数用来取回关于词语的信息,一般以对象或者对象数组的形式。

 

taxonomy_get_term($tid)

这个函数取回一个词语(参数$tid是词语的ID),并返回一个词语对象。它在内部缓存词语对象,所以对同一词语的多次调用并不费事。

 

taxonomy_get_term_by_name($text)

taxonomy_get_term_by_name($text)函数搜索匹配一个字符串(参数$text是一个字符串)的所有词语。$text中左边或者右边的空格将被除去,而匹配操作将使用SQL的LIKE比较操作符:WHERE
LOWER($text) LIKE LOWER(name)。这个函数返回一个词语对象数组。

 

taxonomy_node_get_terms($nid, $key)

这个函数查找与某一节点相关联的所有词语。参数$nid是要取回词语的节点的ID,而参数$key默认为tid并且有一个点难以理解。它影响结果返回的方式。taxonomy_node_get_terms($nid, $key)返回一个数组的数组,根据$key生成键。因此,结果数组在默认情况下是以词语ID为键的,但是你也可以使用term_data表(tid,
vid,
name,
description,
weight)中的任意一列。这个函数在内部会为每个节点缓存结果。

 

taxonomy_node_get_terms_by_vocabulary($nid, $vid, $key)

这个函数将在一个词汇表($vid)中查找与某一节点($nid)相联系的所有词语。参数$key的描述可参看taxonomy_node_get_terms($nid,
$key)中的解释。

添加,修改,和删除词语

下面的函数用于创建、修改、和删除词语。它们返回一个状态代码,其值为Drupal常量SAVED_UPDATED
SAVED_NEW o
SAVED_DELETED中的一个。

 

taxonomy_save_term(&$term)

这个函数创建一个新的词语或者更新一个已存在的词语。参数$term是一个包含下列键的关联数组(注意它不是一个对象):


name: 词语的名称。


description: 词语的描述。Drupal的默认用户接口中用不到该值,但是它可能在你的模块或者其它第3方模块中用到。


vid:词语所在的词汇表的ID。


weight: 词语的重量。它影响词语下拉列表中各个词语的相对位置。


relations: 一个可选的数组,包含与该词语相联系的所有词语的ID。


parent: 可以是一个字符串,用来代表父词语的词语ID;或者是一个数组,其元素既或者是字符串,或者是子数组,其中字符串为用来代表父词语的词语ID,而子数组是包含这样字符串的数组。


synonyms: 一个可选的字符串,包含以换行字符(/n)分隔的同义词。


tid: 词语的ID。如果这个键值为空的话,那么将创建一个新的词语。

这个函数返回SAVED_NEW
或者 SAVED_UPDATED。

 

taxonomy_del_term($tid)

taxonomy_del_term($tid)函数用来删除一个词语;参数$tid是词语ID。如果一个词语是在一个多层级的词汇表中并且具有子词语,那么子词语也将一同被删除,除非子词语拥有多个父词语。

 

 

取回关于词语层级的信息

当使用多层级的词汇表时,下面的函数会非常有用。

 

taxonomy_get_parents($tid, $key)

这个函数找出一个词语父词语(不包含父词语的父词语);参数$tid是词语ID。参数$key默认为tid,它是term_data表(tid,
vid,
name,description,
weight)中的一列。taxonomy_get_parents($tid, $key)返回一个关于词语对象的关联数组,其中根据$key生成键值。

 

taxonomy_get_parents_all($tid)

这个函数找出一个词语的所有祖先;参数$tid是词语的ID。这个函数返回一个包含词语对象的数组。

 

taxonomy_get_children($tid, $vid, $key)

taxonomy_get_children($tid, $vid, $key)函数找出一个词语的所有孩子。参数$tid是词语的ID。参数$vid是可选的;如果一个词汇表的ID传了进来,那么该词语的孩子将被限制在这个词汇表中(注意,只有当词语有多个父亲,而父词语有位于不同的词汇表时,这才有用,而这种情况非常稀少)。参数$key默认为tid,它是term_data表(tid,
vid,
name,description,
weight)中的一列。这个函数返回一个关于词语对象的关联数组,其中根据$key生成键值。

 

taxonomy_get_tree($vid, $parent, $depth, $max_depth)

 

这个函数生成一个词汇表的层级化表示。参数$vid就是用来生成层级树的词汇表的词汇表ID。如果你不想为一个词汇表生成一个整树的话,而只想生成一个以$parent声明的词语ID为根的子树,这时你可以声明参数$parent。参数$depth是内部使用的参数,默认为-1.参数$max_depth是一个整数,用来指出返回树的层级数,它默认为NULL,这意味着所有的层级。这个函数返回了一个包含词语对象的数组,这里向词语对象添加了“depth”
和 “parents”键。“depth” 键是一个整数,用来指示词语在树中所处的层级;而parents”键是一个数组,包含了词语的所有父词语的词语ID。例如,让我们为表14-3所列的词汇表得到相应的结果,它的词汇表ID为2:

$vid = 2;

print_r($taxonomy_get_tree($vid));

 

结果如下:

 

Array (

[0] => stdClass Object (

[tid] => 1

[vid] => 2

[name] => Canada

[description] => A mari usque ad mare.

[weight] => 0

[depth] => 0

[parents] => Array (

[0] => 0 )

)

[1] => stdClass Object (

[tid] => 4

[vid] => 2

[name] => Ontario

[description] => Ut incepit fidelis sic permanet.

[weight] => 0

[depth] => 1

[parents] => Array (

[0] => 1 )

)

[2] => stdClass Object (

[tid] => 5

[vid] => 2

[name] => Toronto

[description] => Diversity Our Strength.

[weight] => 0

[depth] => 2

[parents] => Array (

[0] => 4 )

)

[3] => stdClass Object (

[tid] => 2

[vid] => 2

[name] => British Columbia

[description] => Splendor sine occasu.

[weight] => 0

[depth] => 1

[parents] => Array (

[0] => 1 )

)

[4] => stdClass Object (

[tid] => 3

[vid] => 2

[name] => Vancouver

[description] => By Land, Sea and Air We Prosper.

[weight] => 0

[depth] => 2

[parents] => Array (

[0] => 2 )

)

)

 

取回关于词语同义词的信息

如果你的模块需要实现对同义词支持的话,下面的函数对你将会非常有用。

 

taxonomy_get_synonyms($tid)

使用这个函数为给定词语取回关于其同义词的数组。参数$tid是词语的ID。函数返回一个字符串数组;每个字符串就是词语的一个同义词。

 

taxonomy_get_synonym_root($synonym)

给定参数$synonym一个字符串,这个函数将执行一个针对term_synonym表的精确匹配查询。它返回一个单个词语对象,代表示使用该同义词找到的第一个词语。

 

 

查找带有特定词语的节点

有时,你想要一种简单的方式来查询具有特定词语的节点,或者输出这样一个查询的结果。此时,下面的函数将对你非常有用。

 

这个函数,通过根据给定参数构建和执行一个数据库查询,来查找匹配特定条件的节点。它返回一个指向查询结果的资源标识符。参数$tids是一个词语ID的数组。参数$operator是“or”或者“and”,它用来声明如何解释$tids数组。参数$depth指示分类树中要遍历的层级深度,默认为0,意味着“不要查找$tids中声明词语的所有孩子”。将$depth设为1,意味着查找$tids中声明词语的所有子词语(不包含子词语的孩子,也就是孙子,重孙,等等)。将$depth设为all,意味着查找$tids中声明词语的所有子词语(包含孙子,重孙,等等)。参数$pager是一个布尔值,用来指示是否要对一个节点结果页面使用一个分页器,它默认为TRUE。如果你要生成一个XML种子,你可以将$pager设置为FALSE。参数$order包含了字面上的order语句,它在查询的SQL中使用,而且默认为“n.sticky
DESC, n.created DESC”。

 

如果你为许多词语进行搜索,那么这个函数是非常耗费数据库资源的;参看本章前面的“使用一个定制查询根据词语对结果分组”部分的另一种解决方式。

 

taxonomy_render_nodes($result)

如果你使用taxonomy_select_nodes()来查询匹配特定分类条件的节点,那么我们在这里就可以使用taxonomy_render_nodes()作为一个起点来为你的查询创建一个简单输出。

 

额外资源

许多模块在许多地方都使用了分类,从添加访问控制(taxonomy_access.module),到动态分类浏览(taxonomy_browser.module),再到在一个区块中根据分类词语展示相关联的节点(related_nodes.module)。Drupal参考手册含有关于分类的更多信息,也包含许多基于分类的第3方模块的截图,位于http://drupal.org/handbook/modules/taxonomy

 

我们鼓励你尝试views模块,特别是在主体化分类列表时(http://drupal.org/project/views

 

总结

 

读完本章后,你应该能够

• 理解什么是分类

• 理解词语,词汇表,以及它们不同的选项

• 扁平结构,层级结构,和多层级结构词汇表之间的区别

• 使用AND
OR构建URL来对分类词语进行搜索

• 为分类词语和词语联合的RSS种子构建URL

• 理解分类是如何存储的

• 知道如何在你自己的模块中使用词汇表

• 将对分类所做的修改通知给你的模块


构建针对分类表的定制查询

 

 

 

 

 

抱歉!评论已关闭.