Completed
Push — master ( 6dd813...ea430e )
by Stephanie
03:19
created

FrmDb::create_tables()   B

Complexity

Conditions 3
Paths 3

Size

Total Lines 86
Code Lines 14

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
cc 3
eloc 14
nc 3
nop 0
dl 0
loc 86
rs 8.6583
c 0
b 0
f 0

How to fix   Long Method   

Long Method

Small methods make your code easier to understand, in particular if combined with a good name. Besides, if your method is small, finding a good name is usually much easier.

For example, if you find yourself adding comments to a method's body, this is usually a good sign to extract the commented part to a new method, and use the comment as a starting point when coming up with a good name for this new method.

Commonly applied refactorings include:

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
	    do_action( 'frm_before_install' );
23
24
        global $wpdb;
25
        //$frm_db_version is the version of the database we're moving to
26
        $frm_db_version = FrmAppHelper::$db_version;
27
        $old_db_version = (float) $old_db_version;
28
        if ( ! $old_db_version ) {
29
            $old_db_version = get_option('frm_db_version');
30
        }
31
32
        if ( $frm_db_version != $old_db_version ) {
33
			// update rewrite rules for views and other custom post types
34
			flush_rewrite_rules();
35
36
			require_once( ABSPATH . 'wp-admin/includes/upgrade.php' );
37
38
            $this->create_tables();
39
            $this->migrate_data($frm_db_version, $old_db_version);
40
41
            /***** SAVE DB VERSION *****/
42
            update_option('frm_db_version', $frm_db_version);
43
44
            /**** ADD/UPDATE DEFAULT TEMPLATES ****/
45
            FrmXMLController::add_default_templates();
46
        }
47
48
        do_action('frm_after_install');
49
50
        /**** update the styling settings ****/
51
		if ( is_admin() && function_exists( 'get_filesystem_method' ) ) {
52
			$frm_style = new FrmStyle();
53
			$frm_style->update( 'default' );
54
		}
55
    }
56
57
    public function collation() {
58
        global $wpdb;
59
        if ( ! $wpdb->has_cap( 'collation' ) ) {
60
            return '';
61
        }
62
63
        $charset_collate = '';
64
		if ( ! empty( $wpdb->charset ) ) {
65
			$charset_collate .= ' DEFAULT CHARACTER SET ' . $wpdb->charset;
66
		}
67
68
		if ( ! empty( $wpdb->collate ) ) {
69
			$charset_collate .= ' COLLATE ' . $wpdb->collate;
70
		}
71
72
        return $charset_collate;
73
    }
74
75
    private function create_tables() {
76
        $charset_collate = $this->collation();
77
        $sql = array();
78
79
        /* Create/Upgrade Fields Table */
80
		$sql[] = 'CREATE TABLE ' . $this->fields . ' (
81
                id int(11) NOT NULL auto_increment,
82
				field_key varchar(100) default NULL,
83
                name text default NULL,
84
                description longtext default NULL,
85
                type text default NULL,
86
                default_value longtext default NULL,
87
                options longtext default NULL,
88
                field_order int(11) default 0,
89
                required int(1) default NULL,
90
                field_options longtext default NULL,
91
                form_id int(11) default NULL,
92
                created_at datetime NOT NULL,
93
                PRIMARY KEY  (id),
94
                KEY form_id (form_id),
95
                UNIQUE KEY field_key (field_key)
96
        )';
97
98
        /* Create/Upgrade Forms Table */
99
		$sql[] = 'CREATE TABLE ' . $this->forms . ' (
100
                id int(11) NOT NULL auto_increment,
101
				form_key varchar(100) default NULL,
102
                name varchar(255) default NULL,
103
                description text default NULL,
104
                parent_form_id int(11) default 0,
105
                logged_in tinyint(1) default NULL,
106
                editable tinyint(1) default NULL,
107
                is_template tinyint(1) default 0,
108
                default_template tinyint(1) default 0,
109
                status varchar(255) default NULL,
110
                options longtext default NULL,
111
                created_at datetime NOT NULL,
112
                PRIMARY KEY  (id),
113
                UNIQUE KEY form_key (form_key)
114
        )';
115
116
        /* Create/Upgrade Items Table */
117
		$sql[] = 'CREATE TABLE ' . $this->entries . ' (
118
                id int(11) NOT NULL auto_increment,
119
				item_key varchar(100) default NULL,
