在hook_node_info()中添加字段;


9

是否可以将字段添加到使用hook_node_info声明的节点类型?我是否必须单独添加字段?如果是这样,我将使用哪个钩子?

Answers:


8

您需要分别附加字段,不能通过添加字段hook_node_info()。通常,您可以hook_install()在模块的.install文件中的函数中执行此操作。

来自Drupal核心的一个很好的简单示例在博客模块的安装文件中:

function blog_install() {
  // Ensure the blog node type is available.
  node_types_rebuild();
  $types = node_type_get_types();
  node_add_body_field($types['blog']);
}

该函数仅重建节点类型(因此可以使用新添加的类型),然后使用该node_add_body_field()函数向其添加一个body字段。此函数本身提供了一个很好的示例,说明如何创建字段,该字段的实例,然后使用field_create_field()field_create_instance()函数将其附加到内容类型。

代码没有那么长,所以我将在此处作为示例:

function node_add_body_field($type, $label = 'Body') {
  // Add or remove the body field, as needed.
  $field = field_info_field('body');
  $instance = field_info_instance('node', 'body', $type->type);
  if (empty($field)) {
    $field = array(
      'field_name' => 'body', 
      'type' => 'text_with_summary', 
      'entity_types' => array('node'),
    );
    $field = field_create_field($field);
  }
  if (empty($instance)) {
    $instance = array(
      'field_name' => 'body', 
      'entity_type' => 'node', 
      'bundle' => $type->type, 
      'label' => $label, 
      'widget' => array('type' => 'text_textarea_with_summary'), 
      'settings' => array('display_summary' => TRUE), 
      'display' => array(
        'default' => array(
          'label' => 'hidden', 
          'type' => 'text_default',
        ), 
        'teaser' => array(
          'label' => 'hidden', 
          'type' => 'text_summary_or_trimmed',
        ),
      ),
    );
    $instance = field_create_instance($instance);
  }
  return $instance;
}

谢谢。我需要在hook_uninstall中做任何事情吗?
加兰2012年

确实由您决定...如果您要删除已创建的任何内容/内容类型/字段,则可以,如果不删除,则可以不:)
Clive

因此,当我的模块关闭时,我的内容类型不会消失吗?
加兰2012年

2
禁用模块时(在Drupal 7中),即使卸载已禁用的模块,自定义内容类型也不会消失。如果您编写代码以删除在模块的hook_uninstall()期间在安装过程中创建的内容类型,则是的,当您卸载模块时,内容类型将消失(但在仅禁用它时仍不会消失)。
Uncle Code Monkey
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.