Completed
Push — master ( 0aefae...c86466 )
by Jamie
05:18
created

FrmDb::migrate_to_6()   B

Complexity

Conditions 5
Paths 3

Size

Total Lines 37
Code Lines 18

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
cc 5
eloc 18
nc 3
nop 0
dl 0
loc 37
rs 8.439
c 0
b 0
f 0
1
<?php
2
3
class FrmDb {
4
    var $fields;
5
    var $forms;
6
    var $entries;
7
    var $entry_metas;
8
9
    public function __construct() {
10
        if ( ! defined('ABSPATH') ) {
11
            die('You are not allowed to call this page directly.');
12
        }
13
14
        global $wpdb;
15
        $this->fields         = $wpdb->prefix . 'frm_fields';
16
        $this->forms          = $wpdb->prefix . 'frm_forms';
17
        $this->entries        = $wpdb->prefix . 'frm_items';
18
        $this->entry_metas    = $wpdb->prefix . 'frm_item_metas';
19
    }
20
21
    public function upgrade( $old_db_version = false ) {
22
        global $wpdb;
23
        //$frm_db_version is the version of the database we're moving to
24
        $frm_db_version = FrmAppHelper::$db_version;
25
        $old_db_version = (float) $old_db_version;
26
        if ( ! $old_db_version ) {
27
            $old_db_version = get_option('frm_db_version');
28
        }
29
30
        if ( $frm_db_version != $old_db_version ) {
31
			// update rewrite rules for views and other custom post types
32
			flush_rewrite_rules();
33
34
			require_once( ABSPATH . 'wp-admin/includes/upgrade.php' );
35
36
            $this->create_tables();
37
            $this->migrate_data($frm_db_version, $old_db_version);
38
39
            /***** SAVE DB VERSION *****/
40
            update_option('frm_db_version', $frm_db_version);
41
42
            /**** ADD/UPDATE DEFAULT TEMPLATES ****/
43
            FrmXMLController::add_default_templates();
44
        }
45
46
        do_action('frm_after_install');
47
48
        /**** update the styling settings ****/
49
		if ( is_admin() && function_exists( 'get_filesystem_method' ) ) {
50
			$frm_style = new FrmStyle();
51
			$frm_style->update( 'default' );
52
		}
53
    }
54
55
    public function collation() {
56
        global $wpdb;
57
        if ( ! $wpdb->has_cap( 'collation' ) ) {
58
            return '';
59
        }
60
61
        $charset_collate = '';
62
		if ( ! empty( $wpdb->charset ) ) {
63
			$charset_collate .= ' DEFAULT CHARACTER SET ' . $wpdb->charset;
64
		}
65
66
		if ( ! empty( $wpdb->collate ) ) {
67
			$charset_collate .= ' COLLATE ' . $wpdb->collate;
68
		}
69
70
        return $charset_collate;
71
    }
72
73
    private function create_tables() {
74
        $charset_collate = $this->collation();
75
        $sql = array();
76
77
        /* Create/Upgrade Fields Table */
78
		$sql[] = 'CREATE TABLE ' . $this->fields . ' (
79
                id int(11) NOT NULL auto_increment,
80
				field_key varchar(100) default NULL,
81
                name text default NULL,
82
                description longtext default NULL,
83
                type text default NULL,
84
                default_value longtext default NULL,
85
                options longtext default NULL,
86
                field_order int(11) default 0,
87
                required int(1) default NULL,
88
                field_options longtext default NULL,
89
                form_id int(11) default NULL,
90
                created_at datetime NOT NULL,
91
                PRIMARY KEY  (id),
92
                KEY form_id (form_id),
93
                UNIQUE KEY field_key (field_key)
94
        )';
95
96
        /* Create/Upgrade Forms Table */
97
		$sql[] = 'CREATE TABLE ' . $this->forms . ' (
98
                id int(11) NOT NULL auto_increment,
99
				form_key varchar(100) default NULL,
100
                name varchar(255) default NULL,
101
                description text default NULL,
102
                parent_form_id int(11) default 0,
103
                logged_in tinyint(1) default NULL,
104
                editable tinyint(1) default NULL,
105
                is_template tinyint(1) default 0,
106
                default_template tinyint(1) default 0,
107
                status varchar(255) default NULL,
108
                options longtext default NULL,
109
                created_at datetime NOT NULL,
110
                PRIMARY KEY  (id),
111
                UNIQUE KEY form_key (form_key)
112
        )';