120
                name varchar(255) default NULL,
121
                description text default NULL,
122
                ip text default NULL,
123
                form_id int(11) default NULL,
124
                post_id int(11) default NULL,
125
                user_id int(11) default NULL,
126
                parent_item_id int(11) default 0,
127
                is_draft tinyint(1) default 0,
128
                updated_by int(11) default NULL,
129
                created_at datetime NOT NULL,
130
                updated_at datetime NOT NULL,
131
                PRIMARY KEY  (id),
132
                KEY form_id (form_id),
133
                KEY post_id (post_id),
134
                KEY user_id (user_id),
135
                KEY parent_item_id (parent_item_id),
136
                UNIQUE KEY item_key (item_key)
137
        )';
138
139
        /* Create/Upgrade Meta Table */
140
		$sql[] = 'CREATE TABLE ' . $this->entry_metas . ' (
141
                id int(11) NOT NULL auto_increment,
142
                meta_value longtext default NULL,
143
                field_id int(11) NOT NULL,
144
                item_id int(11) NOT NULL,
145
                created_at datetime NOT NULL,
146
                PRIMARY KEY  (id),
147
                KEY field_id (field_id),
148
                KEY item_id (item_id)
149
        )';
150
151
        foreach ( $sql as $q ) {
152
			if ( function_exists( 'dbDelta' ) ) {
153
				dbDelta( $q . $charset_collate . ';' );
154
			} else {
155
				global $wpdb;
156
				$wpdb->query( $q . $charset_collate );
157
			}
158
            unset($q);
159
        }
160
    }
161
162
    /**
163
     * @param integer $frm_db_version
164
	 * @param int $old_db_version
165
     */
166
	private function migrate_data( $frm_db_version, $old_db_version ) {
167
		$migrations = array( 4, 6, 11, 16, 17, 23, 25 );
168
        foreach ( $migrations as $migration ) {
169
            if ( $frm_db_version >= $migration && $old_db_version < $migration ) {
170
				$function_name = 'migrate_to_' . $migration;
171
                $this->$function_name();
172
            }
173
        }
174
    }
175
176
    /**
177
     * Change array into format $wpdb->prepare can use
178
	 *
179
	 * @param array $args
180
	 * @param string $starts_with
181
     */
182
    public static function get_where_clause_and_values( &$args, $starts_with = ' WHERE ' ) {
183
        if ( empty($args) ) {
184
			// add an arg to prevent prepare from failing
185
			$args = array( 'where' => $starts_with . '1=%d', 'values' => array( 1 ) );
186
			return;
187
        }
188
189
		$where = '';
190
		$values = array();
191
192
		if ( is_array( $args ) ) {
193
			$base_where = $starts_with;
194
			self::parse_where_from_array( $args, $base_where, $where, $values );
195
		}
196
197
		$args = compact( 'where', 'values' );
198
    }
199
200
    /**
201
	 * @param array $args
202
     * @param string $base_where
203
     * @param string $where
204
	 * @param array $values
205
     */
206
    public static function parse_where_from_array( $args, $base_where, &$where, &$values ) {
207
        $condition = ' AND';
208
        if ( isset( $args['or'] ) ) {
209
            $condition = ' OR';
210
            unset( $args['or'] );
211
        }
212
213
        foreach ( $args as $key => $value ) {
214
            $where .= empty( $where ) ? $base_where : $condition;
215
            $array_inc_null = ( ! is_numeric( $key ) && is_array( $value ) && in_array( null, $value ) );
216
            if ( is_numeric( $key ) || $array_inc_null ) {
217
                $where .= ' ( ';
218
                $nested_where = '';
219
                if ( $array_inc_null ) {
220
                    foreach ( $value as $val ) {
221
                        self::parse_where_from_array( array( $key => $val, 'or' => 1 ), '', $nested_where, $values );
222
                    }
223
                } else {
224
                    self::parse_where_from_array( $value, '', $nested_where, $values );
225
                }
226
                $where .= $nested_where;
227
                $where .= ' ) ';
228
            } else {
229
                self::interpret_array_to_sql( $key, $value, $where, $values );
230
            }
231
        }
232
    }
233
234
    /**
235
     * @param string $key
236
	 * @param string|array $value
237
     * @param string $where
238
	 * @param array $values
239
     */
