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;
 }
Exemple #2
0
 /**
  * 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);
 }
Exemple #3
0
 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;
 }