PluginProbe
Formidable Forms – WordPress Form Builder for Contact Forms, Calculators, Quizzes & More / 6.20
Formidable Forms – WordPress Form Builder for Contact Forms, Calculators, Quizzes & More v6.20
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
formidable / classes / controllers / FrmXMLController.php

FrmXMLController.php in Formidable Forms – WordPress Form Builder for Contact Forms, Calculators, Quizzes & More 6.20, at classes/controllers/FrmXMLController.php

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