240
    private static function interpret_array_to_sql( $key, $value, &$where, &$values ) {
241
		$key = trim( $key );
242
243
		if ( strpos( $key, 'created_at' ) !== false || strpos( $key, 'updated_at' ) !== false ) {
244
            $k = explode(' ', $key);
245
            $where .= ' DATE_FORMAT(' . reset( $k ) . ', %s) ' . str_replace( reset( $k ), '', $key );
246
            $values[] = '%Y-%m-%d %H:%i:%s';
247
        } else {
248
			$where .= ' ' . $key;
249
        }
250
251
		$lowercase_key = explode( ' ', strtolower( $key ) );
252
		$lowercase_key = end( $lowercase_key );
253
254
        if ( is_array( $value ) ) {
255
            // translate array of values to "in"
256
			if ( strpos( $lowercase_key, 'like' ) !== false ) {
257
				$where = preg_replace('/' . $key . '$/', '', $where);
258
				$where .= '(';
259
				$start = true;
260
				foreach ( $value as $v ) {
261
					if ( ! $start ) {
262
						$where .= ' OR ';
263
					}
264
					$start = false;
265
					$where .= $key . ' %s';
266
					$values[] = '%' . FrmAppHelper::esc_like( $v ) . '%';
267
				}
268
				$where .= ')';
269
			} else if ( ! empty( $value ) ) {
270
				$where .= ' in (' . FrmAppHelper::prepare_array_values( $value, '%s' ) . ')';
271
				$values = array_merge( $values, $value );
272
			}
273
        } else if ( strpos( $lowercase_key, 'like' ) !== false ) {
274
			/**
275
			 * Allow string to start or end with the value
276
			 * If the key is like% then skip the first % for starts with
277
			 * If the key is %like then skip the last % for ends with
278
			 */
279
			$start = '%';
280
			$end = '%';
281
			if ( $lowercase_key == 'like%' ) {
282
				$start = '';
283
				$where = rtrim( $where, '%' );
284
			} else if ( $lowercase_key == '%like' ) {
285
				$end = '';
286
				$where = rtrim( rtrim( $where, '%like' ), '%LIKE' );
287
				$where .= 'like';
288
			}
289
290
			$where .= ' %s';
291
			$values[] = $start . FrmAppHelper::esc_like( $value ) . $end;
292
293
        } else if ( $value === null ) {
294
            $where .= ' IS NULL';
295
        } else {
296
			// allow a - to prevent = from being added
297
			if ( substr( $key, -1 ) == '-' ) {
298
				$where = rtrim( $where, '-' );
299
			} else {
300
				$where .= '=';
301
			}
302
303
			self::add_query_placeholder( $key, $value, $where );
304
305
            $values[] = $value;
306
        }
307
    }
308
309
	/**
310
	 * Add %d, or %s to query
311
	 *
312
	 * @since 2.02.05
313
	 * @param string $key
314
	 * @param int|string $value
315
	 * @param string $where
316
	 */
317
    private static function add_query_placeholder( $key, $value, &$where ) {
318
		if ( is_numeric( $value ) && strpos( $key, 'meta_value' ) === false ) {
319
			$where .= '%d';
320
		} else {
321
			$where .= '%s';
322
		}
323
	}
324
325
    /**
326
     * @param string $table
327
	 * @param array $where
328
	 * @param array $args
329
	 * @return int
330
     */
331
    public static function get_count( $table, $where = array(), $args = array() ) {
332
        $count = self::get_var( $table, $where, 'COUNT(*)', $args );
333
        return $count;
334
    }
335
336
	/**
337
	 * @param string $table
338
	 * @param array $where
339
	 * @param string $field
340
	 * @param array $args
341
	 * @param string $limit
342
	 * @param string $type
343
	 * @return array|null|string|object
344
	 */
345
    public static function get_var( $table, $where = array(), $field = 'id', $args = array(), $limit = '', $type = 'var' ) {
346
        $group = '';
347
        self::get_group_and_table_name( $table, $group );
348
		self::convert_options_to_array( $args, '', $limit );
349
350
		$query = self::generate_query_string_from_pieces( $field, $table, $where, $args );
351
352
		$cache_key = str_replace( array( ' ', ',' ), '_', trim( implode( '_', FrmAppHelper::array_flatten( $where ) ) . implode( '_', $args ) . $field . '_' . $type, ' WHERE' ) );
353
		$results = FrmAppHelper::check_cache( $cache_key, $group, $query, 'get_' . $type );
354
        return $results;
355
    }
