第四章中,我们创建了第一个自定义内容类型。那时,我们是通过 Drupal 的管理界面创建的新类型。
在第七章中,我们创建了一个更高级的内容类型,我们在数据库中附加了一个表存放它的附加内容。
在这里,我们将创建与第四章的那个相似的简单内容类型,不过我们要用编程的方法实现。因为我们不需要在标准节点内容之外添加额外的域(field),因此用两个函数就可以创建我们的内容类型(不需要数据库操作)。
我们已经介绍过创建内容类型的技术,所以这部分我们讲的快一点。
我们的新内容类型是新闻简讯(news brief)内容类型。这个内容类型的作用是,在新的站点新闻邮件的开头添加一些社论性质的内容。以编程的方式添加这样的简单内容类型需要实作两个钩子,在上一章中我们见过这两个钩子:
让我们先来实作 hook_node_info()。
/** * Create the 'newsbrief' content type. * Implements hook_node_info(). * */ function sitenews_node_info() { return array( 'newsbrief' => array( 'module' => 'sitenews', 'name' => t('News Brief'), 'description' => t("A news brief about the state of the site."), 'has_title' => TRUE, 'title_label' => t('Title'), 'has_body' => TRUE, 'body_label' => t('News Brief'), ) ); }
在上面的代码中,我们创建了一个名为 newsbrief 的新内容类型。这个内容类型属于我们的 sitenews 模块,它有两个域(field):简讯的标题(title)和正文(body)。
注:对于 hook_node_info() 的详细讨论参见上一章。
在代码中实现简单内容类型,比在管理界面上创建它更难一些,原因在于必须用代码为内容创建一个表单(使用表单 API 和 hook_form())。
/** * Create the form for editing News Brief nodes. * Implements hook_form(). * */ function sitenews_form(&$node) { $type = node_get_types('type', $node); if ($type->has_title) { $form['title'] = array( '#type' => 'textfield', '#title' => check_plain($type->title_label), '#required' => true, '#default_value' => $node->title, '#weight' => -5, ); } if ($type->has_body) { $form['body_field'] = node_body_field( $node, $type->body_label, $type->min_word_count ); } return $form; }
这个表单只定义了新闻简讯节点的 title 和 body 域。实际上,它是我们在第七章中见过的表单的简化版本。
现在我们已经定义了新的内容类型。在模块的 .install 文件中不需要做什么,我们也不打算为这种类型创建任何特殊访问规则。现在我们准备着手解决下一项任务。
接下来,我们将学习让这个节点的内容通过一系列过滤器(filter)的方法。