public static function csv($form_id = false, $search = '', $fid = '')
 {
     FrmAppHelper::permission_check('frm_view_entries');
     if (!$form_id) {
         $form_id = FrmAppHelper::get_param('form', '', 'get', 'sanitize_text_field');
         $search = FrmAppHelper::get_param(isset($_REQUEST['s']) ? 's' : 'search', '', 'get', 'sanitize_text_field');
         $fid = FrmAppHelper::get_param('fid', '', 'get', 'sanitize_text_field');
     }
     if (!ini_get('safe_mode')) {
         set_time_limit(0);
         //Remove time limit to execute this function
         $mem_limit = str_replace('M', '', ini_get('memory_limit'));
         if ((int) $mem_limit < 256) {
             ini_set('memory_limit', '256M');
         }
     }
     global $wpdb;
     $form = FrmForm::getOne($form_id);
     $form_id = $form->id;
     $where = array('fi.type not' => FrmField::no_save_fields());
     $where[] = array('or' => 1, 'fi.form_id' => $form->id, 'fr.parent_form_id' => $form->id);
     $csv_fields = apply_filters('frm_csv_field_ids', '', $form_id, array('form' => $form));
     if ($csv_fields) {
         if (!is_array($csv_fields)) {
             $csv_fields = explode(',', $csv_fields);
         }
         if (!empty($csv_fields)) {
             $where['fi.id'] = $csv_fields;
         }
     }
     $form_cols = FrmField::getAll($where, 'field_order');
     $item_id = FrmAppHelper::get_param('item_id', false, 'get', 'sanitize_text_field');
     if (!empty($item_id)) {
         $item_id = explode(',', $item_id);
     }
     $query = array('form_id' => $form_id);
     if ($item_id) {
         $query['id'] = $item_id;
     }
     if (!empty($search) && !$item_id) {
         $query = FrmProEntriesHelper::get_search_str($query, $search, $form_id, $fid);
     }
     /**
      * Allows the query to be changed for fetching the entry ids to include in the export
      *
      * $query is the array of options to be filtered. It includes form_id, and maybe id (array of entry ids),
      * and the search query. This should return an array, but it can be handled as a string as well.
      */
     $query = apply_filters('frm_csv_where', $query, compact('form_id'));
     $entry_ids = FrmDb::get_col($wpdb->prefix . 'frm_items it', $query);
     unset($query);
     if (empty($entry_ids)) {
         esc_html_e('There are no entries for that form.', 'formidable');
     } else {
         FrmProCSVExportHelper::generate_csv(compact('form', 'entry_ids', 'form_cols'));
     }
     wp_die();
 }
 private static function prepare_next_csv_rows($next_set)
 {
     // order by parent_item_id so children will be first
     $entries = FrmEntry::getAll(array('or' => 1, 'id' => $next_set, 'parent_item_id' => $next_set), ' ORDER BY parent_item_id DESC', '', true, false);
     foreach ($entries as $k => $entry) {
         self::$entry = $entry;
         unset($entry);
         if (self::$entry->form_id != self::$form_id) {
             self::add_repeat_field_values_to_csv($entries);
         } else {
             self::prepare_csv_row();
         }
     }
 }