356
357
    /**
358
     * @param string $table
359
     * @param array $where
360
	 * @param string $field
361
	 * @param array $args
362
	 * @param string $limit
363
	 * @return mixed
364
     */
365
    public static function get_col( $table, $where = array(), $field = 'id', $args = array(), $limit = '' ) {
366
        return self::get_var( $table, $where, $field, $args, $limit, 'col' );
367
    }
368
369
    /**
370
     * @since 2.0
371
     * @param string $table
372
	 * @param array $where
373
	 * @param string $fields
374
	 * @param array $args
375
	 * @return mixed
376
     */
377
    public static function get_row( $table, $where = array(), $fields = '*', $args = array() ) {
378
        $args['limit'] = 1;
379
        return self::get_var( $table, $where, $fields, $args, '', 'row' );
380
    }
381
382
    /**
383
     * Prepare a key/value array before DB call
384
	 *
385
     * @since 2.0
386
     * @param string $table
387
	 * @param array $where
388
	 * @param string $fields
389
	 * @param array $args
390
	 * @return mixed
391
     */
392
    public static function get_results( $table, $where = array(), $fields = '*', $args = array() ) {
393
        return self::get_var( $table, $where, $fields, $args, '', 'results' );
394
    }
395
396
	/**
397
	 * Check for like, not like, in, not in, =, !=, >, <, <=, >=
398
	 * Return a value to append to the where array key
399
	 *
400
	 * @param string $where_is
401
	 * @return string
402
	 */
403
	public static function append_where_is( $where_is ) {
404
		$switch_to = array(
405
			'='		=> '',
406
			'!=' 	=> '!',
407
			'<='	=> '<',
408
			'>='	=> '>',
409
			'like'	=> 'like',
410
			'not like' => 'not like',
411
			'in'	=> '',
412
			'not in' => 'not',
413
			'like%'	=> 'like%',
414
			'%like'	=> '%like',
415
		);
416
417
		$where_is = strtolower( $where_is );
418
		if ( isset( $switch_to[ $where_is ] ) ) {
419
			return ' ' . $switch_to[ $where_is ];
420
		}
421
422
		// > and < need a little more work since we don't want them switched to >= and <=
423
		if ( $where_is == '>' || $where_is == '<' ) {
424
			return ' ' . $where_is . '-'; // the - indicates that the = should not be added later
425
		}
426
427
		// fallback to = if the query is none of these
428
		return '';
429
	}
430
431
    /**
432
     * Get 'frm_forms' from wp_frm_forms or a longer table param that includes a join
433
     * Also add the wpdb->prefix to the table if it's missing
434
     *
435
     * @param string $table
436
     * @param string $group
437
     */
438
    private static function get_group_and_table_name( &$table, &$group ) {
439
		global $wpdb, $wpmuBaseTablePrefix;
440
441
        $table_parts = explode(' ', $table);
442
        $group = reset($table_parts);
443
        $group = str_replace( $wpdb->prefix, '', $group );
444
445
		$prefix = $wpmuBaseTablePrefix ? $wpmuBaseTablePrefix : $wpdb->base_prefix;
446
		$group = str_replace( $prefix, '', $group );
447
448
        if ( $group == $table ) {
449
            $table = $wpdb->prefix . $table;
450
        }
451
452
		// switch to singular group name
453
		$group = rtrim( $group, 's' );
454
    }
455
456
    private static function convert_options_to_array( &$args, $order_by = '', $limit = '' ) {
457
        if ( ! is_array($args) ) {
458
			$args = array( 'order_by' => $args );
459
        }
460
461
        if ( ! empty( $order_by ) ) {
462
            $args['order_by'] = $order_by;
463
        }
464
465
        if ( ! empty( $limit ) ) {
466
            $args['limit'] = $limit;
467
        }
468
469
        $temp_args = $args;
470
        foreach ( $temp_args as $k => $v ) {
471
            if ( $v == '' ) {
472
				unset( $args[ $k ] );
473
                continue;
474
            }
475
476
            if ( $k == 'limit' ) {
477
				$args[ $k ] = FrmAppHelper::esc_limit( $v );
478
            }
479
            $db_name = strtoupper( str_replace( '_', ' ', $k ) );
480
            if ( strpos( $v, $db_name ) === false ) {
481
				$args[ $k ] = $db_name . ' ' . $v;
482
            }
483
        }
484
485
		// Make sure LIMIT is the last argument
486
		if ( isset( $args['order_by'] ) && isset( $args['limit'] ) ) {
487
			$temp_limit = $args['limit'];
488
			unset( $args['limit'] );
489
			$args['limit'] = $temp_limit;
490
		}
491
    }