113
114
        /* Create/Upgrade Items Table */
115
		$sql[] = 'CREATE TABLE ' . $this->entries . ' (
116
                id int(11) NOT NULL auto_increment,
117
				item_key varchar(100) default NULL,
118
                name varchar(255) default NULL,
119
                description text default NULL,
120
                ip text default NULL,
121
                form_id int(11) default NULL,
122
                post_id int(11) default NULL,
123
                user_id int(11) default NULL,
124
                parent_item_id int(11) default 0,
125
                is_draft tinyint(1) default 0,
126
                updated_by int(11) default NULL,
127
                created_at datetime NOT NULL,
128
                updated_at datetime NOT NULL,
129
                PRIMARY KEY  (id),
130
                KEY form_id (form_id),
131
                KEY post_id (post_id),
132
                KEY user_id (user_id),
133
                KEY parent_item_id (parent_item_id),
134
                UNIQUE KEY item_key (item_key)
135
        )';
136
137
        /* Create/Upgrade Meta Table */
138
		$sql[] = 'CREATE TABLE ' . $this->entry_metas . ' (
139
                id int(11) NOT NULL auto_increment,
140
                meta_value longtext default NULL,
141
                field_id int(11) NOT NULL,
142
                item_id int(11) NOT NULL,
143
                created_at datetime NOT NULL,
144
                PRIMARY KEY  (id),
145
                KEY field_id (field_id),
146
                KEY item_id (item_id)
147
        )';
148
149
        foreach ( $sql as $q ) {
150
			if ( function_exists( 'dbDelta' ) ) {
151
				dbDelta( $q . $charset_collate . ';' );
152
			} else {
153
				global $wpdb;
154
				$wpdb->query( $q . $charset_collate );
155
			}
156
            unset($q);
157
        }
158
    }
159
160
    /**
161
     * @param integer $frm_db_version
162
     */
163
	private function migrate_data( $frm_db_version, $old_db_version ) {
164
		$migrations = array( 4, 6, 11, 16, 17, 23, 25 );
165
        foreach ( $migrations as $migration ) {
166
            if ( $frm_db_version >= $migration && $old_db_version < $migration ) {
167
				$function_name = 'migrate_to_' . $migration;
168
                $this->$function_name();
169
            }
170
        }
171
    }
172
173
    /**
174
     * Change array into format $wpdb->prepare can use
175
     */
176
    public static function get_where_clause_and_values( &$args, $starts_with = ' WHERE ' ) {
177
        if ( empty($args) ) {
178
			// add an arg to prevent prepare from failing
179
			$args = array( 'where' => $starts_with . '1=%d', 'values' => array( 1 ) );
180
			return;
181
        }
182
183
		$where = '';
184
		$values = array();
185
186
		if ( is_array( $args ) ) {
187
			$base_where = $starts_with;
188
			self::parse_where_from_array( $args, $base_where, $where, $values );
189
		}
190
191
		$args = compact( 'where', 'values' );
192
    }
193
194
    /**
195
     * @param string $base_where
196
     * @param string $where
197
     */
