Completed
Push — master ( 0841f7...c277a4 )
by Stephanie
03:30
created

FrmAppHelper::check_cache()   B

Complexity

Conditions 5
Paths 4

Size

Total Lines 20
Code Lines 14

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
cc 5
eloc 14
nc 4
nop 5
dl 0
loc 20
rs 8.8571
c 0
b 0
f 0
1
<?php
2
if ( ! defined('ABSPATH') ) {
3
	die( 'You are not allowed to call this page directly.' );
4
}
5
6
class FrmAppHelper {
7
	public static $db_version = 32; //version of the database we are moving to
8
	public static $pro_db_version = 37;
9
10
	/**
11
	 * @since 2.0
12
	 */
13
	public static $plug_version = '2.02.06';
14
15
    /**
16
     * @since 1.07.02
17
     *
18
     * @param none
19
     * @return string The version of this plugin
20
     */
21
    public static function plugin_version() {
22
        return self::$plug_version;
23
    }
24
25
    public static function plugin_folder() {
26
        return basename(self::plugin_path());
27
    }
28
29
    public static function plugin_path() {
30
        return dirname(dirname(dirname(__FILE__)));
31
    }
32
33
    public static function plugin_url() {
34
        //prevously FRM_URL constant
35
		return plugins_url( '', self::plugin_path() . '/formidable.php' );
36
    }
37
38
	public static function relative_plugin_url() {
39
		return str_replace( array( 'https:', 'http:' ), '', self::plugin_url() );
40
	}
41
42
    /**
43
     * @return string Site URL
44
     */
45
    public static function site_url() {
46
        return site_url();
47
    }
48
49
    /**
50
     * Get the name of this site
51
     * Used for [sitename] shortcode
52
     *
53
     * @since 2.0
54
     * @return string
55
     */
56
    public static function site_name() {
57
        return get_option('blogname');
58
    }
59
60
	public static function make_affiliate_url( $url ) {
61
		$affiliate_id = self::get_affiliate();
62
		if ( ! empty( $affiliate_id ) ) {
63
			$url = add_query_arg( 'aff', $affiliate_id, $url );
64
		}
65
		return $url;
66
	}
67
68
	public static function get_affiliate() {
69
		return '';
70
		$affiliate_id = apply_filters( 'frm_affiliate_link', get_option('frm_aff') );
0 ignored issues
show
Unused Code introduced by
$affiliate_id = apply_fi...get_option('frm_aff')); does not seem to be reachable.

This check looks for unreachable code. It uses sophisticated control flow analysis techniques to find statements which will never be executed.

Unreachable code is most often the result of return, die or exit statements that have been added for debug purposes.

function fx() {
    try {
        doSomething();
        return true;
    }
    catch (\Exception $e) {
        return false;
    }

    return false;
}

In the above example, the last return false will never be executed, because a return statement has already been met in every possible execution path.

Loading history...
71
		$affiliate_id = strtolower( $affiliate_id );
72
		$allowed_affiliates = array();
73
		if ( ! in_array( $affiliate_id, $allowed_affiliates ) ) {
74
			$affiliate_id = false;
75
		}
76
		return $affiliate_id;
77
	}
78
79
    /**
80
     * Get the Formidable settings
81
     *
82
     * @since 2.0
83
     *
84
     * @param None
85
     * @return FrmSettings $frm_setings
86
     */
87
    public static function get_settings() {
88
        global $frm_settings;
89
        if ( empty($frm_settings) ) {
90
            $frm_settings = new FrmSettings();
91
        }
92
        return $frm_settings;
93
    }
94
95
	public static function get_menu_name() {
96
		$frm_settings = FrmAppHelper::get_settings();
97
		return $frm_settings->menu;
98
	}
99
100
    /**
101
     * Show a message in place of pro features
102
     *
103
     * @since 2.0
104
     */
105
	public static function update_message() {
106
		_deprecated_function( __FUNCTION__, '2.0.19' );
107
    }
108
109
    public static function pro_is_installed() {
110
        return apply_filters('frm_pro_installed', false);
111
    }
112
113
    /**
114
     * Check for certain page in Formidable settings
115
     *
116
     * @since 2.0
117
     *
118
     * @param string $page The name of the page to check
119
     * @return boolean
120
     */
121
	public static function is_admin_page( $page = 'formidable' ) {
122
        global $pagenow;
123
		$get_page = self::simple_get( 'page', 'sanitize_title' );
124
        if ( $pagenow ) {
125
			return $pagenow == 'admin.php' && $get_page == $page;
126
        }
127
128
		return is_admin() && $get_page == $page;
129
    }
130
131
    /**
132
     * Check for the form preview page
133
     *
134
     * @since 2.0
135
     *
136
     * @param None
137
     * @return boolean
138
     */
139
    public static function is_preview_page() {
140
        global $pagenow;
141
		$action = FrmAppHelper::simple_get( 'action', 'sanitize_title' );
142
		return $pagenow && $pagenow == 'admin-ajax.php' && $action == 'frm_forms_preview';
143
    }
144
145
    /**
146
     * Check for ajax except the form preview page
147
     *
148
     * @since 2.0
149
     *
150
     * @param None
151
     * @return boolean
152
     */
153
    public static function doing_ajax() {
154
        return defined('DOING_AJAX') && DOING_AJAX && ! self::is_preview_page();
155
    }
156
157
	/**
158
	 * @since 2.0.8
159
	 */
160
	public static function prevent_caching() {
161
		global $frm_vars;
162
		return isset( $frm_vars['prevent_caching'] ) && $frm_vars['prevent_caching'];
163
	}
164
165
    /**
166
     * Check if on an admin page
167
     *
168
     * @since 2.0
169
     *
170
     * @param None
171
     * @return boolean
172
     */
173
    public static function is_admin() {
174
        return is_admin() && ( ! defined('DOING_AJAX') || ! DOING_AJAX );
175
    }
176
177
    /**
178
     * Check if value contains blank value or empty array
179
     *
180
     * @since 2.0
181
     * @param mixed $value - value to check
182
	 * @param string
183
     * @return boolean
184
     */
185
    public static function is_empty_value( $value, $empty = '' ) {
186
        return ( is_array( $value ) && empty( $value ) ) || $value == $empty;
187
    }
188
189
    public static function is_not_empty_value( $value, $empty = '' ) {
190
        return ! self::is_empty_value( $value, $empty );
191
    }
192
193
    /**
194
     * Get any value from the $_SERVER
195
     *
196
     * @since 2.0
197
     * @param string $value
198
     * @return string
199
     */
200
	public static function get_server_value( $value ) {
201
        return isset( $_SERVER[ $value ] ) ? wp_strip_all_tags( $_SERVER[ $value ] ) : '';
0 ignored issues
show
introduced by
Detected usage of a non-sanitized input variable: $_SERVER
Loading history...
202
    }
203
204
    /**
205
     * Check for the IP address in several places
206
     * Used by [ip] shortcode
207
     *
208
     * @return string The IP address of the current user
209
     */
210
    public static function get_ip_address() {
211
		$ip = '';
212
        foreach ( array(
213
            'HTTP_CLIENT_IP', 'HTTP_X_FORWARDED_FOR', 'HTTP_X_FORWARDED', 'HTTP_X_CLUSTER_CLIENT_IP',
214
            'HTTP_FORWARDED_FOR', 'HTTP_FORWARDED', 'REMOTE_ADDR',
215
        ) as $key ) {
216
            if ( ! isset( $_SERVER[ $key ] ) ) {
217
                continue;
218
            }
219
220
            foreach ( explode( ',', $_SERVER[ $key ] ) as $ip ) {
221
                $ip = trim($ip); // just to be safe
222
223
                if ( filter_var($ip, FILTER_VALIDATE_IP, FILTER_FLAG_NO_PRIV_RANGE | FILTER_FLAG_NO_RES_RANGE) !== false ) {
224
                    return $ip;
225
                }
226
            }
227
        }
228
229
		return sanitize_text_field( $ip );
230
    }
231
232
    public static function get_param( $param, $default = '', $src = 'get', $sanitize = '' ) {
233
        if ( strpos($param, '[') ) {
234
            $params = explode('[', $param);
235
            $param = $params[0];
236
        }
237
238
		if ( $src == 'get' ) {
239
            $value = isset( $_POST[ $param ] ) ? stripslashes_deep( $_POST[ $param ] ) : ( isset( $_GET[ $param ] ) ? stripslashes_deep( $_GET[ $param ] ) : $default );
0 ignored issues
show
introduced by
Detected access of super global var $_POST, probably need manual inspection.
Loading history...
introduced by
Detected usage of a non-sanitized input variable: $_POST
Loading history...
introduced by
Detected access of super global var $_GET, probably need manual inspection.
Loading history...
introduced by
Detected usage of a non-sanitized input variable: $_GET
Loading history...
240
            if ( ! isset( $_POST[ $param ] ) && isset( $_GET[ $param ] ) && ! is_array( $value ) ) {
241
                $value = stripslashes_deep( htmlspecialchars_decode( urldecode( $_GET[ $param ] ) ) );
0 ignored issues
show
introduced by
Detected access of super global var $_GET, probably need manual inspection.
Loading history...
introduced by
Detected usage of a non-sanitized input variable: $_GET
Loading history...
242
            }
243
			self::sanitize_value( $sanitize, $value );
244
		} else {
245
            $value = self::get_simple_request( array( 'type' => $src, 'param' => $param, 'default' => $default, 'sanitize' => $sanitize ) );
246
        }
247
248
		if ( isset( $params ) && is_array( $value ) && ! empty( $value ) ) {
249
            foreach ( $params as $k => $p ) {
250
                if ( ! $k || ! is_array($value) ) {
251
                    continue;
252
                }
253
254
                $p = trim($p, ']');
255
                $value = isset( $value[ $p ] ) ? $value[ $p ] : $default;
256
            }
257
        }
258
259
        return $value;
260
    }
261
262
	public static function get_post_param( $param, $default = '', $sanitize = '' ) {
263
		return self::get_simple_request( array( 'type' => 'post', 'param' => $param, 'default' => $default, 'sanitize' => $sanitize ) );
264
	}
