PluginProbe ʕ •ᴥ•ʔ
Everest Forms – Contact Form, Payment Form, Quiz, Survey & Custom Form Builder with AI / 1.9.9
Everest Forms – Contact Form, Payment Form, Quiz, Survey & Custom Form Builder with AI v1.9.9
3.5.2 3.5.1 3.5.0 3.4.8 3.4.7 3.4.6 1.1.0 1.1.1 1.1.2 1.1.3 1.1.4 1.1.5 1.1.5.1 1.1.6 1.1.7 1.1.8 1.1.9 1.2.0 1.2.1 1.2.2 1.2.3 1.2.4 1.3.0 1.3.1 1.3.2 1.3.3 1.3.4 1.4.0 1.4.1 1.4.2 1.4.3 1.4.4 1.4.5 1.4.6 1.4.7 1.4.8 1.4.9 1.5.0 1.5.1 1.5.10 1.5.2 1.5.3 1.5.4 1.5.5 1.5.6 1.5.7 1.5.8 1.5.9 1.6.0 1.6.1 1.6.2 1.6.3 1.6.4 1.6.5 1.6.6 1.6.6.1 1.6.7 1.7.0 1.7.0.1 1.7.0.2 1.7.0.3 1.7.1 1.7.2 1.7.2.1 1.7.2.2 1.7.3 1.7.4 1.7.5 1.7.5.1 1.7.5.2 1.7.6 1.7.7 1.7.7.1 1.7.7.2 1.7.8 1.7.9 1.8.0 1.8.0.1 1.8.1 1.8.2 1.8.2.1 1.8.2.2 1.8.2.3 1.8.3 1.8.4 1.8.5 1.8.6 1.8.7 1.8.8 1.8.9 1.9.0 1.9.0.1 1.9.1 1.9.2 1.9.3 1.9.4 1.9.4.1 1.9.5 1.9.6 1.9.7 1.9.8 1.9.9 2.0.0 2.0.0.1 2.0.1 2.0.2 2.0.3 2.0.3.1 2.0.4 2.0.4.1 2.0.5 2.0.6 2.0.7 2.0.8 2.0.8.1 2.0.9 3.0.0 3.0.0.1 3.0.1 3.0.2 3.0.3 3.0.3.1 3.0.4 3.0.4.1 3.0.4.2 3.0.5 3.0.5.1 3.0.5.2 3.0.6 3.0.6.1 3.0.7.1 3.0.8 3.0.8.1 3.0.9 3.0.9.1 3.0.9.2 3.0.9.3 3.0.9.4 3.0.9.5 3.1.0 3.1.1 3.1.2 3.2.0 3.2.1 3.2.2 3.2.3 3.2.4 3.2.5 3.2.6 3.3.0 3.4.0 3.4.1 3.4.2 3.4.2.1 3.4.3 3.4.4 3.4.5 trunk 1.0 1.0.1 1.0.2 1.0.3
everest-forms / includes / abstracts / class-evf-form-fields.php
everest-forms / includes / abstracts Last commit date
legacy 6 years ago class-evf-background-process.php 7 years ago class-evf-deprecated-hooks.php 6 years ago class-evf-form-fields.php 3 years ago class-evf-integration.php 5 years ago class-evf-log-handler.php 6 years ago class-evf-session.php 8 years ago class-evf-settings-api.php 4 years ago
class-evf-form-fields.php
2547 lines
1 <?php
2 /**
3 * Abstract EVF_Form_Fields Class
4 *
5 * @version 1.0.0
6 * @package EverestFroms/Abstracts
7 */
8
9 defined( 'ABSPATH' ) || exit;
10
11 /**
12 * Form fields class.
13 */
14 abstract class EVF_Form_Fields {
15
16 /**
17 * Field name.
18 *
19 * @var string
20 */
21 public $name;
22
23 /**
24 * Field type.
25 *
26 * @var string
27 */
28 public $type;
29
30 /**
31 * Field icon.
32 *
33 * @var mixed
34 */
35 public $icon = '';
36
37 /**
38 * Field class.
39 *
40 * @var string
41 */
42 public $class = '';
43
44 /**
45 * Form ID.
46 *
47 * @var int|mixed
48 */
49 public $form_id;
50
51 /**
52 * Field group.
53 *
54 * @var string
55 */
56 public $group = 'general';
57
58 /**
59 * Is available in Pro?
60 *
61 * @var boolean
62 */
63 public $is_pro = false;
64
65 /**
66 * Placeholder to hold default value(s) for some field types.
67 *
68 * @var mixed
69 */
70 public $defaults;
71
72 /**
73 * Array of form data.
74 *
75 * @var array
76 */
77 public $form_data;
78
79 /**
80 * Array of field settings.
81 *
82 * @var array
83 */
84 protected $settings = array();
85
86 /**
87 * Constructor.
88 */
89 public function __construct() {
90 $this->class = $this->is_pro ? 'upgrade-modal' : $this->class;
91 $this->form_id = isset( $_GET['form_id'] ) ? absint( $_GET['form_id'] ) : false; // phpcs:ignore WordPress.Security.NonceVerification
92
93 // Init hooks.
94 $this->init_hooks();
95
96 // Hooks.
97 add_action( 'everest_forms_builder_fields_options_' . $this->type, array( $this, 'field_options' ) );
98 add_action( 'everest_forms_builder_fields_preview_' . $this->type, array( $this, 'field_preview' ) );
99 add_action( 'wp_ajax_everest_forms_new_field_' . $this->type, array( $this, 'field_new' ) );
100 add_action( 'everest_forms_display_field_' . $this->type, array( $this, 'field_display' ), 10, 3 );
101 add_action( 'everest_forms_display_edit_form_field_' . $this->type, array( $this, 'edit_form_field_display' ), 10, 3 );
102 add_action( 'everest_forms_process_validate_' . $this->type, array( $this, 'validate' ), 10, 3 );
103 add_action( 'everest_forms_process_format_' . $this->type, array( $this, 'format' ), 10, 4 );
104 add_filter( 'everest_forms_field_properties', array( $this, 'field_prefill_value_property' ), 10, 3 );
105 add_filter( 'everest_forms_field_exporter_' . $this->type, array( $this, 'field_exporter' ) );
106 }
107
108 /**
109 * Hook in tabs.
110 */
111 public function init_hooks() {}
112
113 /**
114 * Prefill field value with either fallback or dynamic data.
115 * Needs to be public (although internal) to be used in WordPress hooks.
116 *
117 * @since 1.6.5
118 *
119 * @param array $properties Field properties.
120 * @param array $field Current field specific data.
121 * @param array $form_data Prepared form data/settings.
122 *
123 * @return array Modified field properties.
124 */
125 public function field_prefill_value_property( $properties, $field, $form_data ) {
126 // Process only for current field.
127 if ( $this->type !== $field['type'] ) {
128 return $properties;
129 }
130
131 // Set the form data, so we can reuse it later, even on front-end.
132 $this->form_data = $form_data;
133
134 return $properties;
135 }
136
137 /**
138 * Get the form fields after they are initialized.
139 *
140 * @return array of options
141 */
142 public function get_field_settings() {
143 return apply_filters( 'everest_forms_get_field_settings_' . $this->type, $this->settings );
144 }
145
146 /**
147 * Output form fields options.
148 *
149 * Loops though the field options array and outputs each field.
150 *
151 * @param array $field Field data.
152 */
153 public function field_options( $field ) {
154 $settings = apply_filters( 'everest_forms_builder_fields_option', $this->get_field_settings() );
155
156 foreach ( $settings as $option_key => $option ) {
157 $this->field_option(
158 $option_key,
159 $field,
160 array(
161 'markup' => 'open',
162 )
163 );
164
165 if ( ! empty( $option['field_options'] ) ) {
166 foreach ( $option['field_options'] as $option_name ) {
167 $this->field_option( $option_name, $field );
168 }
169 }
170
171 $this->field_option(
172 $option_key,
173 $field,
174 array(
175 'markup' => 'close',
176 )
177 );
178 }
179 }
180
181 /**
182 * Field preview inside the builder.
183 *
184 * @since 1.0.0
185 *
186 * @param array $field Field data and settings.
187 */
188 public function field_preview( $field ) {}
189
190 /**
191 * Helper function to create field option elements.
192 *
193 * Field option elements are pieces that help create a field option.
194 * They are used to quickly build field options.
195 *
196 * @since 1.0.0
197 *
198 * @param string $option Field option to render.
199 * @param array $field Field data and settings.
200 * @param array $args Field preview arguments.
201 * @param boolean $echo Print or return the value. Print by default.
202 *
203 * @return mixed echo or return string
204 */
205 public function field_element( $option, $field, $args = array(), $echo = true ) {
206 $id = (string) $field['id'];
207 $class = ! empty( $args['class'] ) && is_string( $args['class'] ) ? esc_attr( $args['class'] ) : '';
208 $slug = ! empty( $args['slug'] ) ? sanitize_title( $args['slug'] ) : '';
209 $data = '';
210 $output = '';
211
212 if ( ! empty( $args['data'] ) ) {
213 foreach ( $args['data'] as $key => $val ) {
214 if ( is_array( $val ) ) {
215 $val = wp_json_encode( $val );
216 }
217 $data .= ' data-' . $key . '=\'' . $val . '\'';
218 }
219 }
220
221 // BW compat for number attrs.
222 if ( ! empty( $args['min'] ) ) {
223 $args['attrs']['min'] = esc_attr( $args['min'] );
224 unset( $args['min'] );
225 }
226 if ( ! empty( $args['max'] ) ) {
227 $args['attrs']['max'] = esc_attr( $args['max'] );
228 unset( $args['min'] );
229 }
230 if ( ! empty( $args['required'] ) && $args['required'] ) {
231 $args['attrs']['required'] = 'required';
232 unset( $args['required'] );
233 }
234
235 if ( ! empty( $args['attrs'] ) ) {
236 foreach ( $args['attrs'] as $arg_key => $val ) {
237 if ( is_array( $val ) ) {
238 $val = wp_json_encode( $val );
239 }
240 $data .= $arg_key . '=\'' . $val . '\'';
241 }
242 }
243
244 switch ( $option ) {
245
246 // Row.
247 case 'row':
248 $output = sprintf( '<div class="everest-forms-field-option-row everest-forms-field-option-row-%s %s" id="everest-forms-field-option-row-%s-%s" data-field-id="%s" %s>%s</div>', $slug, $class, $id, $slug, $id, $data, $args['content'] );
249 break;
250
251 // Icon.
252 case 'icon':
253 $element_tooltip = isset( $args['tooltip'] ) ? $args['tooltip'] : 'Edit Label';
254 $icon = isset( $args['icon'] ) ? $args['icon'] : 'dashicons-edit';
255 $output .= sprintf( ' <i class="dashicons %s everest-forms-icon %s" title="%s" %s></i>', esc_attr( $icon ), $class, esc_attr( $element_tooltip ), $data );
256 break;
257
258 // Label.
259 case 'label':
260 $output = sprintf( '<label for="everest-forms-field-option-%s-%s" class="%s" %s>%s', $id, $slug, $class, $data, esc_html( $args['value'] ) );
261 if ( isset( $args['tooltip'] ) && ! empty( $args['tooltip'] ) ) {
262 $output .= ' ' . sprintf( '<i class="dashicons dashicons-editor-help everest-forms-help-tooltip" title="%s"></i>', esc_attr( $args['tooltip'] ) );
263 }
264 if ( isset( $args['after_tooltip'] ) && ! empty( $args['after_tooltip'] ) ) {
265 $output .= $args['after_tooltip'];
266 }
267 $output .= '</label>';
268 break;
269
270 // Text input.
271 case 'text':
272 $type = ! empty( $args['type'] ) ? esc_attr( $args['type'] ) : 'text';
273 $placeholder = ! empty( $args['placeholder'] ) ? esc_attr( $args['placeholder'] ) : '';
274 $before = ! empty( $args['before'] ) ? '<span class="before-input">' . esc_html( $args['before'] ) . '</span>' : '';
275 if ( ! empty( $before ) ) {
276 $class .= ' has-before';
277 }
278
279 $output = sprintf( '%s<input type="%s" class="widefat %s" id="everest-forms-field-option-%s-%s" name="form_fields[%s][%s]" value="%s" placeholder="%s" %s>', $before, $type, $class, $id, $slug, $id, $slug, esc_attr( $args['value'] ), $placeholder, $data );
280 break;
281
282 // Textarea.
283 case 'textarea':
284 $rows = ! empty( $args['rows'] ) ? (int) $args['rows'] : '3';
285 $output = sprintf( '<textarea class="widefat %s" id="everest-forms-field-option-%s-%s" name="form_fields[%s][%s]" rows="%s" %s>%s</textarea>', $class, $id, $slug, $id, $slug, $rows, $data, $args['value'] );
286 break;
287
288 // Checkbox.
289 case 'checkbox':
290 $checked = checked( '1', $args['value'], false );
291 $output = sprintf( '<input type="checkbox" class="widefat %s" id="everest-forms-field-option-%s-%s" name="form_fields[%s][%s]" value="1" %s %s>', $class, $id, $slug, $id, $slug, $checked, $data );
292 $output .= sprintf( '<label for="everest-forms-field-option-%s-%s" class="inline">%s', $id, $slug, $args['desc'] );
293 if ( isset( $args['tooltip'] ) && ! empty( $args['tooltip'] ) ) {
294 $output .= ' ' . sprintf( '<i class="dashicons dashicons-editor-help everest-forms-help-tooltip" title="%s"></i>', esc_attr( $args['tooltip'] ) );
295 }
296 $output .= '</label>';
297 break;
298
299 // Toggle.
300 case 'toggle':
301 $checked = checked( '1', $args['value'], false );
302 $icon = $args['value'] ? 'fa-toggle-on' : 'fa-toggle-off';
303 $cls = $args['value'] ? 'everest-forms-on' : 'everest-forms-off';
304 $status = $args['value'] ? __( 'On', 'everest-forms' ) : __( 'Off', 'everest-forms' );
305 $output = sprintf( '<span class="everest-forms-toggle-icon %s"><i class="fa %s" aria-hidden="true"></i> <span class="everest-forms-toggle-icon-label">%s</span>', $cls, $icon, $status );
306 $output .= sprintf( '<input type="checkbox" class="widefat %s" id="everest-forms-field-option-%s-%s" name="form_fields[%s][%s]" value="1" %s %s></span>', $class, $id, $slug, $id, $slug, $checked, $data );
307 break;
308
309 // Select.
310 case 'select':
311 $options = $args['options'];
312 $value = isset( $args['value'] ) ? $args['value'] : '';
313 $is_multiple = isset( $args['multiple'] ) && true === $args['multiple'];
314
315 if ( true === $is_multiple ) {
316 $output = sprintf( '<select class="widefat %s" id="everest-forms-field-option-%s-%s" name="form_fields[%s][%s][]" %s multiple>', $class, $id, $slug, $id, $slug, $data );
317 } else {
318 $output = sprintf( '<select class="widefat %s" id="everest-forms-field-option-%s-%s" name="form_fields[%s][%s]" %s >', $class, $id, $slug, $id, $slug, $data );
319 }
320
321 foreach ( $options as $key => $option_value ) {
322
323 if ( true === $is_multiple && is_array( $value ) ) {
324 $selected_value = in_array( $key, $value, true ) ? 'selected="selected"' : '';
325 } else {
326 $selected_value = ( $value == $key ) ? 'selected="selected"' : '';
327 }
328 $output .= sprintf( '<option value="%s" %s>%s</option>', esc_attr( $key ), $selected_value, $option_value );
329 }
330 $output .= '</select>';
331 break;
332
333 // Radio.
334 case 'radio':
335 $options = $args['options'];
336 $default = isset( $args['default'] ) ? $args['default'] : '';
337 $output = '<label>' . $args['desc'];
338
339 if ( isset( $args['tooltip'] ) && ! empty( $args['tooltip'] ) ) {
340 $output .= ' ' . sprintf( '<i class="dashicons dashicons-editor-help everest-forms-help-tooltip" title="%s"></i></label>', esc_attr( $args['tooltip'] ) );
341 } else {
342 $output .= '</label>';
343 }
344 $output .= '<ul>';
345
346 foreach ( $options as $key => $option ) {
347 $output .= '<li>';
348 $output .= sprintf( '<label><input type="radio" class="widefat %s" id="everest-forms-field-option-%s-%s-%s" value="%s" name="form_fields[%s][%s]" %s %s>%s</label>', $class, $id, $slug, $key, $key, $id, $slug, $data, checked( $key, $default, false ), $option );
349 $output .= '</li>';
350 }
351 $output .= '</ul>';
352 break;
353 }
354
355 if ( $echo ) {
356 echo wp_kses( $output, evf_get_allowed_html_tags( 'builder' ) );
357 } else {
358 return $output;
359 }
360 }
361
362 /**
363 * Helper function to create common field options that are used frequently.
364 *
365 * @since 1.0.0
366 *
367 * @param string $option Option.
368 * @param array $field Field data.
369 * @param array $args Arguments.
370 * @param boolean $echo True to echo.
371 *
372 * @return mixed echo or return string
373 */
374 public function field_option( $option, $field, $args = array(), $echo = true ) {
375 $output = '';
376 $markup = ! empty( $args['markup'] ) ? $args['markup'] : 'open';
377 $class = ! empty( $args['class'] ) ? esc_html( $args['class'] ) : '';
378
379 if ( $echo && in_array( $option, array( 'basic-options', 'advanced-options' ), true ) && 'open' === $markup ) {
380 do_action( "everest_forms_field_options_before_{$option}", $field, $this );
381 } elseif ( $echo && in_array( $option, array( 'basic-options', 'advanced-options' ), true ) && 'close' === $markup ) {
382 do_action( "everest_forms_field_options_bottom_{$option}", $field, $this );
383 }
384
385 switch ( $option ) {
386 /**
387 * Basic Fields.
388 */
389
390 /*
391 * Basic Options markup.
392 */
393 case 'basic-options':
394 if ( 'open' === $markup ) {
395 if ( $echo ) {
396 echo sprintf( '<div class="everest-forms-field-option-group everest-forms-field-option-group-basic open" id="everest-forms-field-option-basic-%s">', esc_attr( $field['id'] ) );
397 echo sprintf( '<a href="#" class="everest-forms-field-option-group-toggle">%s<span> (ID #%s)</span> <i class="handlediv"></i></a>', esc_html( $this->name ), esc_html( $field['id'] ) );
398 echo sprintf( '<div class="everest-forms-field-option-group-inner %s">', esc_attr( $class ) );
399 } else {
400 $output = sprintf( '<div class="everest-forms-field-option-group everest-forms-field-option-group-basic open" id="everest-forms-field-option-basic-%s">', $field['id'] );
401 $output .= sprintf( '<a href="#" class="everest-forms-field-option-group-toggle">%s<span> (ID #%s)</span> <i class="handlediv"></i></a>', $this->name, $field['id'] );
402 $output .= sprintf( '<div class="everest-forms-field-option-group-inner %s">', $class );
403 }
404 } else {
405 if ( $echo ) {
406 echo '</div></div>';
407 } else {
408 $output = '</div></div>';
409 }
410 }
411 break;
412
413 /*
414 * Field Label.
415 */
416 case 'label':
417 $value = ! empty( $field['label'] ) ? esc_attr( $field['label'] ) : '';
418 $tooltip = esc_html__( 'Enter text for the form field label. This is recommended and can be hidden in the Advanced Settings.', 'everest-forms' );
419 $output = $this->field_element(
420 'label',
421 $field,
422 array(
423 'slug' => 'label',
424 'value' => esc_html__( 'Label', 'everest-forms' ),
425 'tooltip' => $tooltip,
426 ),
427 false
428 );
429 $output .= $this->field_element(
430 'text',
431 $field,
432 array(
433 'slug' => 'label',
434 'value' => $value,
435 ),
436 false
437 );
438 $output = $this->field_element(
439 'row',
440 $field,
441 array(
442 'slug' => 'label',
443 'content' => $output,
444 ),
445 $echo
446 );
447 break;
448
449 /*
450 * Field Meta.
451 */
452 case 'meta':
453 $value = ! empty( $field['meta-key'] ) ? esc_attr( $field['meta-key'] ) : evf_get_meta_key_field_option( $field );
454 $tooltip = esc_html__( 'Enter meta key to be stored in database.', 'everest-forms' );
455 $output = $this->field_element(
456 'label',
457 $field,
458 array(
459 'slug' => 'meta-key',
460 'value' => esc_html__( 'Meta Key', 'everest-forms' ),
461 'tooltip' => $tooltip,
462 ),
463 false
464 );
465 $output .= $this->field_element(
466 'text',
467 $field,
468 array(
469 'slug' => 'meta-key',
470 'class' => 'evf-input-meta-key',
471 'value' => $value,
472 ),
473 false
474 );
475 $output = $this->field_element(
476 'row',
477 $field,
478 array(
479 'slug' => 'meta-key',
480 'content' => $output,
481 ),
482 $echo
483 );
484 break;
485
486 /*
487 * Field Description.
488 */
489 case 'description':
490 $value = ! empty( $field['description'] ) ? esc_attr( $field['description'] ) : '';
491 $tooltip = esc_html__( 'Enter text for the form field description.', 'everest-forms' );
492 $output = $this->field_element(
493 'label',
494 $field,
495 array(
496 'slug' => 'description',
497 'value' => esc_html__( 'Description', 'everest-forms' ),
498 'tooltip' => $tooltip,
499 ),
500 false
501 );
502 $output .= $this->field_element(
503 'textarea',
504 $field,
505 array(
506 'slug' => 'description',
507 'value' => $value,
508 ),
509 false
510 );
511 $output = $this->field_element(
512 'row',
513 $field,
514 array(
515 'slug' => 'description',
516 'content' => $output,
517 ),
518 $echo
519 );
520 break;
521
522 /*
523 * Field Required toggle.
524 */
525 case 'required':
526 $default = ! empty( $args['default'] ) ? $args['default'] : '0';
527 $value = isset( $field['required'] ) ? $field['required'] : $default;
528 $tooltip = esc_html__( 'Check this option to mark the field required. A form will not submit unless all required fields are provided.', 'everest-forms' );
529 $output = $this->field_element(
530 'checkbox',
531 $field,
532 array(
533 'slug' => 'required',
534 'value' => $value,
535 'desc' => esc_html__( 'Required', 'everest-forms' ),
536 'tooltip' => $tooltip,
537 ),
538 false
539 );
540 $output = $this->field_element(
541 'row',
542 $field,
543 array(
544 'slug' => 'required',
545 'content' => $output,
546 ),
547 $echo
548 );
549 break;
550
551 /*
552 * Field Required toggle.
553 */
554 case 'required_field_message_setting':
555 $default = ! empty( $args['default'] ) ? $args['default'] : 'global';
556 if ( isset( $field['required_field_message_setting'] ) ) {
557 if ( 'global' === $field['required_field_message_setting'] ) {
558 $value = $field['required_field_message_setting'];
559 } elseif ( 'individual' === $field['required_field_message_setting'] ) {
560 $value = $field['required_field_message_setting'];
561 }
562 } elseif ( ! empty( $field['required-field-message'] ) ) {
563 $value = 'individual';
564 } else {
565 $value = $default;
566 }
567 $output = $this->field_element(
568 'radio',
569 $field,
570 array(
571 'slug' => 'required_field_message_setting',
572 'default' => $value,
573 'desc' => '',
574 'options' => array(
575 'global' => esc_html__( 'Show Required Message From Global Setting', 'everest-forms' ),
576 'individual' => esc_html__( 'Custom Required Message', 'everest-forms' ),
577 ),
578 ),
579 false
580 );
581 $output = $this->field_element(
582 'row',
583 $field,
584 array(
585 'slug' => 'required_field_message_setting',
586 'class' => isset( $field['required'] ) ? '' : 'hidden',
587 'content' => $output,
588 ),
589 $echo
590 );
591 break;
592 /**
593 * Required Field Message.
594 */
595 case 'required_field_message':
596 $has_sub_fields = false;
597 $sub_fields = array();
598 $required_validation = get_option( 'everest_forms_required_validation' );
599 if ( in_array( $field['type'], array( 'number', 'email', 'url', 'phone' ), true ) ) {
600 $required_validation = get_option( 'everest_forms_' . $field['type'] . '_validation' );
601 }
602 $hidden = true;
603 if ( isset( $field['required_field_message_setting'], $field['required'] ) ) {
604 if ( 'global' === $field['required_field_message_setting'] ) {
605 $hidden = true;
606 } elseif ( 'individual' === $field['required_field_message_setting'] ) {
607 $hidden = false;
608 }
609 } elseif ( ! empty( $field['required-field-message'] ) && isset( $field['required'] ) ) {
610 $hidden = false;
611 }
612
613 if ( 'likert' === $field['type'] ) {
614 $has_sub_fields = true;
615 $likert_rows = isset( $field['likert_rows'] ) ? $field['likert_rows'] : array();
616 foreach ( $likert_rows as $row_number => $row_label ) {
617 $row_slug = 'required-field-message-' . $row_number;
618 $sub_fields[ $row_slug ] = array(
619 'label' => array(
620 'value' => $row_label,
621 'tooltip' => esc_html__( 'Enter a message to show for this row if it\'s required.', 'everest-forms' ),
622 ),
623 'text' => array(
624 'value' => isset( $field[ $row_slug ] ) ? esc_attr( $field[ $row_slug ] ) : '',
625 ),
626 );
627 }
628 } elseif ( 'address' === $field['type'] ) {
629 $has_sub_fields = true;
630 $sub_fields = array(
631 'required-field-message-address1' => array(
632 'label' => array(
633 'value' => esc_html__( 'Address Line 1', 'everest-forms' ),
634 'tooltip' => esc_html__( 'Enter a message to show for Address Line 1 if it\'s required.', 'everest-forms' ),
635 ),
636 'text' => array(
637 'value' => isset( $field['required-field-message-address1'] ) ? esc_attr( $field['required-field-message-address1'] ) : '',
638 ),
639 ),
640 'required-field-message-city' => array(
641 'label' => array(
642 'value' => esc_html__( 'City', 'everest-forms' ),
643 'tooltip' => esc_html__( 'Enter a message to show for City if it\'s required.', 'everest-forms' ),
644 ),
645 'text' => array(
646 'value' => isset( $field['required-field-message-city'] ) ? esc_attr( $field['required-field-message-city'] ) : '',
647 ),
648 ),
649 'required-field-message-state' => array(
650 'label' => array(
651 'value' => esc_html__( 'State / Province / Region', 'everest-forms' ),
652 'tooltip' => esc_html__( 'Enter a message to show for State/Province/Region if it\'s required.', 'everest-forms' ),
653 ),
654 'text' => array(
655 'value' => isset( $field['required-field-message-state'] ) ? esc_attr( $field['required-field-message-state'] ) : '',
656 ),
657 ),
658 'required-field-message-postal' => array(
659 'label' => array(
660 'value' => esc_html__( 'Zip / Postal Code', 'everest-forms' ),
661 'tooltip' => esc_html__( 'Enter a message to show for Zip/Postal Code if it\'s required.', 'everest-forms' ),
662 ),
663 'text' => array(
664 'value' => isset( $field['required-field-message-postal'] ) ? esc_attr( $field['required-field-message-postal'] ) : '',
665 ),
666 ),
667 'required-field-message-country' => array(
668 'label' => array(
669 'value' => esc_html__( 'Country', 'everest-forms' ),
670 'tooltip' => esc_html__( 'Enter a message to show for Country if it\'s required.', 'everest-forms' ),
671 ),
672 'text' => array(
673 'value' => isset( $field['required-field-message-country'] ) ? esc_attr( $field['required-field-message-country'] ) : '',
674 ),
675 ),
676 );
677 }
678
679 if ( true === $has_sub_fields ) {
680 $sub_field_output_array = array();
681 foreach ( $sub_fields as $sub_field_slug => $sub_field_data ) {
682 $value = isset( $field['required-field-message'] ) ? esc_attr( $field['required-field-message'] ) : '';
683 $tooltip = esc_html__( 'Enter a message to show for this field if it\'s required.', 'everest-forms' );
684 $output = $this->field_element(
685 'label',
686 $field,
687 array(
688 'slug' => $sub_field_slug,
689 'value' => $sub_field_data['label']['value'],
690 'tooltip' => $sub_field_data['label']['tooltip'],
691 ),
692 false
693 );
694 $output .= $this->field_element(
695 'text',
696 $field,
697 array(
698 'slug' => $sub_field_slug,
699 'value' => $sub_field_data['text']['value'],
700 ),
701 false
702 );
703 $output = $this->field_element(
704 'row',
705 $field,
706 array(
707 'slug' => $sub_field_slug,
708 'content' => $output,
709 ),
710 false
711 );
712
713 $sub_field_output_array[] = $output;
714 }
715
716 $output = implode( '', $sub_field_output_array );
717 $output = $this->field_element(
718 'row',
719 $field,
720 array(
721 'slug' => 'required-field-message',
722 'class' => false === $hidden ? '' : 'hidden',
723 'content' => $output,
724 ),
725 $echo
726 );
727 } else {
728 $value = isset( $field['required-field-message'] ) ? esc_attr( $field['required-field-message'] ) : '';
729 $tooltip = esc_html__( 'Enter a message to show for this field if it\'s required.', 'everest-forms' );
730
731 $output = $this->field_element(
732 'label',
733 $field,
734 array(
735 'slug' => 'required-field-message',
736 'value' => esc_html__( 'Required Field Message', 'everest-forms' ),
737 'tooltip' => $tooltip,
738 ),
739 false
740 );
741 $output .= $this->field_element(
742 'text',
743 $field,
744 array(
745 'slug' => 'required-field-message',
746 'value' => $value,
747 'class' => 'everest-forms-field-option-row',
748 ),
749 false
750 );
751 $output = $this->field_element(
752 'row',
753 $field,
754 array(
755 'slug' => 'required-field-message',
756 'class' => false === $hidden ? '' : 'hidden',
757 'content' => $output,
758 ),
759 $echo
760 );
761 }
762 break;
763
764 /**
765 * Field Visibilty.
766 */
767 case 'field_visiblity':
768 $default = ! empty( $args['default'] ) ? $args['default'] : '0';
769 $readonly_value = isset( $field['readonly_field_visibility'] ) ? $field['readonly_field_visibility'] : $default;
770 $hidden_value = isset( $field['hidden_field_visibility'] ) ? $field['hidden_field_visibility'] : $default;
771 $tooltip = esc_html__( 'Check this option to mark the field readonly and hidden.', 'everest-forms' );
772 $label = $this->field_element(
773 'label',
774 $field,
775 array(
776 'slug' => 'field_visibility',
777 'value' => esc_html__( 'Field Visibility', 'everest-forms' ),
778 'tooltip' => $tooltip,
779 ),
780 false
781 );
782 $readonly = $this->field_element(
783 'checkbox',
784 $field,
785 array(
786 'slug' => 'readonly_field_visibility',
787 'value' => $readonly_value,
788 'class' => 'field_visibility_readonly',
789 'desc' => esc_html__( 'Readonly ', 'everest-forms' ),
790 ),
791 false
792 );
793 $hidden = $this->field_element(
794 'checkbox',
795 $field,
796 array(
797 'slug' => 'hidden_field_visibility',
798 'value' => $hidden_value,
799 'class' => 'field_visibility_hidden',
800 'desc' => esc_html__( 'Hidden', 'everest-forms' ),
801 ),
802 false
803 );
804 $output = $this->field_element(
805 'row',
806 $field,
807 array(
808 'slug' => 'field_visiblity',
809 'content' => $label . '' . $readonly . ' ' . $hidden,
810 ),
811 $echo
812 );
813 break;
814
815 /**
816 * No Duplicates.
817 */
818 case 'no_duplicates':
819 $default = ! empty( $args['default'] ) ? $args['default'] : '0';
820 $value = ! empty( $field['no_duplicates'] ) ? esc_attr( $field['no_duplicates'] ) : '';
821 $tooltip = esc_html__( 'Select this option to limit user input to unique values only. This will require that a value entered in a field does not currently exist in the entry database for that field..', 'everest-forms' );
822 $output = $this->field_element(
823 'checkbox',
824 $field,
825 array(
826 'slug' => 'no_duplicates',
827 'value' => $value,
828 'desc' => esc_html__( 'Validate as unique', 'everest-forms' ),
829 'tooltip' => $tooltip,
830 ),
831 false
832 );
833 $output = $this->field_element(
834 'row',
835 $field,
836 array(
837 'slug' => 'no_duplicates',
838 'content' => $output,
839 ),
840 $echo
841 );
842 break;
843 case 'validate_message':
844 $toggle = '';
845 $tooltip = esc_html__( 'if the form submission failed it will show this message.', 'everest-forms' );
846 $value = ! empty( $field['validate_message'] ) ? esc_attr( $field['validate_message'] ) : 'This field value needs to be unique.';
847
848 // Build output.
849 $output = $this->field_element(
850 'label',
851 $field,
852 array(
853 'slug' => 'validate_message',
854 'value' => esc_html__( 'Validation Message for Duplicate', 'everest-forms' ),
855 'tooltip' => $tooltip,
856 'after_tooltip' => $toggle,
857 ),
858 false
859 );
860 $output .= $this->field_element(
861 'text',
862 $field,
863 array(
864 'slug' => 'validate_message',
865 'value' => $value,
866 ),
867 false
868 );
869 $output = $this->field_element(
870 'row',
871 $field,
872 array(
873 'slug' => 'validate_message',
874 'content' => $output,
875 'class' => isset( $field['no_duplicates'] ) ? '' : 'hidden',
876 ),
877 $echo
878 );
879 break;
880 /**
881 * No Duplicates.
882 */
883 case 'show_tooltip':
884 $default = ! empty( $args['default'] ) ? $args['default'] : '0';
885 $value = ! empty( $field['show_tooltip'] ) ? esc_attr( $field['show_tooltip'] ) : '';
886 $output = $this->field_element(
887 'checkbox',
888 $field,
889 array(
890 'slug' => 'show_tooltip',
891 'value' => $value,
892 'desc' => esc_html__( 'Enable Tooltip', 'everest-forms' ),
893 'tooltip' => esc_html__( 'Check this option to show the form field tooltip.', 'everest-forms' ),
894 ),
895 false
896 );
897 $output = $this->field_element(
898 'row',
899 $field,
900 array(
901 'slug' => 'show_tooltip',
902 'content' => $output,
903 ),
904 $echo
905 );
906 $description_value = ! empty( $field['tooltip_description'] ) ? esc_attr( $field['tooltip_description'] ) : '';
907 $output = $this->field_element(
908 'textarea',
909 $field,
910 array(
911 'slug' => 'tooltip_description',
912 'value' => $description_value,
913 'desc' => esc_html__( 'Enable Tooltip', 'everest-forms' ),
914 'attrs' => array(
915 'placeholder' => esc_html__( 'Enter the text for tooltip description.', 'everest-forms' ),
916 ),
917 ),
918 false
919 );
920
921 $output = $this->field_element(
922 'row',
923 $field,
924 array(
925 'slug' => 'tooltip_description',
926 'content' => $output,
927 ),
928 $echo
929 );
930 break;
931 /**
932 * No Duplicates.
933 */
934 case 'autocomplete_address':
935 $default = ! empty( $args['default'] ) ? $args['default'] : '0';
936 $value = ! empty( $field['autocomplete_address'] ) ? esc_attr( $field['autocomplete_address'] ) : '';
937 $tooltip = esc_html__( 'Check this option to autofill address field.', 'everest-forms' );
938 $output = $this->field_element(
939 'checkbox',
940 $field,
941 array(
942 'slug' => 'autocomplete_address',
943 'value' => $value,
944 'desc' => esc_html__( 'Enable Autocomplete Address Field', 'everest-forms' ),
945 'tooltip' => $tooltip,
946 ),
947 false
948 );
949 $output = $this->field_element(
950 'row',
951 $field,
952 array(
953 'slug' => 'autocomplete_address',
954 'content' => $output,
955 ),
956 $echo
957 );
958 break;
959 case 'address_style':
960 $default = ! empty( $args['default'] ) ? $args['default'] : 'none';
961 $tooltip = esc_html__( 'Select the style', 'everest-forms' );
962 $value = ! empty( $field['address_style'] ) ? esc_attr( $field['address_style'] ) : '';
963 $output = $this->field_element(
964 'label',
965 $field,
966 array(
967 'slug' => 'address_style',
968 'value' => esc_html__( 'Style', 'everest-forms' ),
969 'tooltip' => $tooltip,
970 ),
971 false
972 );
973 $output .= $this->field_element(
974 'select',
975 $field,
976 array(
977 'slug' => 'address_style',
978 'value' => $value,
979 'tooltip' => $tooltip,
980 'options' => array(
981 'address' => esc_html__( 'Address', 'everest-forms' ),
982 'map' => esc_html__( 'Map', 'everest-forms' ),
983 'address_with_map' => esc_html( 'Address With Map' ),
984 ),
985 ),
986 false
987 );
988 $output = $this->field_element(
989 'row',
990 $field,
991 array(
992 'slug' => 'address_style',
993 'content' => $output,
994 ),
995 $echo
996 );
997 break;
998
999 /*
1000 * Code Block.
1001 */
1002 case 'code':
1003 $value = ! empty( $field['code'] ) ? esc_attr( $field['code'] ) : '';
1004 $tooltip = esc_html__( 'Enter code for the form field.', 'everest-forms' );
1005 $output = $this->field_element(
1006 'label',
1007 $field,
1008 array(
1009 'slug' => 'code',
1010 'value' => esc_html__( 'Code', 'everest-forms' ),
1011 'tooltip' => $tooltip,
1012 ),
1013 false
1014 );
1015 $output .= $this->field_element(
1016 'textarea',
1017 $field,
1018 array(
1019 'slug' => 'code',
1020 'value' => $value,
1021 ),
1022 false
1023 );
1024 $output = $this->field_element(
1025 'row',
1026 $field,
1027 array(
1028 'slug' => 'code',
1029 'content' => $output,
1030 ),
1031 $echo
1032 );
1033 break;
1034
1035 /*
1036 * Choices.
1037 */
1038 case 'choices':
1039 $class = array();
1040 $label = ! empty( $args['label'] ) ? esc_html( $args['label'] ) : esc_html__( 'Choices', 'everest-forms' );
1041 $choices = ! empty( $field['choices'] ) ? $field['choices'] : $this->defaults;
1042 $input_type = in_array( $field['type'], array( 'radio', 'select', 'payment-multiple' ), true ) ? 'radio' : 'checkbox';
1043
1044 if ( ! empty( $field['show_values'] ) ) {
1045 $class[] = 'show-values';
1046 }
1047
1048 if ( ! empty( $field['choices_images'] ) ) {
1049 $class[] = 'show-images';
1050 }
1051
1052 if ( ! empty( $field['multiple_choices'] ) ) {
1053 $input_type = 'checkbox';
1054 }
1055
1056 // Add bulk options toggle handle.
1057 $bulk_add_enabled = apply_filters( 'evf_bulk_add_enabled', true );
1058 $licensed = ( false === evf_get_license_plan() ) ? false : true;
1059 $upgradable_feature_class = ( true === $licensed ) ? '' : 'evf-upgradable-feature';
1060 $bulk_options_toggle_handle = sprintf( '<a href="#" class="evf-toggle-bulk-options after-label-description %s">%s</a>', esc_attr( $upgradable_feature_class ), esc_html__( 'Bulk Add', 'everest-forms' ) );
1061
1062 // Field label.
1063 $field_label = $this->field_element(
1064 'label',
1065 $field,
1066 array(
1067 'slug' => 'choices',
1068 'value' => $label,
1069 'tooltip' => esc_html__( 'Add choices for the form field.', 'everest-forms' ),
1070 'after_tooltip' => $bulk_options_toggle_handle, // @todo Bulk import and export for choices.
1071 )
1072 );
1073 $field_content = '';
1074
1075 if ( true === $bulk_add_enabled && true === $licensed ) {
1076 $field_content .= $this->field_option(
1077 'add_bulk_options',
1078 $field,
1079 array(
1080 'class' => 'everest-forms-hidden',
1081 )
1082 );
1083 }
1084
1085 if ( 'select' === $field['type'] ) {
1086 $selection_btn = array();
1087 $selection_types = array(
1088 'single' => array(
1089 'type' => 'radio',
1090 'label' => esc_html__( 'Single Selection', 'everest-forms' ),
1091 ),
1092 'multiple' => array(
1093 'type' => 'checkbox',
1094 'label' => esc_html__( 'Multiple Selection', 'everest-forms' ),
1095 ),
1096 );
1097
1098 $active_type = ! empty( $field['multiple_choices'] ) && '1' === $field['multiple_choices'] ? 'multiple' : 'single';
1099 foreach ( $selection_types as $key => $selection_type ) {
1100 $selection_btn[ $key ] = '<span data-selection="' . esc_attr( $key ) . '" data-type="' . esc_attr( $selection_type['type'] ) . '" class="flex everest-forms-btn ' . ( $active_type === $key ? 'is-active' : '' ) . ' ' . ( false === $licensed && 'multiple' === $key ? 'upgrade-modal' : '' ) . '" data-feature="' . esc_html__( 'Multiple selection', 'everest-forms' ) . '">' . esc_html( $selection_type['label'] ) . '</span>';
1101 }
1102
1103 $field_content .= sprintf(
1104 '<div class="flex everest-forms-btn-group everest-forms-btn-group--inline"><input type="hidden" id="everest-forms-field-option-%1$s-multiple_choices" name="form_fields[%1$s][multiple_choices]" value="%2$s" />%3$s</div>',
1105 esc_attr( $field['id'] ),
1106 ! empty( $field['multiple_choices'] ) && '1' === $field['multiple_choices'] ? 1 : 0,
1107 implode( '', $selection_btn )
1108 );
1109 }
1110
1111 // Field contents.
1112 $field_content .= sprintf(
1113 '<ul data-next-id="%s" class="evf-choices-list %s" data-field-id="%s" data-field-type="%s">',
1114 max( array_keys( $choices ) ) + 1,
1115 evf_sanitize_classes( $class, true ),
1116 $field['id'],
1117 $this->type
1118 );
1119 foreach ( $choices as $key => $choice ) {
1120 $default = ! empty( $choice['default'] ) ? $choice['default'] : '';
1121 $name = sprintf( 'form_fields[%s][choices][%s]', $field['id'], $key );
1122 $image = ! empty( $choice['image'] ) ? $choice['image'] : '';
1123
1124 // BW compatibility for value in payment fields.
1125 if ( ! empty( $field['amount'][ $key ]['value'] ) ) {
1126 $choice['value'] = evf_format_amount( evf_sanitize_amount( $field['amount'][ $key ]['value'] ) );
1127 }
1128
1129 $field_content .= sprintf( '<li data-key="%1$d">', absint( $key ) );
1130 $field_content .= '<span class="sort"><svg width="18" height="18" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 18 18" role="img" aria-hidden="true" focusable="false"><path d="M13,8c0.6,0,1-0.4,1-1s-0.4-1-1-1s-1,0.4-1,1S12.4,8,13,8z M5,6C4.4,6,4,6.4,4,7s0.4,1,1,1s1-0.4,1-1S5.6,6,5,6z M5,10 c-0.6,0-1,0.4-1,1s0.4,1,1,1s1-0.4,1-1S5.6,10,5,10z M13,10c-0.6,0-1,0.4-1,1s0.4,1,1,1s1-0.4,1-1S13.6,10,13,10z M9,6 C8.4,6,8,6.4,8,7s0.4,1,1,1s1-0.4,1-1S9.6,6,9,6z M9,10c-0.6,0-1,0.4-1,1s0.4,1,1,1s1-0.4,1-1S9.6,10,9,10z"></path></svg></span>';
1131 $field_content .= sprintf( '<input type="%1$s" name="%2$s[default]" class="default" value="1" %3$s>', $input_type, $name, checked( '1', $default, false ) );
1132 $field_content .= '<div class="evf-choice-list-input">';
1133 $field_content .= sprintf( '<input type="text" name="%1$s[label]" value="%2$s" class="label" data-key="%3$s">', $name, esc_attr( $choice['label'] ), absint( $key ) );
1134 if ( in_array( $field['type'], array( 'payment-multiple', 'payment-checkbox' ), true ) ) {
1135 $field_content .= sprintf( '<input type="text" name="%1$s[value]" value="%2$s" class="value evf-money-input" placeholder="%3$s">', $name, esc_attr( $choice['value'] ), evf_format_amount( 0 ) );
1136 } else {
1137 $field_content .= sprintf( '<input type="text" name="%1$s[value]" value="%2$s" class="value">', $name, esc_attr( $choice['value'] ) );
1138 }
1139 $field_content .= '</div>';
1140 $field_content .= '<a class="add" href="#"><i class="dashicons dashicons-plus-alt"></i></a>';
1141 $field_content .= '<a class="remove" href="#"><i class="dashicons dashicons-dismiss"></i></a>';
1142 $field_content .= '<div class="everest-forms-attachment-media-view">';
1143 $field_content .= sprintf( '<input type="hidden" class="source" name="%s[image]" value="%s">', $name, esc_url_raw( $image ) );
1144 $field_content .= sprintf( '<button type="button" class="upload-button button-add-media"%s>%s</button>', ! empty( $image ) ? ' style="display:none;"' : '', esc_html__( 'Upload Image', 'everest-forms' ) );
1145 $field_content .= '<div class="thumbnail thumbnail-image">';
1146 if ( ! empty( $image ) ) {
1147 $field_content .= sprintf( '<img class="attachment-thumb" src="%1$s">', esc_url_raw( $image ) );
1148 }
1149 $field_content .= '</div>';
1150 $field_content .= sprintf( '<div class="actions"%s>', empty( $image ) ? ' style="display:none;"' : '' );
1151 $field_content .= sprintf( '<button type="button" class="button remove-button">%1$s</button>', esc_html__( 'Remove', 'everest-forms' ) );
1152 $field_content .= sprintf( '<button type="button" class="button upload-button">%1$s</button>', esc_html__( 'Change image', 'everest-forms' ) );
1153 $field_content .= '</div>';
1154 $field_content .= '</div>';
1155 $field_content .= '</li>';
1156 }
1157 $field_content .= '</ul>';
1158
1159 // Final field output.
1160 $output = $this->field_element(
1161 'row',
1162 $field,
1163 array(
1164 'slug' => 'choices',
1165 'content' => $field_label . $field_content,
1166 ),
1167 $echo
1168 );
1169 break;
1170
1171 /*
1172 * Choices Images.
1173 */
1174 case 'choices_images':
1175 $field_content = sprintf(
1176 '<div class="notice notice-warning%s"><p>%s</p></div>',
1177 empty( $field['choices_images'] ) ? ' hidden' : '',
1178 esc_html__( 'For best results, images should be square and at least 200 × 160 pixels or smaller.', 'everest-forms' )
1179 );
1180
1181 $field_content .= $this->field_element(
1182 'checkbox',
1183 $field,
1184 array(
1185 'slug' => 'choices_images',
1186 'value' => isset( $field['choices_images'] ) ? '1' : '0',
1187 'desc' => esc_html__( 'Use image choices', 'everest-forms' ),
1188 'tooltip' => esc_html__( 'Check this option to enable using images with the choices.', 'everest-forms' ),
1189 ),
1190 false
1191 );
1192
1193 // Final field output.
1194 $output = $this->field_element(
1195 'row',
1196 $field,
1197 array(
1198 'slug' => 'choices_images',
1199 'content' => $field_content,
1200 ),
1201 $echo
1202 );
1203 break;
1204
1205 /**
1206 * Add bulk options.
1207 */
1208 case 'add_bulk_options':
1209 $class = ! empty( $args['class'] ) ? esc_attr( $args['class'] ) : '';
1210 $label = ! empty( $args['label'] ) ? esc_html( $args['label'] ) : esc_html__( 'Add Bulk Options', 'everest-forms' );
1211
1212 // Field label.
1213 $field_label = $this->field_element(
1214 'label',
1215 $field,
1216 array(
1217 'slug' => 'add_bulk_options',
1218 'value' => $label,
1219 'tooltip' => esc_html__( 'Add multiple options at once.', 'everest-forms' ),
1220 'after_tooltip' => sprintf( '<a class="evf-toggle-presets-list" href="#">%s</a>', esc_html__( 'Presets', 'everest-forms' ) ),
1221 ),
1222 false
1223 );
1224
1225 // Preset contents.
1226 $presets = array(
1227 array(
1228 'label' => esc_html__( 'Months', 'everest-forms' ),
1229 'class' => 'evf-options-preset-months',
1230 'options' => array(
1231 esc_html__( 'January', 'everest-forms' ),
1232 esc_html__( 'February', 'everest-forms' ),
1233 esc_html__( 'March', 'everest-forms' ),
1234 esc_html__( 'April', 'everest-forms' ),
1235 esc_html__( 'May', 'everest-forms' ),
1236 esc_html__( 'June', 'everest-forms' ),
1237 esc_html__( 'July', 'everest-forms' ),
1238 esc_html__( 'August', 'everest-forms' ),
1239 esc_html__( 'September', 'everest-forms' ),
1240 esc_html__( 'October', 'everest-forms' ),
1241 esc_html__( 'November', 'everest-forms' ),
1242 esc_html__( 'December', 'everest-forms' ),
1243 ),
1244 ),
1245 array(
1246 'label' => esc_html__( 'Week Days', 'everest-forms' ),
1247 'class' => 'evf-options-preset-week-days',
1248 'options' => array(
1249 esc_html__( 'Sunday', 'everest-forms' ),
1250 esc_html__( 'Monday', 'everest-forms' ),
1251 esc_html__( 'Tuesday', 'everest-forms' ),
1252 esc_html__( 'Wednesday', 'everest-forms' ),
1253 esc_html__( 'Thursday', 'everest-forms' ),
1254 esc_html__( 'Friday', 'everest-forms' ),
1255 esc_html__( 'Saturday', 'everest-forms' ),
1256 ),
1257 ),
1258 array(
1259 'label' => esc_html__( 'Countries', 'everest-forms' ),
1260 'class' => 'evf-options-preset-countries',
1261 'options' => array_values( evf_get_countries() ),
1262 ),
1263 array(
1264 'label' => esc_html__( 'Countries Postal Code', 'everest-forms' ),
1265 'class' => 'evf-options-preset-countries-postal-code',
1266 'options' => array_keys( evf_get_countries() ),
1267 ),
1268 array(
1269 'label' => esc_html__( 'U.S. States', 'everest-forms' ),
1270 'class' => 'evf-options-preset-states',
1271 'options' => array_values( evf_get_states()['US'] ),
1272 ),
1273 array(
1274 'label' => esc_html__( 'U.S. States Postal Code', 'everest-forms' ),
1275 'class' => 'evf-options-preset-states-postal-code',
1276 'options' => array_keys( evf_get_states()['US'] ),
1277 ),
1278 array(
1279 'label' => esc_html__( 'Age Groups', 'everest-forms' ),
1280 'class' => 'evf-options-preset-age-groups',
1281 'options' => array(
1282 esc_html__( 'Under 18', 'everest-forms' ),
1283 esc_html__( '18-24', 'everest-forms' ),
1284 esc_html__( '25-34', 'everest-forms' ),
1285 esc_html__( '35-44', 'everest-forms' ),
1286 esc_html__( '45-54', 'everest-forms' ),
1287 esc_html__( '55-64', 'everest-forms' ),
1288 esc_html__( '65 or Above', 'everest-forms' ),
1289 esc_html__( 'Prefer Not to Answer', 'everest-forms' ),
1290 ),
1291 ),
1292 array(
1293 'label' => esc_html__( 'Satisfaction', 'everest-forms' ),
1294 'class' => 'evf-options-preset-satisfaction',
1295 'options' => array(
1296 esc_html__( 'Very Satisfied', 'everest-forms' ),
1297 esc_html__( 'Satisfied', 'everest-forms' ),
1298 esc_html__( 'Neutral', 'everest-forms' ),
1299 esc_html__( 'Unsatisfied', 'everest-forms' ),
1300 esc_html__( 'Very Unsatisfied', 'everest-forms' ),
1301 esc_html__( 'N/A', 'everest-forms' ),
1302 ),
1303 ),
1304 array(
1305 'label' => esc_html__( 'Importance', 'everest-forms' ),
1306 'class' => 'evf-options-preset-importance',
1307 'options' => array(
1308 esc_html__( 'Very Important', 'everest-forms' ),
1309 esc_html__( 'Important', 'everest-forms' ),
1310 esc_html__( 'Neutral', 'everest-forms' ),
1311 esc_html__( 'Somewhat Important', 'everest-forms' ),
1312 esc_html__( 'Not at all Important', 'everest-forms' ),
1313 esc_html__( 'N/A', 'everest-forms' ),
1314 ),
1315 ),
1316 array(
1317 'label' => esc_html__( 'Agreement', 'everest-forms' ),
1318 'class' => 'evf-options-preset-agreement',
1319 'options' => array(
1320 esc_html__( 'Strongly Agree', 'everest-forms' ),
1321 esc_html__( 'Agree', 'everest-forms' ),
1322 esc_html__( 'Neutral', 'everest-forms' ),
1323 esc_html__( 'Disagree', 'everest-forms' ),
1324 esc_html__( 'Strongly Disagree', 'everest-forms' ),
1325 esc_html__( 'N/A', 'everest-forms' ),
1326 ),
1327 ),
1328 );
1329 $presets_html = '<div class="evf-options-presets" hidden>';
1330 foreach ( $presets as $preset ) {
1331 $presets_html .= sprintf( '<div class="evf-options-preset %s">', esc_attr( $preset['class'] ) );
1332 $presets_html .= sprintf( '<a class="evf-options-preset-label" href="#">%s</a>', $preset['label'] );
1333 $presets_html .= sprintf( '<textarea hidden class="evf-options-preset-value">%s</textarea>', implode( "\n", $preset['options'] ) );
1334 $presets_html .= '</div>';
1335 }
1336 $presets_html .= '</div>';
1337
1338 // Field contents.
1339 $field_content = $this->field_element(
1340 'textarea',
1341 $field,
1342 array(
1343 'slug' => 'add_bulk_options',
1344 'value' => '',
1345 ),
1346 false
1347 );
1348 $field_content .= sprintf( '<a class="button button-small evf-add-bulk-options" href="#">%s</a>', esc_html__( 'Add New Choices', 'everest-forms' ) );
1349
1350 // Final field output.
1351 $output = $this->field_element(
1352 'row',
1353 $field,
1354 array(
1355 'slug' => 'add_bulk_options',
1356 'content' => $field_label . $presets_html . $field_content,
1357 'class' => $class,
1358 ),
1359 $echo
1360 );
1361 break;
1362
1363 /**
1364 * Advanced Fields.
1365 */
1366
1367 /*
1368 * Default value.
1369 */
1370 case 'default_value':
1371 $value = ! empty( $field['default_value'] ) || ( isset( $field['default_value'] ) && '0' === (string) $field['default_value'] ) ? esc_attr( $field['default_value'] ) : '';
1372 $tooltip = esc_html__( 'Enter text for the default form field value.', 'everest-forms' );
1373 $toggle = '';
1374 $output = $this->field_element(
1375 'label',
1376 $field,
1377 array(
1378 'slug' => 'default_value',
1379 'value' => esc_html__( 'Default Value', 'everest-forms' ),
1380 'tooltip' => $tooltip,
1381 'after_tooltip' => $toggle,
1382 ),
1383 false
1384 );
1385 $output .= $this->field_element(
1386 'text',
1387 $field,
1388 array(
1389 'slug' => 'default_value',
1390 'value' => $value,
1391 ),
1392 false
1393 );
1394
1395 // Smart tag for default value.
1396 $exclude_fields = array( 'rating', 'number', 'range-slider', 'payment-quantity', 'reset' );
1397
1398 if ( ! in_array( $field['type'], $exclude_fields, true ) ) {
1399 $output .= '<a href="#" class="evf-toggle-smart-tag-display" data-type="other"><span class="dashicons dashicons-editor-code"></span></a>';
1400 $output .= '<div class="evf-smart-tag-lists" style="display: none">';
1401 $output .= '<div class="smart-tag-title other-tag-title">Others</div><ul class="evf-others"></ul></div>';
1402 }
1403
1404 $output = $this->field_element(
1405 'row',
1406 $field,
1407 array(
1408 'slug' => 'default_value',
1409 'content' => $output,
1410 'class' => in_array( $field['type'], $exclude_fields, true ) ? '' : 'evf_smart_tag',
1411 ),
1412 $echo
1413 );
1414 break;
1415
1416 /*
1417 * Advanced Options markup.
1418 */
1419 case 'advanced-options':
1420 $markup = ! empty( $args['markup'] ) ? $args['markup'] : 'open';
1421
1422 if ( 'open' === $markup ) {
1423 $override = apply_filters( 'everest_forms_advanced_options_override', false );
1424 $override = ! empty( $override ) ? 'style="display:' . $override . ';"' : '';
1425 if ( $echo ) {
1426 echo sprintf( '<div class="everest-forms-field-option-group everest-forms-field-option-group-advanced everest-forms-hide closed" id="everest-forms-field-option-advanced-%s" %s>', esc_attr( $field['id'] ), ( ! empty( $override ) ? 'style="display:' . esc_attr( apply_filters( 'everest_forms_advanced_options_override', false ) ) . ';"' : '' ) );
1427 echo sprintf( '<a href="#" class="everest-forms-field-option-group-toggle">%s<i class="handlediv"></i></a>', esc_html__( 'Advanced Options', 'everest-forms' ) );
1428 echo '<div class="everest-forms-field-option-group-inner">';
1429 } else {
1430 $output = sprintf( '<div class="everest-forms-field-option-group everest-forms-field-option-group-advanced everest-forms-hide closed" id="everest-forms-field-option-advanced-%s" %s>', $field['id'], $override );
1431 $output .= sprintf( '<a href="#" class="everest-forms-field-option-group-toggle">%s<i class="handlediv"></i></a>', __( 'Advanced Options', 'everest-forms' ) );
1432 $output .= '<div class="everest-forms-field-option-group-inner">';
1433 }
1434 } else {
1435 if ( $echo ) {
1436 echo '</div></div>';
1437 } else {
1438 $output = '</div></div>';
1439 }
1440 }
1441
1442 break;
1443
1444 /*
1445 * Placeholder.
1446 */
1447 case 'placeholder':
1448 $value = ! empty( $field['placeholder'] ) || ( isset( $field['placeholder'] ) && '0' === (string) $field['placeholder'] ) ? esc_attr( $field['placeholder'] ) : '';
1449 $tooltip = esc_html__( 'Enter text for the form field placeholder.', 'everest-forms' );
1450 $output = $this->field_element(
1451 'label',
1452 $field,
1453 array(
1454 'slug' => 'placeholder',
1455 'value' => esc_html__( 'Placeholder Text', 'everest-forms' ),
1456 'tooltip' => $tooltip,
1457 ),
1458 false
1459 );
1460 $output .= $this->field_element(
1461 'text',
1462 $field,
1463 array(
1464 'slug' => 'placeholder',
1465 'value' => $value,
1466 ),
1467 false
1468 );
1469 $output = $this->field_element(
1470 'row',
1471 $field,
1472 array(
1473 'slug' => 'placeholder',
1474 'content' => $output,
1475 ),
1476 $echo
1477 );
1478 break;
1479 case 'enable_prepopulate':
1480 $default = ! empty( $args['default'] ) ? $args['default'] : '0';
1481 $value = ! empty( $field['enable_prepopulate'] ) ? esc_attr( $field['enable_prepopulate'] ) : '';
1482 $tooltip = esc_html__( 'Enable this option to allow field to be populated dynamically', 'everest-forms' );
1483 $output = $this->field_element(
1484 'checkbox',
1485 $field,
1486 array(
1487 'slug' => 'enable_prepopulate',
1488 'value' => $value,
1489 'desc' => esc_html__( 'Enable Autopopulate ', 'everest-forms' ),
1490 'tooltip' => $tooltip,
1491 ),
1492 false
1493 );
1494 $output = $this->field_element(
1495 'row',
1496 $field,
1497 array(
1498 'slug' => 'enable_prepopulate',
1499 'content' => $output,
1500 ),
1501 $echo
1502 );
1503 break;
1504 case 'parameter_name':
1505 $toggle = '';
1506 $tooltip = esc_html__( 'Enter name of the parameter to populate the field.', 'everest-forms' );
1507 $value = ! empty( $field['parameter_name'] ) ? esc_attr( $field['parameter_name'] ) : '';
1508
1509 // Build output.
1510 $output = $this->field_element(
1511 'label',
1512 $field,
1513 array(
1514 'slug' => 'parameter_name',
1515 'value' => esc_html__( 'Parameter Name', 'everest-forms' ),
1516 'tooltip' => $tooltip,
1517 'after_tooltip' => $toggle,
1518 ),
1519 false
1520 );
1521 $output .= $this->field_element(
1522 'text',
1523 $field,
1524 array(
1525 'slug' => 'parameter_name',
1526 'value' => $value,
1527 ),
1528 false
1529 );
1530 $output = $this->field_element(
1531 'row',
1532 $field,
1533 array(
1534 'slug' => 'parameter_name',
1535 'content' => $output,
1536 'class' => isset( $field['enable_prepopulate'] ) ? '' : 'hidden',
1537 ),
1538 $echo
1539 );
1540 break;
1541
1542 /*
1543 * CSS classes.
1544 */
1545 case 'css':
1546 $toggle = '';
1547 $tooltip = esc_html__( 'Enter CSS class names for this field container. Multiple class names should be separated with spaces.', 'everest-forms' );
1548 $value = ! empty( $field['css'] ) ? esc_attr( $field['css'] ) : '';
1549
1550 // Build output.
1551 $output = $this->field_element(
1552 'label',
1553 $field,
1554 array(
1555 'slug' => 'css',
1556 'value' => esc_html__( 'CSS Classes', 'everest-forms' ),
1557 'tooltip' => $tooltip,
1558 'after_tooltip' => $toggle,
1559 ),
1560 false
1561 );
1562 $output .= $this->field_element(
1563 'text',
1564 $field,
1565 array(
1566 'slug' => 'css',
1567 'value' => $value,
1568 ),
1569 false
1570 );
1571 $output = $this->field_element(
1572 'row',
1573 $field,
1574 array(
1575 'slug' => 'css',
1576 'content' => $output,
1577 ),
1578 $echo
1579 );
1580 break;
1581
1582 /*
1583 * Hide Label.
1584 */
1585 case 'label_hide':
1586 $value = isset( $field['label_hide'] ) ? $field['label_hide'] : '0';
1587 $tooltip = esc_html__( 'Check this option to hide the form field label.', 'everest-forms' );
1588
1589 // Build output.
1590 $output = $this->field_element(
1591 'checkbox',
1592 $field,
1593 array(
1594 'slug' => 'label_hide',
1595 'value' => $value,
1596 'desc' => esc_html__( 'Hide Label', 'everest-forms' ),
1597 'tooltip' => $tooltip,
1598 ),
1599 false
1600 );
1601 $output = $this->field_element(
1602 'row',
1603 $field,
1604 array(
1605 'slug' => 'label_hide',
1606 'content' => $output,
1607 ),
1608 $echo
1609 );
1610 break;
1611
1612 /*
1613 * Hide Sub-Labels.
1614 */
1615 case 'sublabel_hide':
1616 $value = isset( $field['sublabel_hide'] ) ? $field['sublabel_hide'] : '0';
1617 $tooltip = esc_html__( 'Check this option to hide the form field sub-label.', 'everest-forms' );
1618
1619 // Build output.
1620 $output = $this->field_element(
1621 'checkbox',
1622 $field,
1623 array(
1624 'slug' => 'sublabel_hide',
1625 'value' => $value,
1626 'desc' => esc_html__( 'Hide Sub-Labels', 'everest-forms' ),
1627 'tooltip' => $tooltip,
1628 ),
1629 false
1630 );
1631 $output = $this->field_element(
1632 'row',
1633 $field,
1634 array(
1635 'slug' => 'sublabel_hide',
1636 'content' => $output,
1637 ),
1638 $echo
1639 );
1640 break;
1641
1642 /*
1643 * Input columns.
1644 */
1645 case 'input_columns':
1646 $value = ! empty( $field['input_columns'] ) ? esc_attr( $field['input_columns'] ) : '';
1647 $tooltip = esc_html__( 'Select the column layout for displaying field choices.', 'everest-forms' );
1648 $options = array(
1649 '' => esc_html__( 'One Column', 'everest-forms' ),
1650 '2' => esc_html__( 'Two Columns', 'everest-forms' ),
1651 '3' => esc_html__( 'Three Columns', 'everest-forms' ),
1652 'inline' => esc_html__( 'Inline', 'everest-forms' ),
1653 );
1654
1655 // Build output.
1656 $output = $this->field_element(
1657 'label',
1658 $field,
1659 array(
1660 'slug' => 'input_columns',
1661 'value' => esc_html__( 'Layout', 'everest-forms' ),
1662 'tooltip' => $tooltip,
1663 ),
1664 false
1665 );
1666 $output .= $this->field_element(
1667 'select',
1668 $field,
1669 array(
1670 'slug' => 'input_columns',
1671 'value' => $value,
1672 'options' => $options,
1673 ),
1674 false
1675 );
1676 $output = $this->field_element(
1677 'row',
1678 $field,
1679 array(
1680 'slug' => 'input_columns',
1681 'content' => $output,
1682 ),
1683 $echo
1684 );
1685 break;
1686
1687 /**
1688 * Whitelisted Domain.
1689 */
1690 case 'whitelist_domain':
1691 $default = ! empty( $args['default'] ) ? $args['default'] : '0';
1692 // $value for just backward compatibility.
1693 $value = ( isset( $field['whitelist_domain'] ) && ! empty( $field['whitelist_domain'] ) ) ? esc_attr( $field['whitelist_domain'] ) : '';
1694 $allowed_domains = ( isset( $field['allowed_domains'] ) && ! empty( $field['allowed_domains'] ) ) ? esc_attr( $field['allowed_domains'] ) : ( ( isset( $field['select_whitelist'] ) && 'allow' === $field['select_whitelist'] ) ? $value : '' );
1695 $denied_domains = ( isset( $field['denied_domains'] ) && ! empty( $field['denied_domains'] ) ) ? esc_attr( $field['denied_domains'] ) : ( ( isset( $field['select_whitelist'] ) && 'deny' === $field['select_whitelist'] ) ? $value : '' );
1696 $style = ( isset( $field['select_whitelist'] ) && ! empty( $field['select_whitelist'] ) ) ? esc_attr( $field['select_whitelist'] ) : 'allow';
1697 $tooltip = esc_html__( 'Please enter valid allowed or denied domains, separated by commas. For example: google.com, yahoo.com', 'everest-forms' );
1698 $output = $this->field_element(
1699 'label',
1700 $field,
1701 array(
1702 'slug' => 'whitelist_domain',
1703 'value' => esc_html__( 'Whitelisted Domains', 'everest-forms' ),
1704 'tooltip' => $tooltip,
1705 ),
1706 false
1707 );
1708 $output .= $this->field_element(
1709 'select',
1710 $field,
1711 array(
1712 'slug' => 'select_whitelist',
1713 'value' => $style,
1714 'options' => array(
1715 'allow' => esc_html__( 'Allowed Domains', 'everest-forms' ),
1716 'deny' => esc_html__( 'Denied Domains', 'everest-forms' ),
1717 ),
1718 ),
1719 false
1720 );
1721 $output = $this->field_element(
1722 'row',
1723 $field,
1724 array(
1725 'slug' => 'whitelist_domain',
1726 'content' => $output,
1727 ),
1728 $echo
1729 );
1730
1731 $output .= $this->field_element(
1732 'row',
1733 $field,
1734 array(
1735 'slug' => 'allowed_domains',
1736 'content' => $this->field_element(
1737 'text',
1738 $field,
1739 array(
1740 'slug' => 'allowed_domains',
1741 'value' => esc_attr( $allowed_domains ),
1742 'placeholder' => esc_attr__( 'Allowed Domain(s)', 'everest-forms' ),
1743 ),
1744 false
1745 ),
1746 ),
1747 $echo
1748 );
1749 $output .= $this->field_element(
1750 'row',
1751 $field,
1752 array(
1753 'slug' => 'denied_domains',
1754 'content' => $this->field_element(
1755 'text',
1756 $field,
1757 array(
1758 'slug' => 'denied_domains',
1759 'value' => esc_attr( $denied_domains ),
1760 'placeholder' => esc_attr__( 'Denied Domain(s)', 'everest-forms' )
1761 ),
1762 false
1763 ),
1764 ),
1765 $echo
1766 );
1767 break;
1768
1769 /**
1770 * Select All.
1771 */
1772 case 'select_all':
1773 $value = isset( $field['select_all'] ) ? '1' : '0';
1774 $tooltip = esc_html__( 'Check this option to hide the form field label.', 'everest-forms' );
1775
1776 $output = $this->field_element(
1777 'checkbox',
1778 $field,
1779 array(
1780 'slug' => 'select_all',
1781 'value' => $value,
1782 'class' => 'evf-select-all-chk',
1783 'desc' => esc_html__( 'Select All', 'everest-forms' ),
1784 'tooltip' => esc_html__( 'Check this option to select all the options.', 'everest-forms' ),
1785 ),
1786 false
1787 );
1788 $output = $this->field_element(
1789 'row',
1790 $field,
1791 array(
1792 'slug' => 'select_all',
1793 'content' => $output,
1794 ),
1795 $echo
1796 );
1797 break;
1798
1799 /*
1800 * Default.
1801 */
1802 default:
1803 if ( is_callable( array( $this, $option ) ) ) {
1804 $this->{$option}( $field );
1805 }
1806 do_action( 'everest_forms_field_options_' . $option, $this, $field, $args );
1807 break;
1808
1809 }
1810
1811 if ( $echo && in_array( $option, array( 'basic-options', 'advanced-options' ), true ) && 'open' === $markup ) {
1812 do_action( "everest_forms_field_options_top_{$option}", $field, $this );
1813 } elseif ( $echo && in_array( $option, array( 'basic-options', 'advanced-options' ), true ) && 'close' === $markup ) {
1814 do_action( "everest_forms_field_options_after_{$option}", $field, $this );
1815 }
1816
1817 if ( ! $echo ) {
1818 return $output;
1819 }
1820 }
1821
1822 /**
1823 * Helper function to create common field options that are used frequently
1824 * in the field preview.
1825 *
1826 * @since 1.0.0
1827 *
1828 * @param string $option Field option to render.
1829 * @param array $field Field data and settings.
1830 * @param array $args Field preview arguments.
1831 * @param boolean $echo Print or return the value. Print by default.
1832 *
1833 * @return mixed Print or return a string.
1834 */
1835 public function field_preview_option( $option, $field, $args = array(), $echo = true ) {
1836 $output = '';
1837 $class = ! empty( $args['class'] ) ? evf_sanitize_classes( $args['class'] ) : '';
1838 $form_id = isset( $_GET['form_id'] ) ? absint( $_GET['form_id'] ) : 0; // phpcs:ignore WordPress.Security.NonceVerification
1839 $form_data = evf()->form->get( absint( $form_id ), array( 'content_only' => true ) );
1840 $markup = '';
1841
1842 if ( $echo && in_array( $option, array( 'basic-options', 'advanced-options' ), true ) && 'open' === $markup ) {
1843 do_action( "everest_forms_field_options_before_{$option}", $field, $this );
1844 } elseif ( $echo && in_array( $option, array( 'basic-options', 'advanced-options' ), true ) && 'close' === $markup ) {
1845 do_action( "everest_forms_field_options_bottom_{$option}", $field, $this );
1846 }
1847
1848 switch ( $option ) {
1849 case 'label':
1850 $label = isset( $field['label'] ) && ! empty( $field['label'] ) ? $field['label'] : '';
1851 if ( $echo ) {
1852 echo sprintf( '<label class="label-title %s"><span class="text">%s</span><span class="required">%s</span></label>', esc_attr( $class ), esc_html( $label ), esc_html( apply_filters( 'everest_form_get_required_type', '*', $field, $form_data ) ) );
1853 } else {
1854 $output = sprintf( '<label class="label-title %s"><span class="text">%s</span><span class="required">%s</span></label>', $class, $label, apply_filters( 'everest_form_get_required_type', '*', $field, $form_data ) );
1855 }
1856 break;
1857
1858 case 'description':
1859 $description = isset( $field['description'] ) && ! empty( $field['description'] ) ? $field['description'] : '';
1860 $description = false !== strpos( $class, 'nl2br' ) ? nl2br( $description ) : $description;
1861 if ( $echo ) {
1862 echo sprintf( '<div class="description %s">%s</div>', esc_attr( $class ), esc_html( $description ) );
1863 } else {
1864 $output = sprintf( '<div class="description %s">%s</div>', $class, $description );
1865 }
1866 break;
1867
1868 case 'repeater_fields':
1869 $repeater_fields = isset( $field['repeater_fields'] ) && ! empty( $field['repeater_fields'] ) ? $field['repeater_fields'] : '';
1870 if ( $echo ) {
1871 echo sprintf( '<div>%s</div>', esc_html( $repeater_fields ) );
1872 } else {
1873 $output = sprintf( '<div>%s</div>', $repeater_fields );
1874 }
1875 break;
1876
1877 case 'repeater_button_add_remove_label':
1878 $add_new_label = isset( $field['repeater_button_add_new_label'] ) && ! empty( $field['repeater_button_add_new_label'] ) ? $field['repeater_button_add_new_label'] : 'Add';
1879 $remove_label = isset( $field['repeater_button_remove_label'] ) && ! empty( $field['repeater_button_remove_label'] ) ? $field['repeater_button_remove_label'] : 'Remove';
1880 if ( $echo ) {
1881 echo sprintf( '<div style="margin-right: %s" class="evf-add-row repeater_button_add_remove_label %s"><span class="everest-forms-btn everest-forms-btn-primary dashicons dashicons-plus">%s</span>&nbsp;<span class="everest-forms-btn everest-forms-btn-primary dashicons dashicons-minus">%s</span></div>', '65%', esc_attr( $class ), esc_html( $add_new_label ), esc_html( $remove_label ) );
1882 } else {
1883 $output = sprintf( '<div style="margin-right: %s" class="evf-add-row repeater_button_add_remove_label %s"><span class="everest-forms-btn everest-forms-btn-primary dashicons dashicons-plus">%s</span>&nbsp;<span class="everest-forms-btn everest-forms-btn-primary dashicons dashicons-minus">%s</span></div>', '65%', $class, $add_new_label, $remove_label );
1884 }
1885 break;
1886
1887 case 'choices':
1888 $values = ! empty( $field['choices'] ) ? $field['choices'] : $this->defaults;
1889 $choices_fields = array( 'select', 'radio', 'checkbox', 'payment-multiple', 'payment-checkbox' );
1890
1891 // Notify if choices source is currently empty.
1892 if ( empty( $values ) ) {
1893 $values = array(
1894 'label' => esc_html__( '(empty)', 'everest-forms' ),
1895 );
1896 }
1897
1898 // Build output.
1899 if ( ! in_array( $field['type'], $choices_fields, true ) ) {
1900 break;
1901 }
1902
1903 switch ( $field['type'] ) {
1904 case 'checkbox':
1905 case 'payment-checkbox':
1906 $type = 'checkbox';
1907 break;
1908
1909 case 'select':
1910 $type = 'select';
1911 break;
1912
1913 default:
1914 $type = 'radio';
1915 break;
1916 }
1917
1918 $list_class = array( 'widefat', 'primary-input' );
1919 $choices_images = ! empty( $field['choices_images'] );
1920
1921 if ( $choices_images ) {
1922 $list_class[] = 'everest-forms-image-choices';
1923 }
1924
1925 if ( ! empty( $class ) ) {
1926 $list_class[] = $class;
1927 }
1928
1929 if ( 'select' === $type ) {
1930 $multiple = ! empty( $field['multiple_choices'] ) ? ' multiple' : '';
1931 $placeholder = ! empty( $field['placeholder'] ) ? esc_attr( $field['placeholder'] ) : '';
1932
1933 if ( $echo ) {
1934 echo sprintf( '<select class="%s" %s data-placeholder="%s" disabled>', esc_attr( evf_sanitize_classes( $list_class, true ) ), esc_attr( $multiple ), esc_attr( $placeholder ) );
1935
1936 // Optional placeholder.
1937 if ( ! empty( $placeholder ) ) {
1938 echo sprintf( '<option value="" class="placeholder">%s</option>', esc_html( $placeholder ) );
1939 }
1940
1941 // Build the select options (even though user can only see 1st option).
1942 foreach ( $values as $value ) {
1943 $default = isset( $value['default'] ) ? (bool) $value['default'] : false;
1944 $selected = ! empty( $placeholder ) && empty( $multiple ) ? '' : selected( true, $default, false );
1945 echo sprintf( '<option %s>%s</option>', esc_attr( $selected ), esc_html( $value['label'] ) );
1946 }
1947
1948 echo '</select>';
1949 } else {
1950 $output = sprintf( '<select class="%s" %s data-placeholder="%s" disabled>', evf_sanitize_classes( $list_class, true ), esc_attr( $multiple ), esc_attr( $placeholder ) );
1951
1952 // Optional placeholder.
1953 if ( ! empty( $placeholder ) ) {
1954 $output .= sprintf( '<option value="" class="placeholder">%s</option>', esc_html( $placeholder ) );
1955 }
1956
1957 // Build the select options (even though user can only see 1st option).
1958 foreach ( $values as $value ) {
1959 $default = isset( $value['default'] ) ? (bool) $value['default'] : false;
1960 $selected = ! empty( $placeholder ) && empty( $multiple ) ? '' : selected( true, $default, false );
1961 $output .= sprintf( '<option %s>%s</option>', $selected, esc_html( $value['label'] ) );
1962 }
1963
1964 $output .= '</select>';
1965 }
1966 } else {
1967
1968 if ( $echo ) {
1969 echo sprintf( '<ul class="%s">', esc_attr( evf_sanitize_classes( $list_class, true ) ) );
1970
1971 // Individual checkbox/radio options.
1972 foreach ( $values as $value ) {
1973 $default = isset( $value['default'] ) ? $value['default'] : '';
1974 $selected = checked( '1', $default, false );
1975 $placeholder = wp_remote_get( evf()->plugin_url( 'assets/images/everest-forms-placeholder.png' ), array( 'sslverify' => false ) );
1976 $image_src = ! empty( $value['image'] ) ? esc_url( $value['image'] ) : $placeholder;
1977 $item_class = array();
1978
1979 if ( ! empty( $value['default'] ) ) {
1980 $item_class[] = 'everest-forms-selected';
1981 }
1982
1983 if ( $choices_images ) {
1984 $item_class[] = 'everest-forms-image-choices-item';
1985 }
1986
1987 echo sprintf( '<li class="%s">', esc_attr( evf_sanitize_classes( $item_class, true ) ) );
1988
1989 if ( $choices_images ) {
1990 echo '<label>';
1991 echo sprintf( '<span class="everest-forms-image-choices-image"><img src="%s" alt="%s"%s></span>', esc_url( $image_src ), esc_attr( $value['label'] ), ( ! empty( $value['label'] ) ? ' title="' . esc_attr( $value['label'] ) . '"' : '' ) );
1992 echo sprintf( '<input type="%s" %s disabled>', esc_attr( $type ), esc_attr( $selected ) );
1993 if ( ( 'payment-checkbox' === $field['type'] ) || ( 'payment-multiple' === $field['type'] ) ) {
1994 echo '<span class="everest-forms-image-choices-label">' . esc_html( $value['label'] . '-' . evf_format_amount( evf_sanitize_amount( $value['value'] ), true ) ) . '</span>';
1995 } else {
1996 echo '<span class="everest-forms-image-choices-label">' . esc_html( $value['label'] ) . '</span>';
1997 }
1998 echo '</label>';
1999 } else {
2000 if ( ( 'payment-checkbox' === $field['type'] ) || ( 'payment-multiple' === $field['type'] ) ) {
2001 echo sprintf( '<input type="%s" %s disabled>%s - %s', esc_attr( $type ), esc_attr( $selected ), esc_html( $value['label'] ), esc_attr( evf_format_amount( evf_sanitize_amount( $value['value'] ) ), true ) );
2002 } else {
2003 echo sprintf( '<input type="%s" %s disabled>%s', esc_attr( $type ), esc_attr( $selected ), esc_html( $value['label'] ) );
2004 }
2005 }
2006
2007 echo '</li>';
2008 }
2009
2010 echo '</ul>';
2011
2012 } else {
2013 $output = sprintf( '<ul class="%s">', evf_sanitize_classes( $list_class, true ) );
2014
2015 // Individual checkbox/radio options.
2016 foreach ( $values as $value ) {
2017 $default = isset( $value['default'] ) ? $value['default'] : '';
2018 $selected = checked( '1', $default, false );
2019 $placeholder = wp_remote_get( evf()->plugin_url( 'assets/images/everest-forms-placeholder.png' ), array( 'sslverify' => false ) );
2020 $image_src = ! empty( $value['image'] ) ? esc_url( $value['image'] ) : $placeholder;
2021 $item_class = array();
2022
2023 if ( ! empty( $value['default'] ) ) {
2024 $item_class[] = 'everest-forms-selected';
2025 }
2026
2027 if ( $choices_images ) {
2028 $item_class[] = 'everest-forms-image-choices-item';
2029 }
2030
2031 $output .= sprintf( '<li class="%s">', evf_sanitize_classes( $item_class, true ) );
2032
2033 if ( $choices_images ) {
2034 $output .= '<label>';
2035 $output .= sprintf( '<span class="everest-forms-image-choices-image"><img src="%s" alt="%s"%s></span>', $image_src, esc_attr( $value['label'] ), ! empty( $value['label'] ) ? ' title="' . esc_attr( $value['label'] ) . '"' : '' );
2036 $output .= sprintf( '<input type="%s" %s disabled>', $type, $selected );
2037 if ( ( 'payment-checkbox' === $field['type'] ) || ( 'payment-multiple' === $field['type'] ) ) {
2038 $output .= '<span class="everest-forms-image-choices-label">' . wp_kses_post( $value['label'] ) . '-' . evf_format_amount( evf_sanitize_amount( $value['value'] ), true ) . '</span>';
2039 } else {
2040 $output .= '<span class="everest-forms-image-choices-label">' . wp_kses_post( $value['label'] ) . '</span>';
2041 }
2042 $output .= '</label>';
2043 } else {
2044 if ( ( 'payment-checkbox' === $field['type'] ) || ( 'payment-multiple' === $field['type'] ) ) {
2045 $output .= sprintf( '<input type="%s" %s disabled>%s - %s', $type, $selected, $value['label'], evf_format_amount( evf_sanitize_amount( $value['value'] ), true ) );
2046 } else {
2047 $output .= sprintf( '<input type="%s" %s disabled>%s', $type, $selected, $value['label'] );
2048 }
2049 }
2050
2051 $output .= '</li>';
2052 }
2053
2054 $output .= '</ul>';
2055 }
2056 }
2057 break;
2058 }
2059
2060 if ( $echo && in_array( $option, array( 'basic-options', 'advanced-options' ), true ) && 'open' === $markup ) {
2061 do_action( "everest_forms_field_options_top_{$option}", $field, $this );
2062 } elseif ( $echo && in_array( $option, array( 'basic-options', 'advanced-options' ), true ) && 'close' === $markup ) {
2063 do_action( "everest_forms_field_options_after_{$option}", $field, $this );
2064 }
2065
2066 if ( ! $echo ) {
2067 return $output;
2068 }
2069 }
2070
2071 /**
2072 * Create a new field in the admin AJAX editor.
2073 *
2074 * @since 1.0.0
2075 */
2076 public function field_new() {
2077 // Run a security check.
2078 check_ajax_referer( 'everest_forms_field_drop', 'security' );
2079
2080 // Check for form ID.
2081 if ( ! isset( $_POST['form_id'] ) || empty( $_POST['form_id'] ) ) {
2082 die( esc_html__( 'No form ID found', 'everest-forms' ) );
2083 }
2084
2085 // Check for permissions.
2086 if ( ! current_user_can( 'everest_forms_edit_form', (int) $_POST['form_id'] ) ) {
2087 die( esc_html__( 'You don\'t have permission.', 'everest-forms' ) );
2088 }
2089
2090 // Check for field type to add.
2091 if ( ! isset( $_POST['field_type'] ) || empty( $_POST['field_type'] ) ) {
2092 die( esc_html__( 'No field type found', 'everest-forms' ) );
2093 }
2094
2095 // Grab field data.
2096 $field_args = ! empty( $_POST['defaults'] ) && is_array( $_POST['defaults'] ) ? array_map( 'sanitize_text_field', wp_unslash( $_POST['defaults'] ) ) : array();
2097 $field_type = esc_attr( sanitize_text_field( wp_unslash( $_POST['field_type'] ) ) );
2098 $field_id = evf()->form->field_unique_key( sanitize_text_field( wp_unslash( $_POST['form_id'] ) ) );
2099 $field = array(
2100 'id' => $field_id,
2101 'type' => $field_type,
2102 'label' => $this->name,
2103 'description' => '',
2104 );
2105 $field = wp_parse_args( $field_args, $field );
2106 $field = apply_filters( 'everest_forms_field_new_default', $field );
2107 $field_required = apply_filters( 'everest_forms_field_new_required', '', $field );
2108 $field_class = apply_filters( 'everest_forms_field_new_class', '', $field );
2109
2110 // Field types that default to required.
2111 if ( ! empty( $field_required ) ) {
2112 $field_required = 'required';
2113 $field['required'] = '1';
2114 }
2115
2116 // Build Preview.
2117 ob_start();
2118 $this->field_preview( $field );
2119 $preview = sprintf( '<div class="everest-forms-field everest-forms-field-%s %s %s" id="everest-forms-field-%s" data-field-id="%s" data-field-type="%s">', $field_type, $field_required, $field_class, $field['id'], $field['id'], $field_type );
2120 $preview .= sprintf( '<div class="evf-field-action">' );
2121 if ( 'repeater-fields' !== $field_type ) {
2122 $preview .= sprintf( '<a href="#" class="everest-forms-field-duplicate" title="%s"><span class="dashicons dashicons-media-default"></span></a>', __( 'Duplicate Field', 'everest-forms' ) );
2123 $preview .= sprintf( '<a href="#" class="everest-forms-field-delete" title="%s"><span class="dashicons dashicons-trash"></span></a>', __( 'Delete Field', 'everest-forms' ) );
2124 $preview .= sprintf( '<a href="#" class="everest-forms-field-setting" title="%s"><span class="dashicons dashicons-admin-generic"></span></a>', __( 'Settings', 'everest-forms' ) );
2125 } else {
2126 $preview .= sprintf( '<a href="#" class="evf-duplicate-row" title="%s"><span class="dashicons dashicons-media-default"></span></a>', esc_html__( 'Duplicate Field', 'everest-forms' ) );
2127 $preview .= sprintf( '<a href="#" class="evf-delete-row" title="%s"><span class="dashicons dashicons-trash"></span></a>', esc_html__( 'Delete Field', 'everest-forms' ) );
2128 }
2129 $preview .= sprintf( '</div>' );
2130 $preview .= ob_get_clean();
2131 $preview .= '</div>';
2132
2133 // Build Options.
2134 $options = sprintf( '<div class="everest-forms-field-option everest-forms-field-option-%s" id="everest-forms-field-option-%s" data-field-id="%s">', esc_attr( $field['type'] ), $field['id'], $field['id'] );
2135 $options .= sprintf( '<input type="hidden" name="form_fields[%s][id]" value="%s" class="everest-forms-field-option-hidden-id">', $field['id'], $field['id'] );
2136 $options .= sprintf( '<input type="hidden" name="form_fields[%s][type]" value="%s" class="everest-forms-field-option-hidden-type">', $field['id'], esc_attr( $field['type'] ) );
2137 ob_start();
2138 $this->field_options( $field );
2139 $options .= ob_get_clean();
2140 $options .= '</div>';
2141
2142 $form_field_array = explode( '-', $field_id );
2143 $field_id_int = absint( $form_field_array[ count( $form_field_array ) - 1 ] );
2144
2145 // Prepare to return compiled results.
2146 wp_send_json_success(
2147 array(
2148 'form_id' => (int) $_POST['form_id'],
2149 'field' => $field,
2150 'preview' => $preview,
2151 'options' => $options,
2152 'form_field_id' => ( $field_id_int + 1 ),
2153 )
2154 );
2155 }
2156
2157 /**
2158 * Field display on the form front-end.
2159 *
2160 * @since 1.0.0
2161 *
2162 * @param array $field Field Data.
2163 * @param array $field_atts Field attributes.
2164 * @param array $form_data All Form Data.
2165 */
2166 public function field_display( $field, $field_atts, $form_data ) {}
2167
2168 /**
2169 * Edit form field display on the entry back-end.
2170 *
2171 * @since 1.7.0
2172 *
2173 * @param array $entry_field Entry field data.
2174 * @param array $field Field data.
2175 * @param array $form_data Form data and settings.
2176 */
2177 public function edit_form_field_display( $entry_field, $field, $form_data ) {
2178
2179 if ( 'repeater_fields' === $field['type'] ) {
2180 return;
2181 }
2182
2183 $value = isset( $entry_field['value'] ) ? $entry_field['value'] : '';
2184
2185 if ( '' !== $value ) {
2186 $field['properties'] = $this->get_single_field_property_value( $value, 'primary', $field['properties'], $field );
2187 }
2188
2189 $this->field_display( $field, null, $form_data );
2190 }
2191
2192 /**
2193 * Get the value to prefill, based on field data and current properties.
2194 *
2195 * @since 1.7.0
2196 *
2197 * @param string $raw_value Raw Value, always a string.
2198 * @param string $input Subfield inside the field.
2199 * @param array $properties Field properties.
2200 * @param array $field Field specific data.
2201 *
2202 * @return array Modified field properties.
2203 */
2204 public function get_single_field_property_value( $raw_value, $input, $properties, $field ) {
2205 if ( ! is_string( $raw_value ) ) {
2206 return $properties;
2207 }
2208
2209 $get_value = wp_unslash( sanitize_text_field( $raw_value ) );
2210
2211 if ( ! empty( $field['choices'] ) && is_array( $field['choices'] ) ) {
2212 $properties = $this->get_single_field_property_value_choices( $get_value, $properties, $field );
2213 } else {
2214 if (
2215 ! empty( $input ) &&
2216 isset( $properties['inputs'][ $input ] )
2217 ) {
2218 $properties['inputs'][ $input ]['attr']['value'] = $get_value;
2219
2220 // Update data attributes depending on the field type.
2221 if ( isset( $field['type'] ) && 'range-slider' === $field['type'] ) {
2222 $properties['inputs'][ $input ]['data']['from'] = $get_value;
2223 }
2224 }
2225 }
2226
2227 return $properties;
2228 }
2229
2230 /**
2231 * Get the value to prefill for choices section, based on field data and current properties.
2232 *
2233 * @since 1.7.0
2234 *
2235 * @param string $get_value Requested value.
2236 * @param array $properties Field properties.
2237 * @param array $field Field specific data.
2238 *
2239 * @return array Modified field properties.
2240 */
2241 protected function get_single_field_property_value_choices( $get_value, $properties, $field ) {
2242 $default_key = null;
2243
2244 // For fields with normal choices, we need dafault key.
2245 foreach ( $field['choices'] as $choice_key => $choice_arr ) {
2246 $choice_value_key = isset( $field['show_values'] ) ? 'value' : 'label';
2247 if (
2248 isset( $choice_arr[ $choice_value_key ] ) &&
2249 strtoupper( sanitize_text_field( $choice_arr[ $choice_value_key ] ) ) === strtoupper( $get_value )
2250 ) {
2251 $default_key = $choice_key;
2252 break;
2253 }
2254 }
2255
2256 // Redefine selected choice.
2257 if ( null !== $default_key ) {
2258 foreach ( $field['choices'] as $choice_key => $choice_arr ) {
2259 if ( $choice_key === $default_key ) {
2260 $properties['inputs'][ $choice_key ]['default'] = true;
2261 $properties['inputs'][ $choice_key ]['container']['class'][] = 'everest-forms-selected';
2262 break;
2263 }
2264 }
2265 }
2266
2267 return $properties;
2268 }
2269
2270 /**
2271 * Remove all admin-defined defaults from choices-related fields only.
2272 *
2273 * @since 1.7.0
2274 *
2275 * @param array $field Field data and settings.
2276 * @param array $properties Field Properties to be modified.
2277 */
2278 protected function remove_field_choices_defaults( $field, &$properties ) {
2279 if ( ! empty( $field['choices'] ) ) {
2280 array_walk_recursive(
2281 $properties['inputs'],
2282 function ( &$value, $key ) {
2283 if ( 'default' === $key ) {
2284 $value = false;
2285 }
2286 if ( 'everest-forms-selected' === $value ) {
2287 $value = '';
2288 }
2289 }
2290 );
2291 }
2292 }
2293
2294 /**
2295 * Display field input errors if present.
2296 *
2297 * @since 1.0.0
2298 *
2299 * @param string $key Input key.
2300 * @param array $field Field data and settings.
2301 */
2302 public function field_display_error( $key, $field ) {
2303 // Need an error.
2304 if ( empty( $field['properties']['error']['value'][ $key ] ) ) {
2305 return;
2306 }
2307
2308 printf(
2309 '<label class="everest-forms-error evf-error" for="%s">%s</label>',
2310 esc_attr( $field['properties']['inputs'][ $key ]['id'] ),
2311 esc_html( $field['properties']['error']['value'][ $key ] )
2312 );
2313 }
2314
2315 /**
2316 * Display field input sublabel if present.
2317 *
2318 * @since 1.0.0
2319 *
2320 * @param string $key Input key.
2321 * @param string $position Sublabel position.
2322 * @param array $field Field data and settings.
2323 */
2324 public function field_display_sublabel( $key, $position, $field ) {
2325 // Need a sublabel value.
2326 if ( empty( $field['properties']['inputs'][ $key ]['sublabel']['value'] ) ) {
2327 return;
2328 }
2329
2330 $pos = ! empty( $field['properties']['inputs'][ $key ]['sublabel']['position'] ) ? $field['properties']['inputs'][ $key ]['sublabel']['position'] : 'after';
2331 $hidden = ! empty( $field['properties']['inputs'][ $key ]['sublabel']['hidden'] ) ? 'everest-forms-sublabel-hide' : '';
2332
2333 if ( $pos !== $position ) {
2334 return;
2335 }
2336
2337 printf(
2338 '<label for="%s" class="everest-forms-field-sublabel %s %s">%s</label>',
2339 esc_attr( $field['properties']['inputs'][ $key ]['id'] ),
2340 sanitize_html_class( $pos ),
2341 esc_html( $hidden ),
2342 esc_html( evf_string_translation( (int) $this->form_data['id'], $field['id'], $field['properties']['inputs'][ $key ]['sublabel']['value'], '-sublabel-' . $key ) )
2343 );
2344 }
2345
2346 /**
2347 * Validates field on form submit.
2348 *
2349 * @since 1.0.0
2350 *
2351 * @param string $field_id Field Id.
2352 * @param string|array $field_submit Submitted Data.
2353 * @param array $form_data All Form Data.
2354 */
2355 public function validate( $field_id, $field_submit, $form_data ) {
2356 $field_type = isset( $form_data['form_fields'][ $field_id ]['type'] ) ? $form_data['form_fields'][ $field_id ]['type'] : '';
2357 $required_field = isset( $form_data['form_fields'][ $field_id ]['required'] ) ? $form_data['form_fields'][ $field_id ]['required'] : false;
2358 $field = isset( $form_data['form_fields'][ $field_id ] ) ? $form_data['form_fields'][ $field_id ] : '';
2359 $required_validation = get_option( 'everest_forms_required_validation' );
2360 if ( in_array( $field_type, array( 'number', 'email', 'url', 'phone' ), true ) ) {
2361 $required_validation = get_option( 'everest_forms_' . $field['type'] . '_validation' );
2362 }
2363 $required_message = isset( $form_data['form_fields'][ $field_id ]['required-field-message'], $form_data['form_fields'][ $field_id ]['required_field_message_setting'] ) && ! empty( $form_data['form_fields'][ $field_id ]['required-field-message'] ) && 'individual' == $form_data['form_fields'][ $field_id ]['required_field_message_setting'] ? $form_data['form_fields'][ $field_id ]['required-field-message'] : $required_validation;
2364 $entry = $form_data['entry'];
2365 $visible = apply_filters( 'everest_forms_visible_fields', true, $form_data['form_fields'][ $field_id ], $entry, $form_data );
2366
2367 if ( false === $visible ) {
2368 return;
2369 }
2370 // Basic required check - If field is marked as required, check for entry data.
2371 if ( false !== $required_field && ( empty( $field_submit ) && '0' !== $field_submit ) ) {
2372 evf()->task->errors[ $form_data['id'] ][ $field_id ] = $required_message;
2373 update_option( 'evf_validation_error', 'yes' );
2374 }
2375
2376 // Type validations.
2377 switch ( $field_type ) {
2378 case 'url':
2379 if ( ! empty( $_POST['everest_forms']['form_fields'][ $field_id ] ) && filter_var( $field_submit, FILTER_VALIDATE_URL ) === false ) { // phpcs:ignore WordPress.Security.NonceVerification
2380 $validation_text = get_option( 'evf_' . $field_type . '_validation', esc_html__( 'Please enter a valid url', 'everest-forms' ) );
2381 }
2382 break;
2383 case 'email':
2384 if ( is_array( $field_submit ) ) {
2385 $value = ! empty( $field_submit['primary'] ) ? $field_submit['primary'] : '';
2386 } else {
2387 $value = ! empty( $field_submit ) ? $field_submit : '';
2388 }
2389 if ( ! empty( $_POST['everest_forms']['form_fields'][ $field_id ] ) && ! is_email( $value ) ) { // phpcs:ignore WordPress.Security.NonceVerification
2390 $validation_text = get_option( 'evf_' . $field_type . '_validation', esc_html__( 'Please enter a valid email address', 'everest-forms' ) );
2391 }
2392 break;
2393 case 'number':
2394 if ( ! empty( $_POST['everest_forms']['form_fields'][ $field_id ] ) && ! is_numeric( $field_submit ) ) { // phpcs:ignore WordPress.Security.NonceVerification
2395 $validation_text = get_option( 'evf_' . $field_type . '_validation', esc_html__( 'Please enter a valid number', 'everest-forms' ) );
2396 }
2397 break;
2398 case 'textarea':
2399 case 'text':
2400 if ( ! empty( $_POST['everest_forms']['form_fields'][ $field_id ] ) ) { // phpcs:ignore WordPress.Security.NonceVerification
2401
2402 // Limit Length.
2403 if ( isset( $field['limit_enabled'], $field['limit_mode'], $field['limit_count'] ) && '1' === $field['limit_enabled'] && in_array( $field['limit_mode'], array( 'characters', 'words' ), true ) && ! empty( $field['limit_count'] ) ) {
2404 if ( 'words' === $field['limit_mode'] && $field['limit_count'] < str_word_count( $field_submit ) ) {
2405 /* translators: %s Number of max words. */
2406 $validation_text = sprintf( esc_html__( 'This field contains at most %s words', 'everest-forms' ), $field['limit_count'] );
2407 } elseif ( 'characters' === $field['limit_mode'] && $field['limit_count'] < mb_strlen( $field_submit ) ) {
2408 /* translators: %s Number of max characters. */
2409 $validation_text = sprintf( esc_html__( 'This field contains at most %s characters', 'everest-forms' ), $field['limit_count'] );
2410 }
2411 }
2412
2413 // Min Length.
2414 if ( isset( $field['min_length_enabled'], $field['min_length_mode'], $field['min_length_count'] ) && '1' === $field['min_length_enabled'] && in_array( $field['min_length_mode'], array( 'characters', 'words' ), true ) && ! empty( $field['min_length_count'] ) ) {
2415 if ( 'words' === $field['min_length_mode'] && $field['min_length_count'] > str_word_count( $field_submit ) ) {
2416 /* translators: %s Number of minimum words. */
2417 $validation_text = sprintf( esc_html__( 'This field contains at least %s words', 'everest-forms' ), $field['min_length_count'] );
2418 } elseif ( 'characters' === $field['min_length_mode'] && $field['min_length_count'] > mb_strlen( $field_submit ) ) {
2419 /* translators: %s Number of minimum characters. */
2420 $validation_text = sprintf( esc_html__( 'This field contains at least %s characters', 'everest-forms' ), $field['min_length_count'] );
2421 }
2422 }
2423 }
2424 break;
2425 }
2426
2427 if ( isset( $validation_text ) ) {
2428 evf()->task->errors[ $form_data['id'] ][ $field_id ] = apply_filters( 'everest_forms_type_validation', $validation_text );
2429 update_option( 'evf_validation_error', 'yes' );
2430 }
2431 }
2432
2433 /**
2434 * Formats and sanitizes field.
2435 *
2436 * @since 1.0.0
2437 *
2438 * @param int $field_id Field ID.
2439 * @param mixed $field_submit Submitted field value.
2440 * @param array $form_data Form data and settings.
2441 * @param string $meta_key Field meta key.
2442 */
2443 public function format( $field_id, $field_submit, $form_data, $meta_key ) {
2444 if ( is_array( $field_submit ) ) {
2445 $field_submit = array_filter( $field_submit );
2446 $field_submit = implode( "\r\n", $field_submit );
2447 }
2448
2449 $name = ! empty( $form_data['form_fields'][ $field_id ]['label'] ) ? make_clickable( $form_data['form_fields'][ $field_id ]['label'] ) : '';
2450
2451 // Sanitize but keep line breaks.
2452 $value = evf_sanitize_textarea_field( $field_submit );
2453
2454 evf()->task->form_fields[ $field_id ] = array(
2455 'name' => $name,
2456 'value' => $value,
2457 'id' => $field_id,
2458 'type' => $this->type,
2459 'meta_key' => $meta_key,
2460 );
2461 }
2462
2463 /**
2464 * Field with limit.
2465 *
2466 * @param array $field Field to check.
2467 * @return boolean
2468 */
2469 protected function field_is_limit( $field ) {
2470 if ( in_array( $field['type'], array( 'text', 'textarea' ), true ) ) {
2471 return ( isset( $field['limit_enabled'] ) && ! empty( $field['limit_count'] ) ) || ( isset( $field['min_length_enabled'] ) && ! empty( $field['min_length_count'] ) );
2472 }
2473 }
2474
2475 /**
2476 * Filter callback for outputting formatted data.
2477 *
2478 * @param array $field Field Data.
2479 */
2480 public function field_exporter( $field ) {
2481 $export = array();
2482
2483 switch ( $this->type ) {
2484 case 'radio':
2485 case 'signature':
2486 case 'payment-multiple':
2487 $value = '';
2488 $image = ! empty( $field['value']['image'] ) ? sprintf( '<img src="%s" style="width:75px;height:75px;max-height:75px;max-width:75px;" /><br>', $field['value']['image'] ) : '';
2489 $value = ! empty( $field['value']['label'] ) ? $image . $field['value']['label'] : '';
2490 $export = array(
2491 'label' => ! empty( $field['value']['name'] ) ? $field['value']['name'] : ucfirst( str_replace( '_', ' ', $field['type'] ) ) . " - {$field['id']}",
2492 'value' => ! empty( $value ) ? $value : false,
2493 );
2494 break;
2495 case 'checkbox':
2496 case 'payment-checkbox':
2497 $value = array();
2498
2499 if ( count( $field['value'] ) ) {
2500 foreach ( $field['value']['label'] as $key => $choice ) {
2501 $image = ! empty( $field['value']['images'][ $key ] ) ? sprintf( '<img src="%s" style="width:75px;height:75px;max-height:75px;max-width:75px;" /><br>', $field['value']['images'][ $key ] ) : '';
2502
2503 if ( ! empty( $choice ) ) {
2504 $value[ $key ] = $image . $choice;
2505 }
2506 }
2507 }
2508 $export = array(
2509 'label' => ! empty( $field['value']['name'] ) ? $field['value']['name'] : ucfirst( str_replace( '_', ' ', $field['type'] ) ) . " - {$field['id']}",
2510 'value' => is_array( $value ) ? implode( '<br>', array_values( $value ) ) : false,
2511 );
2512 break;
2513 default:
2514 $export = array(
2515 'label' => ! empty( $field['name'] ) ? $field['name'] : ucfirst( str_replace( '_', ' ', $field['type'] ) ) . " - {$field['id']}",
2516 'value' => ! empty( $field['value'] ) ? ( is_array( $field['value'] ) ? $this->implode_recursive( $field['value'] ) : $field['value'] ) : false,
2517 );
2518 }
2519
2520 return $export;
2521 }
2522
2523 /**
2524 * Recursively process an array with an implosion.
2525 *
2526 * @since 1.6.6
2527 *
2528 * @param array $array Array that needs to be recursively imploded.
2529 * @param string $delimiter Delimiter for the implosion - defaults to <br>.
2530 *
2531 * @return string $output Imploded array.
2532 */
2533 protected function implode_recursive( $array, $delimiter = '<br>' ) {
2534 $output = '';
2535
2536 foreach ( $array as $tuple ) {
2537 if ( is_array( $tuple ) ) {
2538 $output .= $this->implode_recursive( $tuple, ' ' );
2539 } elseif ( ! empty( $tuple ) ) {
2540 $output .= $delimiter . $tuple;
2541 }
2542 }
2543
2544 return $output;
2545 }
2546 }
2547