views_handler_field_chado_relationship_all.inc 4.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101
  1. <?php
  2. // $Id: views_handler_field_term_node_tid.inc,v 1.4 2009/07/01 23:07:14 merlinofchaos Exp $
  3. /**
  4. * Field handler for terms.
  5. */
  6. class views_handler_field_chado_relationship_all extends views_handler_field_prerender_list {
  7. function init(&$view, $options) {
  8. parent::init($view, $options);
  9. }
  10. function query() {
  11. // not sure why this is needed since nothing is added to the query...
  12. $this->add_additional_fields();
  13. }
  14. function pre_render($values) {
  15. $this->aliases['relationships'] = 'relationships';
  16. $this->aliases['primary_id'] = $this->view->base_table.'_id';
  17. $this->field_alias = $this->aliases['primary_id'];
  18. $relationship_tablename = $this->view->base_table.'_relationship';
  19. $this->aliases['relationship_primary_id'] = $relationship_tablename . '_id';
  20. $table_desc = module_invoke_all('chado_'.$relationship_tablename.'_schema');
  21. foreach($table_desc['foreign keys'][$this->view->base_table]['columns'] as $k => $v) {
  22. if (preg_match('/subject/',$k)) { $subject_id = $k; }
  23. if (preg_match('/object/', $k)) { $object_id = $k; }
  24. }
  25. $this->aliases['subject_id'] = $subject_id;
  26. $this->aliases['object_id'] = $object_id;
  27. //Add values for all if possible
  28. if (!$this->view->result[0]->relationships) {
  29. //get base table primary keys
  30. $primary_ids = array();
  31. foreach ($this->view->result as $row_num => $row) {
  32. $primary_ids[$row_num] = $row->{$this->aliases['primary_id']};
  33. }
  34. //generate results from db
  35. $sql = "SELECT ".$relationship_tablename.".*, cvterm.name as type_name, "
  36. ."subject_parent.name as subject_name, object_parent.name as object_name "
  37. ."FROM ".$relationship_tablename." "
  38. ."LEFT JOIN ".$this->view->base_table." subject_parent ON "
  39. .$relationship_tablename.".".$subject_id."=subject_parent.".$this->aliases['primary_id']." "
  40. ."LEFT JOIN ".$this->view->base_table." object_parent ON "
  41. .$relationship_tablename.".".$object_id."=object_parent.".$this->aliases['primary_id']." "
  42. ."LEFT JOIN cvterm cvterm ON "
  43. .$relationship_tablename.".type_id = cvterm.cvterm_id "
  44. ."WHERE ".$relationship_tablename.".".$subject_id." IN (".implode(',',$primary_ids).") "
  45. ."OR ".$relationship_tablename.".".$object_id." IN (".implode(',',$primary_ids).") ";
  46. $previous_db = tripal_db_set_active('chado');
  47. $resource = db_query($sql);
  48. tripal_db_set_active($previous_db);
  49. //add results to views results
  50. while ($r = db_fetch_object($resource)) {
  51. if (in_array($r->{$subject_id}, $primary_ids)) {
  52. $key = array_search($r->{$subject_id}, $primary_ids);
  53. $r->{$this->aliases['primary_id']} = $r->{$subject_id};
  54. $this->view->result[$key]->relationships[] = clone $r;
  55. }
  56. if (in_array($r->{$object_id}, $primary_ids)) {
  57. $key = array_search($r->{$object_id}, $primary_ids);
  58. $r->{$this->aliases['primary_id']} = $r->{$object_id};
  59. $this->view->result[$key]->relationships[] = clone $r;
  60. }
  61. } //end of while
  62. }// end of if add values
  63. //for each stock in this view page, add the values
  64. foreach ($values as $result) {
  65. if (!empty($result->{$this->aliases['relationships']})) {
  66. // all relationships including the current stock
  67. $relationships = $result->{$this->aliases['relationships']};
  68. foreach ($relationships as $relationship) {
  69. // Add relationship to the list of items to be rendered
  70. // Note: $this->aliases['primary_id'] = base table primary key
  71. $elements = array(
  72. $this->aliases['primary_id'] => $relationship->{$this->aliases['primary_id']},
  73. $this->aliases['relationship_primary_id'] => $relationship->{$this->aliases['relationship_primary_id']},
  74. 'subject_id' => $relationship->{$this->aliases['subject_id']},
  75. 'subject_name' => $relationship->subject_name,
  76. 'object_id' => $relationship->{$this->aliases['object_id']},
  77. 'object_name' => $relationship->object_name,
  78. 'type_id' => $relationship->type_id,
  79. 'type_name' => $relationship->type_name,
  80. );
  81. $this->items[$relationship->{$this->aliases['primary_id']}][$relationship->{$this->aliases['relationship_primary_id']}] = $elements;
  82. }
  83. }
  84. }
  85. }
  86. function render_item($count, $item) {
  87. return $item['subject_name'].' '.$item['type_name'].' '.$item['object_name'];
  88. }
  89. }