编程管理手册大纲
本文假设读者具有编程操作 Node 的需求和经验。
Drupal 核心带有一个 Book 模块,用于生成具有多层上下级关系的内容大纲,这一功能对于特定需求的展示是非常有用的,这里介绍一下如何使用代码来生成层级大纲。
心急的同学可以直接拉到页尾抄代码。
Book 模块激活后,会在内容编辑界面上生成新的手册大纲标签页。这里即可编辑手册内容,并对大纲进行创建和添加。
我们可以通过新建一个手册的方式来观察 Drupal 中手册的行为,以此可以大致清楚创建的过程。
首先我们可以利用 Firebug 或者 Chrome 开发控制台等工具来观察新加入的标签页中 From 的具体内容,经过观察后我们知道,新建手册的选择,基本上是选择了之前我们创建的封面所在 Node 的 nid,注意这一下拉框的 ID 中的 bid
字样;如果我们选择了一个已经存在的手册的话,会多出一个选择上级的下拉框,其中列出了已经存在的手册项供选择,选择后就成为新内容的上级,注意这个下拉框 ID 中的 plid
。
我们用上面的方式创建了新的手册之后,可以使用 Devel 工具的 dsm
功能来获取新建 Node 的结构,编写如下代码:
$node = node_load(514); //刚新建的封面的 nid。
dsm($node);
执行后会发现,这个 Node 跟其他 Node 稍有不同的就是他多出一个 book
成员,这是一个数组结构,这里会发现,数组中有几个名字中带 id
的成员。
联系刚才我们新生成的封面和内容两个 Node,进行对比,可以得到其中的上下级关系的脉络,还可以从 Book 模块的 Install 文件中拿到该模块的数据表,两相印证,大致得到了父子关系的表达方式:
- mlid:手册本成员的Menu Link ID
- bid:手册 ID
- nid:手册成员的 Node ID
- plid:手册成员的上级 Menu Link ID
即可得出 Book 的创建方法。
/**
* @param string $type 内容类型
* @param int|string $parent_nid 如果是顶层,则赋值为 'new'
* @param int $parent_menu_link_id 如果是顶层,则设置为 0
* @param int $weight
* @return mixed|\stdClass
* @throws \Exception
*/
function build_basic_book_node($type, $parent_nid,
$parent_menu_link_id, $weight = 0) {
$node = new stdClass();
$node->type = $type;
$node->language = LANGUAGE_NONE;
$node->uid = 1;
node_object_prepare($node);
$node = node_submit($node);
$node->book = array(
'bid' => $parent_nid,
'plid' => $parent_menu_link_id,
'weight' => $weight
);
node_save($node);
$node = entity_load_single('node', $node->nid);
return $node;
}