198
    public static function parse_where_from_array( $args, $base_where, &$where, &$values ) {
199
        $condition = ' AND';
200
        if ( isset( $args['or'] ) ) {
201
            $condition = ' OR';
202
            unset( $args['or'] );
203
        }
204
205
        foreach ( $args as $key => $value ) {
206
            $where .= empty( $where ) ? $base_where : $condition;
207
            $array_inc_null = ( ! is_numeric( $key ) && is_array( $value ) && in_array( null, $value ) );
208
            if ( is_numeric( $key ) || $array_inc_null ) {
209
                $where .= ' ( ';
210
                $nested_where = '';
211
                if ( $array_inc_null ) {
212
                    foreach ( $value as $val ) {
213
                        self::parse_where_from_array( array( $key => $val, 'or' => 1 ), '', $nested_where, $values );
214
                    }
215
                } else {
216
                    self::parse_where_from_array( $value, '', $nested_where, $values );
217
                }
218
                $where .= $nested_where;
219
                $where .= ' ) ';
220
            } else {
221
                self::interpret_array_to_sql( $key, $value, $where, $values );
222
            }
223
        }
224
    }
225
226
    /**
227
     * @param string $key
228
     * @param string $where
229
     */
230
    private static function interpret_array_to_sql( $key, $value, &$where, &$values ) {
231
		$key = trim( $key );
232
233
        if ( strpos( $key, 'created_at' ) !== false || strpos( $key, 'updated_at' ) !== false  ) {
234
            $k = explode(' ', $key);
235
            $where .= ' DATE_FORMAT(' . reset( $k ) . ', %s) ' . str_replace( reset( $k ), '', $key );
236
            $values[] = '%Y-%m-%d %H:%i:%s';
237
        } else {
238
			$where .= ' ' . $key;
239
        }
240
241
		$lowercase_key = explode( ' ', strtolower( $key ) );
242
		$lowercase_key = end( $lowercase_key );
243
244
        if ( is_array( $value ) ) {
245
            // translate array of values to "in"
246
			if ( strpos( $lowercase_key, 'like' ) !== false ) {
247
				$where = preg_replace('/' . $key . '$/', '', $where);
248
				$where .= '(';
249
				$start = true;
250
				foreach ( $value as $v ) {
251
					if ( ! $start ) {
252
						$where .= ' OR ';
253
					}
254
					$start = false;
255
					$where .= $key . ' %s';
256
					$values[] = '%' . FrmAppHelper::esc_like( $v ) . '%';
257
				}
258
				$where .= ')';
259
			} else if ( ! empty( $value ) ) {
260
				$where .= ' in (' . FrmAppHelper::prepare_array_values( $value, '%s' ) . ')';
261
				$values = array_merge( $values, $value );
262
			}
263
        } else if ( strpos( $lowercase_key, 'like' ) !== false ) {
264
			/**
265
			 * Allow string to start or end with the value
266
			 * If the key is like% then skip the first % for starts with
267
			 * If the key is %like then skip the last % for ends with
268
			 */
269
			$start = $end = '%';
270
			if ( $lowercase_key == 'like%' ) {
271
				$start = '';
272
				$where = rtrim( $where, '%' );
273
			} else if ( $lowercase_key == '%like' ) {
274
				$end = '';
275
				$where = rtrim( rtrim( $where, '%like' ), '%LIKE' );
276
				$where .= 'like';
277
			}
278
279
			$where .= ' %s';
280
			$values[] = $start . FrmAppHelper::esc_like( $value ) . $end;
281
282
        } else if ( $value === null ) {
283
            $where .= ' IS NULL';
284
        } else {
285
			// allow a - to prevent = from being added
286
			if ( substr( $key, -1 ) == '-' ) {
287
				$where = rtrim( $where, '-' );
288
			} else {
289
				$where .= '=';
290
			}
291
292
			self::add_query_placeholder( $key, $value, $where );
293
294
            $values[] = $value;
295
        }
296
    }
297
298
	/**
299
	 * Add %d, or %s to query
300
	 *
301
	 * @since 2.02.05
302
	 * @param int|string $value
303
	 * @param string $where
304
	 */
305
    private static function add_query_placeholder( $key, $value, &$where ) {
306
		if ( is_numeric( $value ) && strpos( $key, 'meta_value' ) === false ) {
307
			$where .= '%d';
308
		} else {
309
			$where .= '%s';
310
		}
311
	}
