You are here

function views_handler_filter_role_custom in Views (for Drupal 7) 5

1 string reference to 'views_handler_filter_role_custom'
user_views_tables in modules/views_user.inc
This include file implements views functionality on behalf of user.module

File

modules/views_user.inc, line 408

Code

function views_handler_filter_role_custom($op, $filter, $filterinfo, &$query) {
  $table = $filterinfo['table'];
  $field = $filterinfo['field'];

  //filter for role authenticated users
  if (in_array(DRUPAL_AUTHENTICATED_RID, $filter['value'])) {
    if ($filter['operator'] == 'OR') {

      //filter for anonymous users too -> return all
      if (in_array(DRUPAL_ANONYMOUS_RID, $filter['value'])) {
        return;
      }
      $query
        ->add_where("node.uid != 0");
      return;
    }
    else {
      if ($filter['operator'] == 'NOR') {

        //filter for anonymous users too?
        if (in_array(DRUPAL_ANONYMOUS_RID, $filter['value'])) {
          $query
            ->ensure_table($table);
          $query
            ->add_where("%s.%s = '0'", $table, $field);

          //this will get no results
          return;
        }
        else {
          $query
            ->add_where("node.uid = 0");
          return;
        }
      }
      else {
        if ($filter['operator'] == 'AND' && !in_array(DRUPAL_ANONYMOUS_RID, $filter['value'])) {
          $key = array_search(DRUPAL_AUTHENTICATED_RID, $filter['value']);
          unset($filter['value'][$key]);

          //if there are other roles left the default filter handling is ok

          //else we must exclude the anonymous user
          if (count($filter['value']) == 0) {
            $query
              ->add_where("node.uid != 0");
            return;
          }
        }
      }
    }
  }
  else {
    if (in_array(DRUPAL_ANONYMOUS_RID, $filter['value'])) {
      if ($filter['operator'] == 'OR') {
        $key = array_search(DRUPAL_ANONYMOUS_RID, $filter['value']);
        unset($filter['value'][$key]);
        if (count($filter['value']) == 0) {
          $query
            ->add_where("node.uid = 0");
          return;
        }
        else {

          //we need to do the join to users_roles here manually
          $table_data = _views_get_tables();
          $joininfo = $table_data[$table]['join'];
          $joininfo['extra']['rid'] = array_map('intval', $filter['value']);
          $num = $query
            ->add_table($table, false, 1, $joininfo);
          $tablename = $query
            ->get_table_name($table, $num);

          //and allow anonymous nodes
          $query
            ->add_where("node.uid = 0 OR %s.%s IS NOT NULL", $tablename, $field);
          return;
        }
      }
      else {
        if ($filter['operator'] == 'NOR') {
          $query
            ->add_where("node.uid != 0");
        }
        else {
          if ($filter['operator'] == 'AND') {
            $query
              ->add_where("node.uid = 0");
            if (count($filter['value']) == 1) {

              //no need to run the default filter handler any more
              return;
            }
          }
        }
      }
    }
  }
  if ($filter['value']) {
    views_handler_filter_default($op, $filter, $filterinfo, $query);
  }
}