如何在Drupal 7中以编程方式创建新的内容类型

时间:2011-11-14 07:45:44

标签: drupal module drupal-7 content-type

我正在Drupal 7中构建一个模块(my_module)。它有一些功能,还会创建新的内容类型。在my_module.install中我实现了hook_install(my_module_install)我可以使用更多的hook_install实现在这个模块中创建新的内容类型(my_cck_install)吗?如果(是的),我应该怎么做?另外:我是否在另一个模块中执行此操作? : - )

4 个答案:

答案 0 :(得分:8)

您不能在同一模块中使用多个hook_install的实现;在PHP中,你不能拥有2个具有相同名称的函数来规则。

您只需要在同一hook_install中添加新内容类型(请查看标准安装配置文件在/profiles/standard/standard.install中的工作方式)。这就是我总是从安装文件中添加新内容类型的方式(使用推荐模块的示例):

function testimonial_install() {
  // Make sure a testimonial content type doesn't already exist
  if (!in_array('testimonial', node_type_get_names())) {
    $type = array(
      'type' => 'testimonial',
      'name' => st('Testimonial'),
      'base' => 'node_content',
      'custom' => 1,
      'modified' => 1,
      'locked' => 0,
      'title_label' => 'Customer / Client Name'
    );

    $type = node_type_set_defaults($type);
    node_type_save($type);
    node_add_body_field($type);
  }
}

答案 1 :(得分:3)

以下代码将创建一个名为“Event”的内容类型,其机器名称为“event”和标题字段 -

//CREATE NEW CONTENT TYPE
function orderform_node_info() {
  return array(
    'event' => array(
    'name' => t('Event'),
    'base' => 'event',
    'description' => t('A event content type'),
    'has_title' => TRUE
    ),
  );
}


function event_form($node,$form_state) {
  $form['title'] = array(
    '#type' => 'textfield',
    '#title' => t('event Title'),
    '#default_value' => !empty($node->title) ? $node->title : '',
    '#required' => TRUE,
    '#weight' => -5
  );
  return $form;
}
//END CONTENT TYPE

你应该将它放在你的.module文件中...如果你想要添加其他字段,请告诉我,我会用代码补上你的...祝你好运!

答案 2 :(得分:1)

/ *  *在 .Module文件中的钩子节点信息中实现  * /

function test_node_info() {
return array(
  'product' => array(
    'name' => t('Product'),
    'base' => 'product',
    'description' => t('Product Title'),
  )
);

}

/ **  *实现hook_form()  * /

function product_form($node, $form_state) {
return node_content_form($node, $form_state);

} / **  *在 .install文件中实现hook_install()。  * /

function test_install() {
node_types_rebuild();
$types = node_type_get_types();
node_add_body_field($types['product']);
//New way to implement to add fields in your content type
foreach (_test_installed_fields() as $field) {
    field_create_field($field);
}
foreach (_test_installed_instances() as $fieldinstance) {
    $fieldinstance['entity_type'] = 'node';
    $fieldinstance['bundle'] = 'product';
    field_create_instance($fieldinstance);
}

}

/ *  *定义您的字段  * /

function _test_installed_fields() {
$t = get_t();
return array(
  'product_title123' => array(
    'field_name' => 'product_title123',
    'label' => $t('Product Title'),
    'type' => 'text'
  ),
  'description123' => array(
    'field_name' => 'description123',
    'label' => $t('Description'),
    'type' => 'text'
  ),

);

}

/ *  *定义您的字段实例  * /

function _test_installed_instances() {
$t = get_t();
return array(
  'product_title123' => array(
    'field_name' => 'product_title123',
    'type' => 'text',
    'label' => $t('Product Title'),
    'widget' => array(
      'type' => 'text_textfield'
    ),
    'display' => array(
      'example_node_list' => array(
        'label' => $t('Product Title'),
        'type' => 'text'
      )
    )
  ),
  'description123' => array(
    'field_name' => 'description123',
    'type' => 'text',
    'label' => $t('Description'),
    'widget' => array(
      'type' => 'text_textarea_with_summary'
    ),
    'display' => array(
      'example_node_list' => array(
        'label' => $t('Description'),
        'type' => 'text'
      )
    )
  ),

);

}

/ **  *实现hook_uninstall()。  * /

function test_uninstall() {
$ournewtype = 'product';
$sql = 'SELECT nid FROM {node} n WHERE n.type = :type';
$result = db_query($sql, array(':type' => $ournewtype));
$nodeids = array();
foreach ($result as $row) {
    $nodeids[] = $row->nid;
}
node_delete_multiple($nodeids);
node_type_delete($ournewtype);

}

那就是它。

答案 3 :(得分:0)

     /**
     * Implements hook_node_info()
     */
    function mymodule_node_info() {
        return array(
            'news' => array(
                'name' => t('News'),
                'base' => 'news',
                'description' => t('You can add  News here'),
                'has_title' => TRUE,
                'title_label' => t('News title')
             )
        );
    }

 /**
 * Implement hook_form()
 */
function mymodule_form($node, $form_state) {
    return node_content_form($node, $form_state);
}

将实现添加到mymodule.install如下:

/**
 * Implements hook_install().
 */
function mymodule_install() {
    node_types_rebuild();
    $types = node_type_get_types();|
      node_add_body_field($types['news']);
}

您可以使用here

中的代码获取详细说明