265
266
	/**
267
	 * @since 2.0
268
	 *
269
	 * @param string $param
270
	 * @param string $sanitize
271
	 * @param string $default
272
	 * @return string|array
273
	 */
274
	public static function simple_get( $param, $sanitize = 'sanitize_text_field', $default = '' ) {
275
		return self::get_simple_request( array( 'type' => 'get', 'param' => $param, 'default' => $default, 'sanitize' => $sanitize ) );
276
    }
277
278
	/**
279
	 * Get a GET/POST/REQUEST value and sanitize it
280
	 *
281
	 * @since 2.0.6
282
	 * @param array $args
283
	 * @return string|array
284
	 */
285
	public static function get_simple_request( $args ) {
286
		$defaults = array(
287
			'param' => '', 'default' => '',
288
			'type' => 'get', 'sanitize' => 'sanitize_text_field',
289
		);
290
		$args = wp_parse_args( $args, $defaults );
291
292
		$value = $args['default'];
293
		if ( $args['type'] == 'get' ) {
294
			if ( $_GET && isset( $_GET[ $args['param'] ] ) ) {
295
				$value = $_GET[ $args['param'] ];
0 ignored issues
show
introduced by
Detected access of super global var $_GET, probably need manual inspection.
Loading history...
introduced by
Detected usage of a non-sanitized input variable: $_GET
Loading history...
296
			}
297
		} else if ( $args['type'] == 'post' ) {
298
			if ( isset( $_POST[ $args['param'] ] ) ) {
299
				$value = stripslashes_deep( maybe_unserialize( $_POST[ $args['param'] ] ) );
0 ignored issues
show
introduced by
Detected access of super global var $_POST, probably need manual inspection.
Loading history...
introduced by
Detected usage of a non-sanitized input variable: $_POST
Loading history...
300
			}
301
		} else {
302
			if ( isset( $_REQUEST[ $args['param'] ] ) ) {
303
				$value = $_REQUEST[ $args['param'] ];
0 ignored issues
show
introduced by
Detected access of super global var $_REQUEST, probably need manual inspection.
Loading history...
introduced by
Detected usage of a non-sanitized input variable: $_REQUEST
Loading history...
304
			}
305
		}
306
307
		self::sanitize_value( $args['sanitize'], $value );
308
		return $value;
309
	}
310
311
	/**
312
	* Preserve backslashes in a value, but make sure value doesn't get compounding slashes
313
	*
314
	* @since 2.0.8
315
	* @param string $value
316
	* @return string $value
317
	*/
318
	public static function preserve_backslashes( $value ) {
319
		// If backslashes have already been added, don't add them again
320
		if ( strpos( $value, '\\\\' ) === false ) {
321
			$value = addslashes( $value );
322
		}
323
		return $value;
324
	}
325
326
	public static function sanitize_value( $sanitize, &$value ) {
327
		if ( ! empty( $sanitize ) ) {
328
			if ( is_array( $value ) ) {
329
				$temp_values = $value;
330
				foreach ( $temp_values as $k => $v ) {
331
					FrmAppHelper::sanitize_value( $sanitize, $value[ $k ] );
332
				}
333
			} else {
334
				$value = call_user_func( $sanitize, $value );
335
			}
336
		}
337
	}
338
339
    public static function sanitize_request( $sanitize_method, &$values ) {
340
        $temp_values = $values;
341
        foreach ( $temp_values as $k => $val ) {
342
            if ( isset( $sanitize_method[ $k ] ) ) {
343
				$values[ $k ] = call_user_func( $sanitize_method[ $k ], $val );
344
            }
345
        }
346
    }
347
348
	public static function sanitize_array( &$values ) {
349
		$temp_values = $values;
350
		foreach ( $temp_values as $k => $val ) {
351
			$values[ $k ] = wp_kses_post( $val );
352
		}
353
	}
354
355
	/**
356
	 * Sanitize the value, and allow some HTML
357
	 * @since 2.0
358
	 * @param string $value
359
	 * @param array $allowed
360
	 * @return string
361
	 */
362
	public static function kses( $value, $allowed = array() ) {
363
		$html = array(
364
		    'a' => array(
365
				'href'  => array(),
366
				'title' => array(),
367
				'id'    => array(),
368
				'class' => array(),
369
		    ),
370
		);
371
372
		$allowed_html = array();
373
		foreach ( $allowed as $a ) {
374
			$allowed_html[ $a ] = isset( $html[ $a ] ) ? $html[ $a ] : array();
375
		}
376
377
		return wp_kses( $value, $allowed_html );
378
	}
379
380
    /**
381
     * Used when switching the action for a bulk action
382
     * @since 2.0
383
     */
384
    public static function remove_get_action() {
385
        if ( ! isset($_GET) ) {
0 ignored issues
show
introduced by
Detected access of super global var $_GET, probably need manual inspection.
Loading history...
386
            return;
387
        }
388
389
        $new_action = isset( $_GET['action'] ) ? sanitize_text_field( $_GET['action'] ) : ( isset( $_GET['action2'] ) ? sanitize_text_field( $_GET['action2'] ) : '' );
0 ignored issues
show
introduced by
Detected access of super global var $_GET, probably need manual inspection.
Loading history...
390
        if ( ! empty( $new_action ) ) {
391
			$_SERVER['REQUEST_URI'] = str_replace( '&action=' . $new_action, '', FrmAppHelper::get_server_value( 'REQUEST_URI' ) );
392
        }
393
    }
394
395
    /**
396
     * Check the WP query for a parameter
397
     *
398
     * @since 2.0
399
     * @return string|array
400
     */
401
    public static function get_query_var( $value, $param ) {
402
        if ( $value != '' ) {
403
            return $value;
404
        }
405
406
        global $wp_query;
407
        if ( isset( $wp_query->query_vars[ $param ] ) ) {
408
            $value = $wp_query->query_vars[ $param ];
409
        }
410
411
        return $value;
412
    }
413
414
    /**
415
     * @param string $type
416
     */
417
    public static function trigger_hook_load( $type, $object = null ) {
418
        // only load the form hooks once
419
		$hooks_loaded = apply_filters( 'frm_' . $type . '_hooks_loaded', false, $object );
420
        if ( ! $hooks_loaded ) {
421
			do_action( 'frm_load_' . $type . '_hooks' );
422
        }
423
    }
424
425
    /**
426
     * Check cache before fetching values and saving to cache
427
     *
428
     * @since 2.0
429
     *
430
     * @param string $cache_key The unique name for this cache
431
     * @param string $group The name of the cache group
432
     * @param string $query If blank, don't run a db call
433
     * @param string $type The wpdb function to use with this query
434
     * @return mixed $results The cache or query results
435
     */
436
    public static function check_cache( $cache_key, $group = '', $query = '', $type = 'get_var', $time = 300 ) {
437
        $results = wp_cache_get($cache_key, $group);
438
        if ( ! self::is_empty_value( $results, false ) || empty($query) ) {
0 ignored issues
show
Documentation introduced by
false is of type boolean, but the function expects a string.

It seems like the type of the argument is not accepted by the function/method which you are calling.

In some cases, in particular if PHP’s automatic type-juggling kicks in this might be fine. In other cases, however this might be a bug.

We suggest to add an explicit type cast like in the following example:

function acceptsInteger($int) { }

$x = '123'; // string "123"

// Instead of
acceptsInteger($x);

// we recommend to use
acceptsInteger((integer) $x);
Loading history...
439
            return $results;
440
        }
441
442
        if ( 'get_posts' == $type ) {
443
            $results = get_posts($query);
444
		} else if ( 'get_associative_results' == $type ) {
445
			global $wpdb;
446
			$results = $wpdb->get_results( $query, OBJECT_K );
447
        } else {
448
            global $wpdb;
449
            $results = $wpdb->{$type}($query);
450
        }
451
452
		self::set_cache( $cache_key, $results, $group, $time );
453
454
		return $results;
455
	}
456
457
	public static function set_cache( $cache_key, $results, $group = '', $time = 300 ) {
458
		if ( ! self::prevent_caching() ) {
459
			self::add_key_to_group_cache( $cache_key, $group );
460
			wp_cache_set( $cache_key, $results, $group, $time );
461
		}
462
	}
463
464
	/**
465
	 * Keep track of the keys cached in each group so they can be deleted
466
	 * in Redis and Memcache
467
	 */
468
	public static function add_key_to_group_cache( $key, $group ) {
469
		$cached = self::get_group_cached_keys( $group );
470
		$cached[ $key ] = $key;
471
		wp_cache_set( 'cached_keys', $cached, $group, 300 );
472
	}
473
474
	public static function get_group_cached_keys( $group ) {
475
		$cached = wp_cache_get( 'cached_keys', $group );
476
		if ( empty( $cached ) ) {
477
			$cached = array( 'cached_keys' => 'cached_keys' );
478
		}
479
		return (array) $cached;
480
	}
481
482
    /**
483
     * Data that should be stored for a long time can be stored in a transient.
484
     * First check the cache, then check the transient
485
     * @since 2.0
486
     * @return mixed The cached value or false
487
     */
488
	public static function check_cache_and_transient( $cache_key ) {
489
        // check caching layer first
490
        $results = self::check_cache( $cache_key );
491
        if ( $results ) {
492
            return $results;
493
        }
494
495
        // then check the transient
496
        $results = get_transient($cache_key);
497
        if ( $results ) {
498
            wp_cache_set($cache_key, $results);
499
        }
500
501
        return $results;
502
    }
503
504
    /**
505
     * @since 2.0
506
     * @param string $cache_key
507
     */
508
	public static function delete_cache_and_transient( $cache_key, $group = 'default' ) {
509
		delete_transient($cache_key);
510
		wp_cache_delete( $cache_key, $group );
511
	}
512
513
    /**
514
     * Delete all caching in a single group
515
     *
516
     * @since 2.0
517
     *
518
     * @param string $group The name of the cache group
519
     */
