You are here

class quiz_views_handler_argument_quiz_nid in Quiz 8.4

Same name and namespace in other branches
  1. 6.6 includes/views/handlers/quiz_views_handler_argument_quiz_nid.inc \quiz_views_handler_argument_quiz_nid
  2. 6.3 includes/views/handlers/quiz_views_handler_argument_quiz_nid.inc \quiz_views_handler_argument_quiz_nid
  3. 6.4 includes/views/handlers/quiz_views_handler_argument_quiz_nid.inc \quiz_views_handler_argument_quiz_nid
  4. 6.5 includes/views/handlers/quiz_views_handler_argument_quiz_nid.inc \quiz_views_handler_argument_quiz_nid
  5. 7.6 includes/views/handlers/quiz_views_handler_argument_quiz_nid.inc \quiz_views_handler_argument_quiz_nid
  6. 7 includes/views/handlers/quiz_views_handler_argument_quiz_nid.inc \quiz_views_handler_argument_quiz_nid
  7. 7.4 includes/views/handlers/quiz_views_handler_argument_quiz_nid.inc \quiz_views_handler_argument_quiz_nid

Hierarchy

Expanded class hierarchy of quiz_views_handler_argument_quiz_nid

1 string reference to 'quiz_views_handler_argument_quiz_nid'
quiz_views_data in includes/views/quiz.views.inc
Implementation of hook_views_data().

File

includes/views/handlers/quiz_views_handler_argument_quiz_nid.inc, line 8

View source
class quiz_views_handler_argument_quiz_nid extends views_handler_argument_numeric {

  /**
   * An array that the subselect will fill with all the corresponding quiz node,
   * according to the configuration on the argument settings form. These vids
   * will then be the actual ones used while generating the real query.
   *
   * @var array
   */
  var $corresponding_vids = array();
  var $phrase_broken = FALSE;
  function construct() {
    parent::construct();
    $this->nid_field = $this->definition['nid field'];
    $this->vid_field = isset($this->definition['vid field']) ? $this->definition['vid field'] : 'vid';
  }
  function option_definition() {
    $options = parent::option_definition();
    $options['which_vid'] = array(
      'default' => 'latest',
    );
    return $options;
  }
  function options_form(&$form, &$form_state) {
    parent::options_form($form, $form_state);

    // Set weighting so that our element can sanely ordered
    $form['title']['#weight'] = -2;

    //    $form['default_action']['#weight'] = -3;
    //    $form['wildcard']['#weight'] = -4;
    //    $form['wildcard_substitution']['#weight'] = -4;
    $form['which_vid'] = array(
      '#type' => 'select',
      '#title' => t('Quiz revision(s) to use'),
      '#options' => array(
        'latest' => t('Latest: most recent version of the quiz ONLY.'),
        'initial' => t('Initial: original version of the quiz ONLY.'),
        'all' => t('All: ALL versions of the quiz.'),
      ),
      '#description' => t('The validator will transform the incoming quiz node id(s) into one or more quiz node revisions, depending on your selection.'),
      '#default_value' => $this->options['which_vid'],
      '#weight' => -1,
    );
  }
  function title_query() {
    $titles = array();
    $result = db_query("SELECT n.title FROM {node_revision} n WHERE n.vid IN (:vids)", array(
      ':vids' => implode(', ', $this->corresponding_vids),
    ));
    while ($term = $result
      ->fetch()) {
      $titles[] = check_plain($term->title);
    }
    return $titles;
  }

  /**
   * Override the default behavior of query() to introduce the medial step of
   * retrieving vids from the provided nids.
   */
  function query($group_by = FALSE) {
    $this
      ->ensure_my_table();
    $this
      ->break_phrase();

    // Do subselect to get relevant vids, then add where clause
    $this
      ->subselect_vids();
    $this->query
      ->add_where(0, "{$this->table_alias}.{$this->nid_field}", $this->corresponding_vids);
  }

  /**
   * Set up the argument with the vids extracted from nids.
   *
   * Needs to be done here, because this is the earliest stage at which we can
   * guarantee the contents of $this->argument to be available.
   *
   * @param string $arg
   *   The argument, as delivered in the URL.
   */
  function set_argument($arg) {
    $this->argument = $arg;
    if ($this
      ->validate_arg($arg)) {
      $this
        ->break_phrase();
      $this
        ->subselect_vids();
      return TRUE;
    }
    return FALSE;
  }
  function break_phrase() {
    if (!$this->phrase_broken) {

      // Handle multiple argument inputs
      if (!empty($this->options['break_phrase'])) {
        views_break_phrase($this->argument, $this);
      }
      else {
        $this->value = array(
          $this->argument,
        );
      }
      $this->phrase_broken = TRUE;
    }
  }

  /**
   * Helper method to retrieve the vid(s) the final view query should actually
   * be run against.
   *
   * Would be done in pre_query(), but $this->argument is not yet available at
   * that time. So, called from set_argument().
   */
  function subselect_vids() {
    $query = db_select('quiz_node_properties', 'qnp');
    if (count($this->value) > 1) {

      // Guaranteed to produce multiple values; therefore may need the group by
      $use_group_by = TRUE;
      $operator = empty($this->options['not']) ? 'IN' : 'NOT IN';
      $query
        ->condition('nid', $this->value, $operator);
    }
    else {

      // Multiple values only possible with a NOT; only then do we need group by
      $use_group_by = !empty($this->options['not']);
      $operator = empty($this->options['not']) ? '=' : '!=';
      $query
        ->condition('nid', reset($this->value), $operator);
    }
    switch ($this->options['which_vid']) {
      case 'initial':

        // SQL operation for getting the initial vids based on view config settings
        $query
          ->addExpression('MIN(vid)', 'vid');
        break;
      case 'latest':

        // SQL operation for getting the latest vids based on view config settings
        $query
          ->addExpression('MAX(vid)', 'vid');
        break;
      default:

        // Get them all
        $query
          ->addField('qnp', 'vid');
        break;
    }
    if ($use_group_by) {
      $query
        ->groupBy('nid');
    }
    $result = $query
      ->execute();
    $this->nid_field = $this->vid_field;
    $this->corresponding_vids = array();
    foreach ($result as $item) {
      $this->corresponding_vids[] = $item->vid;
    }
    return count($this->corresponding_vids) > 1;
  }

}

Members

Namesort descending Modifiers Type Description Overrides
quiz_views_handler_argument_quiz_nid::$corresponding_vids property An array that the subselect will fill with all the corresponding quiz node, according to the configuration on the argument settings form. These vids will then be the actual ones used while generating the real query.
quiz_views_handler_argument_quiz_nid::$phrase_broken property
quiz_views_handler_argument_quiz_nid::break_phrase function
quiz_views_handler_argument_quiz_nid::construct function
quiz_views_handler_argument_quiz_nid::options_form function
quiz_views_handler_argument_quiz_nid::option_definition function
quiz_views_handler_argument_quiz_nid::query function Override the default behavior of query() to introduce the medial step of retrieving vids from the provided nids.
quiz_views_handler_argument_quiz_nid::set_argument function Set up the argument with the vids extracted from nids.
quiz_views_handler_argument_quiz_nid::subselect_vids function Helper method to retrieve the vid(s) the final view query should actually be run against.
quiz_views_handler_argument_quiz_nid::title_query function