Explorar o código

Tripal: Fix to node optional handler

laceysanderson %!s(int64=13) %!d(string=hai) anos
pai
achega
7b03634e5f

+ 3 - 0
tripal_core/tripal_core.views.inc

@@ -78,6 +78,9 @@ function tripal_core_views_handlers() {
      'views_handler_filter_chado_boolean' => array(
       'parent' => 'views_handler_filter_boolean_operator',
      ),
+     'views_handler_many2many_relationship' => array(
+      'parent' => 'views_handler_relationship',
+     ),
    ),
  );
 }

+ 39 - 61
tripal_core/views/handlers/views_handler_field_node_optional.inc

@@ -20,71 +20,49 @@ class views_handler_field_node_optional extends views_handler_field_node {
    * Add chado_* and *_node alias'd left joins to the table
    */
   function query() {
-    parent::query();
-    if (!preg_match('/'.$this->options[table].'/', $this->view->base_table)) {
-      // chado_* ======================================================
-      $drupal_chado_table_name = 'chado_'.$this->options[table];
-      
-      // add to table_queue--------------------------------------------
-      $drupal_chado_table_join['table'] = $drupal_chado_table_name;
-      $drupal_chado_table_join['num'] = 1;
-      $drupal_chado_table_join['alias'] = $drupal_chado_table_name;
-      $drupal_chado_table_join['relationship'] = $this->options[table];
-
-      $drupal_chado_table_join['join'] = clone($this->query->table_queue[$this->options[table]]['join']);
-      $drupal_chado_table_join['join']->table = $drupal_chado_table_name;
-      $drupal_chado_table_join['join']->left_table = $this->options[table];
-      
-      $drupal_chado_table_join['join']->definition['table'] = $drupal_chado_table_name;
-      $drupal_chado_table_join['join']->definition['left_table'] = $this->options[table];
-
-      $this->query->table_queue[$drupal_chado_table_name] = $drupal_chado_table_join;
-
-      // add to table--------------------------------------------------
-      $this->query->tables[$this->view->base_table][$drupal_chado_table_name] = array(
-        'count' => 1,
-        'alias' => $drupal_chado_table_name,
-      );
-      
-      // node ============================================================
-      $drupal_node_table_alias = $this->options[table].'_node';
-      
-      // add to table_queue--------------------------------------------
-      $drupal_node_table_join['table'] = 'node';
-      $drupal_node_table_join['num'] = 1;
-      $drupal_node_table_join['alias'] = $drupal_node_table_alias;
-      $drupal_node_table_join['relationship'] = $this->options[table];
-
-      if ($this->query->table_queue['node']['join']) {
-        $drupal_node_table_join['join'] = clone($this->query->table_queue['node']['join']);
-      } elseif ($this->query->table_queue[$drupal_chado_table_name]['join']) {
-        $drupal_node_table_join['join'] = clone($this->query->table_queue[$drupal_chado_table_name]['join']);
-      } else {
-        
+    
+    // Check what we have (ie: current table? node table? )
+    $chado_table = 'chado_' . $this->table;
+    foreach ($this->query->table_queue as $table_def) {
+      //check is $this->table
+      if ($table_def['table'] == $this->table) {
+        $this_table_alias = $table_def['alias'];
       }
-      $drupal_node_table_join['join']->table = 'node';
-      $drupal_node_table_join['join']->field = 'nid';
-      $drupal_node_table_join['join']->left_field = 'nid';
-      $drupal_node_table_join['join']->left_table = $drupal_chado_table_name;
-      $drupal_node_table_join['join']->definition['left_table'] = $drupal_chado_table_name;
-      
-      $this->query->table_queue[$drupal_node_table_alias] = $drupal_node_table_join;
-
-      // add to table--------------------------------------------------
-      $this->query->tables[$this->view->base_table][$drupal_node_table_alias] = array(
-        'count' => 1,
-        'alias' => $drupal_node_table_alias,
-      );
       
-      // add field and set alias ===========================
-      $field_alias = $this->options[table].'_node_nid';
-      $this->query->add_field($drupal_node_table_alias, 'nid');
-      $this->add_additional_fields();
+      // check is node joined to #this->table
+      if ($table_def['table'] == $chado_table) {
+        $node_table_alias = $table_def['alias'];
+      }
+    }
+    
+    // First: Add the main field-----------------------------------------------
+    if (!$this_table_alias) {
+      $this_table_alias = $this->ensure_my_table();
+    }
+    $field_alias = $this->query->add_field($this_table_alias, $this->real_field); 
+    $this->aliases[ $this->real_field ] = $field_alias;
+    $this->field_alias = $field_alias;
+    
+    // Second: Add nid field and Joins if necessary----------------------------
+    // Add node join if needed
+    if (!$node_table_alias) {
+      $def['table'] = $chado_table;
+      $def['field'] = $this->table . '_id';
+      $def['left_table'] = $this_table_alias;
+      $def['left_field'] = $this->table . '_id';
       
-      $this->aliases['nid'] = $field_alias;     
-    } else {
-      $this->aliases['nid'] = 'node_nid';
+      $join = new views_join();
+      $join->definition = $def;
+      $join->construct();
+      $join->adjusted = TRUE;
+    
+      $node_table_alias = $this->query->add_relationship($def['table'], $join, $def['table']);
     }
+    
+    // Finally Add Field
+    $field_alias = $this->query->add_field($node_table_alias, 'nid'); 
+    $this->aliases['nid'] = $field_alias;   
+
   }
 
   /**