492
493
	/**
494
	 * Get the associative array results for the given columns, table, and where query
495
	 *
496
	 * @since 2.02.05
497
	 * @param string $columns
498
	 * @param string $table
499
	 * @param array $where
500
	 * @return mixed
501
	 */
502
	public static function get_associative_array_results( $columns, $table, $where ) {
503
		$group = '';
504
		self::get_group_and_table_name( $table, $group );
505
506
		$query = self::generate_query_string_from_pieces( $columns, $table, $where );
507
508
		$cache_key = str_replace( array( ' ', ',' ), '_', trim( implode( '_', FrmAppHelper::array_flatten( $where ) ) . $columns . '_results_ARRAY_A' , ' WHERE' ) );
509
		$results = FrmAppHelper::check_cache( $cache_key, $group, $query, 'get_associative_results' );
510
511
		return $results;
512
	}
513
514
	/**
515
	 * Combine the pieces of a query to form a full, prepared query
516
	 *
517
	 * @since 2.02.05
518
	 *
519
	 * @param string $columns
520
	 * @param string $table
521
	 * @param mixed $where
522
	 * @param array $args
523
	 * @return string
524
	 */
525
	private static function generate_query_string_from_pieces( $columns, $table, $where, $args = array() ) {
526
		$query = 'SELECT ' . $columns . ' FROM ' . $table;
527
528
		if ( is_array( $where ) || empty( $where ) ) {
529
			self::get_where_clause_and_values( $where );
530
			global $wpdb;
531
			$query = $wpdb->prepare( $query . $where['where'] . ' ' . implode( ' ', $args ), $where['values'] );
532
		} else {
533
			/**
534
			 * Allow the $where to be prepared before we recieve it here.
535
			 * This is a fallback for reverse compatability, but is not recommended
536
			 */
537
			_deprecated_argument( 'where', '2.0', __( 'Use the query in an array format so it can be properly prepared.', 'formidable' ) );
538
			$query .= $where . ' ' . implode( ' ', $args );
539
		}
540
541
		return $query;
542
	}
543
544
    public function uninstall() {
545
		if ( ! current_user_can( 'administrator' ) ) {
546
            $frm_settings = FrmAppHelper::get_settings();
547
            wp_die($frm_settings->admin_permission);
548
        }
549
550
        global $wpdb, $wp_roles;
551
552
		$wpdb->query( 'DROP TABLE IF EXISTS ' . $this->fields );
553
		$wpdb->query( 'DROP TABLE IF EXISTS ' . $this->forms );
554
		$wpdb->query( 'DROP TABLE IF EXISTS ' . $this->entries );
555
		$wpdb->query( 'DROP TABLE IF EXISTS ' . $this->entry_metas );
556
557
        delete_option('frm_options');
558
        delete_option('frm_db_version');
559
560
        //delete roles
561
        $frm_roles = FrmAppHelper::frm_capabilities();
562
        $roles = get_editable_roles();
563
        foreach ( $frm_roles as $frm_role => $frm_role_description ) {
564
            foreach ( $roles as $role => $details ) {
565
                $wp_roles->remove_cap( $role, $frm_role );
566
                unset($role, $details);
567
    		}
568
    		unset($frm_role, $frm_role_description);
569
		}
570
		unset($roles, $frm_roles);
571
572
		// delete actions, views, and styles
573
574
		// prevent the post deletion from triggering entries to be deleted
575
		remove_action( 'before_delete_post', 'FrmProDisplaysController::before_delete_post' );
576
		remove_action( 'deleted_post', 'FrmProEntriesController::delete_entry' );
577
578
		$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' ) );
579
		foreach ( $post_ids as $post_id ) {
580
			// Delete's each post.
581
			wp_delete_post( $post_id, true );
582
		}
583
		unset( $post_ids );
584
585
		// delete transients
586
		delete_transient( 'frmpro_css' );
587
		delete_transient( 'frm_options' );
588
		delete_transient( 'frmpro_options' );
589
590
		$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_%' ) );
591
592
        do_action('frm_after_uninstall');
593
        return true;
594
    }