312
313
    /**
314
     * @param string $table
315
     */
316
    public static function get_count( $table, $where = array(), $args = array() ) {
317
        $count = self::get_var( $table, $where, 'COUNT(*)', $args );
318
        return $count;
319
    }
320
321
    public static function get_var( $table, $where = array(), $field = 'id', $args = array(), $limit = '', $type = 'var' ) {
322
        $group = '';
323
        self::get_group_and_table_name( $table, $group );
324
		self::convert_options_to_array( $args, '', $limit );
325
326
		$query = self::generate_query_string_from_pieces( $field, $table, $where, $args );
327
328
		$cache_key = str_replace( array( ' ', ',' ), '_', trim( implode( '_', FrmAppHelper::array_flatten( $where ) ) . implode( '_', $args ) . $field . '_' . $type, ' WHERE' ) );
329
		$results = FrmAppHelper::check_cache( $cache_key, $group, $query, 'get_' . $type );
330
        return $results;
331
    }
332
333
    /**
334
     * @param string $table
335
     * @param array $where
336
     */
337
    public static function get_col( $table, $where = array(), $field = 'id', $args = array(), $limit = '' ) {
338
        return self::get_var( $table, $where, $field, $args, $limit, 'col' );
339
    }
340
341
    /**
342
     * @since 2.0
343
     * @param string $table
344
     */
345
    public static function get_row( $table, $where = array(), $fields = '*', $args = array() ) {
346
        $args['limit'] = 1;
347
        return self::get_var( $table, $where, $fields, $args, '', 'row' );
348
    }
349
350
    /**
351
     * @param string $table
352
     */
353
    public static function get_one_record( $table, $args = array(), $fields = '*', $order_by = '' ) {
354
        _deprecated_function( __FUNCTION__, '2.0', 'FrmDb::get_row' );
355
		return self::get_var( $table, $args, $fields, array( 'order_by' => $order_by, 'limit' => 1 ), '', 'row' );
356
    }
357
358
    public static function get_records( $table, $args = array(), $order_by = '', $limit = '', $fields = '*' ) {
359
        _deprecated_function( __FUNCTION__, '2.0', 'FrmDb::get_results' );
360
        return self::get_results( $table, $args, $fields, compact('order_by', 'limit') );
361
    }
362
363
    /**
364
     * Prepare a key/value array before DB call
365
     * @since 2.0
366
     * @param string $table
367
     */
368
    public static function get_results( $table, $where = array(), $fields = '*', $args = array() ) {
369
        return self::get_var( $table, $where, $fields, $args, '', 'results' );
370
    }
371
372
	/**
373
	 * Check for like, not like, in, not in, =, !=, >, <, <=, >=
374
	 * Return a value to append to the where array key
375
	 *
376
	 * @return string
377
	 */
378
	public static function append_where_is( $where_is ) {
379
		$switch_to = array(
380
			'='		=> '',
381
			'!=' 	=> '!',
382
			'<='	=> '<',
383
			'>='	=> '>',
384
			'like'	=> 'like',
385
			'not like' => 'not like',
386
			'in'	=> '',
387
			'not in' => 'not',
388
			'like%'	=> 'like%',
389
			'%like'	=> '%like',
390
		);
391
392
		$where_is = strtolower( $where_is );
393
		if ( isset( $switch_to[ $where_is ] ) ) {
394
			return ' ' . $switch_to[ $where_is ];
395
		}
396
397
		// > and < need a little more work since we don't want them switched to >= and <=
398
		if ( $where_is == '>' || $where_is == '<' ) {
399
			return ' ' . $where_is . '-'; // the - indicates that the = should not be added later
400
		}
401
402
		// fallback to = if the query is none of these
403
		return '';
404
	}
405
406
    /**
407
     * Get 'frm_forms' from wp_frm_forms or a longer table param that includes a join
408
     * Also add the wpdb->prefix to the table if it's missing
409
     *
410
     * @param string $table
411
     * @param string $group
412
     */
