You are here

class commerce_reports_handler_field_date in Commerce Reporting 7.3

@file Views field handler for the created date on orders.

Provides decent sorting, granularity and interpolation for missing dates.

Hierarchy

Expanded class hierarchy of commerce_reports_handler_field_date

1 string reference to 'commerce_reports_handler_field_date'
commerce_reports_views_data_alter in includes/views/commerce_reports.views.inc
Implements hook_views_data_alter().

File

includes/views/commerce_reports_handler_field_date.inc, line 9
Views field handler for the created date on orders.

View source
class commerce_reports_handler_field_date extends views_handler_field {
  var $granularities = array(
    'Y-m' => array(
      'label' => 'Monthly',
      'interval' => 2764800,
      'normalizationFunction' => '_normalizeMonthly',
      'displayFormat' => 'F Y',
    ),
    'o-W' => array(
      'label' => 'Weekly',
      'interval' => 604800,
      'normalizationFunction' => '_normalizeWeekly',
    ),
    'Y-m-d' => array(
      'label' => 'Daily',
      'interval' => 86400,
    ),
  );
  protected function _normalizeWeekly($timestamp) {
    return strtotime('this week UTC', $timestamp);
  }
  protected function _normalizeMonthly($timestamp) {

    // Workaround for PHP 5.2; PHP 5.3 works with 'first day of this month'
    return strtotime(date('Y-m', strtotime('this month UTC', $timestamp)) . ' UTC');
  }
  function option_definition() {
    $options = parent::option_definition();
    $options['exposed'] = array(
      'default' => FALSE,
    );
    $options['default_granularity'] = array(
      'default' => 'Y-m',
    );
    $options['default_period'] = array(
      'default' => '2592000',
    );
    return $options;
  }
  function can_expose() {
    return TRUE;
  }
  function exposed_form(&$form, &$form_state) {
    if (empty($this->options['exposed'])) {
      return;
    }
    $form['granularity'] = array(
      '#type' => 'select',
      '#title' => t('Granularity'),
      '#options' => $this
        ->granularityOptions(),
      '#default_value' => $this->options['default_granularity'],
    );
    $timestamp = REQUEST_TIME - $this->options['default_period'];
    $form['startDate'] = array(
      '#type' => 'date',
      '#title' => t('Start date'),
      '#default_value' => array(
        'day' => format_date($timestamp, 'custom', 'j'),
        'month' => format_date($timestamp, 'custom', 'n'),
        'year' => format_date($timestamp, 'custom', 'Y'),
      ),
    );
    $form['endDate'] = array(
      '#type' => 'date',
      '#title' => t('End date'),
      '#default_value' => array(),
    );
  }
  function accept_exposed_input($input) {
    if (empty($this->options['exposed'])) {
      return TRUE;
    }
    if (!empty($input['granularity']) && in_array($input['granularity'], array_keys($this
      ->granularityOptions()))) {
      $this->granularity = $input['granularity'];
    }
    else {
      return FALSE;
    }
    if (is_array($input['startDate']) && is_array($input['endDate'])) {
      $start = mktime(0, 0, 0, $input['startDate']['month'], $input['startDate']['day'], $input['startDate']['year']);
      $end = mktime(0, 0, 0, $input['endDate']['month'], $input['endDate']['day'], $input['endDate']['year']);
    }
    else {
      return FALSE;
    }
    if ($end > $start) {
      $this->startDate = $start;
      $this->endDate = $end;
    }
    else {
      return FALSE;
    }
    $this->startDate = $this
      ->convertTimestamp($this->startDate);
    $this->endDate = $this
      ->convertTimestamp($this->endDate);
    return TRUE;
  }
  function convertTimestamp($timestamp) {
    if (!is_numeric($timestamp)) {
      $timestamp = strtotime('today UTC');
    }
    else {
      $timestamp = strtotime('today UTC', $timestamp);
    }
    if (!empty($this->granularities[$this
      ->getFormat()]['normalizationFunction'])) {
      $timestamp = $this
        ->{$this->granularities[$this
        ->getFormat()]['normalizationFunction']}($timestamp);
    }
    return $timestamp;
  }
  function options_form(&$form, &$form_state) {
    parent::options_form($form, $form_state);
    $form['exposed'] = array(
      '#type' => 'checkbox',
      '#title' => t('Expose this filter to visitors, to allow them to change it'),
      '#default_value' => $this->options['exposed'],
    );
    $form['default_granularity'] = array(
      '#type' => 'select',
      '#title' => t('Default granularity'),
      '#options' => $this
        ->granularityOptions(),
      '#default_value' => $this->options['default_granularity'],
    );
    $form['default_period'] = array(
      '#type' => 'select',
      '#title' => t('Default time period'),
      '#options' => array(
        '604800' => t('One week'),
        '2592000' => t('One month'),
        '31556926' => t('One year'),
      ),
      '#default_value' => $this->options['default_period'],
    );
  }
  function granularityOptions() {
    static $cache;
    if (empty($cache)) {
      $cache = array();
      foreach ($this->granularities as $format => $data) {
        $cache[$format] = $data['label'];
      }
    }
    return $cache;
  }
  function getFormat() {
    if (!empty($this->options['exposed']) && !empty($this->granularity)) {
      return $this->granularity;
    }
    return $this->options['default_granularity'];
  }
  function getInterval() {
    return $this->granularities[$this
      ->getFormat()]['interval'];
  }

  /**
   * Makes sure a start and end date are set
   */
  function pre_query() {

    // If no endDate is set, set it to today.
    if (empty($this->endDate)) {
      $this->endDate = $this
        ->convertTimestamp(time());
    }

    // If no startDate is set, set it to the end date minus the default period.
    if (empty($this->startDate)) {
      $this->startDate = $this
        ->convertTimestamp($this->endDate - $this->options['default_period']);
    }
  }

  /**
   * Adds the date to the query.
   * Adds GROUP BY and ORDER BY clause.
   */
  function query() {
    $this
      ->ensure_my_table();
    $this->field_alias = sprintf("%s_%s_granularity", $this->table_alias, $this->real_field);
    $params = $this->options['group_type'] != 'group' ? array(
      'function' => $this->options['group_type'],
    ) : array();
    $this->query
      ->add_field($this->table_alias, $this->real_field, $this->field_alias, $params);

    // We group by the field using a SQL function to transform the timestamp to certain formats.
    // This way the database does the aggregation for us.
    $field_name = views_date_sql_format($this
      ->getFormat(), $this->table_alias . '.' . $this->real_field);
    $this->query
      ->add_groupby($field_name);
    $end_date = $this->endDate + $this
      ->getInterval();
    $this->query
      ->add_where_expression(0, "{$this->table_alias}.{$this->real_field} BETWEEN {$this->startDate} AND {$end_date}");
    $this
      ->add_additional_fields();
  }
  function render($values) {
    $timestamp = $this
      ->get_value($values);
    $format = $this
      ->getFormat();
    if (!empty($this->granularities[$format]['displayFormat'])) {
      $format = $this->granularities[$format]['displayFormat'];
    }
    $value = format_date($timestamp, 'custom', $format, 'UTC');
    return $this
      ->sanitize_value($value);
  }

  /**
   * Interpolates the missing dates linearly.
   */
  function post_execute(&$values) {
    $retrieved = array();
    foreach ($values as $record) {
      $timestamp = $this
        ->convertTimestamp($record->{$this->field_alias});
      $record->{$this->field_alias} = $timestamp;
      $retrieved[$timestamp] = $record;
    }

    // Determine order direction.
    foreach ($this->query->orderby as $order) {
      if ($order['field'] == $this->field_alias) {
        $descending = $order['direction'] == 'DESC';
        break;
      }
    }

    // If there is no order direction, then we don't need interpolation.
    if (!isset($descending)) {
      return;
    }
    $interval = $this
      ->getInterval();
    $defaults = array();
    for ($current = $this->startDate; $current <= $this->endDate; $current += $interval) {
      $timestamp = $this
        ->convertTimestamp($current);
      $defaults[$timestamp] = (object) array(
        $this->field_alias => $timestamp,
      );
    }
    $retrieved += $defaults;
    ksort($retrieved);
    $values = array_values($retrieved);
  }

}

Members

Namesort descending Modifiers Type Description Overrides
commerce_reports_handler_field_date::$granularities property
commerce_reports_handler_field_date::accept_exposed_input function Take input from exposed handlers and assign to this handler, if necessary. Overrides views_handler::accept_exposed_input
commerce_reports_handler_field_date::can_expose function Determine if a handler can be exposed. Overrides views_handler::can_expose
commerce_reports_handler_field_date::convertTimestamp function
commerce_reports_handler_field_date::exposed_form function Render our chunk of the exposed handler form when selecting. Overrides views_handler::exposed_form
commerce_reports_handler_field_date::getFormat function
commerce_reports_handler_field_date::getInterval function
commerce_reports_handler_field_date::granularityOptions function
commerce_reports_handler_field_date::options_form function Default options form provides the label widget that all fields should have. Overrides views_handler_field::options_form
commerce_reports_handler_field_date::option_definition function Information about options for all kinds of purposes will be held here. Overrides views_handler_field::option_definition
commerce_reports_handler_field_date::post_execute function Interpolates the missing dates linearly. Overrides views_handler::post_execute
commerce_reports_handler_field_date::pre_query function Makes sure a start and end date are set Overrides views_handler::pre_query
commerce_reports_handler_field_date::query function Adds the date to the query. Adds GROUP BY and ORDER BY clause. Overrides views_handler_field::query
commerce_reports_handler_field_date::render function Render the field. Overrides views_handler_field::render
commerce_reports_handler_field_date::_normalizeMonthly protected function
commerce_reports_handler_field_date::_normalizeWeekly protected function
views_handler::$handler_type public property The type of the handler, for example filter/footer/field.
views_handler::$query public property Where the $query object will reside:. 1
views_handler::$real_field public property The actual field in the database table, maybe different on other kind of query plugins/special handlers.
views_handler::$relationship public property The relationship used for this field.
views_handler::$table_alias public property The alias of the table of this handler which is used in the query.
views_handler::$view public property The top object of a view. Overrides views_object::$view
views_handler::access public function Check whether current user has access to this handler. 10
views_handler::broken public function Determine if the handler is considered 'broken'. 6
views_handler::case_transform public function Transform a string by a certain method.
views_handler::ensure_my_table public function Ensure the main table for this handler is in the query. This is used a lot. 8
views_handler::exposed_info public function Get information about the exposed form for the form renderer. 1
views_handler::exposed_submit public function Submit the exposed handler form.
views_handler::exposed_validate public function Validate the exposed handler form. 4
views_handler::expose_form public function Form for exposed handler options. 2
views_handler::expose_options public function Set new exposed option defaults when exposed setting is flipped on. 2
views_handler::expose_submit public function Perform any necessary changes to the form exposes prior to storage. There is no need for this function to actually store the data.
views_handler::expose_validate public function Validate the options form. 1
views_handler::extra_options public function Provide defaults for the handler.
views_handler::extra_options_form public function Provide a form for setting options. 1
views_handler::extra_options_submit public function Perform any necessary changes to the form values prior to storage. There is no need for this function to actually store the data.
views_handler::extra_options_validate public function Validate the options form.
views_handler::get_field public function Shortcut to get a handler's raw field value.
views_handler::get_join public function Get the join object that should be used for this handler.
views_handler::groupby_form public function Provide a form for aggregation settings. 1
views_handler::groupby_form_submit public function Perform any necessary changes to the form values prior to storage. There is no need for this function to actually store the data. 1
views_handler::has_extra_options public function If a handler has 'extra options' it will get a little settings widget and another form called extra_options. 1
views_handler::is_a_group public function Returns TRUE if the exposed filter works like a grouped filter. 1
views_handler::is_exposed public function Determine if this item is 'exposed', meaning it provides form elements to let users modify the view.
views_handler::multiple_exposed_input public function Define if the exposed input has to be submitted multiple times. This is TRUE when exposed filters grouped are using checkboxes as widgets. 1
views_handler::needs_style_plugin public function Determine if the argument needs a style plugin. 1
views_handler::options_validate public function Validate the options form. 4
views_handler::placeholder public function Provides a unique placeholders for handlers.
views_handler::sanitize_value public function Sanitize the value for output.
views_handler::set_relationship public function Called just prior to query(), this lets a handler set up any relationship it needs.
views_handler::show_expose_button public function Shortcut to display the expose/hide button. 2
views_handler::show_expose_form public function Shortcut to display the exposed options form.
views_handler::store_exposed_input public function If set to remember exposed input in the session, store it there. 1
views_handler::use_group_by public function Provides the handler some groupby. 2
views_handler::validate public function Validates the handler against the complete View. 1
views_handler_field::$additional_fields public property Stores additional fields which get added to the query. The generated aliases are stored in $aliases.
views_handler_field::$aliases public property
views_handler_field::$field_alias public property
views_handler_field::$last_render_index protected property Keeps track of the last render index.
views_handler_field::$original_value public property The field value prior to any rewriting.
views_handler_field::add_additional_fields public function Add 'additional' fields to the query.
views_handler_field::add_self_tokens public function Add any special tokens this field might use for itself. 4
views_handler_field::admin_summary public function Provide extra data to the administration form Overrides views_handler::admin_summary
views_handler_field::advanced_render public function Render a field using advanced settings.
views_handler_field::allow_advanced_render public function Determine if this field can allow advanced rendering. 1
views_handler_field::click_sort public function Called to determine what to tell the clicksorter. 1
views_handler_field::click_sortable public function Determine if this field is click sortable. 1
views_handler_field::construct public function Construct a new field handler. Overrides views_object::construct 17
views_handler_field::document_self_tokens public function Document any special tokens this field might use for itself. 4
views_handler_field::element_classes public function Return the class of the field.
views_handler_field::element_label_classes public function Return the class of the field's label.
views_handler_field::element_label_type public function Return an HTML element for the label based upon the field's element type.
views_handler_field::element_type public function Return an HTML element based upon the field's element type. 2
views_handler_field::element_wrapper_classes public function Return the class of the field's wrapper.
views_handler_field::element_wrapper_type public function Return an HTML element for the wrapper based upon the field's element type.
views_handler_field::get_elements public function Provide a list of elements valid for field HTML.
views_handler_field::get_render_tokens public function Get the 'render' tokens to use for advanced rendering.
views_handler_field::get_token_values_recursive public function Recursive function to add replacements for nested query string parameters.
views_handler_field::get_value public function Get the value that's supposed to be rendered. 3
views_handler_field::init public function Init the handler with necessary data. Overrides views_handler::init 11
views_handler_field::is_value_empty public function Checks if a field value is empty.
views_handler_field::label public function Get this field's label.
views_handler_field::options_submit public function Performs some cleanup tasks on the options array before saving it. Overrides views_handler::options_submit 1
views_handler_field::pre_render public function Run before any fields are rendered. 8
views_handler_field::render_altered public function Render this field as altered text, from a fieldset set by the user.
views_handler_field::render_as_link public function Render this field as a link, with info from a fieldset set by the user.
views_handler_field::render_text public function Perform an advanced text render for the item.
views_handler_field::render_trim_text public function Trim the field down to the specified length.
views_handler_field::theme public function Call out to the theme() function.
views_handler_field::theme_functions public function Build a list of suitable theme functions for this view.
views_handler_field::tokenize_value public function Replace a value with tokens from the last field.
views_handler_field::ui_name public function Return a string representing this handler's name in the UI. Overrides views_handler::ui_name 1
views_handler_field::use_string_group_by public function Determines if this field will be available as an option to group the result by in the style settings.
views_object::$definition public property Handler's definition.
views_object::$options public property Except for displays, options for the object will be held here. 1
views_object::altered_option_definition function Collect this handler's option definition and alter them, ready for use.
views_object::destroy public function Destructor. 2
views_object::export_option public function 1
views_object::export_options public function
views_object::export_option_always public function Always exports the option, regardless of the default value.
views_object::options Deprecated public function Set default options on this object. 1
views_object::set_default_options public function Set default options.
views_object::set_definition public function Let the handler know what its full definition is.
views_object::unpack_options public function Unpack options over our existing defaults, drilling down into arrays so that defaults don't get totally blown away.
views_object::unpack_translatable public function Unpack a single option definition.
views_object::unpack_translatables public function Unpacks each handler to store translatable texts.
views_object::_set_option_defaults public function