Browse Source

Merge branch '7.x-3.x' into 7.x-3.x-upgrade

Stephen Ficklin 8 years ago
parent
commit
12defa83eb

+ 222 - 0
tripal/includes/TripalField.inc

@@ -0,0 +1,222 @@
+<?php
+
+
+/**
+ * A base class for all Fields supported by the Tripal Chado module.
+ *
+ * This class provides all of the necessary functions for a TripalField field.
+ * It helps simplify and unify the process of creating fields for Tripal.  This
+ * class simply defines the function prototypes. It is up to the class that
+ * extends this class to implement the functions.
+ *
+ * Each module that creates new fields should use the normal Field API hooks
+ * (e.g. hook_field_info(), hook_field_widget_form(), etc.) to instantiate the
+ * appropriate TripalField class.
+ *
+ * Because of the way Drupal handles callbacks, form validate functions,
+ * AJAX callbacks and theme functions cannot be part of the implementation of
+ * this class.  Those functions should be added to the bottom of the file
+ * where the child class is housed..
+ *
+ */
+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, $details) {
+
+  }
+
+  /**
+   * 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($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";
 
 
 /**

+ 0 - 7
tripal_chado/api/tripal_chado.api.inc

@@ -219,13 +219,6 @@ function tripal_replace_chado_tokens($string, $record) {
             if (property_exists($var, $index)) {
               $value = $var->$index;
             }
-            else {
-              tripal_report_error('tripal_chado', TRIPAL_WARNING,
-                'Tokens: Unable to determine the value of %token. Things went awry when trying ' .
-                'to access \'%index\' for the following: \'%var\'.',
-                array('%token' => $token, '%index' => $index, '%var' => print_r($var,TRUE))
-              );
-            }
           }
           // if the $var is an array then there are multiple instances of the same
           // table in a FK relationship (e.g. relationship tables)

+ 312 - 358
tripal_chado/includes/fields/chado_base__dbxref_id.inc

@@ -1,295 +1,294 @@
 <?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__dbxref_id_info() {
-  return array(
-    'label' => t('Cross reference'),
-    'description' => t('This record can be cross referenced with a record in
-      another online database. This field is intended for the most prominent
-      reference.  At a minimum, the database and accession must be provided.'),
-    'default_widget' => 'chado_base__dbxref_id_widget',
-    'default_formatter' => 'chado_base__dbxref_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 the settings.
- *
- * @param $entity_type
- * @param $entity
- * @param $term
- *
- * @return
- *   A field array
- */
-function chado_base__dbxref_id_attach_info($entity_type, $bundle, $target) {
-
-  $field_info = array();
-
-  $table_name = $target['data_table'];
-  $type_table = $target['type_table'];
-  $type_field = $target['field'];
-  $cv_id      = $target['cv_id'];
-  $cvterm_id  = $target['cvterm_id'];
 
-  // Check the schema for the data table if it does not have
-  // a 'dbxref_id' column then we don't want to attach this field.
-  $schema = chado_get_schema($table_name);
-  if (!array_key_exists('dbxref_id', $schema['fields'])) {
-    return $field_info;
+class chado_base__dbxref_id extends TripalField {
+  /**
+   * @see TripalField::field_info()
+   */
+  function field_info() {
+    return array(
+      'label' => t('Cross reference'),
+      'description' => t('This record can be cross referenced with a record in
+        another online database. This field is intended for the most prominent
+        reference.  At a minimum, the database and accession must be provided.'),
+      'default_widget' => 'chado_base__dbxref_id_widget',
+      'default_formatter' => 'chado_base__dbxref_id_formatter',
+      'settings' => array(),
+      'storage' => array(
+        'type' => 'field_chado_storage',
+        'module' => 'tripal_chado',
+        'active' => TRUE
+      ),
+    );
   }
+  /**
+   * @see TripalField::attach_info()
+   */
+  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
+    // a 'dbxref_id' column then we don't want to attach this field.
+    $schema = chado_get_schema($table_name);
+    if (!array_key_exists('dbxref_id', $schema['fields'])) {
+      return $field_info;
+    }
 
-  // There is an dbxref_id column so attach the field!
-  $field_info = array(
-    'field_name' => $table_name . '__dbxref_id',
-    'field_type' => 'chado_base__dbxref_id',
-    'widget_type' => 'chado_base__dbxref_id_widget',
-    'description' => 'This record can be cross referenced with a ' .
-      'record in another online database. The primary reference is for the ' .
-      'most prominent reference.  At a minimum, the database and accession ' .
-      'must be provided.  To remove a set reference, change the database ' .
-      'field to "Select a Database".',
-    'label' => 'Cross Reference',
-    'is_required' => 0,
-    'storage' => 'field_chado_storage',
-    'widget_settings' => array(
-      'display_label' => 1
-    ),
-    'field_settings' => array(
-      'chado_table' => $table_name,
-      'chado_column' => 'dbxref_id',
-      'semantic_web' => array(
-        'type' => '',
-        'ns' => '',
-        'nsurl' => '',
+    // There is an dbxref_id column so attach the field!
+    $field_info = array(
+      'field_name' => $table_name . '__dbxref_id',
+      'field_type' => 'chado_base__dbxref_id',
+      'widget_type' => 'chado_base__dbxref_id_widget',
+      'description' => 'This record can be cross referenced with a ' .
+        'record in another online database. The primary reference is for the ' .
+        'most prominent reference.  At a minimum, the database and accession ' .
+        'must be provided.  To remove a set reference, change the database ' .
+        'field to "Select a Database".',
+      'label' => 'Cross Reference',
+      'is_required' => 0,
+      'storage' => 'field_chado_storage',
+      'widget_settings' => array(
+        'display_label' => 1
       ),
-    ),
-  );
+      'field_settings' => array(
+        'chado_table' => $table_name,
+        'chado_column' => 'dbxref_id',
+        'semantic_web' => array(
+          'type' => '',
+          'ns' => '',
+          'nsurl' => '',
+        ),
+      ),
+    );
 
-  return $field_info;
+    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__dbxref_id_widget_info() {
-  return array(
-    'label' => t('Cross reference'),
-    'field types' => array('chado_base__dbxref_id'),
-    'description' => t('This record can be cross referenced with a record in
-        another online database. This field is intended for the most
-        prominent reference.  At a minimum, the database and accession
-        must be provided.'),
-  );
-}
-/**
- * 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__dbxref_id_formatter_info() {
-  return array(
-    'label' => t('Database Cross Reference'),
-    'field types' => array('chado_base__dbxref_id'),
-    'settings' => array(
-    ),
-  );
-}
-/**
- *
- * @param unknown $entity_type
- * @param unknown $entity
- * @param unknown $field
- * @param unknown $instance
- * @param unknown $langcode
- * @param unknown $items
- * @param unknown $display
- */
-function chado_base__dbxref_id_formatter(&$element, $entity_type, $entity, $field,
-    $instance, $langcode, $items, $display) {
+  }
+  /**
+   * @see TripalField::widget_info()
+   */
+  function widget_info() {
+    return array(
+      'label' => t('Cross reference'),
+      'field types' => array('chado_base__dbxref_id'),
+      'description' => t('This record can be cross referenced with a record in
+          another online database. This field is intended for the most
+          prominent reference.  At a minimum, the database and accession
+          must be provided.'),
+    );
+  }
+  /**
+   * @see TripalField::formatter_info()
+   */
+  function formatter_info() {
+    return array(
+      'label' => t('Database Cross Reference'),
+      'field types' => array('chado_base__dbxref_id'),
+      'settings' => array(
+      ),
+    );
+  }
+  /**
+   * @see TripalField::formatter_view()
+   */
+  function formatter_view(&$element, $entity_type, $entity, $field,
+      $instance, $langcode, $items, $display) {
+
+    $record = $entity->chado_record;
+
+    foreach ($items as $delta => $item) {
+      $accession = '';
+      if ($item['value']) {
+        $dbxref = $record->dbxref_id;
+        $accession = $dbxref->db_id->name . ':' . $dbxref->accession;
+        if ($dbxref->db_id->urlprefix) {
+          $accession = l($accession, $dbxref->db_id->urlprefix . '/' . $dbxref->accession,
+              array('attributes' => array('target' => '_blank')));
+        }
+      }
+      $element[$delta] = array(
+        '#type' => 'markup',
+        '#markup' => $accession,
+      );
+    }
+  }
+  /**
+   * @see TripalField::widget_form()
+   */
+  function widget_form(&$widget, $form, $form_state, $field, $instance,
+      $langcode, $items, $delta, $element) {
 
-  $record = $entity->chado_record;
+    $field_name = $field['field_name'];
 
-  foreach ($items as $delta => $item) {
+    // Get the field defaults.
+    $dbxref_id = '';
+    $db_id = '';
     $accession = '';
-    if ($item['value']) {
-      $dbxref = $record->dbxref_id;
-      $accession = $dbxref->db_id->name . ':' . $dbxref->accession;
-      if ($dbxref->db_id->urlprefix) {
-        $accession = l($accession, $dbxref->db_id->urlprefix . '/' . $dbxref->accession,
-            array('attributes' => array('target' => '_blank')));
-      }
+    $version = '';
+    $description = '';
+
+    // If the field already has a value then it will come through the $items
+    // array.  This happens when editing an existing record.
+    if (array_key_exists($delta, $items)) {
+      $dbxref_id = $items[$delta]['value'];
+      $db_id = $items[$delta]['dbxref__db_id'];
+      $accession = $items[$delta]['dbxref__accession'];
+      $version = $items[$delta]['dbxref__version'];
+      $description = $items[$delta]['dbxref__description'];
     }
-    $element[$delta] = array(
-      '#type' => 'markup',
-      '#markup' => $accession,
-    );
-  }
-}
-/**
- *
- * @param unknown $field_name
- * @param unknown $widget
- * @param unknown $form
- * @param unknown $form_state
- * @param unknown $field
- * @param unknown $instance
- * @param unknown $langcode
- * @param unknown $items
- * @param unknown $delta
- * @param unknown $element
- */
-function chado_base__dbxref_id_widget(&$widget, $form, $form_state, $field, $instance, $langcode, $items, $delta, $element) {
-  $field_name = $field['field_name'];
-
-  // Get the field defaults.
-  $dbxref_id = '';
-  $db_id = '';
-  $accession = '';
-  $version = '';
-  $description = '';
-
-  // If the field already has a value then it will come through the $items
-  // array.  This happens when editing an existing record.
-  if (array_key_exists($delta, $items)) {
-    $dbxref_id = $items[$delta]['value'];
-    $db_id = $items[$delta]['dbxref__db_id'];
-    $accession = $items[$delta]['dbxref__accession'];
-    $version = $items[$delta]['dbxref__version'];
-    $description = $items[$delta]['dbxref__description'];
-  }
 
-  // Check $form_state['values'] to see if an AJAX call set the values.
-  if (array_key_exists('values', $form_state)) {
-    $dbxref_id = tripal_chado_get_field_form_values($field_name, $form_state, 0, $field_name);
-    $db_id = tripal_chado_get_field_form_values($field_name, $form_state, 0, "dbxref__db_id");
-    $accession = tripal_chado_get_field_form_values($field_name, $form_state, 0, "dbxref__accession");
-    $version = tripal_chado_get_field_form_values($field_name, $form_state, 0, "dbxref__version");
-    $description = tripal_chado_get_field_form_values($field_name, $form_state, 0, "dbxref__description");
-  }
+    // Check $form_state['values'] to see if an AJAX call set the values.
+    if (array_key_exists('values', $form_state)) {
+      $dbxref_id = tripal_chado_get_field_form_values($field_name, $form_state, 0, $field_name);
+      $db_id = tripal_chado_get_field_form_values($field_name, $form_state, 0, "dbxref__db_id");
+      $accession = tripal_chado_get_field_form_values($field_name, $form_state, 0, "dbxref__accession");
+      $version = tripal_chado_get_field_form_values($field_name, $form_state, 0, "dbxref__version");
+      $description = tripal_chado_get_field_form_values($field_name, $form_state, 0, "dbxref__description");
+    }
 
-  // If we are here because our parent was triggered in a form submit
-  // then that means an ajax call was made and we don't want the fieldset to
-  // be closed when it returns from the ajax call.
-//   $collapsed = TRUE;
-//   if (array_key_exists('triggering_element', $form_state) and
-//       $form_state['triggering_element']['#parents'][0] == $field_name) {
-//     $collapsed = FALSE;
-//   }
-//   if ($dbxref_id) {
-//     $collapsed = FALSE;
-//   }
-
-  $schema = chado_get_schema('dbxref');
-  $options = tripal_get_db_select_options();
-
-  $widget['#element_validate'] = array('chado_base__dbxref_id_widget_validate');
-  $widget['#theme'] = 'chado_base__dbxref_id_widget';
-  $widget['#prefix'] =  "<span id='$field_name-dbxref--db-id'>";
-  $widget['#suffix'] =  "</span>";
-
-  // A temporary element used for theming the fieldset.
-  $widget['#theme_settings'] = array(
-    '#title' => $element['#title'],
-    '#description' =>  $element['#description'],
-    '#weight' => isset($element['#weight']) ? $element['#weight'] : 0,
-    '#theme' => 'chado_base__dbxref_id_widget',
-    //'#collapsible' => TRUE,
-    //'#collapsed' => $collapsed,
-  );
+    // If we are here because our parent was triggered in a form submit
+    // then that means an ajax call was made and we don't want the fieldset to
+    // be closed when it returns from the ajax call.
+  //   $collapsed = TRUE;
+  //   if (array_key_exists('triggering_element', $form_state) and
+  //       $form_state['triggering_element']['#parents'][0] == $field_name) {
+  //     $collapsed = FALSE;
+  //   }
+  //   if ($dbxref_id) {
+  //     $collapsed = FALSE;
+  //   }
+
+    $schema = chado_get_schema('dbxref');
+    $options = tripal_get_db_select_options();
+
+    $widget['#element_validate'] = array('chado_base__dbxref_id_widget_validate');
+    $widget['#theme'] = 'chado_base__dbxref_id_widget';
+    $widget['#prefix'] =  "<span id='$field_name-dbxref--db-id'>";
+    $widget['#suffix'] =  "</span>";
+
+    // A temporary element used for theming the fieldset.
+    $widget['#theme_settings'] = array(
+      '#title' => $element['#title'],
+      '#description' =>  $element['#description'],
+      '#weight' => isset($element['#weight']) ? $element['#weight'] : 0,
+      '#theme' => 'chado_base__dbxref_id_widget',
+      //'#collapsible' => TRUE,
+      //'#collapsed' => $collapsed,
+    );
 
-  $widget['value'] = array(
-    '#type' => 'value',
-    '#default_value' => $dbxref_id,
-  );
+    $widget['value'] = array(
+      '#type' => 'value',
+      '#default_value' => $dbxref_id,
+    );
 
-  $widget['dbxref__db_id'] = array(
-    '#type' => 'select',
-    '#title' => t('Database'),
-    '#options' => $options,
-    '#required' => $element['#required'],
-    '#default_value' => $db_id,
-    '#ajax' => array(
-      'callback' => "chado_base__dbxref_id_widget_form_ajax_callback",
-      'wrapper' => "$field_name-dbxref--db-id",
-      'effect' => 'fade',
-      'method' => 'replace'
-    ),
-  );
-  $widget['dbxref__accession'] = array(
-    '#type' => 'textfield',
-    '#title' => t('Accession'),
-    '#default_value' => $accession,
-    '#required' => $element['#required'],
-    '#maxlength' => array_key_exists('length', $schema['fields']['accession']) ? $schema['fields']['accession']['length'] : 255,
-    '#size' => 15,
-    '#autocomplete_path' => 'admin/tripal/storage/chado/auto_name/dbxref/' . $db_id,
-    '#ajax' => array(
-      'callback' => "tripal_chado_dbxref_widget_form_ajax_callback",
-      'wrapper' => "$field_name-dbxref--db-id",
-      'effect' => 'fade',
-      'method' => 'replace'
-    ),
-    '#disabled' => $db_id ? FALSE : TRUE,
-  );
-  $widget['dbxref__version'] = array(
-    '#type' => 'textfield',
-    '#title' => t('Version'),
-    '#default_value' => $version,
-    '#maxlength' => array_key_exists('length', $schema['fields']['version']) ? $schema['fields']['version']['length'] : 255,
-    '#size' => 5,
-    '#disabled' => $db_id ? FALSE : TRUE,
-  );
-  $widget['dbxref__description'] = array(
-    '#type' => 'textfield',
-    '#title' => t('Description'),
-    '#default_value' => $description,
-    '#size' => 20,
-    '#disabled' => $db_id ? FALSE : TRUE,
-  );
-  $widget['links'] = array(
-    '#type' => 'item',
-    '#markup' => l('Add a new database', 'admin/tripal/chado/tripal_db/add', array('attributes' => array('target' => '_blank')))
-  );
-}
-/**
- * An Ajax callback for the tripal_chado_admin_publish_form..
- */
-function chado_base__dbxref_id_widget_form_ajax_callback($form, $form_state) {
-  $field_name = $form_state['triggering_element']['#parents'][0];
-  $db_id = tripal_chado_get_field_form_values($field_name, $form_state, 0, 'dbxref__db_id');
-  $accession = tripal_chado_get_field_form_values($field_name, $form_state, 0, 'dbxref__accession');
-  if ($db_id and $accession) {
-    $values = array(
-      'db_id' => $db_id,
-      'accession' => $accession,
+    $widget['dbxref__db_id'] = array(
+      '#type' => 'select',
+      '#title' => t('Database'),
+      '#options' => $options,
+      '#required' => $element['#required'],
+      '#default_value' => $db_id,
+      '#ajax' => array(
+        'callback' => "chado_base__dbxref_id_widget_form_ajax_callback",
+        'wrapper' => "$field_name-dbxref--db-id",
+        'effect' => 'fade',
+        'method' => 'replace'
+      ),
     );
-    $options = array('is_duplicate' => TRUE);
-    $has_duplicate = chado_select_record('dbxref', array('*'), $values, $options);
-    if (!$has_duplicate) {
-      drupal_set_message('The selected cross reference is new and will be added for future auto completions.');
+    $widget['dbxref__accession'] = array(
+      '#type' => 'textfield',
+      '#title' => t('Accession'),
+      '#default_value' => $accession,
+      '#required' => $element['#required'],
+      '#maxlength' => array_key_exists('length', $schema['fields']['accession']) ? $schema['fields']['accession']['length'] : 255,
+      '#size' => 15,
+      '#autocomplete_path' => 'admin/tripal/storage/chado/auto_name/dbxref/' . $db_id,
+      '#ajax' => array(
+        'callback' => "tripal_chado_dbxref_widget_form_ajax_callback",
+        'wrapper' => "$field_name-dbxref--db-id",
+        'effect' => 'fade',
+        'method' => 'replace'
+      ),
+      '#disabled' => $db_id ? FALSE : TRUE,
+    );
+    $widget['dbxref__version'] = array(
+      '#type' => 'textfield',
+      '#title' => t('Version'),
+      '#default_value' => $version,
+      '#maxlength' => array_key_exists('length', $schema['fields']['version']) ? $schema['fields']['version']['length'] : 255,
+      '#size' => 5,
+      '#disabled' => $db_id ? FALSE : TRUE,
+    );
+    $widget['dbxref__description'] = array(
+      '#type' => 'textfield',
+      '#title' => t('Description'),
+      '#default_value' => $description,
+      '#size' => 20,
+      '#disabled' => $db_id ? FALSE : TRUE,
+    );
+    $widget['links'] = array(
+      '#type' => 'item',
+      '#markup' => l('Add a new database', 'admin/tripal/chado/tripal_db/add', array('attributes' => array('target' => '_blank')))
+    );
+  }
+
+  /**
+   * @see TripalField::load()
+   */
+  function load($field, $entity, $details) {
+
+    $record = $details['record'];
+
+    $field_name = $field['field_name'];
+    $field_type = $field['type'];
+    $field_table = $field['settings']['chado_table'];
+    $field_column = $field['settings']['chado_column'];
+
+    // Set some defauls for the empty record
+    $entity->{$field_name}['und'][0] = array(
+      'value' => '',
+      'dbxref__db_id' => '',
+      'dbxref__accession' => '',
+      'dbxref__version' => '',
+      'dbxref__description' => '',
+    );
+    // Get the primary dbxref record (if it's not NULL).  Because we have a
+    // dbxref_id passed in by the base record, we will only have one record.
+    if ($record->$field_column) {
+      $columns = array('*');
+      $match = array('dbxref_id' => $record->$field_column->$field_column);
+      $options = array('return_array' => TRUE);
+      $dbxrefs = chado_select_record('dbxref', $columns, $match, $options);
+      if (count($dbxrefs) > 0) {
+        $dbxref = $dbxrefs[0];
+        $entity->{$field_name}['und'][0] = array(
+          'value' => $dbxref->dbxref_id,
+          'dbxref__db_id' => $dbxref->db_id,
+          'dbxref__accession' => $dbxref->accession,
+          'dbxref__version' => $dbxref->version,
+          'dbxref__description' => $dbxref->description,
+        );
+      }
     }
   }
 
-  return $form[$field_name];
+
+  /**
+   * @see TripalField::ws_formatter()
+   */
+  function ws_formatter($entity_type, $entity, $field, $instance, $items) {
+
+    $dbxref = $entity->chado_record->dbxref_id;
+
+    unset($dbxref->tablename);
+    unset($dbxref->db_id->tablename);
+    return $dbxref;
+  }
 }
 
 /**
@@ -344,108 +343,63 @@ function chado_base__dbxref_id_widget_validate($element, &$form_state) {
     }
   }
 }
+
 /**
- * Theme function for the dbxref_id_widget.
- *
- * @param $variables
+ * An Ajax callback for the tripal_chado_admin_publish_form..
  */
+function chado_base__dbxref_id_widget_form_ajax_callback($form, $form_state) {
+  $field_name = $form_state['triggering_element']['#parents'][0];
+  $db_id = tripal_chado_get_field_form_values($field_name, $form_state, 0, 'dbxref__db_id');
+  $accession = tripal_chado_get_field_form_values($field_name, $form_state, 0, 'dbxref__accession');
+  if ($db_id and $accession) {
+    $values = array(
+      'db_id' => $db_id,
+      'accession' => $accession,
+    );
+    $options = array('is_duplicate' => TRUE);
+    $has_duplicate = chado_select_record('dbxref', array('*'), $values, $options);
+    if (!$has_duplicate) {
+      drupal_set_message('The selected cross reference is new and will be added for future auto completions.');
+    }
+  }
+
+  return $form[$field_name];
+}
+
 function theme_chado_base__dbxref_id_widget($variables) {
   $element = $variables['element'];
 
   $layout = "
-    <div class=\"primary-dbxref-widget\">
-      <div class=\"primary-dbxref-widget-item\">" .
+      <div class=\"primary-dbxref-widget\">
+        <div class=\"primary-dbxref-widget-item\">" .
         drupal_render($element['dbxref__db_id']) . "
-      </div>
-      <div class=\"primary-dbxref-widget-item\">" .
+        </div>
+        <div class=\"primary-dbxref-widget-item\">" .
         drupal_render($element['dbxref__accession']) . "
-      </div>
-      <div class=\"primary-dbxref-widget-item\">" .
+        </div>
+        <div class=\"primary-dbxref-widget-item\">" .
         drupal_render($element['dbxref__version']) . "
-      </div>
-      <div class=\"primary-dbxref-widget-item\">" .
+        </div>
+        <div class=\"primary-dbxref-widget-item\">" .
         drupal_render($element['dbxref__description']) . "
+        </div>
+        <div class=\"primary-dbxref-widget-links\">" . drupal_render($element['links']) . "</div>
       </div>
-      <div class=\"primary-dbxref-widget-links\">" . drupal_render($element['links']) . "</div>
-    </div>
-  ";
-
-//   $classes = array();
-//   $classes[] = 'collapsible';
-//   $theme_settings = $element['#theme_settings'];
-//   if ($theme_settings['#collapsed'] == FALSE) {
-//     $classes[] = 'collapsed';
-//   }
+    ";
+
+  //   $classes = array();
+  //   $classes[] = 'collapsible';
+  //   $theme_settings = $element['#theme_settings'];
+  //   if ($theme_settings['#collapsed'] == FALSE) {
+  //     $classes[] = 'collapsed';
+  //   }
   $fieldset = array(
     '#title' => $element['#title'],
     '#value' => '',
     '#description' => $element['#description'],
     '#children' => $layout,
-//    '#attributes' => array('class' => $classes),
+    //    '#attributes' => array('class' => $classes),
   );
 
   return theme('fieldset', array('element' => $fieldset));
 }
-
-/**
- * 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
- */
-function chado_base__dbxref_id_load($field, $entity, $base_table, $record) {
-
-  $field_name = $field['field_name'];
-  $field_type = $field['type'];
-  $field_table = $field['settings']['chado_table'];
-  $field_column = $field['settings']['chado_column'];
-
-  // Set some defauls for the empty record
-  $entity->{$field_name}['und'][0] = array(
-    'value' => '',
-    'dbxref__db_id' => '',
-    'dbxref__accession' => '',
-    'dbxref__version' => '',
-    'dbxref__description' => '',
-  );
-  // Get the primary dbxref record (if it's not NULL).  Because we have a
-  // dbxref_id passed in by the base record, we will only have one record.
-  if ($record->$field_column) {
-    $columns = array('*');
-    $match = array('dbxref_id' => $record->$field_column->$field_column);
-    $options = array('return_array' => TRUE);
-    $dbxrefs = chado_select_record('dbxref', $columns, $match, $options);
-    if (count($dbxrefs) > 0) {
-      $dbxref = $dbxrefs[0];
-      $entity->{$field_name}['und'][0] = array(
-        'value' => $dbxref->dbxref_id,
-        'dbxref__db_id' => $dbxref->db_id,
-        'dbxref__accession' => $dbxref->accession,
-        'dbxref__version' => $dbxref->version,
-        'dbxref__description' => $dbxref->description,
-      );
-    }
-  }
-}
-
-
-/**
- * Implements hook_ws_formatter().
- */
-function chado_base__dbxref_id_ws_formatter($entity_type, $entity,
-    $field, $instance, $items) {
-
-  $dbxref = $entity->chado_record->dbxref_id;
-
-  unset($dbxref->tablename);
-  unset($dbxref->db_id->tablename);
-  return $dbxref;
-}
-

+ 229 - 263
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>',
       ),
-    ),
-  );
-
-  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
+    );
+  }
+  /**
+   * @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.";
-      }
+      $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 $summary;
+  }
 
-/**
- * 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) {
+  /**
+   * @see TripalField::formatter_settings_form()
+   */
+  public function formatter_settings_form($field, $instance,
+      $view_mode, $form, &$form_state) {
 
-  $display = $instance['display'][$view_mode];
-  $settings = $display['settings'];
+    $display = $instance['display'][$view_mode];
+    $settings = $display['settings'];
 
 
-  $element = array();
-  $term = NULL;
-  $entity = NULL;
+    $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));
-  }
+    // 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['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['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'
     );
-  }
 
-  $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['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['tokens']['list'] = array(
-    '#type' => 'item',
-    '#markup' => theme_table($table_vars),
-  );
+    $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['#element_validate'] = array('chado_base__organism_id_formatter_settings_form_validate');
+    $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'],
+      );
+    }
 
