123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122 |
- <?php
- module_load_include('inc', 'views', 'includes/base');
- module_load_include('inc', 'views', 'includes/handlers');
- class views_handler_join_chado_through_linking extends views_join {
- // PHP 4 doesn't call constructors of the base class automatically from a
- // constructor of a derived class. It is your responsibility to propagate
- // the call to constructors upstream where appropriate.
- function construct($table = NULL, $left_table = NULL, $left_field = NULL, $field = NULL, $extra = array(), $type = 'LEFT', $added = NULL) {
- parent::construct($table, $left_table, $left_field, $field, $extra, $type);
- }
- /**
- * Creates SQL for both joins table => linking_table and linking_table => left_table
- * NOTE: Uses fields in definition as passed in from hook_views_data join definition
- */
- function join($table, &$query) {
- $output = '';
- $joins = array();
- $joins[] = $this->create_single_join(
- $query,
- array(
- 'table' => $this->definition['linking']['table'],
- 'field' => $this->definition['linking']['left_field'],
- 'is_drupal' => FALSE,
- ),
- array(
- 'table' => $this->definition['left_table'],
- 'field' => $this->definition['left_field'],
- ),
- 'LEFT'
- );
- $joins[] = $this->create_single_join(
- $query,
- array(
- 'table' => $this->definition['table'],
- 'field' => $this->definition['field'],
- 'is_drupal' => $this->definition['table_is_drupal'],
- ),
- array(
- 'table' => $this->definition['linking']['table'],
- 'field' => $this->definition['linking']['field'],
- ),
- 'LEFT'
- );
- $output .= implode("\n", $joins);
- return $output;
- }
- /**
- * Creates SQL for a single join based on parameters
- */
- function create_single_join(&$query, $right_spec, $left_spec, $join_type) {
- if ($right_spec['table']) {
- $right = $query->get_table_info($right_spec['table']);
- if (!$right['alias']) {
- $right['alias'] = $right_spec['table'];
- }
- $right_field = "$right[alias].$right_spec[field]";
- if ($right_spec['is_drupal']) {
- $right_table = '{' . $right_spec['table'] . '}';
- }
- else {
- $right_table = $right_spec['table'];
- }
- }
- if ($left_spec['table']) {
- $left = $query->get_table_info($left_spec['table']);
- if (!$left['alias']) {
- $left['alias'] = $left_spec['table'];
- }
- $left_field = "$left[alias].$left_spec[field]";
- }
- else {
- // This can be used if left_field is a formula or something. It should be used only *very* rarely.
- $left_field = $this->left_spec['field'];
- }
- $output = " $join_type JOIN $right_table $right[alias] ON $left_field = $right_field";
- return $output;
- }
- }
|