/** * Delete GravityView "approved entry" meta * @since 1.15 * @return void */ private function delete_entry_meta() { global $wpdb; $meta_table = class_exists('GFFormsModel') ? GFFormsModel::get_lead_meta_table_name() : $wpdb->prefix . 'rg_lead_meta'; $sql = "\n\t\t\tDELETE FROM {$meta_table}\n\t\t\tWHERE (\n\t\t\t\t`meta_key` = 'is_approved'\n\t\t\t);\n\t\t"; $wpdb->query($sql); }
public static function is_valid_table($table_name) { global $wpdb; $tables = array(GFFormsModel::get_form_table_name(), GFFormsModel::get_form_view_table_name(), GFFormsModel::get_meta_table_name(), GFFormsModel::get_lead_table_name(), GFFormsModel::get_lead_notes_table_name(), GFFormsModel::get_lead_details_table_name(), GFFormsModel::get_lead_details_long_table_name(), GFFormsModel::get_lead_meta_table_name(), GFFormsModel::get_incomplete_submissions_table_name(), "{$wpdb->prefix}gf_addon_feed", "{$wpdb->prefix}gf_addon_payment_transaction", "{$wpdb->prefix}gf_addon_payment_callback"); return in_array($table_name, $tables); }
/** * Removes all settings and deactivates the Add-On. * * Not intended to be overridden or called directly by Add-Ons. * * @ignore */ public function uninstall_addon() { if (!$this->current_user_can_any($this->_capabilities_uninstall)) { die(__("You don't have adequate permission to uninstall this addon: " . $this->_title, "gravityforms")); } $continue = $this->uninstall(); if (false === $continue) { return false; } global $wpdb; $lead_meta_table = GFFormsModel::get_lead_meta_table_name(); $forms = GFFormsModel::get_forms(); $all_form_ids = array(); // remove entry meta foreach ($forms as $form) { $all_form_ids[] = $form->id; $entry_meta = $this->get_entry_meta(array(), $form->id); if (is_array($entry_meta)) { foreach (array_keys($entry_meta) as $meta_key) { $sql = $wpdb->prepare("DELETE from {$lead_meta_table} WHERE meta_key=%s", $meta_key); $wpdb->query($sql); } } } //remove form settings $form_metas = GFFormsModel::get_form_meta_by_id($all_form_ids); require_once GFCommon::get_base_path() . '/form_detail.php'; foreach ($form_metas as $form_meta) { if (isset($form_meta[$this->_slug])) { unset($form_meta[$this->_slug]); $form_json = json_encode($form_meta); GFFormDetail::save_form_info($form_meta["id"], addslashes($form_json)); } } //removing options delete_option("gravityformsaddon_" . $this->_slug . "_settings"); delete_option("gravityformsaddon_" . $this->_slug . "_version"); //Deactivating plugin deactivate_plugins($this->_path); update_option('recently_activated', array($this->_path => time()) + (array) get_option('recently_activated')); return true; }
private static function get_field_filters_where($form_id, $search_criteria) { global $wpdb; $field_filters = rgar($search_criteria, 'field_filters'); $search_operator = self::get_search_operator($search_criteria); if (empty($field_filters)) { return false; } unset($field_filters['mode']); $sql_array = array(); $lead_details_table_name = GFFormsModel::get_lead_details_table_name(); $lead_meta_table_name = GFFormsModel::get_lead_meta_table_name(); if (is_array($form_id)) { $in_str_arr = array_fill(0, count($form_id), '%d'); $in_str = join(',', $in_str_arr); $form_id_where = $wpdb->prepare("AND form_id IN ({$in_str})", $form_id); } else { $form_id_where = $form_id > 0 ? $wpdb->prepare('AND form_id=%d', $form_id) : ''; } $info_column_keys = self::get_lead_db_columns(); $entry_meta = self::get_entry_meta(is_array($form_id) ? 0 : $form_id); array_push($info_column_keys, 'id'); foreach ($field_filters as $search) { $key = rgar($search, 'key'); if ('entry_id' === $key) { $key = 'id'; } if (in_array($key, $info_column_keys)) { continue; } $val = rgar($search, 'value'); $operator = isset($search['operator']) ? strtolower($search['operator']) : '='; if ('is' == $operator) { $operator = '='; } if ('isnot' == $operator) { $operator = '<>'; } if ('contains' == $operator) { $operator = 'like'; } $search_term = 'like' == $operator ? "%{$val}%" : $val; $search_type = rgar($search, 'type'); if (empty($search_type)) { if (empty($key)) { $search_type = 'global'; } elseif (is_numeric($key)) { $search_type = 'field'; } else { $search_type = 'meta'; } } switch ($search_type) { case 'field': $is_number_field = false; if ($operator != 'like' && !is_array($form_id) && $form_id > 0) { $form = GFAPI::get_form($form_id); $field = self::get_field($form, $key); if (self::get_input_type($field) == 'number') { $is_number_field = true; } } $search_term_placeholder = rgar($search, 'is_numeric') || $is_number_field ? '%f' : '%s'; if (is_array($search_term)) { if (in_array($operator, array('=', 'in'))) { $operator = 'IN'; // Override operator } elseif (in_array($operator, array('!=', '<>', 'not in'))) { $operator = 'NOT IN'; // Override operator } // Format in SQL and sanitize the strings in the list $search_terms = array_fill(0, count($search_term), '%s'); $search_term_placeholder = $wpdb->prepare('( ' . implode(', ', $search_terms) . ' )', $search_term); $search_term = ''; // Set to blank, still gets passed to wpdb::prepare below but isn't used } $upper_field_number_limit = (string) (int) $key === $key ? (double) $key + 0.9999 : (double) $key + 0.0001; /* doesn't support "<>" for checkboxes */ $field_query = $wpdb->prepare("\n l.id IN\n (\n SELECT\n lead_id\n from {$lead_details_table_name}\n WHERE (field_number BETWEEN %s AND %s AND value {$operator} {$search_term_placeholder})\n {$form_id_where}\n )", (double) $key - 0.0001, $upper_field_number_limit, $search_term); if (empty($val) || '%%' === $val || '<>' === $operator) { $skipped_field_query = $wpdb->prepare("\n l.id NOT IN\n (\n SELECT\n lead_id\n from {$lead_details_table_name}\n WHERE (field_number BETWEEN %s AND %s)\n {$form_id_where}\n )", (double) $key - 0.0001, $upper_field_number_limit, $search_term); $field_query = '(' . $field_query . ' OR ' . $skipped_field_query . ')'; } $sql_array[] = $field_query; /* //supports '<>' for checkboxes but it doesn't scale $sql_array[] = $wpdb->prepare("l.id IN (SELECT lead_id FROM ( SELECT lead_id, value FROM $lead_details_table_name WHERE form_id = %d AND (field_number BETWEEN %s AND %s) GROUP BY lead_id HAVING value $operator %s ) ld ) ", $form_id, (float)$key - 0.0001, $upper_field_number_limit, $val ); */ break; case 'global': // include choice text $forms = array(); if ($form_id == 0) { $forms = GFAPI::get_forms(); } elseif (is_array($form_id)) { foreach ($form_id as $id) { $forms[] = GFAPI::get_form($id); } } else { $forms[] = GFAPI::get_form($form_id); } $choice_texts_clauses = array(); foreach ($forms as $form) { if (isset($form['fields'])) { $choice_texts_clauses_for_form = array(); foreach ($form['fields'] as $field) { /* @var GF_Field $field */ $choice_texts_clauses_for_field = array(); if (is_array($field->choices)) { foreach ($field->choices as $choice) { if ($operator == '=' && strtolower($choice['text']) == strtolower($val) || $operator == 'like' && !empty($val) && strpos(strtolower($choice['text']), strtolower($val)) !== false) { if ($field->gsurveyLikertEnableMultipleRows) { $choice_value = '%' . $choice['value'] . '%'; $choice_search_operator = 'like'; } else { $choice_value = $choice['value']; $choice_search_operator = '='; } $choice_texts_clauses_for_field[] = $wpdb->prepare("(field_number BETWEEN %s AND %s AND value {$choice_search_operator} %s)", (double) $field->id - 0.0001, (double) $field->id + 0.9999, $choice_value); } } } if (!empty($choice_texts_clauses_for_field)) { $choice_texts_clauses_for_form[] = join(' OR ', $choice_texts_clauses_for_field); } } } if (!empty($choice_texts_clauses_for_form)) { $choice_texts_clauses[] = '(l.form_id = ' . $form['id'] . ' AND (' . join(' OR ', $choice_texts_clauses_for_form) . ' ))'; } } $choice_texts_clause = ''; if (!empty($choice_texts_clauses)) { $choice_texts_clause = join(' OR ', $choice_texts_clauses); $choice_texts_clause = "\n\t\t\t\t\t\tl.id IN (\n SELECT\n lead_id\n FROM {$lead_details_table_name}\n WHERE {$choice_texts_clause} ) OR "; } $choice_value_clause = $wpdb->prepare("value {$operator} %s", $search_term); $sql_array[] = '(' . $choice_texts_clause . $choice_value_clause . ')'; break; case 'meta': /* doesn't support '<>' for multiple values of the same key */ $meta = rgar($entry_meta, $key); $placeholder = rgar($meta, 'is_numeric') ? '%s' : '%s'; $search_term = 'like' == $operator ? "%{$val}%" : $val; if (is_array($search_term)) { if (in_array($operator, array('=', 'in'))) { $operator = 'IN'; } elseif (in_array($operator, array('!=', '<>', 'not in'))) { $operator = 'NOT IN'; } $search_terms = array_fill(0, count($search_term), '%s'); $placeholder = $wpdb->prepare('( ' . implode(', ', $search_terms) . ' )', $search_term); $search_term = ''; } $sql_array[] = $wpdb->prepare("\n l.id IN\n (\n SELECT\n lead_id\n FROM {$lead_meta_table_name}\n WHERE meta_key=%s AND meta_value {$operator} {$placeholder}\n {$form_id_where}\n )", $search['key'], $search_term); break; } } $sql = empty($sql_array) ? '' : join(' ' . $search_operator . ' ', $sql_array); return $sql; }
private static function get_search_where($form_id, $search_criteria) { global $wpdb; $sql_array = array(); $lead_details_table_name = GFFormsModel::get_lead_details_table_name(); $lead_meta_table_name = GFFormsModel::get_lead_meta_table_name(); $form_id_where = $form_id > 0 ? $wpdb->prepare("WHERE form_id=%d", $form_id) : ""; foreach ($search_criteria as $search) { $key = rgar($search, "key"); $val = rgar($search, "value"); switch (rgar($search, "type")) { case "field": $upper_field_number_limit = (string) (int) $key === $key ? (double) $key + 0.9999 : (double) $key + 0.0001; $operator = isset($search["operator"]) ? $search["operator"] : "="; $search_term = "LIKE" == $operator ? "%{$val}%" : $val; /* doesn't support "<>" for checkboxes */ $sql_array[] = $wpdb->prepare("l.id IN\n\t\t\t\t\t\t\t\t\t(\n\t\t\t\t\t\t\t\t\tSELECT\n\t\t\t\t\t\t\t\t\tlead_id\n\t\t\t\t\t\t\t\t\tfrom {$lead_details_table_name}\n\t\t\t\t\t\t\t\t\t{$form_id_where}\n\t\t\t\t\t\t\t\t\tAND (field_number BETWEEN %s AND %s AND value {$operator} %s)\n\t\t\t\t\t\t\t\t\t)\n\t\t\t\t\t\t\t\t", (double) $key - 0.0001, $upper_field_number_limit, $search_term); /* //supports "<>" for checkboxes but it doesn't scale $sql_array[] = $wpdb->prepare("l.id IN (SELECT lead_id FROM ( SELECT lead_id, value FROM $lead_details_table_name WHERE form_id = %d AND (field_number BETWEEN %s AND %s) GROUP BY lead_id HAVING value $operator %s ) ld ) ", $form_id, (float)$key - 0.0001, $upper_field_number_limit, $val ); */ break; case "meta": /* doesn't support "<>" for multiple values of the same key */ $operator = isset($search["operator"]) ? $search["operator"] : "="; $search_term = "LIKE" == $operator ? "%{$val}%" : $val; $sql_array[] = $wpdb->prepare("l.id IN\n\t\t\t\t\t\t\t\t\t(\n\t\t\t\t\t\t\t\t\tSELECT\n\t\t\t\t\t\t\t\t\tlead_id\n\t\t\t\t\t\t\t\t\tFROM {$lead_meta_table_name}\n\t\t\t\t\t\t\t\t\tWHERE meta_key=%s AND meta_value {$operator} %s\n\t\t\t\t\t\t\t\t\t)\n\t\t\t\t\t\t\t\t", $search["key"], $search_term); break; } } $sql = empty($sql_array) ? "" : join(" AND ", $sql_array); return $sql; }
private static function get_field_filters_where($form_id, $search_criteria) { global $wpdb; $field_filters = rgar($search_criteria, "field_filters"); $search_operator = self::get_search_operator($search_criteria); if (empty($field_filters)) { return false; } unset($field_filters["mode"]); $sql_array = array(); $lead_details_table_name = GFFormsModel::get_lead_details_table_name(); $lead_meta_table_name = GFFormsModel::get_lead_meta_table_name(); if (is_array($form_id)) { $in_str_arr = array_fill(0, count($form_id), '%s'); $in_str = esc_sql(join(",", $in_str_arr)); $form_id_where = $wpdb->prepare("AND form_id IN ({$in_str})", $form_id); } else { $form_id_where = $form_id > 0 ? $wpdb->prepare("AND form_id=%d", $form_id) : ""; } $info_column_keys = self::get_lead_db_columns(); $entry_meta = self::get_entry_meta(is_array($form_id) ? 0 : $form_id); array_push($info_column_keys, "id"); foreach ($field_filters as $search) { $key = rgar($search, "key"); if ("entry_id" === $key) { $key = "id"; } if (in_array($key, $info_column_keys)) { continue; } $val = rgar($search, "value"); $operator = isset($search["operator"]) ? strtolower($search["operator"]) : "="; if ("is" == $operator) { $operator = "="; } if ("isnot" == $operator) { $operator = "<>"; } if ("contains" == $operator) { $operator = "like"; } $search_term = "like" == $operator ? "%{$val}%" : $val; $search_type = rgar($search, "type"); if (empty($search_type)) { if (empty($key)) { $search_type = "global"; } elseif (is_numeric($key)) { $search_type = "field"; } elseif (isset($entry_meta[$key])) { $search_type = "meta"; } else { $search_type = "global"; } } switch ($search_type) { case "field": $upper_field_number_limit = (string) (int) $key === $key ? (double) $key + 0.9999 : (double) $key + 0.0001; /* doesn't support "<>" for checkboxes */ $field_query = $wpdb->prepare("l.id IN\n\t\t\t\t\t\t\t\t\t(\n\t\t\t\t\t\t\t\t\tSELECT\n\t\t\t\t\t\t\t\t\tlead_id\n\t\t\t\t\t\t\t\t\tfrom {$lead_details_table_name}\n\t\t\t\t\t\t\t\t\tWHERE (field_number BETWEEN %s AND %s AND value {$operator} %s)\n\t\t\t\t\t\t\t\t\t{$form_id_where}\n\t\t\t\t\t\t\t\t\t)\n\t\t\t\t\t\t\t\t", (double) $key - 0.0001, $upper_field_number_limit, $search_term); if (empty($val) || "%%" === $val || "<>" === $operator) { $skipped_field_query = $wpdb->prepare("l.id NOT IN\n\t\t\t\t\t\t\t\t\t(\n\t\t\t\t\t\t\t\t\tSELECT\n\t\t\t\t\t\t\t\t\tlead_id\n\t\t\t\t\t\t\t\t\tfrom {$lead_details_table_name}\n\t\t\t\t\t\t\t\t\tWHERE (field_number BETWEEN %s AND %s)\n\t\t\t\t\t\t\t\t\t{$form_id_where}\n\t\t\t\t\t\t\t\t\t)\n\t\t\t\t\t\t\t\t", (double) $key - 0.0001, $upper_field_number_limit, $search_term); $field_query = "(" . $field_query . " OR " . $skipped_field_query . ")"; } $sql_array[] = $field_query; /* //supports "<>" for checkboxes but it doesn't scale $sql_array[] = $wpdb->prepare("l.id IN (SELECT lead_id FROM ( SELECT lead_id, value FROM $lead_details_table_name WHERE form_id = %d AND (field_number BETWEEN %s AND %s) GROUP BY lead_id HAVING value $operator %s ) ld ) ", $form_id, (float)$key - 0.0001, $upper_field_number_limit, $val ); */ break; case "global": $sql_array[] = $wpdb->prepare("value {$operator} %s", $search_term); break; case "meta": /* doesn't support "<>" for multiple values of the same key */ $meta = rgar($entry_meta, $key); $placeholder = rgar($meta, "is_numeric") ? "%s" : "%s"; $search_term = "like" == $operator ? "%{$val}%" : $val; $sql_array[] = $wpdb->prepare("l.id IN\n\t\t\t\t\t\t\t\t\t(\n\t\t\t\t\t\t\t\t\tSELECT\n\t\t\t\t\t\t\t\t\tlead_id\n\t\t\t\t\t\t\t\t\tFROM {$lead_meta_table_name}\n\t\t\t\t\t\t\t\t\tWHERE meta_key=%s AND meta_value {$operator} {$placeholder}\n\t\t\t\t\t\t\t\t\t{$form_id_where}\n\t\t\t\t\t\t\t\t\t)\n\t\t\t\t\t\t\t\t", $search["key"], $search_term); break; } } $sql = empty($sql_array) ? "" : join(" " . $search_operator . " ", $sql_array); return $sql; }
private static function get_search_where($form_id, $search_criteria) { global $wpdb; $sql_array = array(); $lead_details_table_name = GFFormsModel::get_lead_details_table_name(); $lead_meta_table_name = GFFormsModel::get_lead_meta_table_name(); if (is_array($form_id)) { $in_str_arr = array_fill(0, count($form_id), '%s'); $in_str = join($in_str_arr, ","); $form_id_where = $wpdb->prepare("WHERE form_id IN ({$in_str})", $form_id); } else { $form_id_where = $form_id > 0 ? $wpdb->prepare("WHERE form_id=%d", $form_id) : ""; } foreach ($search_criteria as $search) { $key = rgar($search, "key"); $val = rgar($search, "value"); $operator = isset($search["operator"]) ? strtolower($search["operator"]) : "="; if ("is" == $operator) { $operator = "="; } if ("isnot" == $operator) { $operator = "<>"; } if ("contains" == $operator) { $operator = "like"; } switch (rgar($search, "type")) { case "field": $upper_field_number_limit = (string) (int) $key === $key ? (double) $key + 0.9999 : (double) $key + 0.0001; $search_term = "like" == $operator ? "%{$val}%" : $val; /* doesn't support "<>" for checkboxes */ $sql_array[] = $wpdb->prepare("l.id IN\n\t\t\t\t\t\t\t\t\t(\n\t\t\t\t\t\t\t\t\tSELECT\n\t\t\t\t\t\t\t\t\tlead_id\n\t\t\t\t\t\t\t\t\tfrom {$lead_details_table_name}\n\t\t\t\t\t\t\t\t\t{$form_id_where}\n\t\t\t\t\t\t\t\t\tAND (field_number BETWEEN %s AND %s AND value {$operator} %s)\n\t\t\t\t\t\t\t\t\t)\n\t\t\t\t\t\t\t\t", (double) $key - 0.0001, $upper_field_number_limit, $search_term); /* //supports "<>" for checkboxes but it doesn't scale $sql_array[] = $wpdb->prepare("l.id IN (SELECT lead_id FROM ( SELECT lead_id, value FROM $lead_details_table_name WHERE form_id = %d AND (field_number BETWEEN %s AND %s) GROUP BY lead_id HAVING value $operator %s ) ld ) ", $form_id, (float)$key - 0.0001, $upper_field_number_limit, $val ); */ break; case "meta": /* doesn't support "<>" for multiple values of the same key */ $entry_meta = self::get_entry_meta(is_array($form_id) ? 0 : $form_id); $meta = rgar($entry_meta, $key); $placeholder = rgar($meta, "is_numeric") ? "%d" : "%s"; $search_term = "like" == $operator ? "%{$val}%" : $val; $sql_array[] = $wpdb->prepare("l.id IN\n\t\t\t\t\t\t\t\t\t(\n\t\t\t\t\t\t\t\t\tSELECT\n\t\t\t\t\t\t\t\t\tlead_id\n\t\t\t\t\t\t\t\t\tFROM {$lead_meta_table_name}\n\t\t\t\t\t\t\t\t\tWHERE meta_key=%s AND meta_value {$operator} {$placeholder}\n\t\t\t\t\t\t\t\t\t)\n\t\t\t\t\t\t\t\t", $search["key"], $search_term); break; } } $sql = empty($sql_array) ? "" : join(" AND ", $sql_array); return $sql; }
/** * Updates a form id of an entry. * * @param int $entry_id The ID of the Entry object * @param int $form_id The Form ID of the Entry object * * @param mixed $value The value to which the field should be set * * @return bool Whether the entry property was updated successfully */ function update_entry_form_id($entry_id, $form_id) { global $wpdb; $lead_table = GFFormsModel::get_lead_table_name(); $lead_detail_table = GFFormsModel::get_lead_details_table_name(); $lead_meta_table = GFFormsModel::get_lead_meta_table_name(); $result = $wpdb->query($wpdb->prepare("UPDATE {$lead_table} SET form_id={$form_id} WHERE id=%d ", $entry_id)); $wpdb->query($wpdb->prepare("UPDATE {$lead_detail_table} SET form_id={$form_id} WHERE lead_id=%d ", $entry_id)); $wpdb->query($wpdb->prepare("UPDATE {$lead_meta_table} SET form_id={$form_id} WHERE lead_id=%d ", $entry_id)); return $result; }
private static function get_field_filters_where($form_id, $search_criteria) { global $wpdb; $field_filters = rgar($search_criteria, "field_filters"); $search_operator = self::get_search_operator($search_criteria); if (empty($field_filters)) { return false; } unset($field_filters["mode"]); $sql_array = array(); $lead_details_table_name = GFFormsModel::get_lead_details_table_name(); $lead_meta_table_name = GFFormsModel::get_lead_meta_table_name(); if (is_array($form_id)) { $in_str_arr = array_fill(0, count($form_id), '%s'); $in_str = esc_sql(join(",", $in_str_arr)); $form_id_where = $wpdb->prepare("AND form_id IN ({$in_str})", $form_id); } else { $form_id_where = $form_id > 0 ? $wpdb->prepare("AND form_id=%d", $form_id) : ""; } $info_column_keys = self::get_lead_db_columns(); $entry_meta = self::get_entry_meta(is_array($form_id) ? 0 : $form_id); array_push($info_column_keys, "id"); foreach ($field_filters as $search) { $key = rgar($search, "key"); if ("entry_id" === $key) { $key = "id"; } if (in_array($key, $info_column_keys)) { continue; } $val = rgar($search, "value"); $operator = isset($search["operator"]) ? strtolower($search["operator"]) : "="; if ("is" == $operator) { $operator = "="; } if ("isnot" == $operator) { $operator = "<>"; } if ("contains" == $operator) { $operator = "like"; } $search_term = "like" == $operator ? "%{$val}%" : $val; $search_type = rgar($search, "type"); if (empty($search_type)) { if (empty($key)) { $search_type = "global"; } elseif (is_numeric($key)) { $search_type = "field"; } else { $search_type = "meta"; } } switch ($search_type) { case "field": $upper_field_number_limit = (string) (int) $key === $key ? (double) $key + 0.9999 : (double) $key + 0.0001; /* doesn't support "<>" for checkboxes */ $field_query = $wpdb->prepare("\n l.id IN\n (\n SELECT\n lead_id\n from {$lead_details_table_name}\n WHERE (field_number BETWEEN %s AND %s AND value {$operator} %s)\n {$form_id_where}\n )", (double) $key - 0.0001, $upper_field_number_limit, $search_term); if (empty($val) || "%%" === $val || "<>" === $operator) { $skipped_field_query = $wpdb->prepare("\n l.id NOT IN\n (\n SELECT\n lead_id\n from {$lead_details_table_name}\n WHERE (field_number BETWEEN %s AND %s)\n {$form_id_where}\n )", (double) $key - 0.0001, $upper_field_number_limit, $search_term); $field_query = "(" . $field_query . " OR " . $skipped_field_query . ")"; } $sql_array[] = $field_query; /* //supports "<>" for checkboxes but it doesn't scale $sql_array[] = $wpdb->prepare("l.id IN (SELECT lead_id FROM ( SELECT lead_id, value FROM $lead_details_table_name WHERE form_id = %d AND (field_number BETWEEN %s AND %s) GROUP BY lead_id HAVING value $operator %s ) ld ) ", $form_id, (float)$key - 0.0001, $upper_field_number_limit, $val ); */ break; case "global": // include choice text $forms = array(); if ($form_id == 0) { $forms = GFAPI::get_forms(); } elseif (is_array($form_id)) { foreach ($form_id as $id) { $forms[] = GFAPI::get_form($id); } } else { $forms[] = GFAPI::get_form($form_id); } $choice_texts_clauses = array(); foreach ($forms as $form) { if (isset($form['fields'])) { $choice_texts_clauses_for_form = array(); foreach ($form['fields'] as $field) { $choice_texts_clauses_for_field = array(); if (isset($field['choices']) && is_array($field['choices'])) { foreach ($field['choices'] as $choice) { if ($operator == '=' && strtolower($choice['text']) == strtolower($val) || $operator == 'like' && strpos(strtolower($choice['text']), strtolower($val)) !== false) { if (rgar($field, 'gsurveyLikertEnableMultipleRows')) { $choice_value = '%' . $choice['value'] . '%'; $choice_search_operator = 'like'; } else { $choice_value = $choice['value']; $choice_search_operator = '='; } $choice_texts_clauses_for_field[] = $wpdb->prepare("field_number BETWEEN %s AND %s AND value {$choice_search_operator} %s", (double) $field['id'] - 0.0001, (double) $field['id'] + 0.9999, $choice_value); } } } if (!empty($choice_texts_clauses_for_field)) { $choice_texts_clauses_for_form[] = join(' OR ', $choice_texts_clauses_for_field); } } } if (!empty($choice_texts_clauses_for_form)) { $choice_texts_clauses[] = '(l.form_id = ' . $form['id'] . ' AND (' . join(' OR ', $choice_texts_clauses_for_form) . ' ))'; } } $choice_texts_clause = ''; if (!empty($choice_texts_clauses)) { $choice_texts_clause = join(' OR ', $choice_texts_clauses); $choice_texts_clause = "\n\t\t\t\t\t\tl.id IN (\n SELECT\n lead_id\n FROM {$lead_details_table_name}\n WHERE {$choice_texts_clause} ) OR "; } $choice_value_clause = $wpdb->prepare("value {$operator} %s", $search_term); $sql_array[] = '(' . $choice_texts_clause . $choice_value_clause . ')'; break; case "meta": /* doesn't support "<>" for multiple values of the same key */ $meta = rgar($entry_meta, $key); $placeholder = rgar($meta, "is_numeric") ? "%s" : "%s"; $search_term = "like" == $operator ? "%{$val}%" : $val; $sql_array[] = $wpdb->prepare("\n l.id IN\n (\n SELECT\n lead_id\n FROM {$lead_meta_table_name}\n WHERE meta_key=%s AND meta_value {$operator} {$placeholder}\n {$form_id_where}\n )", $search["key"], $search_term); break; } } $sql = empty($sql_array) ? "" : join(" " . $search_operator . " ", $sql_array); return $sql; }
function get_counts($args) { if (!empty($args['field_filters'])) { if (isset($args['form-id'])) { $form_ids = absint($args['form-id']); } else { $form_ids = $this->get_workflow_form_ids(); } $results = new stdClass(); $results->total = 0; $results->pending = 0; $results->complete = 0; $results->cancelled = 0; if (empty($form_ids)) { $this->items = array(); return $results; } $base_search_criteria = $this->get_search_criteria(); $pending_search_criteria = $base_search_criteria; $pending_search_criteria['field_filters'][] = array('key' => 'workflow_final_status', 'value' => 'pending'); $complete_search_criteria = $base_search_criteria; $complete_search_criteria['field_filters'][] = array('key' => 'workflow_final_status', 'operator' => 'not in', 'value' => array('pending', 'cancelled')); $cancelled_search_criteria = $base_search_criteria; $cancelled_search_criteria['field_filters'][] = array('key' => 'workflow_final_status', 'value' => 'cancelled'); $results->total = GFAPI::count_entries($form_ids, $base_search_criteria); $results->pending = GFAPI::count_entries($form_ids, $pending_search_criteria); $results->complete = GFAPI::count_entries($form_ids, $complete_search_criteria); $results->cancelled = GFAPI::count_entries($form_ids, $cancelled_search_criteria); return $results; } global $wpdb; if (!empty($args['form-id'])) { $form_clause = ' AND l.form_id=' . absint($args['form-id']); } else { $form_ids = $this->get_workflow_form_ids(); if (empty($form_ids)) { $results = new stdClass(); $results->pending = 0; $results->complete = 0; $results->cancelled = 0; return $results; } $form_clause = ' AND l.form_id IN(' . join(',', $form_ids) . ')'; } $start_clause = ''; if (!empty($args['start-date'])) { $start_clause = $wpdb->prepare(' AND l.date_created >= %s', $args['start-date']); } $end_clause = ''; if (!empty($args['end-date'])) { $end_clause = $wpdb->prepare(' AND l.date_created <= %s', $args['end-date']); } $user_id_clause = ''; if (!$this->display_all) { $user = wp_get_current_user(); $user_id_clause = $wpdb->prepare(' AND created_by=%d', $user->ID); } $lead_table = GFFormsModel::get_lead_table_name(); $meta_table = GFFormsModel::get_lead_meta_table_name(); $sql = "SELECT\n\t\t(SELECT count(distinct(l.id)) FROM {$lead_table} l WHERE l.status='active' {$form_clause} {$start_clause} {$end_clause} {$user_id_clause}) as total,\n\t\t(SELECT count(distinct(l.id)) FROM {$lead_table} l INNER JOIN {$meta_table} m ON l.id = m.lead_id WHERE l.status='active' AND meta_key='workflow_final_status' AND meta_value='pending' {$form_clause} {$start_clause} {$end_clause} {$user_id_clause}) as pending,\n\t\t(SELECT count(distinct(l.id)) FROM {$lead_table} l INNER JOIN {$meta_table} m ON l.id = m.lead_id WHERE l.status='active' AND meta_key='workflow_final_status' AND meta_value NOT IN('pending', 'cancelled') {$form_clause} {$start_clause} {$end_clause} {$user_id_clause}) as complete,\n\t\t(SELECT count(distinct(l.id)) FROM {$lead_table} l INNER JOIN {$meta_table} m ON l.id = m.lead_id WHERE l.status='active' AND meta_key='workflow_final_status' AND meta_value='cancelled' {$form_clause} {$start_clause} {$end_clause} {$user_id_clause}) as cancelled\n\t\t"; $results = $wpdb->get_results($sql); return $results[0]; }
public function maybe_process_queued_entries() { $this->log_debug(__METHOD__ . '(): starting'); $form_ids = $this->get_workflow_form_ids(); if (empty($form_ids)) { return; } global $wpdb; $lead_table = GFFormsModel::get_lead_table_name(); $meta_table = GFFormsModel::get_lead_meta_table_name(); $sql = "\nSELECT l.id, l.form_id\nFROM {$lead_table} l\nINNER JOIN {$meta_table} m\nON l.id = m.lead_id\nAND l.status='active'\nAND m.meta_key LIKE 'workflow_step_status_%'\nAND m.meta_value='queued'"; $results = $wpdb->get_results($sql); if (empty($results) || is_wp_error($results)) { return; } $this->log_debug(__METHOD__ . '() Queued entries: ' . print_r($results, true)); foreach ($results as $result) { $form = GFAPI::get_form($result->form_id); $entry = GFAPI::get_entry($result->id); $step = $this->get_current_step($form, $entry); if ($step) { $complete = $step->start(); if ($complete) { $this->process_workflow($form, $entry['id']); } else { $this->log_debug(__METHOD__ . '() queued entry started step but step is not complete: ' . $entry['id']); } } else { $this->log_debug(__METHOD__ . '() queued entry not on a step: ' . $entry['id']); } } }