Completed
Push — master ( 1ba53f...ffda11 )
by Jamie
03:41
created

FrmDb   D

Complexity

Total Complexity 108

Size/Duplication

Total Lines 727
Duplicated Lines 0 %

Coupling/Cohesion

Components 1
Dependencies 11
Metric Value
wmc 108
lcom 1
cbo 11
dl 0
loc 727
rs 4

26 Methods

Rating   Name   Duplication   Size   Complexity  
A __construct() 0 11 2
B upgrade() 0 33 5
A collation() 0 17 4
B create_tables() 0 86 3
A migrate_data() 0 9 4
A get_where_clause_and_values() 0 17 3
D parse_where_from_array() 0 27 10
C interpret_array_to_sql() 0 66 15
A get_count() 0 4 1
B get_var() 0 24 3
A get_col() 0 3 1
A get_row() 0 4 1
A get_one_record() 0 4 1
A get_records() 0 4 1
A get_results() 0 3 1
B append_where_is() 0 27 4
A get_group_and_table_name() 0 17 3
C convert_options_to_array() 0 29 8
B uninstall() 0 51 5
A migrate_to_25() 0 16 4
A migrate_to_23() 0 7 2
D migrate_to_17() 0 44 9
B migrate_to_16() 0 49 4
C migrate_to_11() 0 35 7
B migrate_to_6() 0 37 5
A migrate_to_4() 0 7 2

How to fix   Complexity   

Complex Class

Complex classes like FrmDb often do a lot of different things. To break such a class down, we need to identify a cohesive component within that class. A common approach to find such a component is to look for fields/methods that share the same prefixes, or suffixes. You can also have a look at the cohesion graph to spot any un-connected, or weakly-connected components.

Once you have determined the fields that belong together, you can apply the Extract Class refactoring. If the component makes sense as a sub-class, Extract Subclass is also a candidate, and is often faster.

While breaking up the class, it is a good idea to analyze how other classes use FrmDb, and based on these observations, apply Extract Interface, too.

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 );
2 ignored issues
show
introduced by
Usage of a direct database call is discouraged.
Loading history...
introduced by
Usage of a direct database call without caching is prohibited. Use wp_cache_get / wp_cache_set.
Loading history...
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 = rtrim( $where, $key );
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
            $where .= is_numeric( $value ) ? ( strpos( $value, '.' ) !== false ? '%f' : '%d' ) : '%s';
293
            $values[] = $value;
294
        }
295
    }
296
297
    /**
298
     * @param string $table
299
     */
300
    public static function get_count( $table, $where = array(), $args = array() ) {
301
        $count = self::get_var( $table, $where, 'COUNT(*)', $args );
302
        return $count;
303
    }
304
305
    public static function get_var( $table, $where = array(), $field = 'id', $args = array(), $limit = '', $type = 'var' ) {
306
        $group = '';
307
        self::get_group_and_table_name( $table, $group );
308
		self::convert_options_to_array( $args, '', $limit );
309
310
		$query = 'SELECT ' . $field . ' FROM ' . $table;
311
		if ( is_array( $where ) || empty( $where ) ) {
312
			// only separate into array values and query string if is array
313
        	self::get_where_clause_and_values( $where );
314
			global $wpdb;
315
			$query = $wpdb->prepare( $query . $where['where'] . ' ' . implode( ' ', $args ), $where['values'] );
316
		} else {
317
			/**
318
			 * Allow the $where to be prepared before we recieve it here.
319
			 * This is a fallback for reverse compatability, but is not recommended
320
			 */
321
			_deprecated_argument( 'where', '2.0', __( 'Use the query in an array format so it can be properly prepared.', 'formidable' ) );
322
			$query .= $where . ' ' . implode( ' ', $args );
323
		}
324
325
        $cache_key = str_replace( array( ' ', ',' ), '_', trim( implode('_', FrmAppHelper::array_flatten( $where ) ) . implode( '_', $args ) . $field .'_'. $type, ' WHERE' ) );
326
        $results = FrmAppHelper::check_cache( $cache_key, $group, $query, 'get_'. $type );
327
        return $results;
328
    }
329
330
    /**
331
     * @param string $table
332
     * @param array $where
333
     */
334
    public static function get_col( $table, $where = array(), $field = 'id', $args = array(), $limit = '' ) {
335
        return self::get_var( $table, $where, $field, $args, $limit, 'col' );
336
    }
337
338
    /**
339
     * @since 2.0
340
     * @param string $table
341
     */
