模块文件结构:


  1. annotate.info
  2. annotate.module
  3. annotate.admin.inc
  4. annotate.install



1. 在drupal目录 sites/all/modules/custom 下新建文件夹annotate.(如果custom不存在,请自行建立)

2.新建文件annotate.info(模块描述文件):


name = Annotate description = "Allows users to annotate nodes." package = Pro Drupal Development core = 7.x files[] = annotate.module files[] = annotate.install files[] = annotate.admin.inc configure=admin/config/content/annotate/settings




3.新建文件annotate.module。(模块主文件):


1 <?php  2 /**  3  * @file  4  * Lets users add private annotations to nodes.  5  *  6  * Adds a text field when a node is displayed  7  * so that authenticated users may make notes.  8  */  9  10 /** 11  * Implementation of hook_menu(). 12  */ 13 function annotate_menu() 14 { 15     $items['admin/config/annotate']          = array( 16         'title' => 'Node annotation', 17         'description' => 'Adjust node annotation options.', 18         'position' => 'right', 19         'weight' => -5, 20         'page callback' => 'system_admin_menu_block_page', 21         'access arguments' => array( 22             'administer site configuration' 23         ), 24         'file' => 'system.admin.inc', 25         'file path' => drupal_get_path('module', 'system') 26     ); 27     $items['admin/config/annotate/settings'] = array( 28         'title' => 'Annotation settings', 29         'description' => 'Change how annotations behave.', 30         'page callback' => 'drupal_get_form', 31         'page arguments' => array( 32             'annotate_admin_settings' 33         ), 34         'access arguments' => array( 35             'administer site configuration' 36         ), 37         'type' => MENU_NORMAL_ITEM, 38         'file' => 'annotate.admin.inc' 39     ); 40     return $items; 41 } 42  43 /** 44  * Implements hook_node_load() 45  */ 46 function annotate_node_load($nodes, $types) 47 { 48     global $user; 49     // Check to see if the person viewing the node is the author. If not then 50     // hide the annotation. 51     foreach ($nodes as $node) { 52         if ($user->uid != $node->uid) { 53             unset($node->annotation); 54         } 55     } 56 }




4.新建文件annotate.admin.inc.(annotate.module中定义的file的文件):


1 <?php  2 /**  3  * @file  4  * Administration page callbacks for the annotate module.  5  */  6 /**  7  * Form builder. Configure annotations.  8  *  9  * @ingroup forms 10  * @see system_settings_form(). 11  */ 12 function annotate_admin_settings() 13 { 14     // Get an array of node types with internal names as keys and 15     // "friendly names" as values. E.g., 16     // array('page' => ’Basic Page, 'article' => 'Articles') 17     $types = node_type_get_types(); 18     foreach ($types as $node_type) { 19         $options[$node_type->type] = $node_type->name; 20     } 21     $form['annotate_node_types'] = array( 22         '#type' => 'checkboxes', 23         '#title' => t('Users may annotate these content types'), 24         '#options' => $options, 25         '#default_value' => variable_get('annotate_node_types', array( 26             'page' 27         )), 28         '#description' => t('A text field will be available on these content types to 29 make user-specific notes.') 30     ); 31     $form['#submit'][]           = 'annotate_admin_settings_submit'; 32     return system_settings_form($form); 33 } 34  35 /** 36  * Process annotation settings submission. 37  */ 38 function annotate_admin_settings_submit($form, $form_state) 39 { 40     dd("wangkangluo1"); 41     // Loop through each of the content type checkboxes shown on the form. 42     foreach ($form_state['values']['annotate_node_types'] as $key => $value) { 43         // If the check box for a content type is unchecked, look to see whether 44         // this content type has the annotation field attached to it using the 45         // field_info_instance function. If it does then we need to remove the 46         // annotation field as the administrator has unchecked the box. 47         if (!$value) { 48             $instance = field_info_instance('node', 'annotation', $key); 49             if (!empty($instance)) { 50                 field_delete_instance($instance); 51                 watchdog("Annotation", 'Deleted annotation field from content type: 52 %key', array( 53                     '%key' => $key 54                 )); 55             } 56         } else { 57             // If the check box for a content type is checked, look to see whether 58             // the field is associated with that content type. If not then add the 59             // annotation field to the content type. 60             $instance = field_info_instance('node', 'annotation', $key); 61             if (empty($instance)) { 62                 $instance = array( 63                     'field_name' => 'annotation', 64                     'entity_type' => 'node', 65                     'bundle' => $key, 66                     'label' => t('Annotation'), 67                     'widget_type' => 'text_textarea_with_summary', 68                     'settings' => array( 69                         'display_summary' => TRUE 70                     ), 71                     'display' => array( 72                         'default' => array( 73                             'type' => 'text_default' 74                         ), 75                         'teaser' => array( 76                             'type' => 'text_summary_or_trimmed' 77                         ) 78                     ) 79                 ); 80                 $instance = field_create_instance($instance); 81                 watchdog('Annotation', 'Added annotation field to content type: %key', array( 82                     '%key' => $key 83                 )); 84             } 85         } 86     } // End foreach loop. 87 }




5.新建文件annotate.install(数据相关文件)


1 <?php  2 /**  3  * Implements hook_install()  4  */  5 function annotate_install()  6 {  7     // Check to see if annotation field exists.  8     $field = field_info_field('annotation');  9     // if the annotation field does not exist then create it 10     if (empty($field)) { 11         $field = array( 12             'field_name' => 'annotation', 13             'type' => 'text_with_summary', 14             'entity_types' => array( 15                 'node' 16             ), 17             'translatable' => TRUE 18         ); 19         $field = field_create_field($field); 20     } 21 } 22  23 /** 24  * Implements hook_uninstall() 25  */ 26 function annotate_uninstall() 27 { 28     watchdog("Annotate Module", "Uninstalling module and deleting fields"); 29     $types = node_type_get_types(); 30     foreach ($types as $type) { 31         annotate_delete_annotation($type); 32     } 33     $field = field_info_field('annotation'); 34     if ($field) { 35         field_delete_field('annotation'); 36     } 37 } 38 function annotate_delete_annotation($type) 39 { 40     $instance = field_info_instance('node', 'annotation', $type->type); 41     if ($instance) { 42         field_delete_instance($instance); 43     } 44 } 45



  完