Quellcode durchsuchen

newly restructured field handling single field display working multi field display still in progress

Shawna vor 7 Jahren
Ursprung
Commit
708a691922

BIN
tripal_ws/.DS_Store


+ 106 - 39
tripal_ws/includes/TripalFields/remote__data/remote__data.inc

@@ -70,7 +70,8 @@ class remote__data extends WebServicesField {
 			'data_info' => array(
 			'data_info' => array(
 				'query' => '',
 				'query' => '',
 				'remote_site' => '',
 				'remote_site' => '',
-				'description' => '',
+        'description' => '',
+        'rd_field_name' => '',
 			),
 			),
   );
   );
   // A boolean specifying that users should not be allowed to create
   // A boolean specifying that users should not be allowed to create
@@ -90,8 +91,9 @@ class remote__data extends WebServicesField {
   public function load($entity) {
   public function load($entity) {
     $site_id_ws = $this->instance['settings']['data_info']['remote_site'];
     $site_id_ws = $this->instance['settings']['data_info']['remote_site'];
     $query = $this->instance['settings']['data_info']['query'];
     $query = $this->instance['settings']['data_info']['query'];
+    $rd_field_name = $this->instance['settings']['data_info']['rd_field_name'];
     $options = array();
     $options = array();
-
+    $field_name = $this->field['field_name'];
     // Check for tripal tokens and replace if present.
     // Check for tripal tokens and replace if present.
     $bundle_entity = tripal_load_bundle_entity(array('name' => $entity->bundle));
     $bundle_entity = tripal_load_bundle_entity(array('name' => $entity->bundle));
     $query = tripal_replace_entity_tokens($query, $entity, $bundle_entity);
     $query = tripal_replace_entity_tokens($query, $entity, $bundle_entity);
@@ -111,6 +113,11 @@ class remote__data extends WebServicesField {
      //Make the call and pull the data down.
      //Make the call and pull the data down.
      $data = drupal_http_request($full_url, $options);
      $data = drupal_http_request($full_url, $options);
 
 
+    //Check the returned data is not an error.
+    if(property_exists($data, 'error')){
+      watchdog('Tripal WS', '<pre>Web Services data unavailable because site is returning error: '. print_r($data->error, TRUE) .'</pre>');
+      $data = '';
+    }
      if($data){
      if($data){
        $data = drupal_json_decode($data->data);
        $data = drupal_json_decode($data->data);
        //Check the returned data is not an error.
        //Check the returned data is not an error.
@@ -118,39 +125,99 @@ class remote__data extends WebServicesField {
           watchdog('Tripal WS', '<pre>Web Services data unavailable because site is returning error: '. print_r($data['error'], TRUE) .'</pre>');
           watchdog('Tripal WS', '<pre>Web Services data unavailable because site is returning error: '. print_r($data['error'], TRUE) .'</pre>');
           $data = '';
           $data = '';
        }
        }
-       //Check the returned data isn't empty.
-       if(count($data['members']) >= 1){
-        //If multiple records, if single follow @id and pull down data
-        if(array_key_exists('value', $data)){
-          $members = $data['value'][0]['members'];
-          if($members){
-            if(count($members) > 1){
-                $field_name = $this->field['field_name'];
-                $entity->{$field_name}['und'][0]['value'] = $data;
+
+       // Check if the returned results are paged, if so iterate through all pages.
+       //$paged_data = array();
+       if(array_key_exists('next', $data['view'])){
+          //First page of results.
+          foreach($data['members'] as $member){
+            $value = tripal_ws_remote_data_single_field_pull($rd_field_name, $member['@id']);
+            $entity->{$field_name}['und'][$member['label']]['value'] = $value;
+            $entity->{$field_name}['und'][$member['label']]['remote_entity'] = $member;
+            //array_push($paged_data, $member);
+          }
+          //'next' pages.
+          $next_page = $data['view']['next'];
+            while(!empty($next_page)){
+              $data = drupal_http_request($next_page, $options);
+              if(!empty($data)){
+                $data = drupal_json_decode($data->data);
+                foreach($data['members'] as $member){
+                  $value = tripal_ws_remote_data_single_field_pull($rd_field_name, $member['@id']);
+                  $entity->{$field_name}['und'][$member['label']]['value'] = $value;
+                  $entity->{$field_name}['und'][$member['label']]['remote_entity'] = $member;
+                  //array_push($paged_data, $member);
+                }
+                if(array_key_exists('next', $data['view'])){
+                  $next_page = $data['view']['next'];
+                }
+                else {
+                  $next_page = NULL;
+                }
+              }
+          }
+          //'last' page.
+          $last_page = $data['view']['last'];
+          $data = drupal_http_request($last_page, $options);
+          if(!empty($data)){
+            $data = drupal_json_decode($data->data);
+            foreach($data['members'] as $member){
+              $value = tripal_ws_remote_data_single_field_pull($rd_field_name, $member['@id']);
+              $entity->{$field_name}['und'][$member['label']]['value'] = $value;
+              $entity->{$field_name}['und'][$member['label']]['remote_entity'] = $member;
+              //array_push($paged_data, $member);
+            }
+          }
+       }
+       else {
+        //Check the returned data isn't empty.
+        if(!empty($data['members'])){
+          //If multiple records, if single follow @id and pull down data
+          /*if(array_key_exists('value', $data)){
+            $members = $data['value'][0]['members'];
+            if($members){
+              if(count($members) > 1){
+                  $data = $data;
+              }
+              else {
+                $single_record_url = $data['members'][0]['@id'];
+                $data = drupal_http_request($single_record_url, $options);
+                if(!empty($data)){
+                  $data = drupal_json_decode($data->data);
+                  if(array_key_exists('error', $data)){
+                    watchdog('Tripal WS', '<pre>Web Services data unavailable because site is returning error: '. print_r($data['error'], TRUE) .'</pre>');
+                    $data = '';
+                  }
+                }
+              }
             }
             }
-            else {
-              $single_record_url = $data['members'][0]['@id'];
-              $data = drupal_http_request($single_record_url, $options);
-              $data = drupal_json_decode($data->data);
-              if(array_key_exists('error', $data)){
-                watchdog('Tripal WS', '<pre>Web Services data unavailable because site is returning error: '. print_r($data['error'], TRUE) .'</pre>');
-                $data = '';
-             }
+          }
+          else */
+          if(count($data['members']) > 1) {
+            foreach($data['members'] as $member){
+              $value = tripal_ws_remote_data_single_field_pull($rd_field_name, $member['@id']);
+              $entity->{$field_name}['und'][$member['label']]['value'] = $value;
+              $entity->{$field_name}['und'][$member['label']]['remote_entity'] = $member;
+              //array_push($paged_data, $member);
             }
             }
           }
           }
+          else {
+              $member = $data['members'][0];
+              $single_record_url = $member['@id'];
+              $value = tripal_ws_remote_data_single_field_pull($rd_field_name, $single_record_url);
+              if(!empty($data)){
+                $entity->{$field_name}['und'][$member['label']]['value'] = $value;
+                $entity->{$field_name}['und'][$member['label']]['remote_entity'] = $member;
+                if(array_key_exists('error', $data)){
+                  watchdog('Tripal WS', '<pre>Web Services data unavailable because site is returning error: '. print_r($data['error'], TRUE) .'</pre>');
+                  $data = '';
+                }
+              }
+          }
         }
         }
-        else {
-            $single_record_url = $data['members'][0]['@id'];
-            $data = drupal_http_request($single_record_url, $options);
-            $data = drupal_json_decode($data->data);
-            if(array_key_exists('error', $data)){
-              watchdog('Tripal WS', '<pre>Web Services data unavailable because site is returning error: '. print_r($data['error'], TRUE) .'</pre>');
-              $data = '';
-           }
-        }
-        $field_name = $this->field['field_name'];
-        $entity->{$field_name}['und'][0]['value'] = $data;
       }
       }
+      $field_name = $this->field['field_name'];
+      $entity->{$field_name}['und'][0]['value'] = $data;
     }
     }
    }
    }
    /**
    /**
@@ -202,9 +269,16 @@ class remote__data extends WebServicesField {
       '#description' => 'Build the query string that should be appended after the url. The tokens
       '#description' => 'Build the query string that should be appended after the url. The tokens
       listed below may be used in your query build.',
       listed below may be used in your query build.',
       '#default_value' => $this->instance['settings']['data_info']['query'],
       '#default_value' => $this->instance['settings']['data_info']['query'],
-      '#rows' => 5
+      '#rows' => 5,
+      '#required' => TRUE
+    );
+    $element['data_info']['rd_field_name'] = array(
+      '#type' => 'textfield',
+      '#title' => 'Field',
+      '#description' => 'Name of the field you would like to display.',
+      '#default_value' => $this->instance['settings']['data_info']['rd_field_name'],
+      '#required' => TRUE
     );
     );
-
     $element['data_info']['token_display']['tokens'] = array(
     $element['data_info']['token_display']['tokens'] = array(
       '#type' => 'hidden',
       '#type' => 'hidden',
       '#value' => serialize($tokens)
       '#value' => serialize($tokens)
@@ -250,13 +324,6 @@ class remote__data extends WebServicesField {
 			return $element;
 			return $element;
   }
   }
 
 
-    /**
-     * Ajax callback.
-     */
-    function tripal_ws_url_query_test_ajax($form, $form_state) {
-      load();
-      return $element['test_button']['data'];
-    }
  /**
  /**
    *
    *
    * @param unknown $form
    * @param unknown $form

+ 47 - 5
tripal_ws/includes/TripalFields/remote__data/remote__data_formatter.inc

@@ -73,8 +73,42 @@ class remote__data_formatter extends WebServicesFieldFormatter {
     $settings = $display['settings'];
     $settings = $display['settings'];
     $field_name = $this->field['field_name'];
     $field_name = $this->field['field_name'];
 
 
+    //Determine if single or multiple values returned.
+    $count = count($items[0]['value']['members']);
+
+    // Case #1: A single scalar value (string, number).
+    if ($count == 1) {
+      //Array key is based on the label, grab label to specify array in $items.
+      $array_key = $items[0]['value']['members'][0]['label'];
+      foreach($items[$array_key]['value'] as $index => $array_item){
+        //Ignore all the extra ws info coming through.
+        if($index == '@context' || $index == '@id' || $index == '@type'){
+          continue;
+        }
+        else {
+          $content = $array_item;
+        }
+
+      }
+      $element[$array_key] = array(
+        '#type' => 'markup',
+        '#markup' => $content,
+      );
+    }
+    /*
+    * Case #2: An array of scalar values (1-level deep, e.g. the obi__organism
+    * field on the gene or mRNA content type).
+    * Case #3: An array of nested scalar values (2 or more levels deep.  e.g.
+    * the sbo__relationship field on all data types, but easily visible on mRNA content tpyes).
+    */
+    else if ($count > 1) {
+
+
+    }
+
+
     //Check that the load function returned content.
     //Check that the load function returned content.
-    if (!empty($items[0]['value'])){
+    /*if (!empty($items[0]['value'])){
       $list = array();
       $list = array();
       foreach ($items as $index => $item) {
       foreach ($items as $index => $item) {
         $list[$index] = $item['value'];
         $list[$index] = $item['value'];
@@ -97,10 +131,18 @@ class remote__data_formatter extends WebServicesFieldFormatter {
         $header = array($items[0]['value']['label']);
         $header = array($items[0]['value']['label']);
         $members = $content['members'];
         $members = $content['members'];
         $rows = array();
         $rows = array();
-        // Wrap each item in an array incase it is an array so that
+        // Wrap each item in an array so that
         // it works with the table_theme
         // it works with the table_theme
         foreach($members as $index => $member){
         foreach($members as $index => $member){
-          $rows[] = array('data' => array($index, $item));
+          if(is_array($member)){
+            $rows[] = array('data' => array($index, $member));
+            foreach($member as $array_index => $array_member_item){
+              $rows[] = array('data' => array($array_index, $array_member_item));
+            }
+          }
+          else{
+            $rows[] = array('data' => array($index, $member));
+          }
         }
         }
         //Remove the context information which is not needed.
         //Remove the context information which is not needed.
         unset($rows[0]);
         unset($rows[0]);
@@ -108,7 +150,7 @@ class remote__data_formatter extends WebServicesFieldFormatter {
       else {
       else {
         $header = array($items[0]['value']['label']);
         $header = array($items[0]['value']['label']);
         $rows = array();
         $rows = array();
-        // Wrap each item in an array incase it is an array so that
+        // Wrap each item in an array so that
         // it works with the table_theme.
         // it works with the table_theme.
         foreach($content as $index => $item){
         foreach($content as $index => $item){
           $rows[] = array('data' => array($index, $item));
           $rows[] = array('data' => array($index, $item));
@@ -141,7 +183,7 @@ class remote__data_formatter extends WebServicesFieldFormatter {
           '#markup' => $content,
           '#markup' => $content,
         );
         );
       }
       }
-    }
+    }*/
   }
   }
   /**
   /**
    * Provides a summary of the formatter settings.
    * Provides a summary of the formatter settings.

+ 20 - 1
tripal_ws/tripal_ws.module

@@ -415,4 +415,23 @@ function tripal_ws_load_remote_entity($site_id, $api_version, $ctype, $id) {
 
 
   return $content;
   return $content;
 
 
-}
+}
+
+function tripal_ws_form_field_ui_field_edit_form_alter(&$form, &$form_state, $form_id) {
+  if ($form['#instance']['entity_type'] == 'TripalEntity') {
+      $form['field']['cardinality']['#access'] = FALSE;
+  }
+}
+
+/*
+* Returns the decoded json data for a specific field.
+*/
+function tripal_ws_remote_data_single_field_pull($field, $entity_url){
+  $options = array();
+  $full_url = $entity_url . '/' . $field;
+  $data = drupal_http_request($full_url, $options);
+  if(!empty($data)){
+    $data = drupal_json_decode($data->data);
+  }
+  return $data;
+}