用代码定义一个简单的drupal内容类型

第四章中,我们创建了第一个自定义内容类型。那时,我们是通过 Drupal 的管理界面创建的新类型。

在第七章中,我们创建了一个更高级的内容类型,我们在数据库中附加了一个表存放它的附加内容。

在这里,我们将创建与第四章的那个相似的简单内容类型,不过我们要用编程的方法实现。因为我们不需要在标准节点内容之外添加额外的域(field),因此用两个函数就可以创建我们的内容类型(不需要数据库操作)。

我们已经介绍过创建内容类型的技术,所以这部分我们讲的快一点。

我们的新内容类型是新闻简讯(news brief)内容类型。这个内容类型的作用是,在新的站点新闻邮件的开头添加一些社论性质的内容。以编程的方式添加这样的简单内容类型需要实作两个钩子,在上一章中我们见过这两个钩子:

  • hook_node_info(): 设定内容类型的默认值。
  • hook_form(): 创建基本的表单用于编辑新的新闻简讯节点。

让我们先来实作 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)的方法。

|