编程管理手册大纲

本文假设读者具有编程操作 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;
}
Avatar
崔秀龙

简单,是大师的责任;我们凡夫俗子,能做到清楚就很不容易了。

comments powered by Disqus
下一页
上一页

相关