主页 > Drupal > Drupal自定义内容类型与nodeAPI的研究

Drupal自定义内容类型与nodeAPI的研究

PDF版本

自定义内容类型和CCK,是Drupal得以扩展的核心基础,几乎所有的Drupal站点,都有自己自定的内容类型(content_type),也几乎都在使用CCK来添加自定义字段。既是核心,那么一些小调整可能会对Drupal整个站点的性能都会带来很大的影响,本文主要就创建Drupal的自定义内容类型中遇到的一些问题和解决方案,做一些经验介绍。

创建自定义内容类型的方法

1. 通过Drupal内置的内容类型管理界面创建。
通过Drupal的管理页面: Administer -> Content management -> Content types,点击 “Add content type” 来创建自定义内容类型。然后是一些设置选项,填完之后点击确定就成功创建了Drupal的一个内容类型。

2. 通过Drupal的Hook,hook_node_info等一系列Hook通过代码创建自定义内容类型。
Drupal提供了创建自定义类型的hook_node_info以及其他相关的一系列hook,如hook_form、hook_perm、hook_access、hook_update、hook_insert等相关hook。其中主要的是hook_node_info和hook_form,实现这两个基本就可以。

两个方法的优劣

方法1,
优点:简单。对于一个小型站点或者博客,这种方法无疑是最简单快速的,通过界面操作也比较直观,三下五除二下就完成了内容类型的创建,然后通过CCK添加想要的字段,很容易就能创建一个完整的内容类型。
缺点:hook操作不易。这样的内容类型只能通过hook_nodeapi来对该种类型的node进行操作。其他的一些hook,如hook_form、hook_insert、hook_update、hook_delete等都不能发挥作用。还有一个性能问题,hook_nodeapi会在每个node、每种类型的node的每种操作都会被调用(即使可以在hook_nodeapi中添加内容类型的判断),这样就会造成了Drupal的性能问题

方法2,
优点:灵活。因为Drupal提供了一系列的hook,这种方法可以完全发挥hook的优势,如hook_insert、hook_delete等,因为hook_insert这样的hook只有在该类型的node被insert到数据库的时候才会调用,其他node的insert操作不会调用到这个hook。但是hook_nodeapi在任何一种node类型的任何一个操作都会被调用到。
缺点:复杂。要用代码实现一个node类型,就必须实现几个必要的hook,如hook_node_info和hook_form。加上权限设置,hook_access和hook_perm。hook_insert、hook_update和hook_delete不是必须实现的,但是在后期开发中会很有用。

注意:hook_insert会在hook_nodeapi(op=insert)之前调用。

通过以上分析我们知道,在创建一个大型Drupal站点的时候,最好使用代码方式来建,这里给出创建一个node类型的基础代码,以供大家参考使用。

注意:
1. 把{NAME}替换成对应的node类型的code名(一般也就是drupal的模块名字)。
2. 修改[Name of Content Type]和[Description of Content Type]

<?php
/**
 * Implementation of hook_node_info().
 */
function {NAME}_node_info() {
  return array(
    '{NAME}' => array(
      'name'   => '[Name of Content Type]',
      'module' => '{NAME}',
      'description' => '[Description of Content Type]',
      'has_title' => TRUE,
      'has_body'  => TRUE 
    )
  );
}
 
/**
 * Implementation of hook_form().
 */
function {NAME}_form(&$node, $form_state) {
  return node_content_form($node, $form_state); 
  //如果要特殊处理,可以把node_content_form拷贝过来,然后修改。
}
 
/**
 * Implementation of hook_perm().
 */
function {NAME}_perm() {
  $perms = array();
 
  $name = '{NAME}';
  $perms[] = 'create '. $name;
  $perms[] = 'delete own '. $name;
  $perms[] = 'delete any '. $name;
  $perms[] = 'edit own '. $name;
  $perms[] = 'edit any '. $name;
  return $perms;
}
 
/**
 * Implementation of hook_access().
 */
function {NAME}_access($op, $node, $account) {
  $name = '{NAME}';
  if ($op == 'create') {
    return user_access('create ' .$name, $account);
  }
  if ($op == 'update') {
    if (user_access('edit any ' .$name, $account) || (user_access('edit own ' .$name, $account) && ($account->uid == $node->uid))) {
      return TRUE;
    }
  }
  if ($op == 'delete') {
    if (user_access('delete any ' .$name, $account) || (user_access('delete own ' .$name, $account) && ($account->uid == $node->uid))) {
      return TRUE;
    }
  }
}

声明: 本站所有文章欢迎转载,所有文章未说明,均属于原创,转载均请注明出处。
本文有效链接: http://www.drupal001.com/2012/04/drupal-custom-content-type/
版权所有: Drupal与高性能网站架构 http://www.drupal001.com


, , , , ,

评论:1

发表评论
  1. avatar
    回复 libruce
    12/07/19

    robbin的分析很不错,很方便我们利用中文学习drupal

发表评论

电子邮件地址不会被公开。 必填项已用 * 标注


5 − = 四

您可以使用这些 HTML 标签和属性: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>

引用:0

下面所列的是引用到本博客的链接
Drupal自定义内容类型与nodeAPI的研究 来自 Drupal与高性能网站架构
顶部