Test Failed
Push — issue/3517 ( e06bae )
by Ravinder
83:52 queued 77:58
created

Give_Email_Notification::send_preview_email()   B

Complexity

Conditions 5
Paths 16

Size

Total Lines 39

Duplication

Lines 10
Ratio 25.64 %

Importance

Changes 0
Metric Value
cc 5
nc 16
nop 1
dl 10
loc 39
rs 8.9848
c 0
b 0
f 0
1
<?php
2
/**
3
 * Email Notification
4
 *
5
 * This class handles all email notification settings.
6
 *
7
 * @package     Give
8
 * @subpackage  Classes/Emails
9
 * @copyright   Copyright (c) 2016, WordImpress
10
 * @license     https://opensource.org/licenses/gpl-license GNU Public License
11
 * @since       2.0
12
 */
13
14
// Exit if access directly.
15
if ( ! defined( 'ABSPATH' ) ) {
16
	exit;
17
}
18
19
if ( ! class_exists( 'Give_Email_Notification' ) ) :
20
21
	/**
22
	 * Give_Email_Notification
23
	 *
24
	 * @abstract
25
	 * @since       2.0
26
	 */
27
	abstract class Give_Email_Notification {
28
		/**
29
		 * Array of instances
30
		 *
31
		 * @since  2.0
32
		 * @access private
33
		 * @var array
34
		 */
35
		private static $singleton = array();
36
37
		/**
38
		 * Array of notification settings.
39
		 *
40
		 * @since  2.0
41
		 * @access public
42
		 * @var array
43
		 */
44
		public $config = array(
45
			'id'                           => '',
46
			'label'                        => '',
47
			'description'                  => '',
48
			'has_recipient_field'          => false,
49
			'recipient_group_name'         => '',
50
			'notification_status'          => 'disabled',
51
			'notification_status_editable' => true,
52
			'notices'                      => array(),
53
			'content_type_editable'        => true,
54
			'has_preview'                  => true,
55
			'has_preview_header'           => true,
56
			'preview_email_tags_values'    => array(),
57
			'email_tag_context'            => 'all',
58
			'form_metabox_setting'         => true,
59
			'content_type'                 => '',
60
			'email_template'               => '',
61
			'default_email_subject'        => '',
62
			'default_email_message'        => '',
63
			'default_email_header'         => '',
64
			// This setting page will appear under core setting.
65
			'show_on_emails_setting_page'  => true,
66
			'form_metabox_id'              => 'give_email_notification_options_metabox_fields',
67
		);
68
69
		/**
70
		 * @var     string $recipient_email Donor email.
71
		 * @access  protected
72
		 * @since   2.0
73
		 */
74
		protected $recipient_email = '';
75
76
77
		/**
78
		 * Setup email notification.
79
		 *
80
		 * @since 2.0
81
		 */
82
		public function init() {
83
84
		}
85
86
87
		/**
88
		 * Get instance.
89
		 *
90
		 * @since  2.0
91
		 * @access public
92
		 *
93
		 * @param string $email_notification_id
94
		 *
95
		 * @return Give_Email_Notification
96
		 */
97
		public static function get_instance( $email_notification_id = '' ) {
98
			$class = '';
99
100
			if ( ! empty( $email_notification_id ) ) {
101
				/* @var Give_Email_Notification $class */
102
				foreach ( self::$singleton as $class ) {
103
					if ( $email_notification_id === $class->config['id'] ) {
104
						$class = get_class( $class );
105
						break;
106
					}
107
				}
108
			} else {
109
				$class = get_called_class();
110
			}
111
112
			if ( ! empty( $class ) && ( ! array_key_exists( $class, self::$singleton ) || is_null( self::$singleton[ $class ] ) ) ) {
113
				self::$singleton[ $class ] = new $class();
114
			}
115
116
			return ( isset( self::$singleton[ $class ] ) ? self::$singleton[ $class ] : null );
117
		}
118
119
		/**
120
		 * Setup action and filters.
121
		 *
122
		 * @access  public
123
		 * @since   2.0
124
		 *
125
		 * @param array $config
126
		 */
127
		public function load( $config ) {
128
			// Set notification configuration.
129
			$this->config = wp_parse_args( $config, $this->config );
130
131
			// Set email preview header status.
132
			$this->config['has_preview_header'] = $this->config['has_preview'] && $this->config['has_preview_header'] ? true : false;
133
134
			// Set email content type
135
			$this->config['content_type'] = empty( $this->config['content_type'] ) || ! in_array( $this->config['content_type'], array(
136
				'text/html',
137
				'text/plain',
138
			) )
139
				? Give()->emails->get_content_type()
140
				: $this->config['content_type'];
141
			$this->config['content_type'] = give_get_option( Give_Email_Setting_Field::get_prefix( $this ) . 'email_content_type', $this->config['content_type'] );
142
143
			// Set email template type.
144
			$this->config['email_template'] = empty( $this->config['email_template'] )
145
				? give_get_option( 'email_template' )
146
				: $this->config['email_template'];
147
148
			// Set recipient group name.
149
			$this->config['recipient_group_name'] = empty( $this->config['recipient_group_name'] )
150
				? ( ! Give_Email_Notification_Util::has_recipient_field( $this ) ? __( 'Donor', 'give' ) : '' )
151
				: $this->config['recipient_group_name'];
152
153
			// Non notification status editable notice.
154
			$this->config['notices']['non-notification-status-editable'] = empty( $this->config['notices']['non-notification-status-editable'] )
155
				? __( 'You can not edit notification status from here.', 'give' )
156
				: $this->config['notices']['non-notification-status-editable'];
157
158
			/**
159
			 *  Filter the notification config.
160
			 *
161
			 * @since 2.0
162
			 *
163
			 * @param                         array                   Give_Email_Notification::config
164
			 * @param Give_Email_Notification $this
165
			 */
166
			$this->config = apply_filters( 'give_email_api_notification_config', $this->config, $this );
167
168
			// Setup filters.
169
			$this->setup_filters();
170
		}
171
172
173
		/**
174
		 * Setup filters.
175
		 *
176
		 * @since  2.0
177
		 * @access public
178
		 */
179
		private function setup_filters() {
180
			// Apply filter only for current email notification section.
181
			if ( give_get_current_setting_section() === $this->config['id'] ) {
182
				// Initialize email context for email notification.
183
				$this->config['email_tag_context'] = apply_filters(
184
					"give_{$this->config['id']}_email_tag_context",
185
					$this->config['email_tag_context'],
186
					$this
187
				);
188
			}
189
190
			// Setup setting fields.
191
			if( $this->config['show_on_emails_setting_page'] ) {
0 ignored issues
show
introduced by
Space after opening control structure is required
Loading history...
introduced by
No space before opening parenthesis is prohibited
Loading history...
192
				add_filter( 'give_get_settings_emails', array( $this, 'add_setting_fields' ), 10, 2 );
193
			}
194
195
			if ( $this->config['form_metabox_setting'] && ! empty( $this->config['form_metabox_id'] ) ) {
196
				add_filter(
197
					$this->config['form_metabox_id'],
198
					array( $this, 'add_metabox_setting_field' ),
199
					10,
200
					2
201
				);
202
			}
203
204
			if( $this->config['has_recipient_field'] ) {
0 ignored issues
show
introduced by
Space after opening control structure is required
Loading history...
introduced by
No space before opening parenthesis is prohibited
Loading history...
205
				add_action(
206
						"give_save__give_{$this->config['id']}_recipient",
0 ignored issues
show
Coding Style introduced by
This line of the multi-line function call does not seem to be indented correctly. Expected 20 spaces, but found 24.
Loading history...
207
						array( $this, 'validate_form_recipient_field_value' ),
0 ignored issues
show
Coding Style introduced by
This line of the multi-line function call does not seem to be indented correctly. Expected 20 spaces, but found 24.
Loading history...
208
						10,
0 ignored issues
show
Coding Style introduced by
This line of the multi-line function call does not seem to be indented correctly. Expected 20 spaces, but found 24.
Loading history...
209
						3
0 ignored issues
show
Coding Style introduced by
This line of the multi-line function call does not seem to be indented correctly. Expected 20 spaces, but found 24.
Loading history...
210
				);
211
			}
212
213
			/**
214
			 * Filter the default email subject.
215
			 *
216
			 * @since 2.0
217
			 */
218
			$this->config['default_email_subject'] = apply_filters(
219
				"give_{$this->config['id']}_get_default_email_subject",
220
				$this->config['default_email_subject'],
221
				$this
222
			);
223
224
			/**
225
			 * Filter the default email message.
226
			 *
227
			 * @since 2.0
228
			 */
229
			$this->config['default_email_message'] = apply_filters(
230
				"give_{$this->config['id']}_get_default_email_message",
231
				$this->config['default_email_message'],
232
				$this
233
			);
234
235
			/**
236
			 * Filter the default email header.
237
			 *
238
			 * @since 2.1.3
239
			 */
240
			$this->config['default_email_header'] = apply_filters(
241
				"give_{$this->config['id']}_get_default_email_header",
242
				$this->config['default_email_header'],
243
				$this
244
			);
245
		}
246
247
		/**
248
		 * Add sections.
249
		 *
250
		 * @since 2.0
251
		 *
252
		 * @param array $sections
253
		 *
254
		 * @return array
255
		 */
256
		public function add_section( $sections ) {
257
			$sections[ $this->config['id'] ] = $this->config['label'];
258
259
			return $sections;
260
		}
261
262
		/**
263
		 * Add sections.
264
		 *
265
		 * @since 2.0
266
		 *
267
		 * @param bool $hide_section
268
		 *
269
		 * @return bool
270
		 */
271
		public function hide_section( $hide_section ) {
0 ignored issues
show
Unused Code introduced by
The parameter $hide_section is not used and could be removed.

This check looks from parameters that have been defined for a function or method, but which are not used in the method body.

Loading history...
272
			$hide_section = true;
273
274
			return $hide_section;
275
		}
276
277
		/**
278
		 * Register email settings.
279
		 *
280
		 * @since  2.0
281
		 * @access public
282
		 *
283
		 * @param   array $settings
284
		 *
285
		 * @return  array
286
		 */
287
		public function add_setting_fields( $settings ) {
288
			if ( $this->config['id'] === give_get_current_setting_section() ) {
289
				$settings = $this->get_setting_fields();
290
			}
291
292
			return $settings;
293
		}
294
295
296
		/**
297
		 * Get setting fields
298
		 *
299
		 * @since  2.0
300
		 * @access public
301
		 *
302
		 * @param int $form_id
303
		 *
304
		 * @return array
305
		 */
306
		public function get_setting_fields( $form_id = null ) {
307
			return Give_Email_Setting_Field::get_setting_fields( $this, $form_id );
308
		}
309
310
311
		/**
312
		 * Register email settings to form metabox.
313
		 *
314
		 * @since  2.0
315
		 * @access public
316
		 *
317
		 * @param array $settings
318
		 * @param int   $form_id
319
		 *
320
		 * @return array
321
		 */
322
		public function add_metabox_setting_field( $settings, $form_id ) {
323
324
			if( Give_Email_Notification_Util::is_email_notification_active( $this ) ) {
0 ignored issues
show
introduced by
Space after opening control structure is required
Loading history...
introduced by
No space before opening parenthesis is prohibited
Loading history...
325
				$settings[] = array(
326
					'id'     => $this->config['id'],
327
					'title'  => $this->config['label'],
328
					'fields' => $this->get_setting_fields( $form_id ),
329
				);
330
			}
331
332
			return $settings;
333
		}
334
335
336
		/**
337
		 * Get extra setting field.
338
		 *
339
		 * @since  2.0
340
		 * @access public
341
		 *
342
		 * @param int $form_id
343
		 *
344
		 * @return array
345
		 */
346
		public function get_extra_setting_fields( $form_id = null ) {
0 ignored issues
show
Unused Code introduced by
The parameter $form_id is not used and could be removed.

This check looks from parameters that have been defined for a function or method, but which are not used in the method body.

Loading history...
347
			return array();
348
		}
349
350
351
		/**
352
		 * Get recipient(s).
353
		 *
354
		 * Note: in case of admin notification this fx will return array of emails otherwise empty string or email of donor.
355
		 *
356
		 * @since  2.0
357
		 * @access public
358
		 *
359
		 * @param int $form_id
360
		 *
361
		 * @return string|array
362
		 */
363
		public function get_recipient( $form_id = null ) {
364
			if ( empty( $this->recipient_email ) && $this->config['has_recipient_field'] ) {
365
				$this->recipient_email = Give_Email_Notification_Util::get_value(
366
						$this,
0 ignored issues
show
Coding Style introduced by
This line of the multi-line function call does not seem to be indented correctly. Expected 20 spaces, but found 24.
Loading history...
367
						Give_Email_Setting_Field::get_prefix( $this, $form_id ) . 'recipient',
0 ignored issues
show
Coding Style introduced by
This line of the multi-line function call does not seem to be indented correctly. Expected 20 spaces, but found 24.
Loading history...
368
						$form_id
0 ignored issues
show
Coding Style introduced by
This line of the multi-line function call does not seem to be indented correctly. Expected 20 spaces, but found 24.
Loading history...
369
				);
370
0 ignored issues
show
Coding Style introduced by
Functions must not contain multiple empty lines in a row; found 2 empty lines
Loading history...
371
372
				/**
373
				 * Filter the admin notice emails.
374
				 *
375
				 * @since 1.0
376
				 * @deprecated 2.0
377
				 */
378
				$this->recipient_email = apply_filters( 'give_admin_notice_emails', $this->recipient_email, $this, $form_id );
379
			}
380
381
			/**
382
			 * Filter the recipients
383
			 *
384
			 * @since 2.0
385
			 */
386
			return apply_filters(
387
				"give_{$this->config['id']}_get_recipients",
388
				give_check_variable(
389
					$this->recipient_email,
390
					'empty',
391
					Give()->emails->get_from_address()
392
				),
393
				$this,
394
				$form_id
395
			);
396
		}
397
398
		/**
399
		 * Get notification status.
400
		 *
401
		 * @since  2.0
402
		 * @access public
403
		 *
404
		 * @param int $form_id
405
		 *
406
		 * @return bool
407
		 */
408
		public function get_notification_status( $form_id = null ) {
409
			$notification_status = empty( $form_id )
410
				? give_get_option( "{$this->config['id']}_notification", $this->config['notification_status'] )
411
				: give_get_meta( $form_id, Give_Email_Setting_Field::get_prefix( $this, $form_id ) . 'notification', true, 'global' );
0 ignored issues
show
Documentation introduced by
'global' is of type string, but the function expects a boolean.

It seems like the type of the argument is not accepted by the function/method which you are calling.

In some cases, in particular if PHP’s automatic type-juggling kicks in this might be fine. In other cases, however this might be a bug.

We suggest to add an explicit type cast like in the following example:

function acceptsInteger($int) { }

$x = '123'; // string "123"

// Instead of
acceptsInteger($x);

// we recommend to use
acceptsInteger((integer) $x);
Loading history...
412
413
			/**
414
			 * Filter the notification status.
415
			 *
416
			 * @since 1.8
417
			 */
418
			return apply_filters(
419
				"give_{$this->config['id']}_get_notification_status",
420
				$notification_status,
421
				$this,
422
				$form_id
423
			);
424
		}
425
426
		/**
427
		 * Get email subject.
428
		 *
429
		 * @since  2.0
430
		 * @access public
431
		 *
432
		 * @param int $form_id
433
		 *
434
		 * @return string
435
		 */
436 View Code Duplication
		function get_email_subject( $form_id = null ) {
0 ignored issues
show
Best Practice introduced by
It is generally recommended to explicitly declare the visibility for methods.

Adding explicit visibility (private, protected, or public) is generally recommend to communicate to other developers how, and from where this method is intended to be used.

Loading history...
Duplication introduced by
This method seems to be duplicated in your project.

Duplicated code is one of the most pungent code smells. If you need to duplicate the same code in three or more different places, we strongly encourage you to look into extracting the code into a single class or operation.

You can also find more detailed suggestions in the “Code” section of your repository.

Loading history...
437
			$subject = wp_strip_all_tags(
438
				Give_Email_Notification_Util::get_value(
439
					$this,
440
					Give_Email_Setting_Field::get_prefix( $this, $form_id ) . 'email_subject',
441
					$form_id,
442
					$this->config['default_email_subject']
443
				)
444
			);
445
446
			/**
447
			 * Filter the subject.
448
			 *
449
			 * @since 2.0
450
			 */
451
			return apply_filters(
452
				"give_{$this->config['id']}_get_email_subject",
453
				$subject,
454
				$this,
455
				$form_id
456
			);
457
		}
458
459
		/**
460
		 * Get email message.
461
		 *
462
		 * @since  2.0
463
		 * @access public
464
		 *
465
		 * @param int $form_id
466
		 *
467
		 * @return string
468
		 */
469
		public function get_email_message( $form_id = null ) {
470
			$message = Give_Email_Notification_Util::get_value(
471
				$this,
472
				Give_Email_Setting_Field::get_prefix( $this, $form_id ) . 'email_message',
473
				$form_id,
474
				$this->config['default_email_message']
475
			);
476
477
			/**
478
			 * Filter the message.
479
			 *
480
			 * @since 2.0
481
			 */
482
			return apply_filters(
483
				"give_{$this->config['id']}_get_email_message",
484
				$message,
485
				$this,
486
				$form_id
487
			);
488
		}
489
490
		/**
491
		 * Get email header.
492
		 *
493
		 * @param int $form_id The Form ID.
494
		 *
495
		 * @since  2.1.3
496
		 *
497
		 * @return string
498
		 */
499
		public function get_email_header( $form_id = null ) {
500
			$header = Give_Email_Notification_Util::get_value(
501
				$this,
502
				Give_Email_Setting_Field::get_prefix( $this, $form_id ) . 'email_header',
503
				$form_id,
504
				$this->config['default_email_header']
505
			);
506
507
			/**
508
			 * Filter the header.
509
			 *
510
			 * @since 2.1.3
511
			 */
512
			return apply_filters(
513
				"give_{$this->config['id']}_get_email_header",
514
				$header,
515
				$this,
516
				$form_id
517
			);
518
		}
519
520
		/**
521
		 * Get email content type.
522
		 *
523
		 * @since  2.0
524
		 * @access public
525
		 *
526
		 * @param $form_id
527
		 *
528
		 * @return string
529
		 */
530
		public function get_email_content_type( $form_id ) {
531
			$content_type = Give_Email_Notification_Util::get_value(
532
				$this,
533
				Give_Email_Setting_Field::get_prefix( $this, $form_id ) . 'email_content_type',
534
				$form_id,
535
				$this->config['content_type']
536
			);
537
538
			/**
539
			 * Filter the email content type.
540
			 *
541
			 * @since 2.0
542
			 */
543
			return apply_filters(
544
				"give_{$this->config['id']}_get_email_content_type",
545
				$content_type,
546
				$this,
547
				$form_id
548
			);
549
		}
550
551
		/**
552
		 * Get email template.
553
		 *
554
		 * @since  2.0
555
		 * @access public
556
		 *
557
		 * @param $form_id
558
		 *
559
		 * @return string
560
		 */
561
		public function get_email_template( $form_id ) {
562
			$email_template = give_get_meta( $form_id, '_give_email_template', true );
563
			$email_template = Give_Email_Notification_Util::get_value(
564
				$this,
565
				Give_Email_Setting_Field::get_prefix( $this, $form_id ) .'email_template',
566
				$form_id,
567
				! empty( $email_template ) && Give_Email_Notification_Util::can_use_form_email_options( $this, $form_id ) ?
568
					$email_template :
569
					$this->config['email_template']
570
			);
571
572
			/**
573
			 * Filter the email template.
574
			 *
575
			 * @since 2.0
576
			 */
577
			return apply_filters(
578
				"give_{$this->config['id']}_get_email_template",
579
				$email_template,
580
				$this,
581
				$form_id
582
			);
583
		}
584
585
586
		/**
587
		 * Get allowed email tags for current email notification.
588
		 *
589
		 * @since  2.0
590
		 * @access private
591
		 *
592
		 * @param bool $formatted
593
		 *
594
		 * @return array
595
		 */
596
		public function get_allowed_email_tags( $formatted = false ) {
597
			// Get all email tags.
598
			$email_tags = Give()->email_tags->get_tags();
599
600
			// Skip if all email template tags context setup exit.
601
			if ( $this->config['email_tag_context'] && 'all' !== $this->config['email_tag_context'] ) {
602
				if ( is_array( $this->config['email_tag_context'] ) ) {
603 View Code Duplication
					foreach ( $email_tags as $index => $email_tag ) {
0 ignored issues
show
Duplication introduced by
This code seems to be duplicated across your project.

Duplicated code is one of the most pungent code smells. If you need to duplicate the same code in three or more different places, we strongly encourage you to look into extracting the code into a single class or operation.

You can also find more detailed suggestions in the “Code” section of your repository.

Loading history...
604
						if ( in_array( $email_tag['context'], $this->config['email_tag_context'] ) ) {
605
							continue;
606
						}
607
608
						unset( $email_tags[ $index ] );
609
					}
610
				} else {
611 View Code Duplication
					foreach ( $email_tags as $index => $email_tag ) {
0 ignored issues
show
Duplication introduced by
This code seems to be duplicated across your project.

Duplicated code is one of the most pungent code smells. If you need to duplicate the same code in three or more different places, we strongly encourage you to look into extracting the code into a single class or operation.

You can also find more detailed suggestions in the “Code” section of your repository.

Loading history...
612
						if ( $this->config['email_tag_context'] === $email_tag['context'] ) {
613
							continue;
614
						}
615
616
						unset( $email_tags[ $index ] );
617
					}
618
				}
619
			}
620
621
			if ( count( $email_tags ) && $formatted ) : ob_start() ?>
622
				<ul class="give-email-tags-wrap">
623 View Code Duplication
					<?php foreach ( $email_tags as $email_tag ) : ?>
0 ignored issues
show
Duplication introduced by
This code seems to be duplicated across your project.

Duplicated code is one of the most pungent code smells. If you need to duplicate the same code in three or more different places, we strongly encourage you to look into extracting the code into a single class or operation.

You can also find more detailed suggestions in the “Code” section of your repository.

Loading history...
624
						<li class="give_<?php echo $email_tag['tag']; ?>_tag">
0 ignored issues
show
introduced by
Expected next thing to be a escaping function, not '$email_tag'
Loading history...
625
							<code>{<?php echo $email_tag['tag']; ?>}</code> - <?php echo $email_tag['description']; ?>
0 ignored issues
show
introduced by
Expected next thing to be a escaping function, not '$email_tag'
Loading history...
626
						</li>
627
					<?php endforeach; ?>
628
				</ul>
629
				<?php
630
				$email_tags = ob_get_clean();
631
			endif;
632
633
			return $email_tags;
634
		}
635
636
		/**
637
		 * Get preview email recipients.
638
		 *
639
		 * @since  2.0
640
		 * @access public
641
		 *
642
		 * @param int $form_id
643
		 *
644
		 * @return array|string
645
		 */
646
		public function get_preview_email_recipient( $form_id = null ) {
647
			$recipients = $this->get_recipient( $form_id );
648
649
			/**
650
			 * Filter the preview email recipients.
651
			 *
652
			 * @since 2.0
653
			 *
654
			 * @param string|array            $recipients List of recipients.
655
			 * @param Give_Email_Notification $this
656
			 */
657
			$recipients = apply_filters( 'give_get_preview_email_recipient', $recipients, $this, $form_id );
658
659
			return $recipients;
660
		}
661
662
		/**
663
		 * Get the recipient attachments.
664
		 *
665
		 * @since  2.0
666
		 * @access public
667
		 *
668
		 * @param int $form_id
669
		 *
670
		 * @return array
671
		 */
672
		public function get_email_attachments( $form_id = null ) {
673
			/**
674
			 * Filter the attachment.
675
			 *
676
			 * @since 2.0
677
			 */
678
			return apply_filters( "give_{$this->config['id']}_get_email_attachments", array(), $this, $form_id );
679
		}
680
681
682
		/**
683
		 * Send preview email.
684
		 *
685
		 * @since  2.0
686
		 * @access public
687
		 *
688
		 * @param bool $send Flag to check if send email or not.
689
		 *
690
		 * @return bool
691
		 */
692
		public function send_preview_email( $send = true ) {
693
			// Get form id
694
			$form_id = ! empty( $_GET['form_id'] ) ? absint( $_GET['form_id'] ) : null;
0 ignored issues
show
introduced by
Detected access of super global var $_GET, probably need manual inspection.
Loading history...
695
696
			// setup email data.
697
			$this->setup_email_data();
698
699
			$attachments  = $this->get_email_attachments();
700
			$message      = $this->preview_email_template_tags( $this->get_email_message( $form_id ) );
701
			$subject      = $this->preview_email_template_tags( $this->get_email_subject( $form_id ) );
702
			$content_type = $this->get_email_content_type( $form_id );
703
704
			// Setup email content type.
705
			Give()->emails->__set( 'content_type', $content_type );
706
			Give()->emails->__set( 'html', true );
707
708
			// Setup email template
709
			Give()->emails->__set( 'template', $this->get_email_template( $form_id ) );
710
711
			// Set email header.
712
			Give()->emails->__set( 'heading', $this->preview_email_template_tags( $this->get_email_header( $form_id ) ) );
713
714
			// Format plain content type email.
715 View Code Duplication
			if ( 'text/plain' === $content_type ) {
0 ignored issues
show
Duplication introduced by
This code seems to be duplicated across your project.

Duplicated code is one of the most pungent code smells. If you need to duplicate the same code in three or more different places, we strongly encourage you to look into extracting the code into a single class or operation.

You can also find more detailed suggestions in the “Code” section of your repository.

Loading history...
716
				Give()->emails->__set( 'html', false );
717
				Give()->emails->__set( 'template', 'none' );
718
				$message = strip_tags( $message );
719
			}
720
721 View Code Duplication
			if ( Give_Email_Notification_Util::can_use_form_email_options( $this, $form_id ) ) {
0 ignored issues
show
Duplication introduced by
This code seems to be duplicated across your project.

Duplicated code is one of the most pungent code smells. If you need to duplicate the same code in three or more different places, we strongly encourage you to look into extracting the code into a single class or operation.

You can also find more detailed suggestions in the “Code” section of your repository.

Loading history...
722
				Give()->emails->form_id      = $form_id;
723
				Give()->emails->from_name    = give_get_meta( $form_id, '_give_from_name', true );
724
				Give()->emails->from_address = give_get_meta( $form_id, '_give_from_email', true );
725
			}
726
727
			return $send
728
				? Give()->emails->send( $this->get_preview_email_recipient( $form_id ), $subject, $message, $attachments )
0 ignored issues
show
Bug introduced by
It seems like $this->get_preview_email_recipient($form_id) targeting Give_Email_Notification:...eview_email_recipient() can also be of type array; however, Give_Emails::send() does only seem to accept string, maybe add an additional type check?

This check looks at variables that are passed out again to other methods.

If the outgoing method call has stricter type requirements than the method itself, an issue is raised.

An additional type check may prevent trouble.

Loading history...
729
				: false;
730
		}
731
732
733
		/**
734
		 * Send email notification.
735
		 *
736
		 * Note: To render email tags in all context certain parameters are necessary for core (includes/emails/class-give-emails):
737
		 *    1. payment_id
738
		 *    2. user_id
739
		 *    3. form_id
740
		 *    4. donor_id
741
		 *    5. for third party email tags you can pass necessary param along above parameters other value replace by empty string.
742
		 *
743
		 * @since  2.0
744
		 * @access public
745
		 *
746
		 * @param array $email_tag_args Arguments which helps to decode email template tags.
747
		 *
748
		 * @return bool
749
		 */
750
		public function send_email_notification( $email_tag_args = array() ) {
751
			// Add email content type email tags.
752
			$email_tag_args['email_content_type'] = $this->config['content_type'];
753
754
			/**
755
			 * Filter the email tag args
756
			 *
757
			 * @since 2.0
758
			 */
759
			$email_tag_args = apply_filters( "give_{$this->config['id']}_email_tag_args", $email_tag_args, $this );
760
761
			// Get form id.
762
			$form_id = ! empty( $email_tag_args['form_id'] )
763
				? absint( $email_tag_args['form_id'] )
764
				: ( ! empty( $email_tag_args['payment_id'] ) ? give_get_payment_form_id( $email_tag_args['payment_id'] ) : null );
765
0 ignored issues
show
Coding Style introduced by
Functions must not contain multiple empty lines in a row; found 2 empty lines
Loading history...
766
767
			// Do not send email if notification is disable.
768
			if ( ! Give_Email_Notification_Util::is_email_notification_active( $this, $form_id ) ) {
769
				return false;
770
			}
771
772
			/**
773
			 * Fire action after before email send.
774
			 *
775
			 * @since 2.0
776
			 */
777
			do_action( "give_{$this->config['id']}_email_send_before", $this, $form_id );
778
779
			$attachments  = $this->get_email_attachments();
780
			$message      = give_do_email_tags( $this->get_email_message( $form_id ), $email_tag_args );
781
			$subject      = give_do_email_tags( $this->get_email_subject( $form_id ), $email_tag_args );
782
			$content_type = $this->get_email_content_type( $form_id );
783
784
			// Setup email content type.
785
			Give()->emails->__set( 'content_type', $content_type );
786
			Give()->emails->__set( 'html', true );
787
788
			// Set email template.
789
			Give()->emails->__set( 'template', $this->get_email_template( $form_id ) );
790
791
			// Set email header.
792
			Give()->emails->__set( 'heading', give_do_email_tags( $this->get_email_header( $form_id ), $email_tag_args ) );
793
794 View Code Duplication
			if ( 'text/plain' === $content_type ) {
0 ignored issues
show
Duplication introduced by
This code seems to be duplicated across your project.

Duplicated code is one of the most pungent code smells. If you need to duplicate the same code in three or more different places, we strongly encourage you to look into extracting the code into a single class or operation.

You can also find more detailed suggestions in the “Code” section of your repository.

Loading history...
795
				Give()->emails->__set( 'html', false );
796
				Give()->emails->__set( 'template', 'none' );
797
				$message = strip_tags( $message );
798
			}
799
800 View Code Duplication
			if ( Give_Email_Notification_Util::can_use_form_email_options( $this, $form_id ) ) {
0 ignored issues
show
Duplication introduced by
This code seems to be duplicated across your project.

Duplicated code is one of the most pungent code smells. If you need to duplicate the same code in three or more different places, we strongly encourage you to look into extracting the code into a single class or operation.

You can also find more detailed suggestions in the “Code” section of your repository.

Loading history...
801
				Give()->emails->form_id      = $form_id;
802
				Give()->emails->from_name    = give_get_meta( $form_id, '_give_from_name', true );
803
				Give()->emails->from_address = give_get_meta( $form_id, '_give_from_email', true );
804
			}
805
806
			// Send email.
807
			$email_status = Give()->emails->send( $this->get_recipient( $form_id ), $subject, $message, $attachments );
0 ignored issues
show
Bug introduced by
It seems like $this->get_recipient($form_id) targeting Give_Email_Notification::get_recipient() can also be of type array; however, Give_Emails::send() does only seem to accept string, maybe add an additional type check?

This check looks at variables that are passed out again to other methods.

If the outgoing method call has stricter type requirements than the method itself, an issue is raised.

An additional type check may prevent trouble.

Loading history...
808
809
			/**
810
			 * Fire action after after email send.
811
			 *
812
			 * @since 2.0
813
			 */
814
			do_action( "give_{$this->config['id']}_email_send_after", $email_status, $this, $form_id );
815
816
			return $email_status;
817
		}
818
819
820
		/**
821
		 * Decode preview email template tags.
822
		 *
823
		 * @since 2.0
824
		 *
825
		 * @param string $message
826
		 *
827
		 * @return string
828
		 */
829
		public function preview_email_template_tags( $message ) {
830
			// Set Payment.
831
			$payment_id = give_check_variable( give_clean( $_GET ), 'isset_empty', 0, 'preview_id' );
0 ignored issues
show
Documentation introduced by
0 is of type integer, but the function expects a boolean.

It seems like the type of the argument is not accepted by the function/method which you are calling.

In some cases, in particular if PHP’s automatic type-juggling kicks in this might be fine. In other cases, however this might be a bug.

We suggest to add an explicit type cast like in the following example:

function acceptsInteger($int) { }

$x = '123'; // string "123"

// Instead of
acceptsInteger($x);

// we recommend to use
acceptsInteger((integer) $x);
Loading history...
introduced by
Detected access of super global var $_GET, probably need manual inspection.
Loading history...
832
			$payment    = $payment_id ? new Give_Payment( $payment_id ) : new stdClass();
833
834
			// Set donor.
835
			$user_id = $payment_id
836
				? $payment->user_id
837
				: give_check_variable( give_clean( $_GET ), 'isset_empty', 0, 'user_id' );
0 ignored issues
show
Documentation introduced by
0 is of type integer, but the function expects a boolean.

It seems like the type of the argument is not accepted by the function/method which you are calling.

In some cases, in particular if PHP’s automatic type-juggling kicks in this might be fine. In other cases, however this might be a bug.

We suggest to add an explicit type cast like in the following example:

function acceptsInteger($int) { }

$x = '123'; // string "123"

// Instead of
acceptsInteger($x);

// we recommend to use
acceptsInteger((integer) $x);
Loading history...
introduced by
Detected access of super global var $_GET, probably need manual inspection.
Loading history...
838
			$user_id = $user_id ? $user_id : wp_get_current_user()->ID;
839
840
			// Set receipt.
841
			$receipt_id = strtolower( md5( uniqid() ) );
842
843
			$receipt_link_url = esc_url( add_query_arg( array(
844
				'payment_key' => $receipt_id,
845
			), give_get_history_page_uri() ) );
846
847
			$receipt_link = sprintf(
848
				'<a href="%1$s">%2$s</a>',
849
				$receipt_link_url,
850
				esc_html__( 'View the receipt in your browser &raquo;', 'give' )
851
			);
852
853
			// Set default values for tags.
854
			$this->config['preview_email_tags_values'] = wp_parse_args(
855
				$this->config['preview_email_tags_values'],
856
				array(
857
					'name'                     => give_email_tag_first_name( array(
858
						'payment_id' => $payment_id,
859
						'user_id'    => $user_id,
860
					) ),
861
					'fullname'                 => give_email_tag_fullname( array(
862
						'payment_id' => $payment_id,
863
						'user_id'    => $user_id,
864
					) ),
865
					'username'                 => give_email_tag_username( array(
866
						'payment_id' => $payment_id,
867
						'user_id'    => $user_id,
868
					) ),
869
					'user_email'               => give_email_tag_user_email( array(
870
						'payment_id' => $payment_id,
871
						'user_id'    => $user_id,
872
					) ),
873
					'payment_total'            => $payment_id ? give_email_tag_payment_total( array( 'payment_id' => $payment_id ) ) : give_currency_filter( '10.50' ),
874
					'amount'                   => $payment_id ? give_email_tag_amount( array( 'payment_id' => $payment_id ) ) : give_currency_filter( '10.50' ),
875
					'price'                    => $payment_id ? give_email_tag_price( array( 'payment_id' => $payment_id ) ) : give_currency_filter( '10.50' ),
876
					'payment_method'           => $payment_id ? give_email_tag_payment_method( array( 'payment_id' => $payment_id ) ) : __( 'PayPal', 'give' ),
877
					'receipt_id'               => $receipt_id,
878
					'payment_id'               => $payment_id ? $payment_id : rand( 2000, 2050 ),
879
					'receipt_link_url'         => $receipt_link_url,
880
					'receipt_link'             => $receipt_link,
881
					'date'                     => $payment_id ? date( give_date_format(), strtotime( $payment->date ) ) : date( give_date_format(), current_time( 'timestamp' ) ),
882
					'donation'                 => $payment_id ? give_email_tag_donation( array( 'payment_id' => $payment_id ) ) : esc_html__( 'Sample Donation Form Title', 'give' ),
883
					'form_title'               => $payment_id ? give_email_tag_form_title( array( 'payment_id' => $payment_id ) ) : esc_html__( 'Sample Donation Form Title - Sample Donation Level', 'give' ),
884
					'sitename'                 => $payment_id ? give_email_tag_sitename( array( 'payment_id' => $payment_id ) ) : get_bloginfo( 'name' ),
885
					'billing_address'         => $payment_id ? give_email_tag_billing_address( array( 'payment_id' => $payment_id ) ) : '',
886
					'email_access_link'       => sprintf(
887
						'<a href="%1$s">%2$s</a>',
888
						add_query_arg(
889
							array(
890
								'give_nl' => uniqid(),
891
							),
892
							give_get_history_page_uri()
893
						),
894
						__( 'View your donation history &raquo;', 'give' )
895
					),
896
					'reset_password_link'     => $user_id ? give_email_tag_reset_password_link( array( 'user_id' => $user_id ), $payment_id ) : '',
897
					'site_url'                => sprintf(
898
						'<a href="%1$s">%2$s</a>',
899
						get_bloginfo( 'url' ),
900
						get_bloginfo( 'url' )
901
					),
902
					'admin_email'             => give_email_admin_email(),
903
					'offline_mailing_address' => give_email_offline_mailing_address(),
904
				)
905
			);
906
907
			// Decode tags.
908
			foreach ( $this->config['preview_email_tags_values'] as $preview_tag => $value ) {
909
				if ( isset( $this->config['preview_email_tags_values'][ $preview_tag ] ) ) {
910
					$message = str_replace( "{{$preview_tag}}", $this->config['preview_email_tags_values'][ $preview_tag ], $message );
911
				}
912
			}
913
914
			return apply_filters( 'give_email_preview_template_tags', $message );
915
		}
916
917
		/**
918
		 * Setup email data
919
		 *
920
		 * @since 2.0
921
		 */
922
		public function setup_email_data() {
923
		}
924
925
926
		/**
927
		 * Validate email form setting
928
		 *
929
		 * Note: internal use only
930
		 *
931
		 * @since  2.0
932
		 * @access public
933
		 *
934
		 * @param $form_meta_key
935
		 * @param $form_meta_value
936
		 * @param $post_id
937
		 *
938
		 */
939
		public function validate_form_recipient_field_value( $form_meta_key, $form_meta_value, $post_id ) {
940
			// Get valid emails.
941
			$new_form_meta_value = array_filter( $form_meta_value, function ( $value ) {
942
				return ! empty( $value['email'] ) && is_email( $value['email'] );
943
			} );
944
945
			// Remove duplicate emails from array.
946
			$email_arr = array();
947
			foreach ( $new_form_meta_value as $index => $email ) {
948
				if( in_array( $email['email'], $email_arr  ) ) {
0 ignored issues
show
introduced by
Space after opening control structure is required
Loading history...
introduced by
No space before opening parenthesis is prohibited
Loading history...
Coding Style introduced by
Expected 1 spaces before closing bracket; 2 found
Loading history...
949
					unset( $new_form_meta_value[$index] );
0 ignored issues
show
introduced by
Array keys should be surrounded by spaces unless they contain a string or an integer.
Loading history...
950
					continue;
951
				}
952
953
				$email_arr[] = $email['email'];
954
			}
955
956
			$update = false;
957
958
			if ( empty( $new_form_meta_value ) ) {
959
				// Set default recipient.
960
				$form_meta_value = array(
961
					array(
962
						'email' => get_bloginfo( 'admin_email' )
963
					),
964
				);
965
966
				$update = true;
967
968
			} elseif ( count( $new_form_meta_value ) !== count( $form_meta_value ) ) {
969
				// Filter recipient emails.
970
				$form_meta_value = $new_form_meta_value;
971
972
				$update = true;
973
			}
974
975
			if( $update ) {
0 ignored issues
show
introduced by
Space after opening control structure is required
Loading history...
introduced by
No space before opening parenthesis is prohibited
Loading history...
976
				give_update_meta( $post_id, $form_meta_key, $form_meta_value );
977
			}
978
		}
979
	}
980
981
endif; // End class_exists check
982