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

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

665 lines 18.3 KB
No matching file
Up and down to move Enter to open Esc to close
Raw Download Zip
1 <?php
2
3 /**
4 * Email Notification Class
5 */
6 class WeForms_Notification {
7
8 private $merge_tags = array();
9 private $args = array();
10
11 /**
12 * Init the class
13 *
14 * @param array $args
15 */
16 public function __construct( $args = array() ) {
17 $defaults = array(
18 'form_id' => 0,
19 'entry_id' => 0,
20 'page_id' => 0
21 );
22
23 $this->args = wp_parse_args( $args, $defaults );
24 }
25
26 /**
27 * Send notifications
28 *
29 * @return void
30 */
31 public function send_notifications() {
32 $notifications = $this->get_active_notifications();
33
34 if ( !$notifications ) {
35 return;
36 }
37
38 $this->set_merge_tags();
39
40 foreach ($notifications as $notification) {
41
42 if ( $this->meet_conditions( $notification ) ) {
43
44 if ( $notification['type'] == 'email' ) {
45
46 $this->send_notification( $notification );
47
48 } elseif( $notification['type'] == 'sms' ) {
49
50 $this->send_sms( $notification );
51 }
52 }
53 }
54 }
55
56 /**
57 * Send a single notification
58 *
59 * @param array $notification
60 *
61 * @return void
62 */
63 public function send_notification( $notification ) {
64 $headers = array();
65
66 $to = $this->replace_tags( $notification['to'] );
67
68 $subject = $this->replace_tags( $notification['subject'] );
69 $subject = static::replace_name_tag( $subject, $this->args['entry_id'] );
70
71 $message = $this->replace_tags( $notification['message'] );
72 $message = static::replace_name_tag( $message, $this->args['entry_id'] );
73 $message = $this->replace_all_fields( $message );
74 $message = wpautop( $message );
75
76 $fromName = $this->replace_tags( $notification['fromName'] );
77 $fromName = static::replace_name_tag( $fromName, $this->args['entry_id'] );
78 $fromAddress = $this->replace_tags( $notification['fromAddress'] );
79 $replyTo = $this->replace_tags( $notification['replyTo'] );
80 $cc = $this->replace_tags( $notification['cc'] );
81 $bcc = $this->replace_tags( $notification['bcc'] );
82
83 if ( $fromName || $fromAddress ) {
84 $headers['from'] = array(
85 'email' => $fromAddress,
86 'name' => $fromName
87 );
88 }
89
90 if ( $cc ) {
91 $headers['cc'] = $cc;
92 }
93
94 if ( $bcc ) {
95 $headers['bcc'] = $bcc;
96 }
97
98 if ( $replyTo ) {
99 $headers['replyto'] = $replyTo;
100 }
101
102 // content type to text/html
103 $headers[] = 'Content-Type: text/html; charset=UTF-8';
104 $email_body = apply_filters( 'weforms_email_message', $this->get_formatted_body( $message ), $notification['message'], $headers );
105
106 weforms()->emailer->send( $to, $subject, $email_body, $headers );
107 }
108
109
110 /**
111 * Send a single sms notification
112 *
113 * @param array $notification
114 *
115 * @return void
116 */
117 public function send_sms( $notification ) {
118
119 if ( ! class_exists('WeForms_SMS_Notification') ) {
120 return;
121 }
122
123 $to = $this->replace_tags( $notification['smsTo'] );
124 $message = $this->replace_tags( $notification['smsText'] );
125 $message = static::replace_name_tag( $message, $this->args['entry_id'] );
126 $message = $this->replace_all_fields( $message );
127
128 $email_body = apply_filters( 'weforms_sms_message', $this->get_formatted_sms_body( $message ) );
129
130 weforms_sms()->send_sms( array( $to ), $message );
131 }
132
133 /**
134 * Check conditional logics
135 *
136 * @param array $notification
137 *
138 * @return boolean
139 */
140 public function meet_conditions( $notification ) {
141
142 $form = weforms()->form->get( $this->args['form_id'] );
143 $entry = $form->entries()->get( $this->args['entry_id'] );
144 $fields = $entry->get_fields();
145
146 $cond = !empty( $notification['weforms_cond'] ) ? $notification['weforms_cond'] : array();
147
148 if ( isset($cond['condition_status']) && 'yes' === $cond['condition_status'] ) {
149
150 $cond_logic = !empty( $cond['cond_logic'] ) ? $cond['cond_logic'] : 'any';
151
152 if ( !empty( $cond['conditions'] ) && is_array( $cond['conditions'] )) {
153
154 $status = array(); // going to store all condition result as boolean
155
156 foreach ( $cond['conditions'] as $k => $condition ) {
157
158 $field = $fields[$condition['name']];
159 $value = $field['value'];
160 $options = $field['options'];
161 $operator = $condition['operator'] == '=' ? true : false;
162
163 // probably from checkbox
164 if( is_array( $value ) ) {
165
166 // search by value
167 if ( in_array( $condition['option'], $value ) ) {
168
169 $status[$k] = $operator ? true : false;
170
171 } else {
172
173 // search by key
174 foreach ( $value as $single_value ) {
175
176 if( $condition['option'] == array_search( $single_value , $options ) ) {
177
178 $status[$k] = $operator ? true : false;
179
180 break;
181 }
182 }
183 }
184
185 if ( ! isset( $status[$k] ) ) {
186
187 $status[$k] = $operator ? false : true;
188 }
189
190 } else {
191
192 if ( $condition['option'] == $value || $condition['option'] == array_search( $value , $options ) ) {
193
194 $status[$k] = $operator ? true : false;
195
196 } else {
197
198 $status[$k] = $operator ? false : true;
199 }
200 }
201 }
202
203 if ( $cond_logic == 'any' ) {
204
205 return in_array( true, $status) ? true : false; // any true? then true
206
207
208 } elseif ( $cond_logic == 'all' ) {
209
210 return in_array( false, $status) ? false : true; // any false? then false
211
212 }
213
214 }
215
216 }
217
218 return true;
219 }
220
221 /**
222 * Get active notifications of a form
223 *
224 * @param int $form_id
225 *
226 * @return array|boolean
227 */
228 public function get_active_notifications() {
229 $notifications = weforms()->form->get( $this->args['form_id'] )->get_notifications();
230
231 if ( $notifications ) {
232 $notifications = array_filter( $notifications, function($notification) {
233 return $notification['active'] == true;
234 } );
235
236 return $notifications;
237 }
238
239 return false;
240 }
241
242 /**
243 * Get formatted HTML email
244 *
245 * @param string $message
246 *
247 * @return string
248 */
249 public function get_formatted_body( $message ) {
250 $css = '';
251 $header = apply_filters( 'weforms_email_header', '' );
252 $footer = apply_filters( 'weforms_email_footer', '' );
253
254 if ( empty( $header ) ) {
255 ob_start();
256 include WEFORMS_INCLUDES . '/email/template/header.php';
257 $header = ob_get_clean();
258 }
259
260 if ( empty( $footer ) ) {
261 ob_start();
262 include WEFORMS_INCLUDES . '/email/template/footer.php';
263 $footer = ob_get_clean();
264 }
265
266 ob_start();
267 include WEFORMS_INCLUDES . '/email/template/styles.php';
268 $css = apply_filters( 'weforms_email_styles', ob_get_clean() );
269
270 $content = $header . $message . $footer;
271
272 if ( ! class_exists( 'Emogrifier' ) ) {
273 require_once WEFORMS_INCLUDES . '/library/Emogrifier.php';
274 }
275
276 try {
277
278 // apply CSS styles inline for picky email clients
279 $emogrifier = new Emogrifier( $content, $css );
280 $content = $emogrifier->emogrify();
281
282 } catch ( Exception $e ) {
283
284 echo $e->getMessage();
285 }
286
287 return $content;
288 }
289
290 /**
291 * Get formatted HTML email
292 *
293 * @param string $message
294 *
295 * @return string
296 */
297 public function get_formatted_sms_body( $message ) {
298 $message = strip_tags( $message );
299
300 if ( strlen( $message ) > apply_filters( 'wefroms_sms_char_length', 153 ) ) {
301 $message = substr( $message, 0, apply_filters( 'wefroms_sms_char_length', 153 ) );
302 $message .= __('..', 'weforms');
303 }
304
305 return $message;
306 }
307
308 /**
309 * Populate an key/value pair of search/replace array
310 *
311 * @return array
312 */
313 public function set_merge_tags() {
314
315 // return early we had a previous array call
316 if ( $this->merge_tags ) {
317 return $this->merge_tags;
318 }
319
320 // populate the key/value array for the first time
321 $tags = weforms_get_merge_tags();
322 $replace_array = array();
323
324 foreach ($tags as $section => $child) {
325
326 if ( !$child['tags'] ) {
327 continue;
328 }
329
330 foreach ($child['tags'] as $search_key => $label) {
331 $replace_array[ '{' . $search_key . '}' ] = $this->get_merge_value( $search_key );
332 }
333 }
334
335 $this->merge_tags = $replace_array;
336 }
337
338 /**
339 * Get a merge tag value based on a tag
340 *
341 * @param string $tag
342 *
343 * @return string
344 */
345 public function get_merge_value( $tag ) {
346
347 switch ( $tag ) {
348 case 'entry_id':
349 return $this->args['entry_id'];
350 break;
351
352 case 'form_id':
353 return $this->args['form_id'];
354 break;
355
356 case 'form_name':
357 return get_post_field( 'post_title', $this->args['form_id'] );
358 break;
359
360 case 'admin_email':
361 return get_option( 'admin_email' );
362 break;
363
364 case 'date':
365 return date_i18n( get_option( 'date_format' ) . ' ' . get_option( 'time_format' ) );
366 break;
367
368 case 'site_name':
369 return get_bloginfo( 'name' );
370 break;
371
372 case 'site_url':
373 return site_url( '/' );
374 break;
375
376 case 'page_title':
377 return get_post_field( 'post_title', $this->args['page_id'] );
378 break;
379
380 case 'ip_address':
381 return weforms_get_client_ip();
382 break;
383
384 case 'user_id':
385 return get_current_user_id();
386 break;
387
388 case 'first_name':
389 return $this->get_user_prop( 'first_name' );
390 break;
391
392 case 'last_name':
393 return $this->get_user_prop( 'last_name' );
394 break;
395
396 case 'display_name':
397 return $this->get_user_prop( 'display_name' );
398 break;
399
400 case 'user_email':
401 return $this->get_user_prop( 'user_email' );
402 break;
403
404 case 'url_page':
405 return get_permalink( $this->args['page_id'] );
406 break;
407
408 case 'url_referer':
409 return isset( $_SERVER['HTTP_REFERER'] ) ? $_SERVER['HTTP_REFERER'] : '';
410 break;
411
412 case 'url_login':
413 return wp_login_url();
414 break;
415
416 case 'url_logout':
417 return wp_logout_url();
418 break;
419
420 case 'url_register':
421 return wp_registration_url();
422 break;
423
424 case 'url_lost_password':
425 return wp_lostpassword_url();
426 break;
427
428 default:
429 return apply_filters( 'weforms_merge_tag_value', '', $tag, $this->args );
430 break;
431 }
432 }
433
434 /**
435 * Parse out the custom fields with entry meta values
436 *
437 * @param string $text
438 *
439 * @return string
440 */
441 public static function replace_field_tags( $text, $entry_id ) {
442 $pattern = '/{field:(\w*)}/';
443
444 preg_match_all( $pattern, $text, $matches );
445
446 // bail out if nothing found to be replaced
447 if ( !$matches ) {
448 return $text;
449 }
450
451 foreach ($matches[1] as $index => $meta_key) {
452 $meta_value = weforms_get_entry_meta( $entry_id, $meta_key, true );
453
454 if ( is_array( $meta_value ) ) {
455 $meta_value = implode(WeForms::$field_separator, $meta_value);
456 }
457
458 $text = str_replace( $matches[0][$index], $meta_value, $text );
459 }
460
461 return $text;
462 }
463
464 /**
465 * Replace name tag with required value
466 *
467 * @param string $text
468 *
469 * @return string
470 */
471 public static function replace_name_tag( $text, $entry_id ) {
472 $pattern = '/{name-(full|first|middle|last):(\w*)}/';
473
474 preg_match_all( $pattern, $text, $matches );
475
476 // bail out if nothing found to be replaced
477 if ( !$matches[0] ) {
478 return $text;
479 }
480
481 list( $search, $fields, $meta_key ) = $matches;
482
483 $meta_value = weforms_get_entry_meta( $entry_id, $meta_key[0], true );
484 $replace = explode( WeForms::$field_separator, $meta_value );
485
486 foreach ($search as $index => $search_key) {
487
488 if ( 'first' == $fields[ $index ] ) {
489
490 $text = str_replace( $search_key, $replace[0], $text );
491
492 } elseif ( 'middle' == $fields[ $index ] ) {
493
494 $text = str_replace( $search_key, $replace[1], $text );
495
496 } elseif ( 'last' == $fields[ $index ] ) {
497
498 $text = str_replace( $search_key, $replace[2], $text );
499
500 } else {
501
502 $text = str_replace( $search_key, implode(' ', $replace ), $text );
503 }
504
505 }
506
507 return $text;
508 }
509
510
511 /**
512 * Replace image/file tag with Image URL
513 *
514 * @param string $text
515 *
516 * @return string
517 */
518 public static function replace_file_tags( $text, $entry_id ) {
519 $pattern = '/{(?:image|file):(\w*)}/';
520
521 preg_match_all( $pattern, $text, $matches );
522
523 // bail out if nothing found to be replaced
524 if ( !$matches ) {
525 return $text;
526 }
527
528 foreach ($matches[1] as $index => $meta_key) {
529
530 $meta_value = weforms_get_entry_meta( $entry_id, $meta_key, true );
531
532 $files = array();
533
534 if ( is_array( $meta_value ) ) {
535
536 foreach ( $meta_value as $key => $attachment_id ) {
537
538 $file_url = wp_get_attachment_url( $attachment_id );
539
540 if ( $file_url ) {
541 $files[] = $file_url;
542 }
543 }
544
545 } else {
546
547 $file_url = wp_get_attachment_url( $attachment_id );
548
549 if ( $file_url ) {
550
551 $files[] = $file_url;
552 }
553 }
554
555 $files = implode(" ", $files);
556
557 $text = str_replace( $matches[0][$index], $files, $text );
558 }
559
560 return $text;
561 }
562
563 /**
564 * Get property of a user object with failsafe check
565 *
566 * @param string $property
567 *
568 * @return string
569 */
570 public function get_user_prop( $property ) {
571 $user = wp_get_current_user();
572
573 if ( $user->ID != 0 ) {
574 return $user->{$property};
575 }
576
577 return '';
578 }
579
580 /**
581 * Replace text with merge tags
582 *
583 * @param string $text
584 *
585 * @return text
586 */
587 public function replace_tags( $text = '' ) {
588 $merge_keys = array_keys( $this->merge_tags );
589 $merge_values = array_values( $this->merge_tags );
590
591 $text = str_replace( $merge_keys, $merge_values, $text );
592 $text = static::replace_field_tags( $text, $this->args['entry_id'] );
593 $text = static::replace_file_tags( $text, $this->args['entry_id'] );
594
595 return $text;
596 }
597
598 /**
599 * Replace {all_fields} if found
600 *
601 * @param string $text
602 *
603 * @return string
604 */
605 public function replace_all_fields( $text = '' ) {
606
607 // check if {all_fields} exists
608 if ( false === strpos( $text, '{all_fields}' ) ) {
609 return $text;
610 }
611
612 $form = weforms()->form->get( $this->args['form_id'] );
613 $entry = $form->entries()->get( $this->args['entry_id'] );
614 $fields = $entry->get_fields();
615
616 if ( !$fields ) {
617 return $text;
618 }
619
620 $table = '<table width="600" cellpadding="0" cellspacing="0">';
621 $table .= '<tbody>';
622
623 foreach ($fields as $key => $value) {
624
625 $field_value = isset( $value[ 'value' ] ) ? $value[ 'value' ] : '';
626
627 if ( ! $field_value ) {
628 continue; // let's skip empty fields
629 }
630
631 $table .= '<tr class="field-label">';
632 $table .= '<th><strong>' . $value['label'] . '</strong></th>';
633 $table .= '</tr>';
634 $table .= '<tr class="field-value">';
635 $table .= '<td>';
636
637 if ( in_array( $value['type'], array( 'multiple_select', 'checkbox_field' ) ) ) {
638 $field_value = is_array( $field_value ) ? $field_value : array();
639
640 if ( $field_value ) {
641 $table .= '<ul>';
642 foreach ($field_value as $value_key) {
643 $table .= '<li>' . $value_key . '</li>';
644 }
645 $table .= '</ul>';
646 } else {
647 $table .= '&mdash;';
648 }
649 } else {
650 $table .= $field_value;
651 }
652
653 $table .= '</td>';
654 $table .= '</tr>';
655 }
656
657 $table .= '</tbody>';
658 $table .= '</table>';
659
660 $text = str_replace( '{all_fields}', $table, $text );
661
662 return $text;
663 }
664 }
665