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

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

562 lines 18.0 KB
No matching file
Up and down to move Enter to open Esc to close
Raw Download Zip
1 <?php
2
3 /**
4 * The Form Class
5 *
6 * @since 1.1.0
7 */
8 class WeForms_Form {
9
10 /**
11 * The form id
12 *
13 * @var int
14 */
15 public $id = 0;
16
17 /**
18 * The form title
19 *
20 * @var string
21 */
22 public $name = '';
23
24 /**
25 * Holds the post data object
26 *
27 * @var WP_post|null
28 */
29 public $data = null;
30
31 /**
32 * Form fields
33 *
34 * @var array
35 */
36 public $form_fields = [];
37
38 /**
39 * The Constructor
40 *
41 * @param int|WP_Post $form
42 */
43 public function __construct( $form = null ) {
44 if ( is_numeric( $form ) ) {
45 $the_post = get_post( $form );
46
47 if ( $the_post ) {
48 $this->id = $the_post->ID;
49 $this->name = $the_post->post_title;
50 $this->data = $the_post;
51 }
52 } elseif ( is_a( $form, 'WP_Post' ) ) {
53 $this->id = $form->ID;
54 $this->name = $form->post_title;
55 $this->data = $form;
56 }
57 }
58
59 /**
60 * Get the form ID
61 *
62 * @return int
63 */
64 public function get_id() {
65 return $this->id;
66 }
67
68 /**
69 * Get the form name
70 *
71 * @return string
72 */
73 public function get_name() {
74 return $this->name;
75 }
76
77 /**
78 * Get all form fields of this form
79 *
80 * @return array
81 */
82 public function get_fields() {
83
84 // return if already fetched
85 if ( $this->form_fields ) {
86 return $this->form_fields;
87 }
88
89 $fields = get_children( [
90 'post_parent' => $this->id,
91 'post_status' => 'publish',
92 'post_type' => 'wpuf_input',
93 'numberposts' => '-1',
94 'orderby' => 'menu_order',
95 'order' => 'ASC',
96 ] );
97
98 $form_fields = [];
99
100 foreach ( $fields as $key => $content ) {
101 $field = maybe_unserialize( $content->post_content );
102
103 if ( empty( $field['template'] ) ) {
104 continue;
105 }
106
107 $field['id'] = $content->ID;
108
109 // Add inline property for radio and checkbox fields
110 $inline_supported_fields = apply_filters( 'inline_supported_fields_list', [ 'radio_field', 'checkbox_field' ] );
111
112 if ( in_array( $field['template'], $inline_supported_fields ) ) {
113 if ( !isset( $field['inline'] ) ) {
114 $field['inline'] = 'no';
115 }
116 }
117
118 // Add 'selected' property
119 $option_based_fields = apply_filters( 'option_based_fields_list', [ 'dropdown_field', 'multiple_select', 'radio_field', 'checkbox_field' ] );
120
121 if ( in_array( $field['template'], $option_based_fields ) ) {
122 if ( !isset( $field['selected'] ) ) {
123 if ( 'dropdown_field' === $field['template'] || 'radio_field' === $field['template'] ) {
124 $field['selected'] = '';
125 } else {
126 $field['selected'] = [];
127 }
128 }
129 }
130
131 // Add 'multiple' key for template:repeat
132 if ( 'repeat_field' === $field['template'] && !isset( $field['multiple'] ) ) {
133 $field['multiple'] = '';
134 }
135
136 if ( 'recaptcha' === $field['template'] ) {
137 $field['name'] = 'recaptcha';
138 $field['enable_no_captcha'] = isset( $field['enable_no_captcha'] ) ? $field['enable_no_captcha'] : '';
139 $field['recaptcha_theme'] = isset( $field['recaptcha_theme'] ) ? $field['recaptcha_theme'] : 'light';
140 }
141
142 $form_fields[] = apply_filters( 'weforms-get-form-field', $field );
143 }
144
145 $this->form_fields = apply_filters( 'weforms-get-form-fields', $form_fields );
146
147 return $this->form_fields;
148 }
149
150 /**
151 * Check if any perticular field template is used in a form
152 *
153 * @return array
154 */
155 public function has_field( $field_template ) {
156 foreach ( $this->get_fields() as $key => $field ) {
157 if ( isset( $field['template'] ) && $field['template'] == $field_template ) {
158 return true;
159 }
160 }
161 }
162
163 /**
164 * Get all fields by a template
165 *
166 * @return array
167 */
168 public function search_fields( $field_template ) {
169 $fields = [];
170
171 foreach ( $this->get_fields() as $key => $field ) {
172 if ( isset( $field['template'] ) && $field['template'] == $field_template ) {
173 $fields[] = $field;
174 }
175 }
176
177 return $fields;
178 }
179
180 /**
181 * Search fileds and get the first one
182 *
183 * @return array
184 */
185 public function search_field( $field_template ) {
186 $fields = $this->search_fields( $field_template );
187
188 return isset( $fields[0] ) ? $fields[0] : [];
189 }
190
191 /**
192 * Get formatted field name/values
193 *
194 * @return array
195 */
196 public function get_field_values() {
197 $values = [];
198 $fields = $this->get_fields();
199
200 if ( !$fields ) {
201 return $values;
202 }
203
204 $ignore_fields = apply_filters( 'ignore_fields_list', [ 'recaptcha', 'section_break' ] );
205 $options_fields = apply_filters( 'option_fields_list', [ 'dropdown_field', 'radio_field', 'multiple_select', 'checkbox_field' ] );
206
207 foreach ( $fields as $field ) {
208 if ( in_array( $field['template'], $ignore_fields ) ) {
209 continue;
210 }
211
212 // Prepare column field data
213 if ( $field['template'] == 'column_field' ) {
214 $inner_columns = $field['inner_fields'];
215
216 if ( !empty( $inner_columns ) ) {
217 foreach ( $inner_columns as $column => $column_fields ) {
218 if ( !empty( $column_fields ) ) {
219 foreach ( $column_fields as $field_obj ) {
220 if ( in_array( $field_obj['template'], $ignore_fields ) ) {
221 continue;
222 }
223
224 if ( !isset( $field_obj['name'] ) ) {
225 continue;
226 }
227
228 $field_value = [
229 'label' => isset( $field_obj['label'] ) ? $field_obj['label'] : '',
230 'type' => $field_obj['template'],
231 ];
232
233 // put options if this is an option field
234 if ( in_array( $field_obj['template'], $options_fields ) ) {
235 $field_value['options'] = $field_obj['options'];
236 }
237
238 $values[ $field_obj['name'] ] = array_merge( $field_obj, $field_value );
239 }
240 }
241 }
242 }
243 }
244
245 if ( !isset( $field['name'] ) ) {
246 continue;
247 }
248
249 $value = [
250 'label' => isset( $field['label'] ) ? $field['label'] : '',
251 'type' => $field['template'],
252 ];
253
254 // put options if this is an option field
255 if ( in_array( $field['template'], $options_fields ) ) {
256 $value['options'] = $field['options'];
257 }
258
259 $values[ $field['name'] ] = array_merge( $field, $value );
260 }
261
262 return apply_filters( 'weforms_get_field_values', $values );
263 }
264
265 /**
266 * Get form settings
267 *
268 * @return array
269 */
270 public function get_settings() {
271 $settings = get_post_meta( $this->id, 'wpuf_form_settings', true );
272 $default = weforms_get_default_form_settings();
273
274 return array_merge( $default, $settings );
275 }
276
277 /**
278 * Check if the form submission is open
279 *
280 * @return bool|WP_Error
281 */
282 public function is_submission_open() {
283 $settings = $this->get_settings();
284
285 $needs_login = ( isset( $settings['require_login'] ) && $settings['require_login'] == 'true' ) ? true : false;
286 $has_limit = ( isset( $settings['limit_entries'] ) && $settings['limit_entries'] == 'true' ) ? true : false;
287 $is_scheduled = ( isset( $settings['schedule_form'] ) && $settings['schedule_form'] == 'true' ) ? true : false;
288
289 if ( $this->data->post_status != 'publish' ) {
290 return new WP_Error( 'needs-publish', __( 'The form is not published yet.', 'weforms' ) );
291 }
292
293 if ( $needs_login && !is_user_logged_in() ) {
294 return new WP_Error( 'needs-login', $settings['req_login_message'] );
295 }
296
297 if ( $has_limit ) {
298 $limit = (int) $settings['limit_number'];
299 $form_entries = $this->num_form_entries();
300
301 if ( $limit <= $form_entries ) {
302 return new WP_Error( 'entry-limit', $settings['limit_message'] );
303 }
304 }
305
306 if ( $is_scheduled ) {
307 $start_time = strtotime( $settings['schedule_start'] );
308 $end_time = strtotime( $settings['schedule_end'] );
309 $current_time = current_time( 'timestamp' );
310
311 // too early?
312 if ( $current_time < $start_time ) {
313 return new WP_Error( 'form-pending', $settings['sc_pending_message'] );
314 } elseif ( $current_time > $end_time ) {
315 return new WP_Error( 'form-expired', $settings['sc_expired_message'] );
316 }
317 }
318
319 return apply_filters( 'weforms_is_submission_open', true, $settings, $this );
320 }
321
322 /**
323 * Get form notifications
324 *
325 * @return array
326 */
327 public function get_notifications() {
328 $notifications = get_post_meta( $this->id, 'notifications', true );
329 $defualt = weforms_get_default_form_notification();
330
331 if ( !$notifications ) {
332 $notifications = [];
333 }
334
335 $notifications = array_map( function ( $notification ) use ( $defualt ) {
336 if ( empty( $notification ) ) {
337 $notification = [];
338 }
339
340 return array_merge( $defualt, $notification );
341 }, $notifications );
342
343 return $notifications;
344 }
345
346 /**
347 * Get all the integrations
348 *
349 * @return array
350 */
351 public function get_integrations() {
352 $integrations = get_post_meta( $this->id, 'integrations', true );
353
354 if ( !$integrations ) {
355 return [];
356 }
357
358 return $integrations;
359 }
360
361 /**
362 * Get entries of this form
363 *
364 * @return \WeForms_Form_Entry_Manager
365 */
366 public function entries() {
367 return new WeForms_Form_Entry_Manager( $this->id, $this );
368 }
369
370 /**
371 * Get number of form entries
372 *
373 * @return int
374 */
375 public function num_form_entries() {
376 return weforms_count_form_entries( $this->id );
377 }
378
379 /**
380 * Get number of form payments
381 *
382 * @return int
383 */
384 public function num_form_payments() {
385 return weforms_count_form_payments( $this->id );
386 }
387
388 /**
389 * Get form author details
390 *
391 * @return array
392 */
393 public function get_form_author_details() {
394 return weforms_get_form_author_details( $this->id );
395 }
396
397 /**
398 * Get the number of form views
399 *
400 * @return int
401 */
402 public function num_form_views() {
403 return weforms_get_form_views( $this->id );
404 }
405
406 /**
407 * prepare_entries
408 *
409 * @return array
410 */
411 public function prepare_entries( $args = [] ) {
412 $fields = weforms()->fields->get_fields();
413 $form_fields = $this->get_fields();
414
415 $entry_fields = [];
416
417 $ignore_list = apply_filters( 'wefroms_entry_ignore_list', [
418 'recaptcha', 'section_break', 'step_start',
419 ] );
420
421 foreach ( $form_fields as $field ) {
422 if ( in_array( $field['template'], $ignore_list ) ) {
423 continue;
424 }
425
426 if ( !array_key_exists( $field['template'], $fields ) ) {
427 continue;
428 }
429
430 // Prepare column field data
431 if ( $field['template'] == 'column_field' ) {
432 $inner_columns = $field['inner_fields'];
433
434 if ( !empty( $inner_columns ) ) {
435 foreach ( $inner_columns as $column => $column_fields ) {
436 if ( !empty( $column_fields ) ) {
437 foreach ( $column_fields as $field_obj ) {
438 if ( in_array( $field_obj['template'], $ignore_list ) ) {
439 continue;
440 }
441
442 $fieldClass = $fields[ $field_obj['template'] ];
443 $entry_fields[ $field_obj['name'] ] = $fieldClass->prepare_entry( $field_obj );
444 }
445 }
446 }
447 }
448 }
449
450 $field_class = $fields[ $field['template'] ];
451
452 $entry_fields[ $field['name'] ] = $field_class->prepare_entry( $field, $args );
453 }
454
455 return apply_filters( 'weforms_prepare_entries', $entry_fields );
456 }
457
458 /**
459 * Check if the form submission is open On API
460 *
461 * @return bool|WP_Error
462 */
463 public function is_api_form_submission_open() {
464 $response = [];
465 $settings = $this->get_settings();
466 $form_entries = $this->num_form_entries();
467 $needs_login = isset( $settings['require_login'] ) ? $settings['require_login'] : 'false';
468 $limit_entries = isset( $settings['limit_entries'] ) ? $settings['limit_entries'] : 'false';
469 $schedule_form = isset( $settings['schedule_form'] ) ? $settings['schedule_form'] : 'false';
470 $limit_number = isset( $settings['limit_number'] ) ? $settings['limit_number'] : '';
471 $schedule_start = isset( $settings['schedule_start'] ) ? $settings['schedule_start'] : '';
472 $schedule_end = isset( $settings['schedule_end'] ) ? $settings['schedule_end'] : '';
473 $schedule_start_date = date_i18n( 'M d, Y', strtotime( $schedule_start ) );
474 $schedule_end_date = date_i18n( 'M d, Y', strtotime( $schedule_end ) );
475
476 if ( $this->data->post_status != 'publish' ) {
477 $response['type'] = __( 'Closed', 'weforms' );
478 }
479
480 if ( $this->isFormStatusClosed( $settings, $form_entries ) ) {
481 $response['type'] = __( 'Closed', 'weforms' );
482 } else {
483 $response['type'] = __( 'Open', 'weforms' );
484 }
485
486 if ( $limit_entries === 'true' ) {
487 if ( $schedule_form === 'true' && $this->isExpiredForm( $schedule_end ) ) {
488 $response['message'] = __( "Expired at {$schedule_end_date}", 'weforms' );
489 } elseif ( $schedule_form === 'true' && $this->isPendingForm( $schedule_start ) ) {
490 $response['message'] = __( "Starts at {$schedule_start_date}", 'weforms' );
491 } elseif ( $form_entries >= $limit_number ) {
492 $response['message'] = __( 'Reached maximum entry limit', 'weforms' );
493 } else {
494 $remaining_entries = $limit_number - $form_entries;
495 $response['message'] = __( "{$remaining_entries} entries remaining ", 'weforms' );
496 }
497 } elseif ( $schedule_form === 'true' ) {
498 if ( $this->isPendingForm( $schedule_start ) ) {
499 $response['message'] = __( "Starts at {$schedule_start_date}", 'weforms' );
500 } elseif ( $this->isExpiredForm( $schedule_end ) ) {
501 $response['message'] = __( "Expired at {$schedule_end_date}", 'weforms' );
502 } elseif ( $this->isOpenForm( $schedule_start, $schedule_end ) ) {
503 $response['message'] = __( "Expires at {$schedule_end_date}", 'weforms' );
504 }
505 } elseif ( $needs_login === 'true' ) {
506 $response['message'] =__( 'Requires login', 'weforms' );
507 }
508
509 return apply_filters( 'weforms_is_submission_open', $response, $settings, $this );
510 }
511
512 public function isPendingForm( $scheduleStart ) {
513 $currentTime = current_time( 'timestamp' );
514 $startTime = strtotime( $scheduleStart );
515
516 if ( $currentTime < $startTime ) {
517 return true;
518 }
519
520 return false;
521 }
522
523 public function isExpiredForm( $scheduleEnd ) {
524 $currentTime = current_time( 'timestamp' );
525 $endTime = strtotime( $scheduleEnd );
526
527 if ( $currentTime > $endTime ) {
528 return true;
529 }
530
531 return false;
532 }
533
534 public function isOpenForm( $scheduleStart, $scheduleEnd ) {
535 $currentTime = current_time( 'timestamp' );
536 $startTime = strtotime( $scheduleStart );
537 $endTime = strtotime( $scheduleEnd );
538
539 if ( $currentTime > $startTime && $currentTime < $endTime ) {
540 return true;
541 }
542
543 return false;
544 }
545
546 public function isFormStatusClosed( $formSettings, $entries ) {
547 if ( $formSettings['schedule_form'] === 'true' && $this->isPendingForm( $formSettings['schedule_start'] ) ) {
548 return true;
549 }
550
551 if ( $formSettings['schedule_form'] === 'true' && $this->isExpiredForm( $formSettings['schedule_end'] ) ) {
552 return true;
553 }
554
555 if ( $formSettings['limit_entries'] === 'true' && $entries >= $formSettings['limit_number'] ) {
556 return true;
557 }
558
559 return false;
560 }
561 }
562