Drupalcon cph

3,748 views

Published on

My Drupalcon Copenhagen presentation on Drupal 7 Entities Bundles and Fields

Published in: Technology
0 Comments
11 Likes
Statistics
Notes
  • Be the first to comment

No Downloads
Views
Total views
3,748
On SlideShare
0
From Embeds
0
Number of Embeds
20
Actions
Shares
0
Downloads
133
Comments
0
Likes
11
Embeds 0
No embeds

No notes for slide



















































































  • Drupalcon cph

    1. 1. D7 Entites/Fields Cyberswat - Kevin Bridges 24. aug 10:00 Trellon Room
    2. 2. This is Code Heavy
    3. 3. This is Code Heavy • We will be discussing code
    4. 4. This is Code Heavy • We will be discussing code • If you are not a coder this will probably be incredibly boring to you
    5. 5. This is Code Heavy • We will be discussing code • If you are not a coder this will probably be incredibly boring to you • We are not responsible for what may happen to you if you fall asleep.
    6. 6. The Next Hour
    7. 7. The Next Hour • Lots of content and fast talking. Save questions until the end
    8. 8. The Next Hour • Lots of content and fast talking. Save questions until the end • Discuss key concepts in Drupal 7: Bundles, Entities and Fields
    9. 9. The Next Hour • Lots of content and fast talking. Save questions until the end • Discuss key concepts in Drupal 7: Bundles, Entities and Fields • Walk through the creation of a content type that will add a Bundle of Fields complete with custom Formatters to the node Entity
    10. 10. The Next Hour • Lots of content and fast talking. Save questions until the end • Discuss key concepts in Drupal 7: Bundles, Entities and Fields • Walk through the creation of a content type that will add a Bundle of Fields complete with custom Formatters to the node Entity • Explain WTH that last comment meant
    11. 11. The Next Hour • Lots of content and fast talking. Save questions until the end • Discuss key concepts in Drupal 7: Bundles, Entities and Fields • Walk through the creation of a content type that will add a Bundle of Fields complete with custom Formatters to the node Entity • Explain WTH that last comment meant • Introduce the most excellent node_example module
    12. 12. Key Concept Entity
    13. 13. Key Concept Entity • An Entity is a container for Bundles.
    14. 14. Key Concept Entity • An Entity is a container for Bundles. • Entities can contain multiple Bundles.
    15. 15. Key Concept Entity • An Entity is a container for Bundles. • Entities can contain multiple Bundles. • Examples are Node, User, File, Taxonomy Term, Taxonomy Vocabulary
    16. 16. Key Concept Entity • An Entity is a container for Bundles. • Entities can contain multiple Bundles. • Examples are Node, User, File, Taxonomy Term, Taxonomy Vocabulary • Why not make everything an Entity?
    17. 17. Key Concept Bundles
    18. 18. Key Concept Bundles • A Bundle is a set of fields that are treated as a group by the Field API
    19. 19. Key Concept Bundles • A Bundle is a set of fields that are treated as a group by the Field API • Bundles are similar in concept to a node type in Drupal 6
    20. 20. Key Concept Fields
    21. 21. Key Concept Fields • A field defines a particular type of data that can be attached to any entity and can be shared between entities
    22. 22. Key Concept Fields • A field defines a particular type of data that can be attached to any entity and can be shared between entities • A field can have Widgets. A widget is the UI element that allows a user to enter data into the field
    23. 23. Key Concept Fields • A field defines a particular type of data that can be attached to any entity and can be shared between entities • A field can have Widgets. A widget is the UI element that allows a user to enter data into the field • A field can have Formatters. A formatter defines how a fields data gets displayed in a view mode
    24. 24. The Examples Module
    25. 25. The Examples Module • In my mind, the best resource for learning is the Examples Modue
    26. 26. The Examples Module • In my mind, the best resource for learning is the Examples Modue • This module used to live exclusively in CVS but is now maintained by rfay, Dave Reid, katbailey and ilo in contrib
    27. 27. The Examples Module • In my mind, the best resource for learning is the Examples Modue • This module used to live exclusively in CVS but is now maintained by rfay, Dave Reid, katbailey and ilo in contrib • Documentation can be viewed from api.drupal.org by following the Examples link
    28. 28. The Examples Module • In my mind, the best resource for learning is the Examples Modue • This module used to live exclusively in CVS but is now maintained by rfay, Dave Reid, katbailey and ilo in contrib • Documentation can be viewed from api.drupal.org by following the Examples link • drupal.org/project/examples - not just the node module
    29. 29. Examples Needs Help
    30. 30. Examples Needs Help
    31. 31. D7 *.install
    32. 32. D7 *.install • We still implement hook_install() and hook_uninstall()
    33. 33. D7 *.install • We still implement hook_install() and hook_uninstall() • hook_schema() no longer needs to be explicitly called
    34. 34. D7 *.install • We still implement hook_install() and hook_uninstall() • hook_schema() no longer needs to be explicitly called • Database structure will resemble D6 CCK tables
    35. 35. D7 *.install • We still implement hook_install() and hook_uninstall() • hook_schema() no longer needs to be explicitly called • Database structure will resemble D6 CCK tables • Database Entity revisions are provided automatically
    36. 36. /** * Implements hook_install(). * */ function node_example_install() { ... }
    37. 37. /** * Implements hook_install(). * */ function node_example_install() { ... } /** * Return a structured array defining the fields created by this content type. * * This is packaged in a function so it can be used in both hook_install() * and hook_uninstall(). */ function _node_example_installed_fields() { ... }
    38. 38. /** * Implements hook_install(). * */ function node_example_install() { ... } /** * Return a structured array defining the fields created by this content type. * * This is packaged in a function so it can be used in both hook_install() * and hook_uninstall(). */ function _node_example_installed_fields() { ... } /** * Return a structured array defining the instances for this content type. * * The instance lets Drupal know which widget to use to allow the user to enter * data and how to react in different view modes. * This is provided as a function so that it can be used in both hook_install() * and hook_uninstall(). */ function _node_example_installed_instances() { ... }
    39. 39. /** * Implements hook_install(). * */ function node_example_install() { ... } /** * Return a structured array defining the fields created by this content type. * * This is packaged in a function so it can be used in both hook_install() * and hook_uninstall(). */ function _node_example_installed_fields() { ... } /** * Return a structured array defining the instances for this content type. * * The instance lets Drupal know which widget to use to allow the user to enter * data and how to react in different view modes. * This is provided as a function so that it can be used in both hook_install() * and hook_uninstall(). */ function _node_example_installed_instances() { ... } /** * Implements hook_uninstall(). * */ function node_example_uninstall() { ... }
    40. 40. D7 *.install
    41. 41. D7 *.install • hook_install() will set up our content type
    42. 42. D7 *.install • hook_install() will set up our content type • hook_install() is where we create our fields, if needed
    43. 43. D7 *.install • hook_install() will set up our content type • hook_install() is where we create our fields, if needed • hook_install() is used to tie our fields to an Entity as a Bundle
    44. 44. function node_example_install() { }
    45. 45. function node_example_install() { $types = node_type_get_types(); node_add_body_field($types['node_example']); }
    46. 46. function node_example_install() { $types = node_type_get_types(); node_add_body_field($types['node_example']); // Load the instance definition for our content type's body // http://api.drupal.org/api/function/field_info_instance/7 $body_instance = field_info_instance('node', 'body', 'node_example'); }
    47. 47. function node_example_install() { $types = node_type_get_types(); node_add_body_field($types['node_example']); // Load the instance definition for our content type's body // http://api.drupal.org/api/function/field_info_instance/7 $body_instance = field_info_instance('node', 'body', 'node_example'); // Add our example_node_list view mode to the body instance display by // instructing the body to display as a summary $body_instance['type'] = 'text_summary_or_trimmed'; }
    48. 48. function node_example_install() { $types = node_type_get_types(); node_add_body_field($types['node_example']); // Load the instance definition for our content type's body // http://api.drupal.org/api/function/field_info_instance/7 $body_instance = field_info_instance('node', 'body', 'node_example'); // Add our example_node_list view mode to the body instance display by // instructing the body to display as a summary $body_instance['type'] = 'text_summary_or_trimmed'; // Save our changes to the body field instance. // http://api.drupal.org/api/function/field_update_instance/7 field_update_instance($body_instance); }
    49. 49. function node_example_install() { $types = node_type_get_types(); node_add_body_field($types['node_example']); // Load the instance definition for our content type's body // http://api.drupal.org/api/function/field_info_instance/7 $body_instance = field_info_instance('node', 'body', 'node_example'); // Add our example_node_list view mode to the body instance display by // instructing the body to display as a summary $body_instance['type'] = 'text_summary_or_trimmed'; // Save our changes to the body field instance. // http://api.drupal.org/api/function/field_update_instance/7 field_update_instance($body_instance); // Create all the fields we are adding to our content type. // http://api.drupal.org/api/function/field_create_field/7 foreach (_node_example_installed_fields() as $field) { field_create_field($field); } }
    50. 50. function node_example_install() { $types = node_type_get_types(); node_add_body_field($types['node_example']); // Load the instance definition for our content type's body // http://api.drupal.org/api/function/field_info_instance/7 $body_instance = field_info_instance('node', 'body', 'node_example'); // Add our example_node_list view mode to the body instance display by // instructing the body to display as a summary $body_instance['type'] = 'text_summary_or_trimmed'; // Save our changes to the body field instance. // http://api.drupal.org/api/function/field_update_instance/7 field_update_instance($body_instance); // Create all the fields we are adding to our content type. // http://api.drupal.org/api/function/field_create_field/7 foreach (_node_example_installed_fields() as $field) { field_create_field($field); } // Create all the instances for our fields. // http://api.drupal.org/api/function/field_create_instance/7 foreach (_node_example_installed_instances() as $instance) { $instance['entity_type'] = 'node'; $instance['bundle'] = 'node_example'; field_create_instance($instance); } }
    51. 51. D7 *.install
    52. 52. D7 *.install • The node_example module defines and invokes 3 distinct fields
    53. 53. D7 *.install • The node_example module defines and invokes 3 distinct fields • We place these in a helper function so that it can be called as needed in functions like hook_install() and hook_uninstall()
    54. 54. function _node_example_installed_fields() { $t = get_t(); return array( ); }
    55. 55. function _node_example_installed_fields() { $t = get_t(); return array( 'node_example_color' => array( 'field_name' => 'node_example_color', 'label' => $t('The colors available for this object.'), 'cardinality' => 3, 'type' => 'text', 'settings' => array( 'max_length' => 60, ), ), ); }
    56. 56. function _node_example_installed_fields() { $t = get_t(); return array( 'node_example_color' => array( 'field_name' => 'node_example_color', 'label' => $t('The colors available for this object.'), 'cardinality' => 3, 'type' => 'text', 'settings' => array( 'max_length' => 60, ), ), 'node_example_quantity' => array( 'field_name' => 'node_example_quantity', 'type' => 'text', ), ); }
    57. 57. function _node_example_installed_fields() { $t = get_t(); return array( 'node_example_color' => array( 'field_name' => 'node_example_color', 'label' => $t('The colors available for this object.'), 'cardinality' => 3, 'type' => 'text', 'settings' => array( 'max_length' => 60, ), ), 'node_example_quantity' => array( 'field_name' => 'node_example_quantity', 'type' => 'text', ), 'node_example_image' => array( 'field_name' => 'node_example_image', 'type' => 'image', 'cardinality' => 1, ), ); }
    58. 58. D7 *.install • This is the fun part ... we get to apply formatters to the instances to control their display and widgets to control the input
    59. 59. $t = get_t(); return array( );
    60. 60. $t = get_t(); return array( 'node_example_color' => array( 'field_name' => 'node_example_color', 'label' => $t('The colors available for this object.'), 'cardinality' => 3, 'widget' => array( 'type' => 'text_textfield', ), 'display' => array( 'example_node_list' => array( 'label' => 'hidden', 'type' => 'node_example_colors', ), ), ), );
    61. 61. $t = get_t(); return array( 'node_example_color' => array( 'field_name' => 'node_example_color', 'label' => $t('The colors available for this object.'), 'cardinality' => 3, 'widget' => array( 'type' => 'text_textfield', ), 'display' => array( 'example_node_list' => array( 'label' => 'hidden', 'type' => 'node_example_colors', ), ), ), 'node_example_quantity' => array( 'field_name' => 'node_example_quantity', 'type' => 'text', 'widget' => array( 'type' => 'text_textfield', ), 'display' => array( 'example_node_list' => array( 'label' => 'hidden', 'type' => 'hidden', ), ), ), );
    62. 62. $t = get_t(); return array( 'node_example_color' => array( 'field_name' => 'node_example_color', 'label' => $t('The colors available for this object.'), 'cardinality' => 3, 'widget' => array( 'type' => 'text_textfield', ), 'display' => array( 'example_node_list' => array( 'label' => 'hidden', 'type' => 'node_example_colors', ), ), ), 'node_example_quantity' => array( 'field_name' => 'node_example_quantity', 'type' => 'text', 'widget' => array( 'type' => 'text_textfield', ), 'display' => array( 'example_node_list' => array( 'label' => 'hidden', 'type' => 'hidden', ), ), ), 'node_example_image' => array( 'field_name' => 'node_example_image', 'label' => $t('Upload an image:'), 'required' => FALSE, 'widget' => array( 'type' => 'image_image', 'weight' => 2.10, ), 'display' => array( 'example_node_list' => array( 'label' => 'hidden', 'type' => 'image_link_content__thumbnail', ), ), ), );
    63. 63. D7 *.install
    64. 64. D7 *.install • hook_uninstall() is used to clean up the data created with the node_example module
    65. 65. D7 *.install • hook_uninstall() is used to clean up the data created with the node_example module • hook_uninstall() deletes our fields and their instances
    66. 66. D7 *.install • hook_uninstall() is used to clean up the data created with the node_example module • hook_uninstall() deletes our fields and their instances • hook_uninstall() deletes our content type
    67. 67. D7 *.install • hook_uninstall() is used to clean up the data created with the node_example module • hook_uninstall() deletes our fields and their instances • hook_uninstall() deletes our content type • hook_uninstall purges field data from the system
    68. 68. function node_example_uninstall() { }
    69. 69. function node_example_uninstall() { // Gather all the example content that might have been created while this // module was enabled. Simple selects still use db_query(). // http://api.drupal.org/api/function/db_query/7 $sql = 'SELECT nid FROM {node} n WHERE n.type = :type'; $result = db_query($sql, array(':type' => 'node_example')); $nids = array(); foreach ($result as $row) { $nids[] = $row->nid; } }
    70. 70. function node_example_uninstall() { // Gather all the example content that might have been created while this // module was enabled. Simple selects still use db_query(). // http://api.drupal.org/api/function/db_query/7 $sql = 'SELECT nid FROM {node} n WHERE n.type = :type'; $result = db_query($sql, array(':type' => 'node_example')); $nids = array(); foreach ($result as $row) { $nids[] = $row->nid; } // Delete all the nodes at once // http://api.drupal.org/api/function/node_delete_multiple/7 node_delete_multiple($nids); }
    71. 71. function node_example_uninstall() { // Gather all the example content that might have been created while this // module was enabled. Simple selects still use db_query(). // http://api.drupal.org/api/function/db_query/7 $sql = 'SELECT nid FROM {node} n WHERE n.type = :type'; $result = db_query($sql, array(':type' => 'node_example')); $nids = array(); foreach ($result as $row) { $nids[] = $row->nid; } // Delete all the nodes at once // http://api.drupal.org/api/function/node_delete_multiple/7 node_delete_multiple($nids); // Loop over each of the fields defined by this module and delete // all instances of the field, their data, and the field itself. // http://api.drupal.org/api/function/field_delete_field/7 foreach (array_keys(_node_example_installed_fields()) as $field) { field_delete_field($field); } }
    72. 72. function node_example_uninstall() { // Gather all the example content that might have been created while this // module was enabled. Simple selects still use db_query(). // http://api.drupal.org/api/function/db_query/7 $sql = 'SELECT nid FROM {node} n WHERE n.type = :type'; $result = db_query($sql, array(':type' => 'node_example')); $nids = array(); foreach ($result as $row) { $nids[] = $row->nid; } // Delete all the nodes at once // http://api.drupal.org/api/function/node_delete_multiple/7 node_delete_multiple($nids); // Loop over each of the fields defined by this module and delete // all instances of the field, their data, and the field itself. // http://api.drupal.org/api/function/field_delete_field/7 foreach (array_keys(_node_example_installed_fields()) as $field) { field_delete_field($field); } // Loop over any remaining field instances attached to the node_example // content type (such as the body field) and delete them individually. // http://api.drupal.org/api/function/field_delete_field/7 $instances = field_info_instances('node', 'node_example'); foreach ($instances as $instance_name => $instance) { field_delete_instance($instance); } }
    73. 73. function node_example_uninstall() { // Gather all the example content that might have been created while this // module was enabled. Simple selects still use db_query(). // http://api.drupal.org/api/function/db_query/7 $sql = 'SELECT nid FROM {node} n WHERE n.type = :type'; $result = db_query($sql, array(':type' => 'node_example')); $nids = array(); foreach ($result as $row) { $nids[] = $row->nid; } // Delete all the nodes at once // http://api.drupal.org/api/function/node_delete_multiple/7 node_delete_multiple($nids); // Loop over each of the fields defined by this module and delete // all instances of the field, their data, and the field itself. // http://api.drupal.org/api/function/field_delete_field/7 foreach (array_keys(_node_example_installed_fields()) as $field) { field_delete_field($field); } // Loop over any remaining field instances attached to the node_example // content type (such as the body field) and delete them individually. // http://api.drupal.org/api/function/field_delete_field/7 $instances = field_info_instances('node', 'node_example'); foreach ($instances as $instance_name => $instance) { field_delete_instance($instance); } // Delete our content type // http://api.drupal.org/api/function/node_type_delete/7 node_type_delete('node_example'); }
    74. 74. function node_example_uninstall() { // Gather all the example content that might have been created while this // module was enabled. Simple selects still use db_query(). // http://api.drupal.org/api/function/db_query/7 $sql = 'SELECT nid FROM {node} n WHERE n.type = :type'; $result = db_query($sql, array(':type' => 'node_example')); $nids = array(); foreach ($result as $row) { $nids[] = $row->nid; } // Delete all the nodes at once // http://api.drupal.org/api/function/node_delete_multiple/7 node_delete_multiple($nids); // Loop over each of the fields defined by this module and delete // all instances of the field, their data, and the field itself. // http://api.drupal.org/api/function/field_delete_field/7 foreach (array_keys(_node_example_installed_fields()) as $field) { field_delete_field($field); } // Loop over any remaining field instances attached to the node_example // content type (such as the body field) and delete them individually. // http://api.drupal.org/api/function/field_delete_field/7 $instances = field_info_instances('node', 'node_example'); foreach ($instances as $instance_name => $instance) { field_delete_instance($instance); } // Delete our content type // http://api.drupal.org/api/function/node_type_delete/7 node_type_delete('node_example'); // Purge all field information // http://api.drupal.org/api/function/field_purge_batch/7 field_purge_batch(1000); }
    75. 75. D7 *.module
    76. 76. D7 *.module • Finally on to the module file!
    77. 77. D7 *.module • Finally on to the module file! • Let’s start with the hooks we will recognize from D6
    78. 78. D7 *.module • Finally on to the module file! • Let’s start with the hooks we will recognize from D6 • hook_node_info() informs Drupal about our content type
    79. 79. D7 *.module • Finally on to the module file! • Let’s start with the hooks we will recognize from D6 • hook_node_info() informs Drupal about our content type • hook_menu() tells Drupal where our custom page is going to live and how to build it
    80. 80. D7 *.module • Finally on to the module file! • Let’s start with the hooks we will recognize from D6 • hook_node_info() informs Drupal about our content type • hook_menu() tells Drupal where our custom page is going to live and how to build it • hook_help() provides help information for our users
    81. 81. /** * Implements hook_node_info() to provide our node_example type. */ function node_example_node_info() { return array( 'node_example' => array( 'name' => t('Example Node'), 'base' => 'node_example', 'description' => t('This is an example node type with a few fields.'), 'has_title' => TRUE, ), ); }
    82. 82. /** * Implements hook_node_info() to provide our node_example type. */ function node_example_node_info() { return array( 'node_example' => array( 'name' => t('Example Node'), 'base' => 'node_example', 'description' => t('This is an example node type with a few fields.'), 'has_title' => TRUE, ), ); } /** * Implements hook_menu(). * * We are providing a default page to illustrate the use of our custom node view * mode that will live at http://example.com/?q=examples/node_example */ function node_example_menu() { $items['examples/node_example'] = array( 'page callback' => 'node_example_page', 'access arguments' => array('access content'), 'title' => 'Node Example', ); return $items; }
    83. 83. /** * Implements hook_node_info() to provide our node_example type. */ function node_example_node_info() { return array( 'node_example' => array( 'name' => t('Example Node'), 'base' => 'node_example', 'description' => t('This is an example node type with a few fields.'), 'has_title' => TRUE, ), ); } /** * Implements hook_menu(). * * We are providing a default page to illustrate the use of our custom node view * mode that will live at http://example.com/?q=examples/node_example */ function node_example_menu() { $items['examples/node_example'] = array( 'page callback' => 'node_example_page', 'access arguments' => array('access content'), 'title' => 'Node Example', ); return $items; } /** * Implements hook_help(). */ function node_example_help($path, $arg) { switch ($path) { case 'examples/node_example': return "<p>" . t( "The Node Example module provides a custom node type. You can create new nodes using the <a href='!nodeadd'>node add form</a>. Nodes that you create will be displayed here.", array('!nodeadd' => url('node/add/node-example')) ) . "</p>"; } }
    84. 84. d7 *.module
    85. 85. d7 *.module • hook_form() is used to create the basic content form
    86. 86. d7 *.module • hook_form() is used to create the basic content form • hook_theme() informs Drupal of our theme callbacks
    87. 87. /** * Implement hook_form() with the standard default form. */ function node_example_form($node, $form_state) { return node_content_form($node, $form_state); }
    88. 88. /** * Implement hook_form() with the standard default form. */ function node_example_form($node, $form_state) { return node_content_form($node, $form_state); } /** * Implements hook_theme(). * * This lets us tell Drupal about our theme functions and their arguments. */ function node_example_theme($existing, $type, $theme, $path) { return array( 'example_node_color' => array( 'variables' => array('color' => NULL), ), ); }
    89. 89. /** * Implement hook_form() with the standard default form. */ function node_example_form($node, $form_state) { return node_content_form($node, $form_state); } /** * Implements hook_theme(). * * This lets us tell Drupal about our theme functions and their arguments. */ function node_example_theme($existing, $type, $theme, $path) { return array( 'example_node_color' => array( 'variables' => array('color' => NULL), ), ); } /** * A custom theme function. * * By using this function to format our node-specific information, themes * can override this presentation if they wish. This is a simplified theme * function purely for illustrative purposes. */ function theme_example_node_color($variables) { $output = '<span style="background-color: #ccc; padding: 1em; margin-bottom: 1em; float: left; color: ' . $variables['color'] . '">' . $variables['color'] . '</span>'; return $output; }
    90. 90. D7 *.module
    91. 91. D7 *.module • Now for the juicy D7 changes!!!
    92. 92. D7 *.module • Now for the juicy D7 changes!!! • hook_entity_info_alter() lets us modify the node_entity to use our custom view mode
    93. 93. D7 *.module • Now for the juicy D7 changes!!! • hook_entity_info_alter() lets us modify the node_entity to use our custom view mode • hook_field_formatter_view() is where we place the details of our custom view mode
    94. 94. /** * Implements hook_entity_info_alter(). * * We need to modify the default node entity info by adding a new view mode to * be used in functions like node_view() or node_build_content(). * */ function node_example_entity_info_alter(&$entity_info) { $entity_info['node']['view modes']['example_node_list'] = array( 'label' => t('Example Node List'), 'custom settings' => TRUE, ); }
    95. 95. /** * Implements hook_entity_info_alter(). * * We need to modify the default node entity info by adding a new view mode to * be used in functions like node_view() or node_build_content(). * */ function node_example_entity_info_alter(&$entity_info) { $entity_info['node']['view modes']['example_node_list'] = array( 'label' => t('Example Node List'), 'custom settings' => TRUE, ); } /** * Implements hook_field_formatter_info(). */ function node_example_field_formatter_info() { return array( 'node_example_colors' => array( 'label' => t('Node Example Color Handle'), 'field types' => array('text'), ), ); }
    96. 96. D7 *.module
    97. 97. D7 *.module • Last ... but certainly not least
    98. 98. D7 *.module • Last ... but certainly not least • hook_field_formatter_view() is where we place the details of our custom view mode
    99. 99. /** * Implements hook_field_formatter_view(). * * @todo: We need to provide a formatter for the colors that a user is allowed to enter * during node creation. */ function node_example_field_formatter_view($object_type, $object, $field, $instance, $langcode, $items, $display) { $element = array(); switch ($display['type']) { case 'node_example_colors': foreach ($items as $delta => $item) { $element[$delta]['#type'] = 'markup'; $color = $item['safe_value']; $element[$delta]['#markup'] = theme('example_node_color', array('color' => $color)); } break; } return $element; }
    100. 100. Informative Links • The field API Tutorial - http://drupal.org/node/707832 • The Field API Glossary - http://drupal.org/node/443540 • Adding and Reusing a Field - http://drupal.org/node/ 474420 • Making an Entity Fieldable - http://drupal.org/node/ 474582 • The Examples Module - http://drupal.org/project/ examples • Drupal API - http://api.drupal.org/ • Joachim’s http://drupal.org/project/field_convert
    101. 101. http://cph2010.drupal.org/node/13323

    ×