413
    private static function get_group_and_table_name( &$table, &$group ) {
414
		global $wpdb, $wpmuBaseTablePrefix;
415
416
        $table_parts = explode(' ', $table);
417
        $group = reset($table_parts);
418
        $group = str_replace( $wpdb->prefix, '', $group );
419
420
		$prefix = $wpmuBaseTablePrefix ? $wpmuBaseTablePrefix : $wpdb->base_prefix;
421
		$group = str_replace( $prefix, '', $group );
422
423
        if ( $group == $table ) {
424
            $table = $wpdb->prefix . $table;
425
        }
426
427
		// switch to singular group name
428
		$group = rtrim( $group, 's' );
429
    }
430
431
    private static function convert_options_to_array( &$args, $order_by = '', $limit = '' ) {
432
        if ( ! is_array($args) ) {
433
			$args = array( 'order_by' => $args );
434
        }
435
436
        if ( ! empty( $order_by ) ) {
437
            $args['order_by'] = $order_by;
438
        }
439
440
        if ( ! empty( $limit ) ) {
441
            $args['limit'] = $limit;
442
        }
443
444
        $temp_args = $args;
445
        foreach ( $temp_args as $k => $v ) {
446
            if ( $v == '' ) {
447
				unset( $args[ $k ] );
448
                continue;
449
            }
450
451
            if ( $k == 'limit' ) {
452
				$args[ $k ] = FrmAppHelper::esc_limit( $v );
453
            }
454
            $db_name = strtoupper( str_replace( '_', ' ', $k ) );
455
            if ( strpos( $v, $db_name ) === false ) {
456
				$args[ $k ] = $db_name . ' ' . $v;
457
            }
458
        }
459
460
		// Make sure LIMIT is the last argument
461
		if ( isset( $args['order_by'] ) && isset( $args['limit'] ) ) {
462
			$temp_limit = $args['limit'];
463
			unset( $args['limit'] );
464
			$args['limit'] = $temp_limit;
465
		}
466
    }
467
468
	/**
469
	 * Get the associative array results for the given columns, table, and where query
470
	 *
471
	 * @since 2.02.05
472
	 * @param string $columns
473
	 * @param string $table
474
	 * @param array $where
475
	 * @return mixed
476
	 */
477
	public static function get_associative_array_results( $columns, $table, $where ) {
478
		$group = '';
479
		self::get_group_and_table_name( $table, $group );
480
481
		$query = self::generate_query_string_from_pieces( $columns, $table, $where );
482
483
		$cache_key = str_replace( array( ' ', ',' ), '_', trim( implode( '_', FrmAppHelper::array_flatten( $where ) ) . $columns . '_results_ARRAY_A' , ' WHERE' ) );
484
		$results = FrmAppHelper::check_cache( $cache_key, $group, $query, 'get_associative_results' );
485
486
		return $results;
487
	}
488
489
	/**
490
	 * Combine the pieces of a query to form a full, prepared query
491
	 *
492
	 * @since 2.02.05
493
	 *
494
	 * @param string $columns
495
	 * @param string $table
496
	 * @param mixed $where
497
	 * @param array $args
498
	 * @return string
499
	 */
500
	private static function generate_query_string_from_pieces( $columns, $table, $where, $args = array() ) {
501
		$query = 'SELECT ' . $columns . ' FROM ' . $table;
502
503
		if ( is_array( $where ) || empty( $where ) ) {
504
			self::get_where_clause_and_values( $where );
505
			global $wpdb;
506
			$query = $wpdb->prepare( $query . $where['where'] . ' ' . implode( ' ', $args ), $where['values'] );
507
		} else {
508
			/**
509
			 * Allow the $where to be prepared before we recieve it here.
510
			 * This is a fallback for reverse compatability, but is not recommended
511
			 */
512
			_deprecated_argument( 'where', '2.0', __( 'Use the query in an array format so it can be properly prepared.', 'formidable' ) );
513
			$query .= $where . ' ' . implode( ' ', $args );
514
		}
515
516
		return $query;
517
	}
