PluginProbe
Formidable Forms – WordPress Form Builder for Contact Forms, Calculators, Quizzes & More / 3.06.06
Formidable Forms – WordPress Form Builder for Contact Forms, Calculators, Quizzes & More v3.06.06
6.35 6.34 6.33.1 6.33 6.32.1 6.32 6.31 6.25 6.25.1 6.26 6.26.1 6.27 6.28 6.29 6.3 6.3.1 6.3.2 6.30 6.4 6.4.1 6.4.2 6.5 6.5.1 6.5.2 6.5.3 All 141 releases
← All changes | classes/controllers/FrmXMLController.php +114 -408 6.283.06.06 View file →
@@ -1,31 +1,23 @@
1 1 <?php
2 -if ( ! defined( 'ABSPATH' ) ) {
3 - die( 'You are not allowed to call this page directly.' );
4 -}
5 2
6 3 class FrmXMLController {
7 4
8 - /**
9 - * @return void
10 - */
11 5 public static function menu() {
12 - add_submenu_page( 'formidable', 'Formidable | ' . __( 'Import/Export', 'formidable' ), __( 'Import/Export', 'formidable' ), 'frm_edit_forms', 'formidable-import', 'FrmXMLController::route' ); // phpcs:ignore SlevomatCodingStandard.Files.LineLength.LineTooLong
6 + add_submenu_page( 'formidable', 'Formidable | ' . __( 'Import/Export', 'formidable' ), __( 'Import/Export', 'formidable' ), 'frm_edit_forms', 'formidable-import', 'FrmXMLController::route' );
13 7 }
14 8
15 - /**
16 - * @return void
17 - */
18 9 public static function add_default_templates() {
19 - if ( FrmXMLHelper::check_if_libxml_disable_entity_loader_exists() ) {
20 - // XML import is not enabled on your server.
10 + if ( ! function_exists( 'libxml_disable_entity_loader' ) ) {
11 + // XML import is not enabled on your server
21 12 return;
22 13 }
23 14
24 15 $set_err = libxml_use_internal_errors( true );
25 - $loader = FrmXMLHelper::maybe_libxml_disable_entity_loader( true );
26 - $files = apply_filters( 'frm_default_templates_files', array() );
16 + $loader = libxml_disable_entity_loader( true );
27 17
18 + $files = apply_filters( 'frm_default_templates_files', array() );
19 +
28 20 foreach ( (array) $files as $file ) {
29 21 FrmXMLHelper::import_xml( $file );
30 22 unset( $file );
31 23 }
@@ -32,42 +24,23 @@
32 24
33 25 unset( $files );
34 26
35 27 libxml_use_internal_errors( $set_err );
36 - FrmXMLHelper::maybe_libxml_disable_entity_loader( $loader );
28 + libxml_disable_entity_loader( $loader );
37 29 }
38 30
31 +
39 32 /**
40 33 * Use the template link to install the XML template
41 34 *
42 35 * @since 3.06
43 - *
44 - * @return void
45 36 */
46 37 public static function install_template() {
47 - FrmAppHelper::permission_check( 'frm_edit_forms' );
38 + FrmAppHelper::permission_check( 'frm_create_forms' );
48 39 check_ajax_referer( 'frm_ajax', 'nonce' );
49 40
50 - if ( ! function_exists( 'simplexml_load_string' ) ) {
51 - $response = array(
52 - 'message' => __( 'Your server is missing the Simple XML extension. This is required to install a template.', 'formidable' ),
53 - );
54 - echo wp_json_encode( $response );
55 - wp_die();
56 - }
41 + $url = FrmAppHelper::get_param( 'xml', '', 'post', 'esc_url_raw' );
57 42
58 - $form = self::get_posted_form();
59 - $url = FrmAppHelper::get_param( 'xml', '', 'post', 'esc_url_raw' );
60 - self::override_url( $form, $url );
61 -
62 - if ( ! self::validate_xml_url( $url ) ) {
63 - $response = array(
64 - 'message' => __( 'The template you are trying to install could not be validated.', 'formidable' ),
65 - );
66 - echo wp_json_encode( $response );
67 - wp_die();
68 - }
69 -
70 43 $response = wp_remote_get( $url );
71 44 $body = wp_remote_retrieve_body( $response );
72 45 $xml = simplexml_load_string( $body );
73 46
@@ -72,9 +45,9 @@
72 45 $xml = simplexml_load_string( $body );
73 46
74 47 if ( ! $xml ) {
75 48 $response = array(
76 - 'message' => __( 'There was an error reading the form template.', 'formidable' ),
49 + 'message' => __( 'There was an error reading the form template', 'formidable' ),
77 50 );
78 51 echo wp_json_encode( $response );
79 52 wp_die();
80 53 }
@@ -80,175 +53,35 @@
80 53 }
81 54
82 55 self::set_new_form_name( $xml );
83 56
84 - $imported = FrmXMLHelper::import_xml_now( $xml, true );
85 -
86 - if ( ! empty( $imported['form_status'] ) ) {
57 + $imported = FrmXMLHelper::import_xml_now( $xml );
58 + if ( isset( $imported['form_status'] ) && ! empty( $imported['form_status'] ) ) {
87 59 // Get the last form id in case there are child forms.
88 - $form_id = array_key_last( $imported['form_status'] );
60 + end( $imported['form_status'] );
61 + $form_id = key( $imported['form_status'] );
89 62 $response = array(
90 63 'id' => $form_id,
91 - 'redirect' => FrmForm::get_edit_link( $form_id ) . '&new_template=true',
64 + 'redirect' => admin_url( 'admin.php?page=formidable&frm_action=edit&id=' . absint( $form_id ) ),
92 65 'success' => 1,
93 66 );
94 -
95 - if ( ! empty( $imported['imported']['posts'] ) ) {
96 - // Return the link to the last page created.
97 - $pages = $imported['posts'];
98 - }
99 -
100 - if ( $form ) {
101 - // Create selected pages with the correct shortcodes.
102 - $pages = self::create_pages_for_import( $form );
103 - }
104 -
105 - if ( ! empty( $pages ) ) {
106 - $post_id = end( $pages );
107 - $response['redirect'] = get_permalink( $post_id );
108 - }
109 67 } else {
110 - $message = $imported['error'] ?? __( 'There was an error importing form', 'formidable' );
111 68 $response = array(
112 - 'message' => $message,
69 + 'message' => __( 'There was an error importing form', 'formidable' ),
113 70 );
114 - }//end if
71 + }
115 72
116 - /**
117 - * @since 6.18 Added `url` to the $args.
118 - */
119 - $response = apply_filters( 'frm_xml_response', $response, compact( 'form', 'imported', 'url' ) );
120 -
121 73 echo wp_json_encode( $response );
122 74 wp_die();
123 75 }
124 76
125 77 /**
126 - * Make sure that the XML file we're trying to load is in fact an XML file, and that it's coming from our S3 bucket.
127 - * This is to make sure that the URL can't be exploited for a SSRF attack.
128 - *
129 - * @since 5.5.5
130 - *
131 - * @param string $url
132 - *
133 - * @return bool True on success, False on error.
134 - */
135 - private static function validate_xml_url( $url ) {
136 - return FrmAppHelper::validate_url_is_in_s3_bucket( $url, 'xml' );
137 - }
138 -
139 - /**
140 - * @since 4.06.02
141 - *
142 - * @return mixed
143 - */
144 - private static function get_posted_form() {
145 - $form = FrmAppHelper::get_param( 'form', '', 'post', 'wp_unslash' );
146 - return $form ? json_decode( $form, true ) : $form;
147 - }
148 -
149 - /**
150 - * Get a different URL depending on the selection in the form.
151 - *
152 - * @since 4.06.02
153 - *
154 - * @param array $form The posted form values.
155 - * @param string $url The URL to override.
156 - *
157 - * @return void
158 - */
159 - private static function override_url( $form, &$url ) {
160 - $selected_form = self::get_selected_in_form( $form, 'form' );
161 -
162 - if ( ! $selected_form ) {
163 - return;
164 - }
165 -
166 - $selected_xml = isset( $form['xml'] ) && isset( $form['xml'][ $selected_form ] ) ? $form['xml'][ $selected_form ] : '';
167 -
168 - if ( ! $selected_xml || ! str_starts_with( $selected_xml, 'http' ) ) {
169 - return;
170 - }
171 -
172 - $url = $selected_xml;
173 - }
174 -
175 - /**
176 - * @since 4.06.02
177 - *
178 - * @param array $form
179 - * @param string $value
180 - *
181 - * @return string
182 - */
183 - private static function get_selected_in_form( $form, $value = 'form' ) {
184 - if ( $form && ! empty( $form[ $value ] ) ) {
185 - return $form[ $value ];
186 - }
187 -
188 - return '';
189 - }
190 -
191 - /**
192 - * @since 4.06.02
193 - *
194 - * @param array $form The posted form values.
195 - *
196 - * @return array|null The array of created pages.
197 - */
198 - private static function create_pages_for_import( $form ) {
199 - if ( empty( $form['pages'] ) ) {
200 - return null;
201 - }
202 -
203 - $form_key = self::get_selected_in_form( $form, 'form' );
204 - $view_keys = self::get_selected_in_form( $form, 'view' );
205 - $page_ids = array();
206 -
207 - foreach ( (array) $form['pages'] as $for => $name ) {
208 - if ( ! $name ) {
209 - // Don't create a page if no title is given.
210 - continue;
211 - }
212 -
213 - if ( $for === 'view' ) {
214 - $item_key = is_array( $view_keys ) ? $view_keys[ $form_key ] : $view_keys;
215 - $shortcode = '[display-frm-data id=%1$s filter=limited]';
216 - } elseif ( $for === 'form' ) {
217 - $item_key = $form_key;
218 - $shortcode = '[formidable id=%1$s]';
219 - } else {
220 - $item_key = self::get_selected_in_form( $form, 'form' );
221 - $shortcode = '[' . esc_html( $for ) . ' id=%1$s]';
222 - }
223 -
224 - if ( empty( $item_key ) ) {
225 - // Don't create it if the shortcode won't show anything.
226 - continue;
227 - }
228 -
229 - $page_ids[ $for ] = wp_insert_post(
230 - array(
231 - 'post_title' => $name,
232 - 'post_type' => 'page',
233 - 'post_content' => sprintf( $shortcode, $item_key ),
234 - )
235 - );
236 - }//end foreach
237 -
238 - return $page_ids;
239 - }
240 -
241 - /**
242 78 * Change the name of the last form that is not a child.
243 79 * This will allow for lookup fields and embedded forms
244 80 * since we redirect to the last form.
245 81 *
246 82 * @since 3.06
247 - *
248 83 * @param object $xml The values included in the XML.
249 - *
250 - * @return void
251 84 */
252 85 private static function set_new_form_name( &$xml ) {
253 86 if ( ! isset( $xml->form ) ) {
254 87 return;
@@ -253,60 +86,41 @@
253 86 if ( ! isset( $xml->form ) ) {
254 87 return;
255 88 }
256 89
257 - $name = FrmAppHelper::get_param( 'name', '', 'post', 'sanitize_text_field' );
258 - $description = FrmAppHelper::get_param( 'desc', '', 'post', 'sanitize_textarea_field' );
259 -
260 - if ( ! $name && ! $description ) {
261 - return;
262 - }
263 -
264 90 // Get the main form ID.
265 91 $set_name = 0;
266 -
267 92 foreach ( $xml->form as $form ) {
268 - if ( empty( $form->parent_form_id ) ) {
269 - $set_name = (int) $form->id;
93 + if ( ! isset( $form->parent_form_id ) || empty( $form->parent_form_id ) ) {
94 + $set_name = $form->id;
270 95 }
271 96 }
272 97
273 98 foreach ( $xml->form as $form ) {
274 99 // Maybe set the form name if this isn't a child form.
275 - if ( $set_name === (int) $form->id ) {
276 - $form->name = $name;
277 - $form->description = $description;
100 + if ( $set_name == $form->id ) {
101 + $form->name = FrmAppHelper::get_param( 'name', '', 'post', 'sanitize_text_field' );
102 + $form->description = FrmAppHelper::get_param( 'desc', '', 'post', 'sanitize_textarea_field' );
278 103 }
279 104
280 105 // Use a unique key to prevent editing existing form.
281 - $sanitized_form_name = sanitize_title( $form->name );
282 - $form->form_key = FrmAppHelper::get_unique_key( $sanitized_form_name, 'frm_forms', 'form_key' );
106 + $name = sanitize_title( $form->name );
107 + $form->form_key = FrmAppHelper::get_unique_key( $name, 'frm_forms', 'form_key' );
283 108 }
284 109 }
285 110
286 - /**
287 - * @return void
288 - */
289 111 public static function route() {
290 112 $action = isset( $_REQUEST['frm_action'] ) ? 'frm_action' : 'action';
291 113 $action = FrmAppHelper::get_param( $action, '', 'get', 'sanitize_title' );
292 - FrmAppHelper::include_svg();
293 -
294 114 if ( 'import_xml' === $action ) {
295 - self::import_xml();
115 + return self::import_xml();
296 116 } elseif ( 'export_xml' === $action ) {
297 - self::export_xml();
117 + return self::export_xml();
298 118 } elseif ( apply_filters( 'frm_xml_route', true, $action ) ) {
299 - self::form();
119 + return self::form();
300 120 }
301 121 }
302 122
303 - /**
304 - * @param string[] $errors
305 - * @param string $message
306 - *
307 - * @return void
308 - */
309 123 public static function form( $errors = array(), $message = '' ) {
310 124 $where = array(
311 125 'status' => array( null, '', 'published' ),
312 126 );
@@ -331,47 +145,40 @@
331 145 ),
332 146 );
333 147 $export_format = apply_filters( 'frm_export_formats', $export_format );
334 148
335 - include FrmAppHelper::plugin_path() . '/classes/views/xml/import_form.php';
149 + include( FrmAppHelper::plugin_path() . '/classes/views/xml/import_form.php' );
336 150 }
337 151
338 - /**
339 - * @return void
340 - */
341 152 public static function import_xml() {
342 - $errors = array();
343 - $message = '';
153 + $errors = array();
154 + $message = '';
155 +
344 156 $permission_error = FrmAppHelper::permission_nonce_error( 'frm_edit_forms', 'import-xml', 'import-xml-nonce' );
345 -
346 157 if ( false !== $permission_error ) {
347 158 $errors[] = $permission_error;
348 159 self::form( $errors );
349 -
350 160 return;
351 161 }
352 162
353 - // phpcs:ignore WordPress.Security.NonceVerification.Missing, SlevomatCodingStandard.Files.LineLength.LineTooLong
354 - $has_file = ! empty( $_FILES['frm_import_file'] ) && ! empty( $_FILES['frm_import_file']['name'] ) && ! empty( $_FILES['frm_import_file']['size'] ) && (int) $_FILES['frm_import_file']['size'] > 0;
355 -
163 + $has_file = isset( $_FILES ) && isset( $_FILES['frm_import_file'] ) && ! empty( $_FILES['frm_import_file']['name'] ) && ! empty( $_FILES['frm_import_file']['size'] ) && (int) $_FILES['frm_import_file']['size'] > 0;
356 164 if ( ! $has_file ) {
357 165 $errors[] = __( 'Oops, you didn\'t select a file.', 'formidable' );
358 166 self::form( $errors );
359 -
360 167 return;
361 168 }
362 169
363 - // phpcs:ignore WordPress.Security.ValidatedSanitizedInput.MissingUnslash, WordPress.Security.NonceVerification.Missing
364 - $file = isset( $_FILES['frm_import_file']['tmp_name'] ) ? sanitize_option( 'upload_path', $_FILES['frm_import_file']['tmp_name'] ) : '';
170 + $file = isset( $_FILES['frm_import_file']['tmp_name'] ) ? $_FILES['frm_import_file']['tmp_name'] : '';
365 171
366 172 if ( ! is_uploaded_file( $file ) ) {
367 173 unset( $file );
368 174 $errors[] = __( 'The file does not exist, please try again.', 'formidable' );
369 175 self::form( $errors );
370 -
371 176 return;
372 177 }
373 178
179 + //add_filter('upload_mimes', 'FrmXMLController::allow_mime');
180 +
374 181 $export_format = array(
375 182 'xml' => array(
376 183 'name' => 'XML',
377 184 'support' => 'forms',
@@ -379,56 +186,48 @@
379 186 ),
380 187 );
381 188 $export_format = apply_filters( 'frm_export_formats', $export_format );
382 189
383 - // phpcs:ignore WordPress.Security.ValidatedSanitizedInput.MissingUnslash, WordPress.Security.NonceVerification.Missing
384 - $file_type = sanitize_option( 'upload_path', $_FILES['frm_import_file']['name'] );
385 - $file_type = strtolower( pathinfo( $file_type, PATHINFO_EXTENSION ) );
386 -
190 + $file_type = strtolower( pathinfo( $_FILES['frm_import_file']['name'], PATHINFO_EXTENSION ) );
387 191 if ( 'xml' !== $file_type && isset( $export_format[ $file_type ] ) ) {
388 - // Allow other file types to be imported
192 + // allow other file types to be imported
389 193 do_action( 'frm_before_import_' . $file_type );
390 -
391 194 return;
392 195 }
393 196 unset( $file_type );
394 197
395 - if ( FrmXMLHelper::check_if_libxml_disable_entity_loader_exists() ) {
198 + if ( ! function_exists( 'libxml_disable_entity_loader' ) ) {
396 199 $errors[] = __( 'XML import is not enabled on your server with the libxml_disable_entity_loader function.', 'formidable' );
397 200 self::form( $errors );
398 -
399 201 return;
400 202 }
401 203
402 204 $set_err = libxml_use_internal_errors( true );
403 - $loader = FrmXMLHelper::maybe_libxml_disable_entity_loader( true );
404 - $result = FrmXMLHelper::import_xml( $file );
205 + $loader = libxml_disable_entity_loader( true );
206 +
207 + $result = FrmXMLHelper::import_xml( $file );
405 208 FrmXMLHelper::parse_message( $result, $message, $errors );
406 209
407 210 unset( $file );
408 211
409 212 libxml_use_internal_errors( $set_err );
410 - FrmXMLHelper::maybe_libxml_disable_entity_loader( $loader );
213 + libxml_disable_entity_loader( $loader );
411 214
412 215 self::form( $errors, $message );
413 216 }
414 217
415 - /**
416 - * @return void
417 - */
418 218 public static function export_xml() {
419 219 $error = FrmAppHelper::permission_nonce_error( 'frm_edit_forms', 'export-xml', 'export-xml-nonce' );
420 -
421 - if ( $error ) {
220 + if ( ! empty( $error ) ) {
422 221 wp_die( esc_html( $error ) );
423 222 }
424 223
425 - $ids = FrmAppHelper::get_post_param( 'frm_export_forms', array(), 'sanitize_text_field' );
426 - $type = FrmAppHelper::get_post_param( 'type', array(), 'sanitize_text_field' );
224 + $ids = FrmAppHelper::get_post_param( 'frm_export_forms', array() );
225 + $type = FrmAppHelper::get_post_param( 'type', array() );
427 226 $format = FrmAppHelper::get_post_param( 'format', 'xml', 'sanitize_title' );
428 227
429 228 if ( ! headers_sent() && ! $type ) {
430 - wp_safe_redirect( esc_url_raw( admin_url( 'admin.php?page=formidable-import' ) ) );
229 + wp_redirect( esc_url_raw( admin_url( 'admin.php?page=formidable-import' ) ) );
431 230 die();
432 231 }
433 232
434 233 if ( 'xml' === $format ) {
@@ -441,43 +240,28 @@
441 240
442 241 wp_die();
443 242 }
444 243
445 - /**
446 - * @param array<string>|string $type
447 - * @param array $args
448 - *
449 - * @psalm-param array{ids?: mixed} $args
450 - *
451 - * @return void
452 - */
453 - public static function generate_xml( $type, $args = array() ) { // phpcs:ignore SlevomatCodingStandard.Complexity.Cognitive.ComplexityTooHigh
244 + public static function generate_xml( $type, $args = array() ) {
454 245 global $wpdb;
455 246
456 247 self::prepare_types_array( $type );
457 248
458 - if ( ! is_array( $type ) ) {
459 - // This shouldn't be possible.
460 - // It is cast to array in prepare_types_array.
461 - // This is just for static analysis.
462 - return;
463 - }
464 -
465 249 $tables = array(
466 - 'items' => $wpdb->prefix . 'frm_items',
467 - 'forms' => $wpdb->prefix . 'frm_forms',
468 - 'posts' => $wpdb->posts,
469 - 'styles' => $wpdb->posts,
470 - 'actions' => $wpdb->posts,
250 + 'items' => $wpdb->prefix . 'frm_items',
251 + 'forms' => $wpdb->prefix . 'frm_forms',
252 + 'posts' => $wpdb->posts,
253 + 'styles' => $wpdb->posts,
254 + 'actions' => $wpdb->posts,
471 255 );
472 256
473 257 $defaults = array(
474 258 'ids' => false,
475 259 );
476 - $args = wp_parse_args( $args, $defaults );
260 + $args = wp_parse_args( $args, $defaults );
477 261
478 262 // Make sure ids are numeric.
479 - if ( is_array( $args['ids'] ) && $args['ids'] ) {
263 + if ( is_array( $args['ids'] ) && ! empty( $args['ids'] ) ) {
480 264 $args['ids'] = array_filter( $args['ids'], 'is_numeric' );
481 265 }
482 266
483 267 $records = array();
@@ -482,21 +266,22 @@
482 266
483 267 $records = array();
484 268
485 269 foreach ( $type as $tb_type ) {
486 - $where = array();
487 - $join = '';
488 - $table = $tables[ $tb_type ];
489 - $select = $table . '.id';
270 + $where = array();
271 + $join = '';
272 + $table = $tables[ $tb_type ];
273 +
274 + $select = $table . '.id';
490 275 $query_vars = array();
491 276
492 277 switch ( $tb_type ) {
493 278 case 'forms':
494 - // Add forms.
279 + //add forms
495 280 if ( $args['ids'] ) {
496 281 $where[] = array(
497 - 'or' => 1,
498 - $table . '.id' => $args['ids'],
282 + 'or' => 1,
283 + $table . '.id' => $args['ids'],
499 284 $table . '.parent_form_id' => $args['ids'],
500 285 );
501 286 } else {
502 287 $where[ $table . '.status !' ] = 'draft';
@@ -502,32 +287,29 @@
502 287 $where[ $table . '.status !' ] = 'draft';
503 288 }
504 289 break;
505 290 case 'actions':
506 - $select = $table . '.ID';
291 + $select = $table . '.ID';
507 292 $where['post_type'] = FrmFormActionsController::$action_post_type;
508 -
509 293 if ( ! empty( $args['ids'] ) ) {
510 294 $where['menu_order'] = $args['ids'];
511 295 }
512 296 break;
513 297 case 'items':
514 - // $join = "INNER JOIN {$wpdb->prefix}frm_item_metas im ON ($table.id = im.item_id)";
298 + //$join = "INNER JOIN {$wpdb->prefix}frm_item_metas im ON ($table.id = im.item_id)";
515 299 if ( $args['ids'] ) {
516 300 $where[ $table . '.form_id' ] = $args['ids'];
517 301 }
518 302 break;
519 303 case 'styles':
520 - // Loop through all exported forms and get their selected style IDs.
521 - $frm_style = new FrmStyle();
304 + // Loop through all exported forms and get their selected style IDs
305 + $frm_style = new FrmStyle();
522 306 $default_style = $frm_style->get_default_style();
523 - $form_ids = $args['ids'];
524 - $style_ids = array();
525 -
307 + $form_ids = $args['ids'];
308 + $style_ids = array();
526 309 foreach ( $form_ids as $form_id ) {
527 310 $form_data = FrmForm::getOne( $form_id );
528 -
529 - // For forms that have not been updated while running 2.0, check if custom_style is set.
311 + // For forms that have not been updated while running 2.0, check if custom_style is set
530 312 if ( isset( $form_data->options['custom_style'] ) ) {
531 313 if ( 1 === absint( $form_data->options['custom_style'] ) ) {
532 314 $style_ids[] = $default_style->ID;
533 315 } else {
@@ -535,20 +317,19 @@
535 317 }
536 318 }
537 319 unset( $form_id, $form_data );
538 320 }
539 -
540 - $select = $table . '.ID';
321 + $select = $table . '.ID';
541 322 $where['post_type'] = 'frm_styles';
542 323
543 - // Only export selected styles.
544 - if ( $style_ids ) {
324 + // Only export selected styles
325 + if ( ! empty( $style_ids ) ) {
545 326 $where['ID'] = $style_ids;
546 327 }
547 328 break;
548 329 default:
549 - $select = $table . '.ID';
550 - $join = ' INNER JOIN ' . $wpdb->postmeta . ' pm ON (pm.post_id=' . $table . '.ID)';
330 + $select = $table . '.ID';
331 + $join = ' INNER JOIN ' . $wpdb->postmeta . ' pm ON (pm.post_id=' . $table . '.ID)';
551 332 $where['pm.meta_key'] = 'frm_form_id';
552 333
553 334 if ( empty( $args['ids'] ) ) {
554 335 $where['pm.meta_value >'] = 1;
@@ -554,15 +335,15 @@
554 335 $where['pm.meta_value >'] = 1;
555 336 } else {
556 337 $where['pm.meta_value'] = $args['ids'];
557 338 }
558 - }//end switch
339 + }
559 340
560 341 $records[ $tb_type ] = FrmDb::get_col( $table . $join, $where, $select );
561 342 unset( $tb_type );
562 - }//end foreach
343 + }
563 344
564 - $filename = self::get_file_name( $args, $records );
345 + $filename = self::get_file_name( $args, $type, $records );
565 346
566 347 header( 'Content-Description: File Transfer' );
567 348 header( 'Content-Disposition: attachment; filename=' . $filename );
568 349 header( 'Content-Type: text/xml; charset=' . get_option( 'blog_charset' ), true );
@@ -567,50 +348,20 @@
567 348 header( 'Content-Disposition: attachment; filename=' . $filename );
568 349 header( 'Content-Type: text/xml; charset=' . get_option( 'blog_charset' ), true );
569 350
570 351 echo '<?xml version="1.0" encoding="' . esc_attr( get_bloginfo( 'charset' ) ) . "\" ?>\n";
571 - include FrmAppHelper::plugin_path() . '/classes/views/xml/xml.php';
352 + include( FrmAppHelper::plugin_path() . '/classes/views/xml/xml.php' );
572 353 }
573 354
574 - /**
575 - * Returns an array that has parent term slugs for the terms provided.
576 - *
577 - * @since 6.8.3
578 - *
579 - * @param array $terms
580 - *
581 - * @return array
582 - */
583 - public static function get_parent_terms_slugs( $terms ) {
584 - $parent_term_ids = array_filter( array_unique( wp_list_pluck( $terms, 'parent' ) ) );
585 - $parent_slugs = array();
586 -
587 - if ( ! $parent_term_ids ) {
588 - return $parent_slugs;
589 - }
590 -
591 - $results = FrmDb::get_results( 'terms', array( 'term_id' => $parent_term_ids ), 'term_id, slug' );
592 -
593 - return wp_list_pluck( $results, 'slug', 'term_id' );
594 - }
595 -
596 - /**
597 - * Prepare the types array.
598 - *
599 - * @param array<string>|string $type
600 - *
601 - * @return void
602 - */
603 355 private static function prepare_types_array( &$type ) {
604 356 $type = (array) $type;
605 -
606 - if ( ! in_array( 'forms', $type, true ) && ( in_array( 'items', $type, true ) || in_array( 'posts', $type, true ) ) ) {
607 - // Make sure the form is included if there are entries
357 + if ( ! in_array( 'forms', $type ) && ( in_array( 'items', $type ) || in_array( 'posts', $type ) ) ) {
358 + // make sure the form is included if there are entries
608 359 $type[] = 'forms';
609 360 }
610 361
611 - if ( in_array( 'forms', $type, true ) ) {
612 - // Include actions with forms
362 + if ( in_array( 'forms', $type ) ) {
363 + // include actions with forms
613 364 $type[] = 'actions';
614 365 }
615 366 }
616 367
@@ -619,28 +370,20 @@
619 370 * Use the nme of the form if only one form is exported.
620 371 *
621 372 * @since 3.06
622 373 *
623 - * @param array $args
624 - * @param array $records
625 - *
626 374 * @return string
627 375 */
628 - private static function get_file_name( $args, $records ) {
629 - $has_one_form = ! empty( $records['forms'] ) && count( $args['ids'] ) === 1;
630 -
376 + private static function get_file_name( $args, $type, $records ) {
377 + $has_one_form = isset( $records['forms'] ) && ! empty( $records['forms'] ) && count( $args['ids'] ) === 1;
631 378 if ( $has_one_form ) {
632 - // One form is being exported
379 + // one form is being exported
633 380 $selected_form_id = reset( $args['ids'] );
634 - $filename = 'form-' . $selected_form_id . '.xml';
635 -
636 381 foreach ( $records['forms'] as $form_id ) {
637 382 $filename = 'form-' . $form_id . '.xml';
638 -
639 383 if ( $selected_form_id === $form_id ) {
640 - $form = FrmForm::getOne( $form_id );
641 - $filename = $form->name !== '' ? $form->name : $form->form_key;
642 - $filename = sanitize_title( $filename ) . '-form.xml';
384 + $form = FrmForm::getOne( $form_id );
385 + $filename = sanitize_title( $form->name ) . '-form.xml';
643 386 break;
644 387 }
645 388 }
646 389 } else {
@@ -645,32 +388,19 @@
645 388 }
646 389 } else {
647 390 $sitename = sanitize_key( get_bloginfo( 'name' ) );
648 391
649 - if ( $sitename ) {
392 + if ( ! empty( $sitename ) ) {
650 393 $sitename .= '.';
651 394 }
652 -
653 - $filename = $sitename . 'formidable.' . gmdate( 'Y-m-d' ) . '.xml';
654 - }//end if
655 -
656 - /**
657 - * @since 5.3
658 - *
659 - * @param string $filename
660 - */
661 - return apply_filters( 'frm_xml_filename', $filename );
395 + $filename = $sitename . 'formidable.' . date( 'Y-m-d' ) . '.xml';
396 + }
397 + return $filename;
662 398 }
663 399
664 - /**
665 - * @param array $atts
666 - *
667 - * @return void
668 - */
669 400 public static function generate_csv( $atts ) {
670 401 $form_ids = $atts['ids'];
671 -
672 - if ( ! $form_ids ) {
402 + if ( empty( $form_ids ) ) {
673 403 wp_die( esc_html__( 'Please select a form', 'formidable' ) );
674 404 }
675 405 self::csv( reset( $form_ids ) );
676 406 }
@@ -678,14 +408,8 @@
678 408 /**
679 409 * Export to CSV
680 410 *
681 411 * @since 2.0.19
682 - *
683 - * @param false|int|string $form_id
684 - * @param string $search
685 - * @param string $fid
686 - *
687 - * @return void
688 412 */
689 413 public static function csv( $form_id = false, $search = '', $fid = '' ) {
690 414 FrmAppHelper::permission_check( 'frm_view_entries' );
691 415
@@ -690,19 +414,14 @@
690 414 FrmAppHelper::permission_check( 'frm_view_entries' );
691 415
692 416 if ( ! $form_id ) {
693 417 $form_id = FrmAppHelper::get_param( 'form', '', 'get', 'sanitize_text_field' );
694 - $search = FrmAppHelper::get_param( isset( $_REQUEST['s'] ) ? 's' : 'search', '', 'get', 'sanitize_text_field' );
695 - $fid = FrmAppHelper::get_param( 'fid', '', 'get', 'sanitize_text_field' );
418 + $search = FrmAppHelper::get_param( ( isset( $_REQUEST['s'] ) ? 's' : 'search' ), '', 'get', 'sanitize_text_field' );
419 + $fid = FrmAppHelper::get_param( 'fid', '', 'get', 'sanitize_text_field' );
696 420 }
697 421
698 - // Remove time limit to execute this function.
699 - if ( function_exists( 'set_time_limit' ) ) {
700 - set_time_limit( 0 );
701 - }
702 -
422 + set_time_limit( 0 ); //Remove time limit to execute this function
703 423 $mem_limit = str_replace( 'M', '', ini_get( 'memory_limit' ) );
704 -
705 424 if ( (int) $mem_limit < 256 ) {
706 425 wp_raise_memory_limit();
707 426 }
708 427
@@ -708,19 +427,14 @@
708 427
709 428 global $wpdb;
710 429
711 430 $form = FrmForm::getOne( $form_id );
431 + $form_id = $form->id;
712 432
713 - if ( ! $form ) {
714 - esc_html_e( 'Form not found.', 'formidable' );
715 - wp_die();
716 - }
717 -
718 - $form_id = $form->id;
719 433 $form_cols = self::get_fields_for_csv_export( $form_id, $form );
720 - $item_id = FrmAppHelper::get_param( 'item_id', 0, 'get', 'sanitize_text_field' );
721 434
722 - if ( $item_id ) {
435 + $item_id = FrmAppHelper::get_param( 'item_id', 0, 'get', 'sanitize_text_field' );
436 + if ( ! empty( $item_id ) ) {
723 437 $item_id = explode( ',', $item_id );
724 438 }
725 439
726 440 $query = array(
@@ -741,9 +455,9 @@
741 455
742 456 $entry_ids = FrmDb::get_col( $wpdb->prefix . 'frm_items it', $query );
743 457 unset( $query );
744 458
745 - if ( ! $entry_ids ) {
459 + if ( empty( $entry_ids ) ) {
746 460 esc_html_e( 'There are no entries for that form.', 'formidable' );
747 461 } else {
748 462 FrmCSVExportHelper::generate_csv( compact( 'form', 'entry_ids', 'form_cols' ) );
749 463 }
@@ -751,44 +465,36 @@
751 465 wp_die();
752 466 }
753 467
754 468 /**
755 - * Get the fields that should be included in the CSV export
756 - *
757 - * @since 2.0.19
758 - * @since 5.0.16 function went from private to public.
759 - *
760 - * @param int $form_id
761 - * @param object $form
762 - *
763 - * @return array CSV fields.
764 - */
765 - public static function get_fields_for_csv_export( $form_id, $form ) {
766 - $csv_fields = FrmField::get_all_for_form( $form_id, '', 'include', 'include' );
469 + * Get the fields that should be included in the CSV export
470 + *
471 + * @since 2.0.19
472 + *
473 + * @param int $form_id
474 + * @param object $form
475 + * @return array $csv_fields
476 + */
477 + private static function get_fields_for_csv_export( $form_id, $form ) {
478 + $csv_fields = FrmField::get_all_for_form( $form_id, '', 'include', 'include' );
767 479 $no_export_fields = FrmField::no_save_fields();
768 -
769 480 foreach ( $csv_fields as $k => $f ) {
770 - if ( in_array( $f->type, $no_export_fields, true ) ) {
481 + if ( in_array( $f->type, $no_export_fields ) ) {
771 482 unset( $csv_fields[ $k ] );
772 483 }
773 484 }
774 485
775 - return apply_filters( 'frm_fields_for_csv_export', $csv_fields, compact( 'form' ) );
486 + return $csv_fields;
776 487 }
777 488
778 - /**
779 - * @param array $mimes
780 - *
781 - * @return array
782 - */
783 489 public static function allow_mime( $mimes ) {
784 490 if ( ! isset( $mimes['csv'] ) ) {
785 - // Allow csv files
491 + // allow csv files
786 492 $mimes['csv'] = 'text/csv';
787 493 }
788 494
789 495 if ( ! isset( $mimes['xml'] ) ) {
790 - // Allow xml
496 + // allow xml
791 497 $mimes['xml'] = 'text/xml';
792 498 }
793 499
794 500 return $mimes;