PluginProbe
Formidable Forms – WordPress Form Builder for Contact Forms, Calculators, Quizzes & More / 2.05.09
Formidable Forms – WordPress Form Builder for Contact Forms, Calculators, Quizzes & More v2.05.09
6.35 6.34 6.33.1 6.33 6.32.1 6.32 6.31 6.25 6.25.1 6.26 6.26.1 6.27 6.28 6.29 6.3 6.3.1 6.3.2 6.30 6.4 6.4.1 6.4.2 6.5 6.5.1 6.5.2 6.5.3 All 141 releases
formidable / classes / helpers / FrmFieldsHelper.php

FrmFieldsHelper.php in Formidable Forms – WordPress Form Builder for Contact Forms, Calculators, Quizzes & More 2.05.09, at classes/helpers/FrmFieldsHelper.php

1,490 lines 56.2 KB
No matching file
Up and down to move Enter to open Esc to close
Raw Download Zip
1 <?php
2 if ( ! defined('ABSPATH') ) {
3 die( 'You are not allowed to call this page directly.' );
4 }
5
6 class FrmFieldsHelper {
7
8 public static function setup_new_vars( $type = '', $form_id = '' ) {
9
10 if ( strpos($type, '|') ) {
11 list($type, $setting) = explode('|', $type);
12 }
13
14 $defaults = self::get_default_field_opts($type, $form_id);
15 $defaults['field_options']['custom_html'] = self::get_default_html($type);
16
17 $values = array();
18
19 foreach ( $defaults as $var => $default ) {
20 if ( $var == 'field_options' ) {
21 $values['field_options'] = array();
22 foreach ( $default as $opt_var => $opt_default ) {
23 $values['field_options'][ $opt_var ] = $opt_default;
24 unset($opt_var, $opt_default);
25 }
26 } else {
27 $values[ $var ] = $default;
28 }
29 unset($var, $default);
30 }
31
32 if ( isset( $setting ) && ! empty( $setting ) ) {
33 if ( in_array( $type, array( 'data', 'lookup' ) ) ) {
34 $values['field_options']['data_type'] = $setting;
35 } else {
36 $values['field_options'][ $setting ] = 1;
37 }
38 }
39
40 if ( $type == 'radio' || $type == 'checkbox' ) {
41 $values['options'] = serialize( array(
42 __( 'Option 1', 'formidable' ),
43 __( 'Option 2', 'formidable' ),
44 ) );
45 } else if ( $type == 'select' ) {
46 $values['options'] = serialize( array(
47 '',
48 __( 'Option 1', 'formidable' ),
49 ) );
50 } else if ( $type == 'textarea' ) {
51 $values['field_options']['max'] = '5';
52 } else if ( $type == 'captcha' ) {
53 $frm_settings = FrmAppHelper::get_settings();
54 $values['invalid'] = $frm_settings->re_msg;
55 $values['field_options']['label'] = 'none';
56 } else if ( 'url' == $type ) {
57 $values['name'] = __( 'Website', 'formidable' );
58 }
59
60 $fields = FrmField::field_selection();
61 $fields = array_merge($fields, FrmField::pro_field_selection());
62
63 if ( isset( $fields[ $type ] ) ) {
64 $values['name'] = is_array( $fields[ $type ] ) ? $fields[ $type ]['name'] : $fields[ $type ];
65 }
66
67 unset($fields);
68
69 return $values;
70 }
71
72 public static function get_html_id( $field, $plus = '' ) {
73 return apply_filters( 'frm_field_html_id', 'field_' . $field['field_key'] . $plus, $field );
74 }
75
76 public static function setup_edit_vars( $record, $doing_ajax = false ) {
77 $values = array(
78 'id' => $record->id,
79 'form_id' => $record->form_id,
80 );
81 $defaults = array(
82 'name' => $record->name,
83 'description' => $record->description,
84 'field_key' => $record->field_key,
85 'type' => $record->type,
86 'default_value' => $record->default_value,
87 'field_order' => $record->field_order,
88 'required' => $record->required,
89 );
90
91 if ( $doing_ajax ) {
92 $values = $values + $defaults;
93 $values['form_name'] = '';
94 } else {
95 foreach ( $defaults as $var => $default ) {
96 $values[ $var ] = FrmAppHelper::get_param( $var, $default, 'get', 'htmlspecialchars' );
97 unset($var, $default);
98 }
99
100 $values['form_name'] = $record->form_id ? FrmForm::getName( $record->form_id ) : '';
101 }
102
103 unset( $defaults );
104
105 $values['options'] = $record->options;
106 $values['field_options'] = $record->field_options;
107
108 $defaults = self::get_default_field_opts($values['type'], $record, true);
109
110 if ( $values['type'] == 'captcha' ) {
111 $frm_settings = FrmAppHelper::get_settings();
112 $defaults['invalid'] = $frm_settings->re_msg;
113 }
114
115 foreach ( $defaults as $opt => $default ) {
116 $values[ $opt ] = isset( $record->field_options[ $opt ] ) ? $record->field_options[ $opt ] : $default;
117 unset($opt, $default);
118 }
119
120 $values['custom_html'] = ( isset( $record->field_options['custom_html'] ) ) ? $record->field_options['custom_html'] : self::get_default_html( $record->type );
121
122 return apply_filters( 'frm_setup_edit_field_vars', $values, array( 'doing_ajax' => $doing_ajax ) );
123 }
124
125 public static function get_default_field_opts( $type, $field, $limit = false ) {
126 $field_options = array(
127 'size' => '',
128 'max' => '',
129 'label' => '',
130 'blank' => '',
131 'required_indicator' => '*',
132 'invalid' => '',
133 'separate_value' => 0,
134 'clear_on_focus' => 0,
135 'default_blank' => 0,
136 'classes' => '',
137 'custom_html' => '',
138 'captcha_size' => 'normal',
139 'captcha_theme' => 'light',
140 );
141
142 if ( $limit ) {
143 return $field_options;
144 }
145
146 global $wpdb;
147
148 $form_id = ( is_numeric( $field ) ) ? $field : $field->form_id;
149
150 $key = is_numeric( $field ) ? FrmAppHelper::get_unique_key( '', $wpdb->prefix . 'frm_fields', 'field_key' ) : $field->field_key;
151
152 $field_count = FrmDb::get_var( 'frm_fields', array( 'form_id' => $form_id ), 'field_order', array( 'order_by' => 'field_order DESC' ) );
153
154 $frm_settings = FrmAppHelper::get_settings();
155 return array(
156 'name' => __( 'Untitled', 'formidable' ),
157 'description' => '',
158 'field_key' => $key,
159 'type' => $type,
160 'options' => '',
161 'default_value' => '',
162 'field_order' => $field_count + 1,
163 'required' => false,
164 'blank' => $frm_settings->blank_msg,
165 'unique_msg' => $frm_settings->unique_msg,
166 'invalid' => __( 'This field is invalid', 'formidable' ),
167 'form_id' => $form_id,
168 'field_options' => $field_options,
169 );
170 }
171
172 public static function fill_field( &$values, $field, $form_id, $new_key = '' ) {
173 global $wpdb;
174
175 $values['field_key'] = FrmAppHelper::get_unique_key( $new_key, $wpdb->prefix . 'frm_fields', 'field_key' );
176 $values['form_id'] = $form_id;
177 $values['options'] = maybe_serialize($field->options);
178 $values['default_value'] = maybe_serialize($field->default_value);
179
180 foreach ( array( 'name', 'description', 'type', 'field_order', 'field_options', 'required' ) as $col ) {
181 $values[ $col ] = $field->{$col};
182 }
183 }
184
185 /**
186 * @since 2.0
187 */
188 public static function get_error_msg( $field, $error ) {
189 $frm_settings = FrmAppHelper::get_settings();
190 $default_settings = $frm_settings->default_options();
191 $field_name = is_array( $field ) ? $field['name'] : $field->name;
192
193 $conf_msg = __( 'The entered values do not match', 'formidable' );
194 $defaults = array(
195 'unique_msg' => array(
196 'full' => $default_settings['unique_msg'],
197 'part' => sprintf( __('%s must be unique', 'formidable' ), $field_name ),
198 ),
199 'invalid' => array(
200 'full' => __( 'This field is invalid', 'formidable' ),
201 'part' => sprintf( __('%s is invalid', 'formidable' ), $field_name ),
202 ),
203 'blank' => array(
204 'full' => $frm_settings->blank_msg,
205 'part' => $frm_settings->blank_msg,
206 ),
207 'conf_msg' => array(
208 'full' => $conf_msg,
209 'part' => $conf_msg,
210 ),
211 );
212
213 $msg = FrmField::get_option( $field, $error );
214 $msg = empty( $msg ) ? $defaults[ $error ]['part'] : $msg;
215 $msg = do_shortcode( $msg );
216 return $msg;
217 }
218
219 public static function get_form_fields( $form_id, $error = array() ) {
220 $fields = FrmField::get_all_for_form( $form_id );
221 $fields = apply_filters( 'frm_get_paged_fields', $fields, $form_id, $error );
222 return $fields;
223 }
224
225 public static function get_default_html( $type = 'text' ) {
226 if ( apply_filters( 'frm_normal_field_type_html', true, $type ) ) {
227 $input = ( in_array( $type, array( 'radio', 'checkbox', 'data' ) ) ) ? '<div class="frm_opt_container">[input]</div>' : '[input]';
228 $for = '';
229 if ( ! in_array( $type, array( 'radio', 'checkbox', 'data', 'scale' ) ) ) {
230 $for = 'for="field_[key]"';
231 }
232
233 $default_html = <<<DEFAULT_HTML
234 <div id="frm_field_[id]_container" class="frm_form_field form-field [required_class][error_class]">
235 <label $for class="frm_primary_label">[field_name]
236 <span class="frm_required">[required_label]</span>
237 </label>
238 $input
239 [if description]<div class="frm_description">[description]</div>[/if description]
240 [if error]<div class="frm_error">[error]</div>[/if error]
241 </div>
242 DEFAULT_HTML;
243 } else {
244 $default_html = apply_filters('frm_other_custom_html', '', $type);
245 }
246
247 return apply_filters('frm_custom_html', $default_html, $type);
248 }
249
250 public static function replace_shortcodes( $html, $field, $errors = array(), $form = false, $args = array() ) {
251 $html = apply_filters('frm_before_replace_shortcodes', $html, $field, $errors, $form);
252
253 $defaults = array(
254 'field_name' => 'item_meta[' . $field['id'] . ']',
255 'field_id' => $field['id'],
256 'field_plus_id' => '',
257 'section_id' => '',
258 );
259 $args = wp_parse_args($args, $defaults);
260 $field_name = $args['field_name'];
261 $field_id = $args['field_id'];
262 $html_id = self::get_html_id($field, $args['field_plus_id']);
263
264 if ( FrmField::is_multiple_select($field) ) {
265 $field_name .= '[]';
266 }
267
268 //replace [id]
269 $html = str_replace('[id]', $field_id, $html);
270
271 // Remove the for attribute for captcha
272 if ( $field['type'] == 'captcha' ) {
273 $html = str_replace(' for="field_[key]"', '', $html);
274 }
275
276 // set the label for
277 $html = str_replace('field_[key]', $html_id, $html);
278
279 //replace [key]
280 $html = str_replace('[key]', $field['field_key'], $html);
281
282 //replace [description] and [required_label] and [error]
283 $required = FrmField::is_required( $field ) ? $field['required_indicator'] : '';
284 if ( ! is_array( $errors ) ) {
285 $errors = array();
286 }
287 $error = isset( $errors[ 'field' . $field_id ] ) ? $errors[ 'field' . $field_id ] : false;
288
289 //If field type is section heading, add class so a bottom margin can be added to either the h3 or description
290 if ( $field['type'] == 'divider' ) {
291 if ( FrmField::is_option_true( $field, 'description' ) ) {
292 $html = str_replace( 'frm_description', 'frm_description frm_section_spacing', $html );
293 } else {
294 $html = str_replace('[label_position]', '[label_position] frm_section_spacing', $html);
295 }
296 }
297
298 $codes = array(
299 'description' => $field['description'],
300 'required_label' => $required,
301 'error' => $error,
302 );
303 foreach ( $codes as $code => $value ) {
304 self::remove_inline_conditions( ( $value && $value != '' ), $code, $value, $html );
305 }
306
307 //replace [required_class]
308 $required_class = FrmField::is_required( $field ) ? ' frm_required_field' : '';
309 $html = str_replace('[required_class]', $required_class, $html);
310
311 //replace [label_position]
312 $field['label'] = self::label_position( $field['label'], $field, $form );
313 self::add_class_to_label( $field, $html );
314
315 //replace [field_name]
316 $html = str_replace('[field_name]', $field['name'], $html);
317
318 self::add_field_div_classes( $field_id, $field, $errors, $html );
319
320 //replace [entry_key]
321 $entry_key = FrmAppHelper::simple_get( 'entry', 'sanitize_title' );
322 $html = str_replace('[entry_key]', $entry_key, $html);
323
324 if ( $form ) {
325 $form = (array) $form;
326
327 //replace [form_key]
328 $html = str_replace('[form_key]', $form['form_key'], $html);
329
330 //replace [form_name]
331 $html = str_replace('[form_name]', $form['name'], $html);
332 }
333
334 self::process_wp_shortcodes( $html );
335
336 //replace [input]
337 preg_match_all("/\[(input|deletelink)\b(.*?)(?:(\/))?\]/s", $html, $shortcodes, PREG_PATTERN_ORDER);
338 global $frm_vars;
339 $frm_settings = FrmAppHelper::get_settings();
340
341 foreach ( $shortcodes[0] as $short_key => $tag ) {
342 $atts = FrmShortcodeHelper::get_shortcode_attribute_array( $shortcodes[2][ $short_key ] );
343 $tag = self::get_shortcode_tag( $shortcodes, $short_key, array(
344 'conditional' => false,
345 'conditional_check' => false,
346 ) );
347
348 $replace_with = '';
349
350 if ( $tag == 'input' ) {
351 if ( isset($atts['opt']) ) {
352 $atts['opt']--;
353 }
354
355 $field['input_class'] = isset($atts['class']) ? $atts['class'] : '';
356 if ( isset($atts['class']) ) {
357 unset($atts['class']);
358 }
359
360 $field['shortcodes'] = $atts;
361 ob_start();
362 include( FrmAppHelper::plugin_path() . '/classes/views/frm-fields/input.php' );
363 $replace_with = ob_get_contents();
364 ob_end_clean();
365 } else if ( $tag == 'deletelink' && FrmAppHelper::pro_is_installed() ) {
366 $replace_with = FrmProEntriesController::entry_delete_link($atts);
367 }
368
369 $html = str_replace( $shortcodes[0][ $short_key ], $replace_with, $html );
370 }
371
372 $html .= "\n";
373
374 //Return html if conf_field to prevent loop
375 if ( isset($field['conf_field']) && $field['conf_field'] == 'stop' ) {
376 return $html;
377 }
378
379 //If field is in repeating section
380 if ( $args['section_id'] ) {
381 $html = apply_filters( 'frm_replace_shortcodes', $html, $field, array(
382 'errors' => $errors,
383 'form' => $form,
384 'field_name' => $field_name,
385 'field_id' => $field_id,
386 'field_plus_id' => $args['field_plus_id'],
387 'section_id' => $args['section_id'],
388 ) );
389 } else {
390 $html = apply_filters( 'frm_replace_shortcodes', $html, $field, array(
391 'errors' => $errors,
392 'form' => $form,
393 ) );
394 }
395
396 self::remove_collapse_shortcode( $html );
397
398 return $html;
399 }
400
401 /**
402 * Get the class to use for the label position
403 * @since 2.05
404 */
405 private static function &label_position( $position, $field, $form ) {
406 if ( $position && $position != '' ) {
407 return $position;
408 }
409
410 $position = FrmStylesController::get_style_val( 'position', $form );
411 if ( $position == 'none' ) {
412 $position = 'top';
413 } elseif ( $position == 'no_label' ) {
414 $position = 'none';
415 } elseif ( $position == 'inside' && ! self::is_placeholder_field_type( $field['type'] ) ) {
416 $position = 'top';
417 }
418
419 $position = apply_filters( 'frm_html_label_position', $position, $field, $form );
420 $position = ( ! empty( $position ) ) ? $position : 'top';
421
422 return $position;
423 }
424
425 /**
426 * Check if this field type allows placeholders
427 * @since 2.05
428 */
429 public static function is_placeholder_field_type( $type ) {
430 return ! in_array( $type, array( 'select', 'radio', 'checkbox', 'hidden' ) );
431 }
432
433 /**
434 * Add the label position class into the HTML
435 * If the label position is inside, add a class to show the label if the field has a value.
436 *
437 * @since 2.05
438 */
439 private static function add_class_to_label( $field, &$html ) {
440 $label_class = in_array( $field['type'], array( 'divider', 'end_divider', 'break' ) ) ? $field['label'] : ' frm_primary_label';
441 $html = str_replace( '[label_position]', $label_class, $html );
442 if ( $field['label'] == 'inside' && $field['value'] != '' ) {
443 $html = str_replace( 'frm_primary_label', 'frm_primary_label frm_visible', $html );
444 }
445 }
446
447 /**
448 * This filters shortcodes in the field HTML
449 *
450 * @since 2.02.11
451 */
452 private static function process_wp_shortcodes( &$html ) {
453 if ( apply_filters( 'frm_do_html_shortcodes', true ) ) {
454 $html = do_shortcode( $html );
455 }
456 }
457
458 /**
459 * Add classes to a field div
460 *
461 * @since 2.02.05
462 *
463 * @param string $field_id
464 * @param array $field
465 * @param array $errors
466 * @param string $html
467 */
468 private static function add_field_div_classes( $field_id, $field, $errors, &$html ) {
469 $classes = self::get_field_div_classes( $field_id, $field, $errors, $html );
470
471 if ( $field['type'] == 'html' && strpos( $html, '[error_class]' ) === false ) {
472 // there is no error_class shortcode for HTML fields
473 $html = str_replace( 'class="frm_form_field', 'class="frm_form_field ' . $classes, $html );
474 }
475 $html = str_replace( '[error_class]', $classes, $html );
476 }
477
478 /**
479 * Get the classes for a field div
480 *
481 * @since 2.02.05
482 *
483 * @param string $field_id
484 * @param array $field
485 * @param array $errors
486 * @param string $html
487 * @return string $classes
488 */
489 private static function get_field_div_classes( $field_id, $field, $errors, $html ) {
490 // Add error class
491 $classes = isset( $errors[ 'field' . $field_id ] ) ? ' frm_blank_field' : '';
492
493 // Add label position class
494 $classes .= ' frm_' . $field['label'] . '_container';
495
496 // Add CSS layout classes
497 if ( ! empty( $field['classes'] ) ) {
498 if ( ! strpos( $html, 'frm_form_field ') ) {
499 $classes .= ' frm_form_field';
500 }
501 $classes .= ' ' . $field['classes'];
502 }
503
504 // Get additional classes
505 $classes = apply_filters( 'frm_field_div_classes', $classes, $field, array( 'field_id' => $field_id ) );
506
507 return $classes;
508 }
509
510 public static function remove_inline_conditions( $no_vars, $code, $replace_with, &$html ) {
511 if ( $no_vars ) {
512 $html = str_replace( '[if ' . $code . ']', '', $html );
513 $html = str_replace( '[/if ' . $code . ']', '', $html );
514 } else {
515 $html = preg_replace( '/(\[if\s+' . $code . '\])(.*?)(\[\/if\s+' . $code . '\])/mis', '', $html );
516 }
517
518 $html = str_replace( '[' . $code . ']', $replace_with, $html );
519 }
520
521 public static function get_shortcode_tag( $shortcodes, $short_key, $args ) {
522 $args = wp_parse_args( $args, array(
523 'conditional' => false,
524 'conditional_check' => false,
525 'foreach' => false,
526 ) );
527 if ( ( $args['conditional'] || $args['foreach'] ) && ! $args['conditional_check'] ) {
528 $args['conditional_check'] = true;
529 }
530
531 $prefix = '';
532 if ( $args['conditional_check'] ) {
533 if ( $args['conditional'] ) {
534 $prefix = 'if ';
535 } else if ( $args['foreach'] ) {
536 $prefix = 'foreach ';
537 }
538 }
539
540 $with_tags = $args['conditional_check'] ? 3 : 2;
541 if ( ! empty( $shortcodes[ $with_tags ][ $short_key ] ) ) {
542 $tag = str_replace( '[' . $prefix, '', $shortcodes[0][ $short_key ] );
543 $tag = str_replace(']', '', $tag);
544 $tags = explode(' ', $tag);
545 if ( is_array($tags) ) {
546 $tag = $tags[0];
547 }
548 } else {
549 $tag = $shortcodes[ $with_tags - 1 ][ $short_key ];
550 }
551
552 return $tag;
553 }
554
555 /**
556 * Remove [collapse_this] if it's still included after all processing
557 * @since 2.0.8
558 */
559 private static function remove_collapse_shortcode( &$html ) {
560 if ( preg_match( '/\[(collapse_this)\]/s', $html ) ) {
561 $html = str_replace( '[collapse_this]', '', $html );
562 }
563 }
564
565 public static function get_checkbox_id( $field, $opt_key ) {
566 $id = $field['id'];
567 if ( isset( $field['in_section'] ) && $field['in_section'] ) {
568 $id .= '-' . $field['in_section'];
569 }
570 return 'frm_checkbox_' . $id . '-' . $opt_key;
571 }
572
573 public static function display_recaptcha( $field ) {
574 $frm_settings = FrmAppHelper::get_settings();
575 $lang = apply_filters( 'frm_recaptcha_lang', $frm_settings->re_lang, $field );
576
577 $class_prefix = '';
578 $api_js_url = 'https://www.google.com/recaptcha/api.js?';
579
580 $allow_mutiple = $frm_settings->re_multi;
581 if ( $allow_mutiple ) {
582 $api_js_url .= '&onload=frmRecaptcha&render=explicit';
583 $class_prefix = 'frm-';
584 }
585
586 if ( ! empty( $lang ) ) {
587 $api_js_url .= '&hl=' . $lang;
588 }
589 $api_js_url = apply_filters( 'frm_recaptcha_js_url', $api_js_url );
590
591 wp_register_script( 'recaptcha-api', $api_js_url, array( 'formidable' ), true );
592 wp_enqueue_script( 'recaptcha-api' );
593
594 // for reverse compatibility
595 $field['captcha_size'] = ( $field['captcha_size'] == 'default' ) ? 'normal' : $field['captcha_size'];
596 $field['captcha_size'] = ( $frm_settings->re_type == 'invisible' ) ? 'invisible' : $field['captcha_size'];
597
598 ?>
599 <div id="field_<?php echo esc_attr( $field['field_key'] ) ?>" class="<?php echo esc_attr( $class_prefix ) ?>g-recaptcha" data-sitekey="<?php echo esc_attr( $frm_settings->pubkey ) ?>" data-size="<?php echo esc_attr( $field['captcha_size'] ) ?>" data-theme="<?php echo esc_attr( $field['captcha_theme'] ) ?>" <?php echo ( 'invisible' === $field['captcha_size'] && ! $allow_mutiple ) ? 'data-callback="frmAfterRecaptcha"' : ''; ?>></div>
600 <?php
601 }
602
603 public static function show_single_option( $field ) {
604 $field_name = $field['name'];
605 $html_id = self::get_html_id($field);
606 foreach ( $field['options'] as $opt_key => $opt ) {
607 $field_val = apply_filters('frm_field_value_saved', $opt, $opt_key, $field);
608 $opt = apply_filters('frm_field_label_seen', $opt, $opt_key, $field);
609
610 // If this is an "Other" option, get the HTML for it
611 if ( self::is_other_opt( $opt_key ) ) {
612 // Get string for Other text field, if needed
613 $other_val = self::get_other_val( compact( 'opt_key', 'field' ) );
614 require( FrmAppHelper::plugin_path() . '/pro/classes/views/frmpro-fields/other-option.php' );
615 } else {
616 require( FrmAppHelper::plugin_path() . '/classes/views/frm-fields/single-option.php' );
617 }
618 }
619 }
620
621 public static function get_term_link( $tax_id ) {
622 $tax = get_taxonomy($tax_id);
623 if ( ! $tax ) {
624 return;
625 }
626
627 $link = sprintf(
628 __( 'Please add options from the WordPress "%1$s" page', 'formidable' ),
629 '<a href="' . esc_url( admin_url( 'edit-tags.php?taxonomy=' . $tax->name ) ) . '" target="_blank">' . ( empty( $tax->labels->name ) ? __( 'Categories' ) : $tax->labels->name ) . '</a>'
630 );
631 unset($tax);
632
633 return $link;
634 }
635
636 public static function value_meets_condition( $observed_value, $cond, $hide_opt ) {
637 $hide_opt = self::get_value_for_comparision( $hide_opt );
638 $observed_value = self::get_value_for_comparision( $observed_value );
639
640 if ( is_array($observed_value) ) {
641 return self::array_value_condition($observed_value, $cond, $hide_opt);
642 }
643
644 $m = false;
645 if ( $cond == '==' ) {
646 $m = $observed_value == $hide_opt;
647 } else if ( $cond == '!=' ) {
648 $m = $observed_value != $hide_opt;
649 } else if ( $cond == '>' ) {
650 $m = $observed_value > $hide_opt;
651 } else if ( $cond == '<' ) {
652 $m = $observed_value < $hide_opt;
653 } else if ( $cond == 'LIKE' || $cond == 'not LIKE' ) {
654 $m = stripos($observed_value, $hide_opt);
655 if ( $cond == 'not LIKE' ) {
656 $m = ( $m === false ) ? true : false;
657 } else {
658 $m = ( $m === false ) ? false : true;
659 }
660 }
661 return $m;
662 }
663
664 /**
665 * Trim and sanitize the values
666 * @since 2.05
667 */
668 private static function get_value_for_comparision( $value ) {
669 // Remove white space from hide_opt
670 if ( ! is_array( $value ) ) {
671 $value = trim( $value );
672 }
673
674 return wp_kses_post( $value );
675 }
676
677 public static function array_value_condition( $observed_value, $cond, $hide_opt ) {
678 $m = false;
679 if ( $cond == '==' ) {
680 if ( is_array($hide_opt) ) {
681 $m = array_intersect($hide_opt, $observed_value);
682 $m = empty($m) ? false : true;
683 } else {
684 $m = in_array($hide_opt, $observed_value);
685 }
686 } else if ( $cond == '!=' ) {
687 $m = ! in_array($hide_opt, $observed_value);
688 } else if ( $cond == '>' ) {
689 $min = min($observed_value);
690 $m = $min > $hide_opt;
691 } else if ( $cond == '<' ) {
692 $max = max($observed_value);
693 $m = $max < $hide_opt;
694 } else if ( $cond == 'LIKE' || $cond == 'not LIKE' ) {
695 foreach ( $observed_value as $ob ) {
696 $m = strpos($ob, $hide_opt);
697 if ( $m !== false ) {
698 $m = true;
699 break;
700 }
701 }
702
703 if ( $cond == 'not LIKE' ) {
704 $m = ( $m === false ) ? true : false;
705 }
706 }
707
708 return $m;
709 }
710
711 /**
712 * Replace a few basic shortcodes and field ids
713 * @since 2.0
714 * @return string
715 */
716 public static function basic_replace_shortcodes( $value, $form, $entry ) {
717 if ( strpos($value, '[sitename]') !== false ) {
718 $new_value = wp_specialchars_decode( FrmAppHelper::site_name(), ENT_QUOTES );
719 $value = str_replace('[sitename]', $new_value, $value);
720 }
721
722 $value = apply_filters('frm_content', $value, $form, $entry);
723 $value = do_shortcode($value);
724
725 return $value;
726 }
727
728 public static function get_shortcodes( $content, $form_id ) {
729 if ( FrmAppHelper::pro_is_installed() ) {
730 return FrmProDisplaysHelper::get_shortcodes($content, $form_id);
731 }
732
733 $fields = FrmField::getAll( array(
734 'fi.form_id' => (int) $form_id,
735 'fi.type not' => FrmField::no_save_fields(),
736 ) );
737
738 $tagregexp = self::allowed_shortcodes($fields);
739
740 preg_match_all("/\[(if )?($tagregexp)\b(.*?)(?:(\/))?\](?:(.+?)\[\/\2\])?/s", $content, $matches, PREG_PATTERN_ORDER);
741
742 return $matches;
743 }
744
745 public static function allowed_shortcodes( $fields = array() ) {
746 $tagregexp = array( 'editlink', 'id', 'key', 'ip', 'siteurl', 'sitename', 'admin_email', 'post[-|_]id', 'created[-|_]at', 'updated[-|_]at', 'updated[-|_]by', 'parent[-|_]id' );
747
748 foreach ( $fields as $field ) {
749 $tagregexp[] = $field->id;
750 $tagregexp[] = $field->field_key;
751 }
752
753 $tagregexp = implode('|', $tagregexp);
754 return $tagregexp;
755 }
756
757 public static function replace_content_shortcodes( $content, $entry, $shortcodes ) {
758 $shortcode_values = array(
759 'id' => $entry->id,
760 'key' => $entry->item_key,
761 'ip' => $entry->ip,
762 );
763
764 foreach ( $shortcodes[0] as $short_key => $tag ) {
765 if ( empty( $tag ) ) {
766 continue;
767 }
768
769 $atts = FrmShortcodeHelper::get_shortcode_attribute_array( $shortcodes[3][ $short_key ] );
770
771 if ( ! empty( $shortcodes[3][ $short_key ] ) ) {
772 $tag = str_replace( array( '[', ']' ), '', $shortcodes[0][ $short_key ] );
773 $tags = explode(' ', $tag);
774 if ( is_array($tags) ) {
775 $tag = $tags[0];
776 }
777 } else {
778 $tag = $shortcodes[2][ $short_key ];
779 }
780
781 switch ( $tag ) {
782 case 'id':
783 case 'key':
784 case 'ip':
785 $replace_with = $shortcode_values[ $tag ];
786 break;
787
788 case 'user_agent':
789 case 'user-agent':
790 $entry->description = maybe_unserialize($entry->description);
791 $replace_with = FrmEntriesHelper::get_browser( $entry->description['browser'] );
792 break;
793
794 case 'created_at':
795 case 'created-at':
796 case 'updated_at':
797 case 'updated-at':
798 if ( isset($atts['format']) ) {
799 $time_format = ' ';
800 } else {
801 $atts['format'] = get_option('date_format');
802 $time_format = '';
803 }
804
805 $this_tag = str_replace('-', '_', $tag);
806 $replace_with = FrmAppHelper::get_formatted_time($entry->{$this_tag}, $atts['format'], $time_format);
807 unset($this_tag);
808 break;
809
810 case 'created_by':
811 case 'created-by':
812 case 'updated_by':
813 case 'updated-by':
814 $this_tag = str_replace('-', '_', $tag);
815 $replace_with = self::get_display_value( $entry->{$this_tag}, (object) array( 'type' => 'user_id' ), $atts );
816 unset($this_tag);
817 break;
818
819 case 'admin_email':
820 case 'siteurl':
821 case 'frmurl':
822 case 'sitename':
823 case 'get':
824 $replace_with = self::dynamic_default_values( $tag, $atts );
825 break;
826
827 default:
828 $field = FrmField::getOne( $tag );
829 if ( ! $field ) {
830 break;
831 }
832
833 $sep = isset($atts['sep']) ? $atts['sep'] : ', ';
834
835 $replace_with = FrmEntryMeta::get_meta_value( $entry, $field->id );
836
837 $atts['entry_id'] = $entry->id;
838 $atts['entry_key'] = $entry->item_key;
839
840 if ( isset($atts['show']) && $atts['show'] == 'field_label' ) {
841 $replace_with = $field->name;
842 } else if ( isset($atts['show']) && $atts['show'] == 'description' ) {
843 $replace_with = $field->description;
844 } else {
845 $string_value = $replace_with;
846 if ( is_array( $replace_with ) ) {
847 $string_value = implode( $sep, $replace_with );
848 }
849
850 if ( empty( $string_value ) && $string_value != '0' ) {
851 $replace_with = '';
852 } else {
853 $replace_with = self::get_display_value( $replace_with, $field, $atts );
854 }
855 }
856
857 unset($field);
858 }
859
860 if ( isset($replace_with) ) {
861 $content = str_replace( $shortcodes[0][ $short_key ], $replace_with, $content );
862 }
863
864 unset($atts, $conditional, $replace_with);
865 }
866
867 return $content;
868 }
869
870 /**
871 * Get the value to replace a few standard shortcodes
872 *
873 * @since 2.0
874 * @return string
875 */
876 public static function dynamic_default_values( $tag, $atts = array(), $return_array = false ) {
877 $new_value = '';
878 switch ( $tag ) {
879 case 'admin_email':
880 $new_value = get_option('admin_email');
881 break;
882 case 'siteurl':
883 $new_value = FrmAppHelper::site_url();
884 break;
885 case 'frmurl':
886 $new_value = FrmAppHelper::plugin_url();
887 break;
888 case 'sitename':
889 $new_value = FrmAppHelper::site_name();
890 break;
891 case 'get':
892 $new_value = self::process_get_shortcode( $atts, $return_array );
893 break;
894 }
895
896 return $new_value;
897 }
898
899 /**
900 * Process the [get] shortcode
901 *
902 * @since 2.0
903 * @return string|array
904 */
905 public static function process_get_shortcode( $atts, $return_array = false ) {
906 if ( ! isset($atts['param']) ) {
907 return '';
908 }
909
910 if ( strpos($atts['param'], '&#91;') ) {
911 $atts['param'] = str_replace('&#91;', '[', $atts['param']);
912 $atts['param'] = str_replace('&#93;', ']', $atts['param']);
913 }
914
915 $new_value = FrmAppHelper::get_param( $atts['param'], '', 'get', 'sanitize_text_field' );
916 $new_value = FrmAppHelper::get_query_var( $new_value, $atts['param'] );
917
918 if ( $new_value == '' ) {
919 if ( ! isset($atts['prev_val']) ) {
920 $atts['prev_val'] = '';
921 }
922
923 $new_value = isset($atts['default']) ? $atts['default'] : $atts['prev_val'];
924 }
925
926 if ( is_array($new_value) && ! $return_array ) {
927 $new_value = implode(', ', $new_value);
928 }
929
930 return $new_value;
931 }
932
933 public static function get_display_value( $replace_with, $field, $atts = array() ) {
934 $sep = isset( $atts['sep'] ) ? $atts['sep'] : ', ';
935
936 $replace_with = apply_filters( 'frm_get_' . $field->type . '_display_value', $replace_with, $field, $atts );
937 $replace_with = apply_filters( 'frm_get_display_value', $replace_with, $field, $atts );
938
939 if ( $field->type == 'textarea' || $field->type == 'rte' ) {
940 $autop = isset($atts['wpautop']) ? $atts['wpautop'] : true;
941 if ( apply_filters('frm_use_wpautop', $autop) ) {
942 if ( is_array($replace_with) ) {
943 $replace_with = implode("\n", $replace_with);
944 }
945 $replace_with = wpautop($replace_with);
946 }
947 unset( $autop );
948 } else if ( is_array( $replace_with ) ) {
949 if ( isset( $atts['show'] ) && $atts['show'] && isset( $replace_with[ $atts['show'] ] ) ) {
950 $replace_with = $replace_with[ $atts['show'] ];
951 } else {
952 $replace_with = implode( $sep, $replace_with );
953 }
954 }
955
956 return $replace_with;
957 }
958
959 public static function get_field_types( $type ) {
960 $single_input = array( 'text', 'textarea', 'rte', 'number', 'email', 'url', 'image', 'file', 'date', 'phone', 'hidden', 'time', 'user_id', 'tag', 'password' );
961 $multiple_input = array( 'radio', 'checkbox', 'select', 'scale', 'lookup' );
962 $other_type = array( 'html', 'break' );
963
964 $field_selection = array_merge( FrmField::pro_field_selection(), FrmField::field_selection() );
965
966 $field_types = array();
967 if ( in_array($type, $single_input) ) {
968 self::field_types_for_input( $single_input, $field_selection, $field_types );
969 } else if ( in_array($type, $multiple_input) ) {
970 self::field_types_for_input( $multiple_input, $field_selection, $field_types );
971 } else if ( in_array($type, $other_type) ) {
972 self::field_types_for_input( $other_type, $field_selection, $field_types );
973 } else if ( isset( $field_selection[ $type ] ) ) {
974 $field_types[ $type ] = $field_selection[ $type ];
975 }
976
977 $field_types = apply_filters( 'frm_switch_field_types', $field_types, compact( 'type' ) );
978 return $field_types;
979 }
980
981 private static function field_types_for_input( $inputs, $fields, &$field_types ) {
982 foreach ( $inputs as $input ) {
983 $field_types[ $input ] = $fields[ $input ];
984 unset($input);
985 }
986 }
987
988 /**
989 * Check if current field option is an "other" option
990 *
991 * @since 2.0.6
992 *
993 * @param string $opt_key
994 * @return boolean Returns true if current field option is an "Other" option
995 */
996 public static function is_other_opt( $opt_key ) {
997 return $opt_key && strpos( $opt_key, 'other_' ) === 0;
998 }
999
1000 /**
1001 * Get value that belongs in "Other" text box
1002 *
1003 * @since 2.0.6
1004 *
1005 * @param array $args
1006 */
1007 public static function get_other_val( $args ) {
1008 $defaults = array(
1009 'opt_key' => 0,
1010 'field' => array(),
1011 'parent' => false,
1012 'pointer' => false,
1013 );
1014 $args = wp_parse_args( $args, $defaults );
1015
1016 $opt_key = $args['opt_key'];
1017 $field = $args['field'];
1018 $parent = $args['parent'];
1019 $pointer = $args['pointer'];
1020 $other_val = '';
1021
1022 // If option is an "other" option and there is a value set for this field,
1023 // check if the value belongs in the current "Other" option text field
1024 if ( ! FrmFieldsHelper::is_other_opt( $opt_key ) || ! FrmField::is_option_true( $field, 'value' ) ) {
1025 return $other_val;
1026 }
1027
1028 // Check posted vals before checking saved values
1029
1030 // For fields inside repeating sections - note, don't check if $pointer is true because it will often be zero
1031 if ( $parent && isset( $_POST['item_meta'][ $parent ][ $pointer ]['other'][ $field['id'] ] ) ) {
1032 if ( FrmField::is_field_with_multiple_values( $field ) ) {
1033 $other_val = isset( $_POST['item_meta'][ $parent ][ $pointer ]['other'][ $field['id'] ][ $opt_key ] ) ? sanitize_text_field( $_POST['item_meta'][ $parent ][ $pointer ]['other'][ $field['id'] ][ $opt_key ] ) : '';
1034 } else {
1035 $other_val = sanitize_text_field( $_POST['item_meta'][ $parent ][ $pointer ]['other'][ $field['id'] ] );
1036 }
1037 return $other_val;
1038
1039 } else if ( isset( $field['id'] ) && isset( $_POST['item_meta']['other'][ $field['id'] ] ) ) {
1040 // For normal fields
1041
1042 if ( FrmField::is_field_with_multiple_values( $field ) ) {
1043 $other_val = isset( $_POST['item_meta']['other'][ $field['id'] ][ $opt_key ] ) ? sanitize_text_field( $_POST['item_meta']['other'][ $field['id'] ][ $opt_key ] ) : '';
1044 } else {
1045 $other_val = sanitize_text_field( $_POST['item_meta']['other'][ $field['id'] ] );
1046 }
1047 return $other_val;
1048 }
1049
1050 // For checkboxes
1051 if ( $field['type'] == 'checkbox' && is_array( $field['value'] ) ) {
1052 // Check if there is an "other" val in saved value and make sure the
1053 // "other" val is not equal to the Other checkbox option
1054 if ( isset( $field['value'][ $opt_key ] ) && $field['options'][ $opt_key ] != $field['value'][ $opt_key ] ) {
1055 $other_val = $field['value'][ $opt_key ];
1056 }
1057 } else {
1058 /**
1059 * For radio buttons and dropdowns
1060 * Check if saved value equals any of the options. If not, set it as the other value.
1061 */
1062 foreach ( $field['options'] as $opt_key => $opt_val ) {
1063 $temp_val = is_array( $opt_val ) ? $opt_val['value'] : $opt_val;
1064 // Multi-select dropdowns - key is not preserved
1065 if ( is_array( $field['value'] ) ) {
1066 $o_key = array_search( $temp_val, $field['value'] );
1067 if ( isset( $field['value'][ $o_key ] ) ) {
1068 unset( $field['value'][ $o_key ], $o_key );
1069 }
1070 } else if ( $temp_val == $field['value'] ) {
1071 // For radio and regular dropdowns
1072 return '';
1073 } else {
1074 $other_val = $field['value'];
1075 }
1076 unset( $opt_key, $opt_val, $temp_val );
1077 }
1078 // For multi-select dropdowns only
1079 if ( is_array( $field['value'] ) && ! empty( $field['value'] ) ) {
1080 $other_val = reset( $field['value'] );
1081 }
1082 }
1083
1084 return $other_val;
1085 }
1086
1087 /**
1088 * Check if there is a saved value for the "Other" text field. If so, set it as the $other_val.
1089 * Intended for front-end use
1090 *
1091 * @since 2.0.6
1092 *
1093 * @param array $args should include field, opt_key and field name
1094 * @param boolean $other_opt
1095 * @param string $checked
1096 * @return string $other_val
1097 */
1098 public static function prepare_other_input( $args, &$other_opt, &$checked ) {
1099 //Check if this is an "Other" option
1100 if ( ! self::is_other_opt( $args['opt_key'] ) ) {
1101 return;
1102 }
1103
1104 $other_opt = true;
1105 $other_args = array();
1106
1107 self::set_other_name( $args, $other_args );
1108 self::set_other_value( $args, $other_args );
1109
1110 if ( $other_args['value'] ) {
1111 $checked = 'checked="checked" ';
1112 }
1113
1114 return $other_args;
1115 }
1116
1117 /**
1118 * @param array $args
1119 * @param array $other_args
1120 * @since 2.0.6
1121 */
1122 private static function set_other_name( $args, &$other_args ) {
1123 //Set up name for other field
1124 $other_args['name'] = str_replace( '[]', '', $args['field_name'] );
1125 $other_args['name'] = preg_replace('/\[' . $args['field']['id'] . '\]$/', '', $other_args['name']);
1126 $other_args['name'] = $other_args['name'] . '[other]' . '[' . $args['field']['id'] . ']';
1127
1128 //Converts item_meta[field_id] => item_meta[other][field_id] and
1129 //item_meta[parent][0][field_id] => item_meta[parent][0][other][field_id]
1130 if ( FrmField::is_field_with_multiple_values( $args['field'] ) ) {
1131 $other_args['name'] .= '[' . $args['opt_key'] . ']';
1132 }
1133 }
1134
1135 /**
1136 * Find the parent and pointer, and get text for "other" text field
1137 * @param array $args
1138 * @param array $other_args
1139 *
1140 * @since 2.0.6
1141 */
1142 private static function set_other_value( $args, &$other_args ) {
1143 $parent = '';
1144 $pointer = '';
1145
1146 // Check for parent ID and pointer
1147 $temp_array = explode( '[', $args['field_name'] );
1148
1149 // Count should only be greater than 3 if inside of a repeating section
1150 if ( count( $temp_array ) > 3 ) {
1151 $parent = str_replace( ']', '', $temp_array[1] );
1152 $pointer = str_replace( ']', '', $temp_array[2]);
1153 }
1154
1155 // Get text for "other" text field
1156 $other_args['value'] = self::get_other_val( array(
1157 'opt_key' => $args['opt_key'],
1158 'field' => $args['field'],
1159 'parent' => $parent,
1160 'pointer' => $pointer,
1161 ) );
1162 }
1163
1164 /**
1165 * If this field includes an other option, show it
1166 * @param $args array
1167 * @since 2.0.6
1168 */
1169 public static function include_other_input( $args ) {
1170 if ( ! $args['other_opt'] ) {
1171 return;
1172 }
1173
1174 $classes = array( 'frm_other_input' );
1175 if ( ! $args['checked'] || trim( $args['checked'] ) == '' ) {
1176 // hide the field if the other option is not selected
1177 $classes[] = 'frm_pos_none';
1178 }
1179 if ( $args['field']['type'] == 'select' && $args['field']['multiple'] ) {
1180 $classes[] = 'frm_other_full';
1181 }
1182
1183 // Set up HTML ID for Other field
1184 $other_id = self::get_other_field_html_id( $args['field']['type'], $args['html_id'], $args['opt_key'] );
1185
1186 echo '<input type="text" id="' . esc_attr( $other_id ) . '" class="' . sanitize_text_field( implode( ' ', $classes ) ) . '" ' . ( $args['read_only'] ? ' readonly="readonly" disabled="disabled"' : '' ) . ' name="' . esc_attr( $args['name'] ) . '" value="' . esc_attr( $args['value'] ) . '" />';
1187 }
1188
1189 /**
1190 * Get the HTML id for an "Other" text field
1191 * Note: This does not affect fields in repeating sections
1192 *
1193 * @since 2.0.08
1194 * @param string $type - field type
1195 * @param string $html_id
1196 * @param string|boolean $opt_key
1197 * @return string $other_id
1198 */
1199 public static function get_other_field_html_id( $type, $html_id, $opt_key = false ) {
1200 $other_id = $html_id;
1201
1202 // If hidden radio field, add an opt key of 0
1203 if ( $type == 'radio' && $opt_key === false ) {
1204 $opt_key = 0;
1205 }
1206
1207 if ( $opt_key !== false ) {
1208 $other_id .= '-' . $opt_key;
1209 }
1210
1211 $other_id .= '-otext';
1212
1213 return $other_id;
1214 }
1215
1216 public static function clear_on_focus_html( $field, $display, $id = '' ) {
1217 if ( $display['clear_on_focus'] ) {
1218 $has_default_value = ! empty( $field['default_value'] );
1219 echo '<span id="frm_clear_on_focus_' . esc_attr( $field['id'] . $id ) . '" class="frm-show-click">';
1220
1221 if ( $display['default_blank'] ) {
1222 self::show_default_blank_js( $field['default_blank'], $has_default_value );
1223 echo '<input type="hidden" name="field_options[default_blank_' . esc_attr( $field['id'] ) . ']" value="' . esc_attr( $field['default_blank'] ) . '" />';
1224 }
1225
1226 self::show_onfocus_js( $field['clear_on_focus'], $has_default_value );
1227 echo '<input type="hidden" name="field_options[clear_on_focus_' . esc_attr( $field['id'] ) . ']" value="' . esc_attr( $field['clear_on_focus'] ) . '" />';
1228
1229 echo '</span>';
1230 }
1231 }
1232
1233 public static function show_onfocus_js( $is_selected, $has_default_value = true ) {
1234 $atts = array(
1235 'icon' => 'frm_reload_icon',
1236 'message' => $is_selected ? __( 'Clear default value when typing', 'formidable' ) : __( 'Do not clear default value when typing', 'formidable' ),
1237 'is_selected' => $is_selected,
1238 'has_default' => $has_default_value,
1239 );
1240 self::show_icon_link_js( $atts );
1241 }
1242
1243 public static function show_default_blank_js( $is_selected, $has_default_value = true ) {
1244 $atts = array(
1245 'icon' => 'frm_error_icon',
1246 'message' => $is_selected ? __( 'Default value will NOT pass form validation', 'formidable' ) : __( 'Default value will pass form validation', 'formidable' ),
1247 'is_selected' => $is_selected,
1248 'has_default' => $has_default_value,
1249 );
1250 self::show_icon_link_js( $atts );
1251 }
1252
1253 public static function show_icon_link_js( $atts ) {
1254 $atts['icon'] .= $atts['is_selected'] ? ' ' : ' frm_inactive_icon ';
1255 if ( isset( $atts['has_default'] ) && ! $atts['has_default'] ) {
1256 $atts['icon'] .= 'frm_hidden ';
1257 }
1258 echo '<a href="javascript:void(0)" class="frm_bstooltip ' . esc_attr( $atts['icon'] ) . 'frm_default_val_icons frm_action_icon frm_icon_font" title="' . esc_attr( $atts['message'] ) . '"></a>';
1259 }
1260
1261 public static function switch_field_ids( $val ) {
1262 global $frm_duplicate_ids;
1263 $replace = array();
1264 $replace_with = array();
1265 foreach ( (array) $frm_duplicate_ids as $old => $new ) {
1266 $replace[] = '[if ' . $old . ']';
1267 $replace_with[] = '[if ' . $new . ']';
1268 $replace[] = '[if ' . $old . ' ';
1269 $replace_with[] = '[if ' . $new . ' ';
1270 $replace[] = '[/if ' . $old . ']';
1271 $replace_with[] = '[/if ' . $new . ']';
1272 $replace[] = '[foreach ' . $old . ']';
1273 $replace_with[] = '[foreach ' . $new . ']';
1274 $replace[] = '[/foreach ' . $old . ']';
1275 $replace_with[] = '[/foreach ' . $new . ']';
1276 $replace[] = '[' . $old . ']';
1277 $replace_with[] = '[' . $new . ']';
1278 $replace[] = '[' . $old . ' ';
1279 $replace_with[] = '[' . $new . ' ';
1280 unset($old, $new);
1281 }
1282 if ( is_array( $val ) ) {
1283 foreach ( $val as $k => $v ) {
1284 $val[ $k ] = str_replace( $replace, $replace_with, $v );
1285 unset($k, $v);
1286 }
1287 } else {
1288 $val = str_replace($replace, $replace_with, $val);
1289 }
1290
1291 return $val;
1292 }
1293
1294 public static function get_us_states() {
1295 return apply_filters( 'frm_us_states', array(
1296 'AL' => 'Alabama',
1297 'AK' => 'Alaska',
1298 'AR' => 'Arkansas',
1299 'AZ' => 'Arizona',
1300 'CA' => 'California',
1301 'CO' => 'Colorado',
1302 'CT' => 'Connecticut',
1303 'DE' => 'Delaware',
1304 'DC' => 'District of Columbia',
1305 'FL' => 'Florida',
1306 'GA' => 'Georgia',
1307 'HI' => 'Hawaii',
1308 'ID' => 'Idaho',
1309 'IL' => 'Illinois',
1310 'IN' => 'Indiana',
1311 'IA' => 'Iowa',
1312 'KS' => 'Kansas',
1313 'KY' => 'Kentucky',
1314 'LA' => 'Louisiana',
1315 'ME' => 'Maine',
1316 'MD' => 'Maryland',
1317 'MA' => 'Massachusetts',
1318 'MI' => 'Michigan',
1319 'MN' => 'Minnesota',
1320 'MS' => 'Mississippi',
1321 'MO' => 'Missouri',
1322 'MT' => 'Montana',
1323 'NE' => 'Nebraska',
1324 'NV' => 'Nevada',
1325 'NH' => 'New Hampshire',
1326 'NJ' => 'New Jersey',
1327 'NM' => 'New Mexico',
1328 'NY' => 'New York',
1329 'NC' => 'North Carolina',
1330 'ND' => 'North Dakota',
1331 'OH' => 'Ohio',
1332 'OK' => 'Oklahoma',
1333 'OR' => 'Oregon',
1334 'PA' => 'Pennsylvania',
1335 'RI' => 'Rhode Island',
1336 'SC' => 'South Carolina',
1337 'SD' => 'South Dakota',
1338 'TN' => 'Tennessee',
1339 'TX' => 'Texas',
1340 'UT' => 'Utah',
1341 'VT' => 'Vermont',
1342 'VA' => 'Virginia',
1343 'WA' => 'Washington',
1344 'WV' => 'West Virginia',
1345 'WI' => 'Wisconsin',
1346 'WY' => 'Wyoming',
1347 ) );
1348 }
1349
1350 public static function get_countries() {
1351 return apply_filters( 'frm_countries', array( __( 'Afghanistan', 'formidable' ), __( 'Albania', 'formidable' ), __( 'Algeria', 'formidable' ), __( 'American Samoa', 'formidable' ), __( 'Andorra', 'formidable' ), __( 'Angola', 'formidable' ), __( 'Anguilla', 'formidable' ), __( 'Antarctica', 'formidable' ), __( 'Antigua and Barbuda', 'formidable' ), __( 'Argentina', 'formidable' ), __( 'Armenia', 'formidable' ), __( 'Aruba', 'formidable' ), __( 'Australia', 'formidable' ), __( 'Austria', 'formidable' ), __( 'Azerbaijan', 'formidable' ), __( 'Bahamas', 'formidable' ), __( 'Bahrain', 'formidable' ), __( 'Bangladesh', 'formidable' ), __( 'Barbados', 'formidable' ), __( 'Belarus', 'formidable' ), __( 'Belgium', 'formidable' ), __( 'Belize', 'formidable' ), __( 'Benin', 'formidable' ), __( 'Bermuda', 'formidable' ), __( 'Bhutan', 'formidable' ), __( 'Bolivia', 'formidable' ), __( 'Bosnia and Herzegovina', 'formidable' ), __( 'Botswana', 'formidable' ), __( 'Brazil', 'formidable' ), __( 'Brunei', 'formidable' ), __( 'Bulgaria', 'formidable' ), __( 'Burkina Faso', 'formidable' ), __( 'Burundi', 'formidable' ), __( 'Cambodia', 'formidable' ), __( 'Cameroon', 'formidable' ), __( 'Canada', 'formidable' ), __( 'Cape Verde', 'formidable' ), __( 'Cayman Islands', 'formidable' ), __( 'Central African Republic', 'formidable' ), __( 'Chad', 'formidable' ), __( 'Chile', 'formidable' ), __( 'China', 'formidable' ), __( 'Colombia', 'formidable' ), __( 'Comoros', 'formidable' ), __( 'Congo', 'formidable' ), __( 'Costa Rica', 'formidable' ), __( 'C&ocirc;te d\'Ivoire', 'formidable' ), __( 'Croatia', 'formidable' ), __( 'Cuba', 'formidable' ), __( 'Cyprus', 'formidable' ), __( 'Czech Republic', 'formidable' ), __( 'Denmark', 'formidable' ), __( 'Djibouti', 'formidable' ), __( 'Dominica', 'formidable' ), __( 'Dominican Republic', 'formidable' ), __( 'East Timor', 'formidable' ), __( 'Ecuador', 'formidable' ), __( 'Egypt', 'formidable' ), __( 'El Salvador', 'formidable' ), __( 'Equatorial Guinea', 'formidable' ), __( 'Eritrea', 'formidable' ), __( 'Estonia', 'formidable' ), __( 'Ethiopia', 'formidable' ), __( 'Fiji', 'formidable' ), __( 'Finland', 'formidable' ), __( 'France', 'formidable' ), __( 'French Guiana', 'formidable' ), __( 'French Polynesia', 'formidable' ), __( 'Gabon', 'formidable' ), __( 'Gambia', 'formidable' ), __( 'Georgia', 'formidable' ), __( 'Germany', 'formidable' ), __( 'Ghana', 'formidable' ), __( 'Gibraltar', 'formidable' ), __( 'Greece', 'formidable' ), __( 'Greenland', 'formidable' ), __( 'Grenada', 'formidable' ), __( 'Guam', 'formidable' ), __( 'Guatemala', 'formidable' ), __( 'Guinea', 'formidable' ), __( 'Guinea-Bissau', 'formidable' ), __( 'Guyana', 'formidable' ), __( 'Haiti', 'formidable' ), __( 'Honduras', 'formidable' ), __( 'Hong Kong', 'formidable' ), __( 'Hungary', 'formidable' ), __( 'Iceland', 'formidable' ), __( 'India', 'formidable' ), __( 'Indonesia', 'formidable' ), __( 'Iran', 'formidable' ), __( 'Iraq', 'formidable' ), __( 'Ireland', 'formidable' ), __( 'Israel', 'formidable' ), __( 'Italy', 'formidable' ), __( 'Jamaica', 'formidable' ), __( 'Japan', 'formidable' ), __( 'Jordan', 'formidable' ), __( 'Kazakhstan', 'formidable' ), __( 'Kenya', 'formidable' ), __( 'Kiribati', 'formidable' ), __( 'North Korea', 'formidable' ), __( 'South Korea', 'formidable' ), __( 'Kuwait', 'formidable' ), __( 'Kyrgyzstan', 'formidable' ), __( 'Laos', 'formidable' ), __( 'Latvia', 'formidable' ), __( 'Lebanon', 'formidable' ), __( 'Lesotho', 'formidable' ), __( 'Liberia', 'formidable' ), __( 'Libya', 'formidable' ), __( 'Liechtenstein', 'formidable' ), __( 'Lithuania', 'formidable' ), __( 'Luxembourg', 'formidable' ), __( 'Macedonia', 'formidable' ), __( 'Madagascar', 'formidable' ), __( 'Malawi', 'formidable' ), __( 'Malaysia', 'formidable' ), __( 'Maldives', 'formidable' ), __( 'Mali', 'formidable' ), __( 'Malta', 'formidable' ), __( 'Marshall Islands', 'formidable' ), __( 'Mauritania', 'formidable' ), __( 'Mauritius', 'formidable' ), __( 'Mexico', 'formidable' ), __( 'Micronesia', 'formidable' ), __( 'Moldova', 'formidable' ), __( 'Monaco', 'formidable' ), __( 'Mongolia', 'formidable' ), __( 'Montenegro', 'formidable' ), __( 'Montserrat', 'formidable' ), __( 'Morocco', 'formidable' ), __( 'Mozambique', 'formidable' ), __( 'Myanmar', 'formidable' ), __( 'Namibia', 'formidable' ), __( 'Nauru', 'formidable' ), __( 'Nepal', 'formidable' ), __( 'Netherlands', 'formidable' ), __( 'New Zealand', 'formidable' ), __( 'Nicaragua', 'formidable' ), __( 'Niger', 'formidable' ), __( 'Nigeria', 'formidable' ), __( 'Norway', 'formidable' ), __( 'Northern Mariana Islands', 'formidable' ), __( 'Oman', 'formidable' ), __( 'Pakistan', 'formidable' ), __( 'Palau', 'formidable' ), __( 'Palestine', 'formidable' ), __( 'Panama', 'formidable' ), __( 'Papua New Guinea', 'formidable' ), __( 'Paraguay', 'formidable' ), __( 'Peru', 'formidable' ), __( 'Philippines', 'formidable' ), __( 'Poland', 'formidable' ), __( 'Portugal', 'formidable' ), __( 'Puerto Rico', 'formidable' ), __( 'Qatar', 'formidable' ), __( 'Romania', 'formidable' ), __( 'Russia', 'formidable' ), __( 'Rwanda', 'formidable' ), __( 'Saint Kitts and Nevis', 'formidable' ), __( 'Saint Lucia', 'formidable' ), __( 'Saint Vincent and the Grenadines', 'formidable' ), __( 'Samoa', 'formidable' ), __( 'San Marino', 'formidable' ), __( 'Sao Tome and Principe', 'formidable' ), __( 'Saudi Arabia', 'formidable' ), __( 'Senegal', 'formidable' ), __( 'Serbia and Montenegro', 'formidable' ), __( 'Seychelles', 'formidable' ), __( 'Sierra Leone', 'formidable' ), __( 'Singapore', 'formidable' ), __( 'Slovakia', 'formidable' ), __( 'Slovenia', 'formidable' ), __( 'Solomon Islands', 'formidable' ), __( 'Somalia', 'formidable' ), __( 'South Africa', 'formidable' ), __( 'South Sudan', 'formidable' ), __( 'Spain', 'formidable' ), __( 'Sri Lanka', 'formidable' ), __( 'Sudan', 'formidable' ), __( 'Suriname', 'formidable' ), __( 'Swaziland', 'formidable' ), __( 'Sweden', 'formidable' ), __( 'Switzerland', 'formidable' ), __( 'Syria', 'formidable' ), __( 'Taiwan', 'formidable' ), __( 'Tajikistan', 'formidable' ), __( 'Tanzania', 'formidable' ), __( 'Thailand', 'formidable' ), __( 'Togo', 'formidable' ), __( 'Tonga', 'formidable' ), __( 'Trinidad and Tobago', 'formidable' ), __( 'Tunisia', 'formidable' ), __( 'Turkey', 'formidable' ), __( 'Turkmenistan', 'formidable' ), __( 'Tuvalu', 'formidable' ), __( 'Uganda', 'formidable' ), __( 'Ukraine', 'formidable' ), __( 'United Arab Emirates', 'formidable' ), __( 'United Kingdom', 'formidable' ), __( 'United States', 'formidable' ), __( 'Uruguay', 'formidable' ), __( 'Uzbekistan', 'formidable' ), __( 'Vanuatu', 'formidable' ), __( 'Vatican City', 'formidable' ), __( 'Venezuela', 'formidable' ), __( 'Vietnam', 'formidable' ), __( 'Virgin Islands, British', 'formidable' ), __( 'Virgin Islands, U.S.', 'formidable' ), __( 'Yemen', 'formidable' ), __( 'Zambia', 'formidable' ), __( 'Zimbabwe', 'formidable' ) ) );
1352 }
1353
1354 public static function get_bulk_prefilled_opts( array &$prepop ) {
1355 $prepop[ __( 'Countries', 'formidable' ) ] = FrmFieldsHelper::get_countries();
1356
1357 $states = FrmFieldsHelper::get_us_states();
1358 $state_abv = array_keys($states);
1359 sort($state_abv);
1360 $prepop[ __( 'U.S. State Abbreviations', 'formidable' ) ] = $state_abv;
1361
1362 $states = array_values($states);
1363 sort($states);
1364 $prepop[ __( 'U.S. States', 'formidable' ) ] = $states;
1365 unset($state_abv, $states);
1366
1367 $prepop[ __( 'Age', 'formidable' ) ] = array(
1368 __( 'Under 18', 'formidable' ),
1369 __( '18-24', 'formidable' ),
1370 __( '25-34', 'formidable' ),
1371 __( '35-44', 'formidable' ),
1372 __( '45-54', 'formidable' ),
1373 __( '55-64', 'formidable' ),
1374 __( '65 or Above', 'formidable' ),
1375 __( 'Prefer Not to Answer', 'formidable' ),
1376 );
1377
1378 $prepop[ __( 'Satisfaction', 'formidable' ) ] = array(
1379 __( 'Very Satisfied', 'formidable' ),
1380 __( 'Satisfied', 'formidable' ),
1381 __( 'Neutral', 'formidable' ),
1382 __( 'Unsatisfied', 'formidable' ),
1383 __( 'Very Unsatisfied', 'formidable' ),
1384 __( 'N/A', 'formidable' ),
1385 );
1386
1387 $prepop[ __( 'Importance', 'formidable' ) ] = array(
1388 __( 'Very Important', 'formidable' ),
1389 __( 'Important', 'formidable' ),
1390 __( 'Neutral', 'formidable' ),
1391 __( 'Somewhat Important', 'formidable' ),
1392 __( 'Not at all Important', 'formidable' ),
1393 __( 'N/A', 'formidable' ),
1394 );
1395
1396 $prepop[ __( 'Agreement', 'formidable' ) ] = array(
1397 __( 'Strongly Agree', 'formidable' ),
1398 __( 'Agree', 'formidable' ),
1399 __( 'Neutral', 'formidable' ),
1400 __( 'Disagree', 'formidable' ),
1401 __( 'Strongly Disagree', 'formidable' ),
1402 __( 'N/A', 'formidable' ),
1403 );
1404
1405 $prepop = apply_filters( 'frm_bulk_field_choices', $prepop );
1406 }
1407
1408 /**
1409 * Display a field value selector
1410 *
1411 * @since 2.03.05
1412 *
1413 * @param int $selector_field_id
1414 * @param array $selector_args
1415 */
1416 public static function display_field_value_selector( $selector_field_id, $selector_args ) {
1417 $field_value_selector = FrmFieldFactory::create_field_value_selector( $selector_field_id, $selector_args );
1418 $field_value_selector->display();
1419 }
1420
1421 /**
1422 * Convert a field object to a flat array
1423 *
1424 * @since 2.03.05
1425 *
1426 * @param object $field
1427 *
1428 * @return array
1429 */
1430 public static function convert_field_object_to_flat_array( $field ) {
1431 $field_options = $field->field_options;
1432 $field_array = get_object_vars( $field );
1433 unset( $field_array['field_options'] );
1434 return $field_array + $field_options;
1435 }
1436
1437 public static function field_selection() {
1438 _deprecated_function( __FUNCTION__, '2.0.9', 'FrmField::field_selection' );
1439 return FrmField::field_selection();
1440 }
1441
1442 public static function pro_field_selection() {
1443 _deprecated_function( __FUNCTION__, '2.0.9', 'FrmField::pro_field_selection' );
1444 return FrmField::pro_field_selection();
1445 }
1446
1447 public static function is_no_save_field( $type ) {
1448 _deprecated_function( __FUNCTION__, '2.0.9', 'FrmField::is_no_save_field' );
1449 return FrmField::is_no_save_field( $type );
1450 }
1451
1452 public static function no_save_fields() {
1453 _deprecated_function( __FUNCTION__, '2.0.9', 'FrmField::no_save_fields' );
1454 return FrmField::no_save_fields();
1455 }
1456
1457 public static function is_multiple_select( $field ) {
1458 _deprecated_function( __FUNCTION__, '2.0.9', 'FrmField::is_multiple_select' );
1459 return FrmField::is_multiple_select( $field );
1460 }
1461
1462 public static function is_field_with_multiple_values( $field ) {
1463 _deprecated_function( __FUNCTION__, '2.0.9', 'FrmField::is_field_with_multiple_values' );
1464 return FrmField::is_field_with_multiple_values( $field );
1465 }
1466
1467 public static function is_required_field( $field ) {
1468 _deprecated_function( __FUNCTION__, '2.0.9', 'FrmField::is_required' );
1469 return FrmField::is_required( $field );
1470 }
1471
1472 public static function maybe_get_field( &$field ) {
1473 _deprecated_function( __FUNCTION__, '2.0.9', 'FrmField::maybe_get_field' );
1474 FrmField::maybe_get_field( $field );
1475 }
1476
1477 public static function dropdown_categories( $args ) {
1478 _deprecated_function( __FUNCTION__, '2.02.07', 'FrmProPost::get_category_dropdown' );
1479
1480 if ( FrmAppHelper::pro_is_installed() ) {
1481 $args['location'] = 'front';
1482 $dropdown = FrmProPost::get_category_dropdown( $args['field'], $args );
1483 } else {
1484 $dropdown = '';
1485 }
1486
1487 return $dropdown;
1488 }
1489 }
1490