Completed
Push — master ( f08bb3...dda2f6 )
by Jamie
03:30
created

FrmXMLController::csv()   B

Complexity

Conditions 8
Paths 48

Size

Total Lines 54
Code Lines 29

Duplication

Lines 0
Ratio 0 %
Metric Value
dl 0
loc 54
rs 7.412
cc 8
eloc 29
nc 48
nop 3

How to fix   Long Method   

Long Method

Small methods make your code easier to understand, in particular if combined with a good name. Besides, if your method is small, finding a good name is usually much easier.

For example, if you find yourself adding comments to a method's body, this is usually a good sign to extract the commented part to a new method, and use the comment as a starting point when coming up with a good name for this new method.

Commonly applied refactorings include:

1
<?php
2
3
class FrmXMLController {
4
5
    public static function menu() {
6
        add_submenu_page('formidable', 'Formidable | '. __( 'Import/Export', 'formidable' ), __( 'Import/Export', 'formidable' ), 'frm_edit_forms', 'formidable-import', 'FrmXMLController::route');
7
    }
8
9
    public static function add_default_templates() {
10
		if ( ! function_exists( 'libxml_disable_entity_loader' ) ) {
11
    		// XML import is not enabled on your server
12
    		return;
13
    	}
14
15
        $set_err = libxml_use_internal_errors(true);
16
        $loader = libxml_disable_entity_loader( true );
17
18
		$files = apply_filters( 'frm_default_templates_files', array( FrmAppHelper::plugin_path() . '/classes/views/xml/default-templates.xml' ) );
19
20
        foreach ( (array) $files as $file ) {
21
            FrmXMLHelper::import_xml($file);
22
            unset($file);
23
        }
24
        /*
25
        if(is_wp_error($result))
26
            $errors[] = $result->get_error_message();
27
        else if($result)
28
            $message = $result;
29
        */
30
31
        unset( $files );
32
33
        libxml_use_internal_errors( $set_err );
34
    	libxml_disable_entity_loader( $loader );
35
    }
36
37
    public static function route() {
38
        $action = isset( $_REQUEST['frm_action'] ) ? 'frm_action' : 'action';
1 ignored issue
show
introduced by
Detected access of super global var $_REQUEST, probably need manual inspection.
Loading history...
39
		$action = FrmAppHelper::get_param( $action, '', 'get', 'sanitize_title' );
40
		if ( $action == 'import_xml' ) {
41
            return self::import_xml();
42
		} else if ( $action == 'export_xml' ) {
43
            return self::export_xml();
44
        } else {
45
            if ( apply_filters( 'frm_xml_route', true, $action ) ) {
46
                return self::form();
47
            }
48
        }
49
    }
50
51
    public static function form( $errors = array(), $message = '' ) {
52
		$where = array(
53
			'parent_form_id' => array( null, 0 ),
54
			'status' => array( null, '', 'published' )
55
		);
56
		$forms = FrmForm::getAll( $where, 'name' );
57
58
        $export_types = apply_filters( 'frm_xml_export_types',
59
            array( 'forms' => __( 'Forms', 'formidable' ), 'items' => __( 'Entries', 'formidable' ) )
60
        );
61
62
        $export_format = apply_filters( 'frm_export_formats', array(
63
            'xml' => array( 'name' => 'XML', 'support' => 'forms', 'count' => 'multiple' ),
64
			'csv' => array( 'name' => 'CSV', 'support' => 'items', 'count' => 'single' ),
65
        ) );
66
67
        include(FrmAppHelper::plugin_path() .'/classes/views/xml/import_form.php');
68
    }
69
70
    public static function import_xml() {
71
        $errors = array();
72
        $message = '';
73
74
        $permission_error = FrmAppHelper::permission_nonce_error('frm_edit_forms', 'import-xml', 'import-xml-nonce');
75
        if ( $permission_error !== false ) {
76
            $errors[] = $permission_error;
77
            self::form($errors);
78
            return;
79
        }
80
81
        if ( ! isset($_FILES) || ! isset($_FILES['frm_import_file']) || empty($_FILES['frm_import_file']['name']) || (int) $_FILES['frm_import_file']['size'] < 1 ) {
82
            $errors[] = __( 'Oops, you didn\'t select a file.', 'formidable' );
83
            self::form($errors);
84
            return;
85
        }
86
87
        $file = $_FILES['frm_import_file']['tmp_name'];
88
89
        if ( ! is_uploaded_file( $file ) ) {
90
            unset($file);
91
            $errors[] = __( 'The file does not exist, please try again.', 'formidable' );
92
            self::form($errors);
93
            return;
94
        }
95
96
        //add_filter('upload_mimes', 'FrmXMLController::allow_mime');
97
98
        $export_format = apply_filters('frm_export_formats', array(
99
			'xml' => array( 'name' => 'XML', 'support' => 'forms', 'count' => 'multiple' ),
100
		) );
101
102
        $file_type = strtolower(pathinfo($_FILES['frm_import_file']['name'], PATHINFO_EXTENSION));
103
        if ( $file_type != 'xml' && isset( $export_format[ $file_type ] ) ) {
104
            // allow other file types to be imported
105
            do_action('frm_before_import_'. $file_type );
106
            return;
107
        }
108
        unset($file_type);
109
110
		if ( ! function_exists( 'libxml_disable_entity_loader' ) ) {
111
			$errors[] = __( 'XML import is not enabled on your server.', 'formidable' );
112
			self::form( $errors );
113
			return;
114
		}
115
116
		$set_err = libxml_use_internal_errors( true );
117
		$loader = libxml_disable_entity_loader( true );
118
119
		$result = FrmXMLHelper::import_xml( $file );
120
		FrmXMLHelper::parse_message( $result, $message, $errors );
121
122
		unset( $file );
123
124
		libxml_use_internal_errors( $set_err );
125
		libxml_disable_entity_loader( $loader );
126
127
        self::form($errors, $message);
128
    }
129
130
    public static function export_xml() {
131
        $error = FrmAppHelper::permission_nonce_error( 'frm_edit_forms', 'export-xml', 'export-xml-nonce' );
132
        if ( ! empty($error) ) {
133
            wp_die( $error );
134
        }
135
136
		$ids = FrmAppHelper::get_post_param( 'frm_export_forms', array() );
137
		$type = FrmAppHelper::get_post_param( 'type', array() );
138
		$format = FrmAppHelper::get_post_param( 'format', 'xml', 'sanitize_title' );
139
140
        if ( ! headers_sent() && ! $type ) {
141
            wp_redirect( esc_url_raw( admin_url( 'admin.php?page=formidable-import' ) ) );
142
            die();
143
        }
144
145
        if ( $format == 'xml' ) {
146
            self::generate_xml($type, compact('ids'));
147
		} if ( $format == 'csv' ) {
148
			self::generate_csv( compact('ids') );
149
        } else {
150
            do_action('frm_export_format_'. $format, compact('ids'));
151
        }
152
153
        wp_die();
154
    }
155
156
	public static function generate_xml( $type, $args = array() ) {
157
    	global $wpdb;
158
159
	    $type = (array) $type;
160
        if ( in_array( 'items', $type) && ! in_array( 'forms', $type) ) {
161
            // make sure the form is included if there are entries
162
            $type[] = 'forms';
163
        }
164
165
	    if ( in_array( 'forms', $type) ) {
166
            // include actions with forms
167
	        $type[] = 'actions';
168
	    }
169
170
	    $tables = array(
171
	        'items'     => $wpdb->prefix .'frm_items',
172
	        'forms'     => $wpdb->prefix .'frm_forms',
173
	        'posts'     => $wpdb->posts,
174
	        'styles'    => $wpdb->posts,
175
	        'actions'   => $wpdb->posts,
176
	    );
177
178
		$defaults = array( 'ids' => false );
179
	    $args = wp_parse_args( $args, $defaults );
180
181
        $sitename = sanitize_key( get_bloginfo( 'name' ) );
182
183
    	if ( ! empty( $sitename ) ) {
184
			$sitename .= '.';
185
		}
186
    	$filename = $sitename . 'formidable.' . date( 'Y-m-d' ) . '.xml';
187
188
    	header( 'Content-Description: File Transfer' );
189
    	header( 'Content-Disposition: attachment; filename=' . $filename );
190
    	header( 'Content-Type: text/xml; charset=' . get_option( 'blog_charset' ), true );
191
192
        //make sure ids are numeric
193
    	if ( is_array( $args['ids'] ) && ! empty( $args['ids'] ) ) {
194
	        $args['ids'] = array_filter( $args['ids'], 'is_numeric' );
195
	    }
196
197
	    $records = array();
198
199
		foreach ( $type as $tb_type ) {
200
            $where = array();
201
			$join = '';
202
            $table = $tables[ $tb_type ];
203
204
            $select = $table .'.id';
205
            $query_vars = array();
206
207
            switch ( $tb_type ) {
208
                case 'forms':
209
                    //add forms
210
                    if ( $args['ids'] ) {
211
						$where[] = array( 'or' => 1, $table . '.id' => $args['ids'], $table .'.parent_form_id' => $args['ids'] );
212
                	} else {
213
						$where[ $table . '.status !' ] = 'draft';
214
                	}
215
                break;
216
                case 'actions':
217
                    $select = $table .'.ID';
218
					$where['post_type'] = FrmFormActionsController::$action_post_type;
219
                    if ( ! empty($args['ids']) ) {
220
						$where['menu_order'] = $args['ids'];
221
                    }
222
                break;
223
                case 'items':
224
                    //$join = "INNER JOIN {$wpdb->prefix}frm_item_metas im ON ($table.id = im.item_id)";
225
                    if ( $args['ids'] ) {
226
						$where[ $table . '.form_id' ] = $args['ids'];
227
                    }
228
                break;
229
                case 'styles':
230
                    // Loop through all exported forms and get their selected style IDs
231
                    $form_ids = $args['ids'];
232
                    $style_ids = array();
233
                    foreach ( $form_ids as $form_id ) {
234
                        $form_data = FrmForm::getOne( $form_id );
235
                        // For forms that have not been updated while running 2.0, check if custom_style is set
236
                        if ( isset( $form_data->options['custom_style'] ) ) {
237
                            $style_ids[] = $form_data->options['custom_style'];
238
                        }
239
                        unset( $form_id, $form_data );
240
                    }
241
                    $select = $table .'.ID';
242
                    $where['post_type'] = 'frm_styles';
243
244
                    // Only export selected styles
245
                    if ( ! empty( $style_ids ) ) {
246
                        $where['ID'] = $style_ids;
247
                    }
248
                break;
249
                default:
250
                    $select = $table .'.ID';
251
                    $join = ' INNER JOIN ' . $wpdb->postmeta . ' pm ON (pm.post_id=' . $table . '.ID)';
252
                    $where['pm.meta_key'] = 'frm_form_id';
253
254
                    if ( empty($args['ids']) ) {
255
                        $where['pm.meta_value >'] = 1;
256
                    } else {
257
                        $where['pm.meta_value'] = $args['ids'];
258
                    }
259
                break;
260
            }
261
262
			$records[ $tb_type ] = FrmDb::get_col( $table . $join, $where, $select );
263
            unset($tb_type);
264
        }
265
266
		echo '<?xml version="1.0" encoding="' . esc_attr( get_bloginfo('charset') ) . "\" ?>\n";
267
        include(FrmAppHelper::plugin_path() .'/classes/views/xml/xml.php');
268
    }
269
270
271
	public static function generate_csv( $atts ) {
272
		$form_ids = $atts['ids'];
273
		if ( empty( $form_ids ) ) {
274
			wp_die( __( 'Please select a form', 'formidable' ) );
275
		}
276
		self::csv( reset( $form_ids ) );
277
	}
278
279
	/**
280
	 * Export to CSV
281
	 * @since 2.0.19
282
	 */
283
	public static function csv( $form_id = false, $search = '', $fid = '' ) {
284
		FrmAppHelper::permission_check( 'frm_view_entries' );
285
286
		if ( ! $form_id ) {
287
			$form_id = FrmAppHelper::get_param( 'form', '', 'get', 'sanitize_text_field' );
288
			$search = FrmAppHelper::get_param( ( isset( $_REQUEST['s'] ) ? 's' : 'search' ), '', 'get', 'sanitize_text_field' );
289
			$fid = FrmAppHelper::get_param( 'fid', '', 'get', 'sanitize_text_field' );
290
		}
291
292
		if ( ! ini_get('safe_mode') ) {
293
			set_time_limit(0); //Remove time limit to execute this function
294
			$mem_limit = str_replace('M', '', ini_get('memory_limit'));
295
			if ( (int) $mem_limit < 256 ) {
296
				ini_set('memory_limit', '256M');
297
			}
298
		}
299
300
		global $wpdb;
301
302
		$form = FrmForm::getOne( $form_id );
303
		$form_id = $form->id;
304
305
		$form_cols = self::get_fields_for_csv_export( $form_id, $form );
306
307
		$item_id = FrmAppHelper::get_param( 'item_id', 0, 'get', 'sanitize_text_field' );
308
		if ( ! empty( $item_id ) ) {
309
			$item_id = explode( ',', $item_id );
310
		}
311
312
		$query = array( 'form_id' => $form_id );
313
314
		if ( $item_id ) {
315
			$query['id'] = $item_id;
316
		}
317
318
		/**
319
		 * Allows the query to be changed for fetching the entry ids to include in the export
320
		 *
321
		 * $query is the array of options to be filtered. It includes form_id, and maybe id (array of entry ids),
322
		 * and the search query. This should return an array, but it can be handled as a string as well.
323
		 */
324
		$query = apply_filters( 'frm_csv_where', $query, compact( 'form_id', 'search', 'fid', 'item_id' ) );
325
326
		$entry_ids = FrmDb::get_col( $wpdb->prefix .'frm_items it', $query );
327
		unset( $query );
328
329
		if ( empty( $entry_ids ) ) {
330
			esc_html_e( 'There are no entries for that form.', 'formidable' );
331
		} else {
332
			FrmCSVExportHelper::generate_csv( compact( 'form', 'entry_ids', 'form_cols' ) );
333
		}
334
335
		wp_die();
336
	}
337
338
	/**
339
	* Get the fields that should be included in the CSV export
340
	*
341
	* @since 2.0.19
342
	*
343
	* @param int $form_id
344
	* @param object $form
345
	* @return array $csv_fields
346
	*/
347
	private static function get_fields_for_csv_export( $form_id, $form ) {
348
		$csv_field_ids = apply_filters( 'frm_csv_field_ids', '', $form_id, array( 'form' => $form ) );
349
350
		if ( $csv_field_ids ) {
351
			$where = array( 'fi.type not' => FrmField::no_save_fields() );
352
			$where[] = array( 'or' => 1, 'fi.form_id' => $form->id, 'fr.parent_form_id' => $form->id );
353
			if ( ! is_array( $csv_field_ids ) ) {
354
				$csv_field_ids = explode( ',', $csv_field_ids );
355
			}
356
			if ( ! empty( $csv_field_ids ) )	{
357
				$where['fi.id'] = $csv_field_ids;
358
			}
359
			$csv_fields = FrmField::getAll( $where, 'field_order' );
360
		} else {
361
			$csv_fields = FrmField::get_all_for_form( $form_id, '', 'include', 'include' );
362
			$no_export_fields = FrmField::no_save_fields();
363
			foreach ( $csv_fields as $k => $f ) {
364
				if ( in_array( $f->type, $no_export_fields ) ) {
365
					unset( $csv_fields[ $k ] );
366
				}
367
			}
368
		}
369
370
		return $csv_fields;
371
	}
372
373
	public static function allow_mime( $mimes ) {
374
        if ( ! isset( $mimes['csv'] ) ) {
375
            // allow csv files
376
            $mimes['csv'] = 'text/csv';
377
        }
378
379
        if ( ! isset( $mimes['xml'] ) ) {
380
            // allow xml
381
            $mimes['xml'] = 'text/xml';
382
        }
383
384
        return $mimes;
385
    }
386
}
387