PluginProbe
weForms – Easy Drag & Drop Contact Form Builder For WordPress / 1.6.18
weForms – Easy Drag & Drop Contact Form Builder For WordPress v1.6.18
1.6.7 1.6.8 1.6.9 1.6.12 1.6.13 1.6.14 1.6.15 1.6.16 1.6.17 1.6.18 1.6.19 1.6.2 1.6.20 1.6.21 1.6.22 1.6.23 1.6.24 1.6.25 1.6.26 1.6.27 1.6.28 1.6.3 1.6.4 1.6.5 1.6.6 All 74 releases
weforms / includes / class-ajax.php

class-ajax.php in weForms – Easy Drag & Drop Contact Form Builder For WordPress 1.6.18, at includes/class-ajax.php

1,245 lines 45.2 KB
No matching file
Up and down to move Enter to open Esc to close
Raw Download Zip
1 <?php
2
3 /**
4 * The ajax handler class
5 */
6 class WeForms_Ajax {
7
8 public function __construct() {
9
10 // backend requests
11 add_action( 'wp_ajax_weforms_form_list', [ $this, 'get_contact_forms' ] );
12 add_action( 'wp_ajax_weforms_get_users', [ $this, 'get_all_users' ] );
13 add_action( 'wp_ajax_weforms_form_names', [ $this, 'get_contact_form_names' ] );
14 add_action( 'wp_ajax_weforms_form_create', [ $this, 'create_form' ] );
15 add_action( 'wp_ajax_weforms_form_delete', [ $this, 'delete_form' ] );
16 add_action( 'wp_ajax_weforms_form_delete_bulk', [ $this, 'delete_form_bulk' ] );
17 add_action( 'wp_ajax_weforms_form_duplicate', [ $this, 'duplicate_form' ] );
18
19 // read logs
20 add_action( 'wp_ajax_weforms_read_logs', [ $this, 'get_logs' ] );
21 add_action( 'wp_ajax_weforms_delete_logs', [ $this, 'delete_logs' ] );
22
23 // create from a template
24 add_filter( 'wp_ajax_weforms_contact_form_template', [ $this, 'create_form_from_template' ] );
25
26 // form settings
27 add_action( 'wp_ajax_weforms_save_settings', [ $this, 'save_settings' ] );
28 add_action( 'wp_ajax_weforms_get_settings', [ $this, 'get_settings' ] );
29
30 // import
31 add_action( 'wp_ajax_weforms_import_form', [ $this, 'import_form' ] );
32
33 // form editing
34 add_action( 'wp_ajax_weforms_get_form', [ $this, 'get_form' ] );
35 add_action( 'wp_ajax_wpuf_form_builder_save_form', [ $this, 'save_form' ] );
36
37 // entries
38 add_action( 'wp_ajax_weforms_form_entries', [ $this, 'get_entries' ] );
39
40 add_action( 'wp_ajax_weforms_form_entry_details', [ $this, 'get_entry_detail' ] );
41 add_action( 'wp_ajax_weforms_form_entry_trash', [ $this, 'trash_entry' ] );
42 add_action( 'wp_ajax_weforms_form_entry_delete', [ $this, 'delete_entry' ] );
43 add_action( 'wp_ajax_weforms_form_entry_restore', [ $this, 'restore_entry' ] );
44
45 add_action( 'wp_ajax_weforms_form_entry_trash_bulk', [ $this, 'bulk_delete_entry' ] );
46 add_action( 'wp_ajax_weforms_form_entry_restore_bulk', [ $this, 'bulk_restore_entry' ] );
47
48 // frontend requests
49 add_action( 'wp_ajax_weforms_frontend_submit', [ $this, 'handle_frontend_submission' ] );
50 add_action( 'wp_ajax_nopriv_weforms_frontend_submit', [ $this, 'handle_frontend_submission' ] );
51 }
52
53 /**
54 * Administrator validation
55 *
56 * @return void
57 */
58 public function check_admin() {
59 if ( !current_user_can( weforms_form_access_capability() ) ) {
60 wp_send_json_error( __( 'You do not have sufficient permission.', 'weforms' ) );
61 }
62 }
63
64 /**
65 * Get a form to edit
66 *
67 * @return void
68 */
69 public function get_form() {
70 $this->check_admin();
71
72 $form_id = isset( $_REQUEST['form_id'] ) ? absint( $_REQUEST['form_id'] ) : 0;
73
74 $form = weforms()->form->get( $form_id );
75
76 $data = [
77 'post' => $form->data,
78 'form_fields' => $form->get_fields(),
79 'settings' => $form->get_settings(),
80 'notifications' => $form->get_notifications(),
81 'integrations' => $form->get_integrations(),
82 ];
83
84 wp_send_json_success( $data );
85 }
86
87 /**
88 * Save the form
89 *
90 * @return void
91 */
92 public function save_form() {
93 $post_data = wp_unslash( $_POST );
94 if ( isset( $post_data['form_data'] ) ) {
95 parse_str( sanitize_text_field( wp_unslash( $post_data['form_data'] ) ), $form_data );
96 }
97
98 if ( !wp_verify_nonce( $form_data['wpuf_form_builder_nonce'], 'wpuf_form_builder_save_form' ) ) {
99 wp_send_json_error( __( 'Unauthorized operation', 'weforms' ) );
100 }
101
102 if ( empty( $form_data['wpuf_form_id'] ) ) {
103 wp_send_json_error( __( 'Invalid form id', 'weforms' ) );
104 }
105
106 $form_fields = isset( $post_data['form_fields'] ) ? $post_data['form_fields'] : '';
107 $notifications = isset( $post_data['notifications'] ) ? $post_data['notifications']: '';
108 $settings = array();
109 $integrations = array();
110
111 if ( isset( $post_data['settings'] ) ) {
112 $settings = json_decode( $post_data['settings'], true );
113 $settings['message'] = sanitize_text_field( $settings['message'] );
114 $settings['url'] = sanitize_url( $settings['url'] );
115 $settings['limit_message'] = sanitize_text_field( $settings['limit_message'] );
116 } else {
117 $settings = isset( $form_data['wpuf_settings'] ) ? $form_data['wpuf_settings'] : [];
118 }
119
120 if ( isset( $post_data['integrations'] ) ) {
121 $integrations = (array) json_decode( $post_data['integrations'] );
122 }
123
124 $form_fields = json_decode( $form_fields, true );
125 $notifications = json_decode( $notifications, true );
126 $data = [
127 'form_id' => absint( $form_data['wpuf_form_id'] ),
128 'post_title' => $form_data['post_title'],
129 'form_fields' => $form_fields,
130 'form_settings' => $settings,
131 'form_settings_key' => isset( $form_data['form_settings_key'] ) ? $form_data['form_settings_key'] : '',
132 'notifications' => $notifications,
133 'integrations' => $integrations,
134 ];
135
136 $form_fields = weforms()->form->save( $data );
137
138 // Update Old Entry meta_key if changed
139 $form_id = $form_data['wpuf_form_id'];
140 $form = weforms()->form->get( $form_id );
141
142 $form->maybe_update_entries( $form_fields );
143
144 do_action( 'weforms_update_form', $form_data['wpuf_form_id'], $form_fields, $settings );
145
146 wp_send_json_success(
147 array(
148 'form_fields' => $form_fields,
149 'settings' => $settings,
150 )
151 );
152 }
153
154 /**
155 * Get all contact forms
156 *
157 * @return void
158 */
159 public function get_contact_forms() {
160 check_ajax_referer( 'weforms' );
161
162 $this->check_admin();
163
164 $args = [
165 'posts_per_page' => isset( $_POST['posts_per_page'] ) ? intval( $_POST['posts_per_page'] ) : 10,
166 'paged' => isset( $_POST['page'] ) ? absint( $_POST['page'] ) : 1,
167 'order' => 'DESC',
168 'orderby' => 'post_date',
169 ];
170
171 $args = apply_filters( 'weforms_ajax_get_contact_forms_args', $args );
172
173 $contact_forms = weforms()->form->get_forms( $args );
174
175 array_map(
176 function ( $form ) {
177 $form->entries = $form->num_form_entries();
178 $form->settings = $form->get_settings();
179 $form->views = $form->num_form_views();
180 $form->payments = $form->num_form_payments();
181 $form->author = $form->get_form_author_details();
182 }, $contact_forms['forms']
183 );
184
185 $contact_forms = $this->filter_contact_forms( $contact_forms );
186 $contact_forms = apply_filters( 'weforms_ajax_get_contact_forms', $contact_forms );
187
188 wp_send_json_success( $contact_forms );
189 }
190
191 /**
192 * Get all users
193 *
194 * @return array
195 */
196 public function get_all_users() {
197 check_ajax_referer( 'weforms' );
198
199 $this->check_admin();
200
201 $users_meta = [];
202 $users = get_users( [ 'fields' => [ 'ID' ] ] );
203
204 foreach ( $users as $user ) {
205 $users_meta[] = [
206 'id' => $user->ID,
207 'data' => get_user_meta( $user->ID ),
208 ];
209 }
210
211 wp_send_json_success( $users_meta );
212 }
213
214 /**
215 * Filter
216 *
217 * @return void
218 */
219 public function filter_contact_forms( &$contact_forms ) {
220 if ( isset( $_REQUEST['filter'] ) && $_REQUEST['filter'] == 'entries' ) {
221 foreach ( $contact_forms['forms'] as $key => &$form ) {
222 if ( isset( $form->entries ) && !$form->entries ) {
223 unset( $contact_forms['forms'][ $key ] );
224 }
225 }
226
227 $contact_forms['meta']['total'] = count( $contact_forms['forms'] );
228 }
229
230 return $contact_forms;
231 }
232
233 /**
234 * Get the names of contact forms for generating dropdown
235 *
236 * @return void
237 */
238 public function get_contact_form_names() {
239 check_ajax_referer( 'weforms' );
240
241 $this->check_admin();
242
243 $contact_forms = weforms()->form->all();
244 $response = [];
245
246 foreach ( $contact_forms['forms'] as $form ) {
247 $response[] = [
248 'id' => $form->get_id(),
249 'title' => $form->get_name() . ' (#' . $form->get_id() . ')',
250 ];
251 }
252
253 wp_send_json_success( $response );
254 }
255
256 /**
257 * Create a form
258 *
259 * @return void
260 */
261 public function create_form() {
262 check_ajax_referer( 'weforms' );
263
264 $this->check_admin();
265
266 $form_name = isset( $_POST['form_name'] ) ? sanitize_text_field( wp_unslash( $_POST['form_name'] ) ) : '';
267
268 if ( empty( $form_name ) ) {
269 wp_send_json_error( __( 'Please provide a form name', 'weforms' ) );
270 }
271
272 $form_id = weforms()->form->create( $form_name );
273
274 if ( is_wp_error( $form_id ) ) {
275 wp_send_json_error( $form_id->get_error_message() );
276 }
277
278 wp_send_json_success( [
279 'form_id' => $form_id,
280 'form_name' => $form_name,
281 ] );
282 }
283
284 /**
285 * Delete a form
286 *
287 * @return void
288 */
289 public function delete_form() {
290 check_ajax_referer( 'weforms' );
291
292 $this->check_admin();
293
294 $form_id = isset( $_POST['form_id'] ) ? intval( $_POST['form_id'] ) : 0;
295
296 if ( !$form_id ) {
297 wp_send_json_error( __( 'No form id provided!', 'weforms' ) );
298 }
299
300 weforms()->form->delete( $form_id );
301
302 wp_send_json_success();
303 }
304
305 public function delete_form_bulk() {
306 check_ajax_referer( 'weforms' );
307
308 $this->check_admin();
309
310 $form_ids = isset( $_POST['ids'] ) ? array_map( 'absint', $_POST['ids'] ) : [];
311
312 if ( !$form_ids ) {
313 wp_send_json_error( __( 'No form ids provided!', 'weforms' ) );
314 }
315
316 foreach ( $form_ids as $form_id ) {
317 weforms()->form->delete( $form_id );
318 }
319
320 wp_send_json_success();
321 }
322
323 /**
324 * Duplicate a form
325 *
326 * @return voiud
327 */
328 public function duplicate_form() {
329 check_ajax_referer( 'weforms' );
330
331 $this->check_admin();
332
333 $form_id = isset( $_POST['form_id'] ) ? intval( $_POST['form_id'] ) : 0;
334
335 $form = weforms()->form->duplicate( $form_id );
336 $form->settings = $form->get_settings();
337
338 wp_send_json_success( $form );
339 }
340
341 /**
342 * Create form from a template
343 *
344 * @return void
345 */
346 public function create_form_from_template() {
347 check_ajax_referer( 'weforms' );
348
349 $template = isset( $_REQUEST['template'] ) ? sanitize_text_field( wp_unslash( $_REQUEST['template'] ) ) : '';
350
351 $form_id = weforms()->templates->create( $template );
352
353 if ( is_wp_error( $form_id ) ) {
354 wp_send_json_error( __( 'Could not create the form', 'weforms' ) );
355 }
356
357 wp_send_json_success( [
358 'id' => $form_id,
359 ] );
360 }
361
362 /**
363 * Save the weForms settings
364 *
365 * @return void
366 */
367 public function save_settings() {
368 check_ajax_referer( 'weforms' );
369 $this->check_admin();
370
371 $requires_wpuf_update = false;
372 $wpuf_update_array = array();
373 $settings = isset( $_POST['settings'] ) ? (array) json_decode( wp_unslash( $_POST['settings'] ) ) : [];
374 update_option( 'weforms_settings', $settings );
375
376 // wpuf settings sync
377 if ( isset( $settings['gmap_api'] ) ) {
378 $requires_wpuf_update = true;
379 $wpuf_update_array['gmap_api_key'] = $settings['gmap_api'];
380 }
381
382 if ( isset( $settings['recaptcha'] ) ) {
383 $requires_wpuf_update = true;
384 $wpuf_update_array['recaptcha_public'] = $settings['recaptcha']->key;
385 $wpuf_update_array['recaptcha_private'] = $settings['recaptcha']->secret;
386 $wpuf_update_array['recaptcha_type'] = $settings['recaptcha']->type;
387 }
388
389 if ( isset( $settings['no_conflict'] ) ) {
390 $requires_wpuf_update = true;
391 $wpuf_update_array['no_conflict'] = $settings['no_conflict'];
392 }
393
394 if ( isset( $settings['email_footer'] ) ) {
395 $requires_wpuf_update = true;
396 $wpuf_update_array['email_footer'] = $settings['email_footer'];
397 }
398
399 if ( $requires_wpuf_update ) {
400 $wpuf_settings = get_option( 'wpuf_general', [] );
401
402 $wpuf_settings = array_merge( $wpuf_settings, $wpuf_update_array );
403 update_option( 'wpuf_general', $wpuf_settings );
404 }
405
406 do_action( 'weforms_save_settings', $settings );
407
408 $settings = apply_filters( 'weforms_after_save_settings', $settings );
409 wp_send_json_success( $settings );
410 }
411
412 /**
413 * Get the weForms Settings
414 *
415 * @return void
416 */
417 public function get_settings() {
418 check_ajax_referer( 'weforms' );
419
420 $this->check_admin();
421
422 $settings = weforms_get_settings();
423 // checking to prevent js error, will be removed in future
424 if ( !isset( $settings['credit'] ) ) {
425 $settings['credit'] = false;
426 }
427
428 if ( !isset( $settings['permission'] ) ) {
429 $settings['permission'] = 'manage_options';
430 }
431
432 wp_send_json_success( $settings );
433 }
434
435 /**
436 * Get all entries
437 *
438 * @return void
439 */
440 public function get_entries() {
441 check_ajax_referer( 'weforms' );
442
443 $this->check_admin();
444
445 $form_id = isset( $_REQUEST['id'] ) ? intval( $_REQUEST['id'] ) : 0;
446 $current_page = isset( $_REQUEST['page'] ) ? intval( $_REQUEST['page'] ) : 1;
447 $status = isset( $_REQUEST['status'] ) ? sanitize_text_field( wp_unslash( $_REQUEST['status'] ) ) : 'publish';
448 $per_page = 20;
449 $offset = ( $current_page - 1 ) * $per_page;
450
451 if ( !$form_id ) {
452 wp_send_json_error( __( 'No form id provided!', 'weforms' ) );
453 }
454
455 $entries = weforms_get_form_entries(
456 $form_id, [
457 'number' => $per_page,
458 'offset' => $offset,
459 'status' => $status,
460 ]
461 );
462
463 $columns = weforms_get_entry_columns( $form_id );
464 $total_entries = weforms_count_form_entries( $form_id, $status );
465
466 array_map(
467 function ( $entry ) use ( $columns ) {
468 $entry_id = $entry->id;
469 $entry->fields = [];
470
471 foreach ( $columns as $meta_key => $label ) {
472 if ( empty( $meta_key ) ) {
473 continue;
474 }
475 $value = weforms_get_entry_meta( $entry_id, $meta_key, true );
476 $entry->fields[ $meta_key ] = str_replace( WeForms::$field_separator, ' ', $value );
477 }
478 }, $entries
479 );
480
481 $entries = apply_filters( 'weforms_get_entries', $entries, $form_id );
482
483 $response = [
484 'columns' => $columns,
485 'entries' => $entries,
486 'form_title' => get_post_field( 'post_title', $form_id ),
487 'pagination' => [
488 'total' => $total_entries,
489 'per_page' => $per_page,
490 'pages' => ceil( $total_entries / $per_page ),
491 'current' => $current_page,
492 ],
493 'meta' => [
494 'total' => weforms_count_form_entries( $form_id ),
495 'totalTrash' => weforms_count_form_entries( $form_id, 'trash' ),
496 ],
497 ];
498
499 wp_send_json_success( $response );
500 }
501
502 /**
503 * Get an entry details
504 *
505 * @return void
506 */
507 public function get_entry_detail() {
508 check_ajax_referer( 'weforms' );
509
510 $this->check_admin();
511
512 $form_id = isset( $_REQUEST['form_id'] ) ? intval( $_REQUEST['form_id'] ) : 0;
513 $entry_id = isset( $_REQUEST['entry_id'] ) ? intval( $_REQUEST['entry_id'] ) : 0;
514
515 $form = weforms()->form->get( $form_id );
516 $form_settings = $form->get_settings();
517 $entry = $form->entries()->get( $entry_id );
518 $fields = $entry->get_fields();
519 $metadata = $entry->get_metadata();
520 $payment = $entry->get_payment_data();
521
522 if ( isset( $payment->payment_data ) && is_serialized( $payment->payment_data ) ) {
523 $payment->payment_data = unserialize( $payment->payment_data );
524 }
525
526 if ( false === $fields ) {
527 wp_send_json_error( __( 'No form fields found!', 'weforms' ) );
528 }
529
530 if ( sizeof( $fields ) < 1 ) {
531 $fields[] = [
532 'label' => __( 'No form fields found!', 'weforms' ),
533 ];
534 }
535
536 $has_empty = false;
537 $answers = [];
538 $respondentPoints = isset( $form_settings['total_points'] ) ? floatval( $form_settings['total_points'] ) : 0;
539 $fields_formatted = array();
540 foreach ( $fields as $key => $field ) {
541 if ( $form_settings['quiz_form'] == 'yes' ) {
542 $selectedAnswers = isset( $field['selected_answers'] ) ? $field['selected_answers'] : '';
543 $givenAnswer = isset( $field['value'] ) ? $field['value'] : '';
544 $options = isset( $field['options'] ) ? $field['options'] : '';
545 $template = $field['template'];
546 $fieldPoints = isset( $field['points'] ) ? floatval( $field['points'] ) : 0;
547
548 if ( $template == 'radio_field' || $template == 'dropdown_field' ) {
549 $answers[$field['name']] = true;
550 if ( empty( $givenAnswer ) ) {
551 $answers[$field['name']] = false;
552 $respondentPoints -= $fieldPoints;
553 } else {
554 foreach ( $options as $key => $value ) {
555 if ( $givenAnswer == $value ) {
556 if ( $key != $selectedAnswers ) {
557 $answers[$field['name']] = false;
558 $respondentPoints -= $fieldPoints;
559 }
560 }
561 }
562 }
563 } elseif ( $template == 'checkbox_field' || $template == 'multiple_select' ) {
564 $answers[$field['name']] = true;
565 $userAnswer = [];
566
567 foreach ( $options as $key => $value ) {
568 foreach ( $givenAnswer as $answer ) {
569 if ( $value == $answer ) {
570 $userAnswer[] = $key;
571 }
572 }
573 }
574
575 $userAnswer = implode( '|', $userAnswer );
576 $rightAnswers = implode( '|', $selectedAnswers );
577
578 if ( $userAnswer != $rightAnswers || empty( $userAnswer ) ) {
579 $answers[$field['name']] = false;
580 $respondentPoints -= $fieldPoints;
581 }
582 }
583 } elseif ( empty( $field['value'] ) ) {
584 $has_empty = true;
585 continue;
586 } else {
587 $field = WeForms_Form_Entry_Manager::format_entry_value( $field );
588 array_push( $fields_formatted, $field );
589 }
590 }
591 $response = [
592 'form_fields' => $fields_formatted,
593 'form_settings' => $form_settings,
594 'meta_data' => $metadata,
595 'payment_data' => $payment,
596 'has_empty' => $has_empty,
597 'respondent_points' => $respondentPoints,
598 'answers' => $answers,
599 ];
600
601
602 wp_send_json_success( $response );
603 }
604
605 /**
606 * Trash an entry
607 *
608 * @return void
609 */
610 public function trash_entry() {
611 check_ajax_referer( 'weforms' );
612
613 $this->check_admin();
614
615 $entry_id = isset( $_REQUEST['entry_id'] ) ? intval( $_REQUEST['entry_id'] ) : 0;
616
617 weforms_change_entry_status( $entry_id, 'trash' );
618 wp_send_json_success();
619 }
620
621 /**
622 * Trash an entry
623 *
624 * @return void
625 */
626 public function delete_entry() {
627 check_ajax_referer( 'weforms' );
628
629 $this->check_admin();
630
631 $entry_id = isset( $_REQUEST['entry_id'] ) ? intval( $_REQUEST['entry_id'] ) : 0;
632
633 weforms_delete_entry( $entry_id );
634
635 wp_send_json_success();
636 }
637
638 /**
639 * Restore Entry
640 *
641 * @return void
642 */
643 public function restore_entry() {
644 check_ajax_referer( 'weforms' );
645
646 $this->check_admin();
647
648 $entry_id = isset( $_REQUEST['entry_id'] ) ? intval( $_REQUEST['entry_id'] ) : 0;
649
650 weforms_change_entry_status( $entry_id, 'publish' );
651 wp_send_json_success();
652 }
653
654 /**
655 * Bulk trash entries
656 *
657 * @return void
658 */
659 public function bulk_delete_entry() {
660 check_ajax_referer( 'weforms' );
661
662 $this->check_admin();
663
664 $entry_ids = isset( $_POST['ids'] ) ? array_map( 'absint', $_POST['ids'] ) : array();
665 $permanent = isset( $_POST['permanent'] ) && ( sanitize_text_field( wp_unslash ( $_POST['permanent'] ) ) ) ? true : false;
666
667 if ( !$entry_ids ) {
668 wp_send_json_error( __( 'No entry ids provided!', 'weforms' ) );
669 }
670
671 foreach ( $entry_ids as $entry_id ) {
672 if ( $permanent ) {
673 weforms_delete_entry( $entry_id );
674 } else {
675 weforms_change_entry_status( $entry_id, 'trash' );
676 }
677 }
678
679 wp_send_json_success();
680 }
681
682 /**
683 * Bulk trash entries
684 *
685 * @return void
686 */
687 public function bulk_restore_entry() {
688 check_ajax_referer( 'weforms' );
689
690 $this->check_admin();
691
692 $entry_ids = isset( $_POST['ids'] ) ? array_map( 'absint', $_POST['ids'] ) : [];
693
694 if ( !$entry_ids ) {
695 wp_send_json_error( __( 'No entry ids provided!', 'weforms' ) );
696 }
697
698 foreach ( $entry_ids as $entry_id ) {
699 weforms_change_entry_status( $entry_id, 'publish' );
700 }
701
702 wp_send_json_success();
703 }
704
705 /**
706 * Handle the frontend submission
707 *
708 * @return void
709 */
710 public function handle_frontend_submission() {
711 check_ajax_referer( 'wpuf_form_add' );
712 $form_id = isset( $_POST['form_id'] ) ? intval( $_POST['form_id'] ) : 0;
713 $page_id = isset( $_POST['page_id'] ) ? intval( $_POST['page_id'] ) : 0;
714
715 $form = weforms()->form->get( $form_id );
716 $form_settings = $form->get_settings();
717 $form_fields = $form->get_fields();
718 $entry_fields = $form->prepare_entries();
719 $form_entries = weforms_get_form_entries( $form_id, [ 'number' => '', 'offset' => '' ] );
720
721 if ( $form_fields && count( $form_entries ) && count( $entry_fields ) ) {
722 foreach ( $entry_fields as $field_key => $field_value ) {
723 $duplicate_check = false;
724 $field_label = 'This';
725
726 foreach ( $form_fields as $form_field ) {
727 if ( in_array( $form_field['template'], [ 'text_field', 'website_url', 'numeric_text_field', 'email_address' ] ) && $form_field['name'] == $field_key && isset( $form_field['duplicate'] ) && 'no' == $form_field['duplicate'] ) {
728 $duplicate_check = true;
729 $field_label = $form_field['label'];
730 }
731 }
732
733 if ( $duplicate_check ) {
734 foreach ( $form_entries as $entry ) {
735 $existing = weforms_get_entry_meta( $entry->id, $field_key, true );
736
737 if ( $existing && $field_value == $existing ) {
738 wp_send_json( [
739 'success' => false,
740 'error' => sprintf( __( '"%s" field requires a unique entry and "%s" has already been used.', 'weforms' ), $field_label, $field_value ),
741 ] );
742 }
743 }
744 }
745 }
746 }
747
748 if ( !$form_fields ) {
749 wp_send_json( [
750 'success' => false,
751 'error' => __( 'No form field was found.', 'weforms' ),
752 ] );
753 }
754
755 if ( $form->has_field( 'recaptcha' ) ) {
756 $settings = weforms_get_settings( 'recaptcha' );
757 $type = isset( $settings->type ) ? $settings->type : '';
758 $secret = isset( $settings->secret ) ? $settings->secret : '';
759 if( $type == 'v3' ) {
760 $this->validate_reCaptchav3( $secret );
761 } else {
762 $this->validate_reCaptcha();
763 }
764 }
765
766 // vaidate submission
767 $this->validate_submission( $entry_fields, $form, $form_settings, $form_fields );
768
769 $entry_fields = apply_filters( 'weforms_before_entry_submission', $entry_fields, $form, $form_settings, $form_fields );
770
771 //check for entry_fields for a return error
772 if ( is_wp_error( $entry_fields ) ) {
773 wp_send_json( [
774 'success' => false,
775 'error' => $entry_fields->get_error_message(),
776 ] );
777 } else {
778 $entry_id = 1;
779 $global_settings = weforms_get_settings();
780 if ( empty( $form_settings['after_submission'] ) ) {
781 $entry_id = weforms_insert_entry( [
782 'form_id' => $form_id,
783 ], $entry_fields );
784 if ( is_wp_error( $entry_id ) ) {
785 wp_send_json( [
786 'success' => false,
787 'error' => $entry_id->get_error_message(),
788 ] );
789 }
790 // Fire a hook for integration
791 do_action( 'weforms_entry_submission', $entry_id, $form_id, $page_id, $form_settings );
792 $notification = new WeForms_Notification( [
793 'form_id' => $form_id,
794 'page_id' => $page_id,
795 'entry_id' => $entry_id,
796 ] );
797 $notification->send_notifications();
798 }
799 }
800 // redirect URL
801 $show_message = false;
802 $redirect_to = false;
803 if ( $form_settings['redirect_to'] == 'page' ) {
804 $redirect_to = get_permalink( $form_settings['page_id'] );
805 } elseif ( $form_settings['redirect_to'] == 'url' ) {
806 $redirect_to = $form_settings['url'];
807 } elseif ( $form_settings['redirect_to'] == 'same' ) {
808 $show_message = true;
809 } else {
810 $show_message = true;
811 }
812 $field_search = $field_replace = [];
813 foreach ( $form_fields as $r_field ) {
814 $field_search[] = '{' . $r_field['name'] . '}';
815 if ( $r_field['template'] == 'name_field' ) {
816 $field_replace[] = implode( ' ', explode( '|', $entry_fields[ $r_field['name'] ] ) );
817 } else if ( $r_field['template'] == 'address_field' ) {
818 $field_replace[] = implode( ', ', $entry_fields[ $r_field['name'] ] );
819 } else {
820 $field_replace[] = isset( $entry_fields[ $r_field['name'] ] ) ? $entry_fields[ $r_field['name'] ] : '';
821 }
822 }
823 $message = str_replace( $field_search, $field_replace, $form_settings['message'] );
824 // send the response
825 $response = apply_filters( 'weforms_entry_submission_response', [
826 'success' => true,
827 'redirect_to' => $redirect_to,
828 'show_message' => $show_message,
829 'message' => $message,
830 'data' => $_POST,
831 'form_id' => $form_id,
832 'entry_id' => $entry_id,
833 'entry_fields' =>$entry_fields,
834 ] );
835
836 weforms_clear_buffer();
837 wp_send_json( $response );
838 }
839
840 function validate_reCaptchav3( $secret ) {
841 check_ajax_referer( 'wpuf_form_add' );
842
843 $post_data = wp_unslash($_POST);
844 $token = $post_data['g-recaptcha-response'];
845 $action = $post_data['g-action'];
846 $google_captcha_url = esc_url( 'https://www.google.com/recaptcha/api/siteverify' );
847
848 $response = wp_remote_post( $google_captcha_url,
849 array(
850 'method' => 'POST',
851 'body' => array(
852 'secret' => $secret,
853 'response' => $token
854 )
855 )
856 );
857
858
859 if ( is_wp_error( $response ) ) {
860 wp_send_json( [
861 'success' => false,
862 'error' => __( 'reCAPTCHA validation failed', 'weforms' ),
863 ] );
864 } else {
865 $api_response = json_decode( wp_remote_retrieve_body( $response ), true );
866 if( $api_response["success"] == '1' && $api_response["action"] == $action ) {
867 return true;
868 } else {
869 wp_send_json( [
870 'success' => false,
871 'error' => __( 'reCAPTCHA validation failed', 'weforms' ),
872 ] );
873 }
874 }
875 }
876 /**
877 * reCaptcha Validation
878 *
879 * @return void
880 */
881 function validate_reCaptcha() {
882 check_ajax_referer( 'wpuf_form_add' );
883 if ( class_exists( 'WPUF_ReCaptcha' ) ) {
884 $recaptcha_class = 'WPUF_ReCaptcha';
885 } else {
886 if ( !function_exists( 'recaptcha_get_html' ) ) {
887 require_once WEFORMS_INCLUDES . '/library/reCaptcha/recaptchalib.php';
888 }
889
890 require_once WEFORMS_INCLUDES . '/library/reCaptcha/recaptchalib_noCaptcha.php';
891 $recaptcha_class = 'Weforms_ReCaptcha';
892 }
893
894 $invisible = isset( $_POST['g-recaptcha-response'] ) ? false : true;
895
896 $recaptcha_settings = weforms_get_settings( 'recaptcha' );
897 $secret = isset( $recaptcha_settings->secret ) ? $recaptcha_settings->secret : '';
898
899 if ( ! $invisible ) {
900 $response = null;
901 $reCaptcha = new $recaptcha_class( $secret );
902 $remote_ADDR = isset( $_SERVER['REMOTE_ADDR'] ) ? sanitize_text_field( wp_unslash( $_SERVER['REMOTE_ADDR'] ) ) : '';
903 $recaptcha_response = isset( $_POST['g-recaptcha-response'] ) ? sanitize_text_field( wp_unslash( $_POST['g-recaptcha-response'] ) ) : '';
904 $resp = $reCaptcha->verifyResponse(
905 $remote_ADDR,
906 $recaptcha_response
907 );
908
909 if ( !$resp->success ) {
910 wp_send_json( [
911 'success' => false,
912 'error' => __( 'reCAPTCHA validation failed', 'weforms' ),
913 ] );
914 }
915
916 } else {
917
918 $recap_challenge = isset( $_POST['recaptcha_challenge_field'] ) ? sanitize_text_field( wp_unslash( $_POST['recaptcha_challenge_field'] ) ) : '';
919 $recap_response = isset( $_POST['recaptcha_response_field'] ) ? sanitize_text_field( wp_unslash( $_POST['recaptcha_response_field'] ) ) : '';
920 $resp = recaptcha_check_answer( $secret, $remote_ADDR, $recap_challenge, $recap_response );
921
922 if ( !$resp->is_valid ) {
923 ob_clean();
924
925 wp_send_json( [
926 'success' => false,
927 'error' => __( 'reCAPTCHA validation failed', 'weforms' ),
928 ] );
929 }
930 }
931 }
932
933 /**
934 * Validate submission
935 *
936 * @param array $entry_fields
937 * @param object $form
938 * @param array $form_settings
939 * @param array $form_fields
940 *
941 * @return bool|json
942 */
943 public function validate_submission( $entry_fields, $form, $form_settings, $form_fields ) {
944 foreach ( $form_fields as $key => $field ) {
945
946 //skip custom html field as it is not saved
947 if ( 'custom_html' == $field['name'] ) {
948 continue;
949 }
950
951 //skip recaptcha field as it is not saved
952 if ( 'recaptcha' == $field['name'] ) {
953 continue;
954 }
955
956 $value = $entry_fields[ $field['name'] ];
957
958 if ( 'single_product' === $field['template'] ) {
959 if ( !$value ) {
960 $value = [];
961 }
962
963 $value['price'] = isset( $value['price'] ) ? floatval( $value['price'] ) : 0;
964 $value['quantity'] = isset( $value['quantity'] ) ? floatval( $value['quantity'] ) : 0;
965 $quantity = isset( $field['quantity'] ) ? $field['quantity'] : [];
966 $price = isset( $field['price'] ) ? $field['price'] : [];
967
968 if ( isset( $price['is_flexible'] ) && $price['is_flexible'] ) {
969 $min = isset( $price['min'] ) ? floatval( $price['min'] ) : 0;
970 $max = isset( $price['max'] ) ? floatval( $price['max'] ) : 0;
971
972 if ( $value['price'] < $min ) {
973 wp_send_json( [
974 'success' => false,
975 'error' => __( sprintf(
976 '%s price must be equal or greater than %s',
977 $field['weforms'],
978 $min ),
979 'weforms' ),
980 ] );
981 }
982
983 if ( $max && $value['price'] > $max ) {
984 wp_send_json( [
985 'success' => false,
986 'error' => __( sprintf(
987 '%s price must be equal or less than %s',
988 $field['weforms'],
989 $max ),
990 'weforms' ),
991 ] );
992 }
993 }
994
995 if ( isset( $quantity['status'] ) && $quantity['status'] ) {
996 $min = isset( $quantity['min'] ) ? floatval( $quantity['min'] ) : 0;
997 $max = isset( $quantity['max'] ) ? floatval( $quantity['max'] ) : 0;
998
999 if ( $value['quantity'] < $min ) {
1000 wp_send_json( [
1001 'success' => false,
1002 'error' => __( sprintf(
1003 '%s quantity must be equal or greater than %s',
1004 $field['weforms'],
1005 $min ),
1006 'weforms' ),
1007 ] );
1008 }
1009
1010 if ( $max && $value['quantity'] > $max ) {
1011 wp_send_json( [
1012 'success' => false,
1013 'error' => __( sprintf(
1014 '%s quantity must be equal or less than %s',
1015 $field['weforms'],
1016 $max ),
1017 'weforms' ),
1018 ] );
1019 }
1020 }
1021 }
1022 }
1023 }
1024
1025 public static function prepare_meta_fields( $meta_vars ) {
1026 check_ajax_referer( 'wpuf_form_add' );
1027 // loop through custom fields
1028 // skip files, put in a key => value paired array for later executation
1029 // process repeatable fields separately
1030 // if the input is array type, implode with separator in a field
1031 $files = [];
1032 $meta_key_value = [];
1033 $multi_repeated = []; // multi repeated fields will in sotre duplicated meta key
1034
1035 foreach ( $meta_vars as $key => $value ) {
1036 switch ( $value['template'] ) {
1037
1038 // put files in a separate array, we'll process it later
1039 case 'file_upload':
1040 case 'image_upload':
1041 $files[] = [
1042 'name' => $value['name'],
1043 'value' => isset( $_POST['wpuf_files'][ $value['name'] ] ) ? sanitize_text_field( wp_unslash( $_POST['wpuf_files'][ $value['name'] ] ) ) : array(),
1044 'count' => $value['count']
1045 ];
1046 break;
1047
1048 case 'repeat_field':
1049 // if it is a multi column repeat field
1050 if ( isset( $value['multiple'] ) && $value['multiple'] == 'true' ) {
1051
1052 // if there's any items in the array, process it
1053 if ( isset( $_POST[ $value['name'] ] ) ) {
1054 $ref_arr = [];
1055 $cols = count( $value['columns'] );
1056 $first = array_shift( array_values( sanitize_text_field( wp_unslash( $_POST[ $value['name'] ] ) ) ) ); // first element
1057 $rows = count( $first );
1058
1059 // loop through columns
1060 for ( $i = 0; $i < $rows; $i++ ) {
1061
1062 // loop through the rows and store in a temp array
1063 $temp = [];
1064 for ( $j = 0; $j < $cols; $j++ ) {
1065 $temp[] = isset( $_POST[ $value['name'] ][ $j ][ $i ] ) ? sanitize_text_field( wp_unslash( $_POST[ $value['name'] ][ $j ][ $i ] ) ) : '';
1066 }
1067
1068 // store all fields in a row with WeForms::$field_separator separated
1069 $ref_arr[] = implode( WeForms::$field_separator, $temp );
1070 }
1071
1072 // now, if we found anything in $ref_arr, store to $multi_repeated
1073 if ( $ref_arr ) {
1074 $multi_repeated[ $value['name'] ] = array_slice( $ref_arr, 0, $rows );
1075 }
1076 }
1077 } else {
1078 $meta_key_value[ $value['name'] ] = implode( WeForms::$field_separator, sanitize_text_field( wp_unslash( $_POST[ $value['name'] ] ) ) );
1079 }
1080
1081 break;
1082
1083 case 'address_field':
1084 if ( isset( $_POST[ $value['name'] ] ) && is_array( $_POST[ $value['name'] ] ) ) {
1085 $post_value = sanitize_text_field( wp_unslash( $_POST[ $value['name'] ] ) );
1086 foreach ( $post_value as $address_field => $field_value ) {
1087 $meta_key_value[ $value['name'] ][ $address_field ] = sanitize_text_field( $field_value );
1088 }
1089 }
1090
1091 break;
1092
1093 case 'text_field':
1094 case 'email_address':
1095 case 'numeric_text_field':
1096 case 'date_field':
1097 $meta_key_value[ $value['name'] ] = isset( $_POST[ $value['name'] ] ) ? sanitize_text_field( wp_unslash( $_POST[ $value['name'] ] ) ) : '';
1098
1099 break;
1100
1101 case 'textarea_field':
1102 $meta_key_value[ $value['name'] ] = isset( $_POST[ $value['name'] ] ) ? sanitize_text_field( wp_unslash( $_POST[ $value['name'] ] ) ) : '';
1103
1104 break;
1105
1106 case 'dropdown_field':
1107 case 'radio_field':
1108 $val = sanitize_text_field( wp_unslash( $_POST[ $value['name'] ] ) );
1109 $meta_key_value[ $value['name'] ] = isset( $value['options'][ $val ] ) ? $value['options'][ $val ] : '';
1110 break;
1111
1112 case 'multiple_select':
1113 case 'checkbox_field':
1114 $val = ( is_array( $_POST[ $value['name'] ] ) && sanitize_text_field( wp_unslash( $_POST[ $value['name'] ] ) ) ) ? sanitize_text_field( wp_unslash( $_POST[ $value['name'] ] ) ) : array();
1115 $meta_key_value[ $value['name'] ] = $val;
1116
1117 if ( $val ) {
1118 $new_val = [];
1119
1120 foreach ( $val as $option_key ) {
1121 $new_val[] = isset( $value['options'][ $option_key ] ) ? $value['options'][ $option_key ] : '';
1122 }
1123
1124 $meta_key_value[ $value['name'] ] = implode( WeForms::$field_separator, $new_val );
1125 }
1126 break;
1127
1128 default:
1129 // if it's an array, implode with this->separator
1130 if ( is_array( $_POST[ $value['name'] ] ) ) {
1131 $meta_key_value[ $value['name'] ] = implode( WeForms::$field_separator, sanitize_text_field( wp_unslash( $_POST[ $value['name'] ] ) ) );
1132 } else {
1133 $meta_key_value[ $value['name'] ] = isset( $_POST[ $value['name'] ] ) ? sanitize_text_field( wp_unslash( $_POST[ $value['name'] ] ) ): '';
1134 }
1135
1136 break;
1137 }
1138 } //end foreach
1139
1140 return [ $meta_key_value, $multi_repeated, $files ];
1141 }
1142
1143 /**
1144 * Import a form from a JSON file
1145 *
1146 * @return void
1147 */
1148 public function import_form() {
1149 check_ajax_referer( 'weforms' );
1150
1151 $this->check_admin();
1152
1153 $the_file = isset( $_FILES['importFile'] ) ? $_FILES['importFile'] : false;
1154
1155 if ( !$the_file ) {
1156 wp_send_json_error( __( 'No file found to import.', 'weforms' ) );
1157 }
1158
1159 $file_ext = pathinfo( $the_file['name'], PATHINFO_EXTENSION );
1160
1161 if ( !class_exists( 'WeForms_Admin_Tools' ) ) {
1162 require_once __DIR__ . '/admin/class-admin-tools.php';
1163 }
1164
1165 if ( ( $file_ext == 'json' ) && ( $the_file['size'] < 500000 ) ) {
1166 $status = WeForms_Admin_Tools::import_json_file( $the_file['tmp_name'] );
1167
1168 if ( $status ) {
1169 wp_send_json_success( __( 'The forms have been imported successfully!', 'weforms' ) );
1170 } else {
1171 wp_send_json_error( __( 'Something went wrong importing the file.', 'weforms' ) );
1172 }
1173 } else {
1174 wp_send_json_error( __( 'Invalid file or file size too big.', 'weforms' ) );
1175 }
1176 }
1177
1178 /**
1179 * Read Log file
1180 *
1181 * @return json
1182 **/
1183 public function get_logs() {
1184 check_ajax_referer( 'weforms' );
1185
1186 $this->check_admin();
1187
1188 $file = weforms_log_file_path();
1189
1190 if ( !file_exists( $file ) ) {
1191 return;
1192 }
1193
1194 $data = file_get_contents( $file );
1195 $data = explode( "\n", $data );
1196 $data = array_reverse( $data );
1197 $data = array_filter( $data );
1198
1199 if ( empty( $data ) ) {
1200 return;
1201 }
1202
1203 $logs = [];
1204
1205 foreach ( $data as $key => $row ) {
1206 preg_match( '/\[(?<time>.+?)\]\[(?<type>.+?)\](?<message>.+)/im', $row, $log );
1207
1208 if ( empty( $log['message'] ) ) {
1209 $log = [];
1210 $log['message'] = !empty( $log['message'] ) ? $log['message'] : $row;
1211 }
1212
1213 if ( !empty( $log['time'] ) ) {
1214 $human_time = human_time_diff( strtotime( $log['time'] ), current_time( 'timestamp' ) );
1215 $log['time'] = $human_time ? $human_time . ' ' . __( 'ago', 'weforms' ) : $log['time'];
1216 }
1217
1218 $logs[] = $log;
1219 }
1220
1221 wp_send_json_success( $logs );
1222 }
1223
1224 /**
1225 * Read Log file
1226 *
1227 * @return json
1228 **/
1229 public function delete_logs() {
1230 check_ajax_referer( 'weforms' );
1231
1232 $this->check_admin();
1233
1234 $file = weforms_log_file_path();
1235
1236 if ( !file_exists( $file ) ) {
1237 return;
1238 }
1239
1240 @unlink( $file );
1241
1242 wp_send_json_success();
1243 }
1244 }
1245