summaryrefslogtreecommitdiff
path: root/sites/all/modules/views/handlers/views_handler_filter_many_to_one.inc
diff options
context:
space:
mode:
Diffstat (limited to 'sites/all/modules/views/handlers/views_handler_filter_many_to_one.inc')
-rw-r--r--sites/all/modules/views/handlers/views_handler_filter_many_to_one.inc125
1 files changed, 125 insertions, 0 deletions
diff --git a/sites/all/modules/views/handlers/views_handler_filter_many_to_one.inc b/sites/all/modules/views/handlers/views_handler_filter_many_to_one.inc
new file mode 100644
index 000000000..f38479616
--- /dev/null
+++ b/sites/all/modules/views/handlers/views_handler_filter_many_to_one.inc
@@ -0,0 +1,125 @@
+<?php
+
+/**
+ * @file
+ * Definition of views_handler_filter_many_to_one.
+ */
+
+/**
+ * Complex filter to handle filtering for many to one relationships,
+ * such as terms (many terms per node) or roles (many roles per user).
+ *
+ * The construct method needs to be overridden to provide a list of options;
+ * alternately, the value_form and admin_summary methods need to be overriden
+ * to provide something that isn't just a select list.
+ *
+ * @ingroup views_filter_handlers
+ */
+class views_handler_filter_many_to_one extends views_handler_filter_in_operator {
+ /**
+ * @var views_many_to_one_helper
+ *
+ * Stores the Helper object which handles the many_to_one complexity.
+ */
+ var $helper = NULL;
+
+ function init(&$view, &$options) {
+ parent::init($view, $options);
+ $this->helper = new views_many_to_one_helper($this);
+ }
+
+ function option_definition() {
+ $options = parent::option_definition();
+
+ $options['operator']['default'] = 'or';
+ $options['value']['default'] = array();
+
+ if (isset($this->helper)) {
+ $this->helper->option_definition($options);
+ }
+ else {
+ $helper = new views_many_to_one_helper($this);
+ $helper->option_definition($options);
+ }
+
+ return $options;
+ }
+
+ function operators() {
+ $operators = array(
+ 'or' => array(
+ 'title' => t('Is one of'),
+ 'short' => t('or'),
+ 'short_single' => t('='),
+ 'method' => 'op_helper',
+ 'values' => 1,
+ 'ensure_my_table' => 'helper',
+ ),
+ 'and' => array(
+ 'title' => t('Is all of'),
+ 'short' => t('and'),
+ 'short_single' => t('='),
+ 'method' => 'op_helper',
+ 'values' => 1,
+ 'ensure_my_table' => 'helper',
+ ),
+ 'not' => array(
+ 'title' => t('Is none of'),
+ 'short' => t('not'),
+ 'short_single' => t('<>'),
+ 'method' => 'op_helper',
+ 'values' => 1,
+ 'ensure_my_table' => 'helper',
+ ),
+ );
+ // if the definition allows for the empty operator, add it.
+ if (!empty($this->definition['allow empty'])) {
+ $operators += array(
+ 'empty' => array(
+ 'title' => t('Is empty (NULL)'),
+ 'method' => 'op_empty',
+ 'short' => t('empty'),
+ 'values' => 0,
+ ),
+ 'not empty' => array(
+ 'title' => t('Is not empty (NOT NULL)'),
+ 'method' => 'op_empty',
+ 'short' => t('not empty'),
+ 'values' => 0,
+ ),
+ );
+ }
+
+ return $operators;
+ }
+
+ var $value_form_type = 'select';
+ function value_form(&$form, &$form_state) {
+ parent::value_form($form, $form_state);
+
+ if (empty($form_state['exposed'])) {
+ $this->helper->options_form($form, $form_state);
+ }
+ }
+
+ /**
+ * Override ensure_my_table so we can control how this joins in.
+ * The operator actually has influence over joining.
+ */
+ function ensure_my_table() {
+ // Defer to helper if the operator specifies it.
+ $info = $this->operators();
+ if (isset($info[$this->operator]['ensure_my_table']) && $info[$this->operator]['ensure_my_table'] == 'helper') {
+ return $this->helper->ensure_my_table();
+ }
+
+ return parent::ensure_my_table();
+ }
+
+ function op_helper() {
+ if (empty($this->value)) {
+ return;
+ }
+ $this->helper->add_filter();
+ }
+}