520
	public static function cache_delete_group( $group ) {
521
		$cached_keys = self::get_group_cached_keys( $group );
522
523
		if ( ! empty( $cached_keys ) ) {
524
			$group_cache = array(
525
				$group => $cached_keys,
526
			);
527
528
			if ( isset( $group_cache[ $group ] ) ) {
529
				foreach ( $group_cache[ $group ] as $k => $v ) {
530
					$d = wp_cache_delete( $k, $group );
0 ignored issues
show
Unused Code introduced by
$d is not used, you could remove the assignment.

This check looks for variable assignements that are either overwritten by other assignments or where the variable is not used subsequently.

$myVar = 'Value';
$higher = false;

if (rand(1, 6) > 3) {
    $higher = true;
} else {
    $higher = false;
}

Both the $myVar assignment in line 1 and the $higher assignment in line 2 are dead. The first because $myVar is never used and the second because $higher is always overwritten for every possible time line.

Loading history...
531
				}
532
			}
533
		}
534
	}
535
536
    /**
537
     * Check a value from a shortcode to see if true or false.
538
     * True when value is 1, true, 'true', 'yes'
539
     *
540
     * @since 1.07.10
541
     *
542
     * @param string $value The value to compare
543
     * @return boolean True or False
544
     */
545
	public static function is_true( $value ) {
546
        return ( true === $value || 1 == $value || 'true' == $value || 'yes' == $value );
547
    }
548
549
    /**
550
     * Used to filter shortcode in text widgets
551
     */
552
    public static function widget_text_filter_callback( $matches ) {
553
        return do_shortcode( $matches[0] );
554
    }
555
556
    public static function get_pages() {
557
		return get_posts( array( 'post_type' => 'page', 'post_status' => array( 'publish', 'private' ), 'numberposts' => -1, 'orderby' => 'title', 'order' => 'ASC' ) );
0 ignored issues
show
introduced by
Disabling pagination is prohibited in VIP context, do not set numberposts to -1 ever.
Loading history...
558
    }
559
560
    public static function wp_pages_dropdown( $field_name, $page_id, $truncate = false ) {
561
        $pages = self::get_pages();
562
		$selected = self::get_post_param( $field_name, $page_id, 'absint' );
563
    ?>
564
        <select name="<?php echo esc_attr($field_name); ?>" id="<?php echo esc_attr($field_name); ?>" class="frm-pages-dropdown">
565
            <option value=""> </option>
566
            <?php foreach ( $pages as $page ) { ?>
567
				<option value="<?php echo esc_attr($page->ID); ?>" <?php selected( $selected, $page->ID ) ?>>
568
					<?php echo esc_html( $truncate ? self::truncate( $page->post_title, $truncate ) : $page->post_title ); ?>
569
				</option>
570
            <?php } ?>
571
        </select>
572
    <?php
573
    }
574
575
	public static function post_edit_link( $post_id ) {
576
        $post = get_post($post_id);
0 ignored issues
show
introduced by
Overridding WordPress globals is prohibited
Loading history...
577
        if ( $post ) {
578
			$post_url = admin_url( 'post.php?post=' . $post_id . '&action=edit' );
579
			return '<a href="' . esc_url( $post_url ) . '">' . self::truncate( $post->post_title, 50 ) . '</a>';
580
        }
581
        return '';
582
    }
583
584
	public static function wp_roles_dropdown( $field_name, $capability, $multiple = 'single' ) {
585
    ?>
586
        <select name="<?php echo esc_attr($field_name); ?>" id="<?php echo esc_attr($field_name); ?>" <?php
587
            echo ( 'multiple' == $multiple ) ? 'multiple="multiple"' : '';
0 ignored issues
show
introduced by
Expected next thing to be a escaping function, not '('
Loading history...
588
            ?> class="frm_multiselect">
589
            <?php self::roles_options($capability); ?>
590
        </select>
591
    <?php
592
    }
593
594
	public static function roles_options( $capability ) {
595
        global $frm_vars;
596
        if ( isset($frm_vars['editable_roles']) ) {
597
            $editable_roles = $frm_vars['editable_roles'];
598
        } else {
599
            $editable_roles = get_editable_roles();
600
            $frm_vars['editable_roles'] = $editable_roles;
601
        }
602
603
        foreach ( $editable_roles as $role => $details ) {
604
            $name = translate_user_role($details['name'] ); ?>
605
        <option value="<?php echo esc_attr($role) ?>" <?php echo in_array($role, (array) $capability) ? ' selected="selected"' : ''; ?>><?php echo esc_attr($name) ?> </option>
0 ignored issues
show
introduced by
Expected a sanitizing function (see Codex for 'Data Validation'), but instead saw 'in_array'
Loading history...
606
<?php
607
            unset($role, $details);
608
        }
609
    }
610
611
	public static function frm_capabilities( $type = 'auto' ) {
612
        $cap = array(
613
            'frm_view_forms'        => __( 'View Forms and Templates', 'formidable' ),
614
            'frm_edit_forms'        => __( 'Add/Edit Forms and Templates', 'formidable' ),
615
            'frm_delete_forms'      => __( 'Delete Forms and Templates', 'formidable' ),
616
            'frm_change_settings'   => __( 'Access this Settings Page', 'formidable' ),
617
            'frm_view_entries'      => __( 'View Entries from Admin Area', 'formidable' ),
618
            'frm_delete_entries'    => __( 'Delete Entries from Admin Area', 'formidable' ),
619
        );
620
621
		if ( ! self::pro_is_installed() && 'pro' != $type ) {
622
            return $cap;
623
        }
624
625
        $cap['frm_create_entries'] = __( 'Add Entries from Admin Area', 'formidable' );
626
        $cap['frm_edit_entries'] = __( 'Edit Entries from Admin Area', 'formidable' );
627
        $cap['frm_view_reports'] = __( 'View Reports', 'formidable' );
628
        $cap['frm_edit_displays'] = __( 'Add/Edit Views', 'formidable' );
629
630
        return $cap;
631
    }
632
633
	public static function user_has_permission( $needed_role ) {
634
        if ( $needed_role == '-1' ) {
635
            return false;
636
		}
637
638
        // $needed_role will be equal to blank if "Logged-in users" is selected
639
        if ( ( $needed_role == '' && is_user_logged_in() ) || current_user_can( $needed_role ) ) {
640
            return true;
641
        }
642
643
        $roles = array( 'administrator', 'editor', 'author', 'contributor', 'subscriber' );
644
        foreach ( $roles as $role ) {
645
			if ( current_user_can( $role ) ) {
646
        		return true;
647
			}
648
        	if ( $role == $needed_role ) {
649
        		break;
650
			}
651
        }
652
        return false;
653
    }
654
655
    /**
656
     * Make sure administrators can see Formidable menu
657
     *
658
     * @since 2.0
659
     */
660
    public static function maybe_add_permissions() {
661
		self::force_capability( 'frm_view_entries' );
662
663
        if ( ! current_user_can('administrator') || current_user_can('frm_view_forms') ) {
664
            return;
665
        }
666
667
		$user_id = get_current_user_id();
668
		$user = new WP_User( $user_id );
669
        $frm_roles = self::frm_capabilities();
670
        foreach ( $frm_roles as $frm_role => $frm_role_description ) {
671
			$user->add_cap( $frm_role );
672
            unset($frm_role, $frm_role_description);
673
        }
674
    }
675
676
	/**
677
	 * Make sure admins have permission to see the menu items
678
	 * @since 2.0.6
679
	 */
680
	public static function force_capability( $cap = 'frm_change_settings' ) {
681
		if ( current_user_can( 'administrator' ) && ! current_user_can( $cap ) ) {
682
			$role = get_role( 'administrator' );
683
			$frm_roles = self::frm_capabilities();
684
			foreach ( $frm_roles as $frm_role => $frm_role_description ) {
685
				$role->add_cap( $frm_role );
686
			}
687
		}
688
	}
689
690
    /**
691
     * Check if the user has permision for action.
692
     * Return permission message and stop the action if no permission
693
     * @since 2.0
694
     * @param string $permission
695
     */
696
	public static function permission_check( $permission, $show_message = 'show' ) {
697
        $permission_error = self::permission_nonce_error($permission);
698
        if ( $permission_error !== false ) {
699
            if ( 'hide' == $show_message ) {
700
                $permission_error = '';
701
            }
702
            wp_die($permission_error);
703
        }
704
    }
705
706
    /**
707
     * Check user permission and nonce
708
     * @since 2.0
709
     * @param string $permission
710
     * @return false|string The permission message or false if allowed
711
     */
712
	public static function permission_nonce_error( $permission, $nonce_name = '', $nonce = '' ) {
713
		if ( ! empty( $permission ) && ! current_user_can( $permission ) && ! current_user_can( 'administrator' ) ) {
714
			$frm_settings = self::get_settings();
715
			return $frm_settings->admin_permission;
716
		}
717
718
		$error = false;
719
        if ( empty($nonce_name) ) {
720
            return $error;
721
        }
722
723
        if ( $_REQUEST && ( ! isset( $_REQUEST[ $nonce_name ] ) || ! wp_verify_nonce( $_REQUEST[ $nonce_name ], $nonce ) ) ) {
724
            $frm_settings = self::get_settings();
725
            $error = $frm_settings->admin_permission;
726
        }
727
728
        return $error;
729
    }
730
731
    public static function checked( $values, $current ) {
732
		if ( self::check_selected( $values, $current ) ) {
733
            echo ' checked="checked"';
734
		}
735
    }
736
737
	public static function check_selected( $values, $current ) {
738
		$values = self::recursive_function_map( $values, 'trim' );
739
		$values = self::recursive_function_map( $values, 'htmlspecialchars_decode' );
740
		$current = htmlspecialchars_decode( trim( $current ) );
741
742
		return ( is_array( $values ) && in_array( $current, $values ) ) || ( ! is_array( $values ) && $values == $current );
743
	}
744
745
    /**
746
    * Check if current field option is an "other" option
747
    *
748
    * @since 2.0
749
    *
750
    * @param string $opt_key
751
    * @return boolean Returns true if current field option is an "Other" option
752
    */