595
596
	/**
597
	 * Migrate old styling settings. If sites are using the old
598
	 * default 400px field width, switch it to 100%
599
	 *
600
	 * @since 2.0.4
601
	 */
602
	private function migrate_to_25() {
603
		// get the style that was created with the style migration
604
		$frm_style = new FrmStyle();
605
		$styles = $frm_style->get_all( 'post_date', 'ASC', 1 );
606
		if ( empty( $styles ) ) {
607
			return;
608
		}
609
610
		foreach ( $styles as $style ) {
611
			if ( $style->post_content['field_width'] == '400px' ) {
612
				$style->post_content['field_width'] = '100%';
613
				$frm_style->save( (array) $style );
614
				return;
615
			}
616
		}
617
	}
618
619
	/**
620
	 * Check if the parent_form_id columns exists.
621
	 * If not, try and add it again
622
	 *
623
	 * @since 2.0.2
624
	 */
625
	private function migrate_to_23() {
626
		global $wpdb;
627
		$exists = $wpdb->get_row( 'SHOW COLUMNS FROM ' . $this->forms . ' LIKE "parent_form_id"' );
628
		if ( empty( $exists ) ) {
629
			$wpdb->query( 'ALTER TABLE ' . $this->forms . ' ADD parent_form_id int(11) default 0' );
630
		}
631
	}
632
633
    /**
634
     * Change field size from character to pixel -- Multiply by 9
635
     */
636
    private function migrate_to_17() {
637
        global $wpdb;
638
		$pixel_conversion = 9;
639
640
        // Get query arguments
641
		$field_types = array( 'textarea', 'text', 'number', 'email', 'url', 'rte', 'date', 'phone', 'password', 'image', 'tag', 'file' );
642
		$query = array( 'type' => $field_types, 'field_options like' => 's:4:"size";', 'field_options not like' => 's:4:"size";s:0:' );
643
644
        // Get results
645
		$fields = FrmDb::get_results( $this->fields, $query, 'id, field_options' );
646
647
        $updated = 0;
648
        foreach ( $fields as $f ) {
0 ignored issues
show
Bug introduced by
The expression $fields of type array|null|string|object is not guaranteed to be traversable. How about adding an additional type check?

There are different options of fixing this problem.

  1. If you want to be on the safe side, you can add an additional type-check:

    $collection = json_decode($data, true);
    if ( ! is_array($collection)) {
        throw new \RuntimeException('$collection must be an array.');
    }
    
    foreach ($collection as $item) { /** ... */ }
    
  2. If you are sure that the expression is traversable, you might want to add a doc comment cast to improve IDE auto-completion and static analysis:

    /** @var array $collection */
    $collection = json_decode($data, true);
    
    foreach ($collection as $item) { /** .. */ }
    
  3. Mark the issue as a false-positive: Just hover the remove button, in the top-right corner of this issue for more options.

Loading history...
649
            $f->field_options = maybe_unserialize($f->field_options);
650
            if ( empty($f->field_options['size']) || ! is_numeric($f->field_options['size']) ) {
651
                continue;
652
            }
653
654
			$f->field_options['size'] = round( $pixel_conversion * (int) $f->field_options['size'] );
655
            $f->field_options['size'] .= 'px';
656
            $u = FrmField::update( $f->id, array( 'field_options' => $f->field_options ) );
657
            if ( $u ) {
658
                $updated++;
659
            }
660
            unset($f);
661
        }
662
663
        // Change the characters in widgets to pixels
664
        $widgets = get_option('widget_frm_show_form');
665
        if ( empty($widgets) ) {
666
            return;
667
        }
668
669
        $widgets = maybe_unserialize($widgets);
670
        foreach ( $widgets as $k => $widget ) {
671
            if ( ! is_array($widget) || ! isset($widget['size']) ) {
672
                continue;
673
            }
674
			$size = round( $pixel_conversion * (int) $widget['size'] );
675
            $size .= 'px';
676
			$widgets[ $k ]['size'] = $size;
677
        }
678
        update_option('widget_frm_show_form', $widgets);
679
    }
680
681
    /**
682
     * Migrate post and email notification settings into actions
683
     */
