Browse Source

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

Shawna 7 years ago
parent
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(
 				'query' => '',
 				'remote_site' => '',
-				'description' => '',
+        'description' => '',
+        'rd_field_name' => '',
 			),
   );
   // A boolean specifying that users should not be allowed to create
@@ -90,8 +91,9 @@ class remote__data extends WebServicesField {
   public function load($entity) {
     $site_id_ws = $this->instance['settings']['data_info']['remote_site'];
     $query = $this->instance['settings']['data_info']['query'];
+    $rd_field_name = $this->instance['settings']['data_info']['rd_field_name'];
     $options = array();
-
+    $field_name = $this->field['field_name'];
     // Check for tripal tokens and replace if present.
     $bundle_entity = tripal_load_bundle_entity(array('name' => $entity->bundle));
     $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.
      $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){
        $data = drupal_json_decode($data->data);
        //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>');
           $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
       listed below may be used in your query build.',
       '#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(
       '#type' => 'hidden',
       '#value' => serialize($tokens)
@@ -250,13 +324,6 @@ class remote__data extends WebServicesField {
 			return $element;
   }
 
-    /**
-     * Ajax callback.
-     */
-    function tripal_ws_url_query_test_ajax($form, $form_state) {
-      load();
-      return $element['test_button']['data'];
-    }
  /**
    *
    * @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'];
     $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.
-    if (!empty($items[0]['value'])){
+    /*if (!empty($items[0]['value'])){
       $list = array();
       foreach ($items as $index => $item) {
         $list[$index] = $item['value'];
@@ -97,10 +131,18 @@ class remote__data_formatter extends WebServicesFieldFormatter {
         $header = array($items[0]['value']['label']);
         $members = $content['members'];
         $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
         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.
         unset($rows[0]);
@@ -108,7 +150,7 @@ class remote__data_formatter extends WebServicesFieldFormatter {
       else {
         $header = array($items[0]['value']['label']);
         $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.
         foreach($content as $index => $item){
           $rows[] = array('data' => array($index, $item));
@@ -141,7 +183,7 @@ class remote__data_formatter extends WebServicesFieldFormatter {
           '#markup' => $content,
         );
       }
-    }
+    }*/
   }
   /**
    * 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;
 
-}
+}
+
+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;
+}