-  return $element;
+    $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']['list'] = array(
+      '#type' => 'item',
+      '#markup' => theme_table($table_vars),
+    );
 
-/**
- * Validation function for the chado_base__organism_id_formatter_settings_form.
- */
-function chado_base__organism_id_formatter_settings_form_validate(&$form, &$form_state) {
+    return $element;
 
-  // Place here as an example for validating the settings form.
-}
+  }
 
-/**
- *
- */
-function chado_base__organism_id_formatter(&$element, $entity_type, $entity,
-    $field, $instance, $langcode, $items, $display) {
+  /**
+   * @see TripalField::formatter_view()
+   */
+  public function formatter_view(&$element, $entity_type, $entity,
+      $field, $instance, $langcode, $items, $display) {
 
-  // Get the settings
-  $settings = $display['settings'];
-  $record = $entity->chado_record;
+    // Get the settings
+    $settings = $display['settings'];
+    $record = $entity->chado_record;
 
-  foreach ($items as $delta => $item) {
-    $organism = $record->organism_id;
+    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,
-      );
+      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,
+        );
+      }
     }
   }
-}
 
-/**
- *  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'))),
-  );
+  /**
+   * @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'))),
+    );
+  }
+
+  /**
+   * @see TripalField::ws_formatter()
+   */
+  public function ws_formatter($entity_type, $entity, $field, $instance, $items) {
+
+    $organism = (array) $entity->chado_record->organism_id;
+    unset($organism->tablename);
+
+    return $organism;
+  }
 }