684
    private function migrate_to_16() {
685
        global $wpdb;
686
687
        $forms = FrmDb::get_results( $this->forms, array(), 'id, options, is_template, default_template' );
688
689
        /**
690
        * Old email settings format:
691
        * email_to: Email or field id
692
        * also_email_to: array of fields ids
693
        * reply_to: Email, field id, 'custom'
694
        * cust_reply_to: string
695
        * reply_to_name: field id, 'custom'
696
        * cust_reply_to_name: string
697
        * plain_text: 0|1
698
        * email_message: string or ''
699
        * email_subject: string or ''
700
        * inc_user_info: 0|1
701
        * update_email: 0, 1, 2
702
        *
703
        * Old autoresponder settings format:
704
        * auto_responder: 0|1
705
        * ar_email_message: string or ''
706
        * ar_email_to: field id
707
        * ar_plain_text: 0|1
708
        * ar_reply_to_name: string
709
        * ar_reply_to: string
710
        * ar_email_subject: string
711
        * ar_update_email: 0, 1, 2
712
        *
713
        * New email settings:
714
        * post_content: json settings
715
        * post_title: form id
716
        * post_excerpt: message
717
        *
718
        */
719
720
        foreach ( $forms as $form ) {
0 ignored issues
show
Bug introduced by
The expression $forms of type array|null|string|object is not guaranteed to be traversable. How about adding an additional type check?

There are different options of fixing this problem.

  1. If you want to be on the safe side, you can add an additional type-check:

    $collection = json_decode($data, true);
    if ( ! is_array($collection)) {
        throw new \RuntimeException('$collection must be an array.');
    }
    
    foreach ($collection as $item) { /** ... */ }
    
  2. If you are sure that the expression is traversable, you might want to add a doc comment cast to improve IDE auto-completion and static analysis:

    /** @var array $collection */
    $collection = json_decode($data, true);
    
    foreach ($collection as $item) { /** .. */ }
    
  3. Mark the issue as a false-positive: Just hover the remove button, in the top-right corner of this issue for more options.

Loading history...
721
			if ( $form->is_template && $form->default_template ) {
722
				// don't migrate the default templates since the email will be added anyway
723
				continue;
724
			}
725
726
            // Format form options
727
            $form_options = maybe_unserialize($form->options);
728
729
            // Migrate settings to actions
730
            FrmXMLHelper::migrate_form_settings_to_actions( $form_options, $form->id );
731
        }
732
    }
733
734
    private function migrate_to_11() {
735
        global $wpdb;
736
737
        $forms = FrmDb::get_results( $this->forms, array(), 'id, options');
738
739
        $sending = __( 'Sending', 'formidable' );
740
		$img = FrmAppHelper::plugin_url() . '/images/ajax_loader.gif';
741
        $old_default_html = <<<DEFAULT_HTML
742
<div class="frm_submit">
743
[if back_button]<input type="submit" value="[back_label]" name="frm_prev_page" formnovalidate="formnovalidate" [back_hook] />[/if back_button]
744
<input type="submit" value="[button_label]" [button_action] />
745
<img class="frm_ajax_loading" src="$img" alt="$sending" style="visibility:hidden;" />
746
</div>
747
DEFAULT_HTML;
748
        unset($sending, $img);
749
750
        $new_default_html = FrmFormsHelper::get_default_html('submit');
751
        $draft_link = FrmFormsHelper::get_draft_link();
752
		foreach ( $forms as $form ) {
0 ignored issues
show
Bug introduced by
The expression $forms of type array|null|string|object is not guaranteed to be traversable. How about adding an additional type check?

There are different options of fixing this problem.

  1. If you want to be on the safe side, you can add an additional type-check:

    $collection = json_decode($data, true);
    if ( ! is_array($collection)) {
        throw new \RuntimeException('$collection must be an array.');
    }
    
    foreach ($collection as $item) { /** ... */ }
    
  2. If you are sure that the expression is traversable, you might want to add a doc comment cast to improve IDE auto-completion and static analysis:

    /** @var array $collection */
    $collection = json_decode($data, true);
    
    foreach ($collection as $item) { /** .. */ }
    
  3. Mark the issue as a false-positive: Just hover the remove button, in the top-right corner of this issue for more options.

Loading history...
753
            $form->options = maybe_unserialize($form->options);
754
            if ( ! isset($form->options['submit_html']) || empty($form->options['submit_html']) ) {
755
                continue;
756
            }
757
758
            if ( $form->options['submit_html'] != $new_default_html && $form->options['submit_html'] == $old_default_html ) {
759
                $form->options['submit_html'] = $new_default_html;
760
				$wpdb->update( $this->forms, array( 'options' => serialize( $form->options ) ), array( 'id' => $form->id ) );
761
			} else if ( ! strpos( $form->options['submit_html'], 'save_draft' ) ) {
762
				$form->options['submit_html'] = preg_replace( '~\<\/div\>(?!.*\<\/div\>)~', $draft_link . "\r\n</div>", $form->options['submit_html'] );
763
				$wpdb->update( $this->forms, array( 'options' => serialize( $form->options ) ), array( 'id' => $form->id ) );
764
            }
765
            unset($form);
766
        }
767
        unset($forms);
768
    }