518
519
    public function uninstall() {
520
		if ( ! current_user_can( 'administrator' ) ) {
521
            $frm_settings = FrmAppHelper::get_settings();
522
            wp_die($frm_settings->admin_permission);
523
        }
524
525
        global $wpdb, $wp_roles;
526
527
		$wpdb->query( 'DROP TABLE IF EXISTS ' . $this->fields );
528
		$wpdb->query( 'DROP TABLE IF EXISTS ' . $this->forms );
529
		$wpdb->query( 'DROP TABLE IF EXISTS ' . $this->entries );
530
		$wpdb->query( 'DROP TABLE IF EXISTS ' . $this->entry_metas );
531
532
        delete_option('frm_options');
533
        delete_option('frm_db_version');
534
535
        //delete roles
536
        $frm_roles = FrmAppHelper::frm_capabilities();
537
        $roles = get_editable_roles();
538
        foreach ( $frm_roles as $frm_role => $frm_role_description ) {
539
            foreach ( $roles as $role => $details ) {
540
                $wp_roles->remove_cap( $role, $frm_role );
541
                unset($role, $details);
542
    		}
543
    		unset($frm_role, $frm_role_description);
544
		}
545
		unset($roles, $frm_roles);
546
547
		// delete actions, views, and styles
548
549
		// prevent the post deletion from triggering entries to be deleted
550
		remove_action( 'before_delete_post', 'FrmProDisplaysController::before_delete_post' );
551
		remove_action( 'deleted_post', 'FrmProEntriesController::delete_entry' );
552
553
		$post_ids = $wpdb->get_col( $wpdb->prepare( 'SELECT ID FROM ' . $wpdb->posts . ' WHERE post_type in (%s, %s, %s)', FrmFormActionsController::$action_post_type, FrmStylesController::$post_type, 'frm_display' ) );
554
		foreach ( $post_ids as $post_id ) {
555
			// Delete's each post.
556
			wp_delete_post( $post_id, true );
557
		}
558
		unset( $post_ids );
559
560
		// delete transients
561
		delete_transient( 'frmpro_css' );
562
		delete_transient( 'frm_options' );
563
		delete_transient( 'frmpro_options' );
564
565
		$wpdb->query( $wpdb->prepare( 'DELETE FROM ' . $wpdb->options . ' WHERE option_name LIKE %s OR option_name LIKE %s', '_transient_timeout_frm_form_fields_%', '_transient_frm_form_fields_%' ) );
566
567
        do_action('frm_after_uninstall');
568
        return true;
569
    }
570
571
	/**
572
	 * Migrate old styling settings. If sites are using the old
573
	 * default 400px field width, switch it to 100%
574
	 *
575
	 * @since 2.0.4
576
	 */
577
	private function migrate_to_25() {
578
		// get the style that was created with the style migration
579
		$frm_style = new FrmStyle();
580
		$styles = $frm_style->get_all( 'post_date', 'ASC', 1 );
581
		if ( empty( $styles ) ) {
582
			return;
583
		}
584
585
		foreach ( $styles as $style ) {
586
			if ( $style->post_content['field_width'] == '400px' ) {
587
				$style->post_content['field_width'] = '100%';
588
				$frm_style->save( (array) $style );
589
				return;
590
			}
591
		}
592
	}
593
594
	/**
595
	 * Check if the parent_form_id columns exists.
596
	 * If not, try and add it again
597
	 *
598
	 * @since 2.0.2
599
	 */
600
	private function migrate_to_23() {
601
		global $wpdb;
602
		$exists = $wpdb->get_row( 'SHOW COLUMNS FROM ' . $this->forms . ' LIKE "parent_form_id"' );
603
		if ( empty( $exists ) ) {
604
			$wpdb->query( 'ALTER TABLE ' . $this->forms . ' ADD parent_form_id int(11) default 0' );
605
		}
606
	}