+
 /**
  * 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) {
-
-  }
-}

+ 12 - 0
tripal_chado/includes/tripal_chado.field_storage.inc

@@ -329,6 +329,12 @@ function tripal_chado_field_storage_load($entity_type, $entities, $age,
         // that need populationg besides the value which was set above.
         $load_function = $field_type . '_load';
         module_load_include('inc', $field_module, 'includes/fields/' . $field_type);
+
+        if (preg_match('/^chado/', $field_type) and class_exists($field_type)) {
+          $field_obj = new $field_type();
+          $field_obj->load($field, $entity, array('record' => $record));
+        }
+
         if (function_exists($load_function)) {
           $load_function($field, $entity, $base_table, $record);
         }
@@ -343,6 +349,12 @@ function tripal_chado_field_storage_load($entity_type, $entities, $age,
         $entity->{$field_name}['und'][0]['value'] = '';
         $load_function = $field_type . '_load';
         module_load_include('inc', $field_module, 'includes/fields/' . $field_type);
+
+        if (preg_match('/^chado/', $field_type) and class_exists($field_type)) {
+          $field_obj = new $field_type();
+          $field_obj->load($field, $entity, array('record' => $record));
+        }
+
         if (function_exists($load_function)) {
           $load_function($field, $entity, $base_table, $record);
         }

+ 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().