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,