342
    public static function get_row( $table, $where = array(), $fields = '*', $args = array() ) {
343
        $args['limit'] = 1;
344
        return self::get_var( $table, $where, $fields, $args, '', 'row' );
345
    }
346
347
    /**
348
     * @param string $table
349
     */
350
    public static function get_one_record( $table, $args = array(), $fields = '*', $order_by = '' ) {
351
        _deprecated_function( __FUNCTION__, '2.0', 'FrmDb::get_row' );
352
		return self::get_var( $table, $args, $fields, array( 'order_by' => $order_by, 'limit' => 1 ), '', 'row' );
353
    }
354
355
    public static function get_records( $table, $args = array(), $order_by = '', $limit = '', $fields = '*' ) {
356
        _deprecated_function( __FUNCTION__, '2.0', 'FrmDb::get_results' );
357
        return self::get_results( $table, $args, $fields, compact('order_by', 'limit') );
358
    }
359
360
    /**
361
     * Prepare a key/value array before DB call
362
     * @since 2.0
363
     * @param string $table
364
     */
365
    public static function get_results( $table, $where = array(), $fields = '*', $args = array() ) {
366
        return self::get_var( $table, $where, $fields, $args, '', 'results' );
367
    }
368
369
	/**
370
	 * Check for like, not like, in, not in, =, !=, >, <, <=, >=
371
	 * Return a value to append to the where array key
372
	 *
373
	 * @return string
374
	 */
375
	public static function append_where_is( $where_is ) {
376
		$switch_to = array(
377
			'='		=> '',
378
			'!=' 	=> '!',
379
			'<='	=> '<',
380
			'>='	=> '>',
381
			'like'	=> 'like',
382
			'not like' => 'not like',
383
			'in'	=> '',
384
			'not in' => 'not',
385
			'like%'	=> 'like%',
386
			'%like'	=> '%like',
387
		);
388
389
		$where_is = strtolower( $where_is );
390
		if ( isset( $switch_to[ $where_is ] ) ) {
391
			return ' ' . $switch_to[ $where_is ];
392
		}
393
394
		// > and < need a little more work since we don't want them switched to >= and <=
395
		if ( $where_is == '>' || $where_is == '<' ) {
396
			return ' ' . $where_is . '-'; // the - indicates that the = should not be added later
397
		}
398
399
		// fallback to = if the query is none of these
400
		return '';
401
	}
402
403
    /**
404
     * Get 'frm_forms' from wp_frm_forms or a longer table param that includes a join
405
     * Also add the wpdb->prefix to the table if it's missing
406
     *
407
     * @param string $table
408
     * @param string $group
409
     */
410
    private static function get_group_and_table_name( &$table, &$group ) {
411
		global $wpdb, $wpmuBaseTablePrefix;
412
413
        $table_parts = explode(' ', $table);
414
        $group = reset($table_parts);
415
        $group = str_replace( $wpdb->prefix, '', $group );
416
417
		$prefix = $wpmuBaseTablePrefix ? $wpmuBaseTablePrefix : $wpdb->base_prefix;
418
		$group = str_replace( $prefix, '', $group );
419
420
        if ( $group == $table ) {
421
            $table = $wpdb->prefix . $table;
422
        }
423
424
		// switch to singular group name
425
		$group = rtrim( $group, 's' );
426
    }
427
428
    private static function convert_options_to_array( &$args, $order_by = '', $limit = '' ) {
429
        if ( ! is_array($args) ) {
430
			$args = array( 'order_by' => $args );
431
        }
432
433
        if ( ! empty( $order_by ) ) {
434
            $args['order_by'] = $order_by;
435
        }
436
437
        if ( ! empty( $limit ) ) {
438
            $args['limit'] = $limit;
439
        }
440
441
        $temp_args = $args;
442
        foreach ( $temp_args as $k => $v ) {
443
            if ( $v == '' ) {
444
				unset( $args[ $k ] );
445
                continue;
446
            }
447
448
            if ( $k == 'limit' ) {
449
				$args[ $k ] = FrmAppHelper::esc_limit( $v );
450
            }
451
            $db_name = strtoupper( str_replace( '_', ' ', $k ) );
452
            if ( strpos( $v, $db_name ) === false ) {
453
				$args[ $k ] = $db_name . ' ' . $v;
454
            }
455
        }
456
    }
