PluginProbe
weForms – Easy Drag & Drop Contact Form Builder For WordPress / 1.4.1
weForms – Easy Drag & Drop Contact Form Builder For WordPress v1.4.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
weforms / includes / api / class-weforms-forms-controller.php

class-weforms-forms-controller.php in weForms – Easy Drag & Drop Contact Form Builder For WordPress 1.4.1, at includes/api/class-weforms-forms-controller.php

1,653 lines 64.6 KB
No matching file
Up and down to move Enter to open Esc to close
Raw Download Zip
1 <?php
2
3 class Weforms_Forms_Controller extends Weforms_REST_Controller {
4 /**
5 * Endpoint namespace
6 *
7 * @var string
8 */
9 protected $namespace = 'weforms/v1';
10
11 /**
12 * Route name
13 *
14 * @var string
15 */
16 protected $rest_base = 'forms';
17
18 /**
19 * Register all routes releated with forms
20 *
21 * @return void
22 */
23 public function register_routes() {
24
25 register_rest_route(
26 $this->namespace,
27 '/'. $this->rest_base,
28 array(
29 array(
30 'methods' => WP_REST_Server::READABLE,
31 'callback' => array( $this, 'get_items' ),
32 'args' => $this->get_collection_params(),
33 'permission_callback' => array( $this, 'get_items_permissions_check' ),
34 ),
35 array(
36 'methods' => WP_REST_Server::CREATABLE,
37 'callback' => array( $this, 'create_item' ),
38 'args' => $this->get_endpoint_args_for_item_schema( WP_REST_Server::CREATABLE ),
39 'permission_callback' => array( $this, 'create_item_permissions_check' ),
40 ),
41 array(
42 'methods' => WP_REST_Server::DELETABLE,
43 'callback' => array( $this, 'bulk_delete_form' ),
44 'permission_callback' => array( $this, 'delete_item_permissions_check' ),
45 'args' => array(
46 'ids' => array(
47 'description' => __( 'Unique identifier for the object', 'weforms' ),
48 'type' => 'array',
49 'items' => array(
50 'type' => 'integer'
51 ),
52 'validate_callback' => array( $this, 'is_bulk_delete_form_exists' ),
53 'required' => true,
54 ),
55 ),
56 )
57 )
58 );
59
60 register_rest_route( $this->namespace, '/' . $this->rest_base . '/(?P<form_id>\d+)', array(
61 'args' => array(
62 'form_id' => array(
63 'description' => __( 'Unique identifier for the object', 'weforms' ),
64 'type' => 'integer',
65 'sanitize_callback' => 'absint',
66 'validate_callback' => array( $this, 'is_form_exists' ),
67 'required' => true,
68 )
69 ),
70 array(
71 'methods' => WP_REST_Server::READABLE,
72 'callback' => array( $this, 'get_item' ),
73 'args' => array(
74 'context' => $this->get_context_param( [ 'default' => 'view' ] )
75 ),
76 'permission_callback' => array( $this, 'get_item_permissions_check' ),
77 ),
78 array(
79 'methods' => WP_REST_Server::DELETABLE,
80 'callback' => array( $this, 'delete_item' ),
81 'args' => array(
82 'force' => array(
83 'type' => 'boolean',
84 'default' => false,
85 'description' => __( 'Whether to bypass trash and force deletion.', 'weforms' ),
86 ),
87 ),
88 'permission_callback' => array( $this, 'delete_item_permissions_check' ),
89 ),
90 array(
91 'methods' => WP_REST_Server::EDITABLE,
92 'callback' => array( $this, 'update_item' ),
93 'args' => $this->get_endpoint_args_for_item_schema( WP_REST_Server::EDITABLE ),
94 'permission_callback' => array( $this, 'update_item_permissions_check' ),
95 ),
96 ) );
97
98 register_rest_route( $this->namespace, '/' . $this->rest_base . '/(?P<form_id>[\d]+)' .'/entries/',
99 array(
100 'args' => array(
101 'form_id' => array(
102 'description' => __( 'Unique identifier for the object', 'weforms' ),
103 'type' => 'integer',
104 'sanitize_callback' => 'absint',
105 'validate_callback' => array( $this, 'is_form_exists' ),
106 'required' => true,
107 ),
108 ),
109
110 array(
111 'methods' => WP_REST_Server::CREATABLE,
112 'callback' => array( $this, 'save_entry' ),
113 'permission_callback' => array( $this, 'submit_permissions_check' ),
114 ),
115 array(
116 'methods' => WP_REST_Server::READABLE,
117 'callback' => array( $this, 'get_entry' ),
118 'permission_callback' => array( $this, 'get_item_permissions_check' ),
119 'args' => $this->get_collection_params(),
120 )
121 )
122 );
123
124 register_rest_route( $this->namespace, '/' . $this->rest_base . '/(?P<form_id>[\d]+)' .'/duplicate/', array(
125 'args' => array(
126 'form_id' => array(
127 'description' => __( 'Unique identifier for the object', 'weforms' ),
128 'key' => 'integer',
129 'sanitize_callback' => 'absint',
130 'validate_callback' => array( $this, 'is_form_exists' ),
131 'required' => true,
132 ),
133 ),
134 array(
135 'methods' => WP_REST_Server::CREATABLE,
136 'callback' => array( $this, 'duplicate_form' ),
137 'permission_callback' => array( $this, 'create_item_permissions_check' ),
138 ),
139 ) );
140
141 register_rest_route( $this->namespace, '/' . $this->rest_base . '/(?P<form_id>[\d]+)' .'/export_entries/', array(
142 'args' => array(
143 'form_id' => array(
144 'description' => __( 'Unique identifier for the object', 'weforms' ),
145 'type' => 'integer',
146 'sanitize_callback' => 'absint',
147 'validate_callback' => array( $this, 'is_form_exists' ),
148 'required' => true,
149 ),
150 ),
151
152 array(
153 'methods' => WP_REST_Server::READABLE,
154 'callback' => array( $this, 'export_form_entries' ),
155 'permission_callback' => array( $this, 'get_items_permissions_check' ),
156 ),
157 ) );
158
159
160 register_rest_route( $this->namespace, '/' . $this->rest_base . '/(?P<form_id>[\d]+)' .'/entries/(?P<entry_id>[\d]+)',
161 array(
162 'args' => array(
163 'form_id' => array(
164 'description' => __( 'Unique identifier for the object', 'weforms' ),
165 'type' => 'integer',
166 'sanitize_callback' => 'absint',
167 'validate_callback' => array( $this, 'is_form_exists' ),
168 'required' => true,
169 ),
170 'entry_id' => array(
171 'description' => __( 'Unique identifier for the object', 'weforms' ),
172 'type' => 'integer',
173 'sanitize_callback' => 'absint',
174 'validate_callback' => array( $this, 'is_entry_exists' ),
175 'required' => true,
176 ),
177 'context' => $this->get_context_param( [ 'default' => 'view' ] )
178 ),
179 array(
180 'methods' => WP_REST_Server::READABLE,
181 'callback' => array( $this, 'get_entry_details' ),
182 'permission_callback' => array( $this, 'get_item_permissions_check' ),
183 ),
184 )
185 );
186
187 register_rest_route( $this->namespace, '/' . $this->rest_base . '/import', array(
188 array(
189 'methods' => WP_REST_Server::CREATABLE,
190 'callback' => array( $this, 'import_forms' ),
191 'permission_callback' => array( $this, 'create_item_permissions_check' ),
192 ),
193 ) );
194
195 register_rest_route( $this->namespace, '/' . $this->rest_base . '/export',array(
196 'args' => array(
197 'ids' => array(
198 'description' => __( 'Unique identifier for the object', 'weforms' ),
199 'type' => 'array',
200 'validate_callback' => array( $this, 'is_bulk_delete_form_exists' ),
201 'required' => false,
202 ),
203 ),
204 array (
205 'methods' => WP_REST_Server::READABLE,
206 'callback' => array( $this, 'export_forms' ),
207 'permission_callback' => array( $this, 'get_item_permissions_check' ),
208 )
209 ) );
210 }
211
212 /**
213 * Check Template Exist
214 *
215 * @param string $param
216 * @param WP_REST_Request $request
217 * @param string $key
218 *
219 * @return boolean
220 **/
221 public function is_template_exists( $param, $request, $key ) {
222 $templates = weforms()->templates->get_templates();
223 return (bool) array_key_exists( $param,$templates );
224 }
225
226 public function is_field_exists( $param, $request, $key ) {
227 $fields = $request['field_id'];
228 $fields = array_filter( $fields, 'is_numeric' );
229 if( empty( $fields ) ) {
230 return false;
231 }
232 return true;
233 }
234
235 public function save_check( $request ) {
236 $form = weforms()->form->get( (int) $request['form_id'] );
237 $form_error = new WP_Error;
238 $form_settings = $form->get_settings();
239 $form_fields = $form->get_fields();
240 $form_entries = weforms_get_form_entries( $form->id, array( 'number' => '', 'offset' => '' ) );
241
242 if ( ! $form_fields ) {
243 $form_error->add( 'rest_weforms_form_fields', __( 'No form fields found!','weforms' ), array( 'status' => 404 ) );
244 } else {
245 if ( $form->has_field( 'recaptcha' ) ) {
246 $validate_Captcha = $this->validate_reCaptcha( $request );
247
248 if ( $validate_Captcha == false ) {
249 $form_error->add( 'rest_weforms_form', __( 'reCAPTCHA validation failed', 'weforms'), array( 'status' => 404 ) );
250 }
251 }
252
253 $entry_fields = array();
254
255 foreach ( $form_fields as $key => $field ) {
256 if( $field['wpuf_cond']['condition_status'] == "yes" ) {
257 $logic = array();
258 $cond_fields = $field['wpuf_cond']['cond_field'];
259 $cond_operators = $field['wpuf_cond']['cond_operator'];
260 $cond_options = $field['wpuf_cond']['cond_option'];
261
262 $required = false;
263
264 foreach ( $cond_fields as $cond_key => $value ) {
265 $operator = $cond_operators[$cond_key];
266 $selected_value = $request[$value];
267 $logic_value = $cond_options[$cond_key];
268
269 if( $field['wpuf_cond']['cond_logic'] == "all" ) {
270 if( ( $operator == "=" && $selected_value == $logic_value) || ($operator == "!=" && $selected_value != $logic_value) ) {
271 $required = true;
272 } else{
273 $required = false;
274 break;
275 }
276 }
277
278 if( $field['wpuf_cond']['cond_logic'] == "any" ) {
279 if( ( $operator == "=" && $selected_value == $logic_value) || ($operator == "!=" && $selected_value != $logic_value) ) {
280 $required = true;
281 break;
282 } else{
283 $required = false;
284 }
285 }
286 }
287
288 if( $required ) {
289 if ( isset( $field['required'] ) && $field['required'] == "yes" && empty( $request->get_param( $field['name'] ) ) ) {
290 $form_error->add( 'rest_weforms_form_required_field', __( $field['name'] . ' Required Field Missing' ,'weforms'), array( 'status' => 404 ) );
291 }
292 }
293 }
294
295 elseif( ( isset( $field['required'] ) && $field['required'] == "yes" && empty( $request->get_param( $field['name'] ) ) ) ) {
296 $form_error->add( 'rest_weforms_form_required_field', __( $field['name'] . ' Required Field Missing' ,'weforms'), array( 'status' => 404 ) );
297 }
298
299 $ignore_list = apply_filters('wefroms_entry_ignore_list', array(
300 'recaptcha','step_start','section_break'
301 ) );
302
303 if ( in_array( $field['template'], $ignore_list ) ) {
304 continue;
305 }
306
307 if( !empty( $field['name']) ) {
308 $entry_fields[ $field['name'] ] = $request->get_param( $field['name'] );
309 }
310
311 if ( ! array_key_exists( $field['template'], $form_fields ) ) {
312 continue;
313 }
314 }
315
316 foreach ( $entry_fields as $field_key => $field_value ) {
317 $duplicate_check = false;
318 $field_label = 'This';
319
320 foreach ( $form_fields as $form_field ) {
321 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'] ) {
322 $duplicate_check = true;
323 $field_label = $form_field['label'];
324 }
325 }
326
327 if ( $duplicate_check ) {
328
329 foreach ( $form_entries as $entry ) {
330 $existing = weforms_get_entry_meta( $entry->id, $field_key, true );
331
332 if ( $existing && $field_value == $existing ) {
333 $form_error->add( 'rest_weforms_form_unique_entry', __('field requires a unique entry and has already been used.' ,'weforms'), array( 'status' => 404 ) );
334 }
335 }
336
337 }
338 }
339
340 foreach ( $form_fields as $key => $field ) {
341 //skip custom html field as it is not saved
342 if ( 'custom_html' == $field['template'] )
343 continue;
344
345 //skip recaptcha field as it is not saved
346 if ( 'recaptcha' == $field['template'] )
347 continue;
348
349 if( !empty( $field['name'] ) ) {
350 $value = $request[ $field['name'] ];
351 }
352
353 if ( 'file_upload' === $field['template'] ) {
354 $file = $request->get_param('wpuf_files');
355 $file_ids = $file[ $field['name'] ];
356
357 foreach ($file_ids as $key => $file_id) {
358 if ( !wp_get_attachment_url( $file_id ) ) {
359 $form_error->add( 'rest_weforms_form_file', __( 'File Not Found' ,'weforms'), array( 'status' => 404 ) );
360 }
361 }
362 }
363
364 if ( 'image_upload' === $field['template'] ) {
365 $image = $request->get_param('wpuf_files');
366 $image_ids = $image[ $field['name'] ];
367
368 foreach ($image_ids as $key => $image_id) {
369 if ( !wp_get_attachment_url( $image_id ) ) {
370 $form_error->add( 'rest_weforms_form_image', __( 'Image Not Found' ,'weforms'), array( 'status' => 404 ) );
371 }
372 }
373 }
374
375 if ( 'date_field' === $field['template'] ) {
376 $date_format = $field['format'];
377
378 $possible_date= array(
379 "dd-mm-yy" => "d-m-y",
380 "yy-mm-dd" => "y-m-d",
381 "mm-dd-yy" => "m-d-y",
382 "dd/mm/yy" => "d/m/y",
383 "yy/mm/dd" => "y/m/d",
384 "mm/dd/yy" => "m/d/y",
385 "dd.mm.yy" => "d/m/y",
386 "yy.mm.dd" => "y/m/d",
387 "mm.dd.yy" => "m/d/y",
388 );
389
390
391 foreach ( $possible_date as $key => $date ) {
392 if ( strcmp( $key,$date_format ) == 0 ) {
393 $date_format = $date;
394 break;
395 }
396
397 }
398
399 $d = DateTime::createFromFormat( $date_format, $value );
400
401 if ( !( $d && ( $d->format($date_format) == $value ) ) ) {
402 $form_error->add( 'rest_weforms_form_date_field', __( 'Date Field Is not Valid' ,'weforms'), array( 'status' => 404 ) );
403 }
404
405 }
406
407 if ( 'email_address' === $field['template'] ) {
408 if( !$this->email_validation( $value ) ){
409 $form_error->add( 'rest_weforms_form_email', __( 'Invalid Email Address' ,'weforms'), array( 'status' => 404 ) );
410 }
411 }
412
413 if ( 'website_url' === $field['template'] ) {
414 if ( !filter_var( $value, FILTER_VALIDATE_URL ) ) {
415 $form_error->add( 'rest_weforms_form_url', __( 'Invalid Url Address' ,'weforms'), array( 'status' => 404 ) );
416 }
417 }
418
419 if ( 'numeric_text_field' === $field['template'] ) {
420 if( !is_numeric( $value ) ) {
421 $form_error->add( 'rest_weforms_form_number', __( 'Number Field Should be numberic value ' ,'weforms'), array( 'status' => 404 ) );
422 }
423 }
424
425
426
427 if ( 'single_product' === $field['template'] ) {
428 if ( ! $value ) {
429 $value = array();
430 }
431
432 $value['price'] = isset( $value['price'] ) ? floatval( $value['price'] ) : 0;
433 $value['quantity'] = isset( $value['quantity'] ) ? floatval( $value['quantity'] ) : 0;
434 $quantity = isset( $field['quantity'] ) ? $field['quantity'] : array();
435 $price = isset( $field['price'] ) ? $field['price'] : array();
436
437 if ( isset( $price['is_flexible'] ) && $price['is_flexible'] ) {
438 $min = isset( $price['min'] ) ? floatval( $price['min'] ) : 0;
439 $max = isset( $price['max'] ) ? floatval( $price['max'] ) : 0;
440
441 if ( $value['price'] < $min ) {
442 return new WP_Error( 'rest_weforms_form_price', sprintf( __( '%s price must be equal or greater than %s',
443 $field['weforms'],
444 $min ,
445 'weforms'
446 )
447 ), array( 'status' => 404 ) );
448 }
449
450 if ( $max && $value['price'] > $max ) {
451 $form_error->add( 'rest_weforms_form_price', sprintf( __( '%s price must be equal or less than %s',
452 $field['weforms'],
453 $max ,
454 'weforms'
455 )
456 ), array( 'status' => 404 ) );
457 }
458 }
459
460 if ( isset( $quantity['status'] ) && $quantity['status'] ) {
461 $min = isset( $quantity['min'] ) ? floatval( $quantity['min'] ) : 0;
462 $max = isset( $quantity['max'] ) ? floatval( $quantity['max'] ) : 0;
463
464 if ( $value['quantity'] < $min ) {
465 $form_error->add( 'rest_weforms_form_quantity', sprintf( __(
466 '%s quantity must be equal or greater than %s',
467 $field['weforms'],
468 $min ,
469 'weforms'
470 )
471 ), array( 'status' => 404 ) );
472 }
473
474 if ( $max && $value['quantity'] > $max ) {
475
476 $form_error->add( 'rest_weforms_form_quantity', sprintf( __(
477 '%s quantity must be equal or less than %s',
478 $field['weforms'],
479 $max ,
480 'weforms'
481 )
482 ), array( 'status' => 404 ) );
483 }
484 }
485 }
486 }
487 }
488
489 if( count( $form_error->get_error_messages() ) > 0 ) {
490 return $form_error;
491 } else {
492 return true;
493 }
494 }
495
496 /**
497 * reCaptcha Validation
498 *
499 * @since 1.4.2
500 *
501 * @return void
502 */
503 function validate_reCaptcha( $request ) {
504 if ( class_exists( 'WPUF_ReCaptcha' ) ) {
505 $recaptcha_class = 'WPUF_ReCaptcha';
506 } else {
507 if ( ! function_exists( 'recaptcha_get_html' ) ) {
508 require_once WEFORMS_INCLUDES . '/library/reCaptcha/recaptchalib.php';
509 }
510
511 require_once WEFORMS_INCLUDES . '/library/reCaptcha/recaptchalib_noCaptcha.php';
512
513 $recaptcha_class = 'Weforms_ReCaptcha';
514 }
515
516 $invisible = isset( $request['g-recaptcha-response'] ) ? false : true;
517
518 $recaptcha_settings = weforms_get_settings( 'recaptcha' );
519 $secret = isset( $recaptcha_settings->secret ) ? $recaptcha_settings->secret : '';
520
521 if ( ! $invisible ) {
522 $response = null;
523 $reCaptcha = new $recaptcha_class( $secret );
524
525 $resp = $reCaptcha->verifyResponse(
526 $_SERVER['REMOTE_ADDR'],
527 $request['g-recaptcha-response']
528 );
529
530 if ( ! $resp->success ) {
531 return false;
532 }
533 } else {
534 $recap_challenge = isset( $request['recaptcha_challenge_field'] ) ? $request['recaptcha_challenge_field'] : '';
535 $recap_response = isset( $request['recaptcha_response_field'] ) ? $request['recaptcha_response_field'] : '';
536 $resp = recaptcha_check_answer( $secret, $_SERVER['REMOTE_ADDR'], $recap_challenge, $recap_response );
537
538 if ( ! $resp->is_valid ) {
539 ob_clean();
540 return false;
541 }
542 }
543
544 return true;
545 }
546
547 function weforms_api_insert_entry( $args, $fields = array() ) {
548 global $wpdb;
549
550 $browser = weforms_get_browser();
551
552 $defaults = array(
553 'form_id' => 0,
554 'user_id' => get_current_user_id(),
555 'user_ip' => ip2long( weforms_get_client_ip() ),
556 'user_device' => $browser['name'] . '/' . $browser['platform'],
557 'created_at' => current_time( 'mysql' )
558 );
559
560 $r = wp_parse_args( $args, $defaults );
561
562 if ( ! $r['form_id'] ) {
563 return new WP_Error( 'no-form-id', __( 'No form ID was found.', 'weforms' ) );
564 }
565
566 if ( ! $fields ) {
567 return new WP_Error( 'no-fields', __( 'No form fields were found.', 'weforms' ) );
568 }
569
570 $success = $wpdb->insert( $wpdb->weforms_entries, $r );
571
572 if ( is_wp_error( $success ) || ! $success ) {
573 return new WP_Error( 'could-not-create', __( 'Could not create an entry', 'weforms' ), array( 'status' => 404 ) );
574 }
575
576 $entry_id = $wpdb->insert_id;
577
578 foreach ( $fields as $key => $value ) {
579 weforms_add_entry_meta( $entry_id, $key, $value );
580 }
581
582 return $entry_id;
583 }
584
585 /**
586 * Save and existing form
587 *
588 * @since 1.4.2
589 *
590 * @param array $data Contains form_fields, form_settings, form_settings_key data
591 *
592 * @return boolean
593 */
594 public function weforms_api_save( $data ) {
595 $saved_wpuf_inputs = array();
596
597 wp_update_post( array( 'ID' => $data['form_id'], 'post_status' => 'publish', 'post_title' => $data['post_title'] ) );
598
599 $existing_wpuf_input_ids = get_children( array(
600 'post_parent' => $data['form_id'],
601 'post_status' => 'publish',
602 'post_type' => 'wpuf_input',
603 'numberposts' => '-1',
604 'orderby' => 'menu_order',
605 'order' => 'ASC',
606 'fields' => 'ids'
607 ) );
608
609 $new_wpuf_input_ids = array();
610
611 if ( ! empty( $data['form_fields'] ) ) {
612
613 foreach ( $data['form_fields'] as $order => $field ) {
614 if ( ! empty( $field['is_new'] ) ) {
615 unset( $field['is_new'] );
616 unset( $field['id'] );
617
618 $field_id = 0;
619
620 } else {
621 $field_id = $field['id'];
622 }
623
624 $field_id = weforms_insert_form_field( $data['form_id'], $field, $field_id, $order );
625
626 $new_wpuf_input_ids[] = $field_id;
627
628 $field['id'] = $field_id;
629
630 $saved_wpuf_inputs[] = $field;
631 }
632 }
633
634 $form = weforms()->form->get( $data['form_id'] );
635 $new_form_settings = array_merge( $data['form_settings'], array_diff_key( $form->get_settings(), $data['form_settings'] ) );
636 $new_form_notifications = array_merge( $data['notifications'], array_diff_key( $form->get_notifications(), $data['notifications'] ) );
637 $new_form_integrations = array_merge( $data['integrations'], array_diff_key( $form->get_integrations(), $data['integrations'] ) );
638
639 update_post_meta( $data['form_id'], $data['form_settings_key'], $new_form_settings );
640 update_post_meta( $data['form_id'], 'notifications', $new_form_notifications );
641 update_post_meta( $data['form_id'], 'integrations', $new_form_integrations );
642 update_post_meta( $data['form_id'], '_weforms_version', WEFORMS_VERSION );
643
644 return $saved_wpuf_inputs;
645 }
646
647 /**
648 * Bulk Delete Form Exist
649 *
650 * @since 1.4.2
651 *
652 * @param array $param
653 * @param WP_REST_Request $request Full details about the request
654 * @param string $key
655 *
656 * @return boolean
657 **/
658 public function is_bulk_delete_form_exists( $param, $request, $key ) {
659 global $wpdb;
660 $forms = $request['ids'];
661
662 if( is_array( $forms ) ) {
663 $forms = array_filter( $forms, 'is_numeric' );
664
665 if( empty( $forms ) ) {
666 return false;
667 }
668
669 $form_id = implode( ",", $forms );
670 $querystr = " SELECT $wpdb->posts.id
671 FROM $wpdb->posts
672 WHERE $wpdb->posts.post_type = 'wpuf_contact_form'
673 AND $wpdb->posts.ID IN ( $form_id )
674 ";
675 } else {
676 $form_id = (int) $forms;
677 $querystr = " SELECT $wpdb->posts.id
678 FROM $wpdb->posts
679 WHERE $wpdb->posts.post_type = 'wpuf_contact_form'
680 AND $wpdb->posts.ID = $form_id
681 ";
682 }
683
684 $result = $wpdb->get_results( $querystr );
685
686 if ( empty( $result ) ) {
687 return false;
688 } else {
689 return true;
690 }
691 }
692
693 public function email_validation( $value ) {
694 return ( !preg_match( "/^[_a-z0-9-]+(\.[_a-z0-9-]+)*@[a-z0-9-]+(\.[a-z0-9-]+)*(\.[a-z]{2,3})$/", $value ) ) ? false : true;
695 }
696
697 public function get_items( $request ) {
698 $args = array(
699 'posts_per_page' => isset( $request['per_page'] ) ? intval( $request['per_page'] ) : 10,
700 'paged' => isset( $request['page'] ) ? absint( $request['page'] ) : 1,
701 'order' => isset( $request['order'] ) ? $request['order'] : 'DESC',
702 'orderby' => isset( $request['orderby'] ) ? $request['orderby'] : 'post_date',
703 'post_status' => isset( $request['status'] ) ? $request['status'] : 'any',
704 's' => isset( $request['search'] ) ? $request['search'] : '',
705 );
706
707 $forms_array = array();
708
709 $defaults = array(
710 'post_type' => 'wpuf_contact_form',
711 'post_status' => array( 'publish', 'draft', 'pending' )
712 );
713
714 $args = wp_parse_args( $args, $defaults );
715 $query = new WP_Query( $args );
716 $forms = $query->get_posts();
717 $formatted_items = [];
718
719 if ( $forms ) {
720 foreach ( $forms as $form_obj ) {
721 $form = new WeForms_Form( $form_obj );
722 $form_author = $form->data->post_author;
723 $form_status = $form->is_api_form_submission_open();
724 $data = array();
725 $data['id'] = $form->id;
726 $data['name'] = $form->name;
727 $data['created_by'] = get_the_author_meta( 'user_nicename' , $form_author );
728 $data['created_on'] = $form->data->post_date;
729 $data['status'] = $form_status['type'];
730 $data['status_info'] = isset( $form_status['message'] ) ? $form_status['message'] : '';
731 $data['fields'] = count( $form->get_fields() );
732 $data['entries'] = $form->num_form_entries();
733 $data['views'] = $form->num_form_views();
734 $data['payments'] = $form->num_form_payments();
735 $data = $this->prepare_item_for_response( (array) $data, $request );
736 $formatted_items[] = $this->prepare_response_for_collection( $data );
737 }
738 }
739
740 $contact_forms = apply_filters( 'weforms_rest_get_contact_forms', $formatted_items );
741 $response = rest_ensure_response( $contact_forms );
742 $response = $this->format_collection_response( $response, $request, (int) $query->found_posts );
743 return $response;
744 }
745
746 public function get_item( $request ) {
747 $form_id = absint( $request['form_id'] );
748 $form = weforms()->form->get( $form_id );
749 $form_status = $form->is_api_form_submission_open();
750 $form_author = $form->data->post_author;
751
752 $data = array(
753 'id' => $form->data->ID,
754 'name' => $form->name,
755 'created_by' => get_the_author_meta( 'user_nicename' , $form_author ),
756 'created_on' => $form->data->post_date,
757 'status' => $form_status['type'],
758 'status_info' => isset( $form_status['message'] ) ? $form_status['message'] : '',
759 'fields' => $form->get_fields(),
760 'settings' => $form->get_settings(),
761 'notifications' => $form->get_notifications(),
762 'integrations' => $form->get_integrations()
763 );
764
765 $data = $this->prepare_item_for_response( $data, $request );
766 $response = rest_ensure_response( $data );
767
768 return $response;
769 }
770
771 public function create_item( $request ) {
772 $template = isset( $request['template'] ) ? sanitize_text_field( $request['template'] ) : '';
773 $name = isset( $request['name'] ) ? sanitize_text_field( $request['name'] ) : '';
774 $setting = isset( $request['settings'] ) ? $request['settings'] : array();
775 $notifications = isset( $request['notifications'] ) ? $request['notifications'] : array();
776 $fields = isset( $request['fields'] ) ? $request['fields'] : array();
777 $integrations = isset( $request['integrations'] ) ? $request['integrations'] : array();
778
779 $default_form_settings = weforms_get_default_form_settings();
780 $default_form_notification = array( weforms_get_default_form_notification() );
781 $integration_list = weforms()->integrations->get_integration_js_settings();
782 $field_list = weforms()->fields->get_fields();
783
784 if( isset( $template ) && !empty( $template ) ) {
785 $form_id = weforms()->templates->create( $template );
786 } elseif( !empty( $name ) ) {
787 if( !empty( $fields ) ) {
788 foreach ( $fields as $key => $field ) {
789 $f = in_array( $field['template'], array_keys( $field_list ) );
790 if( empty( $f ) ) {
791 unset($fields[ $key ] );
792 }
793 }
794 }
795
796 $fields = array_intersect_key( $fields, $field_list );
797 $form_id = weforms()->form->create( $name, $fields );
798
799 if ( is_wp_error( $form_id ) ) {
800 return new WP_Error( 'rest_invalid_data', __( 'Could not create the form', 'weforms') , array( 'status' => 404 ) );
801 }
802
803 $new_form_settings = array_diff_key( $default_form_settings, $setting );
804 $new_form_notification = array_diff_key( $default_form_notification, $notifications );
805 $new_form_integrations = array_intersect_key( $integrations, $integration_list );
806 if ( !class_exists( 'WeForms_Pro' ) ) {
807 $new_form_integrations = array_udiff_assoc( $new_form_integrations, $integration_list,
808 function( $item, $item_list ) {
809 if( isset( $item_list['pro'] ) && $item_list['pro'] == true ) {
810 return 0;
811 }
812 return $item;
813 }
814 );
815 }
816
817 update_post_meta( $form_id, 'wpuf_form_settings', $new_form_settings );
818 update_post_meta( $form_id, 'notifications', $new_form_notification );
819 update_post_meta( $form_id, 'integrations', $new_form_integrations );
820 }
821
822 if ( is_wp_error( $form_id ) || is_null( $form_id ) ) {
823 return new WP_Error( 'rest_weforms_invalid_data', __( 'Could not create the form', 'weforms') , array( 'status' => 404 ) );
824 }
825
826 $form = weforms()->form->get( $form_id );
827
828 $data = array(
829 'id' => $form->data->ID,
830 'name' => $form->name,
831 'fields' => $form->get_fields(),
832 'settings' => $form->get_settings(),
833 'notifications' => $form->get_notifications(),
834 'integrations' => $form->get_integrations()
835 );
836
837 $response = $this->prepare_item_for_response( $data, $request );
838 $response = rest_ensure_response( $response );
839 $response->set_status( 200 );
840 $response->header( 'Location', rest_url( sprintf( '/%s/%s/%d', $this->namespace, $this->rest_base, $form->id ) ) );
841
842 return $response;
843 }
844
845 public function update_item( $request ) {
846 $data = array();
847 $form_id = $request['form_id'];
848 $data['form_id'] = $form_id;
849 $data['form_settings_key'] = 'wpuf_form_settings';
850
851 if( isset( $request['name'] ) && !empty( $request['name'] ) ) {
852 $data['post_title'] = $request['name'];
853 }
854
855 if( isset( $request['settings'] ) && !empty( $request['settings'] ) ) {
856 $data['form_settings'] = $request['settings'];
857 }
858
859 if( isset( $request['fields'] ) && !empty( $request['fields'] ) ) {
860 $data['form_fields'] = $request['fields'];
861 }
862
863 if( isset( $request['notifications'] ) && !empty( $request['notifications'] ) ) {
864 $data['notifications'] = $request['notifications'];
865 }
866
867 if( isset( $request['integrations'] ) && !empty( $request['integrations'] ) ) {
868 $data['integrations'] = $request['integrations'];
869 }
870
871 $this->weforms_api_update( $data );
872
873 $form = weforms()->form->get( $form_id );
874
875 $response_data = array(
876 'id' => $form->data->ID,
877 'name' => $form->name,
878 'fields' => $form->get_fields(),
879 'settings' => $form->get_settings(),
880 'notifications' => $form->get_notifications(),
881 'integrations' => $form->get_integrations()
882 );
883
884 $response = $this->prepare_item_for_response( $response_data, $request );
885 $response = rest_ensure_response( $response );
886 $response->set_status( 201 );
887 $response->header( 'Location', rest_url( sprintf( '/%s/%s/%d', $this->namespace, $this->rest_base, $form->id ) ) );
888
889 return $response;
890 }
891
892 public function delete_item( $request ) {
893 $form_array = array();
894 $form_id = $request['form_id'];
895 $form = $this->delete( $form_id );
896
897 if ( is_wp_error( $form ) ) {
898 return new WP_Error( 'error', __( 'Could not delete the form', 'weforms') , array( 'status' => 404 ) );
899 }
900
901 $form_array['id'] = $form_id;
902 $form_array['message'] = __( 'form deleted successfully', 'weforms' );
903 $form_array['data']['status'] = 200;
904
905 $response = $this->prepare_response_for_collection( $form_array, $request );
906 $response = rest_ensure_response( $response );
907
908 return $response;
909 }
910
911 /**
912 * Duplicate Form
913 *
914 * @since 1.4.2
915 *
916 * @param WP_REST_Request $request Full details about the request.
917 *
918 * @return WP_REST_Response|WP_Error Response object on success, or WP_Error object on failure.
919 **/
920 public function duplicate_form( $request ) {
921 $form_id = $request['form_id'];
922 $form = weforms()->form->get( $form_id );
923
924 if ( empty( $form ) ) {
925 return new WP_Error( 'error', __( 'Could not duplicate the form', 'weforms') , array( 'status' => 404 ) );
926 }
927
928 $form_id = weforms()->form->create( $form->name, $form->get_fields());
929
930 $data = array(
931 'form_id' => absint( $form_id ),
932 'post_title' => sanitize_text_field( $form->name ) . ' (#' . $form_id . ')',
933 'form_fields' => weforms()->form->get( $form_id )->get_fields(),
934 'form_settings' => $form->get_settings(),
935 'form_settings_key' => 'wpuf_form_settings',
936 'notifications' => $form->get_notifications(),
937 'integrations' => $form->get_integrations()
938 );
939
940 $form_fields = weforms()->form->save( $data );
941 $form = weforms()->form->get( $form_id );
942 $form->settings = $form->get_settings();
943
944 $response_data = array(
945 'id' => $form->data->ID,
946 'name' => $form->name,
947 'fields' => $form->get_fields(),
948 'settings' => $form->get_settings(),
949 'notifications' => $form->get_notifications(),
950 'integrations' => $form->get_integrations()
951 );
952
953 $response = $this->prepare_item_for_response( $response_data, $request );
954 $response = rest_ensure_response( $response );
955 $response->set_status( 201 );
956 $response->header( 'Location', rest_url( sprintf( '/%s/%s/%d', $this->namespace, $this->rest_base, $form->id ) ) );
957
958 return $response;
959 }
960
961 /**
962 * Prepare a single user output for response
963 *
964 * @param object $item
965 * @param WP_REST_Request $request Request object.
966 * @param array $additional_fields (optional)
967 *
968 * @return WP_REST_Response $response Response data.
969 */
970 public function prepare_item_for_response( $item, $request, $additional_fields = [] ) {
971 $response = rest_ensure_response( $item );
972 $response = $this->add_links( $response, $item );
973 return $response;
974 }
975 /**
976 * Get the Form's schema, conforming to JSON Schema
977 *
978 * @return array
979 */
980 public function get_item_schema() {
981 $schema = array(
982 '$schema' => 'http://json-schema.org/draft-04/schema#',
983 'title' => 'forms',
984 'type' => 'object',
985 'properties' => array(
986 'form_id' => array(
987 'description' => __( 'Unique identifier for the object', 'weforms' ),
988 'type' => 'integer',
989 'sanitize_callback' => 'absint',
990 'validate_callback' => array( $this, 'is_form_exists' ),
991 'context' => array( 'embed', 'view', 'edit' ),
992 'required' => true,
993 'readonly' => true,
994 ),
995 'name' => array(
996 'description' => __( '', 'weforms' ),
997 'type' => 'string',
998 'context' => [ 'edit','view'],
999 'sanitize_callback' => 'sanitize_text_field',
1000 'required' => false,
1001 ),
1002 'template' => array(
1003 'required' => false,
1004 'type' => 'string',
1005 'description' => 'template name',
1006 'sanitize_callback' => 'sanitize_text_field',
1007 'validate_callback' => array( $this, 'is_template_exists' )
1008 ),
1009 "settings" => array(
1010 'description' => __( '', 'weforms' ),
1011 'type' => 'object',
1012 'context' => [ 'edit' ,'view'],
1013 'required' => false,
1014 ),
1015 "notifications" => array(
1016 'description' => __( '', 'weforms' ),
1017 'type' => 'object',
1018 'context' => [ 'edit','view' ],
1019 'required' => false,
1020 ),
1021 "fields" => array(
1022 'description' => __( '', 'weforms' ),
1023 'type' => 'object',
1024 'context' => [ 'edit','view' ],
1025 'required' => false,
1026 ),
1027 "integrations" => array(
1028 'description' => __( '', 'weforms' ),
1029 'context' => [ 'edit','view' ],
1030 'type' => 'object',
1031 'required' => false,
1032 ),
1033 ),
1034 );
1035
1036 return $schema;
1037 }
1038
1039 public function get_collection_params() {
1040 $query_params = parent::get_collection_params();
1041 $query_params['context']['default'] = 'view';
1042
1043 $schema = $this->get_item_schema();
1044 $schema_properties = $schema['properties'];
1045
1046 return $query_params;
1047 }
1048
1049 /**
1050 * Delete a form with it's input fields
1051 *
1052 * @since 1.4.2
1053 *
1054 * @param integer $form_id
1055 * @param boolean $force
1056 *
1057 * @return void
1058 */
1059 public function delete( $form_id, $force = true ) {
1060 global $wpdb;
1061
1062 $form = weforms()->form->get( $form_id );
1063
1064 if ( !$form->id ) {
1065 return new WP_Error( 'form_not_found', __( 'Form not found', 'weforms' ) );
1066 }
1067
1068 $wp_post = wp_delete_post( $form_id, $force );
1069
1070 if ( ! $wp_post ) {
1071 return new WP_Error( 'unable_to_delete', __( 'Unable to delete form', 'weforms' ) );
1072 }
1073
1074 // delete form inputs as WP doesn't know the relationship
1075 return $wpdb->delete( $wpdb->posts,
1076 array(
1077 'post_parent' => $form_id,
1078 'post_type' => 'wpuf_input'
1079 )
1080 );
1081
1082 return $form;
1083 }
1084
1085
1086 /**
1087 * Bulk Delete Form
1088 *
1089 * @since 1.3.9
1090 *
1091 * @param WP_REST_Request $request
1092 *
1093 * @return WP_REST_Response|WP_Error Response object on success, or WP_Error object on failure.
1094 */
1095 public function bulk_delete_form( $request ) {
1096 $form_ids = $request['ids'];
1097
1098 if ( empty( $form_ids ) ) {
1099 return new WP_Error( 'error', __( 'No form ids provided!', 'weforms') , array( 'status' => 404 ) );
1100 }
1101
1102 $response = array();
1103
1104 foreach ( $form_ids as $form_id ) {
1105 $status = $this->delete( $form_id );
1106
1107 if( is_wp_error( $status ) ) {
1108 $response[$form_id] = $status->get_error_message();
1109 } else {
1110 $response[$form_id] = __( 'form deleted successfully ', 'weforms' );
1111 }
1112 }
1113
1114 $response = $this->prepare_response_for_collection( $response );
1115 $response = rest_ensure_response( $response );
1116
1117 return $response;
1118 }
1119
1120
1121 /**
1122 * Update and existing form
1123 *
1124 * @since 1.4.2
1125 *
1126 * @param array $data Contains form_fields, form_settings, form_settings_key data
1127 *
1128 * @return boolean
1129 */
1130 public function weforms_api_update( $data ) {
1131 $saved_wpuf_inputs = array();
1132
1133 if( isset( $data['post_title'] ) && !empty( $data['post_title'] ) ) {
1134 wp_update_post(
1135 array(
1136 'ID' => $data['form_id'],
1137 'post_status' => 'publish',
1138 'post_title' => $data['post_title']
1139 )
1140 );
1141 }
1142
1143 $existing_wpuf_input_ids = get_children( array(
1144 'post_parent' => $data['form_id'],
1145 'post_status' => 'publish',
1146 'post_type' => 'wpuf_input',
1147 'numberposts' => '-1',
1148 'orderby' => 'menu_order',
1149 'order' => 'ASC',
1150 'fields' => 'ids'
1151 ) );
1152
1153 $new_wpuf_input_ids = array();
1154
1155 if ( ! empty( $data['form_fields'] ) ) {
1156
1157 foreach ( $data['form_fields'] as $order => $field ) {
1158 if ( ! empty( $field['is_new'] ) ) {
1159 unset( $field['is_new'] );
1160 unset( $field['id'] );
1161
1162 $field_id = 0;
1163
1164 } else {
1165 $field_id = $field['id'];
1166 }
1167
1168 $field_id = weforms_insert_form_field( $data['form_id'], $field, $field_id, $order );
1169
1170 $new_wpuf_input_ids[] = $field_id;
1171
1172 $field['id'] = $field_id;
1173
1174 $saved_wpuf_inputs[] = $field;
1175 }
1176 }
1177
1178 $form = weforms()->form->get( $data['form_id'] );
1179
1180 if( isset( $data['form_settings'] ) && !empty( $data['form_settings'] ) ) {
1181 $new_form_settings = array_merge( $data['form_settings'], array_diff_key( $form->get_settings(), $data['form_settings'] ) );
1182 update_post_meta( $data['form_id'], 'wpuf_form_settings', $new_form_settings );
1183 }
1184
1185 if( isset( $data['notifications'] ) && !empty( $data['notifications'] ) ) {
1186
1187 $existing_notifications = $form->get_notifications();
1188
1189 foreach ( $existing_notifications as $key => $notification ) {
1190 if( array_key_exists( $key , $data['notifications'] ) ) {
1191 $existing_notifications[ $key ] = $data['notifications'][$key];
1192 }
1193 }
1194
1195 update_post_meta( $data['form_id'], 'notifications', $existing_notifications );
1196 }
1197
1198 if( isset( $data['integrations'] ) && !empty( $data['integrations'] ) ) {$integration_list = weforms()->integrations->get_integration_js_settings();
1199 $form_integration = $form->get_integrations();
1200 $integrations = $data['integrations'];
1201 $integrations = array_intersect_key( $integrations, $integration_list );
1202
1203 if ( !class_exists( 'WeForms_Pro' ) ) {
1204 $integrations = array_udiff_assoc( $integrations, $integration_list,
1205 function( $item, $item_list ) {
1206 if( isset( $item_list['pro'] ) && $item_list['pro'] == true ) {
1207 return 0;
1208 }
1209 return $item;
1210 }
1211 );
1212 }
1213
1214 $new_form_integrations = array_merge( $integrations, array_diff_key( $form->get_integrations(), $integrations ) );
1215
1216 update_post_meta( $data['form_id'], 'integrations', $new_form_integrations );
1217 }
1218
1219 update_post_meta( $data['form_id'], '_weforms_version', WEFORMS_VERSION );
1220
1221 return $saved_wpuf_inputs;
1222 }
1223
1224 /**
1225 * Import Forms
1226 *
1227 * @since 1.4.2
1228 *
1229 * @param WP_REST_Request $request
1230 *
1231 * @return WP_REST_Response|WP_Error Response object on success, or WP_Error object on failure.
1232 **/
1233 public function import_forms( $request ) {
1234 $files = $request->get_file_params();
1235
1236 if ( ! $files ) {
1237 return new WP_Error( 'rest_invalid_file',__( 'No file found to import.', 'weforms' ), array( 'status' => 404) );
1238 }
1239
1240 $file_ext = pathinfo( $files['file']['name'], PATHINFO_EXTENSION );
1241
1242 if ( ! class_exists( 'WeForms_Admin_Tools' ) ) {
1243 require_once WEFORMS_INCLUDES . '/admin/class-admin-tools.php';
1244 }
1245
1246 if ( ( $file_ext == 'json' ) && ( $files['file']['size'] < 500000 ) ) {
1247 $status = WeForms_Admin_Tools::import_json_file( $files['file']['tmp_name'] );
1248
1249 if ( $status ) {
1250 $response_data = array();
1251 $response_data ['message'] = __( 'The forms have been imported successfully!', 'weforms' );
1252 $response_data ['status'] = 200;
1253
1254 $response = $this->prepare_response_for_collection( $response_data );
1255 $response = rest_ensure_response( $response );
1256
1257 return $response;
1258 } else {
1259 return new WP_Error( 'rest_invalid_file',__( 'Something went wrong importing the file.', 'weforms' ), array( 'status' => 404 ) );
1260 }
1261 } else {
1262 return new WP_Error( 'rest_invalid_file',__( 'Invalid file or file size too big.', 'weforms' ), array( 'status' => 404 ) );
1263 }
1264 }
1265
1266 /**
1267 * Save Form Entry from Frontend
1268 *
1269 * @since 1.4.2
1270 *
1271 * @param WP_REST_Request $request Full details about the request.
1272 *
1273 * @return WP_REST_Response|WP_Error Response object on success, or WP_Error object on failure
1274 **/
1275 public function save_entry( $request ) {
1276 $form_id = $request['form_id'];
1277 $page_id = isset( $request['page_id'] ) ? intval( $request['page_id'] ) : 0;
1278 $form = weforms()->form->get( $form_id );
1279 $form_settings = $form->get_settings();
1280 $form_fields = $form->get_fields();
1281 $entry_fields = $form->prepare_entries( $request );
1282 $entry_fields = apply_filters( 'weforms_before_entry_submission', $entry_fields, $form, $form_settings, $form_fields );
1283
1284 $entry_id = $this->weforms_api_insert_entry (array(
1285 'form_id' => $form_id
1286 ), $entry_fields);
1287
1288 if ( is_wp_error( $entry_id ) ) {
1289 return new WP_Error( 'rest_invalid_data', $entry_id->get_error_message(), array( 'status' => 404 ) );
1290 }
1291
1292 // redirect URL
1293 $show_message = false;
1294 $redirect_to = false;
1295
1296 if ( $form_settings['redirect_to'] == 'page' ) {
1297 $redirect_to = get_permalink( $form_settings['page_id'] );
1298 } elseif ( $form_settings['redirect_to'] == 'url' ) {
1299 $redirect_to = $form_settings['url'];
1300 } elseif ( $form_settings['redirect_to'] == 'same' ) {
1301 $show_message = true;
1302 } else {
1303 $redirect_to = get_permalink( $post_id );
1304 }
1305
1306 // Fire a hook for integration
1307 do_action( 'weforms_entry_submission', $entry_id, $form_id, $page_id, $form_settings );
1308
1309 $field_search = $field_replace = array();
1310
1311 foreach ( $form_fields as $r_field ) {
1312 $field_search[] = '{'.$r_field['name'].'}';
1313
1314 if ( $r_field['template'] == 'name_field' ) {
1315 $field_replace[] = implode( ' ' , explode( '|', $entry_fields[$r_field['name']] ));
1316 } else {
1317 $field_replace[] = isset( $entry_fields[$r_field['name']] ) ? $entry_fields[$r_field['name']] : '';
1318 }
1319 }
1320
1321 $message = str_replace( $field_search, $field_replace, $form_settings['message'] );
1322
1323 $notification = new WeForms_Notification( array(
1324 'form_id' => $form_id,
1325 'page_id' => $page_id,
1326 'entry_id' => $entry_id
1327 ) );
1328
1329 $notification->send_notifications();
1330
1331 $entry_data = weforms_get_entry_data( $entry_id );
1332
1333 $response_data = array();
1334 $response_data['id'] = $entry_id;
1335 $response_data['message'] = "Entries Created Successfully";
1336 $response_data['success'] = true;
1337 $response_data['redirect_to'] = $redirect_to;
1338 $response_data['show_message'] = $show_message;
1339 $response_data['message'] = $message;
1340 $response_data['data'] = $entry_data['data'];
1341 $response_data['form_id'] = $form_id;
1342 $response_data['entry_id'] = $entry_id;
1343
1344 $response = apply_filters( 'weforms_entry_submission_response', $response_data );
1345 $response = $this->prepare_response_for_collection( $response_data );
1346 $response = rest_ensure_response( $response );
1347
1348 return $response;
1349 }
1350
1351 /**
1352 * Export Form Entries
1353 *
1354 *
1355 **/
1356 public function export_form_entries( $request ) {
1357 $form_id = $request['form_id'];
1358
1359 if ( ! $form_id ) {
1360 return new WP_Error( 'rest_weforms_invalid_form',__( 'Form id not exists', 'weforms' ) );
1361 }
1362
1363 $entry_array = [];
1364 $columns = weforms_get_entry_columns( $form_id, false );
1365 $total_entries = weforms_count_form_entries( $form_id );
1366 $entries = weforms_get_form_entries( $form_id, array(
1367 'number' => $total_entries,
1368 'offset' => 0
1369 ) );
1370 $extra_columns = array(
1371 'ip_address' => __( 'IP Address', 'weforms' ),
1372 'created_at' => __( 'Date', 'weforms' )
1373 );
1374
1375 $columns = array_merge( array( 'id' => 'Entry ID' ), $columns, $extra_columns );
1376
1377 foreach ($entries as $entry) {
1378 $temp = array();
1379
1380 foreach ($columns as $column_id => $label) {
1381 switch ( $column_id ) {
1382 case 'id':
1383 $temp[ $column_id ] = $entry->id;
1384 break;
1385
1386 case 'ip_address':
1387 $temp[ $column_id ] = $entry->ip_address;
1388 break;
1389
1390 case 'created_at':
1391 $temp[ $column_id ] = $entry->created_at;
1392 break;
1393
1394 default:
1395 $value = weforms_get_entry_meta( $entry->id, $column_id, true );
1396 $value = weforms_get_pain_text( $value );
1397 $temp[ $column_id ] = str_replace( WeForms::$field_separator, ' ', $value );
1398 break;
1399 }
1400 }
1401
1402 $entry_array[] = $temp;
1403 }
1404
1405 error_reporting(0);
1406
1407 if ( ob_get_contents() ) {
1408 ob_clean();
1409 }
1410
1411 $blogname = sanitize_title( strtolower( str_replace( " ", "-", get_option( 'blogname' ) ) ) );
1412 $file_name = $blogname . "-weforms-entries-" . time() . '.csv';
1413
1414 // force download
1415 header("Content-Type: application/force-download");
1416 header("Content-Type: application/octet-stream");
1417 header("Content-Type: application/download");
1418
1419 // disposition / encoding on response body
1420 header("Content-Disposition: attachment;filename={$file_name}");
1421 header("Content-Transfer-Encoding: binary");
1422
1423 $handle = fopen("php://output", 'w');
1424
1425 //handle UTF-8 chars conversion for CSV
1426 fprintf( $handle, chr(0xEF).chr(0xBB).chr(0xBF) );
1427
1428 // put the column headers
1429 fputcsv( $handle, array_values( $columns ) );
1430
1431 // put the entry values
1432 foreach ( $entry_array as $row ) {
1433 fputcsv( $handle, $row );
1434 }
1435
1436 fclose( $handle );
1437
1438 exit;
1439 }
1440
1441 public function submit_permissions_check( $request ) {
1442 if ( !is_weforms_api_allowed_guest_submission() ) {
1443 return new WP_Error( 'rest_cannot_submit_entry', __( 'Sorry, you have no permission to submit this form.','weforms' ), array( 'status' => rest_authorization_required_code() ) );
1444 }
1445
1446 $form = weforms()->form->get( (int) $request['form_id'] );
1447 $form_is_open = $form->is_submission_open();
1448
1449 if ( is_wp_error( $form_is_open ) ) {
1450 return new WP_Error( 'rest_weforms_form_permission', $form_is_open->get_error_message(), array( 'status' => 404 ) );
1451 }
1452
1453 $form_validations = $this->save_check( $request );
1454
1455 if( is_wp_error( $form_validations ) ) {
1456 $form_message = array();
1457 foreach ( $form_validations->get_error_messages() as $error ) {
1458 $form_message[] = $error;
1459 }
1460 return new WP_Error( 'error', $form_message, array( 'status' => 404 ) );
1461 }
1462
1463 return true;
1464 }
1465
1466 /**
1467 * Get Form Entries
1468 *
1469 * @since 1.4.2
1470 *
1471 * @param WP_REST_Request $request
1472 *
1473 * @return WP_REST_Response|WP_Error Response object on success, or WP_Error object on failure.
1474 *
1475 */
1476 public function get_entry( $request ) {
1477 $form_id = isset( $request['form_id'] ) ? intval( $request['form_id'] ) : 0;
1478 $current_page = isset( $request['page'] ) ? intval( $request['page'] ) : 1;
1479 $per_page = isset( $request['per_page'] ) ? intval( $request['per_page'] ) : 10;
1480 $status = isset( $request['status'] ) ? $request['status'] : 'publish';
1481 $offset = ( $current_page - 1 ) * $per_page;
1482
1483 if ( ! $form_id ) {
1484 return new WP_Error( 'rest_invalid_form', __( 'Please provide a form id', 'weforms'), array( 'status' => 404 ) );
1485 }
1486
1487 $entries = weforms_get_form_entries(
1488 $form_id, array(
1489 'number' => $per_page,
1490 'offset' => $offset,
1491 'status' => $status,
1492 )
1493 );
1494
1495 $columns = weforms_get_entry_columns( $form_id );
1496 $total_entries = weforms_count_form_entries( $form_id, $status );
1497
1498 array_map(
1499 function( $entry ) use ( $columns,$form_id ) {
1500 $entry_id = $entry->id;
1501 $entry->fields = array();
1502 $entry->links = rest_url( sprintf( '%s/%s/%d/%s/%d', $this->namespace, $this->rest_base, $form_id, 'entries', $entry->id ) );
1503
1504 foreach ( $columns as $meta_key => $label ) {
1505 $value = weforms_get_entry_meta( $entry_id, $meta_key, true );
1506 $entry->fields[ $meta_key ] = str_replace( WeForms::$field_separator, ' ', $value );
1507 }
1508 }, $entries
1509 );
1510
1511 $entries = apply_filters( 'weforms_get_entries', $entries, $form_id );
1512
1513 $response = $entries;
1514 $max_pages = ceil( $total_entries / $per_page );
1515 $response = $this->prepare_response_for_collection( $response );
1516 $response = rest_ensure_response( $response );
1517
1518 $response->header( 'X-WP-Total', (int) $total_entries );
1519 $response->header( 'X-WP-TotalPages', (int) $max_pages );
1520
1521 return $response;
1522 }
1523
1524 /**
1525 * Get Single Entry Details
1526 *
1527 * @since 1.4.2
1528 *
1529 * @param WP_REST_Request $request Full details about the request.
1530 *
1531 * @return WP_REST_Response|WP_Error Response object on success, or WP_Error object on failure
1532 **/
1533 public function get_entry_details( $request ) {
1534 $form_id = $request['form_id'];
1535 $entry_id = $request['entry_id'];
1536 $form = weforms()->form->get( $form_id );
1537 $form_settings = $form->get_settings();
1538 $entry = $form->entries()->get( $entry_id );
1539 $fields = $entry->get_fields();
1540
1541 $fields_data = array_map( function( $field ) {
1542 return [
1543 'name' => $field['name'],
1544 'label' => $field['label'],
1545 'value' => $field['value'],
1546 ];
1547 }, $fields );
1548
1549 $metadata = $entry->get_metadata();
1550 $payment = $entry->get_payment_data();
1551
1552 if ( isset( $payment->payment_data ) && is_serialized( $payment->payment_data ) ) {
1553 $payment->payment_data = unserialize( $payment->payment_data );
1554 }
1555
1556 $has_empty = false;
1557 $answers = array();
1558 $respondentPoints = isset($form_settings['total_points']) ? floatval( $form_settings['total_points'] ) : 0 ;
1559
1560 foreach ( $fields as $key => $field ) {
1561
1562 if ( $form_settings['quiz_form'] == 'yes' ) {
1563 $selectedAnswers = isset($field['selected_answers']) ? $field['selected_answers'] : '';
1564 $givenAnswer = isset($field['value']) ? $field['value'] : '';
1565 $options = isset($field['options']) ? $field['options'] : '';
1566 $template = $field['template'];
1567 $fieldPoints = isset($field['points']) ? floatval( $field['points'] ) : 0;
1568
1569 if ( $template == 'radio_field' || $template == 'dropdown_field' ) {
1570 $answers[$field['name']] = true;
1571
1572 if ( empty($givenAnswer) ) {
1573 $answers[$field['name']] = false;
1574 $respondentPoints -= $fieldPoints;
1575 } else {
1576 foreach ($options as $key => $value) {
1577 if ( $givenAnswer == $value ) {
1578 if ( $key != $selectedAnswers ) {
1579 $answers[$field['name']] = false;
1580 $respondentPoints -= $fieldPoints;
1581 }
1582 }
1583 }
1584 }
1585 } elseif ( $template == 'checkbox_field' || $template == 'multiple_select' ) {
1586 $answers[$field['name']] = true;
1587 $userAnswer = [];
1588
1589 foreach ($options as $key => $value) {
1590 foreach ($givenAnswer as $answer) {
1591 if ($value == $answer) {
1592 $userAnswer[] = $key;
1593 }
1594 }
1595 }
1596
1597 $userAnswer = implode('|', $userAnswer);
1598 $rightAnswers = implode('|', $selectedAnswers);
1599
1600 if ( $userAnswer != $rightAnswers || empty($userAnswer) ) {
1601 $answers[$field['name']] = false;
1602 $respondentPoints -= $fieldPoints;
1603 }
1604 }
1605 } elseif ( empty( $field['value'] ) ) {
1606 $has_empty = true;
1607 break;
1608 }
1609
1610 }
1611
1612 $response = array(
1613 'fields' => $fields_data,
1614 'meta_data' => $metadata,
1615 'payment_data' => $payment,
1616 'has_empty' => $has_empty,
1617 'respondent_points' => $respondentPoints,
1618 'answers' => $answers,
1619 );
1620
1621 $response = $this->prepare_response_for_collection( $response );
1622 $response = rest_ensure_response( $response );
1623 $response->header( 'Location', rest_url( sprintf( '/%s/%s/%d/%s/%d', $this->namespace, $this->rest_base, $form->id, 'entries', $entry->id ) ) );
1624 return $response;
1625 }
1626
1627 /**
1628 * Export forms to JSON
1629 *
1630 * @param WP_REST_Request $request
1631 *
1632 * @return json
1633 **/
1634 public function export_forms( $request ) {
1635 $export_type = isset( $request['type'] ) ? $request['type'] : 'selected';
1636 $selected = isset( $request['ids'] ) ? array_map( 'absint', $request['ids'] ) : array();
1637
1638 if ( ! class_exists( 'WeForms_Admin_Tools' ) ) {
1639 require_once WEFORMS_INCLUDES . '/admin/class-admin-tools.php';
1640 }
1641
1642 switch ( $export_type ) {
1643 case 'all':
1644 WeForms_Admin_Tools::export_to_json();
1645 break;
1646 case 'selected':
1647 WeForms_Admin_Tools::export_to_json( $selected );
1648 break;
1649 }
1650 }
1651
1652 }
1653