diff --git a/handlers/views_handler_filter.inc b/handlers/views_handler_filter.inc
index 541e5df..f1cdf48 100644
--- a/handlers/views_handler_filter.inc
+++ b/handlers/views_handler_filter.inc
@@ -60,6 +60,7 @@ class views_handler_filter extends views_handler {
$options['operator'] = array('default' => '=');
$options['value'] = array('default' => '');
+ $options['argument_value'] = array('default' => array());
$options['group'] = array('default' => '0');
$options['exposed'] = array('default' => FALSE);
$options['expose'] = array(
@@ -190,6 +191,74 @@ class views_handler_filter extends views_handler {
$form['value']['#prefix'] = '
' . (isset($form['value']['#prefix']) ? $form['value']['#prefix'] : '');
$form['value']['#suffix'] = (isset($form['value']['#suffix']) ? $form['value']['#suffix'] : '') . '
';
}
+ $options = array('' => t('None'));
+ foreach ($this->view->display_handler->get_handlers('argument') as $id => $argument) {
+ $options[$id] = $argument->ui_name(TRUE);
+ }
+
+ // Add argument selection forms.
+ // If a certain filter handler has multiple form elements both add the value as possible form element and update the depedency.
+ $option_definition = $this->option_definition();
+ if (isset($option_definition['value']['contains'])) {
+ foreach ($option_definition['value']['contains'] as $value => $definition) {
+ // Some fields uses 'value' in the form or as a child element. So take care about it.
+ if ($value == 'value') {
+ if (isset($form['value']['value'])) {
+ $values[$value] = array(
+ 'title' => $form['value']['value']['#title'],
+ 'weight' => $form['value']['value']['#weight'],
+ 'dependency' => $form['value']['value']['#dependency']
+ );
+ $form['value']['value']['#dependency']['edit-options-argument-value-' . $value] = array('');
+ $form['value']['value']['#dependency_count'] = count($form['value']['value']['#dependency']);
+ }
+ else {
+ $values[$value] = array(
+ 'title' => $form['value']['#title'],
+ 'weight' => $form['value']['#weight'],
+ 'value_single' => TRUE,
+ 'dependency' => $form['value']['#dependency']
+ );
+ $form['value']['#dependency']['edit-options-argument-value-' . $value] = array('');
+ $form['value']['#dependency_count'] = count($form['value']['#dependency']);
+ }
+ }
+ else {
+ $values[$value] = array(
+ 'title' => $form['value'][$value]['#title'],
+ 'weight' => $form['value'][$value]['#weight'],
+ 'dependency' => $form['value'][$value]['#dependency']
+ );
+ $form['value'][$value]['#dependency']['edit-options-argument-value-' . $value] = array('');
+ $form['value'][$value]['#dependency_count'] = count($form['value'][$value]['#dependency']);
+ }
+ }
+ }
+ else {
+ $values = array('value' => array(
+ 'title' => $form['value']['#title'],
+ 'weight' => $form['value']['#weight'],
+ 'value_single' => TRUE,
+ 'dependency' => $form['value']['#dependency']
+ ));
+ $form['value']['#dependency']['edit-options-argument-value-value'] = array('');
+ }
+
+ foreach ($values as $value => $setting) {
+ $setting['value_name'] = $value;
+ $form['argument_value'][$value] = array(
+ '#type' => 'select',
+ '#title' => t('Select value from argument for @field.', array('@field' => $setting['title'])),
+ '#options' => $options,
+ '#default_value' => isset($this->options['argument_value'][$value]) ? $this->options['argument_value'][$value] : '',
+ '#weight' => ++$setting['weight'],
+ '#value_setting' => $setting,
+ '#dependency' => $setting['dependency'],
+ );
+ }
+
+ // Add a pre_render function to draw the value + the argument value form in the same container.
+ $form['#pre_render'][] = 'views_handler_filter_form_argument_value_pre_render';
}
/**
@@ -582,6 +651,27 @@ class views_handler_filter extends views_handler {
}
/**
+ * If pulling arguments from the filter is set, set $this->value here.
+ */
+ function pre_query() {
+ // If there are multiple values, store the value in $this->value as an array.
+ // else store a singular item in $this->value.
+ $count = count($this->options['argument_value']);
+ foreach ($this->options['argument_value'] as $value => $argument) {
+ if (!empty($argument)) {
+ if ($count == 1) {
+ $argument = $this->view->argument[$argument];
+ $this->value = $argument->get_value();
+ }
+ else {
+ $argument = $this->view->argument[$argument];
+ $this->value[$value] = $argument->get_value();
+ }
+ }
+ }
+ }
+
+ /**
* Add this filter to the query.
*
* Due to the nature of fapi, the value and the operator have an unintended
diff --git a/includes/admin.inc b/includes/admin.inc
index 79a70b8..b9585a2 100644
--- a/includes/admin.inc
+++ b/includes/admin.inc
@@ -1881,6 +1881,49 @@ function views_ui_pre_render_move_argument_options($form) {
}
/**
+ * Pre_render function to show argument_value form below the value form element
+ * in the filter function.
+ *
+ * Therefore wrap each argument_value with it's corresponding value form element in a div.
+ */
+function views_handler_filter_form_argument_value_pre_render($form) {
+ foreach (element_children($form['argument_value']) as $element) {
+ $setting = $form['argument_value'][$element]['#value_setting'];
+
+ // Collect the name, the form element of the value and the form element of the argument.
+ // Take sure that the single value exception works as well.
+ if (empty($setting['value_single'])) {
+ $name = $setting['value_name'];
+ $value_form = $form['value'][$name];
+ $argument_form = $form['argument_value'][$name];
+
+ unset($form['value'][$name]);
+ unset($form['argument_value'][$name]);
+ }
+ else {
+ $name = 'value';
+ $value_form = $form['value'];
+ $argument_form = $form['argument_value'][$name];
+
+ unset($form['value']);
+ unset($form['argument_value'][$name]);
+ }
+
+ $form['argument_value_wrappers'][$name] = array(
+ '#theme_wrappers' => array('views_container'),
+ '#attributes' => array('class' => array('views-filter-value-argument-pair')),
+ );
+ $form['argument_value_wrappers'][$name]['argument_value'] = $argument_form;
+ $form['argument_value_wrappers'][$name]['value'] = $value_form;
+ }
+
+ $form['argument_value_wrappers']['#prefix'] = '';
+ $form['argument_value_wrappers']['#suffix'] = '
';
+
+ return $form;
+}
+
+/**
* Custom form radios process function.
*
* Roll out a single radios element to a list of radios,