457
458
    public function uninstall() {
459
		if ( ! current_user_can( 'administrator' ) ) {
460
            $frm_settings = FrmAppHelper::get_settings();
461
            wp_die($frm_settings->admin_permission);
462
        }
463
464
        global $wpdb, $wp_roles;
465
466
        $wpdb->query( 'DROP TABLE IF EXISTS '. $this->fields );
3 ignored issues
show
introduced by
Usage of a direct database call is discouraged.
Loading history...
introduced by
Usage of a direct database call without caching is prohibited. Use wp_cache_get / wp_cache_set.
Loading history...
introduced by
Attempting a database schema change is highly discouraged.
Loading history...
467
        $wpdb->query( 'DROP TABLE IF EXISTS '. $this->forms );
3 ignored issues
show
introduced by
Usage of a direct database call is discouraged.
Loading history...
introduced by
Usage of a direct database call without caching is prohibited. Use wp_cache_get / wp_cache_set.
Loading history...
introduced by
Attempting a database schema change is highly discouraged.
Loading history...
468
        $wpdb->query( 'DROP TABLE IF EXISTS '. $this->entries );
3 ignored issues
show
introduced by
Usage of a direct database call is discouraged.
Loading history...
introduced by
Usage of a direct database call without caching is prohibited. Use wp_cache_get / wp_cache_set.
Loading history...
introduced by
Attempting a database schema change is highly discouraged.
Loading history...
469
        $wpdb->query( 'DROP TABLE IF EXISTS '. $this->entry_metas );
3 ignored issues
show
introduced by
Usage of a direct database call is discouraged.
Loading history...
introduced by
Usage of a direct database call without caching is prohibited. Use wp_cache_get / wp_cache_set.
Loading history...
introduced by
Attempting a database schema change is highly discouraged.
Loading history...
470
471
        delete_option('frm_options');
472
        delete_option('frm_db_version');
473
474
        //delete roles
475
        $frm_roles = FrmAppHelper::frm_capabilities();
476
        $roles = get_editable_roles();
477
        foreach ( $frm_roles as $frm_role => $frm_role_description ) {
478
            foreach ( $roles as $role => $details ) {
479
                $wp_roles->remove_cap( $role, $frm_role );
480
                unset($role, $details);
481
    		}
482
    		unset($frm_role, $frm_role_description);
483
		}
484
		unset($roles, $frm_roles);
485
486
		// delete actions, views, and styles
487
488
		// prevent the post deletion from triggering entries to be deleted
489
		remove_action( 'before_delete_post', 'FrmProDisplaysController::before_delete_post' );
490
		remove_action( 'deleted_post', 'FrmProEntriesController::delete_entry' );
491
492
		$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' ) );
2 ignored issues
show
introduced by
Usage of a direct database call is discouraged.
Loading history...
introduced by
Usage of a direct database call without caching is prohibited. Use wp_cache_get / wp_cache_set.
Loading history...
493
		foreach ( $post_ids as $post_id ) {
494
			// Delete's each post.
495
			wp_delete_post( $post_id, true );
496
		}
497
		unset( $post_ids );
498
499
		// delete transients
500
		delete_transient( 'frmpro_css' );
501
		delete_transient( 'frm_options' );
502
		delete_transient( 'frmpro_options' );
503
504
		$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_%' ) );
2 ignored issues
show
introduced by
Usage of a direct database call is discouraged.
Loading history...
introduced by
Usage of a direct database call without caching is prohibited. Use wp_cache_get / wp_cache_set.
Loading history...
505
506
        do_action('frm_after_uninstall');
507
        return true;
508
    }
509
510
	/**
511
	 * Migrate old styling settings. If sites are using the old
512
	 * default 400px field width, switch it to 100%
513
	 *
514
	 * @since 2.0.4
515
	 */
516
	private function migrate_to_25() {
517
		// get the style that was created with the style migration
518
		$frm_style = new FrmStyle();
519
		$styles = $frm_style->get_all( 'post_date', 'ASC', 1 );
520
		if ( empty( $styles ) ) {
521
			return;
522
		}
523
524
		foreach ( $styles as $style ) {
525
			if ( $style->post_content['field_width'] == '400px' ) {
526
				$style->post_content['field_width'] = '100%';
527
				$frm_style->save( (array) $style );
528
				return;
529
			}
530
		}
531
	}
532
533
	/**
534
	 * Check if the parent_form_id columns exists.
535
	 * If not, try and add it again
536
	 *
537
	 * @since 2.0.2
538
	 */