769
770
    private function migrate_to_6() {
771
        global $wpdb;
772
773
		$no_save = array_merge( FrmField::no_save_fields(), array( 'form', 'hidden', 'user_id' ) );
774
		$fields = FrmDb::get_results( $this->fields, array( 'type NOT' => $no_save ), 'id, field_options' );
775
776
        $default_html = <<<DEFAULT_HTML
777
<div id="frm_field_[id]_container" class="form-field [required_class] [error_class]">
778
    <label class="frm_pos_[label_position]">[field_name]
779
        <span class="frm_required">[required_label]</span>
780
    </label>
781
    [input]
782
    [if description]<div class="frm_description">[description]</div>[/if description]
783
</div>
784
DEFAULT_HTML;
785
786
        $old_default_html = <<<DEFAULT_HTML
787
<div id="frm_field_[id]_container" class="form-field [required_class] [error_class]">
788
    <label class="frm_pos_[label_position]">[field_name]
789
        <span class="frm_required">[required_label]</span>
790
    </label>
791
    [input]
792
    [if description]<p class="frm_description">[description]</p>[/if description]
793
</div>
794
DEFAULT_HTML;
795
796
        $new_default_html = FrmFieldsHelper::get_default_html('text');
797
        foreach ( $fields as $field ) {
0 ignored issues
show
Bug introduced by
The expression $fields of type array|null|string|object is not guaranteed to be traversable. How about adding an additional type check?

There are different options of fixing this problem.

  1. If you want to be on the safe side, you can add an additional type-check:

    $collection = json_decode($data, true);
    if ( ! is_array($collection)) {
        throw new \RuntimeException('$collection must be an array.');
    }
    
    foreach ($collection as $item) { /** ... */ }
    
  2. If you are sure that the expression is traversable, you might want to add a doc comment cast to improve IDE auto-completion and static analysis:

    /** @var array $collection */
    $collection = json_decode($data, true);
    
    foreach ($collection as $item) { /** .. */ }
    
  3. Mark the issue as a false-positive: Just hover the remove button, in the top-right corner of this issue for more options.

Loading history...
798
            $field->field_options = maybe_unserialize($field->field_options);
799
			if ( ! FrmField::is_option_empty( $field, 'custom_html' ) || $field->field_options['custom_html'] == $default_html || $field->field_options['custom_html'] == $old_default_html ) {
800
                $field->field_options['custom_html'] = $new_default_html;
801
				$wpdb->update( $this->fields, array( 'field_options' => maybe_serialize( $field->field_options ) ), array( 'id' => $field->id ) );
802
            }
803
            unset($field);
804
        }
805
        unset($default_html, $old_default_html, $fields);
806
    }
807
808
    private function migrate_to_4() {
809
        global $wpdb;
810
		$user_ids = FrmEntryMeta::getAll( array( 'fi.type' => 'user_id' ) );
811
        foreach ( $user_ids as $user_id ) {
812
			$wpdb->update( $this->entries, array( 'user_id' => $user_id->meta_value ), array( 'id' => $user_id->item_id ) );
813
        }
814
    }
815
816
	public static function get_one_record( $table, $args = array(), $fields = '*', $order_by = '' ) {
817
		_deprecated_function( __FUNCTION__, '2.0', 'FrmDb::get_row' );
818
		return self::get_var( $table, $args, $fields, array( 'order_by' => $order_by, 'limit' => 1 ), '', 'row' );
819
	}
820
821
	public static function get_records( $table, $args = array(), $order_by = '', $limit = '', $fields = '*' ) {
822
		_deprecated_function( __FUNCTION__, '2.0', 'FrmDb::get_results' );
823
		return self::get_results( $table, $args, $fields, compact('order_by', 'limit') );
824
	}
825
}
826