Completed
Push — master ( 25d165...f5d97d )
by Jamie
04:43
created

FrmXMLHelper::item_count_message()   A

Complexity

Conditions 3
Paths 3

Size

Total Lines 18
Code Lines 13

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
cc 3
eloc 13
nc 3
nop 3
dl 0
loc 18
rs 9.4285
c 0
b 0
f 0
1
<?php
2
if ( ! defined('ABSPATH') ) {
3
	die( 'You are not allowed to call this page directly.' );
4
}
5
6
class FrmXMLHelper {
7
8
	public static function get_xml_values( $opt, $padding ) {
9
		if ( is_array( $opt ) ) {
10
			foreach ( $opt as $ok => $ov ) {
11
				echo "\n" . $padding;
0 ignored issues
show
introduced by
Expected next thing to be a escaping function, not '$padding'
Loading history...
12
				$tag = ( is_numeric( $ok ) ? 'key:' : '' ) . $ok;
13
				echo '<' . $tag . '>';
0 ignored issues
show
introduced by
Expected next thing to be a escaping function, not '$tag'
Loading history...
14
				self::get_xml_values( $ov, $padding . '    ' );
15
				if ( is_array( $ov ) ) {
16
					echo "\n" . $padding;
0 ignored issues
show
introduced by
Expected next thing to be a escaping function, not '$padding'
Loading history...
17
				}
18
				echo '</' . $tag . '>';
0 ignored issues
show
introduced by
Expected next thing to be a escaping function, not '$tag'
Loading history...
19
			}
20
		} else {
21
			echo self::cdata( $opt );
0 ignored issues
show
introduced by
Expected next thing to be a escaping function, not 'self'
Loading history...
22
		}
23
	}
24
25
	public static function import_xml( $file ) {
26
        $defaults = array(
27
            'forms' => 0, 'fields' => 0, 'terms' => 0,
28
            'posts' => 0, 'views' => 0, 'actions' => 0,
29
            'styles' => 0,
30
        );
31
32
        $imported = array(
33
            'imported' => $defaults,
34
			'updated'  => $defaults,
35
			'forms'    => array(),
36
			'terms'    => array(),
37
        );
38
39
        unset($defaults);
40
41
		if ( ! defined( 'WP_IMPORTING' ) ) {
42
            define('WP_IMPORTING', true);
43
        }
44
45
		if ( ! class_exists( 'DOMDocument' ) ) {
46
            return new WP_Error( 'SimpleXML_parse_error', __( 'Your server does not have XML enabled', 'formidable' ), libxml_get_errors() );
47
        }
48
49
        $dom = new DOMDocument;
50
		$success = $dom->loadXML( file_get_contents( $file ) );
0 ignored issues
show
introduced by
file_get_contents is highly discouraged, please use wpcom_vip_file_get_contents() instead.
Loading history...
51
		if ( ! $success ) {
52
			return new WP_Error( 'SimpleXML_parse_error', __( 'There was an error when reading this XML file', 'formidable' ), libxml_get_errors() );
53
		}
54
55
		if ( ! function_exists('simplexml_import_dom') ) {
56
			return new WP_Error( 'SimpleXML_parse_error', __( 'Your server is missing the simplexml_import_dom function', 'formidable' ), libxml_get_errors() );
57
		}
58
59
		$xml = simplexml_import_dom( $dom );
60
		unset( $dom );
61
62
		// halt if loading produces an error
63
		if ( ! $xml ) {
64
			return new WP_Error( 'SimpleXML_parse_error', __( 'There was an error when reading this XML file', 'formidable' ), libxml_get_errors() );
65
		}
66
67
        // add terms, forms (form and field ids), posts (post ids), and entries to db, in that order
68
		foreach ( array( 'term', 'form', 'view' ) as $item_type ) {
69
            // grab cats, tags, and terms, or forms or posts
70
            if ( isset($xml->{$item_type} ) ) {
71
				$function_name = 'import_xml_' . $item_type . 's';
72
				$imported = self::$function_name( $xml->{$item_type}, $imported );
73
				unset( $function_name, $xml->{$item_type} );
74
            }
75
        }
76
77
	    $return = apply_filters('frm_importing_xml', $imported, $xml );
78
79
	    return $return;
80
    }
81
82
	public static function import_xml_terms( $terms, $imported ) {
83
        foreach ( $terms as $t ) {
84
			if ( term_exists( (string) $t->term_slug, (string) $t->term_taxonomy ) ) {
85
			    continue;
86
			}
87
88
			$parent = self::get_term_parent_id( $t );
89
90
			$term = wp_insert_term( (string) $t->term_name, (string) $t->term_taxonomy, array(
91
                'slug'          => (string) $t->term_slug,
92
                'description'   => (string) $t->term_description,
93
				'parent'        => empty( $parent ) ? 0 : $parent,
94
            ));
95
96
			if ( $term && is_array( $term ) ) {
97
                $imported['imported']['terms']++;
98
				$imported['terms'][ (int) $t->term_id ] = $term['term_id'];
99
            }
100
101
			unset( $term, $t );
102
		}
103
104
		return $imported;
105
    }
106
107
	/**
108
	 * @since 2.0.8
109
	 */
110
	private static function get_term_parent_id( $t ) {
111
		$parent = (string) $t->term_parent;
112
		if ( ! empty( $parent ) ) {
113
			$parent = term_exists( (string) $t->term_parent, (string) $t->term_taxonomy );
114
			if ( $parent ) {
115
				$parent = $parent['term_id'];
116
			} else {
117
				$parent = 0;
118
			}
119
		}
120
		return $parent;
121
	}
122
123
	public static function import_xml_forms( $forms, $imported ) {
124
		$child_forms = array();
125
126
		// Import child forms first
127
		self::put_child_forms_first( $forms );
128
129
		foreach ( $forms as $item ) {
130
            $form = self::fill_form( $item );
131
132
			self::update_custom_style_setting_on_import( $form );
133
134
	        $this_form = self::maybe_get_form( $form );
135
136
			$old_id = false;
137
			$form_fields = false;
138
			if ( ! empty( $this_form ) ) {
139
				$form_id = $this_form->id;
140
				$old_id = $this_form->id;
141
				self::update_form( $this_form, $form, $imported );
142
143
				$form_fields = self::get_form_fields( $form_id );
144
			} else {
145
				$form_id = FrmForm::create( $form );
146
		        if ( $form_id ) {
147
		            $imported['imported']['forms']++;
148
		            // Keep track of whether this specific form was updated or not
149
					$imported['form_status'][ $form_id ] = 'imported';
150
					self::track_imported_child_forms( (int) $form_id, $form['parent_form_id'], $child_forms );
151
		        }
152
			}
153
154
			self::import_xml_fields( $item->field, $form_id, $this_form, $form_fields, $imported );
155
156
			self::delete_removed_fields( $form_fields );
157
158
		    // Update field ids/keys to new ones
159
			do_action( 'frm_after_duplicate_form', $form_id, $form, array( 'old_id' => $old_id ) );
160
161
			$imported['forms'][ (int) $item->id ] = $form_id;
162
163
            // Send pre 2.0 form options through function that creates actions
164
            self::migrate_form_settings_to_actions( $form['options'], $form_id, $imported, true );
165
166
			do_action( 'frm_after_import_form', $form_id, $form );
167
168
		    unset($form, $item);
169
		}
170
171
		self::maybe_update_child_form_parent_id( $imported['forms'], $child_forms );
172
173
		return $imported;
174
    }
175
176
	private static function fill_form( $item ) {
177
		$form = array(
178
			'id'            => (int) $item->id,
179
			'form_key'      => (string) $item->form_key,
180
			'name'          => (string) $item->name,
181
			'description'   => (string) $item->description,
182
			'options'       => (string) $item->options,
183
			'logged_in'     => (int) $item->logged_in,
184
			'is_template'   => (int) $item->is_template,
185
			'default_template' => (int) $item->default_template,
186
			'editable'      => (int) $item->editable,
187
			'status'        => (string) $item->status,
188
			'parent_form_id' => isset( $item->parent_form_id ) ? (int) $item->parent_form_id : 0,
189
			'created_at'    => date( 'Y-m-d H:i:s', strtotime( (string) $item->created_at ) ),
190
		);
191
		$form['options'] = FrmAppHelper::maybe_json_decode( $form['options'] );
192
		return $form;
193
	}
194
195
	private static function maybe_get_form( $form ) {
196
		// if template, allow to edit if form keys match, otherwise, creation date must also match
197
		$edit_query = array( 'form_key' => $form['form_key'], 'is_template' => $form['is_template'] );
198
		if ( ! $form['is_template'] ) {
199
			$edit_query['created_at'] = $form['created_at'];
200
		}
201
202
		$edit_query = apply_filters( 'frm_match_xml_form', $edit_query, $form );
203
204
		return FrmForm::getAll( $edit_query, '', 1 );
205
	}
206
207
	private static function update_form( $this_form, $form, &$imported ) {
208
		$form_id = $this_form->id;
209
		FrmForm::update( $form_id, $form );
210
		$imported['updated']['forms']++;
211
		// Keep track of whether this specific form was updated or not
212
		$imported['form_status'][ $form_id ] = 'updated';
213
	}
214
215
	private static function get_form_fields( $form_id ) {
216
		$form_fields = FrmField::get_all_for_form( $form_id, '', 'exclude', 'exclude' );
217
		$old_fields = array();
218
		foreach ( $form_fields as $f ) {
219
			$old_fields[ $f->id ] = $f;
220
			$old_fields[ $f->field_key ] = $f->id;
221
			unset($f);
222
		}
223
		$form_fields = $old_fields;
224
		return $form_fields;
225
	}
226
227
	/**
228
	 * Delete any fields attached to this form that were not included in the template
229
	 */
230
	private static function delete_removed_fields( $form_fields ) {
231
		if ( ! empty( $form_fields ) ) {
232
			foreach ( $form_fields as $field ) {
233
				if ( is_object( $field ) ) {
234
					FrmField::destroy( $field->id );
235
				}
236
				unset( $field );
237
			}
238
		}
239
	}
240
241
	/**
242
	* Put child forms first so they will be imported before parents
243
	*
244
	* @since 2.0.16
245
	* @param array $forms
246
	*/
247
	private static function put_child_forms_first( &$forms ) {
248
		$child_forms = array();
249
		$regular_forms = array();
250
251
		foreach ( $forms as $form ) {
252
			$parent_form_id = isset( $form->parent_form_id) ? (int) $form->parent_form_id : 0;
253
254
			if ( $parent_form_id ) {
255
				$child_forms[] = $form;
256
			} else {
257
				$regular_forms[] = $form;
258
			}
259
		}
260
261
		$forms = array_merge( $child_forms, $regular_forms );
262
	}
263
264
	/**
265
	* Keep track of all imported child forms
266
	*
267
	* @since 2.0.16
268
	* @param int $form_id
269
	* @param int $parent_form_id
270
	* @param array $child_forms
271
	*/
272
	private static function track_imported_child_forms( $form_id, $parent_form_id, &$child_forms ) {
273
		if ( $parent_form_id ) {
274
			$child_forms[ $form_id ] = $parent_form_id;
275
		}
276
	}
277
278
	/**
279
	* Update the parent_form_id on imported child forms
280
	* Child forms are imported first so their parent_form_id will need to be updated after the parent is imported
281
	*
282
	* @since 2.0.6
283
	* @param array $imported_forms
284
	* @param array $child_forms
285
	*/
286
	private static function maybe_update_child_form_parent_id( $imported_forms, $child_forms ) {
287
		foreach ( $child_forms as $child_form_id => $old_parent_form_id ) {
288
289
			if ( isset( $imported_forms[ $old_parent_form_id ] ) && $imported_forms[ $old_parent_form_id ] != $old_parent_form_id ) {
290
				// Update all children with this old parent_form_id
291
				$new_parent_form_id = (int) $imported_forms[ $old_parent_form_id ];
292
293
				FrmForm::update( $child_form_id, array( 'parent_form_id' => $new_parent_form_id ) );
294
			}
295
		}
296
	}
297
298
	/**
299
	* Import all fields for a form
300
	* @since 2.0.13
301
	*
302
	* TODO: Cut down on params
303
	*/
304
	private static function import_xml_fields( $xml_fields, $form_id, $this_form, &$form_fields, &$imported ) {
305
		$in_section = 0;
306
307
		foreach ( $xml_fields as $field ) {
308
			$f = self::fill_field( $field, $form_id );
309
310
		    if ( is_array($f['default_value']) && in_array($f['type'], array(
311
		        'text', 'email', 'url', 'textarea',
312
		        'number','phone', 'date',
313
		        'hidden', 'password', 'tag', 'image',
314
		    )) ) {
315
		        if ( count($f['default_value']) === 1 ) {
316
					$f['default_value'] = '[' . reset( $f['default_value'] ) . ']';
317
		        } else {
318
		            $f['default_value'] = reset($f['default_value']);
319
		        }
320
		    }
321
322
			self::maybe_update_in_section_variable( $in_section, $f );
323
			self::maybe_update_form_select( $f, $imported );
324
			self::maybe_update_get_values_form_setting( $imported, $f );
325
326
			if ( ! empty($this_form) ) {
327
				// check for field to edit by field id
328
				if ( isset( $form_fields[ $f['id'] ] ) ) {
329
					FrmField::update( $f['id'], $f );
330
					$imported['updated']['fields']++;
331
332
					unset( $form_fields[ $f['id'] ] );
333
334
					//unset old field key
335
					if ( isset( $form_fields[ $f['field_key'] ] ) ) {
336
						unset( $form_fields[ $f['field_key'] ] );
337
					}
338
				} else if ( isset( $form_fields[ $f['field_key'] ] ) ) {
339
					// check for field to edit by field key
340
					unset($f['id']);
341
342
					FrmField::update( $form_fields[ $f['field_key'] ], $f );
343
					$imported['updated']['fields']++;
344
345
					unset( $form_fields[ $form_fields[ $f['field_key'] ] ] ); //unset old field id
346
					unset( $form_fields[ $f['field_key'] ] ); //unset old field key
347
				} else {
348
					// if no matching field id or key in this form, create the field
349
					self::create_imported_field( $f, $imported );
350
				}
351
			} else {
352
353
				self::create_imported_field( $f, $imported );
354
			}
355
		}
356
	}
357
358
	private static function fill_field( $field, $form_id ) {
359
		return array(
360
			'id'            => (int) $field->id,
361
			'field_key'     => (string) $field->field_key,
362
			'name'          => (string) $field->name,
363
			'description'   => (string) $field->description,
364
			'type'          => (string) $field->type,
365
			'default_value' => FrmAppHelper::maybe_json_decode( (string) $field->default_value),
366
			'field_order'   => (int) $field->field_order,
367
			'form_id'       => (int) $form_id,
368
			'required'      => (int) $field->required,
369
			'options'       => FrmAppHelper::maybe_json_decode( (string) $field->options),
370
			'field_options' => FrmAppHelper::maybe_json_decode( (string) $field->field_options ),
371
		);
372
	}
373
374
	/**
375
	 * Update the current in_section value
376
	 *
377
	 * @since 2.0.25
378
	 * @param int $in_section
379
	 * @param array $f
380
	 */
381
	private static function maybe_update_in_section_variable( &$in_section, &$f ) {
382
		// If we're at the end of a section, switch $in_section is 0
383
		if ( in_array( $f['type'], array( 'end_divider', 'break', 'form' ) ) ) {
384
			$in_section = 0;
385
		}
386
387
		// Update the current field's in_section value
388
		if ( ! isset( $f['field_options']['in_section'] ) ) {
389
			$f['field_options']['in_section'] = $in_section;
390
		}
391
392
		// If we're starting a new section, switch $in_section to ID of divider
393
		if ( $f['type'] == 'divider' ) {
394
			$in_section = $f['id'];
395
		}
396
	}
397
398
	/**
399
	* Switch the form_select on a repeating field or embedded form if it needs to be switched
400
	*
401
	* @since 2.0.16
402
	* @param array $f
403
	* @param array $imported
404
	*/
405
	private static function maybe_update_form_select( &$f, $imported ) {
406
		if ( ! isset( $imported['forms'] ) ) {
407
			return;
408
		}
409
410
		if ( $f['type'] == 'form' || ( $f['type'] == 'divider' && FrmField::is_option_true( $f['field_options'], 'repeat' ) ) ) {
411 View Code Duplication
			if ( FrmField::is_option_true( $f['field_options'], 'form_select' ) ) {
0 ignored issues
show
Duplication introduced by
This code seems to be duplicated across your project.

Duplicated code is one of the most pungent code smells. If you need to duplicate the same code in three or more different places, we strongly encourage you to look into extracting the code into a single class or operation.

You can also find more detailed suggestions in the “Code” section of your repository.

Loading history...
412
				$form_select = $f['field_options']['form_select'];
413
				if ( isset( $imported['forms'][ $form_select ] ) ) {
414
					$f['field_options']['form_select'] = $imported['forms'][ $form_select ];
415
				}
416
			}
417
		}
418
	}
419
420
	/**
421
	 * Update the get_values_form setting if the form was imported
422
	 *
423
	 * @since 2.01.0
424
	 * @param array $imported
425
	 * @param array $f
426
	 */
427
	private static function maybe_update_get_values_form_setting( $imported, &$f ) {
428
		if ( ! isset( $imported['forms'] ) ) {
429
			return;
430
		}
431
432 View Code Duplication
		if ( FrmField::is_option_true_in_array( $f['field_options'], 'get_values_form' ) ) {
0 ignored issues
show
Duplication introduced by
This code seems to be duplicated across your project.

Duplicated code is one of the most pungent code smells. If you need to duplicate the same code in three or more different places, we strongly encourage you to look into extracting the code into a single class or operation.

You can also find more detailed suggestions in the “Code” section of your repository.

Loading history...
433
			$old_form = $f['field_options']['get_values_form'];
434
			if ( isset( $imported['forms'][ $old_form ] ) ) {
435
				$f['field_options']['get_values_form'] = $imported['forms'][ $old_form ];
436
			}
437
		}
438
	}
439
440
	/**
441
	 * Create an imported field
442
	 *
443
	 * @since 2.0.25
444
	 * @param array $f
445
	 * @param array $imported
446
	 */
447
	private static function create_imported_field( $f, &$imported ) {
448
		$new_id = FrmField::create( $f );
449
		if ( $new_id != false ) {
450
			$imported['imported']['fields']++;
451
			do_action( 'frm_after_field_is_imported', $f, $new_id );
452
		}
453
	}
454
455
	/**
456
	* Updates the custom style setting on import
457
	* Convert the post slug to an ID
458
	*
459
	* @since 2.0.19
460
	* @param array $form
461
	*
462
	*/
463
	private static function update_custom_style_setting_on_import( &$form ) {
464
		if ( ! isset( $form['options']['custom_style'] ) ) {
465
			return;
466
		}
467
468
		if ( is_numeric( $form['options']['custom_style'] ) ) {
469
			// Set to default
470
			$form['options']['custom_style'] = 1;
471
		} else {
472
			// Replace the style name with the style ID on import
473
			global $wpdb;
474
			$table = $wpdb->prefix . 'posts';
475
			$where = array(
476
				'post_name' => $form['options']['custom_style'],
477
				'post_type' => 'frm_styles',
478
			);
479
			$select = 'ID';
480
			$style_id = FrmDb::get_var( $table, $where, $select );
481
482
			if ( $style_id ) {
483
				$form['options']['custom_style'] = $style_id;
484
			} else {
485
				// save the old style to maybe update after styles import
486
				$form['options']['old_style'] = $form['options']['custom_style'];
487
488
				// Set to default
489
				$form['options']['custom_style'] = 1;
490
			}
491
		}
492
	}
493
494
	/**
495
	 * After styles are imported, check for any forms that were linked
496
	 * and link them back up.
497
	 *
498
	 * @since 2.2.7
499
	 */
500
	private static function update_custom_style_setting_after_import( $form_id ) {
501
		$form = FrmForm::getOne( $form_id );
502
503
		if ( $form && isset( $form->options['old_style'] ) ) {
504
			$form = (array) $form;
505
			$saved_style = $form['options']['custom_style'];
506
			$form['options']['custom_style'] = $form['options']['old_style'];
507
			self::update_custom_style_setting_on_import( $form );
508
			$has_changed = ( $form['options']['custom_style'] != $saved_style && $form['options']['custom_style'] != $form['options']['old_style'] );
509
			if ( $has_changed ) {
510
				FrmForm::update( $form['id'], $form );
511
			}
512
		}
513
	}
514
515
	public static function import_xml_views( $views, $imported ) {
516
        $imported['posts'] = array();
517
        $form_action_type = FrmFormActionsController::$action_post_type;
518
519
        $post_types = array(
520
            'frm_display' => 'views',
521
            $form_action_type => 'actions',
522
            'frm_styles'    => 'styles',
523
        );
524
525
        foreach ( $views as $item ) {
526
			$post = array(
527
				'post_title'    => (string) $item->title,
528
				'post_name'     => (string) $item->post_name,
529
				'post_type'     => (string) $item->post_type,
530
				'post_password' => (string) $item->post_password,
531
				'guid'          => (string) $item->guid,
532
				'post_status'   => (string) $item->status,
533
				'post_author'   => FrmAppHelper::get_user_id_param( (string) $item->post_author ),
534
				'post_id'       => (int) $item->post_id,
535
				'post_parent'   => (int) $item->post_parent,
536
				'menu_order'    => (int) $item->menu_order,
537
				'post_content'  => FrmFieldsHelper::switch_field_ids( (string) $item->content ),
538
				'post_excerpt'  => FrmFieldsHelper::switch_field_ids( (string) $item->excerpt ),
539
				'is_sticky'     => (string) $item->is_sticky,
540
				'comment_status' => (string) $item->comment_status,
541
				'post_date'     => (string) $item->post_date,
542
				'post_date_gmt' => (string) $item->post_date_gmt,
543
				'ping_status'   => (string) $item->ping_status,
544
                'postmeta'      => array(),
545
                'tax_input'     => array(),
546
			);
547
548
            $old_id = $post['post_id'];
549
            self::populate_post($post, $item, $imported);
550
551
			unset($item);
552
553
			$post_id = false;
554
            if ( $post['post_type'] == $form_action_type ) {
555
                $action_control = FrmFormActionsController::get_form_actions( $post['post_excerpt'] );
556
				if ( $action_control && is_object( $action_control ) ) {
557
					$post_id = $action_control->maybe_create_action( $post, $imported['form_status'] );
558
				}
559
                unset($action_control);
560
            } else if ( $post['post_type'] == 'frm_styles' ) {
561
                // Properly encode post content before inserting the post
562
                $post['post_content'] = FrmAppHelper::maybe_json_decode( $post['post_content'] );
563
				$custom_css = isset( $post['post_content']['custom_css'] ) ? $post['post_content']['custom_css'] : '';
564
                $post['post_content'] = FrmAppHelper::prepare_and_encode( $post['post_content'] );
565
566
                // Create/update post now
567
                $post_id = wp_insert_post( $post );
568
				self::maybe_update_custom_css( $custom_css );
569
            } else {
570
                // Create/update post now
571
                $post_id = wp_insert_post( $post );
572
            }
573
574
            if ( ! is_numeric($post_id) ) {
575
                continue;
576
            }
577
578
            self::update_postmeta($post, $post_id);
579
580
            $this_type = 'posts';
581
			if ( isset( $post_types[ $post['post_type'] ] ) ) {
582
				$this_type = $post_types[ $post['post_type'] ];
583
            }
584
585
            if ( isset($post['ID']) && $post_id == $post['ID'] ) {
586
                $imported['updated'][ $this_type ]++;
587
            } else {
588
                $imported['imported'][ $this_type ]++;
589
            }
590
591
			$imported['posts'][ (int) $old_id ] = $post_id;
592
593
			do_action( 'frm_after_import_view', $post_id, $post );
594
595
			unset( $post );
596
		}
597
598
		self::maybe_update_stylesheet( $imported );
599
600
		return $imported;
601
    }
602
603
    private static function populate_post( &$post, $item, $imported ) {
604
		if ( isset($item->attachment_url) ) {
605
			$post['attachment_url'] = (string) $item->attachment_url;
606
		}
607
608
		if ( $post['post_type'] == FrmFormActionsController::$action_post_type && isset( $imported['forms'][ (int) $post['menu_order'] ] ) ) {
609
		    // update to new form id
610
		    $post['menu_order'] = $imported['forms'][ (int) $post['menu_order'] ];
611
		}
612
613
		// Don't allow default styles to take over a site's default style
614
		if ( 'frm_styles' == $post['post_type'] ) {
615
			$post['menu_order'] = 0;
616
		}
617
618
		foreach ( $item->postmeta as $meta ) {
619
		    self::populate_postmeta($post, $meta, $imported);
620
			unset($meta);
621
		}
622
623
        self::populate_taxonomies($post, $item);
624
625
        self::maybe_editing_post($post);
626
    }
627
628
    private static function populate_postmeta( &$post, $meta, $imported ) {
629
        global $frm_duplicate_ids;
630
631
	    $m = array(
632
			'key'   => (string) $meta->meta_key,
633
			'value' => (string) $meta->meta_value,
634
		);
635
636
		//switch old form and field ids to new ones
637
		if ( $m['key'] == 'frm_form_id' && isset($imported['forms'][ (int) $m['value'] ]) ) {
638
		    $m['value'] = $imported['forms'][ (int) $m['value'] ];
639
		} else {
640
		    $m['value'] = FrmAppHelper::maybe_json_decode($m['value']);
641
642
		    if ( ! empty($frm_duplicate_ids) ) {
643
644
		        if ( $m['key'] == 'frm_dyncontent' ) {
645
		            $m['value'] = FrmFieldsHelper::switch_field_ids($m['value']);
646
    		    } else if ( $m['key'] == 'frm_options' ) {
647
648
					foreach ( array( 'date_field_id', 'edate_field_id' ) as $setting_name ) {
649
						if ( isset( $m['value'][ $setting_name ] ) && is_numeric( $m['value'][ $setting_name ] ) && isset( $frm_duplicate_ids[ $m['value'][ $setting_name ] ] ) ) {
650
							$m['value'][ $setting_name ] = $frm_duplicate_ids[ $m['value'][ $setting_name ] ];
651
    		            }
652
    		        }
653
654
                    $check_dup_array = array();
655
    		        if ( isset( $m['value']['order_by'] ) && ! empty( $m['value']['order_by'] ) ) {
656
    		            if ( is_numeric( $m['value']['order_by'] ) && isset( $frm_duplicate_ids[ $m['value']['order_by'] ] ) ) {
657
    		                $m['value']['order_by'] = $frm_duplicate_ids[ $m['value']['order_by'] ];
658
    		            } else if ( is_array( $m['value']['order_by'] ) ) {
659
                            $check_dup_array[] = 'order_by';
660
    		            }
661
    		        }
662
663
    		        if ( isset( $m['value']['where'] ) && ! empty( $m['value']['where'] ) ) {
664
    		            $check_dup_array[] = 'where';
665
    		        }
666
667
                    foreach ( $check_dup_array as $check_k ) {
668
						foreach ( (array) $m['value'][ $check_k ] as $mk => $mv ) {
669
							if ( isset( $frm_duplicate_ids[ $mv ] ) ) {
670
								$m['value'][ $check_k ][ $mk ] = $frm_duplicate_ids[ $mv ];
671
		                    }
672
		                    unset($mk, $mv);
673
		                }
674
                    }
675
    		    }
676
		    }
677
		}
678
679
		if ( ! is_array($m['value']) ) {
680
		    $m['value'] = FrmAppHelper::maybe_json_decode($m['value']);
681
		}
682
683
		$post['postmeta'][ (string) $meta->meta_key ] = $m['value'];
0 ignored issues
show
introduced by
Detected usage of meta_key, possible slow query.
Loading history...
684
    }
685
686
    /**
687
     * Add terms to post
688
     * @param array $post by reference
689
     * @param object $item The XML object data
690
     */
691
    private static function populate_taxonomies( &$post, $item ) {
692
		foreach ( $item->category as $c ) {
693
			$att = $c->attributes();
694
			if ( ! isset( $att['nicename'] ) ) {
695
                continue;
696
            }
697
698
		    $taxonomy = (string) $att['domain'];
699
		    if ( is_taxonomy_hierarchical($taxonomy) ) {
700
		        $name = (string) $att['nicename'];
701
		        $h_term = get_term_by('slug', $name, $taxonomy);
702
		        if ( $h_term ) {
703
		            $name = $h_term->term_id;
704
		        }
705
		        unset($h_term);
706
		    } else {
707
		        $name = (string) $c;
708
		    }
709
710
			if ( ! isset( $post['tax_input'][ $taxonomy ] ) ) {
711
				$post['tax_input'][ $taxonomy ] = array();
712
			}
713
714
			$post['tax_input'][ $taxonomy ][] = $name;
715
		    unset($name);
716
		}
717
    }
718
719
    /**
720
     * Edit post if the key and created time match
721
     */
722
    private static function maybe_editing_post( &$post ) {
723
		$match_by = array(
724
		    'post_type'     => $post['post_type'],
725
		    'name'          => $post['post_name'],
726
		    'post_status'   => $post['post_status'],
727
		    'posts_per_page' => 1,
728
		);
729
730
		if ( in_array( $post['post_status'], array( 'trash', 'draft' ) ) ) {
731
		    $match_by['include'] = $post['post_id'];
732
		    unset($match_by['name']);
733
		}
734
735
		$editing = get_posts($match_by);
736
737
        if ( ! empty($editing) && current($editing)->post_date == $post['post_date'] ) {
738
            // set the id of the post to edit
739
            $post['ID'] = current($editing)->ID;
740
        }
741
    }
742
743
    private static function update_postmeta( &$post, $post_id ) {
744
        foreach ( $post['postmeta'] as $k => $v ) {
745
            if ( '_edit_last' == $k ) {
746
                $v = FrmAppHelper::get_user_id_param($v);
747
            } else if ( '_thumbnail_id' == $k && FrmAppHelper::pro_is_installed() ) {
748
                //change the attachment ID
749
                $v = FrmProXMLHelper::get_file_id($v);
750
            }
751
752
            update_post_meta($post_id, $k, $v);
753
754
            unset($k, $v);
755
        }
756
    }
757
758
	/**
759
	 * If a template includes custom css, let's include it.
760
	 * The custom css is included on the default style.
761
	 *
762
	 * @since 2.03
763
	 */
764
	private static function maybe_update_custom_css( $custom_css ) {
765
		if ( empty( $custom_css ) ) {
766
			return;
767
		}
768
769
		$frm_style = new FrmStyle();
770
		$default_style = $frm_style->get_default_style();
771
		$default_style->post_content['custom_css'] .= "\r\n\r\n" . $custom_css;
772
		$frm_style->save( $default_style );
773
	}
774
775
	private static function maybe_update_stylesheet( $imported ) {
776
		$new_styles = isset( $imported['imported']['styles'] ) && ! empty( $imported['imported']['styles'] );
777
		$updated_styles = isset( $imported['updated']['styles'] ) && ! empty( $imported['updated']['styles'] );
778
		if ( $new_styles || $updated_styles ) {
779
			if ( is_admin() && function_exists( 'get_filesystem_method' ) ) {
780
				$frm_style = new FrmStyle();
781
				$frm_style->update( 'default' );
782
			}
783
			foreach ( $imported['forms'] as $form_id ) {
784
				self::update_custom_style_setting_after_import( $form_id );
785
			}
786
		}
787
	}
788
789
    /**
790
     * @param string $message
791
     */
792
	public static function parse_message( $result, &$message, &$errors ) {
793
        if ( is_wp_error($result) ) {
794
            $errors[] = $result->get_error_message();
795
        } else if ( ! $result ) {
796
            return;
797
        }
798
799
        if ( ! is_array($result) ) {
800
            $message = is_string( $result ) ? $result : print_r( $result, 1 );
0 ignored issues
show
introduced by
The use of function print_r() is discouraged
Loading history...
801
            return;
802
        }
803
804
        $t_strings = array(
805
            'imported'  => __( 'Imported', 'formidable' ),
806
            'updated'   => __( 'Updated', 'formidable' ),
807
        );
808
809
        $message = '<ul>';
810
        foreach ( $result as $type => $results ) {
811
			if ( ! isset( $t_strings[ $type ] ) ) {
812
                // only print imported and updated
813
                continue;
814
            }
815
816
            $s_message = array();
817
            foreach ( $results as $k => $m ) {
818
                self::item_count_message($m, $k, $s_message);
819
                unset($k, $m);
820
            }
821
822
            if ( ! empty($s_message) ) {
823
				$message .= '<li><strong>' . $t_strings[ $type ] . ':</strong> ';
824
                $message .= implode(', ', $s_message);
825
                $message .= '</li>';
826
            }
827
        }
828
829
        if ( $message == '<ul>' ) {
830
            $message = '';
831
            $errors[] = __( 'Nothing was imported or updated', 'formidable' );
832
        } else {
833
            $message .= '</ul>';
834
        }
835
    }
836
837
	public static function item_count_message( $m, $type, &$s_message ) {
838
        if ( ! $m ) {
839
            return;
840
        }
841
842
        $strings = array(
843
            'forms'     => sprintf( _n( '%1$s Form', '%1$s Forms', $m, 'formidable' ), $m ),
844
            'fields'    => sprintf( _n( '%1$s Field', '%1$s Fields', $m, 'formidable' ), $m ),
845
            'items'     => sprintf( _n( '%1$s Entry', '%1$s Entries', $m, 'formidable' ), $m ),
846
            'views'     => sprintf( _n( '%1$s View', '%1$s Views', $m, 'formidable' ), $m ),
847
            'posts'     => sprintf( _n( '%1$s Post', '%1$s Posts', $m, 'formidable' ), $m ),
848
            'styles'     => sprintf( _n( '%1$s Style', '%1$s Styles', $m, 'formidable' ), $m ),
849
            'terms'     => sprintf( _n( '%1$s Term', '%1$s Terms', $m, 'formidable' ), $m ),
850
            'actions'   => sprintf( _n( '%1$s Form Action', '%1$s Form Actions', $m, 'formidable' ), $m ),
851
        );
852
853
		$s_message[] = isset( $strings[ $type ] ) ? $strings[ $type ] : ' ' . $m . ' ' . ucfirst( $type );
854
    }
855
856
	/**
857
	 * Prepare the form options for export
858
	 *
859
	 * @since 2.0.19
860
	 * @param string $options
861
	 * @return string
862
	 */
863
	public static function prepare_form_options_for_export( $options ) {
864
		$options = maybe_unserialize( $options );
865
		// Change custom_style to the post_name instead of ID
866
		if ( isset( $options['custom_style'] ) && 1 !== $options['custom_style'] ) {
867
			global $wpdb;
868
			$table = $wpdb->prefix . 'posts';
869
			$where = array( 'ID' => $options['custom_style'] );
870
			$select = 'post_name';
871
872
			$style_name = FrmDb::get_var( $table, $where, $select );
873
874
			if ( $style_name ) {
875
				$options['custom_style'] = $style_name;
876
			} else {
877
				$options['custom_style'] = 1;
878
			}
879
		}
880
		$options = serialize( $options );
881
		return self::cdata( $options );
882
	}
883
884
	public static function cdata( $str ) {
885
	    $str = maybe_unserialize($str);
886
	    if ( is_array($str) ) {
887
	        $str = json_encode($str);
888
		} else if ( seems_utf8( $str ) == false ) {
889
			$str = utf8_encode( $str );
890
		}
891
892
        if ( is_numeric($str) ) {
893
            return $str;
894
        }
895
896
		self::remove_invalid_characters_from_xml( $str );
897
898
		// $str = ent2ncr(esc_html($str));
899
		$str = '<![CDATA[' . str_replace( ']]>', ']]]]><![CDATA[>', $str ) . ']]>';
900
901
		return $str;
902
	}
903
904
	/**
905
	 * Remove <US> character (unit separator) from exported strings
906
	 *
907
	 * @since 2.0.22
908
	 * @param string $str
909
	 */
910
	private static function remove_invalid_characters_from_xml( &$str ) {
911
		// Remove <US> character
912
		$str = str_replace( '\x1F', '', $str );
913
	}
914
915
    public static function migrate_form_settings_to_actions( $form_options, $form_id, &$imported = array(), $switch = false ) {
916
        // Get post type
917
        $post_type = FrmFormActionsController::$action_post_type;
918
919
        // Set up imported index, if not set up yet
920
        if ( ! isset( $imported['imported']['actions'] ) ) {
921
            $imported['imported']['actions'] = 0;
922
        }
923
924
        // Migrate post settings to action
925
        self::migrate_post_settings_to_action( $form_options, $form_id, $post_type, $imported, $switch );
926
927
        // Migrate email settings to action
928
        self::migrate_email_settings_to_action( $form_options, $form_id, $post_type, $imported, $switch );
929
    }
930
931
    /**
932
    * Migrate post settings to form action
933
    *
934
    * @param string $post_type
935
    */
936
    private static function migrate_post_settings_to_action( $form_options, $form_id, $post_type, &$imported, $switch ) {
937
        if ( ! isset($form_options['create_post']) || ! $form_options['create_post'] ) {
938
            return;
939
        }
940
941
        $new_action = array(
942
            'post_type'     => $post_type,
943
            'post_excerpt'  => 'wppost',
944
			'post_title'    => __( 'Create Posts', 'formidable' ),
945
            'menu_order'    => $form_id,
946
            'post_status'   => 'publish',
947
            'post_content'  => array(),
948
			'post_name'     => $form_id . '_wppost_1',
949
        );
950
951
        $post_settings = array(
952
            'post_type', 'post_category', 'post_content',
953
            'post_excerpt', 'post_title', 'post_name', 'post_date',
954
			'post_status', 'post_custom_fields', 'post_password',
955
        );
956
957
        foreach ( $post_settings as $post_setting ) {
958
			if ( isset( $form_options[ $post_setting ] ) ) {
959
				$new_action['post_content'][ $post_setting ] = $form_options[ $post_setting ];
960
            }
961
            unset($post_setting);
962
        }
963
964
		$new_action['event'] = array( 'create', 'update' );
965
966
        if ( $switch ) {
967
			// Fields with string or int saved
968
			$basic_fields = array( 'post_title', 'post_content', 'post_excerpt', 'post_password', 'post_date', 'post_status' );
969
970
			// Fields with arrays saved
971
			$array_fields = array( 'post_category', 'post_custom_fields' );
972
973
			$new_action['post_content'] = self::switch_action_field_ids( $new_action['post_content'], $basic_fields, $array_fields );
974
        }
975
        $new_action['post_content'] = json_encode($new_action['post_content']);
976
977
        $exists = get_posts( array(
978
            'name'          => $new_action['post_name'],
979
            'post_type'     => $new_action['post_type'],
980
            'post_status'   => $new_action['post_status'],
981
            'numberposts'   => 1,
982
        ) );
983
984
        if ( ! $exists ) {
985
			// this isn't an email, but we need to use a class that will always be included
986
			FrmAppHelper::save_json_post( $new_action );
987
            $imported['imported']['actions']++;
988
        }
989
    }
990
991
	/**
992
	 * Switch old field IDs for new field IDs in emails and post
993
	 *
994
	 * @since 2.0
995
	 * @param array $post_content - check for old field IDs
996
	 * @param array $basic_fields - fields with string or int saved
997
	 * @param array $array_fields - fields with arrays saved
998
	 *
999
	 * @return string $post_content - new field IDs
1000
	 */
1001
	private static function switch_action_field_ids( $post_content, $basic_fields, $array_fields = array() ) {
1002
        global $frm_duplicate_ids;
1003
1004
        // If there aren't IDs that were switched, end now
1005
        if ( ! $frm_duplicate_ids ) {
1006
            return;
1007
        }
1008
1009
        // Get old IDs
1010
        $old = array_keys( $frm_duplicate_ids );
1011
1012
        // Get new IDs
1013
        $new = array_values( $frm_duplicate_ids );
1014
1015
        // Do a str_replace with each item to set the new IDs
1016
        foreach ( $post_content as $key => $setting ) {
1017
            if ( ! is_array( $setting ) && in_array( $key, $basic_fields ) ) {
1018
                // Replace old IDs with new IDs
1019
				$post_content[ $key ] = str_replace( $old, $new, $setting );
1020
            } else if ( is_array( $setting ) && in_array( $key, $array_fields ) ) {
1021
                foreach ( $setting as $k => $val ) {
1022
                    // Replace old IDs with new IDs
1023
					$post_content[ $key ][ $k ] = str_replace( $old, $new, $val );
1024
                }
1025
            }
1026
            unset( $key, $setting );
1027
        }
1028
        return $post_content;
1029
    }
1030
1031
    private static function migrate_email_settings_to_action( $form_options, $form_id, $post_type, &$imported, $switch ) {
1032
        // No old notifications or autoresponders to carry over
1033
		if ( ! isset( $form_options['auto_responder'] ) && ! isset( $form_options['notification'] ) && ! isset( $form_options['email_to'] ) ) {
1034
            return;
1035
        }
1036
1037
        // Initialize notifications array
1038
        $notifications = array();
1039
1040
        // Migrate regular notifications
1041
        self::migrate_notifications_to_action( $form_options, $form_id, $notifications );
1042
1043
        // Migrate autoresponders
1044
        self::migrate_autoresponder_to_action( $form_options, $form_id, $notifications );
1045
1046
        if ( empty( $notifications ) ) {
1047
            return;
1048
        }
1049
1050
        foreach ( $notifications as $new_notification ) {
1051
            $new_notification['post_type']      = $post_type;
1052
            $new_notification['post_excerpt']   = 'email';
1053
			$new_notification['post_title']     = __( 'Email Notification', 'formidable' );
1054
            $new_notification['menu_order']     = $form_id;
1055
            $new_notification['post_status']    = 'publish';
1056
1057
            // Switch field IDs and keys, if needed
1058
            if ( $switch ) {
1059
1060
				// Switch field IDs in email conditional logic
1061
				self::switch_email_contition_field_ids( $new_notification['post_content'] );
1062
1063
				// Switch all other field IDs in email
1064
                $new_notification['post_content'] = FrmFieldsHelper::switch_field_ids( $new_notification['post_content'] );
1065
            }
1066
            $new_notification['post_content']   = FrmAppHelper::prepare_and_encode( $new_notification['post_content'] );
1067
1068
            $exists = get_posts( array(
1069
                'name'          => $new_notification['post_name'],
1070
                'post_type'     => $new_notification['post_type'],
1071
                'post_status'   => $new_notification['post_status'],
1072
                'numberposts'   => 1,
1073
            ) );
1074
1075
            if ( empty($exists) ) {
1076
				FrmAppHelper::save_json_post( $new_notification );
1077
                $imported['imported']['actions']++;
1078
            }
1079
            unset($new_notification);
1080
        }
1081
1082
		self::remove_deprecated_notification_settings( $form_id, $form_options );
1083
    }
1084
1085
	/**
1086
	 * Remove deprecated notification settings after migration
1087
	 *
1088
	 * @since 2.04.02
1089
	 *
1090
	 * @param int|string $form_id
1091
	 * @param array $form_options
1092
	 */
1093
	private static function remove_deprecated_notification_settings( $form_id, $form_options ) {
1094
		$delete_settings = array( 'notification', 'autoresponder', 'email_to' );
1095
		foreach ( $delete_settings as $index ) {
1096
			if ( isset( $form_options[ $index ] ) ) {
1097
				unset( $form_options[ $index ] );
1098
			}
1099
		}
1100
		FrmForm::update( $form_id, array( 'options' => $form_options ) );
1101
	}
1102
1103
    private static function migrate_notifications_to_action( $form_options, $form_id, &$notifications ) {
1104
        if ( ! isset( $form_options['notification'] ) && isset( $form_options['email_to'] ) && ! empty( $form_options['email_to'] ) ) {
1105
            // add old settings into notification array
1106
			$form_options['notification'] = array( 0 => $form_options );
1107
        } else if ( isset( $form_options['notification']['email_to'] ) ) {
1108
            // make sure it's in the correct format
1109
			$form_options['notification'] = array( 0 => $form_options['notification'] );
1110
        }
1111
1112
        if ( isset( $form_options['notification'] ) && is_array($form_options['notification']) ) {
1113
            foreach ( $form_options['notification'] as $email_key => $notification ) {
1114
1115
                $atts = array( 'email_to' => '', 'reply_to' => '', 'reply_to_name' => '', 'event' => '', 'form_id' => $form_id, 'email_key' => $email_key );
1116
1117
                // Format the email data
1118
                self::format_email_data( $atts, $notification );
1119
1120
				if ( isset( $notification['twilio'] ) && $notification['twilio'] ) {
1121
					do_action( 'frm_create_twilio_action', $atts, $notification );
1122
				}
1123
1124
                // Setup the new notification
1125
                $new_notification = array();
1126
                self::setup_new_notification( $new_notification, $notification, $atts );
1127
1128
                $notifications[] = $new_notification;
1129
            }
1130
        }
1131
    }
1132
1133
    private static function format_email_data( &$atts, $notification ) {
1134
        // Format email_to
1135
        self::format_email_to_data( $atts, $notification );
1136
1137
        // Format the reply to email and name
1138
        $reply_fields = array( 'reply_to' => '', 'reply_to_name' => '' );
1139
        foreach ( $reply_fields as $f => $val ) {
1140
			if ( isset( $notification[ $f ] ) ) {
1141
				$atts[ $f ] = $notification[ $f ];
1142
				if ( 'custom' == $notification[ $f ] ) {
1143
					$atts[ $f ] = $notification[ 'cust_' . $f ];
1144
				} else if ( is_numeric( $atts[ $f ] ) && ! empty( $atts[ $f ] ) ) {
1145
					$atts[ $f ] = '[' . $atts[ $f ] . ']';
1146
                }
1147
            }
1148
            unset( $f, $val );
1149
        }
1150
1151
        // Format event
1152
		$atts['event'] = array( 'create' );
1153
        if ( isset( $notification['update_email'] ) && 1 == $notification['update_email'] ) {
1154
            $atts['event'][] = 'update';
1155
        } else if ( isset($notification['update_email']) && 2 == $notification['update_email'] ) {
1156
			$atts['event'] = array( 'update' );
1157
        }
1158
    }
1159
1160
    private static function format_email_to_data( &$atts, $notification ) {
1161
        if ( isset( $notification['email_to'] ) ) {
1162
			$atts['email_to'] = preg_split( '/ (,|;) /', $notification['email_to'] );
1163
        } else {
1164
            $atts['email_to'] = array();
1165
        }
1166
1167
        if ( isset( $notification['also_email_to'] ) ) {
1168
            $email_fields = (array) $notification['also_email_to'];
1169
            $atts['email_to'] = array_merge( $email_fields, $atts['email_to'] );
1170
            unset( $email_fields );
1171
        }
1172
1173
        foreach ( $atts['email_to'] as $key => $email_field ) {
1174
1175
            if ( is_numeric( $email_field ) ) {
1176
				$atts['email_to'][ $key ] = '[' . $email_field . ']';
1177
            }
1178
1179
            if ( strpos( $email_field, '|') ) {
1180
                $email_opt = explode( '|', $email_field );
1181
                if ( isset( $email_opt[0] ) ) {
1182
					$atts['email_to'][ $key ] = '[' . $email_opt[0] . ' show=' . $email_opt[1] . ']';
1183
                }
1184
                unset( $email_opt );
1185
            }
1186
        }
1187
        $atts['email_to'] = implode(', ', $atts['email_to']);
1188
    }
1189
1190
    private static function setup_new_notification( &$new_notification, $notification, $atts ) {
1191
        // Set up new notification
1192
        $new_notification = array(
1193
            'post_content'  => array(
1194
                'email_to'      => $atts['email_to'],
1195
                'event'         => $atts['event'],
1196
            ),
1197
			'post_name'         => $atts['form_id'] . '_email_' . $atts['email_key'],
1198
        );
1199
1200
        // Add more fields to the new notification
1201
        $add_fields = array( 'email_message', 'email_subject', 'plain_text', 'inc_user_info', 'conditions' );
1202
        foreach ( $add_fields as $add_field ) {
1203
			if ( isset( $notification[ $add_field ] ) ) {
1204
				$new_notification['post_content'][ $add_field ] = $notification[ $add_field ];
1205
            } else if ( in_array( $add_field, array( 'plain_text', 'inc_user_info' ) ) ) {
1206
				$new_notification['post_content'][ $add_field ] = 0;
1207
            } else {
1208
				$new_notification['post_content'][ $add_field ] = '';
1209
            }
1210
            unset( $add_field );
1211
        }
1212
1213
		// Set reply to
1214
		$new_notification['post_content']['reply_to'] = $atts['reply_to'];
1215
1216
        // Set from
1217
		if ( ! empty( $atts['reply_to'] ) || ! empty( $atts['reply_to_name'] ) ) {
1218
			$new_notification['post_content']['from'] = ( empty( $atts['reply_to_name'] ) ? '[sitename]' : $atts['reply_to_name'] ) . ' <' . ( empty( $atts['reply_to'] ) ? '[admin_email]' : $atts['reply_to'] ) . '>';
1219
        }
1220
    }
1221
1222
	/**
1223
	* Switch field IDs in pre-2.0 email conditional logic
1224
	*
1225
	* @param $post_content array, pass by reference
1226
	*/
1227
	private static function switch_email_contition_field_ids( &$post_content ) {
1228
		// Switch field IDs in conditional logic
1229
		if ( isset( $post_content['conditions'] ) && is_array( $post_content['conditions'] ) ) {
1230
			foreach ( $post_content['conditions'] as $email_key => $val ) {
1231
				if ( is_numeric( $email_key ) ) {
1232
					$post_content['conditions'][ $email_key ] = self::switch_action_field_ids( $val, array( 'hide_field' ) );
1233
				}
1234
				unset( $email_key, $val);
1235
			}
1236
		}
1237
	}
1238
1239
    private static function migrate_autoresponder_to_action( $form_options, $form_id, &$notifications ) {
1240
        if ( isset($form_options['auto_responder']) && $form_options['auto_responder'] && isset($form_options['ar_email_message']) && $form_options['ar_email_message'] ) {
1241
            // migrate autoresponder
1242
1243
            $email_field = isset($form_options['ar_email_to']) ? $form_options['ar_email_to'] : 0;
1244
            if ( strpos($email_field, '|') ) {
1245
                // data from entries field
1246
                $email_field = explode('|', $email_field);
1247
                if ( isset($email_field[1]) ) {
1248
                    $email_field = $email_field[1];
1249
                }
1250
            }
1251
            if ( is_numeric($email_field) && ! empty($email_field) ) {
1252
				$email_field = '[' . $email_field . ']';
1253
            }
1254
1255
            $notification = $form_options;
1256
            $new_notification2 = array(
1257
                'post_content'  => array(
1258
                    'email_message' => $notification['ar_email_message'],
1259
                    'email_subject' => isset($notification['ar_email_subject']) ? $notification['ar_email_subject'] : '',
1260
                    'email_to'      => $email_field,
1261
                    'plain_text'    => isset($notification['ar_plain_text']) ? $notification['ar_plain_text'] : 0,
1262
                    'inc_user_info' => 0,
1263
                ),
1264
				'post_name'     => $form_id . '_email_' . count( $notifications ),
1265
            );
1266
1267
            $reply_to = isset($notification['ar_reply_to']) ? $notification['ar_reply_to'] : '';
1268
            $reply_to_name = isset($notification['ar_reply_to_name']) ? $notification['ar_reply_to_name'] : '';
1269
1270
			if ( ! empty( $reply_to ) ) {
1271
				$new_notification2['post_content']['reply_to'] = $reply_to;
1272
			}
1273
1274
			if ( ! empty( $reply_to ) || ! empty( $reply_to_name ) ) {
1275
				$new_notification2['post_content']['from'] = ( empty( $reply_to_name ) ? '[sitename]' : $reply_to_name ) . ' <' . ( empty( $reply_to ) ? '[admin_email]' : $reply_to ) . '>';
1276
			}
1277
1278
            $notifications[] = $new_notification2;
1279
            unset( $new_notification2 );
1280
        }
1281
    }
1282
}
1283
1284