539
	private function migrate_to_23() {
540
		global $wpdb;
541
		$exists = $wpdb->get_row( 'SHOW COLUMNS FROM '. $this->forms .' LIKE "parent_form_id"' );
2 ignored issues
show
introduced by
Usage of a direct database call is discouraged.
Loading history...
introduced by
Usage of a direct database call without caching is prohibited. Use wp_cache_get / wp_cache_set.
Loading history...
542
		if ( empty( $exists ) ) {
543
			$wpdb->query( 'ALTER TABLE '. $this->forms .' ADD parent_form_id int(11) default 0' );
3 ignored issues
show
introduced by
Usage of a direct database call is discouraged.
Loading history...
introduced by
Usage of a direct database call without caching is prohibited. Use wp_cache_get / wp_cache_set.
Loading history...
introduced by
Attempting a database schema change is highly discouraged.
Loading history...
544
		}
545
	}
546
547
    /**
548
     * Change field size from character to pixel -- Multiply by 9
549
     */
550
    private function migrate_to_17() {
551
        global $wpdb;
552
		$pixel_conversion = 9;
553
554
        // Get query arguments
555
		$field_types = array( 'textarea', 'text', 'number', 'email', 'url', 'rte', 'date', 'phone', 'password', 'image', 'tag', 'file' );
556
		$query = array( 'type' => $field_types, 'field_options like' => 's:4:"size";', 'field_options not like' => 's:4:"size";s:0:' );
557
558
        // Get results
559
		$fields = FrmDb::get_results( $this->fields, $query, 'id, field_options' );
560
561
        $updated = 0;
562
        foreach ( $fields as $f ) {
563
            $f->field_options = maybe_unserialize($f->field_options);
564
            if ( empty($f->field_options['size']) || ! is_numeric($f->field_options['size']) ) {
565
                continue;
566
            }
567
568
			$f->field_options['size'] = round( $pixel_conversion * (int) $f->field_options['size'] );
569
            $f->field_options['size'] .= 'px';
570
            $u = FrmField::update( $f->id, array( 'field_options' => $f->field_options ) );
571
            if ( $u ) {
572
                $updated++;
573
            }
574
            unset($f);
575
        }
576
577
        // Change the characters in widgets to pixels
578
        $widgets = get_option('widget_frm_show_form');
579
        if ( empty($widgets) ) {
580
            return;
581
        }
582
583
        $widgets = maybe_unserialize($widgets);
584
        foreach ( $widgets as $k => $widget ) {
585
            if ( ! is_array($widget) || ! isset($widget['size']) ) {
586
                continue;
587
            }
588
			$size = round( $pixel_conversion * (int) $widget['size'] );
589
            $size .= 'px';
590
			$widgets[ $k ]['size'] = $size;
591
        }
592
        update_option('widget_frm_show_form', $widgets);
593
    }
594
595
    /**
596
     * Migrate post and email notification settings into actions
597
     */
598
    private function migrate_to_16() {
599
        global $wpdb;
600
601
        $forms = FrmDb::get_results( $this->forms, array(), 'id, options, is_template, default_template' );
602
603
        /**
604
        * Old email settings format:
605
        * email_to: Email or field id
606
        * also_email_to: array of fields ids
607
        * reply_to: Email, field id, 'custom'
608
        * cust_reply_to: string
609
        * reply_to_name: field id, 'custom'
610
        * cust_reply_to_name: string
611
        * plain_text: 0|1
612
        * email_message: string or ''
613
        * email_subject: string or ''
614
        * inc_user_info: 0|1
615
        * update_email: 0, 1, 2
616
        *
617
        * Old autoresponder settings format:
618
        * auto_responder: 0|1
619
        * ar_email_message: string or ''
620
        * ar_email_to: field id
621
        * ar_plain_text: 0|1
622
        * ar_reply_to_name: string
623
        * ar_reply_to: string
624
        * ar_email_subject: string
625
        * ar_update_email: 0, 1, 2
626
        *
627
        * New email settings:
628
        * post_content: json settings
629
        * post_title: form id
630
        * post_excerpt: message
631
        *
632
        */
633
634
        foreach ( $forms as $form ) {
635
			if ( $form->is_template && $form->default_template ) {
636
				// don't migrate the default templates since the email will be added anyway
637
				continue;
638
			}
639
640
            // Format form options
641
            $form_options = maybe_unserialize($form->options);
642
643
            // Migrate settings to actions
644
            FrmXMLHelper::migrate_form_settings_to_actions( $form_options, $form->id );
645
        }
646
    }
