diff openmindattribute/views/link_views_handler_argument_target.inc @ 0:124ef8f3b22d

initial
author Dirk Wintergruen <dwinter@mpiwg-berlin.mpg.de>
date Fri, 27 Mar 2015 19:21:42 +0100
parents
children
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/openmindattribute/views/link_views_handler_argument_target.inc	Fri Mar 27 19:21:42 2015 +0100
@@ -0,0 +1,149 @@
+<?php
+
+/**
+ * @file
+ * Argument handler to filter results by target.
+ */
+
+/**
+ * Argument handler to filter results by target.
+ */
+class link_views_handler_argument_target extends views_handler_argument {
+
+  /**
+   * Provide defaults for the argument when a new one is created.
+   */
+  function options(&$options) {
+    parent::options($options);
+  }
+
+  /**
+   * Provide a default options form for the argument.
+   */
+  function options_form(&$form, &$form_state) {
+    $defaults = $this->default_actions();
+
+    $form['title'] = array(
+      '#prefix' => '<div class="clear-block">',
+      '#suffix' => '</div>',
+      '#type' => 'textfield',
+      '#title' => t('Title'),
+      '#default_value' => $this->options['title'],
+      '#description' => t('The title to use when this argument is present; it will override the title of the view and titles from previous arguments. You can use percent substitution here to replace with argument titles. Use "%1" for the first argument, "%2" for the second, etc.'),
+    );
+
+    $form['clear_start'] = array(
+      '#value' => '<div class="clear-block">',
+    );
+
+    $form['defaults_start'] = array(
+      '#value' => '<div class="views-left-50">',
+    );
+
+    $form['default_action'] = array(
+      '#type' => 'radios',
+      '#title' => t('Action to take if argument is not present'),
+      '#default_value' => $this->options['default_action'],
+    );
+
+    $form['defaults_stop'] = array(
+      '#value' => '</div>',
+    );
+
+    $form['wildcard'] = array(
+      '#prefix' => '<div class="views-right-50">',
+      // prefix and no suffix means these two items will be grouped together.
+      '#type' => 'textfield',
+      '#title' => t('Wildcard'),
+      '#size' => 20,
+      '#default_value' => $this->options['wildcard'],
+      '#description' => t('If this value is received as an argument, the argument will be ignored; i.e, "all values"'),
+    );
+
+    $form['wildcard_substitution'] = array(
+      '#suffix' => '</div>',
+      '#type' => 'textfield',
+      '#title' => t('Wildcard title'),
+      '#size' => 20,
+      '#default_value' => $this->options['wildcard_substitution'],
+      '#description' => t('The title to use for the wildcard in substitutions elsewhere.'),
+    );
+
+    $form['clear_stop'] = array(
+      '#value' => '</div>',
+    );
+
+    $options = array();
+    $validate_options = array();
+    foreach ($defaults as $id => $info) {
+      $options[$id] = $info['title'];
+      if (empty($info['default only'])) {
+        $validate_options[$id] = $info['title'];
+      }
+      if (!empty($info['form method'])) {
+        $this->{$info['form method']}($form, $form_state);
+      }
+    }
+
+    $form['default_action']['#options'] = $options;
+
+    $form['validate_type'] = array(
+      '#type' => 'select',
+      '#title' => t('Validator'),
+      '#default_value' => $this->options['validate_type'],
+    );
+
+    $validate_types = array('none' => t('- Basic validation -'));
+    $plugins = views_fetch_plugin_data('argument validator');
+    foreach ($plugins as $id => $info) {
+      $valid = TRUE;
+      if (!empty($info['type'])) {
+        $valid = FALSE;
+        if (empty($this->definition['validate type'])) {
+          continue;
+        }
+        foreach ((array) $info['type'] as $type) {
+          if ($type == $this->definition['validate type']) {
+            $valid = TRUE;
+            break;
+          }
+        }
+      }
+
+      // If we decide this validator is ok, add it to the list.
+      if ($valid) {
+        $plugin = views_get_plugin('argument validator', $id);
+        if ($plugin) {
+          $plugin->init($this->view, $this, $id);
+          if ($plugin->access()) {
+            $plugin->validate_form($form, $form_state, $id);
+            $validate_types[$id] = $info['title'];
+          }
+        }
+      }
+    }
+
+    asort($validate_types);
+    $form['validate_type']['#options'] = $validate_types;
+    // Show this gadget if *anything* but 'none' is selected
+
+    $form['validate_fail'] = array(
+      '#type' => 'select',
+      '#title' => t('Action to take if argument does not validate'),
+      '#default_value' => $this->options['validate_fail'],
+      '#options' => $validate_options,
+    );
+  }
+
+  /**
+   * Set up the query for this argument.
+   *
+   * The argument sent may be found at $this->argument.
+   */
+  function query($group_by = FALSE) {
+    $this->ensure_my_table();
+    // Because attributes are stored serialized, our only option is to also
+    // serialize the data we're searching for and use LIKE to find similar data.
+    $this->query->add_where(0, $this->table_alias . '.' . $this->real_field . " LIKE '%%%s%'", serialize(array('target' => $this->argument)));
+  }
+}