在hook_install上创建新的内容类型


11

有人可以向我展示如何在模块的hook_install方法中创建新内容类型的正确示例吗?

我还想知道在hook_uninstall期间是否应该/应该做些什么来清理我的混乱情况;我读到有一些关于仅删除内容的争论。

我还没有找到完成此任务的正确方法的示例,我们将不胜感激!

Answers:


7

要准确回答您的问题:

在挂钩安装中创建内容类型:您使用node_type_save()创建内容类型,这是来自webform.install的示例:

  // Create the default webform type.
  $webform_type = array(
    'type' => 'webform',
    'name' => st('Webform'),
    'base' => 'node_content',
    'description' => st('Create a new form or questionnaire accessible to users. Submission results and statistics are recorded and accessible to privileged users.'),
    'custom' => TRUE,
    'modified' => TRUE,
    'locked' => FALSE,
  );

  $webform_type = node_type_set_defaults($webform_type);
  node_type_save($webform_type);
  node_add_body_field($webform_type);

hook_uninstall中的操作:基本上只是自己清理一下,因此删除模块创建的变量(使用variable_del()),删除模块上传的所有文件(使用file_unmanaged_delete_recursive()),删除定义的内容类型(使用node_type_delete()),等等

希望这可以帮助!


谢谢,很高兴知道这样做的编码方式,而且我需要找到一些有关使用卸载的好信息
Jane Panda

没问题,乐于帮助!:)
Alex Weber

11

将这些信息保留在代码中的最佳方法之一就是使用功能。Feaures可以将代码放入:

  • 内容类型
  • CCK字段
  • 权限
  • 的角色

清单继续。

关于功能的一个不错的功能是Drush集成

drush features将为您提供站点上所有功能的列表,它们的状态
drush features revert all会将所有功能还原为代码中的内容(在部署后运行非常方便)

帮助这有帮助


同意,尽管它不能直接回答问题……
Alex Weber

是的,我确实知道这并不是所要求的确切解决方案,但最终它们都将实现相同的目标,只是一个噩梦难以维持,而另一个则很容易实现点击,点击和出色的集成。鲍勃(Bob)可以决定对他有什么用
2011年

1
再次同意!起初Drush + Features可能令人生畏,但一旦掌握了它,它就会非常有用:)
Alex Weber

我会试一试,如果可以导出自定义内容类型,我认为这样可以节省时间,这样我就不必手动填写所有字段了。谢谢!
Jane Panda

3

查看“ D7 示例”模块。node_example已安装并卸载。

您可能可以使用界面工具来充实类型,然后制作功能(带有功能模块)并将相关部分提取到自定义模块的安装功能中。


0

如果要使用某些字段创建新的内容类型,可以使用以下代码。

这段代码非常适合我。

function HOOK_install() {

 /* CREATE THE CONTENT TYPE */
 $t = get_t();
 $node_example = array(
    'type' => 'slider',
    'name' => $t('Slider Content'),
    'base' => 'node_content',
    'description' => $t('Add slider content.'),
    'body_label' => $t('Slider Description')
 );
 $content_type = node_type_set_defaults($node_example);

// Create a custom Field with our required field-type.
$field = array(
  'field_slider_images' => array (
    'field_name' => 'field_slider_images',
    'type' => 'image',
  ),
 'field_slider_links' => array (
   'field_name' => 'field_slider_links',
   'type' => 'text',
   'entity_types' => array('node'),
  ),

);
foreach ($field as $fields) {
  field_create_field($fields);
}

// Create a instances of that Field.
$instance = array(
'field_slider_images' => array (
  'field_name' => 'field_slider_images',
  'entity_type' => 'node',
  'bundle' => 'slider',
  'label' => t('Slider Image'),
  'description' => 'Add Slider Image.',
  'settings' => array(
    'file_directory' => 'field/document',
    'file_extensions' => 'png PNG jpg jpeg JPG JPEG',
    'max_filesize' => '10MB',
    'title_field' => '',
  ),
  'widget' => array(
     'type' => 'image_image',
     'weight'=> 10,
  ),
  'formatter' => array(
    'label' => t('label'),
    'format' => 'image'
  ),
  'settings' => array(
    'file_directory' => 'slider-image', // save inside "public://photos"
    'max_filesize' => '4M',
    'preview_image_style' => 'thumbnail',
    'title_field' => TRUE,
    'alt_field' => FALSE,
  )
),
'field_slider_links' => array (
  'field_name' => 'field_slider_links',
  'entity_type' => 'node',
  'bundle' => 'slider',
  'label' => t('Slider Link'),
  'widget' => array('type' => 'text_textfield'),
 ),
);

foreach ($instance as $fieldinstance) {
 field_create_instance($fieldinstance);
}

$status = node_type_save($content_type);
node_add_body_field($content_type);

// Replacement rule for the messages.
$t_args = array('%name' => $content_type->name);
if ($status == SAVED_UPDATED) { // update case
 drupal_set_message($t('The content type %name has been updated.', $t_args));
} 
 elseif ($status == SAVED_NEW) { // create case
   drupal_set_message($t('The content type %name has been added.', $t_args));
   watchdog('node', 'Added content type %name.', $t_args, WATCHDOG_NOTICE, l($t('view'), 'admin/structure/types')); 
}

}

-1

我在MySpace Sync模块中做到了这一点。
我记得从各种来源将它们拼凑在一起,但是我不记得所有来源是什么。您可以浏览git存储库以查看我做了什么,但这基本上是对每种内容类型的导出,安装时带有CCK的Content Copy模块,然后删除所有节点,然后在卸载时删除内容类型。


4
而问题是标记的Drupal-7,MySpace的同步模块时才可用来回的Drupal 6.用于创建内容类型的API已经改变的Drupal 6和Drupal 7之间的很多
皮埃尔Buyle

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.