diff -urN views_head/modules/views_node.inc views/modules/views_node.inc --- views_head/modules/views_node.inc 2006-09-07 06:34:10.000000000 +0200 +++ views/modules/views_node.inc 2006-09-07 15:03:43.000000000 +0200 @@ -639,18 +639,6 @@ } /* - * Create a list of roles. - */ -function views_handler_filter_role() { - $rids = array(); - $result = db_query("SELECT r.rid, r.name FROM {role} r ORDER BY r.name"); - while ($obj = db_fetch_object($result)) { - $rids[$obj->rid] = $obj->name; - } - return $rids; -} - -/* * Create a list of node types. */ function views_handler_filter_nodetype($op) { diff -urN views_head/modules/views_user.inc views/modules/views_user.inc --- views_head/modules/views_user.inc 2006-09-07 07:26:28.000000000 +0200 +++ views/modules/views_user.inc 2006-09-07 14:57:02.000000000 +0200 @@ -68,6 +68,7 @@ 'name' => t('Role: Author Role'), 'operator' => 'views_handler_operator_andor', 'list' => 'views_handler_filter_role', + 'handler' => 'views_handler_filter_role_custom', 'value-type' => 'array', 'help' => t('Include the node only if the author is a member of the selected role.'), ), @@ -326,15 +327,6 @@ } /* - * Custom filter for current user. - */ -function views_handler_filter_usercurrent_custom($op, $filter, $filterinfo, &$query) { - global $user; - $query->ensure_table('users'); - $query->add_where("users.uid $filter[operator] '$user->uid'"); -} - -/* * Add special info to see if a user either authored OR commented on a post */ function views_handler_filter_uid_touched($op, $filter, $filterinfo, &$query) { @@ -352,3 +344,61 @@ $query->set_distinct(); // once you do this, there's just one node. $query->add_where("node.uid = '%s' OR $table.uid = '%s'", $filter['value'], $filter['value']); } + +/* + * Create a list of roles. + */ +function views_handler_filter_role() { + $rids = array(); + $result = db_query("SELECT r.rid, r.name FROM {role} r ORDER BY r.name"); + while ($obj = db_fetch_object($result)) { + $rids[$obj->rid] = $obj->name; + } + return $rids; +} + +/* + * Custom filter for roles + */ +function views_handler_filter_role_custom($op, $filter, $filterinfo, &$query) { + $table = $filterinfo['table']; + $field = $filterinfo['field']; + if (!$field) { + $fieldbits = explode('.', $filter['field']); + $field = $fieldbits[1]; + } + + //filter for role authenticated users + if (in_array(2, $filter['value'])) { + if ($filter['operator'] == 'OR') { + //filter for anonymous users too -> return all + if (in_array(1, $filter['value'])) { + return; + } + $query->ensure_table($table); + $query->add_where("(%s.%s != '1' OR %s.%s IS NULL)", $table, $field, $table, $field); + return; + } + else if ($filter['operator'] == 'NOR') { + //filter for anonymous users too? + if (in_array(1, $filter['value'])) { + $query->ensure_table($table); + $query->add_where("%s.%s = '0'", $table, $field); //this will get no results + return; + } + else { + $query->ensure_table($table); + $query->add_where("%s.%s = '1'", $table, $field); + return; + } + } + else if ($filter['operator'] == 'AND' && !in_array(1, $filter['value'])) { + $key = array_search('2', $filter['value']); + unset($filter['value'][$key]); + if (count($filter['value']) == 0) { + return; + } + } + } + views_handler_filter_default($op, $filter, $filterinfo, $query); +} diff -urN views_head/views_query.inc views/views_query.inc --- views_head/views_query.inc 2006-09-07 15:02:12.000000000 +0200 +++ views/views_query.inc 2006-09-07 14:25:01.000000000 +0200 @@ -83,12 +83,6 @@ foreach ($view->filter as $i => $filter) { $filterinfo = $filters[$filter['field']]; // shortcut - $field = $filterinfo['field']; - if (!$field) { - $fieldbits = explode('.', $filter['field']); - $field = $fieldbits[1]; - } - $view->used_filters = array(); foreach($view->exposed_filter as $count => $expose) { @@ -126,48 +120,60 @@ } } - $table = $filterinfo['table']; - $replace = array('>' => '>', '<' => '<'); $filter['operator'] = strtr($filter['operator'], $replace); - if (function_exists($filterinfo['handler'])) { - $filterinfo['handler']('handler', $filter, $filterinfo, $query); + if (!function_exists($filterinfo['handler'])) { + $filterinfo['handler'] = 'views_handler_filter_default'; } - else if (is_array($filter['value']) && count($filter['value'])) { - if ($filter['operator'] == 'OR' || $filter['operator'] == 'NOR') { - $query->ensure_table($table); - $where_args = array_merge(array($query->use_alias_prefix . $table, $field), $filter['value']); - $placeholder = array_fill(0, count($filter['value']), '%s'); - if ($filter['operator'] == 'OR') { - $query->add_where("%s.%s IN ('". implode("','", $placeholder) ."')", $where_args); - } - else { - $where_args[] = $where_args[0]; - $where_args[] = $where_args[1]; - $query->add_where("(%s.%s NOT IN ('". implode("','", $placeholder) ."') OR %s.%s IS NULL)", $where_args); - } + $filterinfo['handler']('handler', $filter, $filterinfo, $query); + } +} + +/* + * Default handler for filters + */ +function views_handler_filter_default($op, $filter, $filterinfo, &$query) { + $table = $filterinfo['table']; + $field = $filterinfo['field']; + if (!$field) { + $fieldbits = explode('.', $filter['field']); + $field = $fieldbits[1]; + } + + if (is_array($filter['value']) && count($filter['value'])) { + if ($filter['operator'] == 'OR' || $filter['operator'] == 'NOR') { + $query->ensure_table($table); + $where_args = array_merge(array($query->use_alias_prefix . $table, $field), $filter['value']); + $placeholder = array_fill(0, count($filter['value']), '%s'); + if ($filter['operator'] == 'OR') { + $query->add_where("%s.%s IN ('". implode("','", $placeholder) ."')", $where_args); } else { - $howmany = count($filter['value']); - $high_table = $query->add_table($table, true, $howmany); - if (!$high_table) { // couldn't add the table - break; - } - - $table_num = $high_table - $howmany; - foreach ($filter['value'] as $item) { - $table_num++; - $tn = $query->get_table_name($table, $table_num); - $query->add_where("%s.%s = '%s'", $tn, $field, $item); - } + $where_args[] = $where_args[0]; + $where_args[] = $where_args[1]; + $query->add_where("(%s.%s NOT IN ('". implode("','", $placeholder) ."') OR %s.%s IS NULL)", $where_args); } } else { - $query->ensure_table("$table"); - $query->add_where("%s.%s %s '%s'", $query->use_alias_prefix . $table, $field, $filter['operator'], $filter['value']); + $howmany = count($filter['value']); + $high_table = $query->add_table($table, true, $howmany); + if (!$high_table) { // couldn't add the table + break; + } + + $table_num = $high_table - $howmany; + foreach ($filter['value'] as $item) { + $table_num++; + $tn = $query->get_table_name($table, $table_num); + $query->add_where("%s.%s = '%s'", $tn, $field, $item); + } } } + else { + $query->ensure_table("$table"); + $query->add_where("%s.%s %s '%s'", $query->use_alias_prefix . $table, $field, $filter['operator'], $filter['value']); + } } /*