607
608
    /**
609
     * Change field size from character to pixel -- Multiply by 9
610
     */
611
    private function migrate_to_17() {
612
        global $wpdb;
613
		$pixel_conversion = 9;
614
615
        // Get query arguments
616
		$field_types = array( 'textarea', 'text', 'number', 'email', 'url', 'rte', 'date', 'phone', 'password', 'image', 'tag', 'file' );
617
		$query = array( 'type' => $field_types, 'field_options like' => 's:4:"size";', 'field_options not like' => 's:4:"size";s:0:' );
618
619
        // Get results
620
		$fields = FrmDb::get_results( $this->fields, $query, 'id, field_options' );
621
622
        $updated = 0;
623
        foreach ( $fields as $f ) {
624
            $f->field_options = maybe_unserialize($f->field_options);
625
            if ( empty($f->field_options['size']) || ! is_numeric($f->field_options['size']) ) {
626
                continue;
627
            }
628
629
			$f->field_options['size'] = round( $pixel_conversion * (int) $f->field_options['size'] );
630
            $f->field_options['size'] .= 'px';
631
            $u = FrmField::update( $f->id, array( 'field_options' => $f->field_options ) );
632
            if ( $u ) {
633
                $updated++;
634
            }
635
            unset($f);
636
        }
637
638
        // Change the characters in widgets to pixels
639
        $widgets = get_option('widget_frm_show_form');
640
        if ( empty($widgets) ) {
641
            return;
642
        }
643
644
        $widgets = maybe_unserialize($widgets);
645
        foreach ( $widgets as $k => $widget ) {
646
            if ( ! is_array($widget) || ! isset($widget['size']) ) {
647
                continue;
648
            }
649
			$size = round( $pixel_conversion * (int) $widget['size'] );
650
            $size .= 'px';
651
			$widgets[ $k ]['size'] = $size;
652
        }
653
        update_option('widget_frm_show_form', $widgets);
654
    }
655
656
    /**
657
     * Migrate post and email notification settings into actions
658
     */
659
    private function migrate_to_16() {
660
        global $wpdb;
661
662
        $forms = FrmDb::get_results( $this->forms, array(), 'id, options, is_template, default_template' );
663
664
        /**
665
        * Old email settings format:
666
        * email_to: Email or field id
667
        * also_email_to: array of fields ids
668
        * reply_to: Email, field id, 'custom'
669
        * cust_reply_to: string
670
        * reply_to_name: field id, 'custom'
671
        * cust_reply_to_name: string
672
        * plain_text: 0|1
673
        * email_message: string or ''
674
        * email_subject: string or ''
675
        * inc_user_info: 0|1
676
        * update_email: 0, 1, 2
677
        *
678
        * Old autoresponder settings format:
679
        * auto_responder: 0|1
680
        * ar_email_message: string or ''
681
        * ar_email_to: field id
682
        * ar_plain_text: 0|1
683
        * ar_reply_to_name: string
684
        * ar_reply_to: string
685
        * ar_email_subject: string
686
        * ar_update_email: 0, 1, 2
687
        *
688
        * New email settings:
689
        * post_content: json settings
690
        * post_title: form id
691
        * post_excerpt: message
692
        *
693
        */
694
695
        foreach ( $forms as $form ) {
696
			if ( $form->is_template && $form->default_template ) {
697
				// don't migrate the default templates since the email will be added anyway
698
				continue;
699
			}
700
701
            // Format form options
702
            $form_options = maybe_unserialize($form->options);
703
704
            // Migrate settings to actions
705
            FrmXMLHelper::migrate_form_settings_to_actions( $form_options, $form->id );
706
        }
707
    }
