public function get_results_data($form, $fields, $search_criteria = array(), $state_array = array(), $max_execution_time = 15) { // todo: add hooks to modify $max_execution_time and $page_size? $page_size = 200; $time_start = microtime(true); $form_id = $form["id"]; $data = array(); $offset = 0; $entry_count = 0; $field_data = array(); if ($state_array) { //get counts from state $data = $state_array; $offset = (int) rgar($data, "offset"); unset($data["offset"]); $entry_count = $offset; $field_data = rgar($data, "field_data"); } else { //initialize counts foreach ($fields as $field) { $field_type = GFFormsModel::get_input_type($field); if (false === isset($field["choices"])) { $field_data[$field["id"]] = 0; continue; } $choices = $field["choices"]; if ($field_type == "likert" && rgar($field, "gsurveyLikertEnableMultipleRows")) { foreach ($field["gsurveyLikertRows"] as $row) { foreach ($choices as $choice) { $field_data[$field["id"]][$row["value"]][$choice['value']] = 0; } } } else { foreach ($choices as $choice) { $field_data[$field["id"]][$choice['value']] = 0; } } if ($field_type == "likert" && rgar($field, "gsurveyLikertEnableScoring")) { $field_data[$field["id"]]["sum_of_scores"] = 0; } } } $count_search_leads = GFFormsModel::count_search_leads($form_id, $search_criteria); $data["entry_count"] = $count_search_leads; $entries_left = $count_search_leads - $offset; while ($entries_left >= 0) { $paging = array('offset' => $offset, 'page_size' => $page_size); $search_leads_time_start = microtime(true); $leads = GFFormsModel::search_leads($form_id, $search_criteria, null, $paging); $search_leads_time_end = microtime(true); $search_leads_time = $search_leads_time_end - $search_leads_time_start; $leads_in_search = count($leads); $entry_count += $leads_in_search; foreach ($leads as $lead) { foreach ($fields as $field) { $field_type = GFFormsModel::get_input_type($field); $field_id = $field["id"]; $value = RGFormsModel::get_lead_field_value($lead, $field); if ($field_type == "likert" && rgar($field, "gsurveyLikertEnableMultipleRows")) { if (empty($value)) { continue; } foreach ($value as $value_vector) { if (empty($value_vector)) { continue; } list($row_val, $col_val) = explode(":", $value_vector, 2); if (isset($field_data[$field["id"]][$row_val]) && isset($field_data[$field["id"]][$row_val][$col_val])) { $field_data[$field["id"]][$row_val][$col_val]++; } } } elseif ($field_type == "rank") { $score = count(rgar($field, "choices")); $values = explode(",", $value); foreach ($values as $ranked_value) { $field_data[$field["id"]][$ranked_value] += $score; $score--; } } else { if (false === isset($field["choices"])) { if (false === empty($value)) { $field_data[$field_id]++; } continue; } $choices = $field["choices"]; foreach ($choices as $choice) { $choice_is_selected = false; if (is_array($value)) { $choice_value = rgar($choice, "value"); if (in_array($choice_value, $value)) { $choice_is_selected = true; } } else { if (RGFormsModel::choice_value_match($field, $choice, $value)) { $choice_is_selected = true; } } if ($choice_is_selected) { $field_data[$field_id][$choice['value']]++; } } } if ($field_type == "likert" && rgar($field, "gsurveyLikertEnableScoring")) { $field_data[$field["id"]]["sum_of_scores"] += $this->get_likert_score($field, $lead); } } } $data["field_data"] = $field_data; if (isset($this->_callbacks["calculation"])) { $data = call_user_func($this->_callbacks["calculation"], $data, $form, $fields, $leads); } $offset += $page_size; $entries_left -= $page_size; $time_end = microtime(true); $execution_time = $time_end - $time_start; if ($entries_left > 0 && $execution_time + $search_leads_time > $max_execution_time) { $data["status"] = "incomplete"; $data["offset"] = $offset; $progress = $data["entry_count"] > 0 ? round($data["offset"] / $data["entry_count"] * 100) : 0; $data["progress"] = $progress; break; } if ($entries_left <= 0) { $data["status"] = "complete"; } } $data["timestamp"] = time(); return $data; }
/** * Returns the total number of entries for the given search criteria. See get_entries() for examples of the search criteria. * * @since 1.8 * @access public * @static * * @param int|array $form_ids The ID of the Form or an array of Form IDs * @param array $search_criteria Optional. An array containing the search criteria * * @return int The total count */ public static function count_entries($form_ids, $search_criteria = array()) { return GFFormsModel::count_search_leads($form_ids, $search_criteria); }
public static function get_entries_data($form, $fields, $search_criteria = array(), $state_array = array()) { $view_slug = rgpost("view"); //todo: add hooks to modify $max_execution_time and $page_size $max_execution_time = 25; //seconds $page_size = 200; $time_start = microtime(true); $data = array(); $offset = 0; $entry_count = 0; $field_data = array(); $form_id = $form['id']; if ($state_array) { //get counts from state $data = $state_array; $offset = (int) rgar($data, "offset"); $entry_count = $offset; $field_data = rgar($data, "field_data"); } else { //initialize counts foreach ($fields as $field) { $field_type = GFFormsModel::get_input_type($field); if (false === isset($field["choices"])) { $field_data[$field["id"]] = 0; continue; } $choices = $field["choices"]; if ($field_type == "likert" && rgar($field, "gsurveyLikertEnableMultipleRows")) { foreach ($field["gsurveyLikertRows"] as $row) { foreach ($choices as $choice) { $field_data[$field["id"]][$row["value"]][$choice['value']] = 0; } } } else { foreach ($choices as $choice) { $field_data[$field["id"]][$choice['value']] = 0; } } } } $count_search_leads = GFFormsModel::count_search_leads($form_id, $search_criteria); $data["entry_count"] = $count_search_leads; $entries_left = $count_search_leads - $offset; while ($entries_left >= 0) { $paging = array('offset' => $offset, 'page_size' => $page_size); $search_leads_time_start = microtime(true); $leads = GFFormsModel::search_leads($form_id, $search_criteria, null, $paging); $search_leads_time_end = microtime(true); $search_leads_time = $search_leads_time_end - $search_leads_time_start; $leads_in_search = count($leads); $entry_count += $leads_in_search; foreach ($leads as $lead) { foreach ($fields as $field) { $field_type = GFFormsModel::get_input_type($field); $field_id = $field["id"]; $value = RGFormsModel::get_lead_field_value($lead, $field); if ($field_type == "likert" && rgar($field, "gsurveyLikertEnableMultipleRows")) { if (empty($value)) { continue; } foreach ($value as $value_vector) { if (empty($value_vector)) { continue; } list($row_val, $col_val) = explode(":", $value_vector, 2); if (isset($field_data[$field["id"]][$row_val]) && isset($field_data[$field["id"]][$row_val][$col_val])) { $field_data[$field["id"]][$row_val][$col_val]++; } } } elseif ($field_type == "rank") { $score = count(rgar($field, "choices")); $values = explode(",", $value); foreach ($values as $ranked_value) { $field_data[$field["id"]][$ranked_value] += $score; $score--; } } else { if (false === isset($field["choices"])) { if (false === empty($value)) { $field_data[$field_id]++; } continue; } $choices = $field["choices"]; foreach ($choices as $choice) { $choice_is_selected = false; if (is_array($value)) { $choice_value = rgar($choice, "value"); if (in_array($choice_value, $value)) { $choice_is_selected = true; } } else { if (RGFormsModel::choice_value_match($field, $choice, $value)) { $choice_is_selected = true; } } if ($choice_is_selected) { $field_data[$field_id][$choice['value']]++; } } } } } $data["field_data"] = $field_data; $data = apply_filters("gresults_entries_data_" . $view_slug, $data, $form, $fields, $leads); if ($leads_in_search < $page_size) { $data["status"] = "complete"; break; } $offset += $page_size; $entries_left -= $page_size; $time_end = microtime(true); $execution_time = $time_end - $time_start; if ($execution_time + $search_leads_time > $max_execution_time) { $data["status"] = "incomplete"; $data["offset"] = $offset; break; } } return $data; }