647
648
    private function migrate_to_11() {
649
        global $wpdb;
650
651
        $forms = FrmDb::get_results( $this->forms, array(), 'id, options');
652
653
        $sending = __( 'Sending', 'formidable' );
654
        $img = FrmAppHelper::plugin_url() .'/images/ajax_loader.gif';
655
        $old_default_html = <<<DEFAULT_HTML
656
<div class="frm_submit">
657
[if back_button]<input type="submit" value="[back_label]" name="frm_prev_page" formnovalidate="formnovalidate" [back_hook] />[/if back_button]
658
<input type="submit" value="[button_label]" [button_action] />
659
<img class="frm_ajax_loading" src="$img" alt="$sending" style="visibility:hidden;" />
660
</div>
661
DEFAULT_HTML;
662
        unset($sending, $img);
663
664
        $new_default_html = FrmFormsHelper::get_default_html('submit');
665
        $draft_link = FrmFormsHelper::get_draft_link();
666
		foreach ( $forms as $form ) {
667
            $form->options = maybe_unserialize($form->options);
668
            if ( ! isset($form->options['submit_html']) || empty($form->options['submit_html']) ) {
669
                continue;
670
            }
671
672
            if ( $form->options['submit_html'] != $new_default_html && $form->options['submit_html'] == $old_default_html ) {
673
                $form->options['submit_html'] = $new_default_html;
674
				$wpdb->update( $this->forms, array( 'options' => serialize( $form->options ) ), array( 'id' => $form->id ) );
1 ignored issue
show
introduced by
Usage of a direct database call is discouraged.
Loading history...
675
			} else if ( ! strpos( $form->options['submit_html'], 'save_draft' ) ) {
676
                $form->options['submit_html'] = preg_replace('~\<\/div\>(?!.*\<\/div\>)~', $draft_link ."\r\n</div>", $form->options['submit_html']);
677
				$wpdb->update( $this->forms, array( 'options' => serialize( $form->options ) ), array( 'id' => $form->id ) );
1 ignored issue
show
introduced by
Usage of a direct database call is discouraged.
Loading history...
678
            }
679
            unset($form);
680
        }
681
        unset($forms);
682
    }
683
684
    private function migrate_to_6() {
685
        global $wpdb;
686
687
		$no_save = array_merge( FrmField::no_save_fields(), array( 'form', 'hidden', 'user_id' ) );
688
		$fields = FrmDb::get_results( $this->fields, array( 'type NOT' => $no_save ), 'id, field_options' );
689
690
        $default_html = <<<DEFAULT_HTML
691
<div id="frm_field_[id]_container" class="form-field [required_class] [error_class]">
692
    <label class="frm_pos_[label_position]">[field_name]
693
        <span class="frm_required">[required_label]</span>
694
    </label>
695
    [input]
696
    [if description]<div class="frm_description">[description]</div>[/if description]
697
</div>
698
DEFAULT_HTML;
699
700
        $old_default_html = <<<DEFAULT_HTML
701
<div id="frm_field_[id]_container" class="form-field [required_class] [error_class]">
702
    <label class="frm_pos_[label_position]">[field_name]
703
        <span class="frm_required">[required_label]</span>
704
    </label>
705
    [input]
706
    [if description]<p class="frm_description">[description]</p>[/if description]
707
</div>
708
DEFAULT_HTML;
709
710
        $new_default_html = FrmFieldsHelper::get_default_html('text');
711
        foreach ( $fields as $field ) {
712
            $field->field_options = maybe_unserialize($field->field_options);
713
			if ( ! FrmField::is_option_empty( $field, 'custom_html' ) || $field->field_options['custom_html'] == $default_html || $field->field_options['custom_html'] == $old_default_html ) {
714
                $field->field_options['custom_html'] = $new_default_html;
715
				$wpdb->update( $this->fields, array( 'field_options' => maybe_serialize( $field->field_options ) ), array( 'id' => $field->id ) );
1 ignored issue
show
introduced by
Usage of a direct database call is discouraged.
Loading history...
716
            }
717
            unset($field);
718
        }
719
        unset($default_html, $old_default_html, $fields);
720
    }
721
722
    private function migrate_to_4() {
723
        global $wpdb;
724
		$user_ids = FrmEntryMeta::getAll( array( 'fi.type' => 'user_id' ) );
725
        foreach ( $user_ids as $user_id ) {
726
			$wpdb->update( $this->entries, array( 'user_id' => $user_id->meta_value ), array( 'id' => $user_id->item_id ) );
1 ignored issue
show
introduced by
Usage of a direct database call is discouraged.
Loading history...
727
        }
728
    }
729
}
730