708
709
    private function migrate_to_11() {
710
        global $wpdb;
711
712
        $forms = FrmDb::get_results( $this->forms, array(), 'id, options');
713
714
        $sending = __( 'Sending', 'formidable' );
715
		$img = FrmAppHelper::plugin_url() . '/images/ajax_loader.gif';
716
        $old_default_html = <<<DEFAULT_HTML
717
<div class="frm_submit">
718
[if back_button]<input type="submit" value="[back_label]" name="frm_prev_page" formnovalidate="formnovalidate" [back_hook] />[/if back_button]
719
<input type="submit" value="[button_label]" [button_action] />
720
<img class="frm_ajax_loading" src="$img" alt="$sending" style="visibility:hidden;" />
721
</div>
722
DEFAULT_HTML;
723
        unset($sending, $img);
724
725
        $new_default_html = FrmFormsHelper::get_default_html('submit');
726
        $draft_link = FrmFormsHelper::get_draft_link();
727
		foreach ( $forms as $form ) {
728
            $form->options = maybe_unserialize($form->options);
729
            if ( ! isset($form->options['submit_html']) || empty($form->options['submit_html']) ) {
730
                continue;
731
            }
732
733
            if ( $form->options['submit_html'] != $new_default_html && $form->options['submit_html'] == $old_default_html ) {
734
                $form->options['submit_html'] = $new_default_html;
735
				$wpdb->update( $this->forms, array( 'options' => serialize( $form->options ) ), array( 'id' => $form->id ) );
736
			} else if ( ! strpos( $form->options['submit_html'], 'save_draft' ) ) {
737
				$form->options['submit_html'] = preg_replace( '~\<\/div\>(?!.*\<\/div\>)~', $draft_link . "\r\n</div>", $form->options['submit_html'] );
738
				$wpdb->update( $this->forms, array( 'options' => serialize( $form->options ) ), array( 'id' => $form->id ) );
739
            }
740
            unset($form);
741
        }
742
        unset($forms);
743
    }
744
745
    private function migrate_to_6() {
746
        global $wpdb;
747
748
		$no_save = array_merge( FrmField::no_save_fields(), array( 'form', 'hidden', 'user_id' ) );
749
		$fields = FrmDb::get_results( $this->fields, array( 'type NOT' => $no_save ), 'id, field_options' );
750
751
        $default_html = <<<DEFAULT_HTML
752
<div id="frm_field_[id]_container" class="form-field [required_class] [error_class]">
753
    <label class="frm_pos_[label_position]">[field_name]
754
        <span class="frm_required">[required_label]</span>
755
    </label>
756
    [input]
757
    [if description]<div class="frm_description">[description]</div>[/if description]
758
</div>
759
DEFAULT_HTML;
760
761
        $old_default_html = <<<DEFAULT_HTML
762
<div id="frm_field_[id]_container" class="form-field [required_class] [error_class]">
763
    <label class="frm_pos_[label_position]">[field_name]
764
        <span class="frm_required">[required_label]</span>
765
    </label>
766
    [input]
767
    [if description]<p class="frm_description">[description]</p>[/if description]
768
</div>
769
DEFAULT_HTML;
770
771
        $new_default_html = FrmFieldsHelper::get_default_html('text');
772
        foreach ( $fields as $field ) {
773
            $field->field_options = maybe_unserialize($field->field_options);
774
			if ( ! FrmField::is_option_empty( $field, 'custom_html' ) || $field->field_options['custom_html'] == $default_html || $field->field_options['custom_html'] == $old_default_html ) {
775
                $field->field_options['custom_html'] = $new_default_html;
776
				$wpdb->update( $this->fields, array( 'field_options' => maybe_serialize( $field->field_options ) ), array( 'id' => $field->id ) );
777
            }
778
            unset($field);
779
        }
780
        unset($default_html, $old_default_html, $fields);
781
    }
782
783
    private function migrate_to_4() {
784
        global $wpdb;
785
		$user_ids = FrmEntryMeta::getAll( array( 'fi.type' => 'user_id' ) );
786
        foreach ( $user_ids as $user_id ) {
787
			$wpdb->update( $this->entries, array( 'user_id' => $user_id->meta_value ), array( 'id' => $user_id->item_id ) );
788
        }
789
    }
790
}
791