PluginProbe
weForms – Easy Drag & Drop Contact Form Builder For WordPress / 1.2.9
weForms – Easy Drag & Drop Contact Form Builder For WordPress v1.2.9
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.2.9, at includes/class-ajax.php

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