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