示例#1
0
function bps_set_request_data($form, $location)
{
    global $bps_request_data;
    $meta = bps_meta($form);
    list($x, $fields) = bps_get_fields();
    $request = stripslashes_deep($_REQUEST);
    $F = new stdClass();
    $F->id = $form;
    $F->location = $location;
    $F->header = $meta['header'];
    $F->toggle = $meta['toggle'] == 'Enabled';
    $F->toggle_text = $meta['button'];
    $F->action = get_page_link($meta['action']);
    $F->method = $meta['method'];
    $F->fields = array();
    foreach ($meta['field_name'] as $k => $id) {
        if (empty($fields[$id])) {
            continue;
        }
        $field = $fields[$id];
        $f = new stdClass();
        $f->id = $id;
        $f->name = $field->name;
        $f->type = $field->type;
        $f->type = apply_filters('bps_field_criteria_type', $f->type, $field);
        // deprecated
        $f->type = apply_filters('bps_field_html_type', $f->type, $field);
        // deprecated
        $f->type = apply_filters('bps_field_request_data_type', $f->type, $field);
        // deprecated
        $f->type = apply_filters('bps_field_type_for_filters', $f->type, $field);
        $f->type = apply_filters('bps_field_type_for_search_form', $f->type, $field);
        $f->display = $f->type;
        $f->label = $custom_label = $meta['field_label'][$k];
        if (empty($f->label)) {
            $f->label = $field->name;
        }
        $f->description = $meta['field_desc'][$k];
        if (empty($f->description)) {
            $f->description = $field->description;
        }
        $range = isset($meta['field_range'][$k]);
        $f->code = 'field_' . $f->id;
        $f->value = '';
        $f->values = array();
        $f->options = array();
        if ($range) {
            $f->display = 'range';
            list($f->min, $f->max) = bps_minmax($request, $f->id, $f->type);
        } else {
            switch ($f->type) {
                case 'textbox':
                case 'number':
                case 'url':
                case 'textarea':
                    $f->value = isset($request[$f->code]) ? $request[$f->code] : '';
                    break;
                case 'selectbox':
                case 'radio':
                case 'multiselectbox':
                case 'checkbox':
                    $f->values = isset($request[$f->code]) ? (array) $request[$f->code] : array();
                    $f->options = bps_field_options($f->id);
                    break;
            }
        }
        $f = apply_filters('bps_field_request_data', $f);
        $f = apply_filters('bps_field_data_for_filters', $f);
        $f = apply_filters('bps_field_data_for_search_form', $f);
        $F->fields[] = $f;
        if (!empty($custom_label)) {
            $cl = clone $f;
            $cl->display = 'hidden';
            $cl->code = 'field_' . $f->id . '_label';
            $cl->value = $custom_label;
            $F->fields[] = $cl;
        }
    }
    $bps_request_data = $F;
    return true;
}
示例#2
0
function bps_search($request)
{
    global $bp, $wpdb;
    $done = array();
    $results = array('users' => array(0), 'validated' => true);
    list($x, $fields) = bps_get_fields();
    foreach ($request as $key => $value) {
        if ($value === '') {
            continue;
        }
        $split = explode('_', $key);
        if ($split[0] != 'field') {
            continue;
        }
        $id = $split[1];
        $op = isset($split[2]) ? $split[2] : 'eq';
        if (isset($done[$id]) || empty($fields[$id])) {
            continue;
        }
        $field = $fields[$id];
        $field_type = $field->type;
        $field_type = apply_filters('bps_field_query_type', $field_type, $field);
        $field_type = apply_filters('bps_field_type_for_query', $field_type, $field);
        if (bps_custom_field($field_type)) {
            $found = apply_filters('bps_field_query', array(), $field, $key, $value);
        } else {
            $sql = $wpdb->prepare("SELECT user_id FROM {$bp->profile->table_name_data} WHERE field_id = %d ", $id);
            $sql = apply_filters('bps_field_sql', $sql, $field);
            if ($op == 'min' || $op == 'max') {
                if ($field_type == 'multiselectbox' || $field_type == 'checkbox') {
                    continue;
                }
                list($min, $max) = bps_minmax($request, $id, $field_type);
                if ($min === '' && $max === '') {
                    continue;
                }
                switch ($field_type) {
                    case 'textbox':
                    case 'number':
                    case 'textarea':
                    case 'selectbox':
                    case 'radio':
                        if ($min !== '') {
                            $sql .= $wpdb->prepare("AND value >= %f", $min);
                        }
                        if ($max !== '') {
                            $sql .= $wpdb->prepare("AND value <= %f", $max);
                        }
                        break;
                    case 'datebox':
                        $time = time();
                        $day = date("j", $time);
                        $month = date("n", $time);
                        $year = date("Y", $time);
                        $ymin = $year - $max - 1;
                        $ymax = $year - $min;
                        if ($max !== '') {
                            $sql .= $wpdb->prepare("AND DATE(value) > %s", "{$ymin}-{$month}-{$day}");
                        }
                        if ($min !== '') {
                            $sql .= $wpdb->prepare("AND DATE(value) <= %s", "{$ymax}-{$month}-{$day}");
                        }
                        break;
                }
            } else {
                if ($op == 'eq') {
                    if ($field_type == 'datebox') {
                        continue;
                    }
                    switch ($field_type) {
                        case 'textbox':
                        case 'textarea':
                        case 'url':
                            $value = str_replace('&', '&amp;', $value);
                            $escaped = '%' . bps_esc_like($value) . '%';
                            $meta = bps_meta($request['bp_profile_search']);
                            if ($meta['searchmode'] != 'EQUAL') {
                                $sql .= $wpdb->prepare("AND value LIKE %s", $escaped);
                            } else {
                                $sql .= $wpdb->prepare("AND value LIKE %s", $value);
                            }
                            break;
                        case 'number':
                            $sql .= $wpdb->prepare("AND value = %d", $value);
                            break;
                        case 'selectbox':
                        case 'radio':
                            $values = (array) $value;
                            $parts = array();
                            foreach ($values as $value) {
                                $value = str_replace('&', '&amp;', $value);
                                $parts[] = $wpdb->prepare("value = %s", $value);
                            }
                            $sql .= 'AND (' . implode(' OR ', $parts) . ')';
                            break;
                        case 'multiselectbox':
                        case 'checkbox':
                            $values = (array) $value;
                            $parts = array();
                            foreach ($values as $value) {
                                $value = str_replace('&', '&amp;', $value);
                                $escaped = '%:"' . bps_esc_like($value) . '";%';
                                $parts[] = $wpdb->prepare("value LIKE %s", $escaped);
                            }
                            $match = apply_filters('bps_field_checkbox_match_all', false, $id) ? ' AND ' : ' OR ';
                            $sql .= 'AND (' . implode($match, $parts) . ')';
                            break;
                    }
                } else {
                    continue;
                }
            }
            $found = $wpdb->get_col($sql);
        }
        $users = isset($users) ? array_intersect($users, $found) : $found;
        if (count($users) == 0) {
            return $results;
        }
        $done[$id] = true;
    }
    if (count($done) == 0) {
        $results['validated'] = false;
        return $results;
    }
    $results['users'] = $users;
    return $results;
}