You are here

function _date_views_query_alter in Date 5.2

Same name and namespace in other branches
  1. 5 date_views.inc \_date_views_query_alter()

Implementation of hook_views_query().

Used to make sure Date Browser view defaults to current date if no date selected

1 call to _date_views_query_alter()
date_views_query_alter in date/date.module

File

date/date_views.inc, line 576

Code

function _date_views_query_alter(&$query, &$view) {
  require_once './' . drupal_get_path('module', 'date_api') . '/date_api_sql.inc';
  $date_views_browser_views = date_views_browser_get_views();
  if (in_array($view->name, array_keys($date_views_browser_views))) {
    $name = explode(':', $view->argument[0]['type']);
    $tofield_name = trim($name[1]);
    $field_name = drupal_substr($tofield_name, 0, 3) == 'to|' ? drupal_substr($tofield_name, 3) : $tofield_name;
    $value = $field_name != $tofield_name ? 'value2' : 'value';
    $field = content_fields($field_name);
    $db_info = content_database_info($field);
    $table = 'node_data_' . $field['field_name'];
    $date_handler = new date_sql_handler();
    $date_handler
      ->construct($field['type']);
    date_views_set_timezone($date_handler, $field);
    $view->date_handler = $date_handler;

    // Add a combo FROM|TO date field to the query
    $value = $db_info['columns']['value']['column'];
    $value2 = !empty($db_info['columns']['value2']['column']) ? $db_info['columns']['value2']['column'] : $db_info['columns']['value']['column'];
    $value1 = $table . '.' . $value;
    $value2 = date_sql_coalesce(array(
      $table . '.' . $value2,
      $table . '.' . $value,
    ));
    $combo = date_sql_concat(array(
      $value1,
      "'|'",
      $value2,
    )) . ' AS date_combo ';
    $query
      ->add_field($combo, NULL);
    $path = explode('/', $view->url);
    $pos = sizeof($path);
    if ($view->build_type == 'block' || arg($pos) == '') {
      $arg = NULL;
    }
    else {
      $arg = arg($pos);
    }

    // If no argument is specified, the argument handling won't get executed.
    // Add the current date range to the query.
    if ($arg == NULL) {
      $period = $view->argument[0]['options'];
      $format = $date_handler
        ->views_formats($period, 'sql');
      $arg = date_views_browser_period_arg(NULL, $view->argument[0]['options']);
      if ($range = $view->date_handler
        ->arg_range($arg)) {
        $query
          ->ensure_table($table);
        $query
          ->add_field('nid', 'node');
        $query
          ->add_field($value, $table);
        $sql_field = "{$table}.{$value}";
        $query
          ->add_where($date_handler
          ->sql_where_date('DATE', $sql_field, ">=", date_format($range[0], DATE_FORMAT_DATETIME)));
        $query
          ->add_where($date_handler
          ->sql_where_date('DATE', $sql_field, "<=", date_format($range[1], DATE_FORMAT_DATETIME)));
      }
    }
    else {
      $range = $view->date_handler
        ->arg_range($arg);
    }
    $view->min_date = $range[0];
    $view->max_date = $range[1];
    if (empty($view->date_fields)) {
      $view->date_fields = array();
    }
    $view->date_fields[] = $field_name;
  }
}