753
    public static function is_other_opt( $opt_key ) {
754
        _deprecated_function( __FUNCTION__, '2.0.6', 'FrmFieldsHelper::is_other_opt' );
755
        return FrmFieldsHelper::is_other_opt( $opt_key );
756
    }
757
758
    /**
759
    * Get value that belongs in "Other" text box
760
    *
761
    * @since 2.0
762
    *
763
    * @param string $opt_key
764
    * @param array $field
765
    * @return string $other_val
766
    */
767
    public static function get_other_val( $opt_key, $field, $parent = false, $pointer = false ) {
768
		_deprecated_function( __FUNCTION__, '2.0.6', 'FrmFieldsHelper::get_other_val' );
769
		return FrmFieldsHelper::get_other_val( compact( 'opt_key', 'field', 'parent', 'pointer' ) );
770
    }
771
772
    /**
773
    * Check if there is a saved value for the "Other" text field. If so, set it as the $other_val.
774
    * Intended for front-end use
775
    *
776
    * @since 2.0
777
    *
778
    * @param array $field
779
    * @param boolean $other_opt
780
    * @param string $checked
781
    * @param array $args should include opt_key and field name
782
    * @return string $other_val
783
    */
784
    public static function prepare_other_input( $field, &$other_opt, &$checked, $args = array() ) {
785
		_deprecated_function( __FUNCTION__, '2.0.6', 'FrmFieldsHelper::prepare_other_input' );
786
		$args['field'] = $field;
787
		return FrmFieldsHelper::prepare_other_input( $args, $other_opt, $checked );
788
    }
789
790
	public static function recursive_function_map( $value, $function ) {
791
		if ( is_array( $value ) ) {
792
			$original_function = $function;
793
			if ( count( $value ) ) {
794
				$function = explode( ', ', self::prepare_array_values( $value, $function ) );
795
			} else {
796
				$function = array( $function );
797
			}
798
			if ( ! self::is_assoc( $value ) ) {
799
				$value = array_map( array( 'FrmAppHelper', 'recursive_function_map' ), $value, $function );
800
			} else {
801
				foreach ( $value as $k => $v ) {
802
					if ( ! is_array( $v ) ) {
803
						$value[ $k ] = call_user_func( $original_function, $v );
804
					}
805
				}
806
			}
807
		} else {
808
			$value = call_user_func( $function, $value );
809
		}
810
811
		return $value;
812
	}
813
814
	public static function is_assoc( $array ) {
815
		return (bool) count( array_filter( array_keys( $array ), 'is_string' ) );
816
	}
817
818
    /**
819
     * Flatten a multi-dimensional array
820
     */
821
	public static function array_flatten( $array, $keys = 'keep' ) {
822
        $return = array();
823
        foreach ( $array as $key => $value ) {
824
            if ( is_array($value) ) {
825
				$return = array_merge( $return, self::array_flatten( $value, $keys ) );
826
            } else {
827
				if ( $keys == 'keep' ) {
828
					$return[ $key ] = $value;
829
				} else {
830
					$return[] = $value;
831
				}
832
            }
833
        }
834
        return $return;
835
    }
836
837
	public static function esc_textarea( $text, $is_rich_text = false ) {
838
		$safe_text = str_replace( '&quot;', '"', $text );
839
		if ( ! $is_rich_text ) {
840
			$safe_text = htmlspecialchars( $safe_text, ENT_NOQUOTES );
841
		}
842
		$safe_text = str_replace( '&amp;', '&', $safe_text );
843
		return apply_filters( 'esc_textarea', $safe_text, $text );
844
	}
845
846
    /**
847
     * Add auto paragraphs to text areas
848
     * @since 2.0
849
     */
850
	public static function use_wpautop( $content ) {
851
        if ( apply_filters('frm_use_wpautop', true) ) {
852
            $content = wpautop(str_replace( '<br>', '<br />', $content));
853
        }
854
        return $content;
855
    }
856
857
	public static function replace_quotes( $val ) {
858
        //Replace double quotes
859
		$val = str_replace( array( '&#8220;', '&#8221;', '&#8243;' ), '"', $val );
860
        //Replace single quotes
861
        $val = str_replace( array( '&#8216;', '&#8217;', '&#8242;', '&prime;', '&rsquo;', '&lsquo;' ), "'", $val );
862
        return $val;
863
    }
864
865
    /**
866
     * @since 2.0
867
     * @return string The base Google APIS url for the current version of jQuery UI
868
     */
869
    public static function jquery_ui_base_url() {
870
		$url = 'http' . ( is_ssl() ? 's' : '' ) . '://ajax.googleapis.com/ajax/libs/jqueryui/' . self::script_version('jquery-ui-core');
871
        $url = apply_filters('frm_jquery_ui_base_url', $url);
872
        return $url;
873
    }
874
875
    /**
876
     * @param string $handle
877
     */
878
	public static function script_version( $handle ) {
879
        global $wp_scripts;
880
    	if ( ! $wp_scripts ) {
881
    	    return false;
882
    	}
883
884
        $ver = 0;
885
886
        if ( ! isset( $wp_scripts->registered[ $handle ] ) ) {
887
            return $ver;
888
        }
889
890
        $query = $wp_scripts->registered[ $handle ];
891
    	if ( is_object( $query ) ) {
892
    	    $ver = $query->ver;
893
    	}
894
895
    	return $ver;
896
    }
897
898
	public static function js_redirect( $url ) {
899
		return '<script type="text/javascript">window.location="' . esc_url_raw( $url ) . '"</script>';
900
    }
901
902
	public static function get_user_id_param( $user_id ) {
903
        if ( ! $user_id || empty($user_id) || is_numeric($user_id) ) {
904
            return $user_id;
905
        }
906
907
		if ( $user_id == 'current' ) {
908
			$user_id = get_current_user_id();
909
		} else {
910
            if ( is_email($user_id) ) {
911
                $user = get_user_by('email', $user_id);
912
            } else {
913
                $user = get_user_by('login', $user_id);
914
            }
915
916
            if ( $user ) {
917
                $user_id = $user->ID;
918
            }
919
            unset($user);
920
        }
921
922
        return $user_id;
923
    }
924
925
	public static function get_file_contents( $filename, $atts = array() ) {
926
        if ( ! is_file($filename) ) {
927
            return false;
928
        }
929
930
        extract($atts);
0 ignored issues
show
introduced by
extract() usage is highly discouraged, due to the complexity and unintended issues it might cause.
Loading history...
931
        ob_start();
932
        include($filename);
933
        $contents = ob_get_contents();
934
        ob_end_clean();
935
        return $contents;
936
    }
937
938
    /**
939
     * @param string $table_name
940
     * @param string $column
941
	 * @param int $id
942
	 * @param int $num_chars
943
     */
944
    public static function get_unique_key( $name = '', $table_name, $column, $id = 0, $num_chars = 5 ) {
945
        $key = '';
946
947
        if ( ! empty( $name ) ) {
948
            $key = sanitize_key($name);
949
        }
950
951
		if ( empty( $key ) ) {
952
            $max_slug_value = pow(36, $num_chars);
953
            $min_slug_value = 37; // we want to have at least 2 characters in the slug
954
            $key = base_convert( rand($min_slug_value, $max_slug_value), 10, 36 );
955
        }
956
957
		if ( is_numeric($key) || in_array( $key, array( 'id', 'key', 'created-at', 'detaillink', 'editlink', 'siteurl', 'evenodd' ) ) ) {
958
			$key = $key . 'a';
959
        }
960
961
		$key_check = FrmDb::get_var( $table_name, array( $column => $key, 'ID !' => $id ), $column );
962
963
        if ( $key_check || is_numeric($key_check) ) {
964
            $suffix = 2;
965
			do {
966
				$alt_post_name = substr( $key, 0, 200 - ( strlen( $suffix ) + 1 ) ) . $suffix;
967
				$key_check = FrmDb::get_var( $table_name, array( $column => $alt_post_name, 'ID !' => $id ), $column );
968
				$suffix++;
969
			} while ($key_check || is_numeric($key_check));
970
			$key = $alt_post_name;
971
        }
972
        return $key;
973
    }
974
975
    /**
976
     * Editing a Form or Entry
977
     * @param string $table
978
     * @return bool|array
979
     */
980
    public static function setup_edit_vars( $record, $table, $fields = '', $default = false, $post_values = array(), $args = array() ) {
981
        if ( ! $record ) {
982
            return false;
983
        }
984
985
        if ( empty($post_values) ) {
986
            $post_values = stripslashes_deep($_POST);
0 ignored issues
show
introduced by
Detected access of super global var $_POST, probably need manual inspection.
Loading history...
987
        }
988
989
		$values = array( 'id' => $record->id, 'fields' => array() );
990
991
		foreach ( array( 'name', 'description' ) as $var ) {
992
            $default_val = isset($record->{$var}) ? $record->{$var} : '';
993
			$values[ $var ] = self::get_param( $var, $default_val, 'get', 'wp_kses_post' );
994
            unset($var, $default_val);
995
        }
996
997
        $values['description'] = self::use_wpautop($values['description']);
998
        $frm_settings = self::get_settings();
999
        $is_form_builder = self::is_admin_page('formidable' );
1000
1001
        foreach ( (array) $fields as $field ) {
1002
            // Make sure to filter default values (for placeholder text), but not on the form builder page
1003
            if ( ! $is_form_builder ) {
1004
                $field->default_value = apply_filters('frm_get_default_value', $field->default_value, $field, true );
1005
            }
1006
			$parent_form_id = isset( $args['parent_form_id'] ) ? $args['parent_form_id'] : $field->form_id;
1007
			self::fill_field_defaults($field, $record, $values, compact('default', 'post_values', 'frm_settings', 'parent_form_id' ) );
1008
        }
1009
1010
        self::fill_form_opts($record, $table, $post_values, $values);
1011
1012
        if ( $table == 'entries' ) {
1013
            $values = FrmEntriesHelper::setup_edit_vars( $values, $record );
1014
        } else if ( $table == 'forms' ) {
1015
            $values = FrmFormsHelper::setup_edit_vars( $values, $record, $post_values );
1016
        }
1017
1018
        return $values;
1019
    }
1020
1021
	private static function fill_field_defaults( $field, $record, array &$values, $args ) {
1022
        $post_values = $args['post_values'];
1023
1024
        if ( $args['default'] ) {
1025
            $meta_value = $field->default_value;
1026
        } else {
1027
            if ( $record->post_id && self::pro_is_installed() && isset($field->field_options['post_field']) && $field->field_options['post_field'] ) {
1028
                if ( ! isset($field->field_options['custom_field']) ) {
1029
                    $field->field_options['custom_field'] = '';
1030
                }
1031
				$meta_value = FrmProEntryMetaHelper::get_post_value( $record->post_id, $field->field_options['post_field'], $field->field_options['custom_field'], array( 'truncate' => false, 'type' => $field->type, 'form_id' => $field->form_id, 'field' => $field ) );
1032
            } else {
1033
				$meta_value = FrmEntryMeta::get_meta_value( $record, $field->id );
1034
            }
1035
        }
1036
1037
		$field_type = isset( $post_values['field_options'][ 'type_' . $field->id ] ) ? $post_values['field_options'][ 'type_' . $field->id ] : $field->type;
1038
        $new_value = isset( $post_values['item_meta'][ $field->id ] ) ? maybe_unserialize( $post_values['item_meta'][ $field->id ] ) : $meta_value;
1039
1040
        $field_array = array(
1041
            'id'            => $field->id,
1042
            'value'         => $new_value,
1043
            'default_value' => $field->default_value,
1044
            'name'          => $field->name,
1045
            'description'   => $field->description,
1046
            'type'          => apply_filters('frm_field_type', $field_type, $field, $new_value),
1047
            'options'       => $field->options,
1048
            'required'      => $field->required,
1049
            'field_key'     => $field->field_key,
1050
            'field_order'   => $field->field_order,
1051
            'form_id'       => $field->form_id,
1052
			'parent_form_id' => $args['parent_form_id'],
1053
        );
1054
1055
        $args['field_type'] = $field_type;
1056
        self::fill_field_opts($field, $field_array, $args);
1057
		// Track the original field's type
1058
		$field_array['original_type'] = isset( $field->field_options['original_type'] ) ? $field->field_options['original_type'] : $field->type;
1059
1060
        $field_array = apply_filters( 'frm_setup_edit_fields_vars', $field_array, $field, $values['id'], array() );
1061
1062
        if ( ! isset($field_array['unique']) || ! $field_array['unique'] ) {
1063
            $field_array['unique_msg'] = '';
1064
        }
1065
1066
        $field_array = array_merge( $field->field_options, $field_array );
1067
1068
        $values['fields'][ $field->id ] = $field_array;
1069
    }
1070
1071
	private static function fill_field_opts( $field, array &$field_array, $args ) {
1072
        $post_values = $args['post_values'];
1073
        $opt_defaults = FrmFieldsHelper::get_default_field_opts($field_array['type'], $field, true);
1074
1075
        foreach ( $opt_defaults as $opt => $default_opt ) {
1076
			$field_array[ $opt ] = ( $post_values && isset( $post_values['field_options'][ $opt . '_' . $field->id ] ) ) ? maybe_unserialize( $post_values['field_options'][ $opt . '_' . $field->id ] ) : ( isset( $field->field_options[ $opt ] ) ? $field->field_options[ $opt ] : $default_opt );
1077
            if ( $opt == 'blank' && $field_array[ $opt ] == '' ) {
1078
                $field_array[ $opt ] = $args['frm_settings']->blank_msg;
1079
            } else if ( $opt == 'invalid' && $field_array[ $opt ] == '' ) {
1080
                if ( $args['field_type'] == 'captcha' ) {
1081
                    $field_array[ $opt ] = $args['frm_settings']->re_msg;
1082
                } else {
1083
                    $field_array[ $opt ] = sprintf( __( '%s is invalid', 'formidable' ), $field_array['name'] );
1084
                }
1085
            }
1086
        }
1087
1088
        if ( $field_array['custom_html'] == '' ) {
1089
            $field_array['custom_html'] = FrmFieldsHelper::get_default_html($args['field_type']);
1090
        }
1091
    }
1092
1093
    /**
1094
     * @param string $table
1095
     */
1096
	private static function fill_form_opts( $record, $table, $post_values, array &$values ) {
1097
        if ( $table == 'entries' ) {
1098
            $form = $record->form_id;
1099
			FrmForm::maybe_get_form( $form );
1100
        } else {
1101
            $form = $record;
1102
        }
1103
1104
        if ( ! $form ) {
1105
            return;
1106
        }
1107
1108
        $values['form_name'] = isset($record->form_id) ? $form->name : '';
1109
		$values['parent_form_id'] = isset( $record->form_id ) ? $form->parent_form_id : 0;
1110
1111
        if ( ! is_array($form->options) ) {
1112
            return;
1113
        }
1114
1115
        foreach ( $form->options as $opt => $value ) {
1116
            $values[ $opt ] = isset( $post_values[ $opt ] ) ? maybe_unserialize( $post_values[ $opt ] ) : $value;
1117
        }
1118
1119
        self::fill_form_defaults($post_values, $values);
1120
    }
1121
1122
    /**
1123
     * Set to POST value or default
1124
     */
1125
	private static function fill_form_defaults( $post_values, array &$values ) {
1126
        $form_defaults = FrmFormsHelper::get_default_opts();
1127
1128
        foreach ( $form_defaults as $opt => $default ) {
1129
            if ( ! isset( $values[ $opt ] ) || $values[ $opt ] == '' ) {
1130
				$values[ $opt ] = ( $post_values && isset( $post_values['options'][ $opt ] ) ) ? $post_values['options'][ $opt ] : $default;
1131
            }
1132
1133
            unset($opt, $defaut);
1134
        }
1135
1136 View Code Duplication
        if ( ! isset($values['custom_style']) ) {
0 ignored issues
show
Duplication introduced by
This code seems to be duplicated across your project.

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

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

Loading history...
1137
            $frm_settings = self::get_settings();
1138
			$values['custom_style'] = ( $post_values && isset( $post_values['options']['custom_style'] ) ) ? absint( $_POST['options']['custom_style'] ) : ( $frm_settings->load_style != 'none' );
0 ignored issues
show
introduced by
Detected access of super global var $_POST, probably need manual inspection.
Loading history...
1139
        }
1140
1141
		foreach ( array( 'before', 'after', 'submit' ) as $h ) {
1142
			if ( ! isset( $values[ $h . '_html' ] ) ) {
1143
				$values[ $h . '_html' ] = ( isset( $post_values['options'][ $h . '_html' ] ) ? $post_values['options'][ $h . '_html' ] : FrmFormsHelper::get_default_html( $h ) );
1144
            }
1145
            unset($h);
1146
        }
1147
    }
1148
1149
	public static function get_meta_value( $field_id, $entry ) {
1150
		_deprecated_function( __FUNCTION__, '2.0.9', 'FrmEntryMeta::get_meta_value' );
1151
		return FrmEntryMeta::get_meta_value( $entry, $field_id );
1152
	}
1153
1154
	public static function insert_opt_html( $args ) {
1155
        $class = '';
1156
        if ( in_array( $args['type'], array( 'email', 'user_id', 'hidden', 'select', 'radio', 'checkbox', 'phone', 'text' ) ) ) {
1157
            $class .= 'show_frm_not_email_to';
1158
        }
1159
    ?>
1160
<li>
1161
    <a href="javascript:void(0)" class="frmids frm_insert_code alignright <?php echo esc_attr($class) ?>" data-code="<?php echo esc_attr($args['id']) ?>" >[<?php echo esc_attr( $args['id'] ) ?>]</a>
1162
    <a href="javascript:void(0)" class="frmkeys frm_insert_code alignright <?php echo esc_attr($class) ?>" data-code="<?php echo esc_attr($args['key']) ?>" >[<?php echo esc_attr( self::truncate($args['key'], 10) ) ?>]</a>
1163
    <a href="javascript:void(0)" class="frm_insert_code <?php echo esc_attr( $class ) ?>" data-code="<?php echo esc_attr($args['id']) ?>" ><?php echo esc_attr( self::truncate($args['name'], 60) ) ?></a>
1164
</li>
1165
    <?php
1166
    }
1167
1168
	public static function truncate( $str, $length, $minword = 3, $continue = '...' ) {
1169
        if ( is_array( $str ) ) {
1170
            return '';
1171
		}
1172
1173
        $length = (int) $length;
1174
		$str = wp_strip_all_tags( $str );
1175
		$original_len = self::mb_function( array( 'mb_strlen', 'strlen' ), array( $str ) );
1176
1177
		if ( $length == 0 ) {
1178
            return '';
1179
        } else if ( $length <= 10 ) {
1180
			$sub = self::mb_function( array( 'mb_substr', 'substr' ), array( $str, 0, $length ) );
1181
            return $sub . (($length < $original_len) ? $continue : '');
1182
        }
1183
1184
        $sub = '';
1185
        $len = 0;
1186
1187
		$words = self::mb_function( array( 'mb_split', 'explode' ), array( ' ', $str ) );
1188
1189
		foreach ( $words as $word ) {
1190
            $part = (($sub != '') ? ' ' : '') . $word;
1191
			$total_len = self::mb_function( array( 'mb_strlen', 'strlen' ), array( $sub . $part ) );
1192
            if ( $total_len > $length && str_word_count($sub) ) {
1193
                break;
1194
            }
1195
1196
            $sub .= $part;
1197
			$len += self::mb_function( array( 'mb_strlen', 'strlen' ), array( $part ) );
1198
1199
            if ( str_word_count($sub) > $minword && $total_len >= $length ) {
1200
                break;
1201
            }
1202
1203
            unset($total_len, $word);
1204
        }
1205
1206
        return $sub . (($len < $original_len) ? $continue : '');
1207
    }
1208
1209
	public static function mb_function( $function_names, $args ) {
1210
		$mb_function_name = $function_names[0];
1211
		$function_name = $function_names[1];
1212
		if ( function_exists( $mb_function_name ) ) {
1213
			$function_name = $mb_function_name;
1214
		}
1215
		return call_user_func_array( $function_name, $args );
1216
	}
1217
1218
	public static function get_formatted_time( $date, $date_format = '', $time_format = '' ) {
1219
        if ( empty($date) ) {
1220
            return $date;
1221
        }
1222
1223
        if ( empty($date_format) ) {
1224
            $date_format = get_option('date_format');
1225
        }
1226
1227
        if ( preg_match('/^\d{1-2}\/\d{1-2}\/\d{4}$/', $date) && self::pro_is_installed() ) {
1228
            $frmpro_settings = new FrmProSettings();
1229
            $date = FrmProAppHelper::convert_date($date, $frmpro_settings->date_format, 'Y-m-d');
1230
        }
1231
1232
		$formatted = self::get_localized_date( $date_format, $date );
1233
1234
		$do_time = ( date( 'H:i:s', strtotime( $date ) ) != '00:00:00' );
1235
		if ( $do_time ) {
1236
			$formatted .= self::add_time_to_date( $time_format, $date );
1237
		}
1238
1239
        return $formatted;
1240
    }
1241
1242
	private static function add_time_to_date( $time_format, $date ) {
1243
		if ( empty( $time_format ) ) {
1244
			$time_format = get_option('time_format');
1245
		}
1246
1247
		$trimmed_format = trim( $time_format );
1248
		$time = '';
1249
		if ( $time_format && ! empty( $trimmed_format ) ) {
1250
			$time = ' ' . __( 'at', 'formidable' ) . ' ' . self::get_localized_date( $time_format, $date );
0 ignored issues
show
introduced by
Expected next thing to be a escaping function, not 'self'
Loading history...
1251
		}
1252
1253
		return $time;
1254
	}
1255
1256
	/**
1257
	 * @since 2.0.8
1258
	 */
1259
	public static function get_localized_date( $date_format, $date ) {
1260
		$date = get_date_from_gmt( $date );
1261
		return date_i18n( $date_format, strtotime( $date ) );
1262
	}
1263
1264
	/**
1265
	 * Gets the time ago in words
1266
	 *
1267
	 * @param int $from in seconds
1268
	 * @param int|string $to in seconds
1269
	 * @return string $time_ago
1270
	 */
1271
	public static function human_time_diff( $from, $to = '' ) {
1272
		if ( empty( $to ) ) {
1273
			$now = new DateTime;
1274
		} else {
1275
			$now = new DateTime( '@' . $to );
1276
		}
1277
		$ago = new DateTime( '@' . $from );
1278
1279
		// Get the time difference
1280
		$diff_object = $now->diff( $ago );
1281
		$diff = get_object_vars( $diff_object );
1282
1283
		// Add week amount and update day amount
1284
		$diff['w'] = floor( $diff['d'] / 7 );
1285
		$diff['d'] -= $diff['w'] * 7;
1286
1287
		$time_strings = self::get_time_strings();
1288
1289
		foreach ( $time_strings as $k => $v ) {
1290
			if ( $diff[ $k ] ) {
1291
				$time_strings[ $k ] = $diff[ $k ] . ' ' . ( $diff[ $k ] > 1 ? $v[1] : $v[0] );
1292
			} else {
1293
				unset( $time_strings[ $k ] );
1294
			}
1295
		}
1296
1297
		$time_strings = array_slice( $time_strings, 0, 1 );
1298
		$time_ago_string = $time_strings ? implode( ', ', $time_strings ) : '0 ' . __( 'seconds', 'formidable' );
1299
1300
		return $time_ago_string;
1301
	}
1302
1303
	/**
1304
	 * Get the translatable time strings
1305
	 *
1306
	 * @since 2.0.20
1307
	 * @return array
1308
	 */
1309
	private static function get_time_strings() {
1310
		return array(
1311
			'y' => array( __( 'year', 'formidable' ), __( 'years', 'formidable' ) ),
1312
			'm' => array( __( 'month', 'formidable' ), __( 'months', 'formidable' ) ),
1313
			'w' => array( __( 'week', 'formidable' ), __( 'weeks', 'formidable' ) ),
1314
			'd' => array( __( 'day', 'formidable' ), __( 'days', 'formidable' ) ),
1315
			'h' => array( __( 'hour', 'formidable' ), __( 'hours', 'formidable' ) ),
1316
			'i' => array( __( 'minute', 'formidable' ), __( 'minutes', 'formidable' ) ),
1317
			's' => array( __( 'second', 'formidable' ), __( 'seconds', 'formidable' ) ),
1318
		);
1319
	}
1320
1321
    /**
1322
     * Added for < WP 4.0 compatability
1323
     *
1324
     * @since 1.07.10
1325
     *
1326
     * @param string $term The value to escape
1327
     * @return string The escaped value
1328
     */
1329
	public static function esc_like( $term ) {
1330
        global $wpdb;
1331
        if ( method_exists($wpdb, 'esc_like') ) {
1332
			// WP 4.0
1333
            $term = $wpdb->esc_like( $term );
1334
        } else {
1335
            $term = like_escape( $term );
1336
        }
1337
1338
        return $term;
1339
    }
1340
1341
    /**
1342
     * @param string $order_query
1343
     */
1344
	public static function esc_order( $order_query ) {
1345
        if ( empty($order_query) ) {
1346
            return '';
1347
        }
1348
1349
        // remove ORDER BY before santizing
1350
        $order_query = strtolower($order_query);
1351
        if ( strpos($order_query, 'order by') !== false ) {
1352
            $order_query = str_replace('order by', '', $order_query);
1353
        }
1354
1355
        $order_query = explode(' ', trim($order_query));
1356
1357
        $order_fields = array(
1358
            'id', 'form_key', 'name', 'description',
1359
            'parent_form_id', 'logged_in', 'is_template',
1360
            'default_template', 'status', 'created_at',
1361
        );
1362
1363
        $order = trim(trim(reset($order_query), ','));
1364
        if ( ! in_array($order, $order_fields) ) {
1365
            return '';
1366
        }
1367
1368
        $order_by = '';
1369
        if ( count($order_query) > 1 ) {
1370
			$order_by = end( $order_query );
1371
			self::esc_order_by( $order_by );
1372
        }
1373
1374
		return ' ORDER BY ' . $order . ' ' . $order_by;
1375
    }
1376
1377
	/**
1378
	 * Make sure this is ordering by either ASC or DESC
1379
	 */
1380
	public static function esc_order_by( &$order_by ) {
1381
		$sort_options = array( 'asc', 'desc' );
1382
		if ( ! in_array( strtolower( $order_by ), $sort_options ) ) {
1383
			$order_by = 'asc';
1384
		}
1385
	}
1386
1387
    /**
1388
     * @param string $limit
1389
     */
1390
	public static function esc_limit( $limit ) {
1391
        if ( empty($limit) ) {
1392
            return '';
1393
        }
1394
1395
        $limit = trim(str_replace(' limit', '', strtolower($limit)));
1396
        if ( is_numeric($limit) ) {
1397
			return ' LIMIT ' . $limit;
1398
        }
1399
1400
        $limit = explode(',', trim($limit));
1401
        foreach ( $limit as $k => $l ) {
1402
            if ( is_numeric( $l ) ) {
1403
                $limit[ $k ] = $l;
1404
            }
1405
        }
1406
1407
        $limit = implode(',', $limit);
1408
		return ' LIMIT ' . $limit;
1409
    }
1410
1411
    /**
1412
     * Get an array of values ready to go through $wpdb->prepare
1413
     * @since 2.0
1414
     */
1415
    public static function prepare_array_values( $array, $type = '%s' ) {
1416
        $placeholders = array_fill(0, count($array), $type);
1417
        return implode(', ', $placeholders);
1418
    }
1419
1420
    public static function prepend_and_or_where( $starts_with = ' WHERE ', $where = '' ) {
1421
        if ( empty($where) ) {
1422
            return '';
1423
        }
1424
1425
		if ( is_array( $where ) ) {
1426
            global $wpdb;
1427
            FrmDb::get_where_clause_and_values( $where, $starts_with );
1428
			$where = $wpdb->prepare( $where['where'], $where['values'] );
1429
		} else {
1430
            $where = $starts_with . $where;
1431
        }
1432
1433
        return $where;
1434
    }
1435
1436
    // Pagination Methods
1437
1438
    /**
1439
     * @param integer $current_p
1440
     */
1441
	public static function get_last_record_num( $r_count, $current_p, $p_size ) {
1442
		return ( ( $r_count < ( $current_p * $p_size ) ) ? $r_count : ( $current_p * $p_size ) );
1443
	}
1444
1445
    /**
1446
     * @param integer $current_p
1447
     */
1448
    public static function get_first_record_num( $r_count, $current_p, $p_size ) {
1449
        if ( $current_p == 1 ) {
1450
            return 1;
1451
        } else {
1452
            return ( self::get_last_record_num( $r_count, ( $current_p - 1 ), $p_size ) + 1 );
1453
        }
1454
    }
1455
1456
	/**
1457
	 * @return array
1458
	 */
1459
	public static function json_to_array( $json_vars ) {
1460
        $vars = array();
1461
        foreach ( $json_vars as $jv ) {
1462
            $jv_name = explode('[', $jv['name']);
1463
            $last = count($jv_name) - 1;
1464
            foreach ( $jv_name as $p => $n ) {
1465
                $name = trim($n, ']');
1466
                if ( ! isset($l1) ) {
1467
                    $l1 = $name;
1468
                }
1469
1470
                if ( ! isset($l2) ) {
1471
                    $l2 = $name;
1472
                }
1473
1474
                if ( ! isset($l3) ) {
1475
                    $l3 = $name;
1476
                }
1477
1478
                $this_val = ( $p == $last ) ? $jv['value'] : array();
1479
1480
                switch ( $p ) {
1481
                    case 0:
1482
                        $l1 = $name;
1483
                        self::add_value_to_array( $name, $l1, $this_val, $vars );
1484
                    break;
1485
1486
                    case 1:
1487
                        $l2 = $name;
1488
                        self::add_value_to_array( $name, $l2, $this_val, $vars[ $l1 ] );
1489
                    break;
1490
1491 View Code Duplication
                    case 2:
0 ignored issues
show
Duplication introduced by
This code seems to be duplicated across your project.

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

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

Loading history...
1492
                        $l3 = $name;
1493
                        self::add_value_to_array( $name, $l3, $this_val, $vars[ $l1 ][ $l2 ] );
1494
                    break;
1495
1496 View Code Duplication
                    case 3:
0 ignored issues
show
Duplication introduced by
This code seems to be duplicated across your project.

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

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

Loading history...
1497
                        $l4 = $name;
1498
                        self::add_value_to_array( $name, $l4, $this_val, $vars[ $l1 ][ $l2 ][ $l3 ] );
1499
                    break;
1500
                }
1501
1502
                unset($this_val, $n);
1503
            }
1504
1505
            unset($last, $jv);
1506
        }
1507
1508
        return $vars;
1509
    }
1510
1511
    /**
1512
     * @param string $name
1513
     * @param string $l1
1514
     */
1515
    public static function add_value_to_array( $name, $l1, $val, &$vars ) {
1516
        if ( $name == '' ) {
1517
            $vars[] = $val;
1518
        } else if ( ! isset( $vars[ $l1 ] ) ) {
1519
            $vars[ $l1 ] = $val;
1520
        }
1521
    }
1522
1523
	public static function maybe_add_tooltip( $name, $class = 'closed', $form_name = '' ) {
1524
        $tooltips = array(
1525
            'action_title'  => __( 'Give this action a label for easy reference.', 'formidable' ),
1526
            'email_to'      => __( 'Add one or more recipient addresses separated by a ",".  FORMAT: Name <[email protected]> or [email protected].  [admin_email] is the address set in WP General Settings.', 'formidable' ),
1527
            'cc'            => __( 'Add CC addresses separated by a ",".  FORMAT: Name <[email protected]> or [email protected].', 'formidable' ),
1528
            'bcc'           => __( 'Add BCC addresses separated by a ",".  FORMAT: Name <[email protected]> or [email protected].', 'formidable' ),
1529
            'reply_to'      => __( 'If you would like a different reply to address than the "from" address, add a single address here.  FORMAT: Name <[email protected]> or [email protected].', 'formidable' ),
1530
            'from'          => __( 'Enter the name and/or email address of the sender. FORMAT: John Bates <[email protected]> or [email protected].', 'formidable' ),
1531
            'email_subject' => esc_attr( sprintf( __( 'If you leave the subject blank, the default will be used: %1$s Form submitted on %2$s', 'formidable' ), $form_name, self::site_name() ) ),
1532
        );
1533
1534
        if ( ! isset( $tooltips[ $name ] ) ) {
1535
            return;
1536
        }
1537
1538
        if ( 'open' == $class ) {
1539
            echo ' frm_help"';
1540
        } else {
1541
            echo ' class="frm_help"';
1542
        }
1543
1544
		echo ' title="' . esc_attr( $tooltips[ $name ] );
1545
1546
        if ( 'open' != $class ) {
1547
            echo '"';
1548
        }
1549
    }
1550
1551
	/**
1552
	 * Add the current_page class to that page in the form nav
1553
	 */
1554
	public static function select_current_page( $page, $current_page, $action = array() ) {
1555
		if ( $current_page != $page ) {
1556
			return;
1557
		}
1558
1559
		$frm_action = FrmAppHelper::simple_get( 'frm_action', 'sanitize_title' );
1560
		if ( empty( $action ) || ( ! empty( $frm_action ) && in_array( $frm_action, $action ) ) ) {
1561
			echo ' class="current_page"';
1562
		}
1563
	}
1564
1565
    /**
1566
     * Prepare and json_encode post content
1567
     *
1568
     * @since 2.0
1569
     *
1570
     * @param array $post_content
1571
     * @return string $post_content ( json encoded array )
1572
     */
1573
    public static function prepare_and_encode( $post_content ) {
1574
        //Loop through array to strip slashes and add only the needed ones
1575
		foreach ( $post_content as $key => $val ) {
1576
			// Replace problematic characters (like &quot;)
1577
			$val = str_replace( '&quot;', '"', $val );
1578
1579
			self::prepare_action_slashes( $val, $key, $post_content );
1580
            unset( $key, $val );
1581
        }
1582
1583
        // json_encode the array
1584
        $post_content = json_encode( $post_content );
1585
1586
	    // add extra slashes for \r\n since WP strips them
1587
		$post_content = str_replace( array( '\\r', '\\n', '\\u', '\\t' ), array( '\\\\r', '\\\\n', '\\\\u', '\\\\t' ), $post_content );
1588
1589
        // allow for &quot
1590
	    $post_content = str_replace( '&quot;', '\\"', $post_content );
1591
1592
        return $post_content;
1593
    }
1594
1595
	private static function prepare_action_slashes( $val, $key, &$post_content ) {
1596
		if ( ! isset( $post_content[ $key ] ) ) {
1597
			return;
1598
		}
1599
1600
		if ( is_array( $val ) ) {
1601
			foreach ( $val as $k1 => $v1 ) {
1602
				self::prepare_action_slashes( $v1, $k1, $post_content[ $key ] );
1603
				unset( $k1, $v1 );
1604
			}
1605
		} else {
1606
			// Strip all slashes so everything is the same, no matter where the value is coming from
1607
			$val = stripslashes( $val );
1608
1609
			// Add backslashes before double quotes and forward slashes only
1610
			$post_content[ $key ] = addcslashes( $val, '"\\/' );
1611
		}
1612
	}
1613
1614
	/**
1615
	 * Prepare and save settings in styles and actions
1616
	 *
1617
	 * @param array $settings
1618
	 * @param string $group
1619
	 *
1620
	 * @since 2.0.6
1621
	 */
1622
	public static function save_settings( $settings, $group ) {
1623
		$settings = (array) $settings;
1624
		$settings['post_content'] = FrmAppHelper::prepare_and_encode( $settings['post_content'] );
1625
1626
		if ( empty( $settings['ID'] ) ) {
1627
			unset( $settings['ID']);
1628
		}
1629
1630
		// delete all caches for this group
1631
		self::cache_delete_group( $group );
1632
1633
		return self::save_json_post( $settings );
1634
	}
1635
1636
	/**
1637
	 * Since actions are JSON encoded, we don't want any filters messing with it.
1638
	 * Remove the filters and then add them back in case any posts or views are
1639
	 * also being imported.
1640
	 *
1641
	 * Used when saving form actions and styles
1642
	 *
1643
	 * @since 2.0.4
1644
	 */
1645
	public static function save_json_post( $settings ) {
1646
		global $wp_filter;
1647
		$filters = $wp_filter['content_save_pre'];
1648
1649
		// Remove the balanceTags filter in case WordPress is trying to validate the XHTML
1650
		remove_all_filters( 'content_save_pre' );
1651
1652
		$post = wp_insert_post( $settings );
0 ignored issues
show
introduced by
Overridding WordPress globals is prohibited
Loading history...
1653
1654
		// add the content filters back for views or posts
1655
		$wp_filter['content_save_pre'] = $filters;
1656
1657
		return $post;
1658
	}
1659
1660
	public static function maybe_json_decode( $string ) {
1661
        if ( is_array($string) ) {
1662
            return $string;
1663
        }
1664
1665
        $new_string = json_decode($string, true);
1666
        if ( function_exists('json_last_error') ) {
1667
			// php 5.3+
1668
            if ( json_last_error() == JSON_ERROR_NONE ) {
1669
                $string = $new_string;
1670
            }
1671
        } else if ( isset($new_string) ) {
1672
			// php < 5.3 fallback
1673
            $string = $new_string;
1674
        }
1675
        return $string;
1676
    }
1677
1678
    /**
1679
     * @since 1.07.10
1680
     *
1681
     * @param string $post_type The name of the post type that may need to be highlighted
1682
     * echo The javascript to open and highlight the Formidable menu
1683
     */
1684
	public static function maybe_highlight_menu( $post_type ) {
1685
        global $post;
1686
1687
        if ( isset($_REQUEST['post_type']) && $_REQUEST['post_type'] != $post_type ) {
0 ignored issues
show
introduced by
Detected access of super global var $_REQUEST, probably need manual inspection.
Loading history...
introduced by
Detected usage of a non-sanitized input variable: $_REQUEST
Loading history...
1688
            return;
1689
        }
1690
1691
        if ( is_object($post) && $post->post_type != $post_type ) {
1692
            return;
1693
        }
1694
1695
        self::load_admin_wide_js();
1696
        echo '<script type="text/javascript">jQuery(document).ready(function(){frmSelectSubnav();});</script>';
1697
    }
1698
1699
    /**
1700
     * Load the JS file on non-Formidable pages in the admin area
1701
     * @since 2.0
1702
     */
1703
	public static function load_admin_wide_js( $load = true ) {
1704
        $version = FrmAppHelper::plugin_version();
1705
		wp_register_script( 'formidable_admin_global', FrmAppHelper::plugin_url() . '/js/formidable_admin_global.js', array( 'jquery' ), $version );
1706
1707
        wp_localize_script( 'formidable_admin_global', 'frmGlobal', array(
1708
			'updating_msg' => __( 'Please wait while your site updates.', 'formidable' ),
1709
            'deauthorize'  => __( 'Are you sure you want to deauthorize Formidable Forms on this site?', 'formidable' ),
1710
			'url'          => FrmAppHelper::plugin_url(),
1711
			'loading'      => __( 'Loading&hellip;' ),
1712
			'nonce'        => wp_create_nonce( 'frm_ajax' ),
1713
        ) );
1714
1715
		if ( $load ) {
1716
			wp_enqueue_script( 'formidable_admin_global' );
1717
		}
1718
    }
1719
1720
	/**
1721
	 * @since 2.0.9
1722
	 */
1723
	public static function load_font_style() {
1724
		wp_enqueue_style( 'frm_fonts', self::plugin_url() . '/css/frm_fonts.css', array(), self::plugin_version() );
1725
	}
1726
1727
    /**
1728
     * @param string $location
1729
     */
1730
	public static function localize_script( $location ) {
1731
		$ajax_url = admin_url( 'admin-ajax.php', is_ssl() ? 'admin' : 'http' );
1732
		$ajax_url = apply_filters( 'frm_ajax_url', $ajax_url );
1733
1734
		wp_localize_script( 'formidable', 'frm_js', array(
1735
			'ajax_url'  => $ajax_url,
1736
			'images_url' => self::plugin_url() . '/images',
1737
			'loading'   => __( 'Loading&hellip;' ),
1738
			'remove'    => __( 'Remove', 'formidable' ),
1739
			'offset'    => apply_filters( 'frm_scroll_offset', 4 ),
1740
			'nonce'     => wp_create_nonce( 'frm_ajax' ),
1741
			'id'        => __( 'ID', 'formidable' ),
1742
			'no_results' => __( 'No results match', 'formidable' ),
1743
		) );
1744
1745
		if ( $location == 'admin' ) {
1746
			$frm_settings = self::get_settings();
1747
			wp_localize_script( 'formidable_admin', 'frm_admin_js', array(
1748
				'confirm_uninstall' => __( 'Are you sure you want to do this? Clicking OK will delete all forms, form data, and all other Formidable data. There is no Undo.', 'formidable' ),
1749
				'desc'              => __( '(Click to add description)', 'formidable' ),
1750
				'blank'             => __( '(Blank)', 'formidable' ),
1751
				'no_label'          => __( '(no label)', 'formidable' ),
1752
				'saving'            => esc_attr( __( 'Saving', 'formidable' ) ),
1753
				'saved'             => esc_attr( __( 'Saved', 'formidable' ) ),
1754
				'ok'                => __( 'OK' ),
1755
				'cancel'            => __( 'Cancel', 'formidable' ),
1756
				'default'           => __( 'Default', 'formidable' ),
1757
				'clear_default'     => __( 'Clear default value when typing', 'formidable' ),
1758
				'no_clear_default'  => __( 'Do not clear default value when typing', 'formidable' ),
1759
				'valid_default'     => __( 'Default value will pass form validation', 'formidable' ),
1760
				'no_valid_default'  => __( 'Default value will NOT pass form validation', 'formidable' ),
1761
				'confirm'           => __( 'Are you sure?', 'formidable' ),
1762
				'conf_delete'       => __( 'Are you sure you want to delete this field and all data associated with it?', 'formidable' ),
1763
				'conf_delete_sec'   => __( 'WARNING: This will delete all fields inside of the section as well.', 'formidable' ),
1764
				'conf_no_repeat'    => __( 'Warning: If you have entries with multiple rows, all but the first row will be lost.', 'formidable' ),
1765
				'default_unique'    => $frm_settings->unique_msg,
1766
				'default_conf'      => __( 'The entered values do not match', 'formidable' ),
1767
				'enter_email'       => __( 'Enter Email', 'formidable' ),
1768
				'confirm_email'     => __( 'Confirm Email', 'formidable' ),
1769
				'css_invalid_size'  => __( 'In certain browsers (e.g. Firefox) text will not display correctly if the field height is too small relative to the field padding and text size. Please increase your field height or decrease your field padding.', 'formidable' ),
1770
				'enter_password'    => __( 'Enter Password', 'formidable' ),
1771
				'confirm_password'  => __( 'Confirm Password', 'formidable' ),
1772
				'import_complete'   => __( 'Import Complete', 'formidable' ),
1773
				'updating'          => __( 'Please wait while your site updates.', 'formidable' ),
1774
				'no_save_warning'   => __( 'Warning: There is no way to retrieve unsaved entries.', 'formidable' ),
1775
				'private'           => __( 'Private' ),
1776
				'jquery_ui_url'     => self::jquery_ui_base_url(),
1777
				'no_licenses'       => __( 'No new licenses were found', 'formidable' ),
1778
			) );
1779
		}
1780
	}
1781
1782
    /**
1783
	 * echo the message on the plugins listing page
1784
     * @since 1.07.10
1785
     *
1786
     * @param float $min_version The version the add-on requires
1787
     */
1788
	public static function min_version_notice( $min_version ) {
1789
        $frm_version = self::plugin_version();
1790
1791
        // check if Formidable meets minimum requirements
1792
        if ( version_compare($frm_version, $min_version, '>=') ) {
1793
            return;
1794
        }
1795
1796
        $wp_list_table = _get_list_table('WP_Plugins_List_Table');
1797
		echo '<tr class="plugin-update-tr active"><th colspan="' . absint( $wp_list_table->get_column_count() ) . '" class="check-column plugin-update colspanchange"><div class="update-message">' .
1798
        __( 'You are running an outdated version of Formidable. This plugin may not work correctly if you do not update Formidable.', 'formidable' ) .
0 ignored issues
show
introduced by
Expected a sanitizing function (see Codex for 'Data Validation'), but instead saw '__'
Loading history...
1799
        '</div></td></tr>';
1800
    }
1801
1802
    public static function locales( $type = 'date' ) {
1803
        $locales = array(
1804
            'en' => __( 'English', 'formidable' ),    '' => __( 'English/Western', 'formidable' ),
1805
            'af' => __( 'Afrikaans', 'formidable' ),  'sq' => __( 'Albanian', 'formidable' ),
1806
            'ar' => __( 'Arabic', 'formidable' ),     'hy' => __( 'Armenian', 'formidable' ),
1807
            'az' => __( 'Azerbaijani', 'formidable' ), 'eu' => __( 'Basque', 'formidable' ),
1808
            'bs' => __( 'Bosnian', 'formidable' ),    'bg' => __( 'Bulgarian', 'formidable' ),
1809
            'ca' => __( 'Catalan', 'formidable' ),    'zh-HK' => __( 'Chinese Hong Kong', 'formidable' ),
1810
            'zh-CN' => __( 'Chinese Simplified', 'formidable' ), 'zh-TW' => __( 'Chinese Traditional', 'formidable' ),
1811
            'hr' => __( 'Croatian', 'formidable' ),   'cs' => __( 'Czech', 'formidable' ),
1812
            'da' => __( 'Danish', 'formidable' ),     'nl' => __( 'Dutch', 'formidable' ),
1813
            'en-GB' => __( 'English/UK', 'formidable' ), 'eo' => __( 'Esperanto', 'formidable' ),
1814
            'et' => __( 'Estonian', 'formidable' ),   'fo' => __( 'Faroese', 'formidable' ),
1815
            'fa' => __( 'Farsi/Persian', 'formidable' ), 'fil' => __( 'Filipino', 'formidable' ),
1816
            'fi' => __( 'Finnish', 'formidable' ),    'fr' => __( 'French', 'formidable' ),
1817
            'fr-CA' => __( 'French/Canadian', 'formidable' ), 'fr-CH' => __( 'French/Swiss', 'formidable' ),
1818
            'de' => __( 'German', 'formidable' ),     'de-AT' => __( 'German/Austria', 'formidable' ),
1819
            'de-CH' => __( 'German/Switzerland', 'formidable' ), 'el' => __( 'Greek', 'formidable' ),
1820
            'he' => __( 'Hebrew', 'formidable' ),     'iw' => __( 'Hebrew', 'formidable' ),
1821
            'hi' => __( 'Hindi', 'formidable' ),      'hu' => __( 'Hungarian', 'formidable' ),
1822
            'is' => __( 'Icelandic', 'formidable' ),  'id' => __( 'Indonesian', 'formidable' ),
1823
            'it' => __( 'Italian', 'formidable' ),    'ja' => __( 'Japanese', 'formidable' ),
1824
            'ko' => __( 'Korean', 'formidable' ),     'lv' => __( 'Latvian', 'formidable' ),
1825
            'lt' => __( 'Lithuanian', 'formidable' ), 'ms' => __( 'Malaysian', 'formidable' ),
1826
            'no' => __( 'Norwegian', 'formidable' ),  'pl' => __( 'Polish', 'formidable' ),
1827
            'pt' => __( 'Portuguese', 'formidable' ), 'pt-BR' => __( 'Portuguese/Brazilian', 'formidable' ),
1828
            'pt-PT' => __( 'Portuguese/Portugal', 'formidable' ), 'ro' => __( 'Romanian', 'formidable' ),
1829
            'ru' => __( 'Russian', 'formidable' ),    'sr' => __( 'Serbian', 'formidable' ),
1830
            'sr-SR' => __( 'Serbian', 'formidable' ), 'sk' => __( 'Slovak', 'formidable' ),
1831
            'sl' => __( 'Slovenian', 'formidable' ),  'es' => __( 'Spanish', 'formidable' ),
1832
            'es-419' => __( 'Spanish/Latin America', 'formidable' ), 'sv' => __( 'Swedish', 'formidable' ),
1833
            'ta' => __( 'Tamil', 'formidable' ),      'th' => __( 'Thai', 'formidable' ),
1834
            'tu' => __( 'Turkish', 'formidable' ),    'tr' => __( 'Turkish', 'formidable' ),
1835
            'uk' => __( 'Ukranian', 'formidable' ),   'vi' => __( 'Vietnamese', 'formidable' ),
1836
        );
1837
1838
        if ( $type == 'captcha' ) {
1839
            // remove the languages unavailable for the captcha
1840
            $unset = array(
1841
                '', 'af', 'sq', 'hy', 'az', 'eu', 'bs',
1842
                'zh-HK', 'eo', 'et', 'fo', 'fr-CH',
1843
                'he', 'is', 'ms', 'sr-SR', 'ta', 'tu',
1844
            );
1845
        } else {
1846
            // remove the languages unavailable for the datepicker
1847
            $unset = array(
1848
                'en', 'fil', 'fr-CA', 'de-AT', 'de-AT',
1849
                'de-CH', 'iw', 'hi', 'pt', 'pt-PT',
1850
                'es-419', 'tr',
1851
            );
1852
        }
1853
1854
        $locales = array_diff_key($locales, array_flip($unset));
1855
        $locales = apply_filters('frm_locales', $locales);
1856
1857
        return $locales;
1858
    }
1859
}
1860