You are here

class image_gallery_handler_relationship_gallery_cover in Image 7

Same name and namespace in other branches
  1. 6 contrib/image_gallery/views/image_gallery_handler_relationship_gallery_cover.inc \image_gallery_handler_relationship_gallery_cover

Relationship handler for image gallery cover node.

This joins to the node table from the term_data table, giving us a node based on the given term. This is the gallery's cover node, which supplies the image shown in the list of galleries. Using this relationship allows the user to add any node fields to the view. The downside is that while we can consider descendant galleries too, there is no recursion: setting a depth of 1 means "give me the (best) image out of the gallery and its immediate children" -- the images are considered as a flat pool from which to pick.

This handler uses a special join object to create the relationship join on the value returned by a subquery. For example: "given term tid 1, find the nid of the most recent node with that term" in other words, the most recent image in this gallery.

The main part of the query is provided in this handler. To use this, you need to give the subquery sort order, and the subquery's correlated field (the field from the main views query on which to link) -- this is usually just 'tid'.

Define these as follows: 'relationship' => array( 'title' => t('Latest image'), 'label' => t('Cover image, latest'), 'help' => t('Relate an image gallery to its most recently updated node (does not consider child galleries).'), 'handler' => 'image_gallery_handler_relationship_gallery_cover', 'base' => 'node', 'field' => 'nid', 'correlated field' => 'tid', 'subquery order' => ' gallery_cover_node.changed DESC ', ) This example gets you a cover image that is the latest changed node.

If you need a different query, subclass this handler and override the left_query() method to return your own subquery on which to join.

Hierarchy

Expanded class hierarchy of image_gallery_handler_relationship_gallery_cover

1 string reference to 'image_gallery_handler_relationship_gallery_cover'
image_gallery_views_data_alter in contrib/image_gallery/views/image_gallery.views.inc
Implementation of hook_views_data_alter(). Add fields for image gallery (ie vocabulary terms) to the term_data table.

File

contrib/image_gallery/views/image_gallery_handler_relationship_gallery_cover.inc, line 50

View source
class image_gallery_handler_relationship_gallery_cover extends views_handler_relationship {

  /**
   * Defines default values for options.
   */
  function option_definition() {
    $options = parent::option_definition();
    $options['depth'] = array(
      'default' => array(
        1,
      ),
    );
    return $options;
  }

  /**
   * Extends the field's basic options with more image specific
   * options.
   */
  function options_form(&$form, &$form_state) {
    parent::options_form($form, $form_state);
    $form['depth'] = array(
      '#type' => 'weight',
      '#title' => t('Depth'),
      '#default_value' => $this->options['depth'],
      '#description' => t('The depth will determine how deep to look into descendant galleries to cover nodes.' . 'There is no recursion: so setting the depth to 1 will choose the best fitting node out of the pool of images in the gallery and its children taken all together.' . 'Setting this to 0 will only consider the gallery itself.'),
    );
  }

  /**
   * Return the subquery to use for the left side of the relationship join clause.
   *
   */
  function left_query() {
    $order = $this->definition['subquery order'];
    $field = $this->definition['correlated field'];
    $where_tid = $this->table_alias . '.' . $field;
    $subquery = "\nSELECT gallery_cover_node.nid FROM " . "{term_node} gallery_cover_term_node INNER JOIN {node} gallery_cover_node \n" . "ON gallery_cover_term_node.nid = gallery_cover_node.nid ";
    $where = "  WHERE gallery_cover_node.status = 1 AND " . "gallery_cover_term_node.tid = {$where_tid} ";

    // Depth: this is shamelessly ripped from views_handler_argument_term_node_tid_depth
    if ($this->options['depth'] > 0) {
      $subquery .= "    LEFT JOIN {term_hierarchy} th ON th.tid = gallery_cover_term_node.tid\n";
      $last = "th";
      foreach (range(1, abs($this->options['depth'])) as $count) {
        $subquery .= "    LEFT JOIN {term_hierarchy} th{$count} ON {$last}.parent = th{$count}.tid\n";
        $where .= "\n OR th{$count}.tid = {$where_tid}\n";
        $last = "th{$count}";
      }
    }
    else {
      if ($this->options['depth'] < 0) {
        $last = "tn";
        foreach (range(1, abs($this->options['depth'])) as $count) {
          $subquery .= "    LEFT JOIN {term_hierarchy} th{$count} ON {$last}.tid = th{$count}.parent\n";
          $where .= "\n OR th{$count}.tid = {$where_tid}\n";
          $last = "th{$count}";
        }
      }
    }
    $subquery = "{$subquery} {$where} ORDER BY {$order} LIMIT 1";
    return $subquery;
  }

  /**
   * Called to implement a relationship in a query.
   */
  function query() {

    // Figure out what base table this relationship brings to the party.
    $table_data = views_fetch_data($this->definition['base']);
    $base_field = empty($this->definition['base field']) ? $table_data['table']['base']['field'] : $this->definition['base field'];
    $this
      ->ensure_my_table();
    $def = $this->definition;
    $def['table'] = $this->definition['base'];
    $def['field'] = $base_field;
    $def['left_table'] = $this->table_alias;
    $def['left_field'] = $this->field;
    if (!empty($this->options['required'])) {
      $def['type'] = 'INNER';
    }
    if (!empty($this->definition['left query'])) {
      $def['left query'] = $this->definition['left query'];
    }
    else {
      $def['left query'] = $this
        ->left_query();
    }
    if (!empty($def['join_handler']) && class_exists($def['join_handler'])) {
      $join = new $def['join_handler']();
    }
    else {
      $join = new image_gallery_join_subquery();
    }
    $join->definition = $def;
    $join
      ->construct();
    $join->adjusted = TRUE;

    // use a short alias for this:
    $alias = $def['table'] . '_' . $this->table;
    $this->alias = $this->query
      ->add_relationship($alias, $join, $this->definition['base'], $this->relationship);
  }

}

Members

Namesort descending Modifiers Type Description Overrides
image_gallery_handler_relationship_gallery_cover::left_query function Return the subquery to use for the left side of the relationship join clause.
image_gallery_handler_relationship_gallery_cover::options_form function Extends the field's basic options with more image specific options. Overrides views_handler_relationship::options_form
image_gallery_handler_relationship_gallery_cover::option_definition function Defines default values for options. Overrides views_handler_relationship::option_definition
image_gallery_handler_relationship_gallery_cover::query function Called to implement a relationship in a query. Overrides views_handler_relationship::query
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::accept_exposed_input public function Take input from exposed handlers and assign to this handler, if necessary. 1
views_handler::access public function Check whether current user has access to this handler. 10
views_handler::admin_summary public function Provide text for the administrative summary. 4
views_handler::broken public function Determine if the handler is considered 'broken'. 6
views_handler::can_expose public function Determine if a handler can be exposed. 2
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_form public function Render our chunk of the exposed handler form when selecting. 1
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_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. 5
views_handler::options_validate public function Validate the options form. 4
views_handler::placeholder public function Provides a unique placeholders for handlers.
views_handler::post_execute public function Run after the view is executed, before the result is cached. 1
views_handler::pre_query public function Run before the view is built. 1
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::ui_name public function Return a string representing this handler's name in the UI. 9
views_handler::validate public function Validates the handler against the complete View. 1
views_handler_relationship::init public function Let relationships live on tables other than the table they operate on. Overrides views_handler::init 2
views_handler_relationship::label public function Get this field's label.
views_handler_relationship::use_group_by public function You can't groupby a relationship. Overrides views_handler::use_group_by
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::construct public function Views handlers use a special construct function. 4
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