在 if ($task == 'profile') 代码块儿中,我们做的第一件事儿是调用默认大纲中的 default_profile_tasks() 函数。前面我们指出了这样做的原因。
接下来,我们定义 quote 节点类型:
// Quote content from chapter 4: $quote_type = array( 'name' => st('Quote'), // <- st() is t() for installer 'type' => 'quote', 'description' => st('Quotations and witticisms'), 'module' => 'node', 'has_title' => TRUE, 'title_label' => 'Origin', 'body_label' => 'Text', 'has_body' => TRUE, 'custom' => TRUE, 'modified' => TRUE, 'locked' => FALSE, 'is_new' => TRUE, 'help' => '', 'min_word_count' => 0, ); node_type_save((object)$quote_type);
在这里我们用了另一种方法创建新的内容类型。因为我们没有使用模块,因此不能使用 hook_node_info() 为我们进行创建工作。
我们用了另一种方法,通常这种方法是专门用来通过用户交互创建内容类型的。实际上,我们在这里用一个函数保存节点类型,在第四章中,通过管理界面创建 quote 内容类型时,Drupal 使用的也是同一个函数。
提示:hook_node_info() 与 node_type_save()
你怎么知道应该用哪一个呢?当一个模块添加自己的内容类型时,应该用 hook_node_info()。只有当内容类型并非模块专用时,才用node_type_save()。
因为我们使用了底层的 node_type_save() 函数,因此必须定义将要存入数据库的所有 field。所以,我们的 $quote_type 数组比较长。
提示:如果你不喜欢设定所有的默认值,你可以打破 Drupal 的准则,使用“私有的”节点函数 _node_type_set_defaults(), 传递给它一个稀疏数组。那个函数将为数组中不存在的任何属性设置默认值。
在上面的代码中,我们用了一个新函数:st()。这个函数提供了与 t() 函数同样的功能。但是在安装期间,翻译系统的初始化没有完成。正因为如此,应该用st() 函数代替 t()。
st() 不是通过查询用户偏好决定来确定语言,而是使用安装程序提供的信息设置语言。不应该在安装环境之外使用这个函数。
正确设置好了数组之后,我们必须把它强制转型为一个对象,再把它传递给 node_type_save()。
node_type_save((object)$quote_type);
在安装大纲中创建一个新内容类型,需要做的工作就这么多。