Completed
Branch models-cleanup/main (de94a1)
by
unknown
86:45 queued 77:08
created
core/libraries/form_sections/inputs/EE_Radio_Button_Input.input.php 1 patch
Indentation   +17 added lines, -17 removed lines patch added patch discarded remove patch
@@ -15,22 +15,22 @@
 block discarded – undo
15 15
 class EE_Radio_Button_Input extends EE_Form_Input_With_Options_Base
16 16
 {
17 17
 
18
-    /**
19
-     * @param array $answer_options
20
-     * @param array $input_settings
21
-     */
22
-    public function __construct($answer_options, $input_settings = array())
23
-    {
24
-        $this->_set_display_strategy(new EE_Radio_Button_Display_Strategy());
25
-        $this->_add_validation_strategy(
26
-            new EE_Enum_Validation_Strategy(
27
-                isset($input_settings['validation_error_message'])
28
-                    ? $input_settings['validation_error_message']
29
-                    : null
30
-            )
31
-        );
32
-        $this->_multiple_selections = false;
33
-        parent::__construct($answer_options, $input_settings);
34
-    }
18
+	/**
19
+	 * @param array $answer_options
20
+	 * @param array $input_settings
21
+	 */
22
+	public function __construct($answer_options, $input_settings = array())
23
+	{
24
+		$this->_set_display_strategy(new EE_Radio_Button_Display_Strategy());
25
+		$this->_add_validation_strategy(
26
+			new EE_Enum_Validation_Strategy(
27
+				isset($input_settings['validation_error_message'])
28
+					? $input_settings['validation_error_message']
29
+					: null
30
+			)
31
+		);
32
+		$this->_multiple_selections = false;
33
+		parent::__construct($answer_options, $input_settings);
34
+	}
35 35
 
36 36
 }
Please login to merge, or discard this patch.
core/libraries/form_sections/inputs/EE_Datepicker_Input.php 2 patches
Spacing   +2 added lines, -2 removed lines patch added patch discarded remove patch
@@ -29,7 +29,7 @@  discard block
 block discarded – undo
29 29
             )
30 30
         );
31 31
         parent::__construct($input_settings);
32
-        $this->set_html_class($this->html_class() . ' datepicker');
32
+        $this->set_html_class($this->html_class().' datepicker');
33 33
         // add some style and make it dance
34 34
         add_action('wp_enqueue_scripts', array('EE_Datepicker_Input', 'enqueue_styles_and_scripts'));
35 35
         add_action('admin_enqueue_scripts', array('EE_Datepicker_Input', 'enqueue_styles_and_scripts'));
@@ -48,7 +48,7 @@  discard block
 block discarded – undo
48 48
         // load css
49 49
         wp_register_style(
50 50
             'espresso-ui-theme',
51
-            EE_GLOBAL_ASSETS_URL . 'css/espresso-ui-theme/jquery-ui-1.10.3.custom.min.css',
51
+            EE_GLOBAL_ASSETS_URL.'css/espresso-ui-theme/jquery-ui-1.10.3.custom.min.css',
52 52
             array(),
53 53
             EVENT_ESPRESSO_VERSION
54 54
         );
Please login to merge, or discard this patch.
Indentation   +38 added lines, -38 removed lines patch added patch discarded remove patch
@@ -10,45 +10,45 @@
 block discarded – undo
10 10
 class EE_Datepicker_Input extends EE_Form_Input_Base
11 11
 {
12 12
 
13
-    /**
14
-     * @param array $input_settings
15
-     */
16
-    public function __construct($input_settings = array())
17
-    {
18
-        $this->_set_display_strategy(new EE_Text_Input_Display_Strategy('datepicker'));
19
-        $this->_set_normalization_strategy(new EE_Text_Normalization());
20
-        // we could do better for validation, but at least verify its plaintext
21
-        $this->_add_validation_strategy(
22
-            new EE_Plaintext_Validation_Strategy(
23
-                isset($input_settings['validation_error_message'])
24
-                    ? $input_settings['validation_error_message']
25
-                    : null
26
-            )
27
-        );
28
-        parent::__construct($input_settings);
29
-        $this->set_html_class($this->html_class() . ' datepicker');
30
-        // add some style and make it dance
31
-        add_action('wp_enqueue_scripts', array('EE_Datepicker_Input', 'enqueue_styles_and_scripts'));
32
-        add_action('admin_enqueue_scripts', array('EE_Datepicker_Input', 'enqueue_styles_and_scripts'));
33
-    }
13
+	/**
14
+	 * @param array $input_settings
15
+	 */
16
+	public function __construct($input_settings = array())
17
+	{
18
+		$this->_set_display_strategy(new EE_Text_Input_Display_Strategy('datepicker'));
19
+		$this->_set_normalization_strategy(new EE_Text_Normalization());
20
+		// we could do better for validation, but at least verify its plaintext
21
+		$this->_add_validation_strategy(
22
+			new EE_Plaintext_Validation_Strategy(
23
+				isset($input_settings['validation_error_message'])
24
+					? $input_settings['validation_error_message']
25
+					: null
26
+			)
27
+		);
28
+		parent::__construct($input_settings);
29
+		$this->set_html_class($this->html_class() . ' datepicker');
30
+		// add some style and make it dance
31
+		add_action('wp_enqueue_scripts', array('EE_Datepicker_Input', 'enqueue_styles_and_scripts'));
32
+		add_action('admin_enqueue_scripts', array('EE_Datepicker_Input', 'enqueue_styles_and_scripts'));
33
+	}
34 34
 
35 35
 
36 36
 
37
-    /**
38
-     *    enqueue_styles_and_scripts
39
-     *
40
-     * @access        public
41
-     * @return        void
42
-     */
43
-    public static function enqueue_styles_and_scripts()
44
-    {
45
-        // load css
46
-        wp_register_style(
47
-            'espresso-ui-theme',
48
-            EE_GLOBAL_ASSETS_URL . 'css/espresso-ui-theme/jquery-ui-1.10.3.custom.min.css',
49
-            array(),
50
-            EVENT_ESPRESSO_VERSION
51
-        );
52
-        wp_enqueue_style('espresso-ui-theme');
53
-    }
37
+	/**
38
+	 *    enqueue_styles_and_scripts
39
+	 *
40
+	 * @access        public
41
+	 * @return        void
42
+	 */
43
+	public static function enqueue_styles_and_scripts()
44
+	{
45
+		// load css
46
+		wp_register_style(
47
+			'espresso-ui-theme',
48
+			EE_GLOBAL_ASSETS_URL . 'css/espresso-ui-theme/jquery-ui-1.10.3.custom.min.css',
49
+			array(),
50
+			EVENT_ESPRESSO_VERSION
51
+		);
52
+		wp_enqueue_style('espresso-ui-theme');
53
+	}
54 54
 }
Please login to merge, or discard this patch.
public/Espresso_Arabica_2014/loop-espresso_event_attendees.php 3 patches
Indentation   +18 added lines, -18 removed lines patch added patch discarded remove patch
@@ -22,15 +22,15 @@  discard block
 block discarded – undo
22 22
 
23 23
 <div class="event-attendees">
24 24
     <?php do_action_ref_array(
25
-        'AHEE__loop-espresso_event_attendees__before',
26
-        array(
27
-            $contacts,
28
-            $event,
29
-            $datetime,
30
-            $ticket,
31
-            $show_gravatar,
32
-        )
33
-    ); ?>
25
+		'AHEE__loop-espresso_event_attendees__before',
26
+		array(
27
+			$contacts,
28
+			$event,
29
+			$datetime,
30
+			$ticket,
31
+			$show_gravatar,
32
+		)
33
+	); ?>
34 34
 	<?php if ( $contacts ) : ?>
35 35
 		<ul class="event-attendees-list">
36 36
 			<?php foreach( $contacts as $contact ) :
@@ -47,13 +47,13 @@  discard block
 block discarded – undo
47 47
 		<p><?php echo $no_attendees_message; ?></p>
48 48
 	<?php endif; ?>
49 49
     <?php do_action_ref_array(
50
-        'AHEE__loop-espresso_event_attendees__after',
51
-        array(
52
-            $contacts,
53
-            $event,
54
-            $datetime,
55
-            $ticket,
56
-            $show_gravatar,
57
-        )
58
-    ); ?>
50
+		'AHEE__loop-espresso_event_attendees__after',
51
+		array(
52
+			$contacts,
53
+			$event,
54
+			$datetime,
55
+			$ticket,
56
+			$show_gravatar,
57
+		)
58
+	); ?>
59 59
 </div>
60 60
\ No newline at end of file
Please login to merge, or discard this patch.
Spacing   +5 added lines, -5 removed lines patch added patch discarded remove patch
@@ -15,7 +15,7 @@  discard block
 block discarded – undo
15 15
  * @type bool       $show_gravatar  whether to show gravatar or not.
16 16
  */
17 17
 
18
-$no_attendees_message =  apply_filters( 'FHEE__loop-espresso_attendees-shortcode__template__no_attendees_message', __('No Attendees Yet', 'event_espresso' ) );
18
+$no_attendees_message = apply_filters('FHEE__loop-espresso_attendees-shortcode__template__no_attendees_message', __('No Attendees Yet', 'event_espresso'));
19 19
 
20 20
 
21 21
 ?>
@@ -31,16 +31,16 @@  discard block
 block discarded – undo
31 31
             $show_gravatar,
32 32
         )
33 33
     ); ?>
34
-	<?php if ( $contacts ) : ?>
34
+	<?php if ($contacts) : ?>
35 35
 		<ul class="event-attendees-list">
36
-			<?php foreach( $contacts as $contact ) :
37
-				EEH_Template::get_template_part( 'content', 'espresso_event_attendees', array( 
36
+			<?php foreach ($contacts as $contact) :
37
+				EEH_Template::get_template_part('content', 'espresso_event_attendees', array( 
38 38
 					'contact'       => $contact, 
39 39
 					'event'         => $event,
40 40
 					'datetime'      => $datetime,
41 41
 					'ticket'        => $ticket,
42 42
 					'show_gravatar' => $show_gravatar 
43
-				) );
43
+				));
44 44
 				endforeach; ?>
45 45
 		</ul>
46 46
 	<?php else : ?>
Please login to merge, or discard this patch.
Braces   +5 added lines, -2 removed lines patch added patch discarded remove patch
@@ -43,8 +43,11 @@
 block discarded – undo
43 43
 				) );
44 44
 				endforeach; ?>
45 45
 		</ul>
46
-	<?php else : ?>
47
-		<p><?php echo $no_attendees_message; ?></p>
46
+	<?php else {
47
+	: ?>
48
+		<p><?php echo $no_attendees_message;
49
+}
50
+?></p>
48 51
 	<?php endif; ?>
49 52
     <?php do_action_ref_array(
50 53
         'AHEE__loop-espresso_event_attendees__after',
Please login to merge, or discard this patch.
core/business/EE_Registration_Processor.class.php 3 patches
Doc Comments   +1 added lines, -1 removed lines patch added patch discarded remove patch
@@ -734,7 +734,7 @@
 block discarded – undo
734 734
      * @since 4.9.1
735 735
      * @param int                   $att_nmbr
736 736
      * @param EE_Line_Item | string $item
737
-     * @return string
737
+     * @return RegUrlLink
738 738
      * @throws InvalidArgumentException
739 739
      */
740 740
     public function generate_reg_url_link($att_nmbr, $item)
Please login to merge, or discard this patch.
Indentation   +766 added lines, -766 removed lines patch added patch discarded remove patch
@@ -24,771 +24,771 @@
 block discarded – undo
24 24
 class EE_Registration_Processor extends EE_Processor_Base
25 25
 {
26 26
 
27
-    /**
28
-     * @var EE_Registration_Processor $_instance
29
-     * @access    private
30
-     */
31
-    private static $_instance;
32
-
33
-    /**
34
-     * initial reg status at the beginning of this request.
35
-     * indexed by registration ID
36
-     *
37
-     * @var array
38
-     */
39
-    protected $_old_reg_status = array();
40
-
41
-    /**
42
-     * reg status at the end of the request after all processing.
43
-     * indexed by registration ID
44
-     *
45
-     * @var array
46
-     */
47
-    protected $_new_reg_status = array();
48
-
49
-    /**
50
-     * amounts paid at the end of the request after all processing.
51
-     * indexed by registration ID
52
-     *
53
-     * @var array
54
-     */
55
-    protected static $_amount_paid = array();
56
-
57
-    /**
58
-     * Cache of the reg final price for registrations corresponding to a ticket line item
59
-     *
60
-     * @deprecated
61
-     * @var array @see EEH_Line_Item::calculate_reg_final_prices_per_line_item()'s return value
62
-     */
63
-    protected $_reg_final_price_per_tkt_line_item;
64
-
65
-    /**
66
-     * @var EE_Request $request
67
-     */
68
-    protected $request;
69
-
70
-
71
-    /**
72
-     * @singleton method used to instantiate class object
73
-     * @param EE_Request|null $request
74
-     * @return EE_Registration_Processor instance
75
-     * @throws \InvalidArgumentException
76
-     * @throws \EventEspresso\core\exceptions\InvalidInterfaceException
77
-     * @throws \EventEspresso\core\exceptions\InvalidDataTypeException
78
-     */
79
-    public static function instance(EE_Request $request = null)
80
-    {
81
-        // check if class object is instantiated
82
-        if (! self::$_instance instanceof EE_Registration_Processor) {
83
-            if (! $request instanceof EE_Request) {
84
-                $request = LoaderFactory::getLoader()->getShared('EE_Request');
85
-            }
86
-            self::$_instance = new self($request);
87
-        }
88
-        return self::$_instance;
89
-    }
90
-
91
-
92
-    /**
93
-     * EE_Registration_Processor constructor.
94
-     *
95
-     * @param EE_Request $request
96
-     */
97
-    public function __construct(EE_Request $request)
98
-    {
99
-        $this->request = $request;
100
-    }
101
-
102
-
103
-    /**
104
-     * @param int $REG_ID
105
-     * @return string
106
-     */
107
-    public function old_reg_status($REG_ID)
108
-    {
109
-        return isset($this->_old_reg_status[ $REG_ID ]) ? $this->_old_reg_status[ $REG_ID ] : null;
110
-    }
111
-
112
-
113
-    /**
114
-     * @param int    $REG_ID
115
-     * @param string $old_reg_status
116
-     */
117
-    public function set_old_reg_status($REG_ID, $old_reg_status)
118
-    {
119
-        // only set the first time
120
-        if (! isset($this->_old_reg_status[ $REG_ID ])) {
121
-            $this->_old_reg_status[ $REG_ID ] = $old_reg_status;
122
-        }
123
-    }
124
-
125
-
126
-    /**
127
-     * @param int $REG_ID
128
-     * @return string
129
-     */
130
-    public function new_reg_status($REG_ID)
131
-    {
132
-        return isset($this->_new_reg_status[ $REG_ID ]) ? $this->_new_reg_status[ $REG_ID ] : null;
133
-    }
134
-
135
-
136
-    /**
137
-     * @param int    $REG_ID
138
-     * @param string $new_reg_status
139
-     */
140
-    public function set_new_reg_status($REG_ID, $new_reg_status)
141
-    {
142
-        $this->_new_reg_status[ $REG_ID ] = $new_reg_status;
143
-    }
144
-
145
-
146
-    /**
147
-     * reg_status_updated
148
-     *
149
-     * @param int $REG_ID
150
-     * @return bool
151
-     */
152
-    public function reg_status_updated($REG_ID)
153
-    {
154
-        return $this->new_reg_status($REG_ID) !== $this->old_reg_status($REG_ID);
155
-    }
156
-
157
-
158
-    /**
159
-     * @param EE_Registration $registration
160
-     * @throws EE_Error
161
-     * @throws EntityNotFoundException
162
-     * @throws InvalidArgumentException
163
-     * @throws InvalidDataTypeException
164
-     * @throws InvalidInterfaceException
165
-     * @throws ReflectionException
166
-     * @throws RuntimeException
167
-     */
168
-    public function update_registration_status_and_trigger_notifications(EE_Registration $registration)
169
-    {
170
-        $this->toggle_incomplete_registration_status_to_default($registration, false);
171
-        $this->toggle_registration_status_for_default_approved_events($registration, false);
172
-        $this->toggle_registration_status_if_no_monies_owing($registration, false);
173
-        $registration->save();
174
-        // trigger notifications
175
-        $this->trigger_registration_update_notifications($registration);
176
-    }
177
-
178
-
179
-    /**
180
-     *    manually_update_registration_status
181
-     *
182
-     * @access public
183
-     * @param EE_Registration $registration
184
-     * @param string          $new_reg_status
185
-     * @param bool            $save TRUE will save the registration if the status is updated, FALSE will leave that up
186
-     *                              to client code
187
-     * @return bool
188
-     * @throws EE_Error
189
-     * @throws EntityNotFoundException
190
-     * @throws InvalidArgumentException
191
-     * @throws InvalidDataTypeException
192
-     * @throws InvalidInterfaceException
193
-     * @throws ReflectionException
194
-     * @throws RuntimeException
195
-     */
196
-    public function manually_update_registration_status(
197
-        EE_Registration $registration,
198
-        $new_reg_status = '',
199
-        $save = true
200
-    ) {
201
-        // set initial REG_Status
202
-        $this->set_old_reg_status($registration->ID(), $registration->status_ID());
203
-        // set incoming REG_Status
204
-        $this->set_new_reg_status($registration->ID(), $new_reg_status);
205
-        // toggle reg status but only if it has changed and the user can do so
206
-        if (
207
-            $this->reg_status_updated($registration->ID())
208
-            && (
209
-                (! $this->request->isAdmin() || $this->request->isFrontAjax())
210
-                || EE_Registry::instance()->CAP->current_user_can(
211
-                    'ee_edit_registration',
212
-                    'toggle_registration_status',
213
-                    $registration->ID()
214
-                )
215
-            )
216
-        ) {
217
-            // change status to new value
218
-            $updated = $registration->set_status($this->new_reg_status($registration->ID()));
219
-            if ($updated && $save) {
220
-                $registration->save();
221
-            }
222
-            return true;
223
-        }
224
-        return false;
225
-    }
226
-
227
-
228
-    /**
229
-     *    toggle_incomplete_registration_status_to_default
230
-     *        changes any incomplete registrations to either the event or global default registration status
231
-     *
232
-     * @access public
233
-     * @param EE_Registration       $registration
234
-     * @param bool                  $save TRUE will save the registration if the status is updated, FALSE will leave
235
-     *                                    that up to client code
236
-     * @param ContextInterface|null $context
237
-     * @return void
238
-     * @throws EE_Error
239
-     * @throws InvalidArgumentException
240
-     * @throws ReflectionException
241
-     * @throws RuntimeException
242
-     * @throws EntityNotFoundException
243
-     * @throws InvalidDataTypeException
244
-     * @throws InvalidInterfaceException
245
-     */
246
-    public function toggle_incomplete_registration_status_to_default(
247
-        EE_Registration $registration,
248
-        $save = true,
249
-        ContextInterface $context = null
250
-    ) {
251
-        $existing_reg_status = $registration->status_ID();
252
-        // set initial REG_Status
253
-        $this->set_old_reg_status($registration->ID(), $existing_reg_status);
254
-        // is the registration currently incomplete ?
255
-        if ($registration->status_ID() === EEM_Registration::status_id_incomplete) {
256
-            // grab default reg status for the event, if set
257
-            $event_default_registration_status = $registration->event()->default_registration_status();
258
-            // if no default reg status is set for the event, then use the global value
259
-            $STS_ID = ! empty($event_default_registration_status)
260
-                ? $event_default_registration_status
261
-                : EE_Registry::instance()->CFG->registration->default_STS_ID;
262
-            // if the event default reg status is approved, then downgrade temporarily to payment pending to ensure that payments are triggered
263
-            $STS_ID = $STS_ID === EEM_Registration::status_id_approved ? EEM_Registration::status_id_pending_payment
264
-                : $STS_ID;
265
-            // set incoming REG_Status
266
-            $this->set_new_reg_status($registration->ID(), $STS_ID);
267
-            $registration->set_status($STS_ID, false, $context);
268
-            if ($save) {
269
-                $registration->save();
270
-            }
271
-            // don't trigger notifications during IPNs because they will get triggered by EE_Payment_Processor
272
-            if (! EE_Processor_Base::$IPN) {
273
-                // otherwise, send out notifications
274
-                add_filter('FHEE__EED_Messages___maybe_registration__deliver_notifications', '__return_true', 10);
275
-            }
276
-            // DEBUG LOG
277
-            // $this->log(
278
-            //     __CLASS__,
279
-            //     __FUNCTION__,
280
-            //     __LINE__,
281
-            //     $registration->transaction(),
282
-            //     array(
283
-            //         'IPN' => EE_Processor_Base::$IPN,
284
-            //         'deliver_notifications' => has_filter(
285
-            //             'FHEE__EED_Messages___maybe_registration__deliver_notifications'
286
-            //         ),
287
-            //     )
288
-            // );
289
-        }
290
-    }
291
-
292
-
293
-    /**
294
-     *    toggle_registration_status_for_default_approved_events
295
-     *
296
-     * @access public
297
-     * @param EE_Registration $registration
298
-     * @param bool            $save TRUE will save the registration if the status is updated, FALSE will leave that up
299
-     *                              to client code
300
-     * @return bool
301
-     * @throws EE_Error
302
-     * @throws EntityNotFoundException
303
-     * @throws InvalidArgumentException
304
-     * @throws InvalidDataTypeException
305
-     * @throws InvalidInterfaceException
306
-     * @throws ReflectionException
307
-     * @throws RuntimeException
308
-     */
309
-    public function toggle_registration_status_for_default_approved_events(EE_Registration $registration, $save = true)
310
-    {
311
-        $reg_status = $registration->status_ID();
312
-        // set initial REG_Status
313
-        $this->set_old_reg_status($registration->ID(), $reg_status);
314
-        // if not already, toggle reg status to approved IF the event default reg status is approved
315
-        // ( as long as the registration wasn't cancelled or declined at some point )
316
-        if (
317
-            $reg_status !== EEM_Registration::status_id_cancelled
318
-            && $reg_status
319
-               !== EEM_Registration::status_id_declined
320
-            && $reg_status !== EEM_Registration::status_id_approved
321
-            && $registration->event()->default_registration_status() === EEM_Registration::status_id_approved
322
-        ) {
323
-            // set incoming REG_Status
324
-            $this->set_new_reg_status($registration->ID(), EEM_Registration::status_id_approved);
325
-            // toggle status to approved
326
-            $registration->set_status(EEM_Registration::status_id_approved);
327
-            if ($save) {
328
-                $registration->save();
329
-            }
330
-            // don't trigger notifications during IPNs because they will get triggered by EE_Payment_Processor
331
-            if (! EE_Processor_Base::$IPN) {
332
-                // otherwise, send out notifications
333
-                add_filter('FHEE__EED_Messages___maybe_registration__deliver_notifications', '__return_true', 10);
334
-            }
335
-            // DEBUG LOG
336
-            // $this->log(
337
-            //     __CLASS__,
338
-            //     __FUNCTION__,
339
-            //     __LINE__,
340
-            //     $registration->transaction(),
341
-            //     array(
342
-            //         'IPN' => EE_Processor_Base::$IPN,
343
-            //         'deliver_notifications' => has_filter(
344
-            //             'FHEE__EED_Messages___maybe_registration__deliver_notifications'
345
-            //         ),
346
-            //     )
347
-            // );
348
-            return true;
349
-        }
350
-        return false;
351
-    }
352
-
353
-
354
-    /**
355
-     *    toggle_registration_statuses_if_no_monies_owing
356
-     *
357
-     * @access public
358
-     * @param EE_Registration $registration
359
-     * @param bool            $save TRUE will save the registration if the status is updated, FALSE will leave that up
360
-     *                              to client code
361
-     * @param array           $additional_details
362
-     * @return bool
363
-     * @throws EE_Error
364
-     * @throws EntityNotFoundException
365
-     * @throws InvalidArgumentException
366
-     * @throws InvalidDataTypeException
367
-     * @throws InvalidInterfaceException
368
-     * @throws ReflectionException
369
-     * @throws RuntimeException
370
-     */
371
-    public function toggle_registration_status_if_no_monies_owing(
372
-        EE_Registration $registration,
373
-        $save = true,
374
-        array $additional_details = array()
375
-    ) {
376
-        // set initial REG_Status
377
-        $this->set_old_reg_status($registration->ID(), $registration->status_ID());
378
-        // was a payment just made ?
379
-        $payment = isset($additional_details['payment_updates'], $additional_details['last_payment'])
380
-                   && $additional_details['payment_updates']
381
-                   && $additional_details['last_payment'] instanceof EE_Payment
382
-            ? $additional_details['last_payment']
383
-            : null;
384
-        $total_paid = array_sum(self::$_amount_paid);
385
-        // toggle reg status to approved IF
386
-        if (
27
+	/**
28
+	 * @var EE_Registration_Processor $_instance
29
+	 * @access    private
30
+	 */
31
+	private static $_instance;
32
+
33
+	/**
34
+	 * initial reg status at the beginning of this request.
35
+	 * indexed by registration ID
36
+	 *
37
+	 * @var array
38
+	 */
39
+	protected $_old_reg_status = array();
40
+
41
+	/**
42
+	 * reg status at the end of the request after all processing.
43
+	 * indexed by registration ID
44
+	 *
45
+	 * @var array
46
+	 */
47
+	protected $_new_reg_status = array();
48
+
49
+	/**
50
+	 * amounts paid at the end of the request after all processing.
51
+	 * indexed by registration ID
52
+	 *
53
+	 * @var array
54
+	 */
55
+	protected static $_amount_paid = array();
56
+
57
+	/**
58
+	 * Cache of the reg final price for registrations corresponding to a ticket line item
59
+	 *
60
+	 * @deprecated
61
+	 * @var array @see EEH_Line_Item::calculate_reg_final_prices_per_line_item()'s return value
62
+	 */
63
+	protected $_reg_final_price_per_tkt_line_item;
64
+
65
+	/**
66
+	 * @var EE_Request $request
67
+	 */
68
+	protected $request;
69
+
70
+
71
+	/**
72
+	 * @singleton method used to instantiate class object
73
+	 * @param EE_Request|null $request
74
+	 * @return EE_Registration_Processor instance
75
+	 * @throws \InvalidArgumentException
76
+	 * @throws \EventEspresso\core\exceptions\InvalidInterfaceException
77
+	 * @throws \EventEspresso\core\exceptions\InvalidDataTypeException
78
+	 */
79
+	public static function instance(EE_Request $request = null)
80
+	{
81
+		// check if class object is instantiated
82
+		if (! self::$_instance instanceof EE_Registration_Processor) {
83
+			if (! $request instanceof EE_Request) {
84
+				$request = LoaderFactory::getLoader()->getShared('EE_Request');
85
+			}
86
+			self::$_instance = new self($request);
87
+		}
88
+		return self::$_instance;
89
+	}
90
+
91
+
92
+	/**
93
+	 * EE_Registration_Processor constructor.
94
+	 *
95
+	 * @param EE_Request $request
96
+	 */
97
+	public function __construct(EE_Request $request)
98
+	{
99
+		$this->request = $request;
100
+	}
101
+
102
+
103
+	/**
104
+	 * @param int $REG_ID
105
+	 * @return string
106
+	 */
107
+	public function old_reg_status($REG_ID)
108
+	{
109
+		return isset($this->_old_reg_status[ $REG_ID ]) ? $this->_old_reg_status[ $REG_ID ] : null;
110
+	}
111
+
112
+
113
+	/**
114
+	 * @param int    $REG_ID
115
+	 * @param string $old_reg_status
116
+	 */
117
+	public function set_old_reg_status($REG_ID, $old_reg_status)
118
+	{
119
+		// only set the first time
120
+		if (! isset($this->_old_reg_status[ $REG_ID ])) {
121
+			$this->_old_reg_status[ $REG_ID ] = $old_reg_status;
122
+		}
123
+	}
124
+
125
+
126
+	/**
127
+	 * @param int $REG_ID
128
+	 * @return string
129
+	 */
130
+	public function new_reg_status($REG_ID)
131
+	{
132
+		return isset($this->_new_reg_status[ $REG_ID ]) ? $this->_new_reg_status[ $REG_ID ] : null;
133
+	}
134
+
135
+
136
+	/**
137
+	 * @param int    $REG_ID
138
+	 * @param string $new_reg_status
139
+	 */
140
+	public function set_new_reg_status($REG_ID, $new_reg_status)
141
+	{
142
+		$this->_new_reg_status[ $REG_ID ] = $new_reg_status;
143
+	}
144
+
145
+
146
+	/**
147
+	 * reg_status_updated
148
+	 *
149
+	 * @param int $REG_ID
150
+	 * @return bool
151
+	 */
152
+	public function reg_status_updated($REG_ID)
153
+	{
154
+		return $this->new_reg_status($REG_ID) !== $this->old_reg_status($REG_ID);
155
+	}
156
+
157
+
158
+	/**
159
+	 * @param EE_Registration $registration
160
+	 * @throws EE_Error
161
+	 * @throws EntityNotFoundException
162
+	 * @throws InvalidArgumentException
163
+	 * @throws InvalidDataTypeException
164
+	 * @throws InvalidInterfaceException
165
+	 * @throws ReflectionException
166
+	 * @throws RuntimeException
167
+	 */
168
+	public function update_registration_status_and_trigger_notifications(EE_Registration $registration)
169
+	{
170
+		$this->toggle_incomplete_registration_status_to_default($registration, false);
171
+		$this->toggle_registration_status_for_default_approved_events($registration, false);
172
+		$this->toggle_registration_status_if_no_monies_owing($registration, false);
173
+		$registration->save();
174
+		// trigger notifications
175
+		$this->trigger_registration_update_notifications($registration);
176
+	}
177
+
178
+
179
+	/**
180
+	 *    manually_update_registration_status
181
+	 *
182
+	 * @access public
183
+	 * @param EE_Registration $registration
184
+	 * @param string          $new_reg_status
185
+	 * @param bool            $save TRUE will save the registration if the status is updated, FALSE will leave that up
186
+	 *                              to client code
187
+	 * @return bool
188
+	 * @throws EE_Error
189
+	 * @throws EntityNotFoundException
190
+	 * @throws InvalidArgumentException
191
+	 * @throws InvalidDataTypeException
192
+	 * @throws InvalidInterfaceException
193
+	 * @throws ReflectionException
194
+	 * @throws RuntimeException
195
+	 */
196
+	public function manually_update_registration_status(
197
+		EE_Registration $registration,
198
+		$new_reg_status = '',
199
+		$save = true
200
+	) {
201
+		// set initial REG_Status
202
+		$this->set_old_reg_status($registration->ID(), $registration->status_ID());
203
+		// set incoming REG_Status
204
+		$this->set_new_reg_status($registration->ID(), $new_reg_status);
205
+		// toggle reg status but only if it has changed and the user can do so
206
+		if (
207
+			$this->reg_status_updated($registration->ID())
208
+			&& (
209
+				(! $this->request->isAdmin() || $this->request->isFrontAjax())
210
+				|| EE_Registry::instance()->CAP->current_user_can(
211
+					'ee_edit_registration',
212
+					'toggle_registration_status',
213
+					$registration->ID()
214
+				)
215
+			)
216
+		) {
217
+			// change status to new value
218
+			$updated = $registration->set_status($this->new_reg_status($registration->ID()));
219
+			if ($updated && $save) {
220
+				$registration->save();
221
+			}
222
+			return true;
223
+		}
224
+		return false;
225
+	}
226
+
227
+
228
+	/**
229
+	 *    toggle_incomplete_registration_status_to_default
230
+	 *        changes any incomplete registrations to either the event or global default registration status
231
+	 *
232
+	 * @access public
233
+	 * @param EE_Registration       $registration
234
+	 * @param bool                  $save TRUE will save the registration if the status is updated, FALSE will leave
235
+	 *                                    that up to client code
236
+	 * @param ContextInterface|null $context
237
+	 * @return void
238
+	 * @throws EE_Error
239
+	 * @throws InvalidArgumentException
240
+	 * @throws ReflectionException
241
+	 * @throws RuntimeException
242
+	 * @throws EntityNotFoundException
243
+	 * @throws InvalidDataTypeException
244
+	 * @throws InvalidInterfaceException
245
+	 */
246
+	public function toggle_incomplete_registration_status_to_default(
247
+		EE_Registration $registration,
248
+		$save = true,
249
+		ContextInterface $context = null
250
+	) {
251
+		$existing_reg_status = $registration->status_ID();
252
+		// set initial REG_Status
253
+		$this->set_old_reg_status($registration->ID(), $existing_reg_status);
254
+		// is the registration currently incomplete ?
255
+		if ($registration->status_ID() === EEM_Registration::status_id_incomplete) {
256
+			// grab default reg status for the event, if set
257
+			$event_default_registration_status = $registration->event()->default_registration_status();
258
+			// if no default reg status is set for the event, then use the global value
259
+			$STS_ID = ! empty($event_default_registration_status)
260
+				? $event_default_registration_status
261
+				: EE_Registry::instance()->CFG->registration->default_STS_ID;
262
+			// if the event default reg status is approved, then downgrade temporarily to payment pending to ensure that payments are triggered
263
+			$STS_ID = $STS_ID === EEM_Registration::status_id_approved ? EEM_Registration::status_id_pending_payment
264
+				: $STS_ID;
265
+			// set incoming REG_Status
266
+			$this->set_new_reg_status($registration->ID(), $STS_ID);
267
+			$registration->set_status($STS_ID, false, $context);
268
+			if ($save) {
269
+				$registration->save();
270
+			}
271
+			// don't trigger notifications during IPNs because they will get triggered by EE_Payment_Processor
272
+			if (! EE_Processor_Base::$IPN) {
273
+				// otherwise, send out notifications
274
+				add_filter('FHEE__EED_Messages___maybe_registration__deliver_notifications', '__return_true', 10);
275
+			}
276
+			// DEBUG LOG
277
+			// $this->log(
278
+			//     __CLASS__,
279
+			//     __FUNCTION__,
280
+			//     __LINE__,
281
+			//     $registration->transaction(),
282
+			//     array(
283
+			//         'IPN' => EE_Processor_Base::$IPN,
284
+			//         'deliver_notifications' => has_filter(
285
+			//             'FHEE__EED_Messages___maybe_registration__deliver_notifications'
286
+			//         ),
287
+			//     )
288
+			// );
289
+		}
290
+	}
291
+
292
+
293
+	/**
294
+	 *    toggle_registration_status_for_default_approved_events
295
+	 *
296
+	 * @access public
297
+	 * @param EE_Registration $registration
298
+	 * @param bool            $save TRUE will save the registration if the status is updated, FALSE will leave that up
299
+	 *                              to client code
300
+	 * @return bool
301
+	 * @throws EE_Error
302
+	 * @throws EntityNotFoundException
303
+	 * @throws InvalidArgumentException
304
+	 * @throws InvalidDataTypeException
305
+	 * @throws InvalidInterfaceException
306
+	 * @throws ReflectionException
307
+	 * @throws RuntimeException
308
+	 */
309
+	public function toggle_registration_status_for_default_approved_events(EE_Registration $registration, $save = true)
310
+	{
311
+		$reg_status = $registration->status_ID();
312
+		// set initial REG_Status
313
+		$this->set_old_reg_status($registration->ID(), $reg_status);
314
+		// if not already, toggle reg status to approved IF the event default reg status is approved
315
+		// ( as long as the registration wasn't cancelled or declined at some point )
316
+		if (
317
+			$reg_status !== EEM_Registration::status_id_cancelled
318
+			&& $reg_status
319
+			   !== EEM_Registration::status_id_declined
320
+			&& $reg_status !== EEM_Registration::status_id_approved
321
+			&& $registration->event()->default_registration_status() === EEM_Registration::status_id_approved
322
+		) {
323
+			// set incoming REG_Status
324
+			$this->set_new_reg_status($registration->ID(), EEM_Registration::status_id_approved);
325
+			// toggle status to approved
326
+			$registration->set_status(EEM_Registration::status_id_approved);
327
+			if ($save) {
328
+				$registration->save();
329
+			}
330
+			// don't trigger notifications during IPNs because they will get triggered by EE_Payment_Processor
331
+			if (! EE_Processor_Base::$IPN) {
332
+				// otherwise, send out notifications
333
+				add_filter('FHEE__EED_Messages___maybe_registration__deliver_notifications', '__return_true', 10);
334
+			}
335
+			// DEBUG LOG
336
+			// $this->log(
337
+			//     __CLASS__,
338
+			//     __FUNCTION__,
339
+			//     __LINE__,
340
+			//     $registration->transaction(),
341
+			//     array(
342
+			//         'IPN' => EE_Processor_Base::$IPN,
343
+			//         'deliver_notifications' => has_filter(
344
+			//             'FHEE__EED_Messages___maybe_registration__deliver_notifications'
345
+			//         ),
346
+			//     )
347
+			// );
348
+			return true;
349
+		}
350
+		return false;
351
+	}
352
+
353
+
354
+	/**
355
+	 *    toggle_registration_statuses_if_no_monies_owing
356
+	 *
357
+	 * @access public
358
+	 * @param EE_Registration $registration
359
+	 * @param bool            $save TRUE will save the registration if the status is updated, FALSE will leave that up
360
+	 *                              to client code
361
+	 * @param array           $additional_details
362
+	 * @return bool
363
+	 * @throws EE_Error
364
+	 * @throws EntityNotFoundException
365
+	 * @throws InvalidArgumentException
366
+	 * @throws InvalidDataTypeException
367
+	 * @throws InvalidInterfaceException
368
+	 * @throws ReflectionException
369
+	 * @throws RuntimeException
370
+	 */
371
+	public function toggle_registration_status_if_no_monies_owing(
372
+		EE_Registration $registration,
373
+		$save = true,
374
+		array $additional_details = array()
375
+	) {
376
+		// set initial REG_Status
377
+		$this->set_old_reg_status($registration->ID(), $registration->status_ID());
378
+		// was a payment just made ?
379
+		$payment = isset($additional_details['payment_updates'], $additional_details['last_payment'])
380
+				   && $additional_details['payment_updates']
381
+				   && $additional_details['last_payment'] instanceof EE_Payment
382
+			? $additional_details['last_payment']
383
+			: null;
384
+		$total_paid = array_sum(self::$_amount_paid);
385
+		// toggle reg status to approved IF
386
+		if (
387 387
 // REG status is pending payment
388
-            $registration->status_ID() === EEM_Registration::status_id_pending_payment
389
-            // AND no monies are owing
390
-            && (
391
-                (
392
-                    $registration->transaction()->is_completed()
393
-                    || $registration->transaction()->is_overpaid()
394
-                    || $registration->transaction()->is_free()
395
-                    || apply_filters(
396
-                        'FHEE__EE_Registration_Processor__toggle_registration_status_if_no_monies_owing',
397
-                        false,
398
-                        $registration
399
-                    )
400
-                )
401
-                || (
402
-                    $payment instanceof EE_Payment && $payment->is_approved()
403
-                    && // this specific registration has not yet been paid for
404
-                    ! isset(self::$_amount_paid[ $registration->ID() ])
405
-                    && // payment amount, less what we have already attributed to other registrations, is greater than this reg's final price
406
-                    $payment->amount() - $total_paid >= $registration->final_price()
407
-                )
408
-            )
409
-        ) {
410
-            // mark as paid
411
-            self::$_amount_paid[ $registration->ID() ] = $registration->final_price();
412
-            // track new REG_Status
413
-            $this->set_new_reg_status($registration->ID(), EEM_Registration::status_id_approved);
414
-            // toggle status to approved
415
-            $registration->set_status(EEM_Registration::status_id_approved);
416
-            if ($save) {
417
-                $registration->save();
418
-            }
419
-            // don't trigger notifications during IPNs because they will get triggered by EE_Payment_Processor
420
-            if (! EE_Processor_Base::$IPN) {
421
-                // otherwise, send out notifications
422
-                add_filter('FHEE__EED_Messages___maybe_registration__deliver_notifications', '__return_true', 10);
423
-            }
424
-            // DEBUG LOG
425
-            // $this->log(
426
-            //     __CLASS__,
427
-            //     __FUNCTION__,
428
-            //     __LINE__,
429
-            //     $registration->transaction(),
430
-            //     array(
431
-            //         'IPN' => EE_Processor_Base::$IPN,
432
-            //         'deliver_notifications' => has_filter(
433
-            //             'FHEE__EED_Messages___maybe_registration__deliver_notifications'
434
-            //         ),
435
-            //     )
436
-            // );
437
-            return true;
438
-        }
439
-        return false;
440
-    }
441
-
442
-
443
-    /**
444
-     *    registration_status_changed
445
-     *
446
-     * @access public
447
-     * @param EE_Registration $registration
448
-     * @param array           $additional_details
449
-     * @return void
450
-     */
451
-    public function trigger_registration_update_notifications($registration, array $additional_details = array())
452
-    {
453
-        try {
454
-            if (! $registration instanceof EE_Registration) {
455
-                throw new EE_Error(
456
-                    esc_html__('An invalid registration was received.', 'event_espresso')
457
-                );
458
-            }
459
-            // EE_Registry::instance()->load_helper('Debug_Tools');
460
-            // EEH_Debug_Tools::log(
461
-            //     __CLASS__,
462
-            //     __FUNCTION__,
463
-            //     __LINE__,
464
-            //     array($registration->transaction(), $additional_details),
465
-            //     false,
466
-            //     'EE_Transaction: ' . $registration->transaction()->ID()
467
-            // );
468
-            if (! $registration->is_primary_registrant()) {
469
-                return;
470
-            }
471
-            do_action(
472
-                'AHEE__EE_Registration_Processor__trigger_registration_update_notifications',
473
-                $registration,
474
-                $additional_details
475
-            );
476
-        } catch (Exception $e) {
477
-            EE_Error::add_error($e->getMessage(), $e->getFile(), 'unknown_function_from_exception', $e->getLine());
478
-        }
479
-    }
480
-
481
-
482
-    /**
483
-     * sets reg status based either on passed param or on transaction status and event pre-approval setting
484
-     *
485
-     * @param EE_Registration $registration
486
-     * @param array           $additional_details
487
-     * @return bool
488
-     * @throws EE_Error
489
-     * @throws EntityNotFoundException
490
-     * @throws InvalidArgumentException
491
-     * @throws InvalidDataTypeException
492
-     * @throws InvalidInterfaceException
493
-     * @throws ReflectionException
494
-     * @throws RuntimeException
495
-     */
496
-    public function update_registration_after_checkout_or_payment(
497
-        EE_Registration $registration,
498
-        array $additional_details = array()
499
-    ) {
500
-        // set initial REG_Status
501
-        $this->set_old_reg_status($registration->ID(), $registration->status_ID());
502
-        // if the registration status gets updated, then save the registration
503
-        if (
504
-            $this->toggle_registration_status_for_default_approved_events($registration, false)
505
-            || $this->toggle_registration_status_if_no_monies_owing(
506
-                $registration,
507
-                false,
508
-                $additional_details
509
-            )
510
-        ) {
511
-            $registration->save();
512
-        }
513
-        // set new  REG_Status
514
-        $this->set_new_reg_status($registration->ID(), $registration->status_ID());
515
-        return $this->reg_status_updated($registration->ID())
516
-               && $this->new_reg_status($registration->ID()) === EEM_Registration::status_id_approved;
517
-    }
518
-
519
-
520
-    /**
521
-     * Updates the registration' final prices based on the current line item tree (taking into account
522
-     * discounts, taxes, and other line items unrelated to tickets.)
523
-     *
524
-     * @param EE_Transaction $transaction
525
-     * @param boolean        $save_regs whether to immediately save registrations in this function or not
526
-     * @return void
527
-     * @throws EE_Error
528
-     * @throws InvalidArgumentException
529
-     * @throws InvalidDataTypeException
530
-     * @throws InvalidInterfaceException
531
-     * @throws RuntimeException
532
-     */
533
-    public function update_registration_final_prices($transaction, $save_regs = true)
534
-    {
535
-        $reg_final_price_per_ticket_line_item = EEH_Line_Item::calculate_reg_final_prices_per_line_item(
536
-            $transaction->total_line_item()
537
-        );
538
-        foreach ($transaction->registrations() as $registration) {
539
-            /** @var EE_Line_Item $line_item */
540
-            $line_item = EEM_Line_Item::instance()->get_line_item_for_registration($registration);
541
-            if (isset($reg_final_price_per_ticket_line_item[ $line_item->ID() ])) {
542
-                $registration->set_final_price($reg_final_price_per_ticket_line_item[ $line_item->ID() ]);
543
-                if ($save_regs) {
544
-                    $registration->save();
545
-                }
546
-            }
547
-        }
548
-        // and make sure there's no rounding problem
549
-        $this->fix_reg_final_price_rounding_issue($transaction);
550
-    }
551
-
552
-
553
-    /**
554
-     * Makes sure there is no rounding errors for the REG_final_prices.
555
-     * Eg, if we have 3 registrations for $1, and there is a $0.01 discount between the three of them,
556
-     * they will each be for $0.99333333, which gets rounded to $1 again.
557
-     * So the transaction total will be $2.99, but each registration will be for $1,
558
-     * so if each registrant paid individually they will have overpaid by $0.01.
559
-     * So in order to overcome this, we check for any difference, and if there is a difference
560
-     * we just grab one registrant at random and make them responsible for it.
561
-     * This should be used after setting REG_final_prices (it's done automatically as part of
562
-     * EE_Registration_Processor::update_registration_final_prices())
563
-     *
564
-     * @param EE_Transaction $transaction
565
-     * @return bool success verifying that there is NO difference after this method is done
566
-     * @throws EE_Error
567
-     * @throws InvalidArgumentException
568
-     * @throws InvalidDataTypeException
569
-     * @throws InvalidInterfaceException
570
-     */
571
-    public function fix_reg_final_price_rounding_issue($transaction)
572
-    {
573
-        $reg_final_price_sum = EEM_Registration::instance()->sum(
574
-            array(
575
-                array(
576
-                    'TXN_ID' => $transaction->ID(),
577
-                ),
578
-            ),
579
-            'REG_final_price'
580
-        );
581
-        $diff = $transaction->total() - $reg_final_price_sum;
582
-        // ok then, just grab one of the registrations
583
-        if ($diff !== 0) {
584
-            $a_reg = EEM_Registration::instance()->get_one(
585
-                array(
586
-                    array(
587
-                        'TXN_ID' => $transaction->ID(),
588
-                    ),
589
-                )
590
-            );
591
-            return $a_reg instanceof EE_Registration
592
-                ? (bool) $a_reg->save(array('REG_final_price' => $a_reg->final_price() + $diff))
593
-                : false;
594
-        }
595
-        return true;
596
-    }
597
-
598
-
599
-    /**
600
-     * update_registration_after_being_canceled_or_declined
601
-     *
602
-     * @param EE_Registration $registration
603
-     * @param array           $closed_reg_statuses
604
-     * @param bool            $update_reg
605
-     * @return bool
606
-     * @throws EE_Error
607
-     * @throws RuntimeException
608
-     */
609
-    public function update_registration_after_being_canceled_or_declined(
610
-        EE_Registration $registration,
611
-        array $closed_reg_statuses = array(),
612
-        $update_reg = true
613
-    ) {
614
-        // these reg statuses should not be considered in any calculations involving monies owing
615
-        $closed_reg_statuses = ! empty($closed_reg_statuses)
616
-            ? $closed_reg_statuses
617
-            : EEM_Registration::closed_reg_statuses();
618
-        if (! in_array($registration->status_ID(), $closed_reg_statuses, true)) {
619
-            return false;
620
-        }
621
-        // release a reserved ticket by decrementing ticket and datetime reserved values
622
-        $registration->release_reserved_ticket(true, 'RegProcessor:' . __LINE__);
623
-        $registration->set_final_price(0);
624
-        if ($update_reg) {
625
-            $registration->save();
626
-        }
627
-        return true;
628
-    }
629
-
630
-
631
-    /**
632
-     * update_canceled_or_declined_registration_after_being_reinstated
633
-     *
634
-     * @param EE_Registration $registration
635
-     * @param array           $closed_reg_statuses
636
-     * @param bool            $update_reg
637
-     * @return bool
638
-     * @throws EE_Error
639
-     * @throws RuntimeException
640
-     */
641
-    public function update_canceled_or_declined_registration_after_being_reinstated(
642
-        EE_Registration $registration,
643
-        array $closed_reg_statuses = array(),
644
-        $update_reg = true
645
-    ) {
646
-        // these reg statuses should not be considered in any calculations involving monies owing
647
-        $closed_reg_statuses = ! empty($closed_reg_statuses) ? $closed_reg_statuses
648
-            : EEM_Registration::closed_reg_statuses();
649
-        if (in_array($registration->status_ID(), $closed_reg_statuses, true)) {
650
-            return false;
651
-        }
652
-        $ticket = $registration->ticket();
653
-        if (! $ticket instanceof EE_Ticket) {
654
-            throw new EE_Error(
655
-                sprintf(
656
-                    esc_html__(
657
-                        'The Ticket for Registration %1$d was not found or is invalid.',
658
-                        'event_espresso'
659
-                    ),
660
-                    $registration->ticket_ID()
661
-                )
662
-            );
663
-        }
664
-        $registration->set_final_price($ticket->price());
665
-        if ($update_reg) {
666
-            $registration->save();
667
-        }
668
-        return true;
669
-    }
670
-
671
-
672
-    /**
673
-     * generate_ONE_registration_from_line_item
674
-     * Although a ticket line item may have a quantity greater than 1,
675
-     * this method will ONLY CREATE ONE REGISTRATION !!!
676
-     * Regardless of the ticket line item quantity.
677
-     * This means that any code calling this method is responsible for ensuring
678
-     * that the final registration count matches the ticket line item quantity.
679
-     * This was done to make it easier to match the number of registrations
680
-     * to the number of tickets in the cart, when the cart has been edited
681
-     * after SPCO has already been initialized. So if an additional ticket was added to the cart, you can simply pass
682
-     * the line item to this method to add a second ticket, and in this case, you would not want to add 2 tickets.
683
-     *
684
-     * @deprecated
685
-     * @since 4.9.1
686
-     * @param EE_Line_Item    $line_item
687
-     * @param \EE_Transaction $transaction
688
-     * @param int             $att_nmbr
689
-     * @param int             $total_ticket_count
690
-     * @return EE_Registration | null
691
-     * @throws \OutOfRangeException
692
-     * @throws \EventEspresso\core\exceptions\UnexpectedEntityException
693
-     * @throws \EE_Error
694
-     */
695
-    public function generate_ONE_registration_from_line_item(
696
-        EE_Line_Item $line_item,
697
-        EE_Transaction $transaction,
698
-        $att_nmbr = 1,
699
-        $total_ticket_count = 1
700
-    ) {
701
-        EE_Error::doing_it_wrong(
702
-            __CLASS__ . '::' . __FUNCTION__,
703
-            sprintf(
704
-                esc_html__('This method is deprecated. Please use "%s" instead', 'event_espresso'),
705
-                '\EventEspresso\core\domain\services\registration\CreateRegistrationService::create()'
706
-            ),
707
-            '4.9.1',
708
-            '5.0.0'
709
-        );
710
-        // grab the related ticket object for this line_item
711
-        $ticket = $line_item->ticket();
712
-        if (! $ticket instanceof EE_Ticket) {
713
-            EE_Error::add_error(
714
-                sprintf(
715
-                    esc_html__('Line item %s did not contain a valid ticket', 'event_espresso'),
716
-                    $line_item->ID()
717
-                ),
718
-                __FILE__,
719
-                __FUNCTION__,
720
-                __LINE__
721
-            );
722
-            return null;
723
-        }
724
-        $registration_service = new CreateRegistrationService();
725
-        // then generate a new registration from that
726
-        return $registration_service->create(
727
-            $ticket->get_related_event(),
728
-            $transaction,
729
-            $ticket,
730
-            $line_item,
731
-            $att_nmbr,
732
-            $total_ticket_count
733
-        );
734
-    }
735
-
736
-
737
-    /**
738
-     * generates reg_url_link
739
-     *
740
-     * @deprecated
741
-     * @since 4.9.1
742
-     * @param int                   $att_nmbr
743
-     * @param EE_Line_Item | string $item
744
-     * @return string
745
-     * @throws InvalidArgumentException
746
-     */
747
-    public function generate_reg_url_link($att_nmbr, $item)
748
-    {
749
-        EE_Error::doing_it_wrong(
750
-            __CLASS__ . '::' . __FUNCTION__,
751
-            sprintf(
752
-                esc_html__('This method is deprecated. Please use "%s" instead', 'event_espresso'),
753
-                'EventEspresso\core\domain\entities\RegUrlLink'
754
-            ),
755
-            '4.9.1',
756
-            '5.0.0'
757
-        );
758
-        return new RegUrlLink($att_nmbr, $item);
759
-    }
760
-
761
-
762
-    /**
763
-     * generates reg code
764
-     *
765
-     * @deprecated
766
-     * @since 4.9.1
767
-     * @param EE_Registration $registration
768
-     * @return string
769
-     * @throws EE_Error
770
-     * @throws EntityNotFoundException
771
-     * @throws InvalidArgumentException
772
-     */
773
-    public function generate_reg_code(EE_Registration $registration)
774
-    {
775
-        EE_Error::doing_it_wrong(
776
-            __CLASS__ . '::' . __FUNCTION__,
777
-            sprintf(
778
-                esc_html__('This method is deprecated. Please use "%s" instead', 'event_espresso'),
779
-                'EventEspresso\core\domain\entities\RegCode'
780
-            ),
781
-            '4.9.1',
782
-            '5.0.0'
783
-        );
784
-        return apply_filters(
785
-            'FHEE__EE_Registration_Processor___generate_reg_code__new_reg_code',
786
-            new RegCode(
787
-                RegUrlLink::fromRegistration($registration),
788
-                $registration->transaction(),
789
-                $registration->ticket()
790
-            ),
791
-            $registration
792
-        );
793
-    }
388
+			$registration->status_ID() === EEM_Registration::status_id_pending_payment
389
+			// AND no monies are owing
390
+			&& (
391
+				(
392
+					$registration->transaction()->is_completed()
393
+					|| $registration->transaction()->is_overpaid()
394
+					|| $registration->transaction()->is_free()
395
+					|| apply_filters(
396
+						'FHEE__EE_Registration_Processor__toggle_registration_status_if_no_monies_owing',
397
+						false,
398
+						$registration
399
+					)
400
+				)
401
+				|| (
402
+					$payment instanceof EE_Payment && $payment->is_approved()
403
+					&& // this specific registration has not yet been paid for
404
+					! isset(self::$_amount_paid[ $registration->ID() ])
405
+					&& // payment amount, less what we have already attributed to other registrations, is greater than this reg's final price
406
+					$payment->amount() - $total_paid >= $registration->final_price()
407
+				)
408
+			)
409
+		) {
410
+			// mark as paid
411
+			self::$_amount_paid[ $registration->ID() ] = $registration->final_price();
412
+			// track new REG_Status
413
+			$this->set_new_reg_status($registration->ID(), EEM_Registration::status_id_approved);
414
+			// toggle status to approved
415
+			$registration->set_status(EEM_Registration::status_id_approved);
416
+			if ($save) {
417
+				$registration->save();
418
+			}
419
+			// don't trigger notifications during IPNs because they will get triggered by EE_Payment_Processor
420
+			if (! EE_Processor_Base::$IPN) {
421
+				// otherwise, send out notifications
422
+				add_filter('FHEE__EED_Messages___maybe_registration__deliver_notifications', '__return_true', 10);
423
+			}
424
+			// DEBUG LOG
425
+			// $this->log(
426
+			//     __CLASS__,
427
+			//     __FUNCTION__,
428
+			//     __LINE__,
429
+			//     $registration->transaction(),
430
+			//     array(
431
+			//         'IPN' => EE_Processor_Base::$IPN,
432
+			//         'deliver_notifications' => has_filter(
433
+			//             'FHEE__EED_Messages___maybe_registration__deliver_notifications'
434
+			//         ),
435
+			//     )
436
+			// );
437
+			return true;
438
+		}
439
+		return false;
440
+	}
441
+
442
+
443
+	/**
444
+	 *    registration_status_changed
445
+	 *
446
+	 * @access public
447
+	 * @param EE_Registration $registration
448
+	 * @param array           $additional_details
449
+	 * @return void
450
+	 */
451
+	public function trigger_registration_update_notifications($registration, array $additional_details = array())
452
+	{
453
+		try {
454
+			if (! $registration instanceof EE_Registration) {
455
+				throw new EE_Error(
456
+					esc_html__('An invalid registration was received.', 'event_espresso')
457
+				);
458
+			}
459
+			// EE_Registry::instance()->load_helper('Debug_Tools');
460
+			// EEH_Debug_Tools::log(
461
+			//     __CLASS__,
462
+			//     __FUNCTION__,
463
+			//     __LINE__,
464
+			//     array($registration->transaction(), $additional_details),
465
+			//     false,
466
+			//     'EE_Transaction: ' . $registration->transaction()->ID()
467
+			// );
468
+			if (! $registration->is_primary_registrant()) {
469
+				return;
470
+			}
471
+			do_action(
472
+				'AHEE__EE_Registration_Processor__trigger_registration_update_notifications',
473
+				$registration,
474
+				$additional_details
475
+			);
476
+		} catch (Exception $e) {
477
+			EE_Error::add_error($e->getMessage(), $e->getFile(), 'unknown_function_from_exception', $e->getLine());
478
+		}
479
+	}
480
+
481
+
482
+	/**
483
+	 * sets reg status based either on passed param or on transaction status and event pre-approval setting
484
+	 *
485
+	 * @param EE_Registration $registration
486
+	 * @param array           $additional_details
487
+	 * @return bool
488
+	 * @throws EE_Error
489
+	 * @throws EntityNotFoundException
490
+	 * @throws InvalidArgumentException
491
+	 * @throws InvalidDataTypeException
492
+	 * @throws InvalidInterfaceException
493
+	 * @throws ReflectionException
494
+	 * @throws RuntimeException
495
+	 */
496
+	public function update_registration_after_checkout_or_payment(
497
+		EE_Registration $registration,
498
+		array $additional_details = array()
499
+	) {
500
+		// set initial REG_Status
501
+		$this->set_old_reg_status($registration->ID(), $registration->status_ID());
502
+		// if the registration status gets updated, then save the registration
503
+		if (
504
+			$this->toggle_registration_status_for_default_approved_events($registration, false)
505
+			|| $this->toggle_registration_status_if_no_monies_owing(
506
+				$registration,
507
+				false,
508
+				$additional_details
509
+			)
510
+		) {
511
+			$registration->save();
512
+		}
513
+		// set new  REG_Status
514
+		$this->set_new_reg_status($registration->ID(), $registration->status_ID());
515
+		return $this->reg_status_updated($registration->ID())
516
+			   && $this->new_reg_status($registration->ID()) === EEM_Registration::status_id_approved;
517
+	}
518
+
519
+
520
+	/**
521
+	 * Updates the registration' final prices based on the current line item tree (taking into account
522
+	 * discounts, taxes, and other line items unrelated to tickets.)
523
+	 *
524
+	 * @param EE_Transaction $transaction
525
+	 * @param boolean        $save_regs whether to immediately save registrations in this function or not
526
+	 * @return void
527
+	 * @throws EE_Error
528
+	 * @throws InvalidArgumentException
529
+	 * @throws InvalidDataTypeException
530
+	 * @throws InvalidInterfaceException
531
+	 * @throws RuntimeException
532
+	 */
533
+	public function update_registration_final_prices($transaction, $save_regs = true)
534
+	{
535
+		$reg_final_price_per_ticket_line_item = EEH_Line_Item::calculate_reg_final_prices_per_line_item(
536
+			$transaction->total_line_item()
537
+		);
538
+		foreach ($transaction->registrations() as $registration) {
539
+			/** @var EE_Line_Item $line_item */
540
+			$line_item = EEM_Line_Item::instance()->get_line_item_for_registration($registration);
541
+			if (isset($reg_final_price_per_ticket_line_item[ $line_item->ID() ])) {
542
+				$registration->set_final_price($reg_final_price_per_ticket_line_item[ $line_item->ID() ]);
543
+				if ($save_regs) {
544
+					$registration->save();
545
+				}
546
+			}
547
+		}
548
+		// and make sure there's no rounding problem
549
+		$this->fix_reg_final_price_rounding_issue($transaction);
550
+	}
551
+
552
+
553
+	/**
554
+	 * Makes sure there is no rounding errors for the REG_final_prices.
555
+	 * Eg, if we have 3 registrations for $1, and there is a $0.01 discount between the three of them,
556
+	 * they will each be for $0.99333333, which gets rounded to $1 again.
557
+	 * So the transaction total will be $2.99, but each registration will be for $1,
558
+	 * so if each registrant paid individually they will have overpaid by $0.01.
559
+	 * So in order to overcome this, we check for any difference, and if there is a difference
560
+	 * we just grab one registrant at random and make them responsible for it.
561
+	 * This should be used after setting REG_final_prices (it's done automatically as part of
562
+	 * EE_Registration_Processor::update_registration_final_prices())
563
+	 *
564
+	 * @param EE_Transaction $transaction
565
+	 * @return bool success verifying that there is NO difference after this method is done
566
+	 * @throws EE_Error
567
+	 * @throws InvalidArgumentException
568
+	 * @throws InvalidDataTypeException
569
+	 * @throws InvalidInterfaceException
570
+	 */
571
+	public function fix_reg_final_price_rounding_issue($transaction)
572
+	{
573
+		$reg_final_price_sum = EEM_Registration::instance()->sum(
574
+			array(
575
+				array(
576
+					'TXN_ID' => $transaction->ID(),
577
+				),
578
+			),
579
+			'REG_final_price'
580
+		);
581
+		$diff = $transaction->total() - $reg_final_price_sum;
582
+		// ok then, just grab one of the registrations
583
+		if ($diff !== 0) {
584
+			$a_reg = EEM_Registration::instance()->get_one(
585
+				array(
586
+					array(
587
+						'TXN_ID' => $transaction->ID(),
588
+					),
589
+				)
590
+			);
591
+			return $a_reg instanceof EE_Registration
592
+				? (bool) $a_reg->save(array('REG_final_price' => $a_reg->final_price() + $diff))
593
+				: false;
594
+		}
595
+		return true;
596
+	}
597
+
598
+
599
+	/**
600
+	 * update_registration_after_being_canceled_or_declined
601
+	 *
602
+	 * @param EE_Registration $registration
603
+	 * @param array           $closed_reg_statuses
604
+	 * @param bool            $update_reg
605
+	 * @return bool
606
+	 * @throws EE_Error
607
+	 * @throws RuntimeException
608
+	 */
609
+	public function update_registration_after_being_canceled_or_declined(
610
+		EE_Registration $registration,
611
+		array $closed_reg_statuses = array(),
612
+		$update_reg = true
613
+	) {
614
+		// these reg statuses should not be considered in any calculations involving monies owing
615
+		$closed_reg_statuses = ! empty($closed_reg_statuses)
616
+			? $closed_reg_statuses
617
+			: EEM_Registration::closed_reg_statuses();
618
+		if (! in_array($registration->status_ID(), $closed_reg_statuses, true)) {
619
+			return false;
620
+		}
621
+		// release a reserved ticket by decrementing ticket and datetime reserved values
622
+		$registration->release_reserved_ticket(true, 'RegProcessor:' . __LINE__);
623
+		$registration->set_final_price(0);
624
+		if ($update_reg) {
625
+			$registration->save();
626
+		}
627
+		return true;
628
+	}
629
+
630
+
631
+	/**
632
+	 * update_canceled_or_declined_registration_after_being_reinstated
633
+	 *
634
+	 * @param EE_Registration $registration
635
+	 * @param array           $closed_reg_statuses
636
+	 * @param bool            $update_reg
637
+	 * @return bool
638
+	 * @throws EE_Error
639
+	 * @throws RuntimeException
640
+	 */
641
+	public function update_canceled_or_declined_registration_after_being_reinstated(
642
+		EE_Registration $registration,
643
+		array $closed_reg_statuses = array(),
644
+		$update_reg = true
645
+	) {
646
+		// these reg statuses should not be considered in any calculations involving monies owing
647
+		$closed_reg_statuses = ! empty($closed_reg_statuses) ? $closed_reg_statuses
648
+			: EEM_Registration::closed_reg_statuses();
649
+		if (in_array($registration->status_ID(), $closed_reg_statuses, true)) {
650
+			return false;
651
+		}
652
+		$ticket = $registration->ticket();
653
+		if (! $ticket instanceof EE_Ticket) {
654
+			throw new EE_Error(
655
+				sprintf(
656
+					esc_html__(
657
+						'The Ticket for Registration %1$d was not found or is invalid.',
658
+						'event_espresso'
659
+					),
660
+					$registration->ticket_ID()
661
+				)
662
+			);
663
+		}
664
+		$registration->set_final_price($ticket->price());
665
+		if ($update_reg) {
666
+			$registration->save();
667
+		}
668
+		return true;
669
+	}
670
+
671
+
672
+	/**
673
+	 * generate_ONE_registration_from_line_item
674
+	 * Although a ticket line item may have a quantity greater than 1,
675
+	 * this method will ONLY CREATE ONE REGISTRATION !!!
676
+	 * Regardless of the ticket line item quantity.
677
+	 * This means that any code calling this method is responsible for ensuring
678
+	 * that the final registration count matches the ticket line item quantity.
679
+	 * This was done to make it easier to match the number of registrations
680
+	 * to the number of tickets in the cart, when the cart has been edited
681
+	 * after SPCO has already been initialized. So if an additional ticket was added to the cart, you can simply pass
682
+	 * the line item to this method to add a second ticket, and in this case, you would not want to add 2 tickets.
683
+	 *
684
+	 * @deprecated
685
+	 * @since 4.9.1
686
+	 * @param EE_Line_Item    $line_item
687
+	 * @param \EE_Transaction $transaction
688
+	 * @param int             $att_nmbr
689
+	 * @param int             $total_ticket_count
690
+	 * @return EE_Registration | null
691
+	 * @throws \OutOfRangeException
692
+	 * @throws \EventEspresso\core\exceptions\UnexpectedEntityException
693
+	 * @throws \EE_Error
694
+	 */
695
+	public function generate_ONE_registration_from_line_item(
696
+		EE_Line_Item $line_item,
697
+		EE_Transaction $transaction,
698
+		$att_nmbr = 1,
699
+		$total_ticket_count = 1
700
+	) {
701
+		EE_Error::doing_it_wrong(
702
+			__CLASS__ . '::' . __FUNCTION__,
703
+			sprintf(
704
+				esc_html__('This method is deprecated. Please use "%s" instead', 'event_espresso'),
705
+				'\EventEspresso\core\domain\services\registration\CreateRegistrationService::create()'
706
+			),
707
+			'4.9.1',
708
+			'5.0.0'
709
+		);
710
+		// grab the related ticket object for this line_item
711
+		$ticket = $line_item->ticket();
712
+		if (! $ticket instanceof EE_Ticket) {
713
+			EE_Error::add_error(
714
+				sprintf(
715
+					esc_html__('Line item %s did not contain a valid ticket', 'event_espresso'),
716
+					$line_item->ID()
717
+				),
718
+				__FILE__,
719
+				__FUNCTION__,
720
+				__LINE__
721
+			);
722
+			return null;
723
+		}
724
+		$registration_service = new CreateRegistrationService();
725
+		// then generate a new registration from that
726
+		return $registration_service->create(
727
+			$ticket->get_related_event(),
728
+			$transaction,
729
+			$ticket,
730
+			$line_item,
731
+			$att_nmbr,
732
+			$total_ticket_count
733
+		);
734
+	}
735
+
736
+
737
+	/**
738
+	 * generates reg_url_link
739
+	 *
740
+	 * @deprecated
741
+	 * @since 4.9.1
742
+	 * @param int                   $att_nmbr
743
+	 * @param EE_Line_Item | string $item
744
+	 * @return string
745
+	 * @throws InvalidArgumentException
746
+	 */
747
+	public function generate_reg_url_link($att_nmbr, $item)
748
+	{
749
+		EE_Error::doing_it_wrong(
750
+			__CLASS__ . '::' . __FUNCTION__,
751
+			sprintf(
752
+				esc_html__('This method is deprecated. Please use "%s" instead', 'event_espresso'),
753
+				'EventEspresso\core\domain\entities\RegUrlLink'
754
+			),
755
+			'4.9.1',
756
+			'5.0.0'
757
+		);
758
+		return new RegUrlLink($att_nmbr, $item);
759
+	}
760
+
761
+
762
+	/**
763
+	 * generates reg code
764
+	 *
765
+	 * @deprecated
766
+	 * @since 4.9.1
767
+	 * @param EE_Registration $registration
768
+	 * @return string
769
+	 * @throws EE_Error
770
+	 * @throws EntityNotFoundException
771
+	 * @throws InvalidArgumentException
772
+	 */
773
+	public function generate_reg_code(EE_Registration $registration)
774
+	{
775
+		EE_Error::doing_it_wrong(
776
+			__CLASS__ . '::' . __FUNCTION__,
777
+			sprintf(
778
+				esc_html__('This method is deprecated. Please use "%s" instead', 'event_espresso'),
779
+				'EventEspresso\core\domain\entities\RegCode'
780
+			),
781
+			'4.9.1',
782
+			'5.0.0'
783
+		);
784
+		return apply_filters(
785
+			'FHEE__EE_Registration_Processor___generate_reg_code__new_reg_code',
786
+			new RegCode(
787
+				RegUrlLink::fromRegistration($registration),
788
+				$registration->transaction(),
789
+				$registration->ticket()
790
+			),
791
+			$registration
792
+		);
793
+	}
794 794
 }
Please login to merge, or discard this patch.
Spacing   +24 added lines, -24 removed lines patch added patch discarded remove patch
@@ -79,8 +79,8 @@  discard block
 block discarded – undo
79 79
     public static function instance(EE_Request $request = null)
80 80
     {
81 81
         // check if class object is instantiated
82
-        if (! self::$_instance instanceof EE_Registration_Processor) {
83
-            if (! $request instanceof EE_Request) {
82
+        if ( ! self::$_instance instanceof EE_Registration_Processor) {
83
+            if ( ! $request instanceof EE_Request) {
84 84
                 $request = LoaderFactory::getLoader()->getShared('EE_Request');
85 85
             }
86 86
             self::$_instance = new self($request);
@@ -106,7 +106,7 @@  discard block
 block discarded – undo
106 106
      */
107 107
     public function old_reg_status($REG_ID)
108 108
     {
109
-        return isset($this->_old_reg_status[ $REG_ID ]) ? $this->_old_reg_status[ $REG_ID ] : null;
109
+        return isset($this->_old_reg_status[$REG_ID]) ? $this->_old_reg_status[$REG_ID] : null;
110 110
     }
111 111
 
112 112
 
@@ -117,8 +117,8 @@  discard block
 block discarded – undo
117 117
     public function set_old_reg_status($REG_ID, $old_reg_status)
118 118
     {
119 119
         // only set the first time
120
-        if (! isset($this->_old_reg_status[ $REG_ID ])) {
121
-            $this->_old_reg_status[ $REG_ID ] = $old_reg_status;
120
+        if ( ! isset($this->_old_reg_status[$REG_ID])) {
121
+            $this->_old_reg_status[$REG_ID] = $old_reg_status;
122 122
         }
123 123
     }
124 124
 
@@ -129,7 +129,7 @@  discard block
 block discarded – undo
129 129
      */
130 130
     public function new_reg_status($REG_ID)
131 131
     {
132
-        return isset($this->_new_reg_status[ $REG_ID ]) ? $this->_new_reg_status[ $REG_ID ] : null;
132
+        return isset($this->_new_reg_status[$REG_ID]) ? $this->_new_reg_status[$REG_ID] : null;
133 133
     }
134 134
 
135 135
 
@@ -139,7 +139,7 @@  discard block
 block discarded – undo
139 139
      */
140 140
     public function set_new_reg_status($REG_ID, $new_reg_status)
141 141
     {
142
-        $this->_new_reg_status[ $REG_ID ] = $new_reg_status;
142
+        $this->_new_reg_status[$REG_ID] = $new_reg_status;
143 143
     }
144 144
 
145 145
 
@@ -206,7 +206,7 @@  discard block
 block discarded – undo
206 206
         if (
207 207
             $this->reg_status_updated($registration->ID())
208 208
             && (
209
-                (! $this->request->isAdmin() || $this->request->isFrontAjax())
209
+                ( ! $this->request->isAdmin() || $this->request->isFrontAjax())
210 210
                 || EE_Registry::instance()->CAP->current_user_can(
211 211
                     'ee_edit_registration',
212 212
                     'toggle_registration_status',
@@ -269,7 +269,7 @@  discard block
 block discarded – undo
269 269
                 $registration->save();
270 270
             }
271 271
             // don't trigger notifications during IPNs because they will get triggered by EE_Payment_Processor
272
-            if (! EE_Processor_Base::$IPN) {
272
+            if ( ! EE_Processor_Base::$IPN) {
273 273
                 // otherwise, send out notifications
274 274
                 add_filter('FHEE__EED_Messages___maybe_registration__deliver_notifications', '__return_true', 10);
275 275
             }
@@ -328,7 +328,7 @@  discard block
 block discarded – undo
328 328
                 $registration->save();
329 329
             }
330 330
             // don't trigger notifications during IPNs because they will get triggered by EE_Payment_Processor
331
-            if (! EE_Processor_Base::$IPN) {
331
+            if ( ! EE_Processor_Base::$IPN) {
332 332
                 // otherwise, send out notifications
333 333
                 add_filter('FHEE__EED_Messages___maybe_registration__deliver_notifications', '__return_true', 10);
334 334
             }
@@ -401,14 +401,14 @@  discard block
 block discarded – undo
401 401
                 || (
402 402
                     $payment instanceof EE_Payment && $payment->is_approved()
403 403
                     && // this specific registration has not yet been paid for
404
-                    ! isset(self::$_amount_paid[ $registration->ID() ])
404
+                    ! isset(self::$_amount_paid[$registration->ID()])
405 405
                     && // payment amount, less what we have already attributed to other registrations, is greater than this reg's final price
406 406
                     $payment->amount() - $total_paid >= $registration->final_price()
407 407
                 )
408 408
             )
409 409
         ) {
410 410
             // mark as paid
411
-            self::$_amount_paid[ $registration->ID() ] = $registration->final_price();
411
+            self::$_amount_paid[$registration->ID()] = $registration->final_price();
412 412
             // track new REG_Status
413 413
             $this->set_new_reg_status($registration->ID(), EEM_Registration::status_id_approved);
414 414
             // toggle status to approved
@@ -417,7 +417,7 @@  discard block
 block discarded – undo
417 417
                 $registration->save();
418 418
             }
419 419
             // don't trigger notifications during IPNs because they will get triggered by EE_Payment_Processor
420
-            if (! EE_Processor_Base::$IPN) {
420
+            if ( ! EE_Processor_Base::$IPN) {
421 421
                 // otherwise, send out notifications
422 422
                 add_filter('FHEE__EED_Messages___maybe_registration__deliver_notifications', '__return_true', 10);
423 423
             }
@@ -451,7 +451,7 @@  discard block
 block discarded – undo
451 451
     public function trigger_registration_update_notifications($registration, array $additional_details = array())
452 452
     {
453 453
         try {
454
-            if (! $registration instanceof EE_Registration) {
454
+            if ( ! $registration instanceof EE_Registration) {
455 455
                 throw new EE_Error(
456 456
                     esc_html__('An invalid registration was received.', 'event_espresso')
457 457
                 );
@@ -465,7 +465,7 @@  discard block
 block discarded – undo
465 465
             //     false,
466 466
             //     'EE_Transaction: ' . $registration->transaction()->ID()
467 467
             // );
468
-            if (! $registration->is_primary_registrant()) {
468
+            if ( ! $registration->is_primary_registrant()) {
469 469
                 return;
470 470
             }
471 471
             do_action(
@@ -538,8 +538,8 @@  discard block
 block discarded – undo
538 538
         foreach ($transaction->registrations() as $registration) {
539 539
             /** @var EE_Line_Item $line_item */
540 540
             $line_item = EEM_Line_Item::instance()->get_line_item_for_registration($registration);
541
-            if (isset($reg_final_price_per_ticket_line_item[ $line_item->ID() ])) {
542
-                $registration->set_final_price($reg_final_price_per_ticket_line_item[ $line_item->ID() ]);
541
+            if (isset($reg_final_price_per_ticket_line_item[$line_item->ID()])) {
542
+                $registration->set_final_price($reg_final_price_per_ticket_line_item[$line_item->ID()]);
543 543
                 if ($save_regs) {
544 544
                     $registration->save();
545 545
                 }
@@ -615,11 +615,11 @@  discard block
 block discarded – undo
615 615
         $closed_reg_statuses = ! empty($closed_reg_statuses)
616 616
             ? $closed_reg_statuses
617 617
             : EEM_Registration::closed_reg_statuses();
618
-        if (! in_array($registration->status_ID(), $closed_reg_statuses, true)) {
618
+        if ( ! in_array($registration->status_ID(), $closed_reg_statuses, true)) {
619 619
             return false;
620 620
         }
621 621
         // release a reserved ticket by decrementing ticket and datetime reserved values
622
-        $registration->release_reserved_ticket(true, 'RegProcessor:' . __LINE__);
622
+        $registration->release_reserved_ticket(true, 'RegProcessor:'.__LINE__);
623 623
         $registration->set_final_price(0);
624 624
         if ($update_reg) {
625 625
             $registration->save();
@@ -650,7 +650,7 @@  discard block
 block discarded – undo
650 650
             return false;
651 651
         }
652 652
         $ticket = $registration->ticket();
653
-        if (! $ticket instanceof EE_Ticket) {
653
+        if ( ! $ticket instanceof EE_Ticket) {
654 654
             throw new EE_Error(
655 655
                 sprintf(
656 656
                     esc_html__(
@@ -699,7 +699,7 @@  discard block
 block discarded – undo
699 699
         $total_ticket_count = 1
700 700
     ) {
701 701
         EE_Error::doing_it_wrong(
702
-            __CLASS__ . '::' . __FUNCTION__,
702
+            __CLASS__.'::'.__FUNCTION__,
703 703
             sprintf(
704 704
                 esc_html__('This method is deprecated. Please use "%s" instead', 'event_espresso'),
705 705
                 '\EventEspresso\core\domain\services\registration\CreateRegistrationService::create()'
@@ -709,7 +709,7 @@  discard block
 block discarded – undo
709 709
         );
710 710
         // grab the related ticket object for this line_item
711 711
         $ticket = $line_item->ticket();
712
-        if (! $ticket instanceof EE_Ticket) {
712
+        if ( ! $ticket instanceof EE_Ticket) {
713 713
             EE_Error::add_error(
714 714
                 sprintf(
715 715
                     esc_html__('Line item %s did not contain a valid ticket', 'event_espresso'),
@@ -747,7 +747,7 @@  discard block
 block discarded – undo
747 747
     public function generate_reg_url_link($att_nmbr, $item)
748 748
     {
749 749
         EE_Error::doing_it_wrong(
750
-            __CLASS__ . '::' . __FUNCTION__,
750
+            __CLASS__.'::'.__FUNCTION__,
751 751
             sprintf(
752 752
                 esc_html__('This method is deprecated. Please use "%s" instead', 'event_espresso'),
753 753
                 'EventEspresso\core\domain\entities\RegUrlLink'
@@ -773,7 +773,7 @@  discard block
 block discarded – undo
773 773
     public function generate_reg_code(EE_Registration $registration)
774 774
     {
775 775
         EE_Error::doing_it_wrong(
776
-            __CLASS__ . '::' . __FUNCTION__,
776
+            __CLASS__.'::'.__FUNCTION__,
777 777
             sprintf(
778 778
                 esc_html__('This method is deprecated. Please use "%s" instead', 'event_espresso'),
779 779
                 'EventEspresso\core\domain\entities\RegCode'
Please login to merge, or discard this patch.
core/admin/EE_Admin_Hooks.core.php 3 patches
Doc Comments   +1 added lines, -1 removed lines patch added patch discarded remove patch
@@ -222,7 +222,7 @@
 block discarded – undo
222 222
     /**
223 223
      * constructor
224 224
      *
225
-     * @param EE_Admin_Page $admin_page the calling admin_page_object
225
+     * @param EE_Admin_Page $adminpage the calling admin_page_object
226 226
      */
227 227
     public function __construct(EE_Admin_Page $adminpage)
228 228
     {
Please login to merge, or discard this patch.
Indentation   +715 added lines, -715 removed lines patch added patch discarded remove patch
@@ -13,719 +13,719 @@
 block discarded – undo
13 13
 {
14 14
 
15 15
 
16
-    /**
17
-     * we're just going to use this to hold the name of the caller class (child class name)
18
-     *
19
-     * @var string
20
-     */
21
-    public $caller;
22
-
23
-
24
-    /**
25
-     * this is just a flag set automatically to indicate whether we've got an extended hook class running (i.e.
26
-     * espresso_events_Registration_Form_Hooks_Extend extends espresso_events_Registration_Form_Hooks).  This flag is
27
-     * used later to make sure we require the needed files.
28
-     *
29
-     * @var bool
30
-     */
31
-    protected $_extend;
32
-
33
-
34
-    /**
35
-     * child classes MUST set this property so that the page object can be loaded correctly
36
-     *
37
-     * @var string
38
-     */
39
-    protected $_name;
40
-
41
-
42
-    /**
43
-     * This is set by child classes and is an associative array of ajax hooks in the format:
44
-     * array(
45
-     *    'ajax_action_ref' => 'executing_method'; //must be public
46
-     * )
47
-     *
48
-     * @var array
49
-     */
50
-    protected $_ajax_func;
51
-
52
-
53
-    /**
54
-     * This is an array of methods that get executed on a page routes admin_init hook. Use the following format:
55
-     * array(
56
-     *    'page_route' => 'executing_method' //must be public
57
-     * )
58
-     *
59
-     * @var array
60
-     */
61
-    protected $_init_func;
62
-
63
-
64
-    /**
65
-     * This is an array of methods that output metabox content for the given page route.  Use the following format:
66
-     * array(
67
-     *    0 => array(
68
-     *        'page_route' => 'string_for_page_route', //must correspond to a page route in the class being connected
69
-     *        with (i.e. "edit_event") If this is in an array then the same params below will be used but the metabox
70
-     *        will be added to each route.
71
-     *        'func' =>  'executing_method',  //must be public (i.e. public function executing_method($post,
72
-     *        $callback_args){} ).  Note if you include callback args in the array then you need to declare them in the
73
-     *        method arguments.
74
-     *        'id' => 'identifier_for_metabox', //so it can be removed by addons (optional, class will set it
75
-     *        automatically)
76
-     *        'priority' => 'default', //default 'default' (optional)
77
-     *        'label' => __('Localized Title', 'event_espresso'),
78
-     *        'context' => 'advanced' //advanced is default (optional),
79
-     *    'callback_args' => array() //any callback args to include (optional)
80
-     * )
81
-     * Why are we indexing numerically?  Because it's possible there may be more than one metabox per page_route.
82
-     *
83
-     * @var array
84
-     */
85
-    protected $_metaboxes;
86
-
87
-
88
-    /**
89
-     * This is an array of values that indicate any metaboxes we want removed from a given page route.  Usually this is
90
-     * used when caffeinated functionality is replacing decaffeinated functionality.  Use the following format for the
91
-     * array: array(
92
-     *    0 => array(
93
-     *        'page_route' => 'string_for_page_route' //can be string or array of strings that match a page_route(s)
94
-     *        that are in the class being connected with (i.e. 'edit', or 'create_new').
95
-     *        'id' => 'identifier_for_metabox', //what the id is of the metabox being removed
96
-     *        'context' => 'normal', //the context for the metabox being removed (has to match)
97
-     *        'screen' => 'screen_id', //(optional), if not included then this class will attempt to remove the metabox
98
-     *        using the currently loaded screen object->id  however, there may be cases where you have to specify the
99
-     *        id for the screen the metabox is on.
100
-     *    )
101
-     * )
102
-     *
103
-     * @var array
104
-     */
105
-    protected $_remove_metaboxes;
106
-
107
-
108
-    /**
109
-     * This parent class takes care of loading the scripts and styles if the child class has set the properties for
110
-     * them in the following format.  Note, the first array index ('register') is for defining all the registers.  The
111
-     * second array index is for indicating what routes each script/style loads on. array(
112
-     * 'registers' => array(
113
-     *        'script_ref' => array( // if more than one script is to be loaded its best to use the 'dependency'
114
-     *        argument to link scripts together.
115
-     *            'type' => 'js' // 'js' or 'css' (defaults to js).  This tells us what type of wp_function to use
116
-     *            'url' => 'http://urltoscript.css.js',
117
-     *            'depends' => array('jquery'), //an array of dependencies for the scripts. REMEMBER, if a script has
118
-     *            already been registered elsewhere in the system.  You can just use the depends array to make sure it
119
-     *            gets loaded before the one you are setting here.
120
-     *            'footer' => TRUE //defaults to true (styles don't use this parameter)
121
-     *        ),
122
-     *    'enqueues' => array( //this time each key corresponds to the script ref followed by an array of page routes
123
-     *    the script gets enqueued on.
124
-     *        'script_ref' => array('route_one', 'route_two')
125
-     *    ),
126
-     *    'localize' => array( //this allows you to set a localize object.  Indicate which script the object is being
127
-     *    attached to and then include an array indexed by the name of the object and the array of key/value pairs for
128
-     *    the object.
129
-     *        'scrip_ref' => array(
130
-     *            'NAME_OF_JS_OBJECT' => array(
131
-     *                'translate_ref' => __('localized_string', 'event_espresso'),
132
-     *                'some_data' => 5
133
-     *            )
134
-     *        )
135
-     *    )
136
-     * )
137
-     *
138
-     * @var array
139
-     */
140
-    protected $_scripts_styles;
141
-
142
-
143
-    /**
144
-     * This is a property that will contain the current route.
145
-     *
146
-     * @var string;
147
-     */
148
-    protected $_current_route;
149
-
150
-
151
-    /**
152
-     * this optional property can be set by child classes to override the priority for the automatic action/filter hook
153
-     * loading in the `_load_routed_hooks()` method.  Please follow this format: array(
154
-     *    'wp_hook_reference' => 1
155
-     *    )
156
-     * )
157
-     *
158
-     * @var array
159
-     */
160
-    protected $_wp_action_filters_priority;
161
-
162
-
163
-    /**
164
-     * This just holds a merged array of the $_POST and $_GET vars in favor of $_POST
165
-     *
166
-     * @var array
167
-     */
168
-    protected $_req_data;
169
-
170
-
171
-    /**
172
-     * This just holds an instance of the page object for this hook
173
-     *
174
-     * @var EE_Admin_Page
175
-     */
176
-    protected $_page_object;
177
-
178
-
179
-    /**
180
-     * This holds the EE_Admin_Page object from the calling admin page that this object hooks into.
181
-     *
182
-     * @var EE_Admin_Page|EE_Admin_Page_CPT
183
-     */
184
-    protected $_adminpage_obj;
185
-
186
-
187
-    /**
188
-     * Holds EE_Registry object
189
-     *
190
-     * @var EE_Registry
191
-     */
192
-    protected $EE = null;
193
-
194
-
195
-    /**
196
-     * constructor
197
-     *
198
-     * @param EE_Admin_Page $admin_page the calling admin_page_object
199
-     */
200
-    public function __construct(EE_Admin_Page $adminpage)
201
-    {
202
-        $this->_adminpage_obj = $adminpage;
203
-        $this->_req_data = array_merge($_GET, $_POST);
204
-        $this->_set_defaults();
205
-        $this->_set_hooks_properties();
206
-        // first let's verify we're on the right page
207
-        if (
208
-            ! isset($this->_req_data['page'])
209
-            || (isset($this->_req_data['page'])
210
-                && $this->_adminpage_obj->page_slug
211
-                   != $this->_req_data['page'])
212
-        ) {
213
-            return;
214
-        } //get out nothing more to be done here.
215
-        // allow for extends to modify properties
216
-        if (method_exists($this, '_extend_properties')) {
217
-            $this->_extend_properties();
218
-        }
219
-        $this->_set_page_object();
220
-        $this->_init_hooks();
221
-        $this->_load_custom_methods();
222
-        $this->_load_routed_hooks();
223
-        add_action('admin_enqueue_scripts', array($this, 'enqueue_scripts_styles'));
224
-        add_action('admin_enqueue_scripts', array($this, 'add_metaboxes'), 20);
225
-        add_action('admin_enqueue_scripts', array($this, 'remove_metaboxes'), 15);
226
-        $this->_ajax_hooks();
227
-    }
228
-
229
-
230
-    /**
231
-     * used by child classes to set the following properties:
232
-     * $_ajax_func (optional)
233
-     * $_init_func (optional)
234
-     * $_metaboxes (optional)
235
-     * $_scripts (optional)
236
-     * $_styles (optional)
237
-     * $_name (required)
238
-     * Also in this method will be registered any scripts or styles loaded on the targeted page (as indicated in the
239
-     * _scripts/_styles properties) Also children should place in this method any filters/actions that have to happen
240
-     * really early on page load (just after admin_init) if they want to have them registered for handling early.
241
-     *
242
-     * @access protected
243
-     * @abstract
244
-     * @return void
245
-     */
246
-    abstract protected function _set_hooks_properties();
247
-
248
-
249
-    /**
250
-     * The hooks for enqueue_scripts and enqueue_styles will be run in here.  Child classes need to define their
251
-     * scripts and styles in the relevant $_scripts and $_styles properties.  Child classes must have also already
252
-     * registered the scripts and styles using wp_register_script and wp_register_style functions.
253
-     *
254
-     * @access public
255
-     * @return void
256
-     */
257
-    public function enqueue_scripts_styles()
258
-    {
259
-        if (! empty($this->_scripts_styles)) {
260
-            // first let's do all the registrations
261
-            if (! isset($this->_scripts_styles['registers'])) {
262
-                $msg[] = __(
263
-                    'There is no "registers" index in the <code>$this->_scripts_styles</code> property.',
264
-                    'event_espresso'
265
-                );
266
-                $msg[] = sprintf(
267
-                    __(
268
-                        'Make sure you read the phpdoc comments above the definition of the $_scripts_styles property in the <code>EE_Admin_Hooks</code> class and modify according in the %s child',
269
-                        'event_espresso'
270
-                    ),
271
-                    '<strong>' . $this->caller . '</strong>'
272
-                );
273
-                throw new EE_Error(implode('||', $msg));
274
-            }
275
-            foreach ($this->_scripts_styles['registers'] as $ref => $details) {
276
-                $defaults = array(
277
-                    'type'    => 'js',
278
-                    'url'     => '',
279
-                    'depends' => array(),
280
-                    'version' => EVENT_ESPRESSO_VERSION,
281
-                    'footer'  => true,
282
-                );
283
-                $details = wp_parse_args($details, $defaults);
284
-                extract($details);
285
-                // let's make sure that we set the 'registers' type if it's not set! We need it later to determine whhich enqueu we do
286
-                $this->_scripts_styles['registers'][ $ref ]['type'] = $type;
287
-                // let's make sure we're not missing any REQUIRED parameters
288
-                if (empty($url)) {
289
-                    $msg[] = sprintf(
290
-                        __('Missing the url for the requested %s', 'event_espresso'),
291
-                        $type == 'js' ? 'script' : 'stylesheet'
292
-                    );
293
-                    $msg[] = sprintf(
294
-                        __(
295
-                            'Doublecheck your <code>$this->_scripts_styles</code> array in %s and make sure that there is a "url" set for the %s ref',
296
-                            'event_espresso'
297
-                        ),
298
-                        '<strong>' . $this->caller . '</strong>',
299
-                        $ref
300
-                    );
301
-                    throw new EE_Error(implode('||', $msg));
302
-                }
303
-                // made it here so let's do the appropriate registration
304
-                $type == 'js'
305
-                    ? wp_register_script($ref, $url, $depends, $version, $footer)
306
-                    : wp_register_style(
307
-                        $ref,
308
-                        $url,
309
-                        $depends,
310
-                        $version
311
-                    );
312
-            }
313
-            // k now lets do the enqueues
314
-            if (! isset($this->_scripts_styles['enqueues'])) {
315
-                return;
316
-            }  //not sure if we should throw an error here or not.
317
-
318
-            foreach ($this->_scripts_styles['enqueues'] as $ref => $routes) {
319
-                // make sure $routes is an array
320
-                $routes = (array) $routes;
321
-                if (in_array($this->_current_route, $routes)) {
322
-                    $this->_scripts_styles['registers'][ $ref ]['type'] == 'js' ? wp_enqueue_script($ref)
323
-                        : wp_enqueue_style($ref);
324
-                    // if we have a localization for the script let's do that too.
325
-                    if (isset($this->_scripts_styles['localize'][ $ref ])) {
326
-                        foreach ($this->_scripts_styles['localize'][ $ref ] as $object_name => $indexes) {
327
-                            wp_localize_script(
328
-                                $ref,
329
-                                $object_name,
330
-                                $this->_scripts_styles['localize'][ $ref ][ $object_name ]
331
-                            );
332
-                        }
333
-                    }
334
-                }
335
-            }
336
-            // let's do the deregisters
337
-            if (! isset($this->_scripts_styles['deregisters'])) {
338
-                return;
339
-            }
340
-            foreach ($this->_scripts_styles['deregisters'] as $ref => $details) {
341
-                $defaults = array(
342
-                    'type' => 'js',
343
-                );
344
-                $details = wp_parse_args($details, $defaults);
345
-                extract($details);
346
-                $type == 'js' ? wp_deregister_script($ref) : wp_deregister_style($ref);
347
-            }
348
-        }
349
-    }
350
-
351
-
352
-    /**
353
-     * just set the defaults for the hooks properties.
354
-     *
355
-     * @access private
356
-     * @return void
357
-     */
358
-    private function _set_defaults()
359
-    {
360
-        $this->_ajax_func = $this->_init_func = $this->_metaboxes = $this->_scripts = $this->_styles = $this->_wp_action_filters_priority = array();
361
-        $this->_current_route = $this->getCurrentRoute();
362
-        $this->caller = get_class($this);
363
-        $this->_extend = stripos($this->caller, 'Extend') ? true : false;
364
-    }
365
-
366
-
367
-    /**
368
-     * A helper for determining the current route.
369
-     * @return string
370
-     */
371
-    private function getCurrentRoute()
372
-    {
373
-        // list tables do something else with 'action' for bulk actions.
374
-        $action = ! empty($_REQUEST['action']) && $_REQUEST['action'] !== '-1' ? $_REQUEST['action'] : 'default';
375
-        // we set a 'route' variable in some cases where action is being used by something else.
376
-        $action = $action === 'default' && isset($_REQUEST['route']) ? $_REQUEST['route'] : $action;
377
-        return sanitize_key($action);
378
-    }
379
-
380
-
381
-    /**
382
-     * this sets the _page_object property
383
-     *
384
-     * @access protected
385
-     * @return void
386
-     */
387
-    protected function _set_page_object()
388
-    {
389
-        // first make sure $this->_name is set
390
-        if (empty($this->_name)) {
391
-            $msg[] = __('We can\'t load the page object', 'event_espresso');
392
-            $msg[] = sprintf(
393
-                __("This is because the %s child class has not set the '_name' property", 'event_espresso'),
394
-                $this->caller
395
-            );
396
-            throw new EE_Error(implode('||', $msg));
397
-        }
398
-        $ref = str_replace('_', ' ', $this->_name); // take the_message -> the message
399
-        $ref = str_replace(' ', '_', ucwords($ref)) . '_Admin_Page'; // take the message -> The_Message
400
-        // first default file (if exists)
401
-        $decaf_file = EE_ADMIN_PAGES . $this->_name . '/' . $ref . '.core.php';
402
-        if (is_readable($decaf_file)) {
403
-            require_once($decaf_file);
404
-        }
405
-        // now we have to do require for extended file (if needed)
406
-        if ($this->_extend) {
407
-            require_once(EE_CORE_CAF_ADMIN_EXTEND . $this->_name . '/Extend_' . $ref . '.core.php');
408
-        }
409
-        // if we've got an extended class we use that!
410
-        $ref = $this->_extend ? 'Extend_' . $ref : $ref;
411
-        // let's make sure the class exists
412
-        if (! class_exists($ref)) {
413
-            $msg[] = __('We can\'t load the page object', 'event_espresso');
414
-            $msg[] = sprintf(
415
-                __(
416
-                    'The class name that was given is %s. Check the spelling and make sure its correct, also there needs to be an autoloader setup for the class',
417
-                    'event_espresso'
418
-                ),
419
-                $ref
420
-            );
421
-            throw new EE_Error(implode('||', $msg));
422
-        }
423
-        $a = new ReflectionClass($ref);
424
-        $this->_page_object = $a->newInstance(false);
425
-    }
426
-
427
-
428
-    /**
429
-     * Child "hook" classes can declare any methods that they want executed when a specific page route is loaded.  The
430
-     * advantage of this is when doing things like running our own db interactions on saves etc.  Remember that
431
-     * $this->_req_data (all the _POST and _GET data) is available to your methods.
432
-     *
433
-     * @access private
434
-     * @return void
435
-     */
436
-    private function _load_custom_methods()
437
-    {
438
-        /**
439
-         * method cannot be named 'default' (@see http://us3.php
440
-         * .net/manual/en/reserved.keywords.php) so need to
441
-         * handle routes that are "default"
442
-         *
443
-         * @since 4.3.0
444
-         */
445
-        $method_callback = $this->_current_route == 'default' ? 'default_callback' : $this->_current_route;
446
-        // these run before the Admin_Page route executes.
447
-        if (method_exists($this, $method_callback)) {
448
-            call_user_func(array($this, $method_callback));
449
-        }
450
-        // these run via the _redirect_after_action method in EE_Admin_Page which usually happens after non_UI methods in EE_Admin_Page classes.  There are two redirect actions, the first fires before $query_args might be manipulated by "save and close" actions and the seond fires right before the actual redirect happens.
451
-        // first the actions
452
-        // note that these action hooks will have the $query_args value available.
453
-        $admin_class_name = get_class($this->_adminpage_obj);
454
-        if (method_exists($this, '_redirect_action_early_' . $this->_current_route)) {
455
-            add_action(
456
-                'AHEE__'
457
-                . $admin_class_name
458
-                . '___redirect_after_action__before_redirect_modification_'
459
-                . $this->_current_route,
460
-                array($this, '_redirect_action_early_' . $this->_current_route),
461
-                10
462
-            );
463
-        }
464
-        if (method_exists($this, '_redirect_action_' . $this->_current_route)) {
465
-            add_action(
466
-                'AHEE_redirect_' . $admin_class_name . $this->_current_route,
467
-                array($this, '_redirect_action_' . $this->_current_route),
468
-                10
469
-            );
470
-        }
471
-        // let's hook into the _redirect itself and allow for changing where the user goes after redirect.  This will have $query_args and $redirect_url available.
472
-        if (method_exists($this, '_redirect_filter_' . $this->_current_route)) {
473
-            add_filter(
474
-                'FHEE_redirect_' . $admin_class_name . $this->_current_route,
475
-                array($this, '_redirect_filter_' . $this->_current_route),
476
-                10,
477
-                2
478
-            );
479
-        }
480
-    }
481
-
482
-
483
-    /**
484
-     * This method will search for a corresponding method with a name matching the route and the wp_hook to run.  This
485
-     * allows child hook classes to target hooking into a specific wp action or filter hook ONLY on a certain route.
486
-     * just remember, methods MUST be public Future hooks should be added in here to be access by child classes.
487
-     *
488
-     * @return void
489
-     */
490
-    private function _load_routed_hooks()
491
-    {
492
-
493
-        // this array provides the hook action names that will be referenced.  Key is the action. Value is an array with the type (action or filter) and the number of parameters for the hook.  We'll default all priorities for automatic hooks to 10.
494
-        $hook_filter_array = array(
495
-            'admin_footer'                                                                            => array(
496
-                'type'     => 'action',
497
-                'argnum'   => 1,
498
-                'priority' => 10,
499
-            ),
500
-            'FHEE_list_table_views_' . $this->_adminpage_obj->page_slug . '_' . $this->_current_route => array(
501
-                'type'     => 'filter',
502
-                'argnum'   => 1,
503
-                'priority' => 10,
504
-            ),
505
-            'FHEE_list_table_views_' . $this->_adminpage_obj->page_slug                               => array(
506
-                'type'     => 'filter',
507
-                'argnum'   => 1,
508
-                'priority' => 10,
509
-            ),
510
-            'FHEE_list_table_views'                                                                   => array(
511
-                'type'     => 'filter',
512
-                'argnum'   => 1,
513
-                'priority' => 10,
514
-            ),
515
-            'AHEE__EE_Admin_Page___display_admin_page__modify_metaboxes'                              => array(
516
-                'type'     => 'action',
517
-                'argnum'   => 1,
518
-                'priority' => 10,
519
-            ),
520
-        );
521
-        foreach ($hook_filter_array as $hook => $args) {
522
-            if (method_exists($this, $this->_current_route . '_' . $hook)) {
523
-                if (isset($this->_wp_action_filters_priority[ $hook ])) {
524
-                    $args['priority'] = $this->_wp_action_filters_priority[ $hook ];
525
-                }
526
-                if ($args['type'] == 'action') {
527
-                    add_action(
528
-                        $hook,
529
-                        array($this, $this->_current_route . '_' . $hook),
530
-                        $args['priority'],
531
-                        $args['argnum']
532
-                    );
533
-                } else {
534
-                    add_filter(
535
-                        $hook,
536
-                        array($this, $this->_current_route . '_' . $hook),
537
-                        $args['priority'],
538
-                        $args['argnum']
539
-                    );
540
-                }
541
-            }
542
-        }
543
-    }
544
-
545
-
546
-    /**
547
-     * Loop throught the $_ajax_func array and add_actions for the array.
548
-     *
549
-     * @return void
550
-     */
551
-    private function _ajax_hooks()
552
-    {
553
-        if (empty($this->_ajax_func)) {
554
-            return;
555
-        } //get out there's nothing to take care of.
556
-        foreach ($this->_ajax_func as $action => $method) {
557
-            // make sure method exists
558
-            if (! method_exists($this, $method)) {
559
-                $msg[] = __(
560
-                    'There is no corresponding method for the hook labeled in the _ajax_func array',
561
-                    'event_espresso'
562
-                ) . '<br />';
563
-                $msg[] = sprintf(
564
-                    __(
565
-                        'The method name given in the array is %s, check the spelling and make sure it exists in the %s class',
566
-                        'event_espresso'
567
-                    ),
568
-                    $method,
569
-                    $this->caller
570
-                );
571
-                throw new EE_Error(implode('||', $msg));
572
-            }
573
-            add_action('wp_ajax_' . $action, array($this, $method));
574
-        }
575
-    }
576
-
577
-
578
-    /**
579
-     * Loop throught the $_init_func array and add_actions for the array.
580
-     *
581
-     * @return void
582
-     */
583
-    protected function _init_hooks()
584
-    {
585
-        if (empty($this->_init_func)) {
586
-            return;
587
-        } //get out there's nothing to take care of.
588
-        // We need to determine what page_route we are on!
589
-        $current_route = isset($_REQUEST['action']) ? $_REQUEST['action'] : 'default';
590
-        foreach ($this->_init_func as $route => $method) {
591
-            // make sure method exists
592
-            if (! method_exists($this, $method)) {
593
-                $msg[] = __(
594
-                    'There is no corresponding method for the hook labeled in the _init_func array',
595
-                    'event_espresso'
596
-                ) . '<br />';
597
-                $msg[] = sprintf(
598
-                    __(
599
-                        'The method name given in the array is %s, check the spelling and make sure it exists in the %s class',
600
-                        'event_espresso'
601
-                    ),
602
-                    $method,
603
-                    $this->caller
604
-                );
605
-                throw new EE_Error(implode('||', $msg));
606
-            }
607
-            if ($route == $this->_current_route) {
608
-                add_action('admin_init', array($this, $method));
609
-            }
610
-        }
611
-    }
612
-
613
-
614
-    /**
615
-     * Loop through the _metaboxes property and add_metaboxes accordingly
616
-     * //todo we could eventually make this a config component class (i.e. new EE_Metabox);
617
-     *
618
-     * @access public
619
-     * @return void
620
-     */
621
-    public function add_metaboxes()
622
-    {
623
-        if (empty($this->_metaboxes)) {
624
-            return;
625
-        } //get out we don't have any metaboxes to set for this connection
626
-        $this->_handle_metabox_array($this->_metaboxes);
627
-    }
628
-
629
-
630
-    private function _handle_metabox_array($boxes, $add = true)
631
-    {
632
-        foreach ($boxes as $box) {
633
-            if (! isset($box['page_route'])) {
634
-                continue;
635
-            } //we dont' have a valid array
636
-            // let's make sure $box['page_route'] is an array so the "foreach" will work.
637
-            $box['page_route'] = (array) $box['page_route'];
638
-            foreach ($box['page_route'] as $route) {
639
-                if ($route != $this->_current_route) {
640
-                    continue;
641
-                } //get out we only add metaboxes for set route.
642
-                if ($add) {
643
-                    $this->_add_metabox($box);
644
-                } else {
645
-                    $this->_remove_metabox($box);
646
-                }
647
-            }
648
-        }
649
-    }
650
-
651
-
652
-    /**
653
-     * Loop through the _remove_metaboxes property and remove metaboxes accordingly.
654
-     *
655
-     * @access public
656
-     * @return void
657
-     */
658
-    public function remove_metaboxes()
659
-    {
660
-        if (empty($this->_remove_metaboxes)) {
661
-            return;
662
-        } //get out there are no metaboxes to remove
663
-        $this->_handle_metabox_array($this->_remove_metaboxes, false);
664
-    }
665
-
666
-
667
-    /**
668
-     * This just handles adding a metabox
669
-     *
670
-     * @access private
671
-     * @param array $args an array of args that have been set for this metabox by the child class
672
-     */
673
-    private function _add_metabox($args)
674
-    {
675
-        $current_screen = get_current_screen();
676
-        $screen_id = is_object($current_screen) ? $current_screen->id : null;
677
-        $func = isset($args['func']) ? $args['func'] : 'some_invalid_callback';
678
-        // set defaults
679
-        $defaults = array(
680
-            'func'          => $func,
681
-            'id'            => $this->caller . '_' . $func . '_metabox',
682
-            'priority'      => 'default',
683
-            'label'         => $this->caller,
684
-            'context'       => 'advanced',
685
-            'callback_args' => array(),
686
-            'page'          => isset($args['page']) ? $args['page'] : $screen_id,
687
-        );
688
-        $args = wp_parse_args($args, $defaults);
689
-        extract($args);
690
-        // make sure method exists
691
-        if (! method_exists($this, $func)) {
692
-            $msg[] = __('There is no corresponding method to display the metabox content', 'event_espresso') . '<br />';
693
-            $msg[] = sprintf(
694
-                __(
695
-                    'The method name given in the array is %s, check the spelling and make sure it exists in the %s class',
696
-                    'event_espresso'
697
-                ),
698
-                $func,
699
-                $this->caller
700
-            );
701
-            throw new EE_Error(implode('||', $msg));
702
-        }
703
-        // everything checks out so lets add the metabox
704
-        add_meta_box($id, $label, array($this, $func), $page, $context, $priority, $callback_args);
705
-    }
706
-
707
-
708
-    private function _remove_metabox($args)
709
-    {
710
-        $current_screen = get_current_screen();
711
-        $screen_id = is_object($current_screen) ? $current_screen->id : null;
712
-        $func = isset($args['func']) ? $args['func'] : 'some_invalid_callback';
713
-        // set defaults
714
-        $defaults = array(
715
-            'id'      => isset($args['id'])
716
-                ? $args['id']
717
-                : $this->_current_route
718
-                  . '_'
719
-                  . $this->caller
720
-                  . '_'
721
-                  . $func
722
-                  . '_metabox',
723
-            'context' => 'default',
724
-            'screen'  => isset($args['screen']) ? $args['screen'] : $screen_id,
725
-        );
726
-        $args = wp_parse_args($args, $defaults);
727
-        extract($args);
728
-        // everything checks out so lets remove the box!
729
-        remove_meta_box($id, $screen, $context);
730
-    }
16
+	/**
17
+	 * we're just going to use this to hold the name of the caller class (child class name)
18
+	 *
19
+	 * @var string
20
+	 */
21
+	public $caller;
22
+
23
+
24
+	/**
25
+	 * this is just a flag set automatically to indicate whether we've got an extended hook class running (i.e.
26
+	 * espresso_events_Registration_Form_Hooks_Extend extends espresso_events_Registration_Form_Hooks).  This flag is
27
+	 * used later to make sure we require the needed files.
28
+	 *
29
+	 * @var bool
30
+	 */
31
+	protected $_extend;
32
+
33
+
34
+	/**
35
+	 * child classes MUST set this property so that the page object can be loaded correctly
36
+	 *
37
+	 * @var string
38
+	 */
39
+	protected $_name;
40
+
41
+
42
+	/**
43
+	 * This is set by child classes and is an associative array of ajax hooks in the format:
44
+	 * array(
45
+	 *    'ajax_action_ref' => 'executing_method'; //must be public
46
+	 * )
47
+	 *
48
+	 * @var array
49
+	 */
50
+	protected $_ajax_func;
51
+
52
+
53
+	/**
54
+	 * This is an array of methods that get executed on a page routes admin_init hook. Use the following format:
55
+	 * array(
56
+	 *    'page_route' => 'executing_method' //must be public
57
+	 * )
58
+	 *
59
+	 * @var array
60
+	 */
61
+	protected $_init_func;
62
+
63
+
64
+	/**
65
+	 * This is an array of methods that output metabox content for the given page route.  Use the following format:
66
+	 * array(
67
+	 *    0 => array(
68
+	 *        'page_route' => 'string_for_page_route', //must correspond to a page route in the class being connected
69
+	 *        with (i.e. "edit_event") If this is in an array then the same params below will be used but the metabox
70
+	 *        will be added to each route.
71
+	 *        'func' =>  'executing_method',  //must be public (i.e. public function executing_method($post,
72
+	 *        $callback_args){} ).  Note if you include callback args in the array then you need to declare them in the
73
+	 *        method arguments.
74
+	 *        'id' => 'identifier_for_metabox', //so it can be removed by addons (optional, class will set it
75
+	 *        automatically)
76
+	 *        'priority' => 'default', //default 'default' (optional)
77
+	 *        'label' => __('Localized Title', 'event_espresso'),
78
+	 *        'context' => 'advanced' //advanced is default (optional),
79
+	 *    'callback_args' => array() //any callback args to include (optional)
80
+	 * )
81
+	 * Why are we indexing numerically?  Because it's possible there may be more than one metabox per page_route.
82
+	 *
83
+	 * @var array
84
+	 */
85
+	protected $_metaboxes;
86
+
87
+
88
+	/**
89
+	 * This is an array of values that indicate any metaboxes we want removed from a given page route.  Usually this is
90
+	 * used when caffeinated functionality is replacing decaffeinated functionality.  Use the following format for the
91
+	 * array: array(
92
+	 *    0 => array(
93
+	 *        'page_route' => 'string_for_page_route' //can be string or array of strings that match a page_route(s)
94
+	 *        that are in the class being connected with (i.e. 'edit', or 'create_new').
95
+	 *        'id' => 'identifier_for_metabox', //what the id is of the metabox being removed
96
+	 *        'context' => 'normal', //the context for the metabox being removed (has to match)
97
+	 *        'screen' => 'screen_id', //(optional), if not included then this class will attempt to remove the metabox
98
+	 *        using the currently loaded screen object->id  however, there may be cases where you have to specify the
99
+	 *        id for the screen the metabox is on.
100
+	 *    )
101
+	 * )
102
+	 *
103
+	 * @var array
104
+	 */
105
+	protected $_remove_metaboxes;
106
+
107
+
108
+	/**
109
+	 * This parent class takes care of loading the scripts and styles if the child class has set the properties for
110
+	 * them in the following format.  Note, the first array index ('register') is for defining all the registers.  The
111
+	 * second array index is for indicating what routes each script/style loads on. array(
112
+	 * 'registers' => array(
113
+	 *        'script_ref' => array( // if more than one script is to be loaded its best to use the 'dependency'
114
+	 *        argument to link scripts together.
115
+	 *            'type' => 'js' // 'js' or 'css' (defaults to js).  This tells us what type of wp_function to use
116
+	 *            'url' => 'http://urltoscript.css.js',
117
+	 *            'depends' => array('jquery'), //an array of dependencies for the scripts. REMEMBER, if a script has
118
+	 *            already been registered elsewhere in the system.  You can just use the depends array to make sure it
119
+	 *            gets loaded before the one you are setting here.
120
+	 *            'footer' => TRUE //defaults to true (styles don't use this parameter)
121
+	 *        ),
122
+	 *    'enqueues' => array( //this time each key corresponds to the script ref followed by an array of page routes
123
+	 *    the script gets enqueued on.
124
+	 *        'script_ref' => array('route_one', 'route_two')
125
+	 *    ),
126
+	 *    'localize' => array( //this allows you to set a localize object.  Indicate which script the object is being
127
+	 *    attached to and then include an array indexed by the name of the object and the array of key/value pairs for
128
+	 *    the object.
129
+	 *        'scrip_ref' => array(
130
+	 *            'NAME_OF_JS_OBJECT' => array(
131
+	 *                'translate_ref' => __('localized_string', 'event_espresso'),
132
+	 *                'some_data' => 5
133
+	 *            )
134
+	 *        )
135
+	 *    )
136
+	 * )
137
+	 *
138
+	 * @var array
139
+	 */
140
+	protected $_scripts_styles;
141
+
142
+
143
+	/**
144
+	 * This is a property that will contain the current route.
145
+	 *
146
+	 * @var string;
147
+	 */
148
+	protected $_current_route;
149
+
150
+
151
+	/**
152
+	 * this optional property can be set by child classes to override the priority for the automatic action/filter hook
153
+	 * loading in the `_load_routed_hooks()` method.  Please follow this format: array(
154
+	 *    'wp_hook_reference' => 1
155
+	 *    )
156
+	 * )
157
+	 *
158
+	 * @var array
159
+	 */
160
+	protected $_wp_action_filters_priority;
161
+
162
+
163
+	/**
164
+	 * This just holds a merged array of the $_POST and $_GET vars in favor of $_POST
165
+	 *
166
+	 * @var array
167
+	 */
168
+	protected $_req_data;
169
+
170
+
171
+	/**
172
+	 * This just holds an instance of the page object for this hook
173
+	 *
174
+	 * @var EE_Admin_Page
175
+	 */
176
+	protected $_page_object;
177
+
178
+
179
+	/**
180
+	 * This holds the EE_Admin_Page object from the calling admin page that this object hooks into.
181
+	 *
182
+	 * @var EE_Admin_Page|EE_Admin_Page_CPT
183
+	 */
184
+	protected $_adminpage_obj;
185
+
186
+
187
+	/**
188
+	 * Holds EE_Registry object
189
+	 *
190
+	 * @var EE_Registry
191
+	 */
192
+	protected $EE = null;
193
+
194
+
195
+	/**
196
+	 * constructor
197
+	 *
198
+	 * @param EE_Admin_Page $admin_page the calling admin_page_object
199
+	 */
200
+	public function __construct(EE_Admin_Page $adminpage)
201
+	{
202
+		$this->_adminpage_obj = $adminpage;
203
+		$this->_req_data = array_merge($_GET, $_POST);
204
+		$this->_set_defaults();
205
+		$this->_set_hooks_properties();
206
+		// first let's verify we're on the right page
207
+		if (
208
+			! isset($this->_req_data['page'])
209
+			|| (isset($this->_req_data['page'])
210
+				&& $this->_adminpage_obj->page_slug
211
+				   != $this->_req_data['page'])
212
+		) {
213
+			return;
214
+		} //get out nothing more to be done here.
215
+		// allow for extends to modify properties
216
+		if (method_exists($this, '_extend_properties')) {
217
+			$this->_extend_properties();
218
+		}
219
+		$this->_set_page_object();
220
+		$this->_init_hooks();
221
+		$this->_load_custom_methods();
222
+		$this->_load_routed_hooks();
223
+		add_action('admin_enqueue_scripts', array($this, 'enqueue_scripts_styles'));
224
+		add_action('admin_enqueue_scripts', array($this, 'add_metaboxes'), 20);
225
+		add_action('admin_enqueue_scripts', array($this, 'remove_metaboxes'), 15);
226
+		$this->_ajax_hooks();
227
+	}
228
+
229
+
230
+	/**
231
+	 * used by child classes to set the following properties:
232
+	 * $_ajax_func (optional)
233
+	 * $_init_func (optional)
234
+	 * $_metaboxes (optional)
235
+	 * $_scripts (optional)
236
+	 * $_styles (optional)
237
+	 * $_name (required)
238
+	 * Also in this method will be registered any scripts or styles loaded on the targeted page (as indicated in the
239
+	 * _scripts/_styles properties) Also children should place in this method any filters/actions that have to happen
240
+	 * really early on page load (just after admin_init) if they want to have them registered for handling early.
241
+	 *
242
+	 * @access protected
243
+	 * @abstract
244
+	 * @return void
245
+	 */
246
+	abstract protected function _set_hooks_properties();
247
+
248
+
249
+	/**
250
+	 * The hooks for enqueue_scripts and enqueue_styles will be run in here.  Child classes need to define their
251
+	 * scripts and styles in the relevant $_scripts and $_styles properties.  Child classes must have also already
252
+	 * registered the scripts and styles using wp_register_script and wp_register_style functions.
253
+	 *
254
+	 * @access public
255
+	 * @return void
256
+	 */
257
+	public function enqueue_scripts_styles()
258
+	{
259
+		if (! empty($this->_scripts_styles)) {
260
+			// first let's do all the registrations
261
+			if (! isset($this->_scripts_styles['registers'])) {
262
+				$msg[] = __(
263
+					'There is no "registers" index in the <code>$this->_scripts_styles</code> property.',
264
+					'event_espresso'
265
+				);
266
+				$msg[] = sprintf(
267
+					__(
268
+						'Make sure you read the phpdoc comments above the definition of the $_scripts_styles property in the <code>EE_Admin_Hooks</code> class and modify according in the %s child',
269
+						'event_espresso'
270
+					),
271
+					'<strong>' . $this->caller . '</strong>'
272
+				);
273
+				throw new EE_Error(implode('||', $msg));
274
+			}
275
+			foreach ($this->_scripts_styles['registers'] as $ref => $details) {
276
+				$defaults = array(
277
+					'type'    => 'js',
278
+					'url'     => '',
279
+					'depends' => array(),
280
+					'version' => EVENT_ESPRESSO_VERSION,
281
+					'footer'  => true,
282
+				);
283
+				$details = wp_parse_args($details, $defaults);
284
+				extract($details);
285
+				// let's make sure that we set the 'registers' type if it's not set! We need it later to determine whhich enqueu we do
286
+				$this->_scripts_styles['registers'][ $ref ]['type'] = $type;
287
+				// let's make sure we're not missing any REQUIRED parameters
288
+				if (empty($url)) {
289
+					$msg[] = sprintf(
290
+						__('Missing the url for the requested %s', 'event_espresso'),
291
+						$type == 'js' ? 'script' : 'stylesheet'
292
+					);
293
+					$msg[] = sprintf(
294
+						__(
295
+							'Doublecheck your <code>$this->_scripts_styles</code> array in %s and make sure that there is a "url" set for the %s ref',
296
+							'event_espresso'
297
+						),
298
+						'<strong>' . $this->caller . '</strong>',
299
+						$ref
300
+					);
301
+					throw new EE_Error(implode('||', $msg));
302
+				}
303
+				// made it here so let's do the appropriate registration
304
+				$type == 'js'
305
+					? wp_register_script($ref, $url, $depends, $version, $footer)
306
+					: wp_register_style(
307
+						$ref,
308
+						$url,
309
+						$depends,
310
+						$version
311
+					);
312
+			}
313
+			// k now lets do the enqueues
314
+			if (! isset($this->_scripts_styles['enqueues'])) {
315
+				return;
316
+			}  //not sure if we should throw an error here or not.
317
+
318
+			foreach ($this->_scripts_styles['enqueues'] as $ref => $routes) {
319
+				// make sure $routes is an array
320
+				$routes = (array) $routes;
321
+				if (in_array($this->_current_route, $routes)) {
322
+					$this->_scripts_styles['registers'][ $ref ]['type'] == 'js' ? wp_enqueue_script($ref)
323
+						: wp_enqueue_style($ref);
324
+					// if we have a localization for the script let's do that too.
325
+					if (isset($this->_scripts_styles['localize'][ $ref ])) {
326
+						foreach ($this->_scripts_styles['localize'][ $ref ] as $object_name => $indexes) {
327
+							wp_localize_script(
328
+								$ref,
329
+								$object_name,
330
+								$this->_scripts_styles['localize'][ $ref ][ $object_name ]
331
+							);
332
+						}
333
+					}
334
+				}
335
+			}
336
+			// let's do the deregisters
337
+			if (! isset($this->_scripts_styles['deregisters'])) {
338
+				return;
339
+			}
340
+			foreach ($this->_scripts_styles['deregisters'] as $ref => $details) {
341
+				$defaults = array(
342
+					'type' => 'js',
343
+				);
344
+				$details = wp_parse_args($details, $defaults);
345
+				extract($details);
346
+				$type == 'js' ? wp_deregister_script($ref) : wp_deregister_style($ref);
347
+			}
348
+		}
349
+	}
350
+
351
+
352
+	/**
353
+	 * just set the defaults for the hooks properties.
354
+	 *
355
+	 * @access private
356
+	 * @return void
357
+	 */
358
+	private function _set_defaults()
359
+	{
360
+		$this->_ajax_func = $this->_init_func = $this->_metaboxes = $this->_scripts = $this->_styles = $this->_wp_action_filters_priority = array();
361
+		$this->_current_route = $this->getCurrentRoute();
362
+		$this->caller = get_class($this);
363
+		$this->_extend = stripos($this->caller, 'Extend') ? true : false;
364
+	}
365
+
366
+
367
+	/**
368
+	 * A helper for determining the current route.
369
+	 * @return string
370
+	 */
371
+	private function getCurrentRoute()
372
+	{
373
+		// list tables do something else with 'action' for bulk actions.
374
+		$action = ! empty($_REQUEST['action']) && $_REQUEST['action'] !== '-1' ? $_REQUEST['action'] : 'default';
375
+		// we set a 'route' variable in some cases where action is being used by something else.
376
+		$action = $action === 'default' && isset($_REQUEST['route']) ? $_REQUEST['route'] : $action;
377
+		return sanitize_key($action);
378
+	}
379
+
380
+
381
+	/**
382
+	 * this sets the _page_object property
383
+	 *
384
+	 * @access protected
385
+	 * @return void
386
+	 */
387
+	protected function _set_page_object()
388
+	{
389
+		// first make sure $this->_name is set
390
+		if (empty($this->_name)) {
391
+			$msg[] = __('We can\'t load the page object', 'event_espresso');
392
+			$msg[] = sprintf(
393
+				__("This is because the %s child class has not set the '_name' property", 'event_espresso'),
394
+				$this->caller
395
+			);
396
+			throw new EE_Error(implode('||', $msg));
397
+		}
398
+		$ref = str_replace('_', ' ', $this->_name); // take the_message -> the message
399
+		$ref = str_replace(' ', '_', ucwords($ref)) . '_Admin_Page'; // take the message -> The_Message
400
+		// first default file (if exists)
401
+		$decaf_file = EE_ADMIN_PAGES . $this->_name . '/' . $ref . '.core.php';
402
+		if (is_readable($decaf_file)) {
403
+			require_once($decaf_file);
404
+		}
405
+		// now we have to do require for extended file (if needed)
406
+		if ($this->_extend) {
407
+			require_once(EE_CORE_CAF_ADMIN_EXTEND . $this->_name . '/Extend_' . $ref . '.core.php');
408
+		}
409
+		// if we've got an extended class we use that!
410
+		$ref = $this->_extend ? 'Extend_' . $ref : $ref;
411
+		// let's make sure the class exists
412
+		if (! class_exists($ref)) {
413
+			$msg[] = __('We can\'t load the page object', 'event_espresso');
414
+			$msg[] = sprintf(
415
+				__(
416
+					'The class name that was given is %s. Check the spelling and make sure its correct, also there needs to be an autoloader setup for the class',
417
+					'event_espresso'
418
+				),
419
+				$ref
420
+			);
421
+			throw new EE_Error(implode('||', $msg));
422
+		}
423
+		$a = new ReflectionClass($ref);
424
+		$this->_page_object = $a->newInstance(false);
425
+	}
426
+
427
+
428
+	/**
429
+	 * Child "hook" classes can declare any methods that they want executed when a specific page route is loaded.  The
430
+	 * advantage of this is when doing things like running our own db interactions on saves etc.  Remember that
431
+	 * $this->_req_data (all the _POST and _GET data) is available to your methods.
432
+	 *
433
+	 * @access private
434
+	 * @return void
435
+	 */
436
+	private function _load_custom_methods()
437
+	{
438
+		/**
439
+		 * method cannot be named 'default' (@see http://us3.php
440
+		 * .net/manual/en/reserved.keywords.php) so need to
441
+		 * handle routes that are "default"
442
+		 *
443
+		 * @since 4.3.0
444
+		 */
445
+		$method_callback = $this->_current_route == 'default' ? 'default_callback' : $this->_current_route;
446
+		// these run before the Admin_Page route executes.
447
+		if (method_exists($this, $method_callback)) {
448
+			call_user_func(array($this, $method_callback));
449
+		}
450
+		// these run via the _redirect_after_action method in EE_Admin_Page which usually happens after non_UI methods in EE_Admin_Page classes.  There are two redirect actions, the first fires before $query_args might be manipulated by "save and close" actions and the seond fires right before the actual redirect happens.
451
+		// first the actions
452
+		// note that these action hooks will have the $query_args value available.
453
+		$admin_class_name = get_class($this->_adminpage_obj);
454
+		if (method_exists($this, '_redirect_action_early_' . $this->_current_route)) {
455
+			add_action(
456
+				'AHEE__'
457
+				. $admin_class_name
458
+				. '___redirect_after_action__before_redirect_modification_'
459
+				. $this->_current_route,
460
+				array($this, '_redirect_action_early_' . $this->_current_route),
461
+				10
462
+			);
463
+		}
464
+		if (method_exists($this, '_redirect_action_' . $this->_current_route)) {
465
+			add_action(
466
+				'AHEE_redirect_' . $admin_class_name . $this->_current_route,
467
+				array($this, '_redirect_action_' . $this->_current_route),
468
+				10
469
+			);
470
+		}
471
+		// let's hook into the _redirect itself and allow for changing where the user goes after redirect.  This will have $query_args and $redirect_url available.
472
+		if (method_exists($this, '_redirect_filter_' . $this->_current_route)) {
473
+			add_filter(
474
+				'FHEE_redirect_' . $admin_class_name . $this->_current_route,
475
+				array($this, '_redirect_filter_' . $this->_current_route),
476
+				10,
477
+				2
478
+			);
479
+		}
480
+	}
481
+
482
+
483
+	/**
484
+	 * This method will search for a corresponding method with a name matching the route and the wp_hook to run.  This
485
+	 * allows child hook classes to target hooking into a specific wp action or filter hook ONLY on a certain route.
486
+	 * just remember, methods MUST be public Future hooks should be added in here to be access by child classes.
487
+	 *
488
+	 * @return void
489
+	 */
490
+	private function _load_routed_hooks()
491
+	{
492
+
493
+		// this array provides the hook action names that will be referenced.  Key is the action. Value is an array with the type (action or filter) and the number of parameters for the hook.  We'll default all priorities for automatic hooks to 10.
494
+		$hook_filter_array = array(
495
+			'admin_footer'                                                                            => array(
496
+				'type'     => 'action',
497
+				'argnum'   => 1,
498
+				'priority' => 10,
499
+			),
500
+			'FHEE_list_table_views_' . $this->_adminpage_obj->page_slug . '_' . $this->_current_route => array(
501
+				'type'     => 'filter',
502
+				'argnum'   => 1,
503
+				'priority' => 10,
504
+			),
505
+			'FHEE_list_table_views_' . $this->_adminpage_obj->page_slug                               => array(
506
+				'type'     => 'filter',
507
+				'argnum'   => 1,
508
+				'priority' => 10,
509
+			),
510
+			'FHEE_list_table_views'                                                                   => array(
511
+				'type'     => 'filter',
512
+				'argnum'   => 1,
513
+				'priority' => 10,
514
+			),
515
+			'AHEE__EE_Admin_Page___display_admin_page__modify_metaboxes'                              => array(
516
+				'type'     => 'action',
517
+				'argnum'   => 1,
518
+				'priority' => 10,
519
+			),
520
+		);
521
+		foreach ($hook_filter_array as $hook => $args) {
522
+			if (method_exists($this, $this->_current_route . '_' . $hook)) {
523
+				if (isset($this->_wp_action_filters_priority[ $hook ])) {
524
+					$args['priority'] = $this->_wp_action_filters_priority[ $hook ];
525
+				}
526
+				if ($args['type'] == 'action') {
527
+					add_action(
528
+						$hook,
529
+						array($this, $this->_current_route . '_' . $hook),
530
+						$args['priority'],
531
+						$args['argnum']
532
+					);
533
+				} else {
534
+					add_filter(
535
+						$hook,
536
+						array($this, $this->_current_route . '_' . $hook),
537
+						$args['priority'],
538
+						$args['argnum']
539
+					);
540
+				}
541
+			}
542
+		}
543
+	}
544
+
545
+
546
+	/**
547
+	 * Loop throught the $_ajax_func array and add_actions for the array.
548
+	 *
549
+	 * @return void
550
+	 */
551
+	private function _ajax_hooks()
552
+	{
553
+		if (empty($this->_ajax_func)) {
554
+			return;
555
+		} //get out there's nothing to take care of.
556
+		foreach ($this->_ajax_func as $action => $method) {
557
+			// make sure method exists
558
+			if (! method_exists($this, $method)) {
559
+				$msg[] = __(
560
+					'There is no corresponding method for the hook labeled in the _ajax_func array',
561
+					'event_espresso'
562
+				) . '<br />';
563
+				$msg[] = sprintf(
564
+					__(
565
+						'The method name given in the array is %s, check the spelling and make sure it exists in the %s class',
566
+						'event_espresso'
567
+					),
568
+					$method,
569
+					$this->caller
570
+				);
571
+				throw new EE_Error(implode('||', $msg));
572
+			}
573
+			add_action('wp_ajax_' . $action, array($this, $method));
574
+		}
575
+	}
576
+
577
+
578
+	/**
579
+	 * Loop throught the $_init_func array and add_actions for the array.
580
+	 *
581
+	 * @return void
582
+	 */
583
+	protected function _init_hooks()
584
+	{
585
+		if (empty($this->_init_func)) {
586
+			return;
587
+		} //get out there's nothing to take care of.
588
+		// We need to determine what page_route we are on!
589
+		$current_route = isset($_REQUEST['action']) ? $_REQUEST['action'] : 'default';
590
+		foreach ($this->_init_func as $route => $method) {
591
+			// make sure method exists
592
+			if (! method_exists($this, $method)) {
593
+				$msg[] = __(
594
+					'There is no corresponding method for the hook labeled in the _init_func array',
595
+					'event_espresso'
596
+				) . '<br />';
597
+				$msg[] = sprintf(
598
+					__(
599
+						'The method name given in the array is %s, check the spelling and make sure it exists in the %s class',
600
+						'event_espresso'
601
+					),
602
+					$method,
603
+					$this->caller
604
+				);
605
+				throw new EE_Error(implode('||', $msg));
606
+			}
607
+			if ($route == $this->_current_route) {
608
+				add_action('admin_init', array($this, $method));
609
+			}
610
+		}
611
+	}
612
+
613
+
614
+	/**
615
+	 * Loop through the _metaboxes property and add_metaboxes accordingly
616
+	 * //todo we could eventually make this a config component class (i.e. new EE_Metabox);
617
+	 *
618
+	 * @access public
619
+	 * @return void
620
+	 */
621
+	public function add_metaboxes()
622
+	{
623
+		if (empty($this->_metaboxes)) {
624
+			return;
625
+		} //get out we don't have any metaboxes to set for this connection
626
+		$this->_handle_metabox_array($this->_metaboxes);
627
+	}
628
+
629
+
630
+	private function _handle_metabox_array($boxes, $add = true)
631
+	{
632
+		foreach ($boxes as $box) {
633
+			if (! isset($box['page_route'])) {
634
+				continue;
635
+			} //we dont' have a valid array
636
+			// let's make sure $box['page_route'] is an array so the "foreach" will work.
637
+			$box['page_route'] = (array) $box['page_route'];
638
+			foreach ($box['page_route'] as $route) {
639
+				if ($route != $this->_current_route) {
640
+					continue;
641
+				} //get out we only add metaboxes for set route.
642
+				if ($add) {
643
+					$this->_add_metabox($box);
644
+				} else {
645
+					$this->_remove_metabox($box);
646
+				}
647
+			}
648
+		}
649
+	}
650
+
651
+
652
+	/**
653
+	 * Loop through the _remove_metaboxes property and remove metaboxes accordingly.
654
+	 *
655
+	 * @access public
656
+	 * @return void
657
+	 */
658
+	public function remove_metaboxes()
659
+	{
660
+		if (empty($this->_remove_metaboxes)) {
661
+			return;
662
+		} //get out there are no metaboxes to remove
663
+		$this->_handle_metabox_array($this->_remove_metaboxes, false);
664
+	}
665
+
666
+
667
+	/**
668
+	 * This just handles adding a metabox
669
+	 *
670
+	 * @access private
671
+	 * @param array $args an array of args that have been set for this metabox by the child class
672
+	 */
673
+	private function _add_metabox($args)
674
+	{
675
+		$current_screen = get_current_screen();
676
+		$screen_id = is_object($current_screen) ? $current_screen->id : null;
677
+		$func = isset($args['func']) ? $args['func'] : 'some_invalid_callback';
678
+		// set defaults
679
+		$defaults = array(
680
+			'func'          => $func,
681
+			'id'            => $this->caller . '_' . $func . '_metabox',
682
+			'priority'      => 'default',
683
+			'label'         => $this->caller,
684
+			'context'       => 'advanced',
685
+			'callback_args' => array(),
686
+			'page'          => isset($args['page']) ? $args['page'] : $screen_id,
687
+		);
688
+		$args = wp_parse_args($args, $defaults);
689
+		extract($args);
690
+		// make sure method exists
691
+		if (! method_exists($this, $func)) {
692
+			$msg[] = __('There is no corresponding method to display the metabox content', 'event_espresso') . '<br />';
693
+			$msg[] = sprintf(
694
+				__(
695
+					'The method name given in the array is %s, check the spelling and make sure it exists in the %s class',
696
+					'event_espresso'
697
+				),
698
+				$func,
699
+				$this->caller
700
+			);
701
+			throw new EE_Error(implode('||', $msg));
702
+		}
703
+		// everything checks out so lets add the metabox
704
+		add_meta_box($id, $label, array($this, $func), $page, $context, $priority, $callback_args);
705
+	}
706
+
707
+
708
+	private function _remove_metabox($args)
709
+	{
710
+		$current_screen = get_current_screen();
711
+		$screen_id = is_object($current_screen) ? $current_screen->id : null;
712
+		$func = isset($args['func']) ? $args['func'] : 'some_invalid_callback';
713
+		// set defaults
714
+		$defaults = array(
715
+			'id'      => isset($args['id'])
716
+				? $args['id']
717
+				: $this->_current_route
718
+				  . '_'
719
+				  . $this->caller
720
+				  . '_'
721
+				  . $func
722
+				  . '_metabox',
723
+			'context' => 'default',
724
+			'screen'  => isset($args['screen']) ? $args['screen'] : $screen_id,
725
+		);
726
+		$args = wp_parse_args($args, $defaults);
727
+		extract($args);
728
+		// everything checks out so lets remove the box!
729
+		remove_meta_box($id, $screen, $context);
730
+	}
731 731
 }
Please login to merge, or discard this patch.
Spacing   +40 added lines, -40 removed lines patch added patch discarded remove patch
@@ -256,9 +256,9 @@  discard block
 block discarded – undo
256 256
      */
257 257
     public function enqueue_scripts_styles()
258 258
     {
259
-        if (! empty($this->_scripts_styles)) {
259
+        if ( ! empty($this->_scripts_styles)) {
260 260
             // first let's do all the registrations
261
-            if (! isset($this->_scripts_styles['registers'])) {
261
+            if ( ! isset($this->_scripts_styles['registers'])) {
262 262
                 $msg[] = __(
263 263
                     'There is no "registers" index in the <code>$this->_scripts_styles</code> property.',
264 264
                     'event_espresso'
@@ -268,7 +268,7 @@  discard block
 block discarded – undo
268 268
                         'Make sure you read the phpdoc comments above the definition of the $_scripts_styles property in the <code>EE_Admin_Hooks</code> class and modify according in the %s child',
269 269
                         'event_espresso'
270 270
                     ),
271
-                    '<strong>' . $this->caller . '</strong>'
271
+                    '<strong>'.$this->caller.'</strong>'
272 272
                 );
273 273
                 throw new EE_Error(implode('||', $msg));
274 274
             }
@@ -283,7 +283,7 @@  discard block
 block discarded – undo
283 283
                 $details = wp_parse_args($details, $defaults);
284 284
                 extract($details);
285 285
                 // let's make sure that we set the 'registers' type if it's not set! We need it later to determine whhich enqueu we do
286
-                $this->_scripts_styles['registers'][ $ref ]['type'] = $type;
286
+                $this->_scripts_styles['registers'][$ref]['type'] = $type;
287 287
                 // let's make sure we're not missing any REQUIRED parameters
288 288
                 if (empty($url)) {
289 289
                     $msg[] = sprintf(
@@ -295,7 +295,7 @@  discard block
 block discarded – undo
295 295
                             'Doublecheck your <code>$this->_scripts_styles</code> array in %s and make sure that there is a "url" set for the %s ref',
296 296
                             'event_espresso'
297 297
                         ),
298
-                        '<strong>' . $this->caller . '</strong>',
298
+                        '<strong>'.$this->caller.'</strong>',
299 299
                         $ref
300 300
                     );
301 301
                     throw new EE_Error(implode('||', $msg));
@@ -311,7 +311,7 @@  discard block
 block discarded – undo
311 311
                     );
312 312
             }
313 313
             // k now lets do the enqueues
314
-            if (! isset($this->_scripts_styles['enqueues'])) {
314
+            if ( ! isset($this->_scripts_styles['enqueues'])) {
315 315
                 return;
316 316
             }  //not sure if we should throw an error here or not.
317 317
 
@@ -319,22 +319,22 @@  discard block
 block discarded – undo
319 319
                 // make sure $routes is an array
320 320
                 $routes = (array) $routes;
321 321
                 if (in_array($this->_current_route, $routes)) {
322
-                    $this->_scripts_styles['registers'][ $ref ]['type'] == 'js' ? wp_enqueue_script($ref)
322
+                    $this->_scripts_styles['registers'][$ref]['type'] == 'js' ? wp_enqueue_script($ref)
323 323
                         : wp_enqueue_style($ref);
324 324
                     // if we have a localization for the script let's do that too.
325
-                    if (isset($this->_scripts_styles['localize'][ $ref ])) {
326
-                        foreach ($this->_scripts_styles['localize'][ $ref ] as $object_name => $indexes) {
325
+                    if (isset($this->_scripts_styles['localize'][$ref])) {
326
+                        foreach ($this->_scripts_styles['localize'][$ref] as $object_name => $indexes) {
327 327
                             wp_localize_script(
328 328
                                 $ref,
329 329
                                 $object_name,
330
-                                $this->_scripts_styles['localize'][ $ref ][ $object_name ]
330
+                                $this->_scripts_styles['localize'][$ref][$object_name]
331 331
                             );
332 332
                         }
333 333
                     }
334 334
                 }
335 335
             }
336 336
             // let's do the deregisters
337
-            if (! isset($this->_scripts_styles['deregisters'])) {
337
+            if ( ! isset($this->_scripts_styles['deregisters'])) {
338 338
                 return;
339 339
             }
340 340
             foreach ($this->_scripts_styles['deregisters'] as $ref => $details) {
@@ -396,20 +396,20 @@  discard block
 block discarded – undo
396 396
             throw new EE_Error(implode('||', $msg));
397 397
         }
398 398
         $ref = str_replace('_', ' ', $this->_name); // take the_message -> the message
399
-        $ref = str_replace(' ', '_', ucwords($ref)) . '_Admin_Page'; // take the message -> The_Message
399
+        $ref = str_replace(' ', '_', ucwords($ref)).'_Admin_Page'; // take the message -> The_Message
400 400
         // first default file (if exists)
401
-        $decaf_file = EE_ADMIN_PAGES . $this->_name . '/' . $ref . '.core.php';
401
+        $decaf_file = EE_ADMIN_PAGES.$this->_name.'/'.$ref.'.core.php';
402 402
         if (is_readable($decaf_file)) {
403 403
             require_once($decaf_file);
404 404
         }
405 405
         // now we have to do require for extended file (if needed)
406 406
         if ($this->_extend) {
407
-            require_once(EE_CORE_CAF_ADMIN_EXTEND . $this->_name . '/Extend_' . $ref . '.core.php');
407
+            require_once(EE_CORE_CAF_ADMIN_EXTEND.$this->_name.'/Extend_'.$ref.'.core.php');
408 408
         }
409 409
         // if we've got an extended class we use that!
410
-        $ref = $this->_extend ? 'Extend_' . $ref : $ref;
410
+        $ref = $this->_extend ? 'Extend_'.$ref : $ref;
411 411
         // let's make sure the class exists
412
-        if (! class_exists($ref)) {
412
+        if ( ! class_exists($ref)) {
413 413
             $msg[] = __('We can\'t load the page object', 'event_espresso');
414 414
             $msg[] = sprintf(
415 415
                 __(
@@ -451,28 +451,28 @@  discard block
 block discarded – undo
451 451
         // first the actions
452 452
         // note that these action hooks will have the $query_args value available.
453 453
         $admin_class_name = get_class($this->_adminpage_obj);
454
-        if (method_exists($this, '_redirect_action_early_' . $this->_current_route)) {
454
+        if (method_exists($this, '_redirect_action_early_'.$this->_current_route)) {
455 455
             add_action(
456 456
                 'AHEE__'
457 457
                 . $admin_class_name
458 458
                 . '___redirect_after_action__before_redirect_modification_'
459 459
                 . $this->_current_route,
460
-                array($this, '_redirect_action_early_' . $this->_current_route),
460
+                array($this, '_redirect_action_early_'.$this->_current_route),
461 461
                 10
462 462
             );
463 463
         }
464
-        if (method_exists($this, '_redirect_action_' . $this->_current_route)) {
464
+        if (method_exists($this, '_redirect_action_'.$this->_current_route)) {
465 465
             add_action(
466
-                'AHEE_redirect_' . $admin_class_name . $this->_current_route,
467
-                array($this, '_redirect_action_' . $this->_current_route),
466
+                'AHEE_redirect_'.$admin_class_name.$this->_current_route,
467
+                array($this, '_redirect_action_'.$this->_current_route),
468 468
                 10
469 469
             );
470 470
         }
471 471
         // let's hook into the _redirect itself and allow for changing where the user goes after redirect.  This will have $query_args and $redirect_url available.
472
-        if (method_exists($this, '_redirect_filter_' . $this->_current_route)) {
472
+        if (method_exists($this, '_redirect_filter_'.$this->_current_route)) {
473 473
             add_filter(
474
-                'FHEE_redirect_' . $admin_class_name . $this->_current_route,
475
-                array($this, '_redirect_filter_' . $this->_current_route),
474
+                'FHEE_redirect_'.$admin_class_name.$this->_current_route,
475
+                array($this, '_redirect_filter_'.$this->_current_route),
476 476
                 10,
477 477
                 2
478 478
             );
@@ -497,12 +497,12 @@  discard block
 block discarded – undo
497 497
                 'argnum'   => 1,
498 498
                 'priority' => 10,
499 499
             ),
500
-            'FHEE_list_table_views_' . $this->_adminpage_obj->page_slug . '_' . $this->_current_route => array(
500
+            'FHEE_list_table_views_'.$this->_adminpage_obj->page_slug.'_'.$this->_current_route => array(
501 501
                 'type'     => 'filter',
502 502
                 'argnum'   => 1,
503 503
                 'priority' => 10,
504 504
             ),
505
-            'FHEE_list_table_views_' . $this->_adminpage_obj->page_slug                               => array(
505
+            'FHEE_list_table_views_'.$this->_adminpage_obj->page_slug                               => array(
506 506
                 'type'     => 'filter',
507 507
                 'argnum'   => 1,
508 508
                 'priority' => 10,
@@ -519,21 +519,21 @@  discard block
 block discarded – undo
519 519
             ),
520 520
         );
521 521
         foreach ($hook_filter_array as $hook => $args) {
522
-            if (method_exists($this, $this->_current_route . '_' . $hook)) {
523
-                if (isset($this->_wp_action_filters_priority[ $hook ])) {
524
-                    $args['priority'] = $this->_wp_action_filters_priority[ $hook ];
522
+            if (method_exists($this, $this->_current_route.'_'.$hook)) {
523
+                if (isset($this->_wp_action_filters_priority[$hook])) {
524
+                    $args['priority'] = $this->_wp_action_filters_priority[$hook];
525 525
                 }
526 526
                 if ($args['type'] == 'action') {
527 527
                     add_action(
528 528
                         $hook,
529
-                        array($this, $this->_current_route . '_' . $hook),
529
+                        array($this, $this->_current_route.'_'.$hook),
530 530
                         $args['priority'],
531 531
                         $args['argnum']
532 532
                     );
533 533
                 } else {
534 534
                     add_filter(
535 535
                         $hook,
536
-                        array($this, $this->_current_route . '_' . $hook),
536
+                        array($this, $this->_current_route.'_'.$hook),
537 537
                         $args['priority'],
538 538
                         $args['argnum']
539 539
                     );
@@ -555,11 +555,11 @@  discard block
 block discarded – undo
555 555
         } //get out there's nothing to take care of.
556 556
         foreach ($this->_ajax_func as $action => $method) {
557 557
             // make sure method exists
558
-            if (! method_exists($this, $method)) {
558
+            if ( ! method_exists($this, $method)) {
559 559
                 $msg[] = __(
560 560
                     'There is no corresponding method for the hook labeled in the _ajax_func array',
561 561
                     'event_espresso'
562
-                ) . '<br />';
562
+                ).'<br />';
563 563
                 $msg[] = sprintf(
564 564
                     __(
565 565
                         'The method name given in the array is %s, check the spelling and make sure it exists in the %s class',
@@ -570,7 +570,7 @@  discard block
 block discarded – undo
570 570
                 );
571 571
                 throw new EE_Error(implode('||', $msg));
572 572
             }
573
-            add_action('wp_ajax_' . $action, array($this, $method));
573
+            add_action('wp_ajax_'.$action, array($this, $method));
574 574
         }
575 575
     }
576 576
 
@@ -589,11 +589,11 @@  discard block
 block discarded – undo
589 589
         $current_route = isset($_REQUEST['action']) ? $_REQUEST['action'] : 'default';
590 590
         foreach ($this->_init_func as $route => $method) {
591 591
             // make sure method exists
592
-            if (! method_exists($this, $method)) {
592
+            if ( ! method_exists($this, $method)) {
593 593
                 $msg[] = __(
594 594
                     'There is no corresponding method for the hook labeled in the _init_func array',
595 595
                     'event_espresso'
596
-                ) . '<br />';
596
+                ).'<br />';
597 597
                 $msg[] = sprintf(
598 598
                     __(
599 599
                         'The method name given in the array is %s, check the spelling and make sure it exists in the %s class',
@@ -630,7 +630,7 @@  discard block
 block discarded – undo
630 630
     private function _handle_metabox_array($boxes, $add = true)
631 631
     {
632 632
         foreach ($boxes as $box) {
633
-            if (! isset($box['page_route'])) {
633
+            if ( ! isset($box['page_route'])) {
634 634
                 continue;
635 635
             } //we dont' have a valid array
636 636
             // let's make sure $box['page_route'] is an array so the "foreach" will work.
@@ -678,7 +678,7 @@  discard block
 block discarded – undo
678 678
         // set defaults
679 679
         $defaults = array(
680 680
             'func'          => $func,
681
-            'id'            => $this->caller . '_' . $func . '_metabox',
681
+            'id'            => $this->caller.'_'.$func.'_metabox',
682 682
             'priority'      => 'default',
683 683
             'label'         => $this->caller,
684 684
             'context'       => 'advanced',
@@ -688,8 +688,8 @@  discard block
 block discarded – undo
688 688
         $args = wp_parse_args($args, $defaults);
689 689
         extract($args);
690 690
         // make sure method exists
691
-        if (! method_exists($this, $func)) {
692
-            $msg[] = __('There is no corresponding method to display the metabox content', 'event_espresso') . '<br />';
691
+        if ( ! method_exists($this, $func)) {
692
+            $msg[] = __('There is no corresponding method to display the metabox content', 'event_espresso').'<br />';
693 693
             $msg[] = sprintf(
694 694
                 __(
695 695
                     'The method name given in the array is %s, check the spelling and make sure it exists in the %s class',
Please login to merge, or discard this patch.
core/libraries/messages/EE_message_type.lib.php 3 patches
Doc Comments   +1 added lines, -1 removed lines patch added patch discarded remove patch
@@ -832,7 +832,7 @@
 block discarded – undo
832 832
      * Takes care of setting up the addressee object(s) for the primary attendee.
833 833
      *
834 834
      * @access protected
835
-     * @return array of EE_Addressee objects
835
+     * @return EE_Messages_Addressee[] of EE_Addressee objects
836 836
      * @throws EE_Error
837 837
      */
838 838
     protected function _primary_attendee_addressees()
Please login to merge, or discard this patch.
Spacing   +29 added lines, -29 removed lines patch added patch discarded remove patch
@@ -408,7 +408,7 @@  discard block
 block discarded – undo
408 408
     {
409 409
         // validate context
410 410
         // valid context?
411
-        if (! isset($this->_contexts[ $context ])) {
411
+        if ( ! isset($this->_contexts[$context])) {
412 412
             throw new EE_Error(
413 413
                 sprintf(
414 414
                     __('The context %s is not a valid context for %s.', 'event_espresso'),
@@ -464,7 +464,7 @@  discard block
 block discarded – undo
464 464
     public function get_data_for_context($context, EE_Registration $registration, $id = 0)
465 465
     {
466 466
         // valid context?
467
-        if (! isset($this->_contexts[ $context ])) {
467
+        if ( ! isset($this->_contexts[$context])) {
468 468
             throw new EE_Error(
469 469
                 sprintf(
470 470
                     __('The context %s is not a valid context for %s.', 'event_espresso'),
@@ -479,7 +479,7 @@  discard block
 block discarded – undo
479 479
             $this->_get_data_for_context($context, $registration, $id),
480 480
             $this
481 481
         );
482
-        $data = apply_filters('FHEE__' . get_class($this) . '__get_data_for_context__data', $data, $this);
482
+        $data = apply_filters('FHEE__'.get_class($this).'__get_data_for_context__data', $data, $this);
483 483
         // if empty then something went wrong!
484 484
         if (empty($data)) {
485 485
             throw new EE_Error(
@@ -539,7 +539,7 @@  discard block
 block discarded – undo
539 539
     public function with_messengers()
540 540
     {
541 541
         return apply_filters(
542
-            'FHEE__EE_message_type__get_with_messengers__with_messengers__' . get_class($this),
542
+            'FHEE__EE_message_type__get_with_messengers__with_messengers__'.get_class($this),
543 543
             $this->_with_messengers
544 544
         );
545 545
     }
@@ -600,7 +600,7 @@  discard block
 block discarded – undo
600 600
     {
601 601
         // first class specific filter then filter that by the global filter.
602 602
         $master_templates = apply_filters(
603
-            'FHEE__' . get_class($this) . '__get_master_templates',
603
+            'FHEE__'.get_class($this).'__get_master_templates',
604 604
             $this->_master_templates
605 605
         );
606 606
         return apply_filters('FHEE__EE_message_type__get_master_templates', $master_templates, $this);
@@ -624,11 +624,11 @@  discard block
 block discarded – undo
624 624
         $addressees        = array();
625 625
         $original_contexts = $this->_contexts;
626 626
         // if incoming context then limit to that context
627
-        if (! empty($context)) {
628
-            $cntxt = ! empty($this->_contexts[ $context ]) ? $this->_contexts[ $context ] : '';
629
-            if (! empty($cntxt)) {
630
-                $this->_contexts           = array();
631
-                $this->_contexts[ $context ] = $cntxt;
627
+        if ( ! empty($context)) {
628
+            $cntxt = ! empty($this->_contexts[$context]) ? $this->_contexts[$context] : '';
629
+            if ( ! empty($cntxt)) {
630
+                $this->_contexts = array();
631
+                $this->_contexts[$context] = $cntxt;
632 632
             }
633 633
         }
634 634
         $this->_set_default_addressee_data();
@@ -653,13 +653,13 @@  discard block
 block discarded – undo
653 653
     {
654 654
         // at a minimum, we NEED EE_Attendee objects.
655 655
         if (empty($this->_data->attendees)) {
656
-            return false;  // there's no data to process!
656
+            return false; // there's no data to process!
657 657
         }
658 658
         // process addressees for each context.  Child classes will have to have methods for
659 659
         // each context defined to handle the processing of the data object within them
660 660
         foreach ($this->_contexts as $context => $details) {
661
-            $xpctd_method = '_' . $context . '_addressees';
662
-            if (! method_exists($this, $xpctd_method)) {
661
+            $xpctd_method = '_'.$context.'_addressees';
662
+            if ( ! method_exists($this, $xpctd_method)) {
663 663
                 throw new EE_Error(
664 664
                     sprintf(
665 665
                         __(
@@ -671,7 +671,7 @@  discard block
 block discarded – undo
671 671
                     )
672 672
                 );
673 673
             }
674
-            $this->_addressees[ $context ] = call_user_func(array($this, $xpctd_method));
674
+            $this->_addressees[$context] = call_user_func(array($this, $xpctd_method));
675 675
         }
676 676
         return true; // data was processed successfully.
677 677
     }
@@ -707,7 +707,7 @@  discard block
 block discarded – undo
707 707
             'total_ticket_count'       => $this->_data->total_ticket_count,
708 708
         );
709 709
         if (is_array($this->_data->primary_attendee_data)) {
710
-            $this->_default_addressee_data                    = array_merge(
710
+            $this->_default_addressee_data = array_merge(
711 711
                 $this->_default_addressee_data,
712 712
                 $this->_data->primary_attendee_data
713 713
             );
@@ -750,25 +750,25 @@  discard block
 block discarded – undo
750 750
             'email',
751 751
             'messenger',
752 752
         );
753
-        $contexts       = $this->get_contexts();
753
+        $contexts = $this->get_contexts();
754 754
         foreach ($contexts as $context => $details) {
755
-            $this->_valid_shortcodes[ $context ] = $all_shortcodes;
755
+            $this->_valid_shortcodes[$context] = $all_shortcodes;
756 756
             // make sure non admin context does not include the event_author shortcodes
757 757
             if ($context != 'admin') {
758
-                if (($key = array_search('event_author', $this->_valid_shortcodes[ $context ])) !== false) {
759
-                    unset($this->_valid_shortcodes[ $context ][ $key ]);
758
+                if (($key = array_search('event_author', $this->_valid_shortcodes[$context])) !== false) {
759
+                    unset($this->_valid_shortcodes[$context][$key]);
760 760
                 }
761 761
             }
762 762
         }
763 763
         // make sure admin context does not include the recipient_details shortcodes
764 764
         // IF we have admin context hooked in message types might not have that context.
765
-        if (! empty($this->_valid_shortcodes['admin'])) {
765
+        if ( ! empty($this->_valid_shortcodes['admin'])) {
766 766
             if (($key = array_search('recipient_details', $this->_valid_shortcodes['admin'])) !== false) {
767
-                unset($this->_valid_shortcodes['admin'][ $key ]);
767
+                unset($this->_valid_shortcodes['admin'][$key]);
768 768
             }
769 769
             // make sure admin context does not include the recipient_details shortcodes
770 770
             if (($key = array_search('recipient_list', $this->_valid_shortcodes['admin'])) !== false) {
771
-                unset($this->_valid_shortcodes['admin'][ $key ]);
771
+                unset($this->_valid_shortcodes['admin'][$key]);
772 772
             }
773 773
         }
774 774
     }
@@ -783,7 +783,7 @@  discard block
 block discarded – undo
783 783
     public function reset_valid_shortcodes_config($new_config)
784 784
     {
785 785
         foreach ($new_config as $context => $shortcodes) {
786
-            $this->_valid_shortcodes[ $context ] = $shortcodes;
786
+            $this->_valid_shortcodes[$context] = $shortcodes;
787 787
         }
788 788
     }
789 789
 
@@ -807,11 +807,11 @@  discard block
 block discarded – undo
807 807
         foreach ($this->_data->events as $line_ref => $event) {
808 808
             $admin_id = $this->_get_event_admin_id($event['ID']);
809 809
             // make sure we are just including the events that belong to this admin!
810
-            $admin_events[ $admin_id ][ $line_ref ] = $event;
810
+            $admin_events[$admin_id][$line_ref] = $event;
811 811
         }
812 812
         // k now we can loop through the event_admins and setup the addressee data.
813 813
         foreach ($admin_events as $admin_id => $event_details) {
814
-            $aee          = array(
814
+            $aee = array(
815 815
                 'user_id'        => $admin_id,
816 816
                 'events'         => $event_details,
817 817
                 'attendees'      => $this->_data->attendees,
@@ -868,7 +868,7 @@  discard block
 block discarded – undo
868 868
             }
869 869
             // is $this->_regs_for_sending present?
870 870
             // If so, let's make sure we ONLY generate addressee for registrations in that array.
871
-            if (! empty($this->_regs_for_sending) && is_array($this->_regs_for_sending)) {
871
+            if ( ! empty($this->_regs_for_sending) && is_array($this->_regs_for_sending)) {
872 872
                 $regs_allowed = array_intersect_key(array_flip($this->_regs_for_sending), $details['reg_objs']);
873 873
                 if (empty($regs_allowed)) {
874 874
                     continue;
@@ -886,10 +886,10 @@  discard block
 block discarded – undo
886 886
             }
887 887
             $already_processed[] = $att_id;
888 888
             foreach ($details as $item => $value) {
889
-                $aee[ $item ] = $value;
889
+                $aee[$item] = $value;
890 890
                 if ($item === 'line_ref') {
891 891
                     foreach ($value as $event_id) {
892
-                        $aee['events'][ $event_id ] = $this->_data->events[ $event_id ];
892
+                        $aee['events'][$event_id] = $this->_data->events[$event_id];
893 893
                     }
894 894
                 }
895 895
                 if ($item === 'attendee_email') {
@@ -901,7 +901,7 @@  discard block
 block discarded – undo
901 901
             }
902 902
             // note the FIRST reg object in this array is the one
903 903
             // we'll use for this attendee as the primary registration for this attendee.
904
-            $aee['reg_obj']        = reset($this->_data->attendees[ $att_id ]['reg_objs']);
904
+            $aee['reg_obj']        = reset($this->_data->attendees[$att_id]['reg_objs']);
905 905
             $aee['attendees']      = $this->_data->attendees;
906 906
             $aee['recipient_id']   = $att_id;
907 907
             $aee['recipient_type'] = 'Attendee';
Please login to merge, or discard this patch.
Indentation   +905 added lines, -905 removed lines patch added patch discarded remove patch
@@ -17,915 +17,915 @@
 block discarded – undo
17 17
 {
18 18
 
19 19
 
20
-    /**
21
-     * message type child classes will set what contexts are associated with the message type via this array.
22
-     * format:
23
-     * array(
24
-     * 'context' => array(
25
-     *        'label' => __('Context Label', 'event_espresso'),
26
-     *        'description' => __('Context description (for help popups)', 'event_espresso')
27
-     *    ));
28
-     *
29
-     * @var array
30
-     */
31
-    protected $_contexts = array();
32
-
33
-
34
-    /**
35
-     * This property is used to define what the display label will be for contexts (eg. "Recipients", "Themes" etc.)
36
-     * Format:
37
-     * array( 'label' => 'something', 'plural' => 'somethings', 'description' => 'something' );
38
-     *
39
-     * @var array
40
-     */
41
-    protected $_context_label;
42
-
43
-
44
-    /** MESSAGE ASSEMBLING PROPERTIES **/
45
-    /**
46
-     * This parameter simply holds all the message objects for retrieval by the controller and sending to the messenger.
47
-     *
48
-     * @var array of message objects.
49
-     */
50
-    public $messages = array();
51
-
52
-    /**
53
-     * The following holds the templates that will be used to assemble the message object for the messenger.
54
-     *
55
-     * @var array
56
-     */
57
-    protected $_templates;
58
-
59
-
60
-    /**
61
-     * If a specific template is being parsed, this will hold the message template group GRP_ID for that template.
62
-     *
63
-     * @var int.
64
-     */
65
-    protected $_GRP_ID;
66
-
67
-
68
-    /** OTHER INFO PROPERTIES **/
69
-    /**
70
-     * This will hold the count of the message objects in the messages array. This could be used for determining if
71
-     * batching/queueing is needed.
72
-     *
73
-     * @var int
74
-     */
75
-    public $count = 0;
76
-
77
-
78
-    /**
79
-     * This is set via the `do_messenger_hooks` method and contains the messenger being used to send the message of
80
-     * this message type at time of sending.
81
-     *
82
-     * @var EE_messenger
83
-     */
84
-    protected $_active_messenger;
85
-
86
-
87
-    /**
88
-     * This will hold the shortcode_replace instance for handling replacement of shortcodes in the various templates
89
-     *
90
-     * @var object
91
-     */
92
-    protected $_shortcode_replace;
93
-
94
-
95
-    /**
96
-     * The purpose for this property is to simply allow message types to indicate if the message generated is intended
97
-     * for only single context.  Child message types should redefine this variable (if necessary) in the
98
-     * _set_data_Handler() method.
99
-     *
100
-     * @var boolean
101
-     */
102
-    protected $_single_message = false;
103
-
104
-
105
-    /**
106
-     * This will hold an array of specific reg_ids that are receiving messages.
107
-     *
108
-     * @since 4.7.x
109
-     * @var array
110
-     */
111
-    protected $_regs_for_sending = array();
112
-
113
-
114
-    /**
115
-     * This holds the data passed to this class from the controller and also the final processed data.
116
-     *
117
-     * @var object
118
-     */
119
-    protected $_data;
120
-
121
-
122
-    /**
123
-     * this is just a flag indicating whether we're in preview mode or not.
124
-     *
125
-     * @var bool
126
-     */
127
-    protected $_preview = false;
128
-
129
-
130
-    /**
131
-     * This just holds defaults for addressee data that children merge with their data array setup
132
-     *
133
-     * @var array
134
-     */
135
-    protected $_default_addressee_data;
136
-
137
-
138
-    /**
139
-     * Child classes declare through this property what handler they want to use for the incoming data and this string
140
-     * is used to instantiate the EE_Messages_incoming_data child class for that handler.
141
-     *
142
-     * @var string
143
-     */
144
-    protected $_data_handler;
145
-
146
-
147
-    /**
148
-     * This holds any specific fields for holding any settings related to a message type (if any needed)
149
-     *
150
-     * @var array
151
-     */
152
-    protected $_admin_settings_fields = array();
153
-
154
-    /**
155
-     * this property will hold any existing setting that may have been set in the admin.
156
-     *
157
-     * @var array
158
-     */
159
-    protected $_existing_admin_settings = array();
160
-
161
-
162
-    /**
163
-     * This is used to designate the generating and alternative sending messengers for a message type.  It is set via
164
-     * set_with_messengers() on construct. Note, generating messenger also acts as a sending messenger for this message
165
-     * type.  However ONLY the generating messengers are used for creating templates for this message type. Should be
166
-     * in this format:
167
-     * {
168
-     *
169
-     * @type string $generating_messenger the name of the generating messenger.  Generating
170
-     *                                          messengers are used for generating templates,
171
-     *                                          doing validation and defining valid shortcodes.
172
-     *      {
173
-     * @type string $sending_messenger    values are the name(s) for the sending
174
-     *                                              messengers.  sending messengers are
175
-     *                                              just valid delivery vehicles that will utilize
176
-     *                                              the templates (and generated EE_message
177
-     *                                              objects from the generating messengers).
178
-     *      }
179
-     * }
180
-     * @since                             4.5.0
181
-     * @var array
182
-     */
183
-    protected $_with_messengers = array();
184
-
185
-
186
-    /**
187
-     * This holds the addressees in an array indexed by context for later retrieval when assembling the message objects.
188
-     *
189
-     * @access protected
190
-     * @var array
191
-     */
192
-    protected $_addressees = array();
193
-
194
-
195
-    /**
196
-     * This allows each message type to set what alternate messenger&message type combination can be used for fallback
197
-     * default templates if there are no specific ones defined for this messenger and message type.  Should be in the
198
-     * format:
199
-     * array(
200
-     *      'messenger' => 'message_type',
201
-     *      'another_messenger' => another_message_type
202
-     * );
203
-     * This is set in the message type constructor.
204
-     *
205
-     * @var array
206
-     */
207
-    protected $_master_templates = array();
208
-
209
-
210
-    /**
211
-     * This holds whatever the set template pack is for a message template group when generating messages.
212
-     *
213
-     * @since 4.5.0
214
-     * @var EE_Messages_Template_Pack
215
-     */
216
-    protected $_template_pack;
217
-
218
-
219
-    /**
220
-     * This holds whatever the set variation is for a message template group when generating messages.
221
-     *
222
-     * @since 4.5.0
223
-     * @var string
224
-     */
225
-    protected $_variation;
226
-
227
-
228
-    /**
229
-     * EE_message_type constructor.
230
-     */
231
-    public function __construct()
232
-    {
233
-        $this->_messages_item_type = 'message_type';
234
-        $this->_set_contexts();
235
-        $this->_set_with_messengers();
236
-        parent::__construct();
237
-    }
238
-
239
-
240
-    /**
241
-     * This sets the data handler for the message type.  It must be used to define the _data_handler property.  It is
242
-     * called when messages are setup.
243
-     *
244
-     * @abstract
245
-     * @access protected
246
-     * @return void
247
-     */
248
-    abstract protected function _set_data_handler();
249
-
250
-
251
-    /**
252
-     * This method should return a EE_Base_Class object (or array of EE_Base_Class objects) for the given context and
253
-     * ID (which should be the primary key id for the base class).  Client code doesn't have to know what a message
254
-     * type's data handler is.
255
-     *
256
-     * @since 4.5.0
257
-     * @param string          $context      This should be a string matching a valid context for the message type.
258
-     * @param EE_Registration $registration Need a registration to ensure that the data is valid (prevents people
259
-     *                                      guessing a url).
260
-     * @param int             $id           Optional. Integer corresponding to the value for the primary key of a
261
-     *                                      EE_Base_Class_Object
262
-     * @return mixed ( EE_Base_Class||EE_Base_Class[] )
263
-     */
264
-    abstract protected function _get_data_for_context($context, EE_Registration $registration, $id);
265
-
266
-
267
-    /**
268
-     * _set_contexts
269
-     * This sets up the contexts associated with the message_type
270
-     *
271
-     * @abstract
272
-     * @access  protected
273
-     * @return  void
274
-     */
275
-    abstract protected function _set_contexts();
276
-
277
-
278
-    /**
279
-     * This is used to get the "id" value fo the msg_trigger_url generated by get_url_trigger().
280
-     * In most cases, child classes don't need anything, (hence the default of 0), however if there is a specific
281
-     * EE_Base_Class that is required in generating a message for a message type recipient then the message
282
-     * type should override this method and use the given params to generate the correct ID.
283
-     *
284
-     * @param string          $context      The message type context.
285
-     * @param EE_Registration $registration Registration object
286
-     * @deprecated 4.9.0
287
-     * @return int
288
-     */
289
-    protected function _get_id_for_msg_url($context, EE_Registration $registration)
290
-    {
291
-        return 0;
292
-    }
293
-
294
-
295
-    /**
296
-     * This sets up any action/filter hooks this message type puts in place for a specific messenger.  Note that by
297
-     * default this does nothing.  Child classes will need to override if they want to add specific hooks for a
298
-     * messenger.
299
-     *
300
-     * @since 1.0.0
301
-     * @return void
302
-     */
303
-    protected function _do_messenger_hooks()
304
-    {
305
-        return;
306
-    }
307
-
308
-
309
-    /**
310
-     * This is a public wrapper for the protected _do_messenger_hooks() method.
311
-     * For backward compat reasons, this was done rather than making the protected method public.
312
-     *
313
-     * @param   EE_messenger $messenger This is used to set the $_active_messenger property, so message types are able
314
-     *                                  to know what messenger is being used to send the message at the time of
315
-     *                                  sending.
316
-     * @since 4.9.0
317
-     */
318
-    public function do_messenger_hooks($messenger = null)
319
-    {
320
-        $this->_active_messenger = $messenger;
321
-        $this->_do_messenger_hooks();
322
-    }
323
-
324
-
325
-    /**
326
-     * This method returns whether this message type should always generate a new copy
327
-     * when requested, or if links can be to the already generated copy.
328
-     * Note: this does NOT affect viewing/resending already generated messages in the EE_Message list table.
329
-     * Child classes should override this if different from the default of false.
330
-     *
331
-     * @return bool     false means can link to generated EE_Message.  true must regenerate.
332
-     */
333
-    public function always_generate()
334
-    {
335
-        return false;
336
-    }
337
-
338
-
339
-    /**
340
-     * Returns the priority for the message type.
341
-     * Priorities are defined as constants on EEM_Message.  Currently there are three priorities:
342
-     * - EEM_Message::priority_high
343
-     * - EEM_Message::priority_medium
344
-     * - EEM_Message::priority_low
345
-     * Priority is used to determine the weight the message type is given when queuing for generation and/or sending.
346
-     *
347
-     * @see    EEM_Message for more phpdocs on priority.
348
-     *         The default priority for all message_types is EEM_Message::priority_low.  Message Types wanting to give
349
-     *         a higher priority must override this method. Also note, messengers are able to override priorities
350
-     *         queuing instructions if their "send_now" flag is set to true. An example of this is the HTML messenger
351
-     *         which displays things in the browser.
352
-     * @since  4.9.0
353
-     * @return int
354
-     */
355
-    public function get_priority()
356
-    {
357
-        return EEM_Message::priority_low;
358
-    }
359
-
360
-
361
-    /**
362
-     * This runs the _set_data_handler() method for message types and then returns what got set.
363
-     *
364
-     * @param mixed $data This sets the data property for the message type with the incoming data used for generating.
365
-     * @return string (the reference for the data handler) (will be an empty string if could not be determined).
366
-     */
367
-    public function get_data_handler($data)
368
-    {
369
-        $this->_data = $data;
370
-        $this->_set_data_handler();
371
-        return apply_filters('FHEE__EE_message_type__get_data_handler', $this->_data_handler, $this);
372
-    }
373
-
374
-
375
-    /**
376
-     * This is called externally to reset the value of the $_data property for the message type.
377
-     * Please note the value of the _data is highly volatile.  It was added as an interim measure ensuring
378
-     * EE_Message_To_Generate objects have any changes to the _data property when `_set_data_handler` method is called
379
-     * (and for back compat reasons). This particular method is used in
380
-     * EE_Messages_Generator::_reset_current_properties to ensure that the internal _data on the message type is
381
-     * cleaned before subsequent EE_Message generation in the same request.
382
-     *
383
-     * @todo      This needs refactored along with the whole _set_data_handler() method in EE_message_types. Need to
384
-     *            ensure that there is no manipulation of the _data property during run time so there's a clear
385
-     *            expectation of what it is.  Likely we need to ensure that _data is not persisted IN the message type
386
-     *            at all.
387
-     * @internal  Plugin authors, do not implement this method, it is subject to change.
388
-     * @since     4.9
389
-     */
390
-    public function reset_data()
391
-    {
392
-        $this->_data = null;
393
-    }
394
-
395
-
396
-    /**
397
-     * This does some validation of incoming params gets the url trigger from the defined method in the specific child
398
-     * class and then filters the results.
399
-     *
400
-     * @param string          $context           The message type context
401
-     * @param string          $sending_messenger The sending messenger
402
-     * @param EE_Registration $registration      Registration object
403
-     * @throws EE_Error
404
-     * @deprecated  4.9.0  Likely 4.9.10 or 4.10.0 will remove this method completely
405
-     * @return string          generated url
406
-     */
407
-    public function get_url_trigger($context, $sending_messenger, EE_Registration $registration)
408
-    {
409
-        // validate context
410
-        // valid context?
411
-        if (! isset($this->_contexts[ $context ])) {
412
-            throw new EE_Error(
413
-                sprintf(
414
-                    __('The context %s is not a valid context for %s.', 'event_espresso'),
415
-                    $context,
416
-                    get_class($this)
417
-                )
418
-            );
419
-        }
420
-        // valid sending_messenger?
421
-        $not_valid_msgr = false;
422
-        foreach ($this->_with_messengers as $generating => $sendings) {
423
-            if (empty($sendings) || array_search($sending_messenger, $sendings) === false) {
424
-                $not_valid_msgr = true;
425
-            }
426
-        }
427
-        if ($not_valid_msgr) {
428
-            throw new EE_Error(
429
-                sprintf(
430
-                    __(
431
-                        'The given sending messenger string (%s) does not match a valid sending messenger with the %s.  If this is incorrect, make sure that the message type has defined this messenger as a sending messenger in its $_with_messengers array.',
432
-                        'event_espresso'
433
-                    ),
434
-                    $sending_messenger,
435
-                    get_class($this)
436
-                )
437
-            );
438
-        }
439
-        return EEH_MSG_Template::generate_url_trigger(
440
-            $sending_messenger,
441
-            $this->_active_messenger->name,
442
-            $context,
443
-            $this->name,
444
-            $registration,
445
-            $this->_GRP_ID,
446
-            $this->_get_id_for_msg_url($context, $registration)
447
-        );
448
-    }
449
-
450
-
451
-    /**
452
-     * Wrapper for _get_data_for_context() that handles some validation before calling the main class and also allows
453
-     * for filtering. This is (currently) called by the EED_Messages module.
454
-     *
455
-     * @since 4.5.0
456
-     * @throws EE_Error
457
-     * @param string          $context      This should be a string matching a valid context for the message type.
458
-     * @param EE_Registration $registration Need a registration to ensure that the data is valid (prevents people
459
-     *                                      guessing a url).
460
-     * @param int             $id           Optional. Integer corresponding to the value for the primary key of a
461
-     *                                      EE_Base_Class_Object
462
-     * @return mixed (EE_Base_Class||EE_Base_Class[])
463
-     */
464
-    public function get_data_for_context($context, EE_Registration $registration, $id = 0)
465
-    {
466
-        // valid context?
467
-        if (! isset($this->_contexts[ $context ])) {
468
-            throw new EE_Error(
469
-                sprintf(
470
-                    __('The context %s is not a valid context for %s.', 'event_espresso'),
471
-                    $context,
472
-                    get_class($this)
473
-                )
474
-            );
475
-        }
476
-        // get data and apply global and class specific filters on it.
477
-        $data = apply_filters(
478
-            'FHEE__EE_message_type__get_data_for_context__data',
479
-            $this->_get_data_for_context($context, $registration, $id),
480
-            $this
481
-        );
482
-        $data = apply_filters('FHEE__' . get_class($this) . '__get_data_for_context__data', $data, $this);
483
-        // if empty then something went wrong!
484
-        if (empty($data)) {
485
-            throw new EE_Error(
486
-                sprintf(
487
-                    __(
488
-                        'There is no data retrieved, it is possible that the id given (%d) does not match any value in the database for the corresponding EE_Base_Class used by the data handler for the %s message type.',
489
-                        'event_espresso'
490
-                    ),
491
-                    $id,
492
-                    $this->name
493
-                )
494
-            );
495
-        }
496
-        return $data;
497
-    }
498
-
499
-
500
-    /**
501
-     * This returns the contents of the _data property.
502
-     * Please note the value of the _data is highly volatile.  It was added as an interim measure ensuring
503
-     * EE_Message_To_Generate objects have any changes to the _data property when `_set_data_handler` method is called.
504
-     *
505
-     * @todo      This needs refactored along with the whole _set_data_handler() method in EE_message_types. Need to
506
-     *            ensure that there is no manipulation of the _data property during run time so there's a clear
507
-     *            expectation of what it is.
508
-     * @internal  Plugin authors, do not implement this method, it is subject to change.
509
-     * @return mixed
510
-     */
511
-    public function get_data()
512
-    {
513
-        return $this->_data;
514
-    }
515
-
516
-
517
-    /**
518
-     * used to set the $_with_messengers property. (this is a default, child classes SHOULD override)
519
-     *
520
-     * @see   property definition for description of setup.
521
-     * @since 4.5.0
522
-     * @abstract
523
-     * @return void
524
-     */
525
-    protected function _set_with_messengers()
526
-    {
527
-        $this->_with_messengers = array(
528
-            'email' => array('html'),
529
-        );
530
-    }
531
-
532
-
533
-    /**
534
-     * Return the value of the _with_messengers property
535
-     *
536
-     * @since 4.5.0
537
-     * @return array
538
-     */
539
-    public function with_messengers()
540
-    {
541
-        return apply_filters(
542
-            'FHEE__EE_message_type__get_with_messengers__with_messengers__' . get_class($this),
543
-            $this->_with_messengers
544
-        );
545
-    }
546
-
547
-
548
-    /**
549
-     * this public method accepts a page slug (for an EE_admin page) and will return the response from the child class
550
-     * callback function if that page is registered via the `_admin_registered_page` property set by the child class.
551
-     * *
552
-     *
553
-     * @param string $page       the slug of the EE admin page
554
-     * @param array  $messengers an array of active messenger objects
555
-     * @param string $action     the page action (to allow for more specific handling - i.e. edit vs. add pages)
556
-     * @param array  $extra      This is just an extra argument that can be used to pass additional data for setting up
557
-     *                           page content.
558
-     * @access public
559
-     * @return string
560
-     */
561
-    public function get_message_type_admin_page_content(
562
-        $page,
563
-        $action = null,
564
-        $extra = array(),
565
-        $messengers = array()
566
-    ) {
567
-        // we can also further refine the context by action (if present).
568
-        return $this->_get_admin_page_content($page, $action, $extra, $messengers);
569
-    }
570
-
571
-
572
-    /**
573
-     * @return array
574
-     */
575
-    public function get_contexts()
576
-    {
577
-        return $this->_contexts;
578
-    }
579
-
580
-
581
-    /**
582
-     * This just returns the context label for a given context (as set in $_context_label property)
583
-     *
584
-     * @access public
585
-     * @return array
586
-     */
587
-    public function get_context_label()
588
-    {
589
-        return $this->_context_label;
590
-    }
591
-
592
-
593
-    /**
594
-     * This just returns the (filtered) _master_templates property.
595
-     *
596
-     * @see property definition for documentation.
597
-     * @return array
598
-     */
599
-    public function get_master_templates()
600
-    {
601
-        // first class specific filter then filter that by the global filter.
602
-        $master_templates = apply_filters(
603
-            'FHEE__' . get_class($this) . '__get_master_templates',
604
-            $this->_master_templates
605
-        );
606
-        return apply_filters('FHEE__EE_message_type__get_master_templates', $master_templates, $this);
607
-    }
608
-
609
-
610
-    /**
611
-     * Accepts an incoming data handler which contains data for processing, and returns an array of
612
-     * EE_Messages_Addressee objects.
613
-     *
614
-     * @param EE_Messages_incoming_data $data
615
-     * @param string                    $context Limit addressees to specific context.
616
-     * @return array An array indexed by context where each context is an array of EE_Messages_Addressee objects for
617
-     *                                           that context
618
-     * @throws EE_Error
619
-     */
620
-    public function get_addressees(EE_Messages_incoming_data $data, $context = '')
621
-    {
622
-        // override _data
623
-        $this->_data       = $data;
624
-        $addressees        = array();
625
-        $original_contexts = $this->_contexts;
626
-        // if incoming context then limit to that context
627
-        if (! empty($context)) {
628
-            $cntxt = ! empty($this->_contexts[ $context ]) ? $this->_contexts[ $context ] : '';
629
-            if (! empty($cntxt)) {
630
-                $this->_contexts           = array();
631
-                $this->_contexts[ $context ] = $cntxt;
632
-            }
633
-        }
634
-        $this->_set_default_addressee_data();
635
-        if ($this->_process_data()) {
636
-            $addressees = $this->_addressees;
637
-        }
638
-
639
-        // reset contexts and addressees
640
-        $this->_contexts   = $original_contexts;
641
-        $this->_addressees = array();
642
-        return $addressees;
643
-    }
644
-
645
-
646
-    /**
647
-     * processes the data object so we get
648
-     *
649
-     * @throws EE_Error
650
-     * @return bool  true means data was processed successfully, false means not.
651
-     */
652
-    protected function _process_data()
653
-    {
654
-        // at a minimum, we NEED EE_Attendee objects.
655
-        if (empty($this->_data->attendees)) {
656
-            return false;  // there's no data to process!
657
-        }
658
-        // process addressees for each context.  Child classes will have to have methods for
659
-        // each context defined to handle the processing of the data object within them
660
-        foreach ($this->_contexts as $context => $details) {
661
-            $xpctd_method = '_' . $context . '_addressees';
662
-            if (! method_exists($this, $xpctd_method)) {
663
-                throw new EE_Error(
664
-                    sprintf(
665
-                        __(
666
-                            'The data for %1$s message type cannot be prepared because there is no set method for doing so.  The expected method name is "%2$s" please doublecheck the %1$s message type class and make sure that method is present',
667
-                            'event_espresso'
668
-                        ),
669
-                        $this->label['singular'],
670
-                        $xpctd_method
671
-                    )
672
-                );
673
-            }
674
-            $this->_addressees[ $context ] = call_user_func(array($this, $xpctd_method));
675
-        }
676
-        return true; // data was processed successfully.
677
-    }
678
-
679
-
680
-    /**
681
-     * sets the default_addressee_data property,
682
-     *
683
-     * @access private
684
-     * @return void
685
-     */
686
-    private function _set_default_addressee_data()
687
-    {
688
-        $this->_default_addressee_data = array(
689
-            'billing'                  => $this->_data->billing,
690
-            'taxes'                    => $this->_data->taxes,
691
-            'tax_line_items'           => $this->_data->tax_line_items,
692
-            'additional_line_items'    => $this->_data->additional_line_items,
693
-            'grand_total_line_item'    => $this->_data->grand_total_line_item,
694
-            'txn'                      => $this->_data->txn,
695
-            'payments'                 => $this->_data->payments,
696
-            'payment'                  => isset($this->_data->payment) && $this->_data->payment instanceof EE_Payment
697
-                ? $this->_data->payment
698
-                : null,
699
-            'reg_objs'                 => $this->_data->reg_objs,
700
-            'registrations'            => $this->_data->registrations,
701
-            'datetimes'                => $this->_data->datetimes,
702
-            'tickets'                  => $this->_data->tickets,
703
-            'line_items_with_children' => $this->_data->line_items_with_children,
704
-            'questions'                => $this->_data->questions,
705
-            'answers'                  => $this->_data->answers,
706
-            'txn_status'               => $this->_data->txn_status,
707
-            'total_ticket_count'       => $this->_data->total_ticket_count,
708
-        );
709
-        if (is_array($this->_data->primary_attendee_data)) {
710
-            $this->_default_addressee_data                    = array_merge(
711
-                $this->_default_addressee_data,
712
-                $this->_data->primary_attendee_data
713
-            );
714
-            $this->_default_addressee_data['primary_att_obj'] = $this->_data->primary_attendee_data['att_obj'];
715
-            $this->_default_addressee_data['primary_reg_obj'] = $this->_data->primary_attendee_data['reg_obj'];
716
-        }
717
-    }
718
-
719
-
720
-
721
-    /********************
20
+	/**
21
+	 * message type child classes will set what contexts are associated with the message type via this array.
22
+	 * format:
23
+	 * array(
24
+	 * 'context' => array(
25
+	 *        'label' => __('Context Label', 'event_espresso'),
26
+	 *        'description' => __('Context description (for help popups)', 'event_espresso')
27
+	 *    ));
28
+	 *
29
+	 * @var array
30
+	 */
31
+	protected $_contexts = array();
32
+
33
+
34
+	/**
35
+	 * This property is used to define what the display label will be for contexts (eg. "Recipients", "Themes" etc.)
36
+	 * Format:
37
+	 * array( 'label' => 'something', 'plural' => 'somethings', 'description' => 'something' );
38
+	 *
39
+	 * @var array
40
+	 */
41
+	protected $_context_label;
42
+
43
+
44
+	/** MESSAGE ASSEMBLING PROPERTIES **/
45
+	/**
46
+	 * This parameter simply holds all the message objects for retrieval by the controller and sending to the messenger.
47
+	 *
48
+	 * @var array of message objects.
49
+	 */
50
+	public $messages = array();
51
+
52
+	/**
53
+	 * The following holds the templates that will be used to assemble the message object for the messenger.
54
+	 *
55
+	 * @var array
56
+	 */
57
+	protected $_templates;
58
+
59
+
60
+	/**
61
+	 * If a specific template is being parsed, this will hold the message template group GRP_ID for that template.
62
+	 *
63
+	 * @var int.
64
+	 */
65
+	protected $_GRP_ID;
66
+
67
+
68
+	/** OTHER INFO PROPERTIES **/
69
+	/**
70
+	 * This will hold the count of the message objects in the messages array. This could be used for determining if
71
+	 * batching/queueing is needed.
72
+	 *
73
+	 * @var int
74
+	 */
75
+	public $count = 0;
76
+
77
+
78
+	/**
79
+	 * This is set via the `do_messenger_hooks` method and contains the messenger being used to send the message of
80
+	 * this message type at time of sending.
81
+	 *
82
+	 * @var EE_messenger
83
+	 */
84
+	protected $_active_messenger;
85
+
86
+
87
+	/**
88
+	 * This will hold the shortcode_replace instance for handling replacement of shortcodes in the various templates
89
+	 *
90
+	 * @var object
91
+	 */
92
+	protected $_shortcode_replace;
93
+
94
+
95
+	/**
96
+	 * The purpose for this property is to simply allow message types to indicate if the message generated is intended
97
+	 * for only single context.  Child message types should redefine this variable (if necessary) in the
98
+	 * _set_data_Handler() method.
99
+	 *
100
+	 * @var boolean
101
+	 */
102
+	protected $_single_message = false;
103
+
104
+
105
+	/**
106
+	 * This will hold an array of specific reg_ids that are receiving messages.
107
+	 *
108
+	 * @since 4.7.x
109
+	 * @var array
110
+	 */
111
+	protected $_regs_for_sending = array();
112
+
113
+
114
+	/**
115
+	 * This holds the data passed to this class from the controller and also the final processed data.
116
+	 *
117
+	 * @var object
118
+	 */
119
+	protected $_data;
120
+
121
+
122
+	/**
123
+	 * this is just a flag indicating whether we're in preview mode or not.
124
+	 *
125
+	 * @var bool
126
+	 */
127
+	protected $_preview = false;
128
+
129
+
130
+	/**
131
+	 * This just holds defaults for addressee data that children merge with their data array setup
132
+	 *
133
+	 * @var array
134
+	 */
135
+	protected $_default_addressee_data;
136
+
137
+
138
+	/**
139
+	 * Child classes declare through this property what handler they want to use for the incoming data and this string
140
+	 * is used to instantiate the EE_Messages_incoming_data child class for that handler.
141
+	 *
142
+	 * @var string
143
+	 */
144
+	protected $_data_handler;
145
+
146
+
147
+	/**
148
+	 * This holds any specific fields for holding any settings related to a message type (if any needed)
149
+	 *
150
+	 * @var array
151
+	 */
152
+	protected $_admin_settings_fields = array();
153
+
154
+	/**
155
+	 * this property will hold any existing setting that may have been set in the admin.
156
+	 *
157
+	 * @var array
158
+	 */
159
+	protected $_existing_admin_settings = array();
160
+
161
+
162
+	/**
163
+	 * This is used to designate the generating and alternative sending messengers for a message type.  It is set via
164
+	 * set_with_messengers() on construct. Note, generating messenger also acts as a sending messenger for this message
165
+	 * type.  However ONLY the generating messengers are used for creating templates for this message type. Should be
166
+	 * in this format:
167
+	 * {
168
+	 *
169
+	 * @type string $generating_messenger the name of the generating messenger.  Generating
170
+	 *                                          messengers are used for generating templates,
171
+	 *                                          doing validation and defining valid shortcodes.
172
+	 *      {
173
+	 * @type string $sending_messenger    values are the name(s) for the sending
174
+	 *                                              messengers.  sending messengers are
175
+	 *                                              just valid delivery vehicles that will utilize
176
+	 *                                              the templates (and generated EE_message
177
+	 *                                              objects from the generating messengers).
178
+	 *      }
179
+	 * }
180
+	 * @since                             4.5.0
181
+	 * @var array
182
+	 */
183
+	protected $_with_messengers = array();
184
+
185
+
186
+	/**
187
+	 * This holds the addressees in an array indexed by context for later retrieval when assembling the message objects.
188
+	 *
189
+	 * @access protected
190
+	 * @var array
191
+	 */
192
+	protected $_addressees = array();
193
+
194
+
195
+	/**
196
+	 * This allows each message type to set what alternate messenger&message type combination can be used for fallback
197
+	 * default templates if there are no specific ones defined for this messenger and message type.  Should be in the
198
+	 * format:
199
+	 * array(
200
+	 *      'messenger' => 'message_type',
201
+	 *      'another_messenger' => another_message_type
202
+	 * );
203
+	 * This is set in the message type constructor.
204
+	 *
205
+	 * @var array
206
+	 */
207
+	protected $_master_templates = array();
208
+
209
+
210
+	/**
211
+	 * This holds whatever the set template pack is for a message template group when generating messages.
212
+	 *
213
+	 * @since 4.5.0
214
+	 * @var EE_Messages_Template_Pack
215
+	 */
216
+	protected $_template_pack;
217
+
218
+
219
+	/**
220
+	 * This holds whatever the set variation is for a message template group when generating messages.
221
+	 *
222
+	 * @since 4.5.0
223
+	 * @var string
224
+	 */
225
+	protected $_variation;
226
+
227
+
228
+	/**
229
+	 * EE_message_type constructor.
230
+	 */
231
+	public function __construct()
232
+	{
233
+		$this->_messages_item_type = 'message_type';
234
+		$this->_set_contexts();
235
+		$this->_set_with_messengers();
236
+		parent::__construct();
237
+	}
238
+
239
+
240
+	/**
241
+	 * This sets the data handler for the message type.  It must be used to define the _data_handler property.  It is
242
+	 * called when messages are setup.
243
+	 *
244
+	 * @abstract
245
+	 * @access protected
246
+	 * @return void
247
+	 */
248
+	abstract protected function _set_data_handler();
249
+
250
+
251
+	/**
252
+	 * This method should return a EE_Base_Class object (or array of EE_Base_Class objects) for the given context and
253
+	 * ID (which should be the primary key id for the base class).  Client code doesn't have to know what a message
254
+	 * type's data handler is.
255
+	 *
256
+	 * @since 4.5.0
257
+	 * @param string          $context      This should be a string matching a valid context for the message type.
258
+	 * @param EE_Registration $registration Need a registration to ensure that the data is valid (prevents people
259
+	 *                                      guessing a url).
260
+	 * @param int             $id           Optional. Integer corresponding to the value for the primary key of a
261
+	 *                                      EE_Base_Class_Object
262
+	 * @return mixed ( EE_Base_Class||EE_Base_Class[] )
263
+	 */
264
+	abstract protected function _get_data_for_context($context, EE_Registration $registration, $id);
265
+
266
+
267
+	/**
268
+	 * _set_contexts
269
+	 * This sets up the contexts associated with the message_type
270
+	 *
271
+	 * @abstract
272
+	 * @access  protected
273
+	 * @return  void
274
+	 */
275
+	abstract protected function _set_contexts();
276
+
277
+
278
+	/**
279
+	 * This is used to get the "id" value fo the msg_trigger_url generated by get_url_trigger().
280
+	 * In most cases, child classes don't need anything, (hence the default of 0), however if there is a specific
281
+	 * EE_Base_Class that is required in generating a message for a message type recipient then the message
282
+	 * type should override this method and use the given params to generate the correct ID.
283
+	 *
284
+	 * @param string          $context      The message type context.
285
+	 * @param EE_Registration $registration Registration object
286
+	 * @deprecated 4.9.0
287
+	 * @return int
288
+	 */
289
+	protected function _get_id_for_msg_url($context, EE_Registration $registration)
290
+	{
291
+		return 0;
292
+	}
293
+
294
+
295
+	/**
296
+	 * This sets up any action/filter hooks this message type puts in place for a specific messenger.  Note that by
297
+	 * default this does nothing.  Child classes will need to override if they want to add specific hooks for a
298
+	 * messenger.
299
+	 *
300
+	 * @since 1.0.0
301
+	 * @return void
302
+	 */
303
+	protected function _do_messenger_hooks()
304
+	{
305
+		return;
306
+	}
307
+
308
+
309
+	/**
310
+	 * This is a public wrapper for the protected _do_messenger_hooks() method.
311
+	 * For backward compat reasons, this was done rather than making the protected method public.
312
+	 *
313
+	 * @param   EE_messenger $messenger This is used to set the $_active_messenger property, so message types are able
314
+	 *                                  to know what messenger is being used to send the message at the time of
315
+	 *                                  sending.
316
+	 * @since 4.9.0
317
+	 */
318
+	public function do_messenger_hooks($messenger = null)
319
+	{
320
+		$this->_active_messenger = $messenger;
321
+		$this->_do_messenger_hooks();
322
+	}
323
+
324
+
325
+	/**
326
+	 * This method returns whether this message type should always generate a new copy
327
+	 * when requested, or if links can be to the already generated copy.
328
+	 * Note: this does NOT affect viewing/resending already generated messages in the EE_Message list table.
329
+	 * Child classes should override this if different from the default of false.
330
+	 *
331
+	 * @return bool     false means can link to generated EE_Message.  true must regenerate.
332
+	 */
333
+	public function always_generate()
334
+	{
335
+		return false;
336
+	}
337
+
338
+
339
+	/**
340
+	 * Returns the priority for the message type.
341
+	 * Priorities are defined as constants on EEM_Message.  Currently there are three priorities:
342
+	 * - EEM_Message::priority_high
343
+	 * - EEM_Message::priority_medium
344
+	 * - EEM_Message::priority_low
345
+	 * Priority is used to determine the weight the message type is given when queuing for generation and/or sending.
346
+	 *
347
+	 * @see    EEM_Message for more phpdocs on priority.
348
+	 *         The default priority for all message_types is EEM_Message::priority_low.  Message Types wanting to give
349
+	 *         a higher priority must override this method. Also note, messengers are able to override priorities
350
+	 *         queuing instructions if their "send_now" flag is set to true. An example of this is the HTML messenger
351
+	 *         which displays things in the browser.
352
+	 * @since  4.9.0
353
+	 * @return int
354
+	 */
355
+	public function get_priority()
356
+	{
357
+		return EEM_Message::priority_low;
358
+	}
359
+
360
+
361
+	/**
362
+	 * This runs the _set_data_handler() method for message types and then returns what got set.
363
+	 *
364
+	 * @param mixed $data This sets the data property for the message type with the incoming data used for generating.
365
+	 * @return string (the reference for the data handler) (will be an empty string if could not be determined).
366
+	 */
367
+	public function get_data_handler($data)
368
+	{
369
+		$this->_data = $data;
370
+		$this->_set_data_handler();
371
+		return apply_filters('FHEE__EE_message_type__get_data_handler', $this->_data_handler, $this);
372
+	}
373
+
374
+
375
+	/**
376
+	 * This is called externally to reset the value of the $_data property for the message type.
377
+	 * Please note the value of the _data is highly volatile.  It was added as an interim measure ensuring
378
+	 * EE_Message_To_Generate objects have any changes to the _data property when `_set_data_handler` method is called
379
+	 * (and for back compat reasons). This particular method is used in
380
+	 * EE_Messages_Generator::_reset_current_properties to ensure that the internal _data on the message type is
381
+	 * cleaned before subsequent EE_Message generation in the same request.
382
+	 *
383
+	 * @todo      This needs refactored along with the whole _set_data_handler() method in EE_message_types. Need to
384
+	 *            ensure that there is no manipulation of the _data property during run time so there's a clear
385
+	 *            expectation of what it is.  Likely we need to ensure that _data is not persisted IN the message type
386
+	 *            at all.
387
+	 * @internal  Plugin authors, do not implement this method, it is subject to change.
388
+	 * @since     4.9
389
+	 */
390
+	public function reset_data()
391
+	{
392
+		$this->_data = null;
393
+	}
394
+
395
+
396
+	/**
397
+	 * This does some validation of incoming params gets the url trigger from the defined method in the specific child
398
+	 * class and then filters the results.
399
+	 *
400
+	 * @param string          $context           The message type context
401
+	 * @param string          $sending_messenger The sending messenger
402
+	 * @param EE_Registration $registration      Registration object
403
+	 * @throws EE_Error
404
+	 * @deprecated  4.9.0  Likely 4.9.10 or 4.10.0 will remove this method completely
405
+	 * @return string          generated url
406
+	 */
407
+	public function get_url_trigger($context, $sending_messenger, EE_Registration $registration)
408
+	{
409
+		// validate context
410
+		// valid context?
411
+		if (! isset($this->_contexts[ $context ])) {
412
+			throw new EE_Error(
413
+				sprintf(
414
+					__('The context %s is not a valid context for %s.', 'event_espresso'),
415
+					$context,
416
+					get_class($this)
417
+				)
418
+			);
419
+		}
420
+		// valid sending_messenger?
421
+		$not_valid_msgr = false;
422
+		foreach ($this->_with_messengers as $generating => $sendings) {
423
+			if (empty($sendings) || array_search($sending_messenger, $sendings) === false) {
424
+				$not_valid_msgr = true;
425
+			}
426
+		}
427
+		if ($not_valid_msgr) {
428
+			throw new EE_Error(
429
+				sprintf(
430
+					__(
431
+						'The given sending messenger string (%s) does not match a valid sending messenger with the %s.  If this is incorrect, make sure that the message type has defined this messenger as a sending messenger in its $_with_messengers array.',
432
+						'event_espresso'
433
+					),
434
+					$sending_messenger,
435
+					get_class($this)
436
+				)
437
+			);
438
+		}
439
+		return EEH_MSG_Template::generate_url_trigger(
440
+			$sending_messenger,
441
+			$this->_active_messenger->name,
442
+			$context,
443
+			$this->name,
444
+			$registration,
445
+			$this->_GRP_ID,
446
+			$this->_get_id_for_msg_url($context, $registration)
447
+		);
448
+	}
449
+
450
+
451
+	/**
452
+	 * Wrapper for _get_data_for_context() that handles some validation before calling the main class and also allows
453
+	 * for filtering. This is (currently) called by the EED_Messages module.
454
+	 *
455
+	 * @since 4.5.0
456
+	 * @throws EE_Error
457
+	 * @param string          $context      This should be a string matching a valid context for the message type.
458
+	 * @param EE_Registration $registration Need a registration to ensure that the data is valid (prevents people
459
+	 *                                      guessing a url).
460
+	 * @param int             $id           Optional. Integer corresponding to the value for the primary key of a
461
+	 *                                      EE_Base_Class_Object
462
+	 * @return mixed (EE_Base_Class||EE_Base_Class[])
463
+	 */
464
+	public function get_data_for_context($context, EE_Registration $registration, $id = 0)
465
+	{
466
+		// valid context?
467
+		if (! isset($this->_contexts[ $context ])) {
468
+			throw new EE_Error(
469
+				sprintf(
470
+					__('The context %s is not a valid context for %s.', 'event_espresso'),
471
+					$context,
472
+					get_class($this)
473
+				)
474
+			);
475
+		}
476
+		// get data and apply global and class specific filters on it.
477
+		$data = apply_filters(
478
+			'FHEE__EE_message_type__get_data_for_context__data',
479
+			$this->_get_data_for_context($context, $registration, $id),
480
+			$this
481
+		);
482
+		$data = apply_filters('FHEE__' . get_class($this) . '__get_data_for_context__data', $data, $this);
483
+		// if empty then something went wrong!
484
+		if (empty($data)) {
485
+			throw new EE_Error(
486
+				sprintf(
487
+					__(
488
+						'There is no data retrieved, it is possible that the id given (%d) does not match any value in the database for the corresponding EE_Base_Class used by the data handler for the %s message type.',
489
+						'event_espresso'
490
+					),
491
+					$id,
492
+					$this->name
493
+				)
494
+			);
495
+		}
496
+		return $data;
497
+	}
498
+
499
+
500
+	/**
501
+	 * This returns the contents of the _data property.
502
+	 * Please note the value of the _data is highly volatile.  It was added as an interim measure ensuring
503
+	 * EE_Message_To_Generate objects have any changes to the _data property when `_set_data_handler` method is called.
504
+	 *
505
+	 * @todo      This needs refactored along with the whole _set_data_handler() method in EE_message_types. Need to
506
+	 *            ensure that there is no manipulation of the _data property during run time so there's a clear
507
+	 *            expectation of what it is.
508
+	 * @internal  Plugin authors, do not implement this method, it is subject to change.
509
+	 * @return mixed
510
+	 */
511
+	public function get_data()
512
+	{
513
+		return $this->_data;
514
+	}
515
+
516
+
517
+	/**
518
+	 * used to set the $_with_messengers property. (this is a default, child classes SHOULD override)
519
+	 *
520
+	 * @see   property definition for description of setup.
521
+	 * @since 4.5.0
522
+	 * @abstract
523
+	 * @return void
524
+	 */
525
+	protected function _set_with_messengers()
526
+	{
527
+		$this->_with_messengers = array(
528
+			'email' => array('html'),
529
+		);
530
+	}
531
+
532
+
533
+	/**
534
+	 * Return the value of the _with_messengers property
535
+	 *
536
+	 * @since 4.5.0
537
+	 * @return array
538
+	 */
539
+	public function with_messengers()
540
+	{
541
+		return apply_filters(
542
+			'FHEE__EE_message_type__get_with_messengers__with_messengers__' . get_class($this),
543
+			$this->_with_messengers
544
+		);
545
+	}
546
+
547
+
548
+	/**
549
+	 * this public method accepts a page slug (for an EE_admin page) and will return the response from the child class
550
+	 * callback function if that page is registered via the `_admin_registered_page` property set by the child class.
551
+	 * *
552
+	 *
553
+	 * @param string $page       the slug of the EE admin page
554
+	 * @param array  $messengers an array of active messenger objects
555
+	 * @param string $action     the page action (to allow for more specific handling - i.e. edit vs. add pages)
556
+	 * @param array  $extra      This is just an extra argument that can be used to pass additional data for setting up
557
+	 *                           page content.
558
+	 * @access public
559
+	 * @return string
560
+	 */
561
+	public function get_message_type_admin_page_content(
562
+		$page,
563
+		$action = null,
564
+		$extra = array(),
565
+		$messengers = array()
566
+	) {
567
+		// we can also further refine the context by action (if present).
568
+		return $this->_get_admin_page_content($page, $action, $extra, $messengers);
569
+	}
570
+
571
+
572
+	/**
573
+	 * @return array
574
+	 */
575
+	public function get_contexts()
576
+	{
577
+		return $this->_contexts;
578
+	}
579
+
580
+
581
+	/**
582
+	 * This just returns the context label for a given context (as set in $_context_label property)
583
+	 *
584
+	 * @access public
585
+	 * @return array
586
+	 */
587
+	public function get_context_label()
588
+	{
589
+		return $this->_context_label;
590
+	}
591
+
592
+
593
+	/**
594
+	 * This just returns the (filtered) _master_templates property.
595
+	 *
596
+	 * @see property definition for documentation.
597
+	 * @return array
598
+	 */
599
+	public function get_master_templates()
600
+	{
601
+		// first class specific filter then filter that by the global filter.
602
+		$master_templates = apply_filters(
603
+			'FHEE__' . get_class($this) . '__get_master_templates',
604
+			$this->_master_templates
605
+		);
606
+		return apply_filters('FHEE__EE_message_type__get_master_templates', $master_templates, $this);
607
+	}
608
+
609
+
610
+	/**
611
+	 * Accepts an incoming data handler which contains data for processing, and returns an array of
612
+	 * EE_Messages_Addressee objects.
613
+	 *
614
+	 * @param EE_Messages_incoming_data $data
615
+	 * @param string                    $context Limit addressees to specific context.
616
+	 * @return array An array indexed by context where each context is an array of EE_Messages_Addressee objects for
617
+	 *                                           that context
618
+	 * @throws EE_Error
619
+	 */
620
+	public function get_addressees(EE_Messages_incoming_data $data, $context = '')
621
+	{
622
+		// override _data
623
+		$this->_data       = $data;
624
+		$addressees        = array();
625
+		$original_contexts = $this->_contexts;
626
+		// if incoming context then limit to that context
627
+		if (! empty($context)) {
628
+			$cntxt = ! empty($this->_contexts[ $context ]) ? $this->_contexts[ $context ] : '';
629
+			if (! empty($cntxt)) {
630
+				$this->_contexts           = array();
631
+				$this->_contexts[ $context ] = $cntxt;
632
+			}
633
+		}
634
+		$this->_set_default_addressee_data();
635
+		if ($this->_process_data()) {
636
+			$addressees = $this->_addressees;
637
+		}
638
+
639
+		// reset contexts and addressees
640
+		$this->_contexts   = $original_contexts;
641
+		$this->_addressees = array();
642
+		return $addressees;
643
+	}
644
+
645
+
646
+	/**
647
+	 * processes the data object so we get
648
+	 *
649
+	 * @throws EE_Error
650
+	 * @return bool  true means data was processed successfully, false means not.
651
+	 */
652
+	protected function _process_data()
653
+	{
654
+		// at a minimum, we NEED EE_Attendee objects.
655
+		if (empty($this->_data->attendees)) {
656
+			return false;  // there's no data to process!
657
+		}
658
+		// process addressees for each context.  Child classes will have to have methods for
659
+		// each context defined to handle the processing of the data object within them
660
+		foreach ($this->_contexts as $context => $details) {
661
+			$xpctd_method = '_' . $context . '_addressees';
662
+			if (! method_exists($this, $xpctd_method)) {
663
+				throw new EE_Error(
664
+					sprintf(
665
+						__(
666
+							'The data for %1$s message type cannot be prepared because there is no set method for doing so.  The expected method name is "%2$s" please doublecheck the %1$s message type class and make sure that method is present',
667
+							'event_espresso'
668
+						),
669
+						$this->label['singular'],
670
+						$xpctd_method
671
+					)
672
+				);
673
+			}
674
+			$this->_addressees[ $context ] = call_user_func(array($this, $xpctd_method));
675
+		}
676
+		return true; // data was processed successfully.
677
+	}
678
+
679
+
680
+	/**
681
+	 * sets the default_addressee_data property,
682
+	 *
683
+	 * @access private
684
+	 * @return void
685
+	 */
686
+	private function _set_default_addressee_data()
687
+	{
688
+		$this->_default_addressee_data = array(
689
+			'billing'                  => $this->_data->billing,
690
+			'taxes'                    => $this->_data->taxes,
691
+			'tax_line_items'           => $this->_data->tax_line_items,
692
+			'additional_line_items'    => $this->_data->additional_line_items,
693
+			'grand_total_line_item'    => $this->_data->grand_total_line_item,
694
+			'txn'                      => $this->_data->txn,
695
+			'payments'                 => $this->_data->payments,
696
+			'payment'                  => isset($this->_data->payment) && $this->_data->payment instanceof EE_Payment
697
+				? $this->_data->payment
698
+				: null,
699
+			'reg_objs'                 => $this->_data->reg_objs,
700
+			'registrations'            => $this->_data->registrations,
701
+			'datetimes'                => $this->_data->datetimes,
702
+			'tickets'                  => $this->_data->tickets,
703
+			'line_items_with_children' => $this->_data->line_items_with_children,
704
+			'questions'                => $this->_data->questions,
705
+			'answers'                  => $this->_data->answers,
706
+			'txn_status'               => $this->_data->txn_status,
707
+			'total_ticket_count'       => $this->_data->total_ticket_count,
708
+		);
709
+		if (is_array($this->_data->primary_attendee_data)) {
710
+			$this->_default_addressee_data                    = array_merge(
711
+				$this->_default_addressee_data,
712
+				$this->_data->primary_attendee_data
713
+			);
714
+			$this->_default_addressee_data['primary_att_obj'] = $this->_data->primary_attendee_data['att_obj'];
715
+			$this->_default_addressee_data['primary_reg_obj'] = $this->_data->primary_attendee_data['reg_obj'];
716
+		}
717
+	}
718
+
719
+
720
+
721
+	/********************
722 722
      * setup default shared addressee object/contexts
723 723
      * These can be utilized simply by defining the context in the child message type.
724 724
      * They can also be overridden if a specific message type needs to do something different for that context.
725 725
      ****************/
726
-    /**
727
-     * see abstract declaration in parent class for details, children message types can
728
-     * override these valid shortcodes if desired (we include all for all contexts by default).
729
-     */
730
-    protected function _set_valid_shortcodes()
731
-    {
732
-        $all_shortcodes = array(
733
-            'attendee_list',
734
-            'attendee',
735
-            'datetime_list',
736
-            'datetime',
737
-            'event_list',
738
-            'event_meta',
739
-            'event',
740
-            'organization',
741
-            'recipient_details',
742
-            'recipient_list',
743
-            'ticket_list',
744
-            'ticket',
745
-            'transaction',
746
-            'venue',
747
-            'primary_registration_details',
748
-            'primary_registration_list',
749
-            'event_author',
750
-            'email',
751
-            'messenger',
752
-        );
753
-        $contexts       = $this->get_contexts();
754
-        foreach ($contexts as $context => $details) {
755
-            $this->_valid_shortcodes[ $context ] = $all_shortcodes;
756
-            // make sure non admin context does not include the event_author shortcodes
757
-            if ($context != 'admin') {
758
-                if (($key = array_search('event_author', $this->_valid_shortcodes[ $context ])) !== false) {
759
-                    unset($this->_valid_shortcodes[ $context ][ $key ]);
760
-                }
761
-            }
762
-        }
763
-        // make sure admin context does not include the recipient_details shortcodes
764
-        // IF we have admin context hooked in message types might not have that context.
765
-        if (! empty($this->_valid_shortcodes['admin'])) {
766
-            if (($key = array_search('recipient_details', $this->_valid_shortcodes['admin'])) !== false) {
767
-                unset($this->_valid_shortcodes['admin'][ $key ]);
768
-            }
769
-            // make sure admin context does not include the recipient_details shortcodes
770
-            if (($key = array_search('recipient_list', $this->_valid_shortcodes['admin'])) !== false) {
771
-                unset($this->_valid_shortcodes['admin'][ $key ]);
772
-            }
773
-        }
774
-    }
775
-
776
-
777
-    /**
778
-     * Used by Validators to modify the valid shortcodes.
779
-     *
780
-     * @param  array $new_config array of valid shortcodes (by context)
781
-     * @return void               sets valid_shortcodes property
782
-     */
783
-    public function reset_valid_shortcodes_config($new_config)
784
-    {
785
-        foreach ($new_config as $context => $shortcodes) {
786
-            $this->_valid_shortcodes[ $context ] = $shortcodes;
787
-        }
788
-    }
789
-
790
-
791
-    /**
792
-     * returns an array of addressee objects for event_admins
793
-     *
794
-     * @access protected
795
-     * @return array array of EE_Messages_Addressee objects
796
-     * @throws EE_Error
797
-     * @throws InvalidArgumentException
798
-     * @throws InvalidDataTypeException
799
-     * @throws InvalidInterfaceException
800
-     */
801
-    protected function _admin_addressees()
802
-    {
803
-        $admin_events = array();
804
-        $addressees   = array();
805
-        // first we need to get the event admin user id for all the events
806
-        // and setup an addressee object for each unique admin user.
807
-        foreach ($this->_data->events as $line_ref => $event) {
808
-            $admin_id = $this->_get_event_admin_id($event['ID']);
809
-            // make sure we are just including the events that belong to this admin!
810
-            $admin_events[ $admin_id ][ $line_ref ] = $event;
811
-        }
812
-        // k now we can loop through the event_admins and setup the addressee data.
813
-        foreach ($admin_events as $admin_id => $event_details) {
814
-            $aee          = array(
815
-                'user_id'        => $admin_id,
816
-                'events'         => $event_details,
817
-                'attendees'      => $this->_data->attendees,
818
-                'recipient_id'   => $admin_id,
819
-                'recipient_type' => 'WP_User',
820
-            );
821
-            $aee          = array_merge($this->_default_addressee_data, $aee);
822
-            $addressees[] = new EE_Messages_Addressee($aee);
823
-        }
824
-        return $addressees;
825
-    }
826
-
827
-
828
-    /**
829
-     * Takes care of setting up the addressee object(s) for the primary attendee.
830
-     *
831
-     * @access protected
832
-     * @return array of EE_Addressee objects
833
-     * @throws EE_Error
834
-     */
835
-    protected function _primary_attendee_addressees()
836
-    {
837
-        $aee                   = $this->_default_addressee_data;
838
-        $aee['events']         = $this->_data->events;
839
-        $aee['attendees']      = $this->_data->attendees;
840
-        $aee['recipient_id']   = $aee['primary_att_obj'] instanceof EE_Attendee ? $aee['primary_att_obj']->ID() : 0;
841
-        $aee['recipient_type'] = 'Attendee';
842
-        // great now we can instantiate the $addressee object and return (as an array);
843
-        $add[] = new EE_Messages_Addressee($aee);
844
-        return $add;
845
-    }
846
-
847
-
848
-    /**
849
-     * Takes care of setting up the addressee object(s) for the registered attendees
850
-     *
851
-     * @access protected
852
-     * @return array of EE_Addressee objects
853
-     */
854
-    protected function _attendee_addressees()
855
-    {
856
-        $add = array();
857
-        // we just have to loop through the attendees.  We'll also set the attached events for each attendee.
858
-        // use to verify unique attendee emails... we don't want to sent multiple copies to the same attendee do we?
859
-        $already_processed = array();
860
-        foreach ($this->_data->attendees as $att_id => $details) {
861
-            // set the attendee array to blank on each loop;
862
-            $aee = array();
863
-            if (
864
-                isset($this->_data->reg_obj)
865
-                && ($this->_data->reg_obj->attendee_ID() != $att_id)
866
-                && $this->_single_message
867
-            ) {
868
-                continue;
869
-            }
870
-            // is $this->_regs_for_sending present?
871
-            // If so, let's make sure we ONLY generate addressee for registrations in that array.
872
-            if (! empty($this->_regs_for_sending) && is_array($this->_regs_for_sending)) {
873
-                $regs_allowed = array_intersect_key(array_flip($this->_regs_for_sending), $details['reg_objs']);
874
-                if (empty($regs_allowed)) {
875
-                    continue;
876
-                }
877
-            }
878
-            if (
879
-                apply_filters(
880
-                    'FHEE__EE_message_type___attendee_addressees__prevent_duplicate_email_sends',
881
-                    true,
882
-                    $this->_data,
883
-                    $this
884
-                )
885
-                && in_array($att_id, $already_processed, true)
886
-            ) {
887
-                continue;
888
-            }
889
-            $already_processed[] = $att_id;
890
-            foreach ($details as $item => $value) {
891
-                $aee[ $item ] = $value;
892
-                if ($item === 'line_ref') {
893
-                    foreach ($value as $event_id) {
894
-                        $aee['events'][ $event_id ] = $this->_data->events[ $event_id ];
895
-                    }
896
-                }
897
-                if ($item === 'attendee_email') {
898
-                    $aee['attendee_email'] = $value;
899
-                }
900
-                /*if ( $item == 'registration_id' ) {
726
+	/**
727
+	 * see abstract declaration in parent class for details, children message types can
728
+	 * override these valid shortcodes if desired (we include all for all contexts by default).
729
+	 */
730
+	protected function _set_valid_shortcodes()
731
+	{
732
+		$all_shortcodes = array(
733
+			'attendee_list',
734
+			'attendee',
735
+			'datetime_list',
736
+			'datetime',
737
+			'event_list',
738
+			'event_meta',
739
+			'event',
740
+			'organization',
741
+			'recipient_details',
742
+			'recipient_list',
743
+			'ticket_list',
744
+			'ticket',
745
+			'transaction',
746
+			'venue',
747
+			'primary_registration_details',
748
+			'primary_registration_list',
749
+			'event_author',
750
+			'email',
751
+			'messenger',
752
+		);
753
+		$contexts       = $this->get_contexts();
754
+		foreach ($contexts as $context => $details) {
755
+			$this->_valid_shortcodes[ $context ] = $all_shortcodes;
756
+			// make sure non admin context does not include the event_author shortcodes
757
+			if ($context != 'admin') {
758
+				if (($key = array_search('event_author', $this->_valid_shortcodes[ $context ])) !== false) {
759
+					unset($this->_valid_shortcodes[ $context ][ $key ]);
760
+				}
761
+			}
762
+		}
763
+		// make sure admin context does not include the recipient_details shortcodes
764
+		// IF we have admin context hooked in message types might not have that context.
765
+		if (! empty($this->_valid_shortcodes['admin'])) {
766
+			if (($key = array_search('recipient_details', $this->_valid_shortcodes['admin'])) !== false) {
767
+				unset($this->_valid_shortcodes['admin'][ $key ]);
768
+			}
769
+			// make sure admin context does not include the recipient_details shortcodes
770
+			if (($key = array_search('recipient_list', $this->_valid_shortcodes['admin'])) !== false) {
771
+				unset($this->_valid_shortcodes['admin'][ $key ]);
772
+			}
773
+		}
774
+	}
775
+
776
+
777
+	/**
778
+	 * Used by Validators to modify the valid shortcodes.
779
+	 *
780
+	 * @param  array $new_config array of valid shortcodes (by context)
781
+	 * @return void               sets valid_shortcodes property
782
+	 */
783
+	public function reset_valid_shortcodes_config($new_config)
784
+	{
785
+		foreach ($new_config as $context => $shortcodes) {
786
+			$this->_valid_shortcodes[ $context ] = $shortcodes;
787
+		}
788
+	}
789
+
790
+
791
+	/**
792
+	 * returns an array of addressee objects for event_admins
793
+	 *
794
+	 * @access protected
795
+	 * @return array array of EE_Messages_Addressee objects
796
+	 * @throws EE_Error
797
+	 * @throws InvalidArgumentException
798
+	 * @throws InvalidDataTypeException
799
+	 * @throws InvalidInterfaceException
800
+	 */
801
+	protected function _admin_addressees()
802
+	{
803
+		$admin_events = array();
804
+		$addressees   = array();
805
+		// first we need to get the event admin user id for all the events
806
+		// and setup an addressee object for each unique admin user.
807
+		foreach ($this->_data->events as $line_ref => $event) {
808
+			$admin_id = $this->_get_event_admin_id($event['ID']);
809
+			// make sure we are just including the events that belong to this admin!
810
+			$admin_events[ $admin_id ][ $line_ref ] = $event;
811
+		}
812
+		// k now we can loop through the event_admins and setup the addressee data.
813
+		foreach ($admin_events as $admin_id => $event_details) {
814
+			$aee          = array(
815
+				'user_id'        => $admin_id,
816
+				'events'         => $event_details,
817
+				'attendees'      => $this->_data->attendees,
818
+				'recipient_id'   => $admin_id,
819
+				'recipient_type' => 'WP_User',
820
+			);
821
+			$aee          = array_merge($this->_default_addressee_data, $aee);
822
+			$addressees[] = new EE_Messages_Addressee($aee);
823
+		}
824
+		return $addressees;
825
+	}
826
+
827
+
828
+	/**
829
+	 * Takes care of setting up the addressee object(s) for the primary attendee.
830
+	 *
831
+	 * @access protected
832
+	 * @return array of EE_Addressee objects
833
+	 * @throws EE_Error
834
+	 */
835
+	protected function _primary_attendee_addressees()
836
+	{
837
+		$aee                   = $this->_default_addressee_data;
838
+		$aee['events']         = $this->_data->events;
839
+		$aee['attendees']      = $this->_data->attendees;
840
+		$aee['recipient_id']   = $aee['primary_att_obj'] instanceof EE_Attendee ? $aee['primary_att_obj']->ID() : 0;
841
+		$aee['recipient_type'] = 'Attendee';
842
+		// great now we can instantiate the $addressee object and return (as an array);
843
+		$add[] = new EE_Messages_Addressee($aee);
844
+		return $add;
845
+	}
846
+
847
+
848
+	/**
849
+	 * Takes care of setting up the addressee object(s) for the registered attendees
850
+	 *
851
+	 * @access protected
852
+	 * @return array of EE_Addressee objects
853
+	 */
854
+	protected function _attendee_addressees()
855
+	{
856
+		$add = array();
857
+		// we just have to loop through the attendees.  We'll also set the attached events for each attendee.
858
+		// use to verify unique attendee emails... we don't want to sent multiple copies to the same attendee do we?
859
+		$already_processed = array();
860
+		foreach ($this->_data->attendees as $att_id => $details) {
861
+			// set the attendee array to blank on each loop;
862
+			$aee = array();
863
+			if (
864
+				isset($this->_data->reg_obj)
865
+				&& ($this->_data->reg_obj->attendee_ID() != $att_id)
866
+				&& $this->_single_message
867
+			) {
868
+				continue;
869
+			}
870
+			// is $this->_regs_for_sending present?
871
+			// If so, let's make sure we ONLY generate addressee for registrations in that array.
872
+			if (! empty($this->_regs_for_sending) && is_array($this->_regs_for_sending)) {
873
+				$regs_allowed = array_intersect_key(array_flip($this->_regs_for_sending), $details['reg_objs']);
874
+				if (empty($regs_allowed)) {
875
+					continue;
876
+				}
877
+			}
878
+			if (
879
+				apply_filters(
880
+					'FHEE__EE_message_type___attendee_addressees__prevent_duplicate_email_sends',
881
+					true,
882
+					$this->_data,
883
+					$this
884
+				)
885
+				&& in_array($att_id, $already_processed, true)
886
+			) {
887
+				continue;
888
+			}
889
+			$already_processed[] = $att_id;
890
+			foreach ($details as $item => $value) {
891
+				$aee[ $item ] = $value;
892
+				if ($item === 'line_ref') {
893
+					foreach ($value as $event_id) {
894
+						$aee['events'][ $event_id ] = $this->_data->events[ $event_id ];
895
+					}
896
+				}
897
+				if ($item === 'attendee_email') {
898
+					$aee['attendee_email'] = $value;
899
+				}
900
+				/*if ( $item == 'registration_id' ) {
901 901
                     $aee['attendee_registration_id'] = $value;
902 902
                 }/**/
903
-            }
904
-            // note the FIRST reg object in this array is the one
905
-            // we'll use for this attendee as the primary registration for this attendee.
906
-            $aee['reg_obj']        = reset($this->_data->attendees[ $att_id ]['reg_objs']);
907
-            $aee['attendees']      = $this->_data->attendees;
908
-            $aee['recipient_id']   = $att_id;
909
-            $aee['recipient_type'] = 'Attendee';
910
-            // merge in the primary attendee data
911
-            $aee   = array_merge($this->_default_addressee_data, $aee);
912
-            $add[] = new EE_Messages_Addressee($aee);
913
-        }
914
-        return $add;
915
-    }
916
-
917
-
918
-    /**
919
-     * @param $event_id
920
-     * @return int
921
-     * @throws EE_Error
922
-     * @throws InvalidArgumentException
923
-     * @throws InvalidDataTypeException
924
-     * @throws InvalidInterfaceException
925
-     */
926
-    protected function _get_event_admin_id($event_id)
927
-    {
928
-        $event = EEM_Event::instance()->get_one_by_ID($event_id);
929
-        return $event instanceof EE_Event ? $event->wp_user() : 0;
930
-    }
903
+			}
904
+			// note the FIRST reg object in this array is the one
905
+			// we'll use for this attendee as the primary registration for this attendee.
906
+			$aee['reg_obj']        = reset($this->_data->attendees[ $att_id ]['reg_objs']);
907
+			$aee['attendees']      = $this->_data->attendees;
908
+			$aee['recipient_id']   = $att_id;
909
+			$aee['recipient_type'] = 'Attendee';
910
+			// merge in the primary attendee data
911
+			$aee   = array_merge($this->_default_addressee_data, $aee);
912
+			$add[] = new EE_Messages_Addressee($aee);
913
+		}
914
+		return $add;
915
+	}
916
+
917
+
918
+	/**
919
+	 * @param $event_id
920
+	 * @return int
921
+	 * @throws EE_Error
922
+	 * @throws InvalidArgumentException
923
+	 * @throws InvalidDataTypeException
924
+	 * @throws InvalidInterfaceException
925
+	 */
926
+	protected function _get_event_admin_id($event_id)
927
+	{
928
+		$event = EEM_Event::instance()->get_one_by_ID($event_id);
929
+		return $event instanceof EE_Event ? $event->wp_user() : 0;
930
+	}
931 931
 }
Please login to merge, or discard this patch.
modules/messages/EED_Messages.module.php 3 patches
Doc Comments   +1 added lines, -1 removed lines patch added patch discarded remove patch
@@ -632,7 +632,7 @@
 block discarded – undo
632 632
      * @deprecated 4.9.0 Use EEH_MSG_Template::payment_status_to_message_type_array
633 633
      *                   or EEH_MSG_Template::convert_payment_status_to_message_type
634 634
      * @param string $payment_status The payment status being matched.
635
-     * @return bool|string The payment message type slug matching the status or false if no match.
635
+     * @return string|false The payment message type slug matching the status or false if no match.
636 636
      * @throws EE_Error
637 637
      * @throws InvalidArgumentException
638 638
      * @throws ReflectionException
Please login to merge, or discard this patch.
Indentation   +1328 added lines, -1328 removed lines patch added patch discarded remove patch
@@ -16,1341 +16,1341 @@
 block discarded – undo
16 16
 class EED_Messages extends EED_Module
17 17
 {
18 18
 
19
-    /**
20
-     * This holds the EE_messages controller
21
-     *
22
-     * @deprecated 4.9.0
23
-     * @var EE_messages $_EEMSG
24
-     */
25
-    protected static $_EEMSG;
26
-
27
-    /**
28
-     * @type EE_Message_Resource_Manager $_message_resource_manager
29
-     */
30
-    protected static $_message_resource_manager;
31
-
32
-    /**
33
-     * This holds the EE_Messages_Processor business class.
34
-     *
35
-     * @type EE_Messages_Processor
36
-     */
37
-    protected static $_MSG_PROCESSOR;
38
-
39
-    /**
40
-     * holds all the paths for various messages components.
41
-     * Utilized by autoloader registry
42
-     *
43
-     * @var array
44
-     */
45
-    protected static $_MSG_PATHS;
46
-
47
-
48
-    /**
49
-     * This will hold an array of messages template packs that are registered in the messages system.
50
-     * Format is:
51
-     * array(
52
-     *    'template_pack_dbref' => EE_Messages_Template_Pack (instance)
53
-     * )
54
-     *
55
-     * @var EE_Messages_Template_Pack[]
56
-     */
57
-    protected static $_TMP_PACKS = array();
58
-
59
-
60
-    /**
61
-     * @return EED_Messages
62
-     */
63
-    public static function instance()
64
-    {
65
-        return parent::get_instance(__CLASS__);
66
-    }
67
-
68
-
69
-    /**
70
-     *  set_hooks - for hooking into EE Core, other modules, etc
71
-     *
72
-     * @since 4.5.0
73
-     * @return    void
74
-     */
75
-    public static function set_hooks()
76
-    {
77
-        // actions
78
-        add_action('AHEE__EE_Payment_Processor__update_txn_based_on_payment', array('EED_Messages', 'payment'), 10, 2);
79
-        add_action(
80
-            'AHEE__EE_Registration_Processor__trigger_registration_update_notifications',
81
-            array('EED_Messages', 'maybe_registration'),
82
-            10,
83
-            2
84
-        );
85
-        // filters
86
-        add_filter(
87
-            'FHEE__EE_Registration__receipt_url__receipt_url',
88
-            array('EED_Messages', 'registration_message_trigger_url'),
89
-            10,
90
-            4
91
-        );
92
-        add_filter(
93
-            'FHEE__EE_Registration__invoice_url__invoice_url',
94
-            array('EED_Messages', 'registration_message_trigger_url'),
95
-            10,
96
-            4
97
-        );
98
-        // register routes
99
-        self::_register_routes();
100
-    }
101
-
102
-    /**
103
-     *    set_hooks_admin - for hooking into EE Admin Core, other modules, etc
104
-     *
105
-     * @access    public
106
-     * @return    void
107
-     */
108
-    public static function set_hooks_admin()
109
-    {
110
-        // actions
111
-        add_action('AHEE__EE_Payment_Processor__update_txn_based_on_payment', array('EED_Messages', 'payment'), 10, 2);
112
-        add_action(
113
-            'AHEE__Transactions_Admin_Page___send_payment_reminder__process_admin_payment_reminder',
114
-            array('EED_Messages', 'payment_reminder'),
115
-            10
116
-        );
117
-        add_action(
118
-            'AHEE__EE_Registration_Processor__trigger_registration_update_notifications',
119
-            array('EED_Messages', 'maybe_registration'),
120
-            10,
121
-            3
122
-        );
123
-        add_action(
124
-            'AHEE__Extend_Registrations_Admin_Page___newsletter_selected_send__with_registrations',
125
-            array('EED_Messages', 'send_newsletter_message'),
126
-            10,
127
-            2
128
-        );
129
-        add_action(
130
-            'AHEE__EES_Espresso_Cancelled__process_shortcode__transaction',
131
-            array('EED_Messages', 'cancelled_registration'),
132
-            10
133
-        );
134
-        add_action(
135
-            'AHEE__EE_Admin_Page___process_admin_payment_notification',
136
-            array('EED_Messages', 'process_admin_payment'),
137
-            10,
138
-            1
139
-        );
140
-        // filters
141
-        add_filter(
142
-            'FHEE__EE_Admin_Page___process_resend_registration__success',
143
-            array('EED_Messages', 'process_resend'),
144
-            10,
145
-            2
146
-        );
147
-        add_filter(
148
-            'FHEE__EE_Registration__receipt_url__receipt_url',
149
-            array('EED_Messages', 'registration_message_trigger_url'),
150
-            10,
151
-            4
152
-        );
153
-        add_filter(
154
-            'FHEE__EE_Registration__invoice_url__invoice_url',
155
-            array('EED_Messages', 'registration_message_trigger_url'),
156
-            10,
157
-            4
158
-        );
159
-    }
160
-
161
-
162
-    /**
163
-     * All the message triggers done by route go in here.
164
-     *
165
-     * @since 4.5.0
166
-     * @return void
167
-     */
168
-    protected static function _register_routes()
169
-    {
170
-        EE_Config::register_route('msg_url_trigger', 'Messages', 'run');
171
-        EE_Config::register_route('msg_cron_trigger', 'Messages', 'execute_batch_request');
172
-        EE_Config::register_route('msg_browser_trigger', 'Messages', 'browser_trigger');
173
-        EE_Config::register_route('msg_browser_error_trigger', 'Messages', 'browser_error_trigger');
174
-        do_action('AHEE__EED_Messages___register_routes');
175
-    }
176
-
177
-
178
-    /**
179
-     * This is called when a browser display trigger is executed.
180
-     * The browser display trigger is typically used when a already generated message is displayed directly in the
181
-     * browser.
182
-     *
183
-     * @since 4.9.0
184
-     * @param WP $WP
185
-     * @throws EE_Error
186
-     * @throws InvalidArgumentException
187
-     * @throws ReflectionException
188
-     * @throws InvalidDataTypeException
189
-     * @throws InvalidInterfaceException
190
-     */
191
-    public function browser_trigger($WP)
192
-    {
193
-        // ensure controller is loaded
194
-        self::_load_controller();
195
-        $token = EE_Registry::instance()->REQ->get('token');
196
-        try {
197
-            $mtg = new EE_Message_Generated_From_Token($token, 'html', self::$_message_resource_manager);
198
-            self::$_MSG_PROCESSOR->generate_and_send_now($mtg);
199
-        } catch (EE_Error $e) {
200
-            $error_msg = __(
201
-                'Please note that a system message failed to send due to a technical issue.',
202
-                'event_espresso'
203
-            );
204
-            // add specific message for developers if WP_DEBUG in on
205
-            $error_msg .= '||' . $e->getMessage();
206
-            EE_Error::add_error($error_msg, __FILE__, __FUNCTION__, __LINE__);
207
-        }
208
-    }
209
-
210
-
211
-    /**
212
-     * This is called when a browser error trigger is executed.
213
-     * When triggered this will grab the EE_Message matching the token in the request and use that to get the error
214
-     * message and display it.
215
-     *
216
-     * @since 4.9.0
217
-     * @param $WP
218
-     * @throws EE_Error
219
-     * @throws InvalidArgumentException
220
-     * @throws InvalidDataTypeException
221
-     * @throws InvalidInterfaceException
222
-     */
223
-    public function browser_error_trigger($WP)
224
-    {
225
-        $token = EE_Registry::instance()->REQ->get('token');
226
-        if ($token) {
227
-            $message = EEM_Message::instance()->get_one_by_token($token);
228
-            if ($message instanceof EE_Message) {
229
-                header('HTTP/1.1 200 OK');
230
-                $error_msg = nl2br($message->error_message());
231
-                ?>
19
+	/**
20
+	 * This holds the EE_messages controller
21
+	 *
22
+	 * @deprecated 4.9.0
23
+	 * @var EE_messages $_EEMSG
24
+	 */
25
+	protected static $_EEMSG;
26
+
27
+	/**
28
+	 * @type EE_Message_Resource_Manager $_message_resource_manager
29
+	 */
30
+	protected static $_message_resource_manager;
31
+
32
+	/**
33
+	 * This holds the EE_Messages_Processor business class.
34
+	 *
35
+	 * @type EE_Messages_Processor
36
+	 */
37
+	protected static $_MSG_PROCESSOR;
38
+
39
+	/**
40
+	 * holds all the paths for various messages components.
41
+	 * Utilized by autoloader registry
42
+	 *
43
+	 * @var array
44
+	 */
45
+	protected static $_MSG_PATHS;
46
+
47
+
48
+	/**
49
+	 * This will hold an array of messages template packs that are registered in the messages system.
50
+	 * Format is:
51
+	 * array(
52
+	 *    'template_pack_dbref' => EE_Messages_Template_Pack (instance)
53
+	 * )
54
+	 *
55
+	 * @var EE_Messages_Template_Pack[]
56
+	 */
57
+	protected static $_TMP_PACKS = array();
58
+
59
+
60
+	/**
61
+	 * @return EED_Messages
62
+	 */
63
+	public static function instance()
64
+	{
65
+		return parent::get_instance(__CLASS__);
66
+	}
67
+
68
+
69
+	/**
70
+	 *  set_hooks - for hooking into EE Core, other modules, etc
71
+	 *
72
+	 * @since 4.5.0
73
+	 * @return    void
74
+	 */
75
+	public static function set_hooks()
76
+	{
77
+		// actions
78
+		add_action('AHEE__EE_Payment_Processor__update_txn_based_on_payment', array('EED_Messages', 'payment'), 10, 2);
79
+		add_action(
80
+			'AHEE__EE_Registration_Processor__trigger_registration_update_notifications',
81
+			array('EED_Messages', 'maybe_registration'),
82
+			10,
83
+			2
84
+		);
85
+		// filters
86
+		add_filter(
87
+			'FHEE__EE_Registration__receipt_url__receipt_url',
88
+			array('EED_Messages', 'registration_message_trigger_url'),
89
+			10,
90
+			4
91
+		);
92
+		add_filter(
93
+			'FHEE__EE_Registration__invoice_url__invoice_url',
94
+			array('EED_Messages', 'registration_message_trigger_url'),
95
+			10,
96
+			4
97
+		);
98
+		// register routes
99
+		self::_register_routes();
100
+	}
101
+
102
+	/**
103
+	 *    set_hooks_admin - for hooking into EE Admin Core, other modules, etc
104
+	 *
105
+	 * @access    public
106
+	 * @return    void
107
+	 */
108
+	public static function set_hooks_admin()
109
+	{
110
+		// actions
111
+		add_action('AHEE__EE_Payment_Processor__update_txn_based_on_payment', array('EED_Messages', 'payment'), 10, 2);
112
+		add_action(
113
+			'AHEE__Transactions_Admin_Page___send_payment_reminder__process_admin_payment_reminder',
114
+			array('EED_Messages', 'payment_reminder'),
115
+			10
116
+		);
117
+		add_action(
118
+			'AHEE__EE_Registration_Processor__trigger_registration_update_notifications',
119
+			array('EED_Messages', 'maybe_registration'),
120
+			10,
121
+			3
122
+		);
123
+		add_action(
124
+			'AHEE__Extend_Registrations_Admin_Page___newsletter_selected_send__with_registrations',
125
+			array('EED_Messages', 'send_newsletter_message'),
126
+			10,
127
+			2
128
+		);
129
+		add_action(
130
+			'AHEE__EES_Espresso_Cancelled__process_shortcode__transaction',
131
+			array('EED_Messages', 'cancelled_registration'),
132
+			10
133
+		);
134
+		add_action(
135
+			'AHEE__EE_Admin_Page___process_admin_payment_notification',
136
+			array('EED_Messages', 'process_admin_payment'),
137
+			10,
138
+			1
139
+		);
140
+		// filters
141
+		add_filter(
142
+			'FHEE__EE_Admin_Page___process_resend_registration__success',
143
+			array('EED_Messages', 'process_resend'),
144
+			10,
145
+			2
146
+		);
147
+		add_filter(
148
+			'FHEE__EE_Registration__receipt_url__receipt_url',
149
+			array('EED_Messages', 'registration_message_trigger_url'),
150
+			10,
151
+			4
152
+		);
153
+		add_filter(
154
+			'FHEE__EE_Registration__invoice_url__invoice_url',
155
+			array('EED_Messages', 'registration_message_trigger_url'),
156
+			10,
157
+			4
158
+		);
159
+	}
160
+
161
+
162
+	/**
163
+	 * All the message triggers done by route go in here.
164
+	 *
165
+	 * @since 4.5.0
166
+	 * @return void
167
+	 */
168
+	protected static function _register_routes()
169
+	{
170
+		EE_Config::register_route('msg_url_trigger', 'Messages', 'run');
171
+		EE_Config::register_route('msg_cron_trigger', 'Messages', 'execute_batch_request');
172
+		EE_Config::register_route('msg_browser_trigger', 'Messages', 'browser_trigger');
173
+		EE_Config::register_route('msg_browser_error_trigger', 'Messages', 'browser_error_trigger');
174
+		do_action('AHEE__EED_Messages___register_routes');
175
+	}
176
+
177
+
178
+	/**
179
+	 * This is called when a browser display trigger is executed.
180
+	 * The browser display trigger is typically used when a already generated message is displayed directly in the
181
+	 * browser.
182
+	 *
183
+	 * @since 4.9.0
184
+	 * @param WP $WP
185
+	 * @throws EE_Error
186
+	 * @throws InvalidArgumentException
187
+	 * @throws ReflectionException
188
+	 * @throws InvalidDataTypeException
189
+	 * @throws InvalidInterfaceException
190
+	 */
191
+	public function browser_trigger($WP)
192
+	{
193
+		// ensure controller is loaded
194
+		self::_load_controller();
195
+		$token = EE_Registry::instance()->REQ->get('token');
196
+		try {
197
+			$mtg = new EE_Message_Generated_From_Token($token, 'html', self::$_message_resource_manager);
198
+			self::$_MSG_PROCESSOR->generate_and_send_now($mtg);
199
+		} catch (EE_Error $e) {
200
+			$error_msg = __(
201
+				'Please note that a system message failed to send due to a technical issue.',
202
+				'event_espresso'
203
+			);
204
+			// add specific message for developers if WP_DEBUG in on
205
+			$error_msg .= '||' . $e->getMessage();
206
+			EE_Error::add_error($error_msg, __FILE__, __FUNCTION__, __LINE__);
207
+		}
208
+	}
209
+
210
+
211
+	/**
212
+	 * This is called when a browser error trigger is executed.
213
+	 * When triggered this will grab the EE_Message matching the token in the request and use that to get the error
214
+	 * message and display it.
215
+	 *
216
+	 * @since 4.9.0
217
+	 * @param $WP
218
+	 * @throws EE_Error
219
+	 * @throws InvalidArgumentException
220
+	 * @throws InvalidDataTypeException
221
+	 * @throws InvalidInterfaceException
222
+	 */
223
+	public function browser_error_trigger($WP)
224
+	{
225
+		$token = EE_Registry::instance()->REQ->get('token');
226
+		if ($token) {
227
+			$message = EEM_Message::instance()->get_one_by_token($token);
228
+			if ($message instanceof EE_Message) {
229
+				header('HTTP/1.1 200 OK');
230
+				$error_msg = nl2br($message->error_message());
231
+				?>
232 232
                 <!DOCTYPE html>
233 233
                 <html>
234 234
                 <head></head>
235 235
                 <body>
236 236
                 <?php echo empty($error_msg)
237
-                    ? esc_html__(
238
-                        'Unfortunately, we were unable to capture the error message for this message.',
239
-                        'event_espresso'
240
-                    )
241
-                    : wp_kses(
242
-                        $error_msg,
243
-                        array(
244
-                            'a'      => array(
245
-                                'href'  => array(),
246
-                                'title' => array(),
247
-                            ),
248
-                            'span'   => array(),
249
-                            'div'    => array(),
250
-                            'p'      => array(),
251
-                            'strong' => array(),
252
-                            'em'     => array(),
253
-                            'br'     => array(),
254
-                        )
255
-                    ); ?>
237
+					? esc_html__(
238
+						'Unfortunately, we were unable to capture the error message for this message.',
239
+						'event_espresso'
240
+					)
241
+					: wp_kses(
242
+						$error_msg,
243
+						array(
244
+							'a'      => array(
245
+								'href'  => array(),
246
+								'title' => array(),
247
+							),
248
+							'span'   => array(),
249
+							'div'    => array(),
250
+							'p'      => array(),
251
+							'strong' => array(),
252
+							'em'     => array(),
253
+							'br'     => array(),
254
+						)
255
+					); ?>
256 256
                 </body>
257 257
                 </html>
258 258
                 <?php
259
-                exit;
260
-            }
261
-        }
262
-        return;
263
-    }
264
-
265
-
266
-    /**
267
-     *  This runs when the msg_url_trigger route has initiated.
268
-     *
269
-     * @since 4.5.0
270
-     * @param WP $WP
271
-     * @throws EE_Error
272
-     * @throws InvalidArgumentException
273
-     * @throws ReflectionException
274
-     * @throws InvalidDataTypeException
275
-     * @throws InvalidInterfaceException
276
-     */
277
-    public function run($WP)
278
-    {
279
-        // ensure controller is loaded
280
-        self::_load_controller();
281
-        // attempt to process message
282
-        try {
283
-            /** @type EE_Message_To_Generate_From_Request $message_to_generate */
284
-            $message_to_generate = EE_Registry::instance()->load_lib('Message_To_Generate_From_Request');
285
-            self::$_MSG_PROCESSOR->generate_and_send_now($message_to_generate);
286
-        } catch (EE_Error $e) {
287
-            $error_msg = __(
288
-                'Please note that a system message failed to send due to a technical issue.',
289
-                'event_espresso'
290
-            );
291
-            // add specific message for developers if WP_DEBUG in on
292
-            $error_msg .= '||' . $e->getMessage();
293
-            EE_Error::add_error($error_msg, __FILE__, __FUNCTION__, __LINE__);
294
-        }
295
-    }
296
-
297
-
298
-    /**
299
-     * This is triggered by the 'msg_cron_trigger' route.
300
-     *
301
-     * @param WP $WP
302
-     */
303
-    public function execute_batch_request($WP)
304
-    {
305
-        $this->run_cron();
306
-        header('HTTP/1.1 200 OK');
307
-        exit();
308
-    }
309
-
310
-
311
-    /**
312
-     * This gets executed on wp_cron jobs or when a batch request is initiated on its own separate non regular wp
313
-     * request.
314
-     */
315
-    public function run_cron()
316
-    {
317
-        self::_load_controller();
318
-        // get required vars
319
-        $cron_type = EE_Registry::instance()->REQ->get('type');
320
-        $transient_key = EE_Registry::instance()->REQ->get('key');
321
-
322
-        // now let's verify transient, if not valid exit immediately
323
-        if (! get_transient($transient_key)) {
324
-            /**
325
-             * trigger error so this gets in the error logs.  This is important because it happens on a non-user
326
-             * request.
327
-             */
328
-            trigger_error(esc_attr__('Invalid Request (Transient does not exist)', 'event_espresso'));
329
-        }
330
-
331
-        // if made it here, lets' delete the transient to keep the db clean
332
-        delete_transient($transient_key);
333
-
334
-        if (apply_filters('FHEE__EED_Messages__run_cron__use_wp_cron', true)) {
335
-            $method = 'batch_' . $cron_type . '_from_queue';
336
-            if (method_exists(self::$_MSG_PROCESSOR, $method)) {
337
-                self::$_MSG_PROCESSOR->$method();
338
-            } else {
339
-                // no matching task
340
-                /**
341
-                 * trigger error so this gets in the error logs.  This is important because it happens on a non user
342
-                 * request.
343
-                 */
344
-                trigger_error(
345
-                    esc_attr(
346
-                        sprintf(
347
-                            __('There is no task corresponding to this route %s', 'event_espresso'),
348
-                            $cron_type
349
-                        )
350
-                    )
351
-                );
352
-            }
353
-        }
354
-
355
-        do_action('FHEE__EED_Messages__run_cron__end');
356
-    }
357
-
358
-
359
-    /**
360
-     * This is used to retrieve the template pack for the given name.
361
-     * Retrieved packs are cached on the static $_TMP_PACKS array.  If there is no class matching the given name then
362
-     * the default template pack is returned.
363
-     *
364
-     * @deprecated 4.9.0  @see EEH_MSG_Template::get_template_pack()
365
-     * @param string $template_pack_name This should correspond to the dbref of the template pack (which is also used
366
-     *                                   in generating the Pack class name).
367
-     * @return EE_Messages_Template_Pack
368
-     * @throws EE_Error
369
-     * @throws InvalidArgumentException
370
-     * @throws ReflectionException
371
-     * @throws InvalidDataTypeException
372
-     * @throws InvalidInterfaceException
373
-     */
374
-    public static function get_template_pack($template_pack_name)
375
-    {
376
-        EE_Registry::instance()->load_helper('MSG_Template');
377
-        return EEH_MSG_Template::get_template_pack($template_pack_name);
378
-    }
379
-
380
-
381
-    /**
382
-     * Retrieves an array of all template packs.
383
-     * Array is in the format array( 'dbref' => EE_Messages_Template_Pack )
384
-     *
385
-     * @deprecated 4.9.0  @see EEH_MSG_Template_Pack::get_template_pack_collection
386
-     * @return EE_Messages_Template_Pack[]
387
-     * @throws EE_Error
388
-     * @throws InvalidArgumentException
389
-     * @throws ReflectionException
390
-     * @throws InvalidDataTypeException
391
-     * @throws InvalidInterfaceException
392
-     */
393
-    public static function get_template_packs()
394
-    {
395
-        EE_Registry::instance()->load_helper('MSG_Template');
396
-
397
-        // for backward compat, let's make sure this returns in the same format as originally.
398
-        $template_pack_collection = EEH_MSG_Template::get_template_pack_collection();
399
-        $template_pack_collection->rewind();
400
-        $template_packs = array();
401
-        while ($template_pack_collection->valid()) {
402
-            $template_packs[ $template_pack_collection->current()->dbref ] = $template_pack_collection->current();
403
-            $template_pack_collection->next();
404
-        }
405
-        return $template_packs;
406
-    }
407
-
408
-
409
-    /**
410
-     * This simply makes sure the autoloaders are registered for the EE_messages system.
411
-     *
412
-     * @since 4.5.0
413
-     * @return void
414
-     * @throws EE_Error
415
-     */
416
-    public static function set_autoloaders()
417
-    {
418
-        if (empty(self::$_MSG_PATHS)) {
419
-            self::_set_messages_paths();
420
-            foreach (self::$_MSG_PATHS as $path) {
421
-                EEH_Autoloader::register_autoloaders_for_each_file_in_folder($path);
422
-            }
423
-            // add aliases
424
-            EEH_Autoloader::add_alias('EE_messages', 'EE_messages');
425
-            EEH_Autoloader::add_alias('EE_messenger', 'EE_messenger');
426
-        }
427
-    }
428
-
429
-
430
-    /**
431
-     * Take care of adding all the paths for the messages components to the $_MSG_PATHS property
432
-     * for use by the Messages Autoloaders
433
-     *
434
-     * @since 4.5.0
435
-     * @return void.
436
-     */
437
-    protected static function _set_messages_paths()
438
-    {
439
-        self::$_MSG_PATHS = apply_filters(
440
-            'FHEE__EED_Messages___set_messages_paths___MSG_PATHS',
441
-            [
442
-                EE_LIBRARIES . 'messages/message_type',
443
-                EE_LIBRARIES . 'messages/messenger',
444
-                EE_LIBRARIES . 'messages/defaults',
445
-                EE_LIBRARIES . 'messages/defaults/email',
446
-                EE_LIBRARIES . 'messages/data_class',
447
-                EE_LIBRARIES . 'messages/validators',
448
-                EE_LIBRARIES . 'messages/validators/email',
449
-                EE_LIBRARIES . 'messages/validators/html',
450
-                EE_LIBRARIES . 'shortcodes',
451
-            ]
452
-        );
453
-    }
454
-
455
-
456
-    /**
457
-     * Takes care of loading dependencies
458
-     *
459
-     * @since 4.5.0
460
-     * @return void
461
-     * @throws EE_Error
462
-     * @throws InvalidArgumentException
463
-     * @throws ReflectionException
464
-     * @throws InvalidDataTypeException
465
-     * @throws InvalidInterfaceException
466
-     */
467
-    protected static function _load_controller()
468
-    {
469
-        if (! self::$_MSG_PROCESSOR instanceof EE_Messages_Processor) {
470
-            EE_Registry::instance()->load_core('Request_Handler');
471
-            self::set_autoloaders();
472
-            self::$_EEMSG = EE_Registry::instance()->load_lib('messages');
473
-            self::$_MSG_PROCESSOR = EE_Registry::instance()->load_lib('Messages_Processor');
474
-            self::$_message_resource_manager = EE_Registry::instance()->load_lib('Message_Resource_Manager');
475
-        }
476
-    }
477
-
478
-
479
-    /**
480
-     * @param EE_Transaction $transaction
481
-     * @throws EE_Error
482
-     * @throws InvalidArgumentException
483
-     * @throws InvalidDataTypeException
484
-     * @throws InvalidInterfaceException
485
-     * @throws ReflectionException
486
-     */
487
-    public static function payment_reminder(EE_Transaction $transaction)
488
-    {
489
-        self::_load_controller();
490
-        $data = array($transaction, null);
491
-        self::$_MSG_PROCESSOR->generate_for_all_active_messengers('payment_reminder', $data);
492
-    }
493
-
494
-
495
-    /**
496
-     * Any messages triggers for after successful gateway payments should go in here.
497
-     *
498
-     * @param EE_Transaction  $transaction object
499
-     * @param EE_Payment|null $payment     object
500
-     * @return void
501
-     * @throws EE_Error
502
-     * @throws InvalidArgumentException
503
-     * @throws ReflectionException
504
-     * @throws InvalidDataTypeException
505
-     * @throws InvalidInterfaceException
506
-     */
507
-    public static function payment(EE_Transaction $transaction, EE_Payment $payment = null)
508
-    {
509
-        // if there's no payment object, then we cannot do a payment type message!
510
-        if (! $payment instanceof EE_Payment) {
511
-            return;
512
-        }
513
-        self::_load_controller();
514
-        $data = array($transaction, $payment);
515
-        EE_Registry::instance()->load_helper('MSG_Template');
516
-        $message_type = EEH_MSG_Template::convert_payment_status_to_message_type($payment->STS_ID());
517
-        // if payment amount is less than 0 then switch to payment_refund message type.
518
-        $message_type = $payment->amount() < 0 ? 'payment_refund' : $message_type;
519
-        self::$_MSG_PROCESSOR->generate_for_all_active_messengers($message_type, $data);
520
-    }
521
-
522
-
523
-    /**
524
-     * @param EE_Transaction $transaction
525
-     * @throws EE_Error
526
-     * @throws InvalidArgumentException
527
-     * @throws InvalidDataTypeException
528
-     * @throws InvalidInterfaceException
529
-     * @throws ReflectionException
530
-     */
531
-    public static function cancelled_registration(EE_Transaction $transaction)
532
-    {
533
-        self::_load_controller();
534
-        $data = array($transaction, null);
535
-        self::$_MSG_PROCESSOR->generate_for_all_active_messengers('cancelled_registration', $data);
536
-    }
537
-
538
-
539
-    /**
540
-     * Trigger for Registration messages
541
-     * Note that what registration message type is sent depends on what the reg status is for the registrations on the
542
-     * incoming transaction.
543
-     *
544
-     * @param EE_Registration $registration
545
-     * @param array           $extra_details
546
-     * @return void
547
-     * @throws EE_Error
548
-     * @throws InvalidArgumentException
549
-     * @throws InvalidDataTypeException
550
-     * @throws InvalidInterfaceException
551
-     * @throws ReflectionException
552
-     * @throws EntityNotFoundException
553
-     */
554
-    public static function maybe_registration(EE_Registration $registration, $extra_details = array())
555
-    {
556
-
557
-        if (! self::_verify_registration_notification_send($registration, $extra_details)) {
558
-            // no messages please
559
-            return;
560
-        }
561
-
562
-        // get all non-trashed registrations so we make sure we send messages for the right status.
563
-        $all_registrations = $registration->transaction()->registrations(
564
-            array(
565
-                array('REG_deleted' => false),
566
-                'order_by' => array(
567
-                    'Event.EVT_name'     => 'ASC',
568
-                    'Attendee.ATT_lname' => 'ASC',
569
-                    'Attendee.ATT_fname' => 'ASC',
570
-                ),
571
-            )
572
-        );
573
-        // cached array of statuses so we only trigger messages once per status.
574
-        $statuses_sent = array();
575
-        self::_load_controller();
576
-        $mtgs = array();
577
-
578
-        // loop through registrations and trigger messages once per status.
579
-        foreach ($all_registrations as $reg) {
580
-            // already triggered?
581
-            if (in_array($reg->status_ID(), $statuses_sent)) {
582
-                continue;
583
-            }
584
-
585
-            $message_type = EEH_MSG_Template::convert_reg_status_to_message_type($reg->status_ID());
586
-            $mtgs = array_merge(
587
-                $mtgs,
588
-                self::$_MSG_PROCESSOR->setup_mtgs_for_all_active_messengers(
589
-                    $message_type,
590
-                    array($registration->transaction(), null, $reg->status_ID())
591
-                )
592
-            );
593
-            $statuses_sent[] = $reg->status_ID();
594
-        }
595
-
596
-        if (count($statuses_sent) > 1) {
597
-            $mtgs = array_merge(
598
-                $mtgs,
599
-                self::$_MSG_PROCESSOR->setup_mtgs_for_all_active_messengers(
600
-                    'registration_summary',
601
-                    array($registration->transaction(), null)
602
-                )
603
-            );
604
-        }
605
-
606
-        // batch queue and initiate request
607
-        self::$_MSG_PROCESSOR->batch_queue_for_generation_and_persist($mtgs);
608
-        self::$_MSG_PROCESSOR->get_queue()->initiate_request_by_priority();
609
-    }
610
-
611
-
612
-    /**
613
-     * This is a helper method used to very whether a registration notification should be sent or
614
-     * not.  Prevents duplicate notifications going out for registration context notifications.
615
-     *
616
-     * @param EE_Registration $registration  [description]
617
-     * @param array           $extra_details [description]
618
-     * @return bool          true = send away, false = nope halt the presses.
619
-     */
620
-    protected static function _verify_registration_notification_send(
621
-        EE_Registration $registration,
622
-        $extra_details = array()
623
-    ) {
624
-        if (! $registration->is_primary_registrant()) {
625
-            return false;
626
-        }
627
-        // first we check if we're in admin and not doing front ajax
628
-        if (is_admin() && ! EE_FRONT_AJAX) {
629
-            // make sure appropriate admin params are set for sending messages
630
-            if (
631
-                empty($_REQUEST['txn_reg_status_change']['send_notifications'])
632
-                || ! absint($_REQUEST['txn_reg_status_change']['send_notifications'])
633
-            ) {
634
-                // no messages sent please.
635
-                return false;
636
-            }
637
-        } else {
638
-            // frontend request (either regular or via AJAX)
639
-            // TXN is NOT finalized ?
640
-            if (! isset($extra_details['finalized']) || $extra_details['finalized'] === false) {
641
-                return false;
642
-            }
643
-            // return visit but nothing changed ???
644
-            if (
645
-                isset($extra_details['revisit'], $extra_details['status_updates']) &&
646
-                $extra_details['revisit'] && ! $extra_details['status_updates']
647
-            ) {
648
-                return false;
649
-            }
650
-            // NOT sending messages && reg status is something other than "Not-Approved"
651
-            if (
652
-                ! apply_filters('FHEE__EED_Messages___maybe_registration__deliver_notifications', false) &&
653
-                $registration->status_ID() !== EEM_Registration::status_id_not_approved
654
-            ) {
655
-                return false;
656
-            }
657
-        }
658
-        // release the kraken
659
-        return true;
660
-    }
661
-
662
-
663
-    /**
664
-     * Simply returns an array indexed by Registration Status ID and the related message_type name associated with that
665
-     * status id.
666
-     *
667
-     * @deprecated 4.9.0  Use EEH_MSG_Template::reg_status_to_message_type_array()
668
-     *                    or EEH_MSG_Template::convert_reg_status_to_message_type
669
-     * @param string $reg_status
670
-     * @return array
671
-     * @throws EE_Error
672
-     * @throws InvalidArgumentException
673
-     * @throws ReflectionException
674
-     * @throws InvalidDataTypeException
675
-     * @throws InvalidInterfaceException
676
-     */
677
-    protected static function _get_reg_status_array($reg_status = '')
678
-    {
679
-        EE_Registry::instance()->load_helper('MSG_Template');
680
-        return EEH_MSG_Template::convert_reg_status_to_message_type($reg_status)
681
-            ? EEH_MSG_Template::convert_reg_status_to_message_type($reg_status)
682
-            : EEH_MSG_Template::reg_status_to_message_type_array();
683
-    }
684
-
685
-
686
-    /**
687
-     * Simply returns the payment message type for the given payment status.
688
-     *
689
-     * @deprecated 4.9.0 Use EEH_MSG_Template::payment_status_to_message_type_array
690
-     *                   or EEH_MSG_Template::convert_payment_status_to_message_type
691
-     * @param string $payment_status The payment status being matched.
692
-     * @return bool|string The payment message type slug matching the status or false if no match.
693
-     * @throws EE_Error
694
-     * @throws InvalidArgumentException
695
-     * @throws ReflectionException
696
-     * @throws InvalidDataTypeException
697
-     * @throws InvalidInterfaceException
698
-     */
699
-    protected static function _get_payment_message_type($payment_status)
700
-    {
701
-        EE_Registry::instance()->load_helper('MSG_Template');
702
-        return EEH_MSG_Template::convert_payment_status_to_message_type($payment_status)
703
-            ? EEH_MSG_Template::convert_payment_status_to_message_type($payment_status)
704
-            : false;
705
-    }
706
-
707
-
708
-    /**
709
-     * Message triggers for a resending already sent message(s) (via EE_Message list table)
710
-     *
711
-     * @access public
712
-     * @param array $req_data This is the $_POST & $_GET data sent from EE_Admin Pages
713
-     * @return bool success/fail
714
-     * @throws EE_Error
715
-     * @throws InvalidArgumentException
716
-     * @throws InvalidDataTypeException
717
-     * @throws InvalidInterfaceException
718
-     * @throws ReflectionException
719
-     */
720
-    public static function process_resend($req_data)
721
-    {
722
-        self::_load_controller();
723
-
724
-        // if $msgID in this request then skip to the new resend_message
725
-        if (EE_Registry::instance()->REQ->get('MSG_ID')) {
726
-            return self::resend_message();
727
-        }
728
-
729
-        // make sure any incoming request data is set on the REQ so that it gets picked up later.
730
-        $req_data = (array) $req_data;
731
-        foreach ($req_data as $request_key => $request_value) {
732
-            EE_Registry::instance()->REQ->set($request_key, $request_value);
733
-        }
734
-
735
-        if (
736
-            ! $messages_to_send = self::$_MSG_PROCESSOR->setup_messages_to_generate_from_registration_ids_in_request(
737
-            )
738
-        ) {
739
-            return false;
740
-        }
741
-
742
-        try {
743
-            self::$_MSG_PROCESSOR->batch_queue_for_generation_and_persist($messages_to_send);
744
-            self::$_MSG_PROCESSOR->get_queue()->initiate_request_by_priority();
745
-        } catch (EE_Error $e) {
746
-            EE_Error::add_error($e->getMessage(), __FILE__, __FUNCTION__, __LINE__);
747
-            return false;
748
-        }
749
-        EE_Error::add_success(
750
-            __('Messages have been successfully queued for generation and sending.', 'event_espresso')
751
-        );
752
-        return true; // everything got queued.
753
-    }
754
-
755
-
756
-    /**
757
-     * Message triggers for a resending already sent message(s) (via EE_Message list table)
758
-     *
759
-     * @return bool
760
-     * @throws EE_Error
761
-     * @throws InvalidArgumentException
762
-     * @throws InvalidDataTypeException
763
-     * @throws InvalidInterfaceException
764
-     * @throws ReflectionException
765
-     */
766
-    public static function resend_message()
767
-    {
768
-        self::_load_controller();
769
-
770
-        $msgID = EE_Registry::instance()->REQ->get('MSG_ID');
771
-        if (! $msgID) {
772
-            EE_Error::add_error(
773
-                __(
774
-                    'Something went wrong because there is no "MSG_ID" value in the request',
775
-                    'event_espresso'
776
-                ),
777
-                __FILE__,
778
-                __FUNCTION__,
779
-                __LINE__
780
-            );
781
-            return false;
782
-        }
783
-
784
-        self::$_MSG_PROCESSOR->setup_messages_from_ids_and_send((array) $msgID);
785
-
786
-        // setup success message.
787
-        $count_ready_for_resend = self::$_MSG_PROCESSOR->get_queue()->count_STS_in_queue(EEM_Message::status_resend);
788
-        EE_Error::add_success(
789
-            sprintf(
790
-                _n(
791
-                    'There was %d message queued for resending.',
792
-                    'There were %d messages queued for resending.',
793
-                    $count_ready_for_resend,
794
-                    'event_espresso'
795
-                ),
796
-                $count_ready_for_resend
797
-            )
798
-        );
799
-        return true;
800
-    }
801
-
802
-
803
-    /**
804
-     * Message triggers for manual payment applied by admin
805
-     *
806
-     * @param  EE_Payment $payment EE_payment object
807
-     * @return bool success/fail
808
-     * @throws EE_Error
809
-     * @throws InvalidArgumentException
810
-     * @throws ReflectionException
811
-     * @throws InvalidDataTypeException
812
-     * @throws InvalidInterfaceException
813
-     */
814
-    public static function process_admin_payment(EE_Payment $payment)
815
-    {
816
-        EE_Registry::instance()->load_helper('MSG_Template');
817
-        // we need to get the transaction object
818
-        $transaction = $payment->transaction();
819
-        if ($transaction instanceof EE_Transaction) {
820
-            $data = array($transaction, $payment);
821
-            $message_type = EEH_MSG_Template::convert_payment_status_to_message_type($payment->STS_ID());
822
-
823
-            // if payment amount is less than 0 then switch to payment_refund message type.
824
-            $message_type = $payment->amount() < 0 ? 'payment_refund' : $message_type;
825
-
826
-            // if payment_refund is selected, but the status is NOT accepted.  Then change message type to false so NO message notification goes out.
827
-            $message_type = $message_type == 'payment_refund' && $payment->STS_ID() != EEM_Payment::status_id_approved
828
-                ? false : $message_type;
829
-
830
-            self::_load_controller();
831
-
832
-            self::$_MSG_PROCESSOR->generate_for_all_active_messengers($message_type, $data);
833
-
834
-            // get count of queued for generation
835
-            $count_to_generate = self::$_MSG_PROCESSOR->get_queue()->count_STS_in_queue(
836
-                array(
837
-                    EEM_Message::status_incomplete,
838
-                    EEM_Message::status_idle,
839
-                )
840
-            );
841
-
842
-            if ($count_to_generate > 0 && self::$_MSG_PROCESSOR->get_queue()->get_message_repository()->count() !== 0) {
843
-                add_filter('FHEE__EE_Admin_Page___process_admin_payment_notification__success', '__return_true');
844
-                return true;
845
-            } else {
846
-                $count_failed = self::$_MSG_PROCESSOR->get_queue()->count_STS_in_queue(
847
-                    EEM_Message::instance()->stati_indicating_failed_sending()
848
-                );
849
-                /**
850
-                 * Verify that there are actually errors.  If not then we return a success message because the queue might have been emptied due to successful
851
-                 * IMMEDIATE generation.
852
-                 */
853
-                if ($count_failed > 0) {
854
-                    EE_Error::add_error(
855
-                        sprintf(
856
-                            _n(
857
-                                'The payment notification generation failed.',
858
-                                '%d payment notifications failed being sent.',
859
-                                $count_failed,
860
-                                'event_espresso'
861
-                            ),
862
-                            $count_failed
863
-                        ),
864
-                        __FILE__,
865
-                        __FUNCTION__,
866
-                        __LINE__
867
-                    );
868
-
869
-                    return false;
870
-                } else {
871
-                    add_filter('FHEE__EE_Admin_Page___process_admin_payment_notification__success', '__return_true');
872
-                    return true;
873
-                }
874
-            }
875
-        } else {
876
-            EE_Error::add_error(
877
-                'Unable to generate the payment notification because the given value for the transaction is invalid.',
878
-                'event_espresso'
879
-            );
880
-            return false;
881
-        }
882
-    }
883
-
884
-
885
-    /**
886
-     * Callback for AHEE__Extend_Registrations_Admin_Page___newsletter_selected_send_with_registrations trigger
887
-     *
888
-     * @since   4.3.0
889
-     * @param  EE_Registration[] $registrations an array of EE_Registration objects
890
-     * @param  int               $grp_id        a specific message template group id.
891
-     * @return void
892
-     * @throws EE_Error
893
-     * @throws InvalidArgumentException
894
-     * @throws InvalidDataTypeException
895
-     * @throws InvalidInterfaceException
896
-     * @throws ReflectionException
897
-     */
898
-    public static function send_newsletter_message($registrations, $grp_id)
899
-    {
900
-        // make sure mtp is id and set it in the EE_Request Handler later messages setup.
901
-        EE_Registry::instance()->REQ->set('GRP_ID', (int) $grp_id);
902
-        self::_load_controller();
903
-        self::$_MSG_PROCESSOR->generate_for_all_active_messengers('newsletter', $registrations);
904
-    }
905
-
906
-
907
-    /**
908
-     * Callback for FHEE__EE_Registration__invoice_url__invoice_url or FHEE__EE_Registration__receipt_url__receipt_url
909
-     *
910
-     * @since   4.3.0
911
-     * @param    string          $registration_message_trigger_url
912
-     * @param    EE_Registration $registration
913
-     * @param string             $messenger
914
-     * @param string             $message_type
915
-     * @return string
916
-     * @throws EE_Error
917
-     * @throws InvalidArgumentException
918
-     * @throws InvalidDataTypeException
919
-     * @throws InvalidInterfaceException
920
-     */
921
-    public static function registration_message_trigger_url(
922
-        $registration_message_trigger_url,
923
-        EE_Registration $registration,
924
-        $messenger = 'html',
925
-        $message_type = 'invoice'
926
-    ) {
927
-        // whitelist $messenger
928
-        switch ($messenger) {
929
-            case 'pdf':
930
-                $sending_messenger = 'pdf';
931
-                $generating_messenger = 'html';
932
-                break;
933
-            case 'html':
934
-            default:
935
-                $sending_messenger = 'html';
936
-                $generating_messenger = 'html';
937
-                break;
938
-        }
939
-        // whitelist $message_type
940
-        switch ($message_type) {
941
-            case 'receipt':
942
-                $message_type = 'receipt';
943
-                break;
944
-            case 'invoice':
945
-            default:
946
-                $message_type = 'invoice';
947
-                break;
948
-        }
949
-        // verify that both the messenger AND the message type are active
950
-        if (
951
-            EEH_MSG_Template::is_messenger_active($sending_messenger)
952
-            && EEH_MSG_Template::is_mt_active($message_type)
953
-        ) {
954
-            // need to get the correct message template group for this (i.e. is there a custom invoice for the event this registration is registered for?)
955
-            $template_query_params = array(
956
-                'MTP_is_active'    => true,
957
-                'MTP_messenger'    => $generating_messenger,
958
-                'MTP_message_type' => $message_type,
959
-                'Event.EVT_ID'     => $registration->event_ID(),
960
-            );
961
-            // get the message template group.
962
-            $msg_template_group = EEM_Message_Template_Group::instance()->get_one(array($template_query_params));
963
-            // if we don't have an EE_Message_Template_Group then return
964
-            if (! $msg_template_group instanceof EE_Message_Template_Group) {
965
-                // remove EVT_ID from query params so that global templates get picked up
966
-                unset($template_query_params['Event.EVT_ID']);
967
-                // get global template as the fallback
968
-                $msg_template_group = EEM_Message_Template_Group::instance()->get_one(array($template_query_params));
969
-            }
970
-            // if we don't have an EE_Message_Template_Group then return
971
-            if (! $msg_template_group instanceof EE_Message_Template_Group) {
972
-                return '';
973
-            }
974
-            // generate the URL
975
-            $registration_message_trigger_url = EEH_MSG_Template::generate_url_trigger(
976
-                $sending_messenger,
977
-                $generating_messenger,
978
-                'purchaser',
979
-                $message_type,
980
-                $registration,
981
-                $msg_template_group->ID(),
982
-                $registration->transaction_ID()
983
-            );
984
-        }
985
-        return $registration_message_trigger_url;
986
-    }
987
-
988
-
989
-    /**
990
-     * Use to generate and return a message preview!
991
-     *
992
-     * @param  string $type      This should correspond with a valid message type
993
-     * @param  string $context   This should correspond with a valid context for the message type
994
-     * @param  string $messenger This should correspond with a valid messenger.
995
-     * @param bool    $send      true we will do a test send using the messenger delivery, false we just do a regular
996
-     *                           preview
997
-     * @return bool|string The body of the message or if send is requested, sends.
998
-     * @throws EE_Error
999
-     * @throws InvalidArgumentException
1000
-     * @throws InvalidDataTypeException
1001
-     * @throws InvalidInterfaceException
1002
-     * @throws ReflectionException
1003
-     */
1004
-    public static function preview_message($type, $context, $messenger, $send = false)
1005
-    {
1006
-        self::_load_controller();
1007
-        $mtg = new EE_Message_To_Generate(
1008
-            $messenger,
1009
-            $type,
1010
-            array(),
1011
-            $context,
1012
-            true
1013
-        );
1014
-        $generated_preview_queue = self::$_MSG_PROCESSOR->generate_for_preview($mtg, $send);
1015
-        if ($generated_preview_queue instanceof EE_Messages_Queue) {
1016
-            // loop through all content for the preview and remove any persisted records.
1017
-            $content = '';
1018
-            foreach ($generated_preview_queue->get_message_repository() as $message) {
1019
-                $content = $message->content();
1020
-                if ($message->ID() > 0 && $message->STS_ID() !== EEM_Message::status_failed) {
1021
-                    $message->delete();
1022
-                }
1023
-            }
1024
-            return $content;
1025
-        } else {
1026
-            return $generated_preview_queue;
1027
-        }
1028
-    }
1029
-
1030
-
1031
-    /**
1032
-     * This is a method that allows for sending a message using a messenger matching the string given and the provided
1033
-     * EE_Message_Queue object.  The EE_Message_Queue object is used to create a single aggregate EE_Message via the
1034
-     * content found in the EE_Message objects in the queue.
1035
-     *
1036
-     * @since 4.9.0
1037
-     * @param string            $messenger            a string matching a valid active messenger in the system
1038
-     * @param string            $message_type         Although it seems contrary to the name of the method, a message
1039
-     *                                                type name is still required to send along the message type to the
1040
-     *                                                messenger because this is used for determining what specific
1041
-     *                                                variations might be loaded for the generated message.
1042
-     * @param EE_Messages_Queue $queue
1043
-     * @param string            $custom_subject       Can be used to set what the custom subject string will be on the
1044
-     *                                                aggregate EE_Message object.
1045
-     * @return bool success or fail.
1046
-     * @throws EE_Error
1047
-     * @throws InvalidArgumentException
1048
-     * @throws ReflectionException
1049
-     * @throws InvalidDataTypeException
1050
-     * @throws InvalidInterfaceException
1051
-     */
1052
-    public static function send_message_with_messenger_only(
1053
-        $messenger,
1054
-        $message_type,
1055
-        EE_Messages_Queue $queue,
1056
-        $custom_subject = ''
1057
-    ) {
1058
-        self::_load_controller();
1059
-        /** @type EE_Message_To_Generate_From_Queue $message_to_generate */
1060
-        $message_to_generate = EE_Registry::instance()->load_lib(
1061
-            'Message_To_Generate_From_Queue',
1062
-            array(
1063
-                $messenger,
1064
-                $message_type,
1065
-                $queue,
1066
-                $custom_subject,
1067
-            )
1068
-        );
1069
-        return self::$_MSG_PROCESSOR->queue_for_sending($message_to_generate);
1070
-    }
1071
-
1072
-
1073
-    /**
1074
-     * Generates Messages immediately for EE_Message IDs (but only for the correct status for generation)
1075
-     *
1076
-     * @since 4.9.0
1077
-     * @param array $message_ids An array of message ids
1078
-     * @return bool|EE_Messages_Queue false if nothing was generated, EE_Messages_Queue containing generated
1079
-     *                           messages.
1080
-     * @throws EE_Error
1081
-     * @throws InvalidArgumentException
1082
-     * @throws InvalidDataTypeException
1083
-     * @throws InvalidInterfaceException
1084
-     * @throws ReflectionException
1085
-     */
1086
-    public static function generate_now($message_ids)
1087
-    {
1088
-        self::_load_controller();
1089
-        $messages = EEM_Message::instance()->get_all(
1090
-            array(
1091
-                0 => array(
1092
-                    'MSG_ID' => array('IN', $message_ids),
1093
-                    'STS_ID' => EEM_Message::status_incomplete,
1094
-                ),
1095
-            )
1096
-        );
1097
-        $generated_queue = false;
1098
-        if ($messages) {
1099
-            $generated_queue = self::$_MSG_PROCESSOR->batch_generate_from_queue($messages);
1100
-        }
1101
-
1102
-        if (! $generated_queue instanceof EE_Messages_Queue) {
1103
-            EE_Error::add_error(
1104
-                __(
1105
-                    'The messages were not generated. This could mean there is already a batch being generated on a separate request, or because the selected messages are not ready for generation. Please wait a minute or two and try again.',
1106
-                    'event_espresso'
1107
-                ),
1108
-                __FILE__,
1109
-                __FUNCTION__,
1110
-                __LINE__
1111
-            );
1112
-        }
1113
-        return $generated_queue;
1114
-    }
1115
-
1116
-
1117
-    /**
1118
-     * Sends messages immediately for the incoming message_ids that have the status of EEM_Message::status_resend or,
1119
-     * EEM_Message::status_idle
1120
-     *
1121
-     * @since 4.9.0
1122
-     * @param $message_ids
1123
-     * @return bool|EE_Messages_Queue false if no messages sent.
1124
-     * @throws EE_Error
1125
-     * @throws InvalidArgumentException
1126
-     * @throws InvalidDataTypeException
1127
-     * @throws InvalidInterfaceException
1128
-     * @throws ReflectionException
1129
-     */
1130
-    public static function send_now($message_ids)
1131
-    {
1132
-        self::_load_controller();
1133
-        $messages = EEM_Message::instance()->get_all(
1134
-            array(
1135
-                0 => array(
1136
-                    'MSG_ID' => array('IN', $message_ids),
1137
-                    'STS_ID' => array(
1138
-                        'IN',
1139
-                        array(EEM_Message::status_idle, EEM_Message::status_resend, EEM_Message::status_retry),
1140
-                    ),
1141
-                ),
1142
-            )
1143
-        );
1144
-        $sent_queue = false;
1145
-        if ($messages) {
1146
-            $sent_queue = self::$_MSG_PROCESSOR->batch_send_from_queue($messages);
1147
-        }
1148
-
1149
-        if (! $sent_queue instanceof EE_Messages_Queue) {
1150
-            EE_Error::add_error(
1151
-                __(
1152
-                    'The messages were not sent. This could mean there is already a batch being sent on a separate request, or because the selected messages are not sendable. Please wait a minute or two and try again.',
1153
-                    'event_espresso'
1154
-                ),
1155
-                __FILE__,
1156
-                __FUNCTION__,
1157
-                __LINE__
1158
-            );
1159
-        } else {
1160
-            // can count how many sent by using the messages in the queue
1161
-            $sent_count = $sent_queue->count_STS_in_queue(EEM_Message::instance()->stati_indicating_sent());
1162
-            if ($sent_count > 0) {
1163
-                EE_Error::add_success(
1164
-                    sprintf(
1165
-                        _n(
1166
-                            'There was %d message successfully sent.',
1167
-                            'There were %d messages successfully sent.',
1168
-                            $sent_count,
1169
-                            'event_espresso'
1170
-                        ),
1171
-                        $sent_count
1172
-                    )
1173
-                );
1174
-            } else {
1175
-                EE_Error::overwrite_errors();
1176
-                EE_Error::add_error(
1177
-                    __(
1178
-                        'No message was sent because of problems with sending. Either all the messages you selected were not a sendable message, they were ALREADY sent on a different scheduled task, or there was an error.
259
+				exit;
260
+			}
261
+		}
262
+		return;
263
+	}
264
+
265
+
266
+	/**
267
+	 *  This runs when the msg_url_trigger route has initiated.
268
+	 *
269
+	 * @since 4.5.0
270
+	 * @param WP $WP
271
+	 * @throws EE_Error
272
+	 * @throws InvalidArgumentException
273
+	 * @throws ReflectionException
274
+	 * @throws InvalidDataTypeException
275
+	 * @throws InvalidInterfaceException
276
+	 */
277
+	public function run($WP)
278
+	{
279
+		// ensure controller is loaded
280
+		self::_load_controller();
281
+		// attempt to process message
282
+		try {
283
+			/** @type EE_Message_To_Generate_From_Request $message_to_generate */
284
+			$message_to_generate = EE_Registry::instance()->load_lib('Message_To_Generate_From_Request');
285
+			self::$_MSG_PROCESSOR->generate_and_send_now($message_to_generate);
286
+		} catch (EE_Error $e) {
287
+			$error_msg = __(
288
+				'Please note that a system message failed to send due to a technical issue.',
289
+				'event_espresso'
290
+			);
291
+			// add specific message for developers if WP_DEBUG in on
292
+			$error_msg .= '||' . $e->getMessage();
293
+			EE_Error::add_error($error_msg, __FILE__, __FUNCTION__, __LINE__);
294
+		}
295
+	}
296
+
297
+
298
+	/**
299
+	 * This is triggered by the 'msg_cron_trigger' route.
300
+	 *
301
+	 * @param WP $WP
302
+	 */
303
+	public function execute_batch_request($WP)
304
+	{
305
+		$this->run_cron();
306
+		header('HTTP/1.1 200 OK');
307
+		exit();
308
+	}
309
+
310
+
311
+	/**
312
+	 * This gets executed on wp_cron jobs or when a batch request is initiated on its own separate non regular wp
313
+	 * request.
314
+	 */
315
+	public function run_cron()
316
+	{
317
+		self::_load_controller();
318
+		// get required vars
319
+		$cron_type = EE_Registry::instance()->REQ->get('type');
320
+		$transient_key = EE_Registry::instance()->REQ->get('key');
321
+
322
+		// now let's verify transient, if not valid exit immediately
323
+		if (! get_transient($transient_key)) {
324
+			/**
325
+			 * trigger error so this gets in the error logs.  This is important because it happens on a non-user
326
+			 * request.
327
+			 */
328
+			trigger_error(esc_attr__('Invalid Request (Transient does not exist)', 'event_espresso'));
329
+		}
330
+
331
+		// if made it here, lets' delete the transient to keep the db clean
332
+		delete_transient($transient_key);
333
+
334
+		if (apply_filters('FHEE__EED_Messages__run_cron__use_wp_cron', true)) {
335
+			$method = 'batch_' . $cron_type . '_from_queue';
336
+			if (method_exists(self::$_MSG_PROCESSOR, $method)) {
337
+				self::$_MSG_PROCESSOR->$method();
338
+			} else {
339
+				// no matching task
340
+				/**
341
+				 * trigger error so this gets in the error logs.  This is important because it happens on a non user
342
+				 * request.
343
+				 */
344
+				trigger_error(
345
+					esc_attr(
346
+						sprintf(
347
+							__('There is no task corresponding to this route %s', 'event_espresso'),
348
+							$cron_type
349
+						)
350
+					)
351
+				);
352
+			}
353
+		}
354
+
355
+		do_action('FHEE__EED_Messages__run_cron__end');
356
+	}
357
+
358
+
359
+	/**
360
+	 * This is used to retrieve the template pack for the given name.
361
+	 * Retrieved packs are cached on the static $_TMP_PACKS array.  If there is no class matching the given name then
362
+	 * the default template pack is returned.
363
+	 *
364
+	 * @deprecated 4.9.0  @see EEH_MSG_Template::get_template_pack()
365
+	 * @param string $template_pack_name This should correspond to the dbref of the template pack (which is also used
366
+	 *                                   in generating the Pack class name).
367
+	 * @return EE_Messages_Template_Pack
368
+	 * @throws EE_Error
369
+	 * @throws InvalidArgumentException
370
+	 * @throws ReflectionException
371
+	 * @throws InvalidDataTypeException
372
+	 * @throws InvalidInterfaceException
373
+	 */
374
+	public static function get_template_pack($template_pack_name)
375
+	{
376
+		EE_Registry::instance()->load_helper('MSG_Template');
377
+		return EEH_MSG_Template::get_template_pack($template_pack_name);
378
+	}
379
+
380
+
381
+	/**
382
+	 * Retrieves an array of all template packs.
383
+	 * Array is in the format array( 'dbref' => EE_Messages_Template_Pack )
384
+	 *
385
+	 * @deprecated 4.9.0  @see EEH_MSG_Template_Pack::get_template_pack_collection
386
+	 * @return EE_Messages_Template_Pack[]
387
+	 * @throws EE_Error
388
+	 * @throws InvalidArgumentException
389
+	 * @throws ReflectionException
390
+	 * @throws InvalidDataTypeException
391
+	 * @throws InvalidInterfaceException
392
+	 */
393
+	public static function get_template_packs()
394
+	{
395
+		EE_Registry::instance()->load_helper('MSG_Template');
396
+
397
+		// for backward compat, let's make sure this returns in the same format as originally.
398
+		$template_pack_collection = EEH_MSG_Template::get_template_pack_collection();
399
+		$template_pack_collection->rewind();
400
+		$template_packs = array();
401
+		while ($template_pack_collection->valid()) {
402
+			$template_packs[ $template_pack_collection->current()->dbref ] = $template_pack_collection->current();
403
+			$template_pack_collection->next();
404
+		}
405
+		return $template_packs;
406
+	}
407
+
408
+
409
+	/**
410
+	 * This simply makes sure the autoloaders are registered for the EE_messages system.
411
+	 *
412
+	 * @since 4.5.0
413
+	 * @return void
414
+	 * @throws EE_Error
415
+	 */
416
+	public static function set_autoloaders()
417
+	{
418
+		if (empty(self::$_MSG_PATHS)) {
419
+			self::_set_messages_paths();
420
+			foreach (self::$_MSG_PATHS as $path) {
421
+				EEH_Autoloader::register_autoloaders_for_each_file_in_folder($path);
422
+			}
423
+			// add aliases
424
+			EEH_Autoloader::add_alias('EE_messages', 'EE_messages');
425
+			EEH_Autoloader::add_alias('EE_messenger', 'EE_messenger');
426
+		}
427
+	}
428
+
429
+
430
+	/**
431
+	 * Take care of adding all the paths for the messages components to the $_MSG_PATHS property
432
+	 * for use by the Messages Autoloaders
433
+	 *
434
+	 * @since 4.5.0
435
+	 * @return void.
436
+	 */
437
+	protected static function _set_messages_paths()
438
+	{
439
+		self::$_MSG_PATHS = apply_filters(
440
+			'FHEE__EED_Messages___set_messages_paths___MSG_PATHS',
441
+			[
442
+				EE_LIBRARIES . 'messages/message_type',
443
+				EE_LIBRARIES . 'messages/messenger',
444
+				EE_LIBRARIES . 'messages/defaults',
445
+				EE_LIBRARIES . 'messages/defaults/email',
446
+				EE_LIBRARIES . 'messages/data_class',
447
+				EE_LIBRARIES . 'messages/validators',
448
+				EE_LIBRARIES . 'messages/validators/email',
449
+				EE_LIBRARIES . 'messages/validators/html',
450
+				EE_LIBRARIES . 'shortcodes',
451
+			]
452
+		);
453
+	}
454
+
455
+
456
+	/**
457
+	 * Takes care of loading dependencies
458
+	 *
459
+	 * @since 4.5.0
460
+	 * @return void
461
+	 * @throws EE_Error
462
+	 * @throws InvalidArgumentException
463
+	 * @throws ReflectionException
464
+	 * @throws InvalidDataTypeException
465
+	 * @throws InvalidInterfaceException
466
+	 */
467
+	protected static function _load_controller()
468
+	{
469
+		if (! self::$_MSG_PROCESSOR instanceof EE_Messages_Processor) {
470
+			EE_Registry::instance()->load_core('Request_Handler');
471
+			self::set_autoloaders();
472
+			self::$_EEMSG = EE_Registry::instance()->load_lib('messages');
473
+			self::$_MSG_PROCESSOR = EE_Registry::instance()->load_lib('Messages_Processor');
474
+			self::$_message_resource_manager = EE_Registry::instance()->load_lib('Message_Resource_Manager');
475
+		}
476
+	}
477
+
478
+
479
+	/**
480
+	 * @param EE_Transaction $transaction
481
+	 * @throws EE_Error
482
+	 * @throws InvalidArgumentException
483
+	 * @throws InvalidDataTypeException
484
+	 * @throws InvalidInterfaceException
485
+	 * @throws ReflectionException
486
+	 */
487
+	public static function payment_reminder(EE_Transaction $transaction)
488
+	{
489
+		self::_load_controller();
490
+		$data = array($transaction, null);
491
+		self::$_MSG_PROCESSOR->generate_for_all_active_messengers('payment_reminder', $data);
492
+	}
493
+
494
+
495
+	/**
496
+	 * Any messages triggers for after successful gateway payments should go in here.
497
+	 *
498
+	 * @param EE_Transaction  $transaction object
499
+	 * @param EE_Payment|null $payment     object
500
+	 * @return void
501
+	 * @throws EE_Error
502
+	 * @throws InvalidArgumentException
503
+	 * @throws ReflectionException
504
+	 * @throws InvalidDataTypeException
505
+	 * @throws InvalidInterfaceException
506
+	 */
507
+	public static function payment(EE_Transaction $transaction, EE_Payment $payment = null)
508
+	{
509
+		// if there's no payment object, then we cannot do a payment type message!
510
+		if (! $payment instanceof EE_Payment) {
511
+			return;
512
+		}
513
+		self::_load_controller();
514
+		$data = array($transaction, $payment);
515
+		EE_Registry::instance()->load_helper('MSG_Template');
516
+		$message_type = EEH_MSG_Template::convert_payment_status_to_message_type($payment->STS_ID());
517
+		// if payment amount is less than 0 then switch to payment_refund message type.
518
+		$message_type = $payment->amount() < 0 ? 'payment_refund' : $message_type;
519
+		self::$_MSG_PROCESSOR->generate_for_all_active_messengers($message_type, $data);
520
+	}
521
+
522
+
523
+	/**
524
+	 * @param EE_Transaction $transaction
525
+	 * @throws EE_Error
526
+	 * @throws InvalidArgumentException
527
+	 * @throws InvalidDataTypeException
528
+	 * @throws InvalidInterfaceException
529
+	 * @throws ReflectionException
530
+	 */
531
+	public static function cancelled_registration(EE_Transaction $transaction)
532
+	{
533
+		self::_load_controller();
534
+		$data = array($transaction, null);
535
+		self::$_MSG_PROCESSOR->generate_for_all_active_messengers('cancelled_registration', $data);
536
+	}
537
+
538
+
539
+	/**
540
+	 * Trigger for Registration messages
541
+	 * Note that what registration message type is sent depends on what the reg status is for the registrations on the
542
+	 * incoming transaction.
543
+	 *
544
+	 * @param EE_Registration $registration
545
+	 * @param array           $extra_details
546
+	 * @return void
547
+	 * @throws EE_Error
548
+	 * @throws InvalidArgumentException
549
+	 * @throws InvalidDataTypeException
550
+	 * @throws InvalidInterfaceException
551
+	 * @throws ReflectionException
552
+	 * @throws EntityNotFoundException
553
+	 */
554
+	public static function maybe_registration(EE_Registration $registration, $extra_details = array())
555
+	{
556
+
557
+		if (! self::_verify_registration_notification_send($registration, $extra_details)) {
558
+			// no messages please
559
+			return;
560
+		}
561
+
562
+		// get all non-trashed registrations so we make sure we send messages for the right status.
563
+		$all_registrations = $registration->transaction()->registrations(
564
+			array(
565
+				array('REG_deleted' => false),
566
+				'order_by' => array(
567
+					'Event.EVT_name'     => 'ASC',
568
+					'Attendee.ATT_lname' => 'ASC',
569
+					'Attendee.ATT_fname' => 'ASC',
570
+				),
571
+			)
572
+		);
573
+		// cached array of statuses so we only trigger messages once per status.
574
+		$statuses_sent = array();
575
+		self::_load_controller();
576
+		$mtgs = array();
577
+
578
+		// loop through registrations and trigger messages once per status.
579
+		foreach ($all_registrations as $reg) {
580
+			// already triggered?
581
+			if (in_array($reg->status_ID(), $statuses_sent)) {
582
+				continue;
583
+			}
584
+
585
+			$message_type = EEH_MSG_Template::convert_reg_status_to_message_type($reg->status_ID());
586
+			$mtgs = array_merge(
587
+				$mtgs,
588
+				self::$_MSG_PROCESSOR->setup_mtgs_for_all_active_messengers(
589
+					$message_type,
590
+					array($registration->transaction(), null, $reg->status_ID())
591
+				)
592
+			);
593
+			$statuses_sent[] = $reg->status_ID();
594
+		}
595
+
596
+		if (count($statuses_sent) > 1) {
597
+			$mtgs = array_merge(
598
+				$mtgs,
599
+				self::$_MSG_PROCESSOR->setup_mtgs_for_all_active_messengers(
600
+					'registration_summary',
601
+					array($registration->transaction(), null)
602
+				)
603
+			);
604
+		}
605
+
606
+		// batch queue and initiate request
607
+		self::$_MSG_PROCESSOR->batch_queue_for_generation_and_persist($mtgs);
608
+		self::$_MSG_PROCESSOR->get_queue()->initiate_request_by_priority();
609
+	}
610
+
611
+
612
+	/**
613
+	 * This is a helper method used to very whether a registration notification should be sent or
614
+	 * not.  Prevents duplicate notifications going out for registration context notifications.
615
+	 *
616
+	 * @param EE_Registration $registration  [description]
617
+	 * @param array           $extra_details [description]
618
+	 * @return bool          true = send away, false = nope halt the presses.
619
+	 */
620
+	protected static function _verify_registration_notification_send(
621
+		EE_Registration $registration,
622
+		$extra_details = array()
623
+	) {
624
+		if (! $registration->is_primary_registrant()) {
625
+			return false;
626
+		}
627
+		// first we check if we're in admin and not doing front ajax
628
+		if (is_admin() && ! EE_FRONT_AJAX) {
629
+			// make sure appropriate admin params are set for sending messages
630
+			if (
631
+				empty($_REQUEST['txn_reg_status_change']['send_notifications'])
632
+				|| ! absint($_REQUEST['txn_reg_status_change']['send_notifications'])
633
+			) {
634
+				// no messages sent please.
635
+				return false;
636
+			}
637
+		} else {
638
+			// frontend request (either regular or via AJAX)
639
+			// TXN is NOT finalized ?
640
+			if (! isset($extra_details['finalized']) || $extra_details['finalized'] === false) {
641
+				return false;
642
+			}
643
+			// return visit but nothing changed ???
644
+			if (
645
+				isset($extra_details['revisit'], $extra_details['status_updates']) &&
646
+				$extra_details['revisit'] && ! $extra_details['status_updates']
647
+			) {
648
+				return false;
649
+			}
650
+			// NOT sending messages && reg status is something other than "Not-Approved"
651
+			if (
652
+				! apply_filters('FHEE__EED_Messages___maybe_registration__deliver_notifications', false) &&
653
+				$registration->status_ID() !== EEM_Registration::status_id_not_approved
654
+			) {
655
+				return false;
656
+			}
657
+		}
658
+		// release the kraken
659
+		return true;
660
+	}
661
+
662
+
663
+	/**
664
+	 * Simply returns an array indexed by Registration Status ID and the related message_type name associated with that
665
+	 * status id.
666
+	 *
667
+	 * @deprecated 4.9.0  Use EEH_MSG_Template::reg_status_to_message_type_array()
668
+	 *                    or EEH_MSG_Template::convert_reg_status_to_message_type
669
+	 * @param string $reg_status
670
+	 * @return array
671
+	 * @throws EE_Error
672
+	 * @throws InvalidArgumentException
673
+	 * @throws ReflectionException
674
+	 * @throws InvalidDataTypeException
675
+	 * @throws InvalidInterfaceException
676
+	 */
677
+	protected static function _get_reg_status_array($reg_status = '')
678
+	{
679
+		EE_Registry::instance()->load_helper('MSG_Template');
680
+		return EEH_MSG_Template::convert_reg_status_to_message_type($reg_status)
681
+			? EEH_MSG_Template::convert_reg_status_to_message_type($reg_status)
682
+			: EEH_MSG_Template::reg_status_to_message_type_array();
683
+	}
684
+
685
+
686
+	/**
687
+	 * Simply returns the payment message type for the given payment status.
688
+	 *
689
+	 * @deprecated 4.9.0 Use EEH_MSG_Template::payment_status_to_message_type_array
690
+	 *                   or EEH_MSG_Template::convert_payment_status_to_message_type
691
+	 * @param string $payment_status The payment status being matched.
692
+	 * @return bool|string The payment message type slug matching the status or false if no match.
693
+	 * @throws EE_Error
694
+	 * @throws InvalidArgumentException
695
+	 * @throws ReflectionException
696
+	 * @throws InvalidDataTypeException
697
+	 * @throws InvalidInterfaceException
698
+	 */
699
+	protected static function _get_payment_message_type($payment_status)
700
+	{
701
+		EE_Registry::instance()->load_helper('MSG_Template');
702
+		return EEH_MSG_Template::convert_payment_status_to_message_type($payment_status)
703
+			? EEH_MSG_Template::convert_payment_status_to_message_type($payment_status)
704
+			: false;
705
+	}
706
+
707
+
708
+	/**
709
+	 * Message triggers for a resending already sent message(s) (via EE_Message list table)
710
+	 *
711
+	 * @access public
712
+	 * @param array $req_data This is the $_POST & $_GET data sent from EE_Admin Pages
713
+	 * @return bool success/fail
714
+	 * @throws EE_Error
715
+	 * @throws InvalidArgumentException
716
+	 * @throws InvalidDataTypeException
717
+	 * @throws InvalidInterfaceException
718
+	 * @throws ReflectionException
719
+	 */
720
+	public static function process_resend($req_data)
721
+	{
722
+		self::_load_controller();
723
+
724
+		// if $msgID in this request then skip to the new resend_message
725
+		if (EE_Registry::instance()->REQ->get('MSG_ID')) {
726
+			return self::resend_message();
727
+		}
728
+
729
+		// make sure any incoming request data is set on the REQ so that it gets picked up later.
730
+		$req_data = (array) $req_data;
731
+		foreach ($req_data as $request_key => $request_value) {
732
+			EE_Registry::instance()->REQ->set($request_key, $request_value);
733
+		}
734
+
735
+		if (
736
+			! $messages_to_send = self::$_MSG_PROCESSOR->setup_messages_to_generate_from_registration_ids_in_request(
737
+			)
738
+		) {
739
+			return false;
740
+		}
741
+
742
+		try {
743
+			self::$_MSG_PROCESSOR->batch_queue_for_generation_and_persist($messages_to_send);
744
+			self::$_MSG_PROCESSOR->get_queue()->initiate_request_by_priority();
745
+		} catch (EE_Error $e) {
746
+			EE_Error::add_error($e->getMessage(), __FILE__, __FUNCTION__, __LINE__);
747
+			return false;
748
+		}
749
+		EE_Error::add_success(
750
+			__('Messages have been successfully queued for generation and sending.', 'event_espresso')
751
+		);
752
+		return true; // everything got queued.
753
+	}
754
+
755
+
756
+	/**
757
+	 * Message triggers for a resending already sent message(s) (via EE_Message list table)
758
+	 *
759
+	 * @return bool
760
+	 * @throws EE_Error
761
+	 * @throws InvalidArgumentException
762
+	 * @throws InvalidDataTypeException
763
+	 * @throws InvalidInterfaceException
764
+	 * @throws ReflectionException
765
+	 */
766
+	public static function resend_message()
767
+	{
768
+		self::_load_controller();
769
+
770
+		$msgID = EE_Registry::instance()->REQ->get('MSG_ID');
771
+		if (! $msgID) {
772
+			EE_Error::add_error(
773
+				__(
774
+					'Something went wrong because there is no "MSG_ID" value in the request',
775
+					'event_espresso'
776
+				),
777
+				__FILE__,
778
+				__FUNCTION__,
779
+				__LINE__
780
+			);
781
+			return false;
782
+		}
783
+
784
+		self::$_MSG_PROCESSOR->setup_messages_from_ids_and_send((array) $msgID);
785
+
786
+		// setup success message.
787
+		$count_ready_for_resend = self::$_MSG_PROCESSOR->get_queue()->count_STS_in_queue(EEM_Message::status_resend);
788
+		EE_Error::add_success(
789
+			sprintf(
790
+				_n(
791
+					'There was %d message queued for resending.',
792
+					'There were %d messages queued for resending.',
793
+					$count_ready_for_resend,
794
+					'event_espresso'
795
+				),
796
+				$count_ready_for_resend
797
+			)
798
+		);
799
+		return true;
800
+	}
801
+
802
+
803
+	/**
804
+	 * Message triggers for manual payment applied by admin
805
+	 *
806
+	 * @param  EE_Payment $payment EE_payment object
807
+	 * @return bool success/fail
808
+	 * @throws EE_Error
809
+	 * @throws InvalidArgumentException
810
+	 * @throws ReflectionException
811
+	 * @throws InvalidDataTypeException
812
+	 * @throws InvalidInterfaceException
813
+	 */
814
+	public static function process_admin_payment(EE_Payment $payment)
815
+	{
816
+		EE_Registry::instance()->load_helper('MSG_Template');
817
+		// we need to get the transaction object
818
+		$transaction = $payment->transaction();
819
+		if ($transaction instanceof EE_Transaction) {
820
+			$data = array($transaction, $payment);
821
+			$message_type = EEH_MSG_Template::convert_payment_status_to_message_type($payment->STS_ID());
822
+
823
+			// if payment amount is less than 0 then switch to payment_refund message type.
824
+			$message_type = $payment->amount() < 0 ? 'payment_refund' : $message_type;
825
+
826
+			// if payment_refund is selected, but the status is NOT accepted.  Then change message type to false so NO message notification goes out.
827
+			$message_type = $message_type == 'payment_refund' && $payment->STS_ID() != EEM_Payment::status_id_approved
828
+				? false : $message_type;
829
+
830
+			self::_load_controller();
831
+
832
+			self::$_MSG_PROCESSOR->generate_for_all_active_messengers($message_type, $data);
833
+
834
+			// get count of queued for generation
835
+			$count_to_generate = self::$_MSG_PROCESSOR->get_queue()->count_STS_in_queue(
836
+				array(
837
+					EEM_Message::status_incomplete,
838
+					EEM_Message::status_idle,
839
+				)
840
+			);
841
+
842
+			if ($count_to_generate > 0 && self::$_MSG_PROCESSOR->get_queue()->get_message_repository()->count() !== 0) {
843
+				add_filter('FHEE__EE_Admin_Page___process_admin_payment_notification__success', '__return_true');
844
+				return true;
845
+			} else {
846
+				$count_failed = self::$_MSG_PROCESSOR->get_queue()->count_STS_in_queue(
847
+					EEM_Message::instance()->stati_indicating_failed_sending()
848
+				);
849
+				/**
850
+				 * Verify that there are actually errors.  If not then we return a success message because the queue might have been emptied due to successful
851
+				 * IMMEDIATE generation.
852
+				 */
853
+				if ($count_failed > 0) {
854
+					EE_Error::add_error(
855
+						sprintf(
856
+							_n(
857
+								'The payment notification generation failed.',
858
+								'%d payment notifications failed being sent.',
859
+								$count_failed,
860
+								'event_espresso'
861
+							),
862
+							$count_failed
863
+						),
864
+						__FILE__,
865
+						__FUNCTION__,
866
+						__LINE__
867
+					);
868
+
869
+					return false;
870
+				} else {
871
+					add_filter('FHEE__EE_Admin_Page___process_admin_payment_notification__success', '__return_true');
872
+					return true;
873
+				}
874
+			}
875
+		} else {
876
+			EE_Error::add_error(
877
+				'Unable to generate the payment notification because the given value for the transaction is invalid.',
878
+				'event_espresso'
879
+			);
880
+			return false;
881
+		}
882
+	}
883
+
884
+
885
+	/**
886
+	 * Callback for AHEE__Extend_Registrations_Admin_Page___newsletter_selected_send_with_registrations trigger
887
+	 *
888
+	 * @since   4.3.0
889
+	 * @param  EE_Registration[] $registrations an array of EE_Registration objects
890
+	 * @param  int               $grp_id        a specific message template group id.
891
+	 * @return void
892
+	 * @throws EE_Error
893
+	 * @throws InvalidArgumentException
894
+	 * @throws InvalidDataTypeException
895
+	 * @throws InvalidInterfaceException
896
+	 * @throws ReflectionException
897
+	 */
898
+	public static function send_newsletter_message($registrations, $grp_id)
899
+	{
900
+		// make sure mtp is id and set it in the EE_Request Handler later messages setup.
901
+		EE_Registry::instance()->REQ->set('GRP_ID', (int) $grp_id);
902
+		self::_load_controller();
903
+		self::$_MSG_PROCESSOR->generate_for_all_active_messengers('newsletter', $registrations);
904
+	}
905
+
906
+
907
+	/**
908
+	 * Callback for FHEE__EE_Registration__invoice_url__invoice_url or FHEE__EE_Registration__receipt_url__receipt_url
909
+	 *
910
+	 * @since   4.3.0
911
+	 * @param    string          $registration_message_trigger_url
912
+	 * @param    EE_Registration $registration
913
+	 * @param string             $messenger
914
+	 * @param string             $message_type
915
+	 * @return string
916
+	 * @throws EE_Error
917
+	 * @throws InvalidArgumentException
918
+	 * @throws InvalidDataTypeException
919
+	 * @throws InvalidInterfaceException
920
+	 */
921
+	public static function registration_message_trigger_url(
922
+		$registration_message_trigger_url,
923
+		EE_Registration $registration,
924
+		$messenger = 'html',
925
+		$message_type = 'invoice'
926
+	) {
927
+		// whitelist $messenger
928
+		switch ($messenger) {
929
+			case 'pdf':
930
+				$sending_messenger = 'pdf';
931
+				$generating_messenger = 'html';
932
+				break;
933
+			case 'html':
934
+			default:
935
+				$sending_messenger = 'html';
936
+				$generating_messenger = 'html';
937
+				break;
938
+		}
939
+		// whitelist $message_type
940
+		switch ($message_type) {
941
+			case 'receipt':
942
+				$message_type = 'receipt';
943
+				break;
944
+			case 'invoice':
945
+			default:
946
+				$message_type = 'invoice';
947
+				break;
948
+		}
949
+		// verify that both the messenger AND the message type are active
950
+		if (
951
+			EEH_MSG_Template::is_messenger_active($sending_messenger)
952
+			&& EEH_MSG_Template::is_mt_active($message_type)
953
+		) {
954
+			// need to get the correct message template group for this (i.e. is there a custom invoice for the event this registration is registered for?)
955
+			$template_query_params = array(
956
+				'MTP_is_active'    => true,
957
+				'MTP_messenger'    => $generating_messenger,
958
+				'MTP_message_type' => $message_type,
959
+				'Event.EVT_ID'     => $registration->event_ID(),
960
+			);
961
+			// get the message template group.
962
+			$msg_template_group = EEM_Message_Template_Group::instance()->get_one(array($template_query_params));
963
+			// if we don't have an EE_Message_Template_Group then return
964
+			if (! $msg_template_group instanceof EE_Message_Template_Group) {
965
+				// remove EVT_ID from query params so that global templates get picked up
966
+				unset($template_query_params['Event.EVT_ID']);
967
+				// get global template as the fallback
968
+				$msg_template_group = EEM_Message_Template_Group::instance()->get_one(array($template_query_params));
969
+			}
970
+			// if we don't have an EE_Message_Template_Group then return
971
+			if (! $msg_template_group instanceof EE_Message_Template_Group) {
972
+				return '';
973
+			}
974
+			// generate the URL
975
+			$registration_message_trigger_url = EEH_MSG_Template::generate_url_trigger(
976
+				$sending_messenger,
977
+				$generating_messenger,
978
+				'purchaser',
979
+				$message_type,
980
+				$registration,
981
+				$msg_template_group->ID(),
982
+				$registration->transaction_ID()
983
+			);
984
+		}
985
+		return $registration_message_trigger_url;
986
+	}
987
+
988
+
989
+	/**
990
+	 * Use to generate and return a message preview!
991
+	 *
992
+	 * @param  string $type      This should correspond with a valid message type
993
+	 * @param  string $context   This should correspond with a valid context for the message type
994
+	 * @param  string $messenger This should correspond with a valid messenger.
995
+	 * @param bool    $send      true we will do a test send using the messenger delivery, false we just do a regular
996
+	 *                           preview
997
+	 * @return bool|string The body of the message or if send is requested, sends.
998
+	 * @throws EE_Error
999
+	 * @throws InvalidArgumentException
1000
+	 * @throws InvalidDataTypeException
1001
+	 * @throws InvalidInterfaceException
1002
+	 * @throws ReflectionException
1003
+	 */
1004
+	public static function preview_message($type, $context, $messenger, $send = false)
1005
+	{
1006
+		self::_load_controller();
1007
+		$mtg = new EE_Message_To_Generate(
1008
+			$messenger,
1009
+			$type,
1010
+			array(),
1011
+			$context,
1012
+			true
1013
+		);
1014
+		$generated_preview_queue = self::$_MSG_PROCESSOR->generate_for_preview($mtg, $send);
1015
+		if ($generated_preview_queue instanceof EE_Messages_Queue) {
1016
+			// loop through all content for the preview and remove any persisted records.
1017
+			$content = '';
1018
+			foreach ($generated_preview_queue->get_message_repository() as $message) {
1019
+				$content = $message->content();
1020
+				if ($message->ID() > 0 && $message->STS_ID() !== EEM_Message::status_failed) {
1021
+					$message->delete();
1022
+				}
1023
+			}
1024
+			return $content;
1025
+		} else {
1026
+			return $generated_preview_queue;
1027
+		}
1028
+	}
1029
+
1030
+
1031
+	/**
1032
+	 * This is a method that allows for sending a message using a messenger matching the string given and the provided
1033
+	 * EE_Message_Queue object.  The EE_Message_Queue object is used to create a single aggregate EE_Message via the
1034
+	 * content found in the EE_Message objects in the queue.
1035
+	 *
1036
+	 * @since 4.9.0
1037
+	 * @param string            $messenger            a string matching a valid active messenger in the system
1038
+	 * @param string            $message_type         Although it seems contrary to the name of the method, a message
1039
+	 *                                                type name is still required to send along the message type to the
1040
+	 *                                                messenger because this is used for determining what specific
1041
+	 *                                                variations might be loaded for the generated message.
1042
+	 * @param EE_Messages_Queue $queue
1043
+	 * @param string            $custom_subject       Can be used to set what the custom subject string will be on the
1044
+	 *                                                aggregate EE_Message object.
1045
+	 * @return bool success or fail.
1046
+	 * @throws EE_Error
1047
+	 * @throws InvalidArgumentException
1048
+	 * @throws ReflectionException
1049
+	 * @throws InvalidDataTypeException
1050
+	 * @throws InvalidInterfaceException
1051
+	 */
1052
+	public static function send_message_with_messenger_only(
1053
+		$messenger,
1054
+		$message_type,
1055
+		EE_Messages_Queue $queue,
1056
+		$custom_subject = ''
1057
+	) {
1058
+		self::_load_controller();
1059
+		/** @type EE_Message_To_Generate_From_Queue $message_to_generate */
1060
+		$message_to_generate = EE_Registry::instance()->load_lib(
1061
+			'Message_To_Generate_From_Queue',
1062
+			array(
1063
+				$messenger,
1064
+				$message_type,
1065
+				$queue,
1066
+				$custom_subject,
1067
+			)
1068
+		);
1069
+		return self::$_MSG_PROCESSOR->queue_for_sending($message_to_generate);
1070
+	}
1071
+
1072
+
1073
+	/**
1074
+	 * Generates Messages immediately for EE_Message IDs (but only for the correct status for generation)
1075
+	 *
1076
+	 * @since 4.9.0
1077
+	 * @param array $message_ids An array of message ids
1078
+	 * @return bool|EE_Messages_Queue false if nothing was generated, EE_Messages_Queue containing generated
1079
+	 *                           messages.
1080
+	 * @throws EE_Error
1081
+	 * @throws InvalidArgumentException
1082
+	 * @throws InvalidDataTypeException
1083
+	 * @throws InvalidInterfaceException
1084
+	 * @throws ReflectionException
1085
+	 */
1086
+	public static function generate_now($message_ids)
1087
+	{
1088
+		self::_load_controller();
1089
+		$messages = EEM_Message::instance()->get_all(
1090
+			array(
1091
+				0 => array(
1092
+					'MSG_ID' => array('IN', $message_ids),
1093
+					'STS_ID' => EEM_Message::status_incomplete,
1094
+				),
1095
+			)
1096
+		);
1097
+		$generated_queue = false;
1098
+		if ($messages) {
1099
+			$generated_queue = self::$_MSG_PROCESSOR->batch_generate_from_queue($messages);
1100
+		}
1101
+
1102
+		if (! $generated_queue instanceof EE_Messages_Queue) {
1103
+			EE_Error::add_error(
1104
+				__(
1105
+					'The messages were not generated. This could mean there is already a batch being generated on a separate request, or because the selected messages are not ready for generation. Please wait a minute or two and try again.',
1106
+					'event_espresso'
1107
+				),
1108
+				__FILE__,
1109
+				__FUNCTION__,
1110
+				__LINE__
1111
+			);
1112
+		}
1113
+		return $generated_queue;
1114
+	}
1115
+
1116
+
1117
+	/**
1118
+	 * Sends messages immediately for the incoming message_ids that have the status of EEM_Message::status_resend or,
1119
+	 * EEM_Message::status_idle
1120
+	 *
1121
+	 * @since 4.9.0
1122
+	 * @param $message_ids
1123
+	 * @return bool|EE_Messages_Queue false if no messages sent.
1124
+	 * @throws EE_Error
1125
+	 * @throws InvalidArgumentException
1126
+	 * @throws InvalidDataTypeException
1127
+	 * @throws InvalidInterfaceException
1128
+	 * @throws ReflectionException
1129
+	 */
1130
+	public static function send_now($message_ids)
1131
+	{
1132
+		self::_load_controller();
1133
+		$messages = EEM_Message::instance()->get_all(
1134
+			array(
1135
+				0 => array(
1136
+					'MSG_ID' => array('IN', $message_ids),
1137
+					'STS_ID' => array(
1138
+						'IN',
1139
+						array(EEM_Message::status_idle, EEM_Message::status_resend, EEM_Message::status_retry),
1140
+					),
1141
+				),
1142
+			)
1143
+		);
1144
+		$sent_queue = false;
1145
+		if ($messages) {
1146
+			$sent_queue = self::$_MSG_PROCESSOR->batch_send_from_queue($messages);
1147
+		}
1148
+
1149
+		if (! $sent_queue instanceof EE_Messages_Queue) {
1150
+			EE_Error::add_error(
1151
+				__(
1152
+					'The messages were not sent. This could mean there is already a batch being sent on a separate request, or because the selected messages are not sendable. Please wait a minute or two and try again.',
1153
+					'event_espresso'
1154
+				),
1155
+				__FILE__,
1156
+				__FUNCTION__,
1157
+				__LINE__
1158
+			);
1159
+		} else {
1160
+			// can count how many sent by using the messages in the queue
1161
+			$sent_count = $sent_queue->count_STS_in_queue(EEM_Message::instance()->stati_indicating_sent());
1162
+			if ($sent_count > 0) {
1163
+				EE_Error::add_success(
1164
+					sprintf(
1165
+						_n(
1166
+							'There was %d message successfully sent.',
1167
+							'There were %d messages successfully sent.',
1168
+							$sent_count,
1169
+							'event_espresso'
1170
+						),
1171
+						$sent_count
1172
+					)
1173
+				);
1174
+			} else {
1175
+				EE_Error::overwrite_errors();
1176
+				EE_Error::add_error(
1177
+					__(
1178
+						'No message was sent because of problems with sending. Either all the messages you selected were not a sendable message, they were ALREADY sent on a different scheduled task, or there was an error.
1179 1179
 					If there was an error, you can look at the messages in the message activity list table for any error messages.',
1180
-                        'event_espresso'
1181
-                    ),
1182
-                    __FILE__,
1183
-                    __FUNCTION__,
1184
-                    __LINE__
1185
-                );
1186
-            }
1187
-        }
1188
-        return $sent_queue;
1189
-    }
1190
-
1191
-
1192
-    /**
1193
-     * Generate and send immediately from the given $message_ids
1194
-     *
1195
-     * @param array $message_ids EE_Message entity ids.
1196
-     * @throws EE_Error
1197
-     * @throws InvalidArgumentException
1198
-     * @throws InvalidDataTypeException
1199
-     * @throws InvalidInterfaceException
1200
-     * @throws ReflectionException
1201
-     */
1202
-    public static function generate_and_send_now(array $message_ids)
1203
-    {
1204
-        $generated_queue = self::generate_now($message_ids);
1205
-        // now let's just trigger sending immediately from this queue.
1206
-        $messages_sent = $generated_queue instanceof EE_Messages_Queue
1207
-            ? $generated_queue->execute()
1208
-            : 0;
1209
-        if ($messages_sent) {
1210
-            EE_Error::add_success(
1211
-                esc_html(
1212
-                    sprintf(
1213
-                        _n(
1214
-                            'There was %d message successfully generated and sent.',
1215
-                            'There were %d messages successfully generated and sent.',
1216
-                            $messages_sent,
1217
-                            'event_espresso'
1218
-                        ),
1219
-                        $messages_sent
1220
-                    )
1221
-                )
1222
-            );
1223
-            // errors would be added via the generate_now method.
1224
-        }
1225
-    }
1226
-
1227
-
1228
-    /**
1229
-     * This will queue the incoming message ids for resending.
1230
-     * Note, only message_ids corresponding to messages with the status of EEM_Message::sent will be queued.
1231
-     *
1232
-     * @since 4.9.0
1233
-     * @param array $message_ids An array of EE_Message IDs
1234
-     * @return bool true means messages were successfully queued for resending, false means none were queued for
1235
-     *                           resending.
1236
-     * @throws EE_Error
1237
-     * @throws InvalidArgumentException
1238
-     * @throws InvalidDataTypeException
1239
-     * @throws InvalidInterfaceException
1240
-     * @throws ReflectionException
1241
-     */
1242
-    public static function queue_for_resending($message_ids)
1243
-    {
1244
-        self::_load_controller();
1245
-        self::$_MSG_PROCESSOR->setup_messages_from_ids_and_send($message_ids);
1246
-
1247
-        // get queue and count
1248
-        $queue_count = self::$_MSG_PROCESSOR->get_queue()->count_STS_in_queue(EEM_Message::status_resend);
1249
-
1250
-        if (
1251
-            $queue_count > 0
1252
-        ) {
1253
-            EE_Error::add_success(
1254
-                sprintf(
1255
-                    _n(
1256
-                        '%d message successfully queued for resending.',
1257
-                        '%d messages successfully queued for resending.',
1258
-                        $queue_count,
1259
-                        'event_espresso'
1260
-                    ),
1261
-                    $queue_count
1262
-                )
1263
-            );
1264
-            /**
1265
-             * @see filter usage in EE_Messages_Queue::initiate_request_by_priority
1266
-             */
1267
-        } elseif (
1268
-            apply_filters('FHEE__EE_Messages_Processor__initiate_request_by_priority__do_immediate_processing', true)
1269
-            || EE_Registry::instance()->NET_CFG->core->do_messages_on_same_request
1270
-        ) {
1271
-            $queue_count = self::$_MSG_PROCESSOR->get_queue()->count_STS_in_queue(EEM_Message::status_sent);
1272
-            if ($queue_count > 0) {
1273
-                EE_Error::add_success(
1274
-                    sprintf(
1275
-                        _n(
1276
-                            '%d message successfully sent.',
1277
-                            '%d messages successfully sent.',
1278
-                            $queue_count,
1279
-                            'event_espresso'
1280
-                        ),
1281
-                        $queue_count
1282
-                    )
1283
-                );
1284
-            } else {
1285
-                EE_Error::add_error(
1286
-                    __(
1287
-                        'No messages were queued for resending. This usually only happens when all the messages flagged for resending are not a status that can be resent.',
1288
-                        'event_espresso'
1289
-                    ),
1290
-                    __FILE__,
1291
-                    __FUNCTION__,
1292
-                    __LINE__
1293
-                );
1294
-            }
1295
-        } else {
1296
-            EE_Error::add_error(
1297
-                __(
1298
-                    'No messages were queued for resending. This usually only happens when all the messages flagged for resending are not a status that can be resent.',
1299
-                    'event_espresso'
1300
-                ),
1301
-                __FILE__,
1302
-                __FUNCTION__,
1303
-                __LINE__
1304
-            );
1305
-        }
1306
-        return (bool) $queue_count;
1307
-    }
1308
-
1309
-
1310
-    /**
1311
-     * debug
1312
-     *
1313
-     * @param string          $class
1314
-     * @param string          $func
1315
-     * @param string          $line
1316
-     * @param \EE_Transaction $transaction
1317
-     * @param array           $info
1318
-     * @param bool            $display_request
1319
-     * @throws EE_Error
1320
-     * @throws \EventEspresso\core\exceptions\InvalidSessionDataException
1321
-     */
1322
-    protected static function log(
1323
-        $class = '',
1324
-        $func = '',
1325
-        $line = '',
1326
-        EE_Transaction $transaction,
1327
-        $info = array(),
1328
-        $display_request = false
1329
-    ) {
1330
-        if (defined('EE_DEBUG') && EE_DEBUG) {
1331
-            if ($transaction instanceof EE_Transaction) {
1332
-                // don't serialize objects
1333
-                $info = EEH_Debug_Tools::strip_objects($info);
1334
-                $info['TXN_status'] = $transaction->status_ID();
1335
-                $info['TXN_reg_steps'] = $transaction->reg_steps();
1336
-                if ($transaction->ID()) {
1337
-                    $index = 'EE_Transaction: ' . $transaction->ID();
1338
-                    EEH_Debug_Tools::log($class, $func, $line, $info, $display_request, $index);
1339
-                }
1340
-            }
1341
-        }
1342
-    }
1343
-
1344
-
1345
-    /**
1346
-     *  Resets all the static properties in this class when called.
1347
-     */
1348
-    public static function reset()
1349
-    {
1350
-        self::$_EEMSG = null;
1351
-        self::$_message_resource_manager = null;
1352
-        self::$_MSG_PROCESSOR = null;
1353
-        self::$_MSG_PATHS = null;
1354
-        self::$_TMP_PACKS = array();
1355
-    }
1180
+						'event_espresso'
1181
+					),
1182
+					__FILE__,
1183
+					__FUNCTION__,
1184
+					__LINE__
1185
+				);
1186
+			}
1187
+		}
1188
+		return $sent_queue;
1189
+	}
1190
+
1191
+
1192
+	/**
1193
+	 * Generate and send immediately from the given $message_ids
1194
+	 *
1195
+	 * @param array $message_ids EE_Message entity ids.
1196
+	 * @throws EE_Error
1197
+	 * @throws InvalidArgumentException
1198
+	 * @throws InvalidDataTypeException
1199
+	 * @throws InvalidInterfaceException
1200
+	 * @throws ReflectionException
1201
+	 */
1202
+	public static function generate_and_send_now(array $message_ids)
1203
+	{
1204
+		$generated_queue = self::generate_now($message_ids);
1205
+		// now let's just trigger sending immediately from this queue.
1206
+		$messages_sent = $generated_queue instanceof EE_Messages_Queue
1207
+			? $generated_queue->execute()
1208
+			: 0;
1209
+		if ($messages_sent) {
1210
+			EE_Error::add_success(
1211
+				esc_html(
1212
+					sprintf(
1213
+						_n(
1214
+							'There was %d message successfully generated and sent.',
1215
+							'There were %d messages successfully generated and sent.',
1216
+							$messages_sent,
1217
+							'event_espresso'
1218
+						),
1219
+						$messages_sent
1220
+					)
1221
+				)
1222
+			);
1223
+			// errors would be added via the generate_now method.
1224
+		}
1225
+	}
1226
+
1227
+
1228
+	/**
1229
+	 * This will queue the incoming message ids for resending.
1230
+	 * Note, only message_ids corresponding to messages with the status of EEM_Message::sent will be queued.
1231
+	 *
1232
+	 * @since 4.9.0
1233
+	 * @param array $message_ids An array of EE_Message IDs
1234
+	 * @return bool true means messages were successfully queued for resending, false means none were queued for
1235
+	 *                           resending.
1236
+	 * @throws EE_Error
1237
+	 * @throws InvalidArgumentException
1238
+	 * @throws InvalidDataTypeException
1239
+	 * @throws InvalidInterfaceException
1240
+	 * @throws ReflectionException
1241
+	 */
1242
+	public static function queue_for_resending($message_ids)
1243
+	{
1244
+		self::_load_controller();
1245
+		self::$_MSG_PROCESSOR->setup_messages_from_ids_and_send($message_ids);
1246
+
1247
+		// get queue and count
1248
+		$queue_count = self::$_MSG_PROCESSOR->get_queue()->count_STS_in_queue(EEM_Message::status_resend);
1249
+
1250
+		if (
1251
+			$queue_count > 0
1252
+		) {
1253
+			EE_Error::add_success(
1254
+				sprintf(
1255
+					_n(
1256
+						'%d message successfully queued for resending.',
1257
+						'%d messages successfully queued for resending.',
1258
+						$queue_count,
1259
+						'event_espresso'
1260
+					),
1261
+					$queue_count
1262
+				)
1263
+			);
1264
+			/**
1265
+			 * @see filter usage in EE_Messages_Queue::initiate_request_by_priority
1266
+			 */
1267
+		} elseif (
1268
+			apply_filters('FHEE__EE_Messages_Processor__initiate_request_by_priority__do_immediate_processing', true)
1269
+			|| EE_Registry::instance()->NET_CFG->core->do_messages_on_same_request
1270
+		) {
1271
+			$queue_count = self::$_MSG_PROCESSOR->get_queue()->count_STS_in_queue(EEM_Message::status_sent);
1272
+			if ($queue_count > 0) {
1273
+				EE_Error::add_success(
1274
+					sprintf(
1275
+						_n(
1276
+							'%d message successfully sent.',
1277
+							'%d messages successfully sent.',
1278
+							$queue_count,
1279
+							'event_espresso'
1280
+						),
1281
+						$queue_count
1282
+					)
1283
+				);
1284
+			} else {
1285
+				EE_Error::add_error(
1286
+					__(
1287
+						'No messages were queued for resending. This usually only happens when all the messages flagged for resending are not a status that can be resent.',
1288
+						'event_espresso'
1289
+					),
1290
+					__FILE__,
1291
+					__FUNCTION__,
1292
+					__LINE__
1293
+				);
1294
+			}
1295
+		} else {
1296
+			EE_Error::add_error(
1297
+				__(
1298
+					'No messages were queued for resending. This usually only happens when all the messages flagged for resending are not a status that can be resent.',
1299
+					'event_espresso'
1300
+				),
1301
+				__FILE__,
1302
+				__FUNCTION__,
1303
+				__LINE__
1304
+			);
1305
+		}
1306
+		return (bool) $queue_count;
1307
+	}
1308
+
1309
+
1310
+	/**
1311
+	 * debug
1312
+	 *
1313
+	 * @param string          $class
1314
+	 * @param string          $func
1315
+	 * @param string          $line
1316
+	 * @param \EE_Transaction $transaction
1317
+	 * @param array           $info
1318
+	 * @param bool            $display_request
1319
+	 * @throws EE_Error
1320
+	 * @throws \EventEspresso\core\exceptions\InvalidSessionDataException
1321
+	 */
1322
+	protected static function log(
1323
+		$class = '',
1324
+		$func = '',
1325
+		$line = '',
1326
+		EE_Transaction $transaction,
1327
+		$info = array(),
1328
+		$display_request = false
1329
+	) {
1330
+		if (defined('EE_DEBUG') && EE_DEBUG) {
1331
+			if ($transaction instanceof EE_Transaction) {
1332
+				// don't serialize objects
1333
+				$info = EEH_Debug_Tools::strip_objects($info);
1334
+				$info['TXN_status'] = $transaction->status_ID();
1335
+				$info['TXN_reg_steps'] = $transaction->reg_steps();
1336
+				if ($transaction->ID()) {
1337
+					$index = 'EE_Transaction: ' . $transaction->ID();
1338
+					EEH_Debug_Tools::log($class, $func, $line, $info, $display_request, $index);
1339
+				}
1340
+			}
1341
+		}
1342
+	}
1343
+
1344
+
1345
+	/**
1346
+	 *  Resets all the static properties in this class when called.
1347
+	 */
1348
+	public static function reset()
1349
+	{
1350
+		self::$_EEMSG = null;
1351
+		self::$_message_resource_manager = null;
1352
+		self::$_MSG_PROCESSOR = null;
1353
+		self::$_MSG_PATHS = null;
1354
+		self::$_TMP_PACKS = array();
1355
+	}
1356 1356
 }
Please login to merge, or discard this patch.
Spacing   +25 added lines, -25 removed lines patch added patch discarded remove patch
@@ -202,7 +202,7 @@  discard block
 block discarded – undo
202 202
                 'event_espresso'
203 203
             );
204 204
             // add specific message for developers if WP_DEBUG in on
205
-            $error_msg .= '||' . $e->getMessage();
205
+            $error_msg .= '||'.$e->getMessage();
206 206
             EE_Error::add_error($error_msg, __FILE__, __FUNCTION__, __LINE__);
207 207
         }
208 208
     }
@@ -289,7 +289,7 @@  discard block
 block discarded – undo
289 289
                 'event_espresso'
290 290
             );
291 291
             // add specific message for developers if WP_DEBUG in on
292
-            $error_msg .= '||' . $e->getMessage();
292
+            $error_msg .= '||'.$e->getMessage();
293 293
             EE_Error::add_error($error_msg, __FILE__, __FUNCTION__, __LINE__);
294 294
         }
295 295
     }
@@ -320,7 +320,7 @@  discard block
 block discarded – undo
320 320
         $transient_key = EE_Registry::instance()->REQ->get('key');
321 321
 
322 322
         // now let's verify transient, if not valid exit immediately
323
-        if (! get_transient($transient_key)) {
323
+        if ( ! get_transient($transient_key)) {
324 324
             /**
325 325
              * trigger error so this gets in the error logs.  This is important because it happens on a non-user
326 326
              * request.
@@ -332,7 +332,7 @@  discard block
 block discarded – undo
332 332
         delete_transient($transient_key);
333 333
 
334 334
         if (apply_filters('FHEE__EED_Messages__run_cron__use_wp_cron', true)) {
335
-            $method = 'batch_' . $cron_type . '_from_queue';
335
+            $method = 'batch_'.$cron_type.'_from_queue';
336 336
             if (method_exists(self::$_MSG_PROCESSOR, $method)) {
337 337
                 self::$_MSG_PROCESSOR->$method();
338 338
             } else {
@@ -399,7 +399,7 @@  discard block
 block discarded – undo
399 399
         $template_pack_collection->rewind();
400 400
         $template_packs = array();
401 401
         while ($template_pack_collection->valid()) {
402
-            $template_packs[ $template_pack_collection->current()->dbref ] = $template_pack_collection->current();
402
+            $template_packs[$template_pack_collection->current()->dbref] = $template_pack_collection->current();
403 403
             $template_pack_collection->next();
404 404
         }
405 405
         return $template_packs;
@@ -439,15 +439,15 @@  discard block
 block discarded – undo
439 439
         self::$_MSG_PATHS = apply_filters(
440 440
             'FHEE__EED_Messages___set_messages_paths___MSG_PATHS',
441 441
             [
442
-                EE_LIBRARIES . 'messages/message_type',
443
-                EE_LIBRARIES . 'messages/messenger',
444
-                EE_LIBRARIES . 'messages/defaults',
445
-                EE_LIBRARIES . 'messages/defaults/email',
446
-                EE_LIBRARIES . 'messages/data_class',
447
-                EE_LIBRARIES . 'messages/validators',
448
-                EE_LIBRARIES . 'messages/validators/email',
449
-                EE_LIBRARIES . 'messages/validators/html',
450
-                EE_LIBRARIES . 'shortcodes',
442
+                EE_LIBRARIES.'messages/message_type',
443
+                EE_LIBRARIES.'messages/messenger',
444
+                EE_LIBRARIES.'messages/defaults',
445
+                EE_LIBRARIES.'messages/defaults/email',
446
+                EE_LIBRARIES.'messages/data_class',
447
+                EE_LIBRARIES.'messages/validators',
448
+                EE_LIBRARIES.'messages/validators/email',
449
+                EE_LIBRARIES.'messages/validators/html',
450
+                EE_LIBRARIES.'shortcodes',
451 451
             ]
452 452
         );
453 453
     }
@@ -466,7 +466,7 @@  discard block
 block discarded – undo
466 466
      */
467 467
     protected static function _load_controller()
468 468
     {
469
-        if (! self::$_MSG_PROCESSOR instanceof EE_Messages_Processor) {
469
+        if ( ! self::$_MSG_PROCESSOR instanceof EE_Messages_Processor) {
470 470
             EE_Registry::instance()->load_core('Request_Handler');
471 471
             self::set_autoloaders();
472 472
             self::$_EEMSG = EE_Registry::instance()->load_lib('messages');
@@ -507,7 +507,7 @@  discard block
 block discarded – undo
507 507
     public static function payment(EE_Transaction $transaction, EE_Payment $payment = null)
508 508
     {
509 509
         // if there's no payment object, then we cannot do a payment type message!
510
-        if (! $payment instanceof EE_Payment) {
510
+        if ( ! $payment instanceof EE_Payment) {
511 511
             return;
512 512
         }
513 513
         self::_load_controller();
@@ -554,7 +554,7 @@  discard block
 block discarded – undo
554 554
     public static function maybe_registration(EE_Registration $registration, $extra_details = array())
555 555
     {
556 556
 
557
-        if (! self::_verify_registration_notification_send($registration, $extra_details)) {
557
+        if ( ! self::_verify_registration_notification_send($registration, $extra_details)) {
558 558
             // no messages please
559 559
             return;
560 560
         }
@@ -621,7 +621,7 @@  discard block
 block discarded – undo
621 621
         EE_Registration $registration,
622 622
         $extra_details = array()
623 623
     ) {
624
-        if (! $registration->is_primary_registrant()) {
624
+        if ( ! $registration->is_primary_registrant()) {
625 625
             return false;
626 626
         }
627 627
         // first we check if we're in admin and not doing front ajax
@@ -637,7 +637,7 @@  discard block
 block discarded – undo
637 637
         } else {
638 638
             // frontend request (either regular or via AJAX)
639 639
             // TXN is NOT finalized ?
640
-            if (! isset($extra_details['finalized']) || $extra_details['finalized'] === false) {
640
+            if ( ! isset($extra_details['finalized']) || $extra_details['finalized'] === false) {
641 641
                 return false;
642 642
             }
643 643
             // return visit but nothing changed ???
@@ -768,7 +768,7 @@  discard block
 block discarded – undo
768 768
         self::_load_controller();
769 769
 
770 770
         $msgID = EE_Registry::instance()->REQ->get('MSG_ID');
771
-        if (! $msgID) {
771
+        if ( ! $msgID) {
772 772
             EE_Error::add_error(
773 773
                 __(
774 774
                     'Something went wrong because there is no "MSG_ID" value in the request',
@@ -961,14 +961,14 @@  discard block
 block discarded – undo
961 961
             // get the message template group.
962 962
             $msg_template_group = EEM_Message_Template_Group::instance()->get_one(array($template_query_params));
963 963
             // if we don't have an EE_Message_Template_Group then return
964
-            if (! $msg_template_group instanceof EE_Message_Template_Group) {
964
+            if ( ! $msg_template_group instanceof EE_Message_Template_Group) {
965 965
                 // remove EVT_ID from query params so that global templates get picked up
966 966
                 unset($template_query_params['Event.EVT_ID']);
967 967
                 // get global template as the fallback
968 968
                 $msg_template_group = EEM_Message_Template_Group::instance()->get_one(array($template_query_params));
969 969
             }
970 970
             // if we don't have an EE_Message_Template_Group then return
971
-            if (! $msg_template_group instanceof EE_Message_Template_Group) {
971
+            if ( ! $msg_template_group instanceof EE_Message_Template_Group) {
972 972
                 return '';
973 973
             }
974 974
             // generate the URL
@@ -1099,7 +1099,7 @@  discard block
 block discarded – undo
1099 1099
             $generated_queue = self::$_MSG_PROCESSOR->batch_generate_from_queue($messages);
1100 1100
         }
1101 1101
 
1102
-        if (! $generated_queue instanceof EE_Messages_Queue) {
1102
+        if ( ! $generated_queue instanceof EE_Messages_Queue) {
1103 1103
             EE_Error::add_error(
1104 1104
                 __(
1105 1105
                     'The messages were not generated. This could mean there is already a batch being generated on a separate request, or because the selected messages are not ready for generation. Please wait a minute or two and try again.',
@@ -1146,7 +1146,7 @@  discard block
 block discarded – undo
1146 1146
             $sent_queue = self::$_MSG_PROCESSOR->batch_send_from_queue($messages);
1147 1147
         }
1148 1148
 
1149
-        if (! $sent_queue instanceof EE_Messages_Queue) {
1149
+        if ( ! $sent_queue instanceof EE_Messages_Queue) {
1150 1150
             EE_Error::add_error(
1151 1151
                 __(
1152 1152
                     'The messages were not sent. This could mean there is already a batch being sent on a separate request, or because the selected messages are not sendable. Please wait a minute or two and try again.',
@@ -1334,7 +1334,7 @@  discard block
 block discarded – undo
1334 1334
                 $info['TXN_status'] = $transaction->status_ID();
1335 1335
                 $info['TXN_reg_steps'] = $transaction->reg_steps();
1336 1336
                 if ($transaction->ID()) {
1337
-                    $index = 'EE_Transaction: ' . $transaction->ID();
1337
+                    $index = 'EE_Transaction: '.$transaction->ID();
1338 1338
                     EEH_Debug_Tools::log($class, $func, $line, $info, $display_request, $index);
1339 1339
                 }
1340 1340
             }
Please login to merge, or discard this patch.
core/services/notices/NoticesContainerInterface.php 1 patch
Indentation   +81 added lines, -81 removed lines patch added patch discarded remove patch
@@ -16,129 +16,129 @@
 block discarded – undo
16 16
 interface NoticesContainerInterface
17 17
 {
18 18
 
19
-    /**
20
-     * @param string $notice
21
-     * @param bool   $dismissible
22
-     * @param string $file
23
-     * @param string $func
24
-     * @param string $line
25
-     */
26
-    public function addInformation($notice, $dismissible = true, $file = '', $func = '', $line = '');
19
+	/**
20
+	 * @param string $notice
21
+	 * @param bool   $dismissible
22
+	 * @param string $file
23
+	 * @param string $func
24
+	 * @param string $line
25
+	 */
26
+	public function addInformation($notice, $dismissible = true, $file = '', $func = '', $line = '');
27 27
 
28 28
 
29
-    /**
30
-     * @param string $notice
31
-     * @param bool   $dismissible
32
-     * @param string $file
33
-     * @param string $func
34
-     * @param string $line
35
-     * @return
36
-     */
37
-    public function addAttention($notice, $dismissible = true, $file = '', $func = '', $line = '');
29
+	/**
30
+	 * @param string $notice
31
+	 * @param bool   $dismissible
32
+	 * @param string $file
33
+	 * @param string $func
34
+	 * @param string $line
35
+	 * @return
36
+	 */
37
+	public function addAttention($notice, $dismissible = true, $file = '', $func = '', $line = '');
38 38
 
39 39
 
40 40
 
41
-    /**
42
-     * @param string $notice
43
-     * @param bool   $dismissible
44
-     * @param string $file
45
-     * @param string $func
46
-     * @param string $line
47
-     */
48
-    public function addError($notice, $dismissible = true, $file, $func, $line);
41
+	/**
42
+	 * @param string $notice
43
+	 * @param bool   $dismissible
44
+	 * @param string $file
45
+	 * @param string $func
46
+	 * @param string $line
47
+	 */
48
+	public function addError($notice, $dismissible = true, $file, $func, $line);
49 49
 
50 50
 
51 51
 
52
-    /**
53
-     * @param string $notice
54
-     * @param bool   $dismissible
55
-     * @param string $file
56
-     * @param string $func
57
-     * @param string $line
58
-     */
59
-    public function addSuccess($notice, $dismissible = true, $file = '', $func = '', $line = '');
52
+	/**
53
+	 * @param string $notice
54
+	 * @param bool   $dismissible
55
+	 * @param string $file
56
+	 * @param string $func
57
+	 * @param string $line
58
+	 */
59
+	public function addSuccess($notice, $dismissible = true, $file = '', $func = '', $line = '');
60 60
 
61 61
 
62 62
 
63
-    /**
64
-     * @return boolean
65
-     */
66
-    public function hasInformation();
63
+	/**
64
+	 * @return boolean
65
+	 */
66
+	public function hasInformation();
67 67
 
68 68
 
69 69
 
70
-    /**
71
-     * @return boolean
72
-     */
73
-    public function hasAttention();
70
+	/**
71
+	 * @return boolean
72
+	 */
73
+	public function hasAttention();
74 74
 
75 75
 
76 76
 
77
-    /**
78
-     * @return boolean
79
-     */
80
-    public function hasError();
77
+	/**
78
+	 * @return boolean
79
+	 */
80
+	public function hasError();
81 81
 
82 82
 
83 83
 
84
-    /**
85
-     * @return boolean
86
-     */
87
-    public function hasSuccess();
84
+	/**
85
+	 * @return boolean
86
+	 */
87
+	public function hasSuccess();
88 88
 
89 89
 
90 90
 
91
-    /**
92
-     * @return int
93
-     */
94
-    public function countInformation();
91
+	/**
92
+	 * @return int
93
+	 */
94
+	public function countInformation();
95 95
 
96 96
 
97 97
 
98
-    /**
99
-     * @return int
100
-     */
101
-    public function countAttention();
98
+	/**
99
+	 * @return int
100
+	 */
101
+	public function countAttention();
102 102
 
103 103
 
104 104
 
105
-    /**
106
-     * @return int
107
-     */
108
-    public function countError();
105
+	/**
106
+	 * @return int
107
+	 */
108
+	public function countError();
109 109
 
110 110
 
111 111
 
112
-    /**
113
-     * @return int
114
-     */
115
-    public function countSuccess();
112
+	/**
113
+	 * @return int
114
+	 */
115
+	public function countSuccess();
116 116
 
117 117
 
118 118
 
119
-    /**
120
-     * @return NoticeInterface[]
121
-     */
122
-    public function getInformation();
119
+	/**
120
+	 * @return NoticeInterface[]
121
+	 */
122
+	public function getInformation();
123 123
 
124 124
 
125 125
 
126
-    /**
127
-     * @return NoticeInterface[]
128
-     */
129
-    public function getAttention();
126
+	/**
127
+	 * @return NoticeInterface[]
128
+	 */
129
+	public function getAttention();
130 130
 
131 131
 
132 132
 
133
-    /**
134
-     * @return NoticeInterface[]
135
-     */
136
-    public function getError();
133
+	/**
134
+	 * @return NoticeInterface[]
135
+	 */
136
+	public function getError();
137 137
 
138 138
 
139 139
 
140
-    /**
141
-     * @return NoticeInterface[]
142
-     */
143
-    public function getSuccess();
140
+	/**
141
+	 * @return NoticeInterface[]
142
+	 */
143
+	public function getSuccess();
144 144
 }
Please login to merge, or discard this patch.
core/services/notices/ConvertNoticesToAdminNotices.php 2 patches
Spacing   +1 added lines, -1 removed lines patch added patch discarded remove patch
@@ -36,7 +36,7 @@
 block discarded – undo
36 36
             $error_string = esc_html__('The following errors occurred:', 'event_espresso');
37 37
             foreach ($notices->getError() as $notice) {
38 38
                 if ($this->getThrowExceptions()) {
39
-                    $error_string .= '<br />' . $notice->message();
39
+                    $error_string .= '<br />'.$notice->message();
40 40
                 } else {
41 41
                     new AdminNotice($notice);
42 42
                 }
Please login to merge, or discard this patch.
Indentation   +38 added lines, -38 removed lines patch added patch discarded remove patch
@@ -14,42 +14,42 @@
 block discarded – undo
14 14
 class ConvertNoticesToAdminNotices extends NoticeConverter
15 15
 {
16 16
 
17
-    /**
18
-     * Converts Notice objects into AdminNotice notifications
19
-     *
20
-     * @param NoticesContainerInterface $notices
21
-     * @throws DomainException
22
-     */
23
-    public function process(NoticesContainerInterface $notices)
24
-    {
25
-        if ($notices->hasAttention()) {
26
-            foreach ($notices->getAttention() as $notice) {
27
-                new AdminNotice($notice);
28
-            }
29
-        }
30
-        if ($notices->hasError()) {
31
-            $error_string = esc_html__('The following errors occurred:', 'event_espresso');
32
-            foreach ($notices->getError() as $notice) {
33
-                if ($this->getThrowExceptions()) {
34
-                    $error_string .= '<br />' . $notice->message();
35
-                } else {
36
-                    new AdminNotice($notice);
37
-                }
38
-            }
39
-            if ($this->getThrowExceptions()) {
40
-                throw new DomainException($error_string);
41
-            }
42
-        }
43
-        if ($notices->hasSuccess()) {
44
-            foreach ($notices->getSuccess() as $notice) {
45
-                new AdminNotice($notice);
46
-            }
47
-        }
48
-        if ($notices->hasInformation()) {
49
-            foreach ($notices->getInformation() as $notice) {
50
-                new AdminNotice($notice);
51
-            }
52
-        }
53
-        $this->clearNotices();
54
-    }
17
+	/**
18
+	 * Converts Notice objects into AdminNotice notifications
19
+	 *
20
+	 * @param NoticesContainerInterface $notices
21
+	 * @throws DomainException
22
+	 */
23
+	public function process(NoticesContainerInterface $notices)
24
+	{
25
+		if ($notices->hasAttention()) {
26
+			foreach ($notices->getAttention() as $notice) {
27
+				new AdminNotice($notice);
28
+			}
29
+		}
30
+		if ($notices->hasError()) {
31
+			$error_string = esc_html__('The following errors occurred:', 'event_espresso');
32
+			foreach ($notices->getError() as $notice) {
33
+				if ($this->getThrowExceptions()) {
34
+					$error_string .= '<br />' . $notice->message();
35
+				} else {
36
+					new AdminNotice($notice);
37
+				}
38
+			}
39
+			if ($this->getThrowExceptions()) {
40
+				throw new DomainException($error_string);
41
+			}
42
+		}
43
+		if ($notices->hasSuccess()) {
44
+			foreach ($notices->getSuccess() as $notice) {
45
+				new AdminNotice($notice);
46
+			}
47
+		}
48
+		if ($notices->hasInformation()) {
49
+			foreach ($notices->getInformation() as $notice) {
50
+				new AdminNotice($notice);
51
+			}
52
+		}
53
+		$this->clearNotices();
54
+	}
55 55
 }
Please login to merge, or discard this patch.