Browse Source

Added new TripalField class to help ensure consistency in field creation

Stephen Ficklin 9 years ago
parent
commit
7446ecb640

+ 209 - 0
tripal/includes/TripalField.inc

@@ -0,0 +1,209 @@
+<?php
+
+
+/**
+ * A base class for all Fields supported by the Tripal Chado module.
+ *
+ */
+class TripalField {
+  /**
+   * Provides information about this field.
+   *
+   * @return array
+   *   An associative array with key/value pairs compatible with those from
+   *   the hook_field_info() function of the Drupal Field API.
+   */
+  public function field_info() {
+    return array(
+    );
+  }
+  /**
+   * Provides information about the widget for this field.
+   *
+   * @return array
+   *   An associative array with key/value paris compatible with those from the
+   *   hook_field_widget_info() function of the Drupal Field API.
+   */
+  public function widget_info() {
+    return array(
+    );
+  }
+  /**
+   * Provides information about the formatter for this field.
+   *
+   * @return
+   *   An associative array with key/value paris compatible with those from the
+   *   hook_field_formatter_info() function of the Drupal Field API.
+   *
+   */
+  public function formatter_info() {
+    return array(
+    );
+  }
+  /**
+   * Provides a summary of the formatter settings.
+   *
+   * On the 'Manage Display' page of the content type administration page,
+   * fields are allowed to provide a settings form.  This settings form can
+   * be used to allow the site admin to define how the field should be
+   * formatted.  The settings are then available for the formatter()
+   * function of this class.  This function provides a text-based description
+   * of the settings for the site developer to see.  It appears on the manage
+   * display page inline with the field.  A field must always return a
+   * value in this function if the settings form gear button is to appear.
+   *
+   * See the hook_field_formatter_settings_summary() function for more
+   * information.
+   *
+   * @param $field
+   * @param $instance
+   * @param $view_mode
+   *
+   * @return string
+   *   A string that provides a very brief summary of the field settings
+   *   to the user.
+   *
+   */
+  public function formatter_settings_summary($field, $instance, $view_mode) {
+
+  }
+
+  /**
+   * Provides the field's setting form.
+   *
+   * The settings form appears on the 'Manage Display' page of the content
+   * type administration page. This function provides the form that will
+   * appear on that page.
+   *
+   * To add a validate function, please create a static function in the
+   * implementing class, and indicate that this function should be used
+   * in the form array that is returned by this function.
+   *
+   * This form will not be displayed if the formatter_settings_summary()
+   * function does not return anything.
+   *
+   * @param $field
+   * @param $instance
+   * @param $view_mode
+   * @param $form
+   * @param $form_state
+   *
+   * @return
+   *   A Drupal Form array containing the settings form for this field.
+   */
+  public function formatter_settings_form($field, $instance,
+      $view_mode, $form, &$form_state) {
+
+  }
+
+  /**
+   *  Provides the display for a field
+   *
+   *  This function provides the display for a field when it is viewed on
+   *  the web page.
+   *
+   *  @param $element
+   *  @param $entity_type
+   *  @param $entity
+   *  @param $field
+   *  @param $instance
+   *  @param $langcode
+   *  @param $items
+   *  @param $display
+   *
+   *  @return
+   *    An element array compatible with that returned by the
+   *    hook_field_formatter_view() function.
+   */
+  public function formatter_view(&$element, $entity_type, $entity,
+      $field, $instance, $langcode, $items, $display) {
+  }
+
+  /**
+   * Provides the form for editing of this field.
+   *
+   * This form is diplayed when the user creates a new entity or edits an
+   * existing entity.  If the field is attached to the entity then the form
+   * provided by this function will be displayed.
+   *
+   * @param $widget
+   * @param $form
+   * @param $form_state
+   * @param $field
+   * @param $instance
+   * @param $langcode
+   * @param $items
+   * @param $delta
+   * @param $element
+   *
+   * @return
+   *   A Drupal form. See the hook_field_widget_form() function for more information.
+   */
+  public function widget_form(&$widget, $form, $form_state, $field, $instance,
+      $langcode, $items, $delta, $element) {
+
+  }
+  /**
+   * Loads the field values from the underlying data store.
+   *
+   * This function is called by the tripal_chado_field_storage_load() for
+   * each property managed by the field_chado_storage storage type.  This is
+   * an optional hook function that is only needed if the field has
+   * multiple form elements.
+   *
+   * This function must set the value for the field in the entity object. For
+   * example:
+   *
+   * @code
+   *   $field_name = $field['field_name'];
+   *   $field_type = $field['type'];
+   *   $language = 'und';
+   *   $delta = 0;
+   *   $entity->{$field_name}[$language][$delta]['value'] = TRUE;
+   * @endcode
+   *
+   * The field in the entity is an associative array where the first level is
+   * the field name, followed by the language.  The 'und' value indicates
+   * that the language is undefined and is the default.  Next is the 'delta'
+   * value. For field with a cardinality of 1, the delta value will always be
+   * 0.  For fields with a cardinality greater than 1 then the delta should
+   * increment for each value.  Next is a list of key/value pairs one of which
+   * should have the name 'value'.  The 'value' key should always contain the
+   * primary value that should be displayed to the user.  It can be a single
+   * value, or an array.  Any other number of keys can be present to help
+   * with the display. These keys also correspond to the names of the form
+   * fields specified by the widget() function of this class.
+   *
+   * @param $field
+   * @param $entity
+   * @param $base_table
+   * @param $record
+   *
+   */
+  public function load($field, &$entity) {
+
+  }
+
+  /**
+   * Formats the field for dipslay via web services.
+   *
+   * The tripal_ws module will look for this funcion to give the field the
+   * opportunity fo customize the value or array that is present in the
+   * JSON output of web services.
+   *
+   * @return
+   *   A single value or an array of values that should be used for this field.
+   */
+  public function ws_formatter(&$element, $entity_type, $entity,
+      $field, $instance, $items) {
+
+  }
+
+  /**
+   * Provides an array that allows Tripal to attach a field to an entity.
+   *
+   */
+  public function attach_info($entity_type, $bundle, $settings) {
+
+  }
+}

+ 1 - 0
tripal/tripal.module

@@ -20,6 +20,7 @@ require_once "includes/TripalEntityViewsController.inc";
 require_once "includes/TripalBundle.inc";
 require_once "includes/TripalBundleController.inc";
 require_once "includes/TripalBundleUIController.inc";
+require_once "includes/TripalField.inc";
 
 
 /**

+ 230 - 264
tripal_chado/includes/fields/chado_base__organism_id.inc

@@ -1,285 +1,264 @@
 <?php
-/**
- * Implements hook_info() for fields.
- *
- * This is a hook provided by the tripal_chado module for offloading the
- * hook_field_info() hook for each field to specify.
- */
-function chado_base__organism_id_info() {
-  return array(
-    'label' => t('Organism'),
-    'description' => t('A field for specifying an organism.'),
-    'default_widget' => 'chado_base__organism_id_widget',
-    'default_formatter' => 'chado_base__organism_id_formatter',
-    'settings' => array(),
-    'storage' => array(
-      'type' => 'field_chado_storage',
-      'module' => 'tripal_chado',
-      'active' => TRUE
-    ),
-  );
-}
-/**
- * Implements hook_attach_info().
- *
- * This is a hook provided by the tripal_Chado module. It allows the field
- * to specify which bundles it will attach to and to specify thee settings.
- *
- * @param $entity_type
- * @param $entity
- * @param $term
- *
- * @return
- *   A field array
- */
-function chado_base__organism_id_attach_info($entity_type, $bundle, $target) {
 
-  $field_info = array();
+class chado_base__organism_id extends TripalField {
+
+  /**
+   * @see TripalField::info()
+   */
+  public function field_info() {
+    return array(
+      'label' => t('Organism'),
+      'description' => t('A field for specifying an organism.'),
+      'default_widget' => 'chado_base__organism_id_widget',
+      'default_formatter' => 'chado_base__organism_id_formatter',
+      'settings' => array(),
+      'storage' => array(
+        'type' => 'field_chado_storage',
+        'module' => 'tripal_chado',
+        'active' => TRUE
+      ),
+    );
+  }
+  /**
+   * @see TripalField::attach_info()
+   */
+  public function attach_info($entity_type, $bundle, $settings) {
+
+    $field_info = array();
+
+    $table_name = $settings['data_table'];
+    $type_table = $settings['type_table'];
+    $type_field = $settings['field'];
+    $cv_id      = $settings['cv_id'];
+    $cvterm_id  = $settings['cvterm_id'];
+
+    // Check the schema for the data table if it does not have
+    // an 'organism_id' column then we don't want to attach this field.
+    $schema = chado_get_schema($table_name);
+    if (!array_key_exists('organism_id', $schema['fields'])) {
+      return $field_info;
+    }
 
-  $table_name = $target['data_table'];
-  $type_table = $target['type_table'];
-  $type_field = $target['field'];
-  $cv_id      = $target['cv_id'];
-  $cvterm_id  = $target['cvterm_id'];
+    // There is an organism_id column so attach the field!
+    $field_info = array(
+      'field_name' => $table_name . '__organism_id',
+      'field_type' => 'chado_base__organism_id',
+      'widget_type' => 'chado_base__organism_id_widget',
+      'description' => 'Select an organism.',
+      'label' => 'Oraganism',
+      'is_required' => 0,
+      'storage' => 'field_chado_storage',
+      'widget_settings' => array(
+        'display_label' => 1
+      ),
+      'field_settings' => array(
+        'chado_table' => $table_name,
+        'chado_column' => 'organism_id',
+        'semantic_web' => array(
+          'type' => 'organism',
+          'ns' => 'local',
+          'nsurl' => '',
+        ),
+      ),
+    );
 
-  // Check the schema for the data table if it does not have
-  // an 'organism_id' column then we don't want to attach this field.
-  $schema = chado_get_schema($table_name);
-  if (!array_key_exists('organism_id', $schema['fields'])) {
     return $field_info;
   }
 
-  // There is an organism_id column so attach the field!
-  $field_info = array(
-    'field_name' => $table_name . '__organism_id',
-    'field_type' => 'chado_base__organism_id',
-    'widget_type' => 'chado_base__organism_id_widget',
-    'description' => 'Select an organism.',
-    'label' => 'Oraganism',
-    'is_required' => 0,
-    'storage' => 'field_chado_storage',
-    'widget_settings' => array(
-      'display_label' => 1
-    ),
-    'field_settings' => array(
-      'chado_table' => $table_name,
-      'chado_column' => 'organism_id',
-      'semantic_web' => array(
-        'type' => 'organism',
-        'ns' => 'local',
-        'nsurl' => '',
+  /**
+   * @see TripalField::widget_info()
+   */
+  public function widget_info() {
+    return array(
+      'label' => t('Organism Select'),
+      'field types' => array('chado_base__organism_id')
+    );
+  }
+  /**
+   * @see TripalField::formatter_info()
+   */
+  public function formatter_info() {
+    return array(
+      'label' => t('Organism'),
+      'field types' => array('chado_base__organism_id'),
+      'settings' => array(
+        'field_display_teaser' => 0,
+        'field_display_string' => '<i>[organism__genus] [organism__species]</i>',
       ),
-    ),
-  );
+    );
+  }
+  /**
+   * @see TripalField::formatter_settings_summary()
+   */
+  public function formatter_settings_summary($field, $instance, $view_mode) {
+    $display = $instance['display'][$view_mode];
+    $settings = $display['settings'];
+    $summary = 'Settings summary: ';
+    if (array_key_exists('field_display_teaser', $settings) and
+        $settings['field_display_teaser'] == 1) {
+          $summary .= 'displays the organism teaser if published.';
+        }
+        else if (array_key_exists('field_display_string', $settings)) {
+          $summary .= 'uses the token string "' . $settings['field_display_string'] . '"';
+        }
+        else {
+          $summary .= "uses display defaults.";
+        }
+
+        return $summary;
+  }
 
-  return $field_info;
-}
-/**
- * Implements hook_widget_info.
- *
- * This is a hook provided by the tripal_chado module for offloading
- * the hook_field_widget_info() hook for each field to specify.
- */
-function chado_base__organism_id_widget_info() {
-  return array(
-    'label' => t('Organism Select'),
-    'field types' => array('chado_base__organism_id')
-  );
-}
-/**
- * Implements hook_formatter_info.
- *
- * This is a hook provided by the tripal_chado module for
- * offloading the hook_field_formatter_info() for each field
- * to specify.
- *
- */
-function chado_base__organism_id_formatter_info() {
-  return array(
-    'label' => t('Organism'),
-    'field types' => array('chado_base__organism_id'),
-    'settings' => array(
-      'field_display_teaser' => 0,
-      'field_display_string' => '<i>[organism__genus] [organism__species]</i>',
-    ),
-  );
-}
-/**
- * Implements hook_formatter_settings_summary.
- *
- * This is a hook provided by the tripal_chado module for
- * offloading the hook_field_formatter_settings_summary() for each field
- * to specify.
- *
- */
-function chado_base__organism_id_formatter_settings_summary($field, $instance, $view_mode) {
-  $display = $instance['display'][$view_mode];
-  $settings = $display['settings'];
-  $summary = 'Settings summary: ';
-  if (array_key_exists('field_display_teaser', $settings) and
-      $settings['field_display_teaser'] == 1) {
-        $summary .= 'displays the organism teaser if published.';
-      }
-      else if (array_key_exists('field_display_string', $settings)) {
-        $summary .= 'uses the token string "' . $settings['field_display_string'] . '"';
-      }
-      else {
-        $summary .= "uses display defaults.";
-      }
+  /**
+   * @see TripalField::formatter_settings_form()
+   */
+  public function formatter_settings_form($field, $instance,
+      $view_mode, $form, &$form_state) {
 
-      return $summary;
-}
+    $display = $instance['display'][$view_mode];
+    $settings = $display['settings'];
 
-/**
- * Provides a settings form for the formatter.
- *
- * This is a hook provided by the tripal_chado module for
- * offloading the hook_field_formatter_settings_form() for each field
- * to specify.
- */
-function chado_base__organism_id_formatter_settings_form($field, $instance,
-    $view_mode, $form, &$form_state) {
 
-  $display = $instance['display'][$view_mode];
-  $settings = $display['settings'];
+    $element = array();
+    $term = NULL;
+    $entity = NULL;
 
+    // Check to see if the organism bundle exists
+    $term = tripal_load_term_entity(array(
+      'namespace' => $field['settings']['semantic_web']['ns'],
+      'accession' => $field['settings']['semantic_web']['type']
+    ));
+    if ($term) {
+      $entity = tripal_load_bundle_entity(array('term_id' => $term->id));
+    }
 
-  $element = array();
-  $term = NULL;
-  $entity = NULL;
+    $element['instructions'] = array(
+      '#type' => 'item',
+      '#markup' => 'Please provide the format for viewing the organism. You
+        can specify the format using tokens that correspond to each field'
+    );
 
-  // Check to see if the organism bundle exists
-  $term = tripal_load_term_entity(array(
-    'namespace' => $field['settings']['semantic_web']['ns'],
-    'accession' => $field['settings']['semantic_web']['type']
-  ));
-  if ($term) {
-    $entity = tripal_load_bundle_entity(array('term_id' => $term->id));
-  }
+    $element['field_display_string'] = array(
+      '#type' => 'textfield',
+      '#title' => 'Display Format',
+      '#description' => t('Provide a mixture of text and/or tokens for the format.
+          For example: [organism.genus] [organism.species].  When displayed,
+          the tokens will be replaced with the actual value.'),
+      '#default_value' => $settings['field_display_string'],
+    );
 
-  $element['instructions'] = array(
-    '#type' => 'item',
-    '#markup' => 'Please provide the format for viewing the organism. You
-      can specify the format using tokens that correspond to each field'
-  );
-
-  $element['field_display_string'] = array(
-    '#type' => 'textfield',
-    '#title' => 'Display Format',
-    '#description' => t('Provide a mixture of text and/or tokens for the format.
-        For example: [organism__genus] [organism__species].  When displayed,
-        the tokens will be replaced with the actual value.'),
-    '#default_value' => $settings['field_display_string'],
-  );
-
-  $element['field_display_teaser'] = array(
-    '#type' => 'checkbox',
-    '#title' => 'Display teaser if available',
-    '#description' => t('If the organism that this field is associated with is
-        a published page then display the teaser rather use the display
-        format above.'),
-    '#default_value' => $settings['field_display_teaser'],
-  );
-
-  $element['tokens'] = array(
-    '#type' => 'fieldset',
-    '#collapsed' => TRUE,
-    '#collapsible' => TRUE,
-    '#title' => 'Available Tokens'
-  );
-  $headers = array('Token', 'Description');
-  $rows = array();
-
-  // Here we use the tripal_get_chado_tokens rather than the
-  // tripal_get_entity_tokens because we can't gurantee that all organisms
-  // have entities.
-  $tokens = tripal_get_chado_tokens('organism');
-  foreach ($tokens as $token) {
-    $rows[] = array(
-      $token['token'],
-      $token['description'],
+    $element['field_display_teaser'] = array(
+      '#type' => 'checkbox',
+      '#title' => 'Display teaser if available',
+      '#description' => t('If the organism that this field is associated with is
+          a published page then display the teaser rather use the display
+          format above.'),
+      '#default_value' => $settings['field_display_teaser'],
     );
-  }
 
-  $table_vars = array(
-    'header'     => $headers,
-    'rows'       => $rows,
-    'attributes' => array(),
-    'sticky'     => FALSE,
-    'caption'    => '',
-    'colgroups'  => array(),
-    'empty'      => 'There are no tokens',
-  );
-  $project_details = theme('table', $table_vars);
+    $element['tokens'] = array(
+      '#type' => 'fieldset',
+      '#collapsed' => TRUE,
+      '#collapsible' => TRUE,
+      '#title' => 'Available Tokens'
+    );
+    $headers = array('Token', 'Description');
+    $rows = array();
+
+    // Here we use the tripal_get_chado_tokens rather than the
+    // tripal_get_entity_tokens because we can't gurantee that all organisms
+    // have entities.
+    $tokens = tripal_get_chado_tokens('organism');
+    foreach ($tokens as $token) {
+      $rows[] = array(
+        $token['token'],
+        $token['description'],
+      );
+    }
 
-  $element['tokens']['list'] = array(
-    '#type' => 'item',
-    '#markup' => theme_table($table_vars),
-  );
+    $table_vars = array(
+      'header'     => $headers,
+      'rows'       => $rows,
+      'attributes' => array(),
+      'sticky'     => FALSE,
+      'caption'    => '',
+      'colgroups'  => array(),
+      'empty'      => 'There are no tokens',
+    );
+    $project_details = theme('table', $table_vars);
 
-  $element['#element_validate'] = array('chado_base__organism_id_formatter_settings_form_validate');
+    $element['tokens']['list'] = array(
+      '#type' => 'item',
+      '#markup' => theme_table($table_vars),
+    );
 
-  return $element;
+    return $element;
 
-}
+  }
 
-/**
- * Validation function for the chado_base__organism_id_formatter_settings_form.
- */
-function chado_base__organism_id_formatter_settings_form_validate(&$form, &$form_state) {
+  /**
+   * @see TripalField::formatter_view()
+   */
+  public function formatter_view(&$element, $entity_type, $entity,
+      $field, $instance, $langcode, $items, $display) {
 
-  // Place here as an example for validating the settings form.
-}
+    // Get the settings
+    $settings = $display['settings'];
+    $record = $entity->chado_record;
 
-/**
- *
- */
-function chado_base__organism_id_formatter(&$element, $entity_type, $entity,
-    $field, $instance, $langcode, $items, $display) {
+    foreach ($items as $delta => $item) {
+      $organism = $record->organism_id;
+
+      if ($settings['field_display_teaser']) {
+      }
+      else {
+        $field_name = $field['field_name'];
+        $string = $settings['field_display_string'];
+        $field_data = $entity->$field_name;
+        $content = tripal_replace_chado_tokens($string, $organism);
+        $element[$delta] = array(
+          '#type' => 'markup',
+          '#markup' => $content,
+        );
+      }
+    }
+  }
 
-  // Get the settings
-  $settings = $display['settings'];
-  $record = $entity->chado_record;
+  /**
+   * @see TripalField::widget()
+   */
+  public function widget_form(&$widget, $form, $form_state, $field, $instance,
+      $langcode, $items, $delta, $element) {
+    $options = tripal_get_organism_select_options(FALSE);
+    $widget['value'] = array(
+      '#type' => 'select',
+      '#title' => $element['#title'],
+      '#description' => $element['#description'],
+      '#options' => $options,
+      '#default_value' => count($items) > 0 ? $items[0]['value'] : 0,
+      '#required' => $element['#required'],
+      '#weight' => isset($element['#weight']) ? $element['#weight'] : 0,
+      '#delta' => $delta,
+      '#element_validate' => array('chado_base__organism_id_widget_validate'),
+    );
+    $widget['add_organism'] = array(
+      '#type' => 'item',
+      '#markup' => l('Add a new species', 'admin/content/bio_data/add/species', array('attributes' => array('target' => '_blank'))),
+    );
+  }
 
-  foreach ($items as $delta => $item) {
-    $organism = $record->organism_id;
+  /**
+   * @see TripalField::ws_formatter()
+   */
+  public function ws_formatter(&$element, $entity_type, $entity,
+      $field, $instance, $items) {
 
-    if ($settings['field_display_teaser']) {
-    }
-    else {
-      $field_name = $field['field_name'];
-      $string = $settings['field_display_string'];
-      $field_data = $entity->$field_name;
-      $content = tripal_replace_chado_tokens($string, $organism);
-      $element[$delta] = array(
-        '#type' => 'markup',
-        '#markup' => $content,
-      );
-    }
+    $organism = (array) $entity->chado_record->organism_id;
+    unset($organism->tablename);
+
+    return $organism;
   }
 }
 
-/**
- *  Implements hook_widget().
- */
-function chado_base__organism_id_widget(&$widget, $form, $form_state, $field, $instance, $langcode, $items, $delta, $element) {
-  $options = tripal_get_organism_select_options(FALSE);
-  $widget['value'] = array(
-    '#type' => 'select',
-    '#title' => $element['#title'],
-    '#description' => $element['#description'],
-    '#options' => $options,
-    '#default_value' => count($items) > 0 ? $items[0]['value'] : 0,
-    '#required' => $element['#required'],
-    '#weight' => isset($element['#weight']) ? $element['#weight'] : 0,
-    '#delta' => $delta,
-    '#element_validate' => array('chado_base__organism_id_widget_validate'),
-  );
-  $widget['add_organism'] = array(
-    '#type' => 'item',
-    '#markup' => l('Add a new species', 'admin/content/bio_data/add/species', array('attributes' => array('target' => '_blank'))),
-  );
-}
 /**
  * Callback function for validating the chado_base__organism_id_widget.
  */
@@ -297,17 +276,4 @@ function chado_base__organism_id_widget_validate($element, &$form_state) {
   if (!$organism_id) {
     form_error($element, t("Please specify an organism."));
   }
-}
-
-
-/**
- * Implements hook_ws_formatter().
- */
-function chado_base__organism_id_ws_formatter($entity_type, $entity,
-    $field, $instance, $items) {
-
-  $organism = (array) $entity->chado_record->organism_id;
-  unset($organism->tablename);
-
-  return $organism;
 }

+ 0 - 121
tripal_chado/includes/fields/tripal_chado_field.inc

@@ -1,121 +0,0 @@
-<?php
-
-/* TODO: it may be eaiser to help train developers at creating new
- * fields if it was a class rather than a bunch of hooks. Below is
- * the starting point.
- */
-
-/**
- * A base class for all Fields supported by the Tripal Chado module.
- *
- */
-class TripalChadoField {
-  /**
-   * Implements hook_info() for fields.
-   *
-   * This is a hook provided by the tripal_chado module for offloading the
-   * hook_field_info() hook for each field to specify.
-   */
-  public function info() {
-    return array(
-    );
-  }
-  /**
-   * Implements hook_widget_info.
-   *
-   * This is a hook provided by the tripal_chado module for offloading
-   * the hook_field_widget_info() hook for each field to specify.
-   */
-  public function widget_info() {
-    return array(
-    );
-  }
-  /**
-   * Implements hook_formatter_info.
-   *
-   * This is a hook provided by the tripal_chado module for
-   * offloading the hook_field_formatter_info() for each field
-   * to specify.
-   *
-   */
-  public function formatter_info() {
-    return array(
-    );
-  }
-  /**
-   * Implements hook_formatter_settings_summary.
-   *
-   * This is a hook provided by the tripal_chado module for
-   * offloading the hook_field_formatter_settings_summary() for each field
-   * to specify.
-   *
-   */
-  public function formatter_settings_summary($field, $instance, $view_mode) {
-
-  }
-
-  /**
-   * Provides a settings form for the formatter.
-   *
-   * This is a hook provided by the tripal_chado module for
-   * offloading the hook_field_formatter_settings_form() for each field
-   * to specify.
-   */
-  public function formatter_settings_form($field, $instance,
-      $view_mode, $form, &$form_state) {
-
-  }
-
-  /**
-   *
-   */
-  public function formatter(&$element, $entity_type, $entity,
-      $field, $instance, $langcode, $items, $display) {
-  }
-
-  /**
-   * Loads the field values with appropriate data.
-   *
-   * This function is called by the tripal_chado_field_storage_load() for
-   * each property managed by the field_chado_storage storage type.  This is
-   * an optional hook function that is only needed if the field has
-   * multiple form elements.
-   *
-   * @param $field
-   * @param $entity
-   * @param $base_table
-   * @param $record
-   */
-  public function load($field, $entity, $base_table, $record) {
-
-  }
-
-  /**
-   * Implements hook_ws_formatter().
-   */
-  public function ws_formatter(&$element, $entity_type, $entity,
-      $field, $instance, $items) {
-
-  }
-
-  /**
-   *  Implements hook_widget().
-   */
-  public function widget(&$widget, $form, $form_state, $field, $instance,
-      $langcode, $items, $delta, $element) {
-
-  }
-  /**
-   * Callback function for validating the widget_.
-   */
-  static function widget_validate($element, &$form_state) {
-
-  }
-
-  /**
-   *
-   */
-  public function attach_info($entity_type, $bundle) {
-
-  }
-}

+ 54 - 19
tripal_chado/includes/tripal_chado.fields.inc

@@ -23,11 +23,17 @@ function tripal_chado_field_info() {
 
   // Iterate through the fields, include the file and run the info function.
   foreach ($field_files as $file) {
-    $field_name = $file->name;
-    module_load_include('inc', 'tripal_chado', 'includes/fields/' . $field_name);
-    $function = $field_name . '_info';
+    $field_type = $file->name;
+    module_load_include('inc', 'tripal_chado', 'includes/fields/' . $field_type);
+
+    if (preg_match('/^chado/', $field_type) and class_exists($field_type)) {
+      $field_obj = new $field_type();
+      $info[$field_type] = $field_obj->field_info();
+    }
+
+    $function = $field_type . '_info';
     if (function_exists($function)) {
-      $info[$field_name] = $function();
+      $info[$field_type] = $function();
     }
   }
   return $info;
@@ -49,6 +55,12 @@ function tripal_chado_field_widget_info() {
     $field_type = $field['type'];
     if ($field['storage']['type'] == 'field_chado_storage') {
       module_load_include('inc', 'tripal_chado', 'includes/fields/' . $field_type);
+
+      if (preg_match('/^chado/', $field_type) and class_exists($field_type)) {
+        $field_obj = new $field_type();
+        $widgets[$field_type . '_widget'] = $field_obj->widget_info();
+      }
+
       $function = $field_type . '_widget_info';
       if (function_exists($function)) {
         $widgets[$field_type . '_widget'] = $function();
@@ -73,6 +85,12 @@ function tripal_chado_field_formatter_info() {
     $field_type = $field['type'];
     if ($field['storage']['type'] == 'field_chado_storage') {
       module_load_include('inc', 'tripal_chado', 'includes/fields/' . $field_type);
+
+      if (preg_match('/^chado/', $field_type) and class_exists($field_type)) {
+        $field_obj = new $field_type();
+        $formatters[$field_type . '_formatter'] = $field_obj->formatter_info();
+      }
+
       $function = $field_type . '_formatter_info';
       if (function_exists($function)) {
         $formatters[$field_type . '_formatter'] = $function();
@@ -89,6 +107,12 @@ function tripal_chado_field_formatter_settings_summary($field, $instance, $view_
   $summary = '';
   $field_type = $field['type'];
   module_load_include('inc', 'tripal_chado', 'includes/fields/' . $field_type);
+
+  if (preg_match('/^chado/', $field_type) and class_exists($field_type)) {
+    $field = new $field_type();
+    $summary = $field->formatter_settings_summary($field, $instance, $view_mode);
+  }
+
   $function = $field_type . '_formatter_settings_summary';
   if (function_exists($function)) {
     $summary = $function($field, $instance, $view_mode);
@@ -100,12 +124,19 @@ function tripal_chado_field_formatter_settings_summary($field, $instance, $view_
 /**
  * Implements hook_field_formatter_settings_form().
  */
-function tripal_chado_field_formatter_settings_form($field, $instance, $view_mode, $form, &$form_state) {
+function tripal_chado_field_formatter_settings_form($field, $instance,
+    $view_mode, $form, &$form_state) {
   $element = array();
 
   $field_type = $field['type'];
   form_load_include($form_state, 'inc', 'tripal_chado', 'includes/fields/' . $field_type);
   module_load_include('inc', 'tripal_chado', 'includes/fields/' . $field_type);
+
+  if (preg_match('/^chado/', $field_type) and class_exists($field_type)) {
+    $field_obj = new $field_type();
+     $element = $field_obj->formatter_settings_form($field, $instance, $view_mode, $form, $form_state);
+  }
+
   $function = $field_type . '_formatter_settings_form';
   if (function_exists($function)) {
     $element = $function($field, $instance, $view_mode, $form, $form_state);
@@ -125,6 +156,12 @@ function tripal_chado_field_formatter_view($entity_type, $entity, $field,
   $element = array();
   $field_type = $field['type'];
   module_load_include('inc', 'tripal_chado', 'includes/fields/' . $field_type);
+
+  if (preg_match('/^chado/', $field_type) and class_exists($field_type)) {
+    $field_obj = new $field_type();
+    $field_obj->formatter_view($element, $entity_type, $entity, $field, $instance, $langcode, $items, $display);
+  }
+
   $function = $display['type'];
   if (function_exists($function)) {
     $function($element, $entity_type, $entity, $field, $instance, $langcode, $items, $display);
@@ -145,6 +182,12 @@ function tripal_chado_field_widget_form(&$form, &$form_state, $field,
   $field_type = $field['type'];
   form_load_include($form_state, 'inc', 'tripal_chado', 'includes/fields/' . $field_type);
   module_load_include('inc', 'tripal_chado', 'includes/fields/' . $field_name);
+
+  if (preg_match('/^chado/', $field_type) and class_exists($field_type)) {
+    $field_obj = new $field_type();
+    $field_obj->widget_form($widget, $form, $form_state, $field, $instance, $langcode, $items, $delta, $element);
+  }
+
   $function = $field_type . '_widget';
   if (function_exists($function)) {
     $function($widget, $form, $form_state, $field, $instance, $langcode, $items, $delta, $element);
@@ -500,6 +543,12 @@ function tripal_chado_field_ws_formatter($entity_type, $entity, $field_info,
   // See if the field file defines a formatter.
   $function = $field_type . '_ws_formatter';
   module_load_include('inc', 'tripal_chado', 'includes/fields/' . $field_type);
+
+  if (preg_match('/^chado/', $field_type) and class_exists($field_type)) {
+    $field_obj = new $field_type();
+    $value = $field_obj->ws_formatter($entity_type, $entity, $field_info, $field, $items);
+  }
+
   $value = '';
   if (function_exists($function)) {
     $value = $function($entity_type, $entity, $field_info, $field, $items);
@@ -705,20 +754,6 @@ function tripal_chado_add_bundle_fields_base__fields($entity_type_name, $bundle_
   }
 }
 
-/**
- * Implements hook_field_validate().
- *
- * This function is used to validate any field. Fields with custom
- * widgets will most likely have their own validate function but for all
- * others we need a way to validate them.
- *
- */
-function tripal_chado_field_validate($entity_type, $entity, $field, $instance,
-    $langcode, $items, &$errors) {
-
-
-}
-
 
 /**
  * Implements hook_field_attach_validate().