diff --git handlers/views_handler_field.inc handlers/views_handler_field.inc
index ec10ce4..76dda58 100644
--- handlers/views_handler_field.inc
+++ handlers/views_handler_field.inc
@@ -63,6 +63,13 @@ class views_handler_field extends views_handler {
* which can then be used as a value for comparisons in the WHERE clause.
*/
function is_filter_value() { return TRUE; }
+
+ /**
+ * Returns the field alias or the formula of the field.
+ */
+ function get_field_alias() {
+ return "$this->table_alias.$this->real_field";
+ }
/**
* Called to add the field to a query.
diff --git handlers/views_handler_filter.inc handlers/views_handler_filter.inc
index 746344b..fb417ca 100644
--- handlers/views_handler_filter.inc
+++ handlers/views_handler_filter.inc
@@ -48,6 +48,7 @@ class views_handler_filter extends views_handler {
$options['value'] = array('default' => '');
$options['group'] = array('default' => '0');
$options['exposed'] = array('default' => FALSE);
+ $options['field_filter'] = array('default' => '');
$options['expose'] = array(
'contains' => array(
'operator' => array('default' => FALSE),
@@ -89,6 +90,7 @@ class views_handler_filter extends views_handler {
$form['op_val_start'] = array('#value' => '
');
$this->show_operator_form($form, $form_state);
$this->show_value_form($form, $form_state);
+ $this->show_field_filter_form($form, $form_state);
$form['op_val_end'] = array('#value' => '
');
if ($this->can_expose()) {
$this->show_expose_form($form, $form_state);
@@ -192,6 +194,35 @@ class views_handler_filter extends views_handler {
* There is no need for this function to actually store the data.
*/
function value_submit($form, &$form_state) { }
+
+ /**
+ * Shortcut to display the field_filter form.
+ */
+ function show_field_filter_form(&$form, &$form_state) {
+ $this->field_filter_form($form, $form_state);
+ }
+
+ /**
+ * Provide a form for field_filter options.
+ */
+ function field_filter_form(&$form, &$form_state) {
+ // Get all possible fields.
+ $options[''] = t('None');
+ foreach ($this->view->display_handler->get_handlers('field') as $id => $handler) {
+ if ($handler->is_filter_value()) {
+ $options[$id] = $handler->label();
+ }
+ }
+ $form['field_filter'] = array(
+ '#title' => t('Field filter'),
+ '#type' => 'select',
+ '#default_value' => $this->options['field_filter'],
+ '#options' => $options,
+ );
+ }
+
+ /**
+ *
/**
* Handle the 'left' side fo the exposed options form.
@@ -499,6 +530,9 @@ class views_handler_filter extends views_handler {
* and $this->value respectively.
*/
function query() {
+ if ($this->options['field_filter']) {
+ return $this->query_field();
+ }
$this->ensure_my_table();
$this->query->add_where($this->options['group'], "$this->table_alias.$this->real_field " . $this->operator . " '%s'", $this->value);
}
@@ -510,8 +544,8 @@ class views_handler_filter extends views_handler {
* @see views_handler_filter::query()
*/
function query_field() {
- $this->ensure_my_table();
- if ($field_alias = $this->field_alias) {
+ if ($field_alias = $this->field_filter_alias()) {
+ $this->ensure_my_table();
$this->query->add_where($this->options['group'], "$this->table_alias.$this->real_field " . $this->operator ." $field_alias");
}
}
@@ -523,7 +557,8 @@ class views_handler_filter extends views_handler {
if ($field = $this->options['field_filter']) {
// get the instance of the field filter, to check whether to return its
// field filter instance, if its empty the field does not support it.
- if ($alias = $this->view->display_handler->handlers['field'][$field]->field_filter_alias()) {
+ $handler = $this->view->display_handler->get_handler('field', $field);
+ if ($handler->is_filter_value() && $alias = $handler->get_field_alias()) {
return $alias;
}
}
diff --git handlers/views_handler_filter_numeric.inc handlers/views_handler_filter_numeric.inc
index c8d98b2..ce92897 100644
--- handlers/views_handler_filter_numeric.inc
+++ handlers/views_handler_filter_numeric.inc
@@ -208,6 +208,9 @@ class views_handler_filter_numeric extends views_handler_filter {
}
function query() {
+ if ($this->options['field_filter']) {
+ return $this->query_field();
+ }
$this->ensure_my_table();
$field = "$this->table_alias.$this->real_field";
diff --git includes/view.inc includes/view.inc
index d6cbee8..cce647e 100644
--- includes/view.inc
+++ includes/view.inc
@@ -624,9 +624,6 @@ class view extends views_db_object {
}
}
- // Build all the filters.
- $this->_build('filter');
-
$this->build_sort = TRUE;
// Arguments can, in fact, cause this whole thing to abort.
@@ -648,6 +645,9 @@ class view extends views_db_object {
$this->_build('field');
}
+ // Build all the filters.
+ $this->_build('filter');
+
// Build our sort criteria if we were instructed to do so.
if (!empty($this->build_sort)) {
// Allow the style handler to deal with sorting.