Completed
Branch FET/RegForm/main (59cfcf)
by
unknown
10:42 queued 51s
created
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   +763 added lines, -763 removed lines patch added patch discarded remove patch
@@ -24,767 +24,767 @@
 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 ($this->reg_status_updated($registration->ID())
207
-            && (
208
-                (! $this->request->isAdmin() || $this->request->isFrontAjax())
209
-                || EE_Registry::instance()->CAP->current_user_can(
210
-                    'ee_edit_registration',
211
-                    'toggle_registration_status',
212
-                    $registration->ID()
213
-                )
214
-            )
215
-        ) {
216
-            // change status to new value
217
-            $updated = $registration->set_status($this->new_reg_status($registration->ID()));
218
-            if ($updated && $save) {
219
-                $registration->save();
220
-            }
221
-            return true;
222
-        }
223
-        return false;
224
-    }
225
-
226
-
227
-    /**
228
-     *    toggle_incomplete_registration_status_to_default
229
-     *        changes any incomplete registrations to either the event or global default registration status
230
-     *
231
-     * @access public
232
-     * @param EE_Registration       $registration
233
-     * @param bool                  $save TRUE will save the registration if the status is updated, FALSE will leave
234
-     *                                    that up to client code
235
-     * @param ContextInterface|null $context
236
-     * @return void
237
-     * @throws EE_Error
238
-     * @throws InvalidArgumentException
239
-     * @throws ReflectionException
240
-     * @throws RuntimeException
241
-     * @throws EntityNotFoundException
242
-     * @throws InvalidDataTypeException
243
-     * @throws InvalidInterfaceException
244
-     */
245
-    public function toggle_incomplete_registration_status_to_default(
246
-        EE_Registration $registration,
247
-        $save = true,
248
-        ContextInterface $context = null
249
-    ) {
250
-        $existing_reg_status = $registration->status_ID();
251
-        // set initial REG_Status
252
-        $this->set_old_reg_status($registration->ID(), $existing_reg_status);
253
-        // is the registration currently incomplete ?
254
-        if ($registration->status_ID() === EEM_Registration::status_id_incomplete) {
255
-            // grab default reg status for the event, if set
256
-            $event_default_registration_status = $registration->event()->default_registration_status();
257
-            // if no default reg status is set for the event, then use the global value
258
-            $STS_ID = ! empty($event_default_registration_status)
259
-                ? $event_default_registration_status
260
-                : EE_Registry::instance()->CFG->registration->default_STS_ID;
261
-            // if the event default reg status is approved, then downgrade temporarily to payment pending to ensure that payments are triggered
262
-            $STS_ID = $STS_ID === EEM_Registration::status_id_approved ? EEM_Registration::status_id_pending_payment
263
-                : $STS_ID;
264
-            // set incoming REG_Status
265
-            $this->set_new_reg_status($registration->ID(), $STS_ID);
266
-            $registration->set_status($STS_ID, false, $context);
267
-            if ($save) {
268
-                $registration->save();
269
-            }
270
-            // don't trigger notifications during IPNs because they will get triggered by EE_Payment_Processor
271
-            if (! EE_Processor_Base::$IPN) {
272
-                // otherwise, send out notifications
273
-                add_filter('FHEE__EED_Messages___maybe_registration__deliver_notifications', '__return_true', 10);
274
-            }
275
-            // DEBUG LOG
276
-            // $this->log(
277
-            //     __CLASS__,
278
-            //     __FUNCTION__,
279
-            //     __LINE__,
280
-            //     $registration->transaction(),
281
-            //     array(
282
-            //         'IPN' => EE_Processor_Base::$IPN,
283
-            //         'deliver_notifications' => has_filter(
284
-            //             'FHEE__EED_Messages___maybe_registration__deliver_notifications'
285
-            //         ),
286
-            //     )
287
-            // );
288
-        }
289
-    }
290
-
291
-
292
-    /**
293
-     *    toggle_registration_status_for_default_approved_events
294
-     *
295
-     * @access public
296
-     * @param EE_Registration $registration
297
-     * @param bool            $save TRUE will save the registration if the status is updated, FALSE will leave that up
298
-     *                              to client code
299
-     * @return bool
300
-     * @throws EE_Error
301
-     * @throws EntityNotFoundException
302
-     * @throws InvalidArgumentException
303
-     * @throws InvalidDataTypeException
304
-     * @throws InvalidInterfaceException
305
-     * @throws ReflectionException
306
-     * @throws RuntimeException
307
-     */
308
-    public function toggle_registration_status_for_default_approved_events(EE_Registration $registration, $save = true)
309
-    {
310
-        $reg_status = $registration->status_ID();
311
-        // set initial REG_Status
312
-        $this->set_old_reg_status($registration->ID(), $reg_status);
313
-        // if not already, toggle reg status to approved IF the event default reg status is approved
314
-        // ( as long as the registration wasn't cancelled or declined at some point )
315
-        if ($reg_status !== EEM_Registration::status_id_cancelled
316
-            && $reg_status
317
-               !== EEM_Registration::status_id_declined
318
-            && $reg_status !== EEM_Registration::status_id_approved
319
-            && $registration->event()->default_registration_status() === EEM_Registration::status_id_approved
320
-        ) {
321
-            // set incoming REG_Status
322
-            $this->set_new_reg_status($registration->ID(), EEM_Registration::status_id_approved);
323
-            // toggle status to approved
324
-            $registration->set_status(EEM_Registration::status_id_approved);
325
-            if ($save) {
326
-                $registration->save();
327
-            }
328
-            // don't trigger notifications during IPNs because they will get triggered by EE_Payment_Processor
329
-            if (! EE_Processor_Base::$IPN) {
330
-                // otherwise, send out notifications
331
-                add_filter('FHEE__EED_Messages___maybe_registration__deliver_notifications', '__return_true', 10);
332
-            }
333
-            // DEBUG LOG
334
-            // $this->log(
335
-            //     __CLASS__,
336
-            //     __FUNCTION__,
337
-            //     __LINE__,
338
-            //     $registration->transaction(),
339
-            //     array(
340
-            //         'IPN' => EE_Processor_Base::$IPN,
341
-            //         'deliver_notifications' => has_filter(
342
-            //             'FHEE__EED_Messages___maybe_registration__deliver_notifications'
343
-            //         ),
344
-            //     )
345
-            // );
346
-            return true;
347
-        }
348
-        return false;
349
-    }
350
-
351
-
352
-    /**
353
-     *    toggle_registration_statuses_if_no_monies_owing
354
-     *
355
-     * @access public
356
-     * @param EE_Registration $registration
357
-     * @param bool            $save TRUE will save the registration if the status is updated, FALSE will leave that up
358
-     *                              to client code
359
-     * @param array           $additional_details
360
-     * @return bool
361
-     * @throws EE_Error
362
-     * @throws EntityNotFoundException
363
-     * @throws InvalidArgumentException
364
-     * @throws InvalidDataTypeException
365
-     * @throws InvalidInterfaceException
366
-     * @throws ReflectionException
367
-     * @throws RuntimeException
368
-     */
369
-    public function toggle_registration_status_if_no_monies_owing(
370
-        EE_Registration $registration,
371
-        $save = true,
372
-        array $additional_details = array()
373
-    ) {
374
-        // set initial REG_Status
375
-        $this->set_old_reg_status($registration->ID(), $registration->status_ID());
376
-        // was a payment just made ?
377
-        $payment = isset($additional_details['payment_updates'], $additional_details['last_payment'])
378
-                   && $additional_details['payment_updates']
379
-                   && $additional_details['last_payment'] instanceof EE_Payment
380
-            ? $additional_details['last_payment']
381
-            : null;
382
-        $total_paid = array_sum(self::$_amount_paid);
383
-        // toggle reg status to approved IF
384
-        if (// REG status is pending payment
385
-            $registration->status_ID() === EEM_Registration::status_id_pending_payment
386
-            // AND no monies are owing
387
-            && (
388
-                (
389
-                    $registration->transaction()->is_completed()
390
-                    || $registration->transaction()->is_overpaid()
391
-                    || $registration->transaction()->is_free()
392
-                    || apply_filters(
393
-                        'FHEE__EE_Registration_Processor__toggle_registration_status_if_no_monies_owing',
394
-                        false,
395
-                        $registration
396
-                    )
397
-                )
398
-                || (
399
-                    $payment instanceof EE_Payment && $payment->is_approved()
400
-                    && // this specific registration has not yet been paid for
401
-                    ! isset(self::$_amount_paid[ $registration->ID() ])
402
-                    && // payment amount, less what we have already attributed to other registrations, is greater than this reg's final price
403
-                    $payment->amount() - $total_paid >= $registration->final_price()
404
-                )
405
-            )
406
-        ) {
407
-            // mark as paid
408
-            self::$_amount_paid[ $registration->ID() ] = $registration->final_price();
409
-            // track new REG_Status
410
-            $this->set_new_reg_status($registration->ID(), EEM_Registration::status_id_approved);
411
-            // toggle status to approved
412
-            $registration->set_status(EEM_Registration::status_id_approved);
413
-            if ($save) {
414
-                $registration->save();
415
-            }
416
-            // don't trigger notifications during IPNs because they will get triggered by EE_Payment_Processor
417
-            if (! EE_Processor_Base::$IPN) {
418
-                // otherwise, send out notifications
419
-                add_filter('FHEE__EED_Messages___maybe_registration__deliver_notifications', '__return_true', 10);
420
-            }
421
-            // DEBUG LOG
422
-            // $this->log(
423
-            //     __CLASS__,
424
-            //     __FUNCTION__,
425
-            //     __LINE__,
426
-            //     $registration->transaction(),
427
-            //     array(
428
-            //         'IPN' => EE_Processor_Base::$IPN,
429
-            //         'deliver_notifications' => has_filter(
430
-            //             'FHEE__EED_Messages___maybe_registration__deliver_notifications'
431
-            //         ),
432
-            //     )
433
-            // );
434
-            return true;
435
-        }
436
-        return false;
437
-    }
438
-
439
-
440
-    /**
441
-     *    registration_status_changed
442
-     *
443
-     * @access public
444
-     * @param EE_Registration $registration
445
-     * @param array           $additional_details
446
-     * @return void
447
-     */
448
-    public function trigger_registration_update_notifications($registration, array $additional_details = array())
449
-    {
450
-        try {
451
-            if (! $registration instanceof EE_Registration) {
452
-                throw new EE_Error(
453
-                    esc_html__('An invalid registration was received.', 'event_espresso')
454
-                );
455
-            }
456
-            // EE_Registry::instance()->load_helper('Debug_Tools');
457
-            // EEH_Debug_Tools::log(
458
-            //     __CLASS__,
459
-            //     __FUNCTION__,
460
-            //     __LINE__,
461
-            //     array($registration->transaction(), $additional_details),
462
-            //     false,
463
-            //     'EE_Transaction: ' . $registration->transaction()->ID()
464
-            // );
465
-            if (! $registration->is_primary_registrant()) {
466
-                return;
467
-            }
468
-            do_action(
469
-                'AHEE__EE_Registration_Processor__trigger_registration_update_notifications',
470
-                $registration,
471
-                $additional_details
472
-            );
473
-        } catch (Exception $e) {
474
-            EE_Error::add_error($e->getMessage(), $e->getFile(), 'unknown_function_from_exception', $e->getLine());
475
-        }
476
-    }
477
-
478
-
479
-    /**
480
-     * sets reg status based either on passed param or on transaction status and event pre-approval setting
481
-     *
482
-     * @param EE_Registration $registration
483
-     * @param array           $additional_details
484
-     * @return bool
485
-     * @throws EE_Error
486
-     * @throws EntityNotFoundException
487
-     * @throws InvalidArgumentException
488
-     * @throws InvalidDataTypeException
489
-     * @throws InvalidInterfaceException
490
-     * @throws ReflectionException
491
-     * @throws RuntimeException
492
-     */
493
-    public function update_registration_after_checkout_or_payment(
494
-        EE_Registration $registration,
495
-        array $additional_details = array()
496
-    ) {
497
-        // set initial REG_Status
498
-        $this->set_old_reg_status($registration->ID(), $registration->status_ID());
499
-        // if the registration status gets updated, then save the registration
500
-        if ($this->toggle_registration_status_for_default_approved_events($registration, false)
501
-            || $this->toggle_registration_status_if_no_monies_owing(
502
-                $registration,
503
-                false,
504
-                $additional_details
505
-            )
506
-        ) {
507
-            $registration->save();
508
-        }
509
-        // set new  REG_Status
510
-        $this->set_new_reg_status($registration->ID(), $registration->status_ID());
511
-        return $this->reg_status_updated($registration->ID())
512
-               && $this->new_reg_status($registration->ID()) === EEM_Registration::status_id_approved;
513
-    }
514
-
515
-
516
-    /**
517
-     * Updates the registration' final prices based on the current line item tree (taking into account
518
-     * discounts, taxes, and other line items unrelated to tickets.)
519
-     *
520
-     * @param EE_Transaction $transaction
521
-     * @param boolean        $save_regs whether to immediately save registrations in this function or not
522
-     * @return void
523
-     * @throws EE_Error
524
-     * @throws InvalidArgumentException
525
-     * @throws InvalidDataTypeException
526
-     * @throws InvalidInterfaceException
527
-     * @throws RuntimeException
528
-     */
529
-    public function update_registration_final_prices($transaction, $save_regs = true)
530
-    {
531
-        $reg_final_price_per_ticket_line_item = EEH_Line_Item::calculate_reg_final_prices_per_line_item(
532
-            $transaction->total_line_item()
533
-        );
534
-        foreach ($transaction->registrations() as $registration) {
535
-            /** @var EE_Line_Item $line_item */
536
-            $line_item = EEM_Line_Item::instance()->get_line_item_for_registration($registration);
537
-            if (isset($reg_final_price_per_ticket_line_item[ $line_item->ID() ])) {
538
-                $registration->set_final_price($reg_final_price_per_ticket_line_item[ $line_item->ID() ]);
539
-                if ($save_regs) {
540
-                    $registration->save();
541
-                }
542
-            }
543
-        }
544
-        // and make sure there's no rounding problem
545
-        $this->fix_reg_final_price_rounding_issue($transaction);
546
-    }
547
-
548
-
549
-    /**
550
-     * Makes sure there is no rounding errors for the REG_final_prices.
551
-     * Eg, if we have 3 registrations for $1, and there is a $0.01 discount between the three of them,
552
-     * they will each be for $0.99333333, which gets rounded to $1 again.
553
-     * So the transaction total will be $2.99, but each registration will be for $1,
554
-     * so if each registrant paid individually they will have overpaid by $0.01.
555
-     * So in order to overcome this, we check for any difference, and if there is a difference
556
-     * we just grab one registrant at random and make them responsible for it.
557
-     * This should be used after setting REG_final_prices (it's done automatically as part of
558
-     * EE_Registration_Processor::update_registration_final_prices())
559
-     *
560
-     * @param EE_Transaction $transaction
561
-     * @return bool success verifying that there is NO difference after this method is done
562
-     * @throws EE_Error
563
-     * @throws InvalidArgumentException
564
-     * @throws InvalidDataTypeException
565
-     * @throws InvalidInterfaceException
566
-     */
567
-    public function fix_reg_final_price_rounding_issue($transaction)
568
-    {
569
-        $reg_final_price_sum = EEM_Registration::instance()->sum(
570
-            array(
571
-                array(
572
-                    'TXN_ID' => $transaction->ID(),
573
-                ),
574
-            ),
575
-            'REG_final_price'
576
-        );
577
-        $diff = $transaction->total() - $reg_final_price_sum;
578
-        // ok then, just grab one of the registrations
579
-        if ($diff !== 0) {
580
-            $a_reg = EEM_Registration::instance()->get_one(
581
-                array(
582
-                    array(
583
-                        'TXN_ID' => $transaction->ID(),
584
-                    ),
585
-                )
586
-            );
587
-            return $a_reg instanceof EE_Registration
588
-                ? (bool) $a_reg->save(array('REG_final_price' => $a_reg->final_price() + $diff))
589
-                : false;
590
-        }
591
-        return true;
592
-    }
593
-
594
-
595
-    /**
596
-     * update_registration_after_being_canceled_or_declined
597
-     *
598
-     * @param EE_Registration $registration
599
-     * @param array           $closed_reg_statuses
600
-     * @param bool            $update_reg
601
-     * @return bool
602
-     * @throws EE_Error
603
-     * @throws RuntimeException
604
-     */
605
-    public function update_registration_after_being_canceled_or_declined(
606
-        EE_Registration $registration,
607
-        array $closed_reg_statuses = array(),
608
-        $update_reg = true
609
-    ) {
610
-        // these reg statuses should not be considered in any calculations involving monies owing
611
-        $closed_reg_statuses = ! empty($closed_reg_statuses)
612
-            ? $closed_reg_statuses
613
-            : EEM_Registration::closed_reg_statuses();
614
-        if (! in_array($registration->status_ID(), $closed_reg_statuses, true)) {
615
-            return false;
616
-        }
617
-        // release a reserved ticket by decrementing ticket and datetime reserved values
618
-        $registration->release_reserved_ticket(true, 'RegProcessor:' . __LINE__);
619
-        $registration->set_final_price(0);
620
-        if ($update_reg) {
621
-            $registration->save();
622
-        }
623
-        return true;
624
-    }
625
-
626
-
627
-    /**
628
-     * update_canceled_or_declined_registration_after_being_reinstated
629
-     *
630
-     * @param EE_Registration $registration
631
-     * @param array           $closed_reg_statuses
632
-     * @param bool            $update_reg
633
-     * @return bool
634
-     * @throws EE_Error
635
-     * @throws RuntimeException
636
-     */
637
-    public function update_canceled_or_declined_registration_after_being_reinstated(
638
-        EE_Registration $registration,
639
-        array $closed_reg_statuses = array(),
640
-        $update_reg = true
641
-    ) {
642
-        // these reg statuses should not be considered in any calculations involving monies owing
643
-        $closed_reg_statuses = ! empty($closed_reg_statuses) ? $closed_reg_statuses
644
-            : EEM_Registration::closed_reg_statuses();
645
-        if (in_array($registration->status_ID(), $closed_reg_statuses, true)) {
646
-            return false;
647
-        }
648
-        $ticket = $registration->ticket();
649
-        if (! $ticket instanceof EE_Ticket) {
650
-            throw new EE_Error(
651
-                sprintf(
652
-                    esc_html__(
653
-                        'The Ticket for Registration %1$d was not found or is invalid.',
654
-                        'event_espresso'
655
-                    ),
656
-                    $registration->ticket_ID()
657
-                )
658
-            );
659
-        }
660
-        $registration->set_final_price($ticket->price());
661
-        if ($update_reg) {
662
-            $registration->save();
663
-        }
664
-        return true;
665
-    }
666
-
667
-
668
-    /**
669
-     * generate_ONE_registration_from_line_item
670
-     * Although a ticket line item may have a quantity greater than 1,
671
-     * this method will ONLY CREATE ONE REGISTRATION !!!
672
-     * Regardless of the ticket line item quantity.
673
-     * This means that any code calling this method is responsible for ensuring
674
-     * that the final registration count matches the ticket line item quantity.
675
-     * This was done to make it easier to match the number of registrations
676
-     * to the number of tickets in the cart, when the cart has been edited
677
-     * after SPCO has already been initialized. So if an additional ticket was added to the cart, you can simply pass
678
-     * the line item to this method to add a second ticket, and in this case, you would not want to add 2 tickets.
679
-     *
680
-     * @deprecated
681
-     * @since 4.9.1
682
-     * @param EE_Line_Item    $line_item
683
-     * @param \EE_Transaction $transaction
684
-     * @param int             $att_nmbr
685
-     * @param int             $total_ticket_count
686
-     * @return EE_Registration | null
687
-     * @throws \OutOfRangeException
688
-     * @throws \EventEspresso\core\exceptions\UnexpectedEntityException
689
-     * @throws \EE_Error
690
-     */
691
-    public function generate_ONE_registration_from_line_item(
692
-        EE_Line_Item $line_item,
693
-        EE_Transaction $transaction,
694
-        $att_nmbr = 1,
695
-        $total_ticket_count = 1
696
-    ) {
697
-        EE_Error::doing_it_wrong(
698
-            __CLASS__ . '::' . __FUNCTION__,
699
-            sprintf(
700
-                esc_html__('This method is deprecated. Please use "%s" instead', 'event_espresso'),
701
-                '\EventEspresso\core\domain\services\registration\CreateRegistrationService::create()'
702
-            ),
703
-            '4.9.1',
704
-            '5.0.0'
705
-        );
706
-        // grab the related ticket object for this line_item
707
-        $ticket = $line_item->ticket();
708
-        if (! $ticket instanceof EE_Ticket) {
709
-            EE_Error::add_error(
710
-                sprintf(
711
-                    esc_html__('Line item %s did not contain a valid ticket', 'event_espresso'),
712
-                    $line_item->ID()
713
-                ),
714
-                __FILE__,
715
-                __FUNCTION__,
716
-                __LINE__
717
-            );
718
-            return null;
719
-        }
720
-        $registration_service = new CreateRegistrationService();
721
-        // then generate a new registration from that
722
-        return $registration_service->create(
723
-            $ticket->get_related_event(),
724
-            $transaction,
725
-            $ticket,
726
-            $line_item,
727
-            $att_nmbr,
728
-            $total_ticket_count
729
-        );
730
-    }
731
-
732
-
733
-    /**
734
-     * generates reg_url_link
735
-     *
736
-     * @deprecated
737
-     * @since 4.9.1
738
-     * @param int                   $att_nmbr
739
-     * @param EE_Line_Item | string $item
740
-     * @return string
741
-     * @throws InvalidArgumentException
742
-     */
743
-    public function generate_reg_url_link($att_nmbr, $item)
744
-    {
745
-        EE_Error::doing_it_wrong(
746
-            __CLASS__ . '::' . __FUNCTION__,
747
-            sprintf(
748
-                esc_html__('This method is deprecated. Please use "%s" instead', 'event_espresso'),
749
-                'EventEspresso\core\domain\entities\RegUrlLink'
750
-            ),
751
-            '4.9.1',
752
-            '5.0.0'
753
-        );
754
-        return new RegUrlLink($att_nmbr, $item);
755
-    }
756
-
757
-
758
-    /**
759
-     * generates reg code
760
-     *
761
-     * @deprecated
762
-     * @since 4.9.1
763
-     * @param EE_Registration $registration
764
-     * @return string
765
-     * @throws EE_Error
766
-     * @throws EntityNotFoundException
767
-     * @throws InvalidArgumentException
768
-     */
769
-    public function generate_reg_code(EE_Registration $registration)
770
-    {
771
-        EE_Error::doing_it_wrong(
772
-            __CLASS__ . '::' . __FUNCTION__,
773
-            sprintf(
774
-                esc_html__('This method is deprecated. Please use "%s" instead', 'event_espresso'),
775
-                'EventEspresso\core\domain\entities\RegCode'
776
-            ),
777
-            '4.9.1',
778
-            '5.0.0'
779
-        );
780
-        return apply_filters(
781
-            'FHEE__EE_Registration_Processor___generate_reg_code__new_reg_code',
782
-            new RegCode(
783
-                RegUrlLink::fromRegistration($registration),
784
-                $registration->transaction(),
785
-                $registration->ticket()
786
-            ),
787
-            $registration
788
-        );
789
-    }
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 ($this->reg_status_updated($registration->ID())
207
+			&& (
208
+				(! $this->request->isAdmin() || $this->request->isFrontAjax())
209
+				|| EE_Registry::instance()->CAP->current_user_can(
210
+					'ee_edit_registration',
211
+					'toggle_registration_status',
212
+					$registration->ID()
213
+				)
214
+			)
215
+		) {
216
+			// change status to new value
217
+			$updated = $registration->set_status($this->new_reg_status($registration->ID()));
218
+			if ($updated && $save) {
219
+				$registration->save();
220
+			}
221
+			return true;
222
+		}
223
+		return false;
224
+	}
225
+
226
+
227
+	/**
228
+	 *    toggle_incomplete_registration_status_to_default
229
+	 *        changes any incomplete registrations to either the event or global default registration status
230
+	 *
231
+	 * @access public
232
+	 * @param EE_Registration       $registration
233
+	 * @param bool                  $save TRUE will save the registration if the status is updated, FALSE will leave
234
+	 *                                    that up to client code
235
+	 * @param ContextInterface|null $context
236
+	 * @return void
237
+	 * @throws EE_Error
238
+	 * @throws InvalidArgumentException
239
+	 * @throws ReflectionException
240
+	 * @throws RuntimeException
241
+	 * @throws EntityNotFoundException
242
+	 * @throws InvalidDataTypeException
243
+	 * @throws InvalidInterfaceException
244
+	 */
245
+	public function toggle_incomplete_registration_status_to_default(
246
+		EE_Registration $registration,
247
+		$save = true,
248
+		ContextInterface $context = null
249
+	) {
250
+		$existing_reg_status = $registration->status_ID();
251
+		// set initial REG_Status
252
+		$this->set_old_reg_status($registration->ID(), $existing_reg_status);
253
+		// is the registration currently incomplete ?
254
+		if ($registration->status_ID() === EEM_Registration::status_id_incomplete) {
255
+			// grab default reg status for the event, if set
256
+			$event_default_registration_status = $registration->event()->default_registration_status();
257
+			// if no default reg status is set for the event, then use the global value
258
+			$STS_ID = ! empty($event_default_registration_status)
259
+				? $event_default_registration_status
260
+				: EE_Registry::instance()->CFG->registration->default_STS_ID;
261
+			// if the event default reg status is approved, then downgrade temporarily to payment pending to ensure that payments are triggered
262
+			$STS_ID = $STS_ID === EEM_Registration::status_id_approved ? EEM_Registration::status_id_pending_payment
263
+				: $STS_ID;
264
+			// set incoming REG_Status
265
+			$this->set_new_reg_status($registration->ID(), $STS_ID);
266
+			$registration->set_status($STS_ID, false, $context);
267
+			if ($save) {
268
+				$registration->save();
269
+			}
270
+			// don't trigger notifications during IPNs because they will get triggered by EE_Payment_Processor
271
+			if (! EE_Processor_Base::$IPN) {
272
+				// otherwise, send out notifications
273
+				add_filter('FHEE__EED_Messages___maybe_registration__deliver_notifications', '__return_true', 10);
274
+			}
275
+			// DEBUG LOG
276
+			// $this->log(
277
+			//     __CLASS__,
278
+			//     __FUNCTION__,
279
+			//     __LINE__,
280
+			//     $registration->transaction(),
281
+			//     array(
282
+			//         'IPN' => EE_Processor_Base::$IPN,
283
+			//         'deliver_notifications' => has_filter(
284
+			//             'FHEE__EED_Messages___maybe_registration__deliver_notifications'
285
+			//         ),
286
+			//     )
287
+			// );
288
+		}
289
+	}
290
+
291
+
292
+	/**
293
+	 *    toggle_registration_status_for_default_approved_events
294
+	 *
295
+	 * @access public
296
+	 * @param EE_Registration $registration
297
+	 * @param bool            $save TRUE will save the registration if the status is updated, FALSE will leave that up
298
+	 *                              to client code
299
+	 * @return bool
300
+	 * @throws EE_Error
301
+	 * @throws EntityNotFoundException
302
+	 * @throws InvalidArgumentException
303
+	 * @throws InvalidDataTypeException
304
+	 * @throws InvalidInterfaceException
305
+	 * @throws ReflectionException
306
+	 * @throws RuntimeException
307
+	 */
308
+	public function toggle_registration_status_for_default_approved_events(EE_Registration $registration, $save = true)
309
+	{
310
+		$reg_status = $registration->status_ID();
311
+		// set initial REG_Status
312
+		$this->set_old_reg_status($registration->ID(), $reg_status);
313
+		// if not already, toggle reg status to approved IF the event default reg status is approved
314
+		// ( as long as the registration wasn't cancelled or declined at some point )
315
+		if ($reg_status !== EEM_Registration::status_id_cancelled
316
+			&& $reg_status
317
+			   !== EEM_Registration::status_id_declined
318
+			&& $reg_status !== EEM_Registration::status_id_approved
319
+			&& $registration->event()->default_registration_status() === EEM_Registration::status_id_approved
320
+		) {
321
+			// set incoming REG_Status
322
+			$this->set_new_reg_status($registration->ID(), EEM_Registration::status_id_approved);
323
+			// toggle status to approved
324
+			$registration->set_status(EEM_Registration::status_id_approved);
325
+			if ($save) {
326
+				$registration->save();
327
+			}
328
+			// don't trigger notifications during IPNs because they will get triggered by EE_Payment_Processor
329
+			if (! EE_Processor_Base::$IPN) {
330
+				// otherwise, send out notifications
331
+				add_filter('FHEE__EED_Messages___maybe_registration__deliver_notifications', '__return_true', 10);
332
+			}
333
+			// DEBUG LOG
334
+			// $this->log(
335
+			//     __CLASS__,
336
+			//     __FUNCTION__,
337
+			//     __LINE__,
338
+			//     $registration->transaction(),
339
+			//     array(
340
+			//         'IPN' => EE_Processor_Base::$IPN,
341
+			//         'deliver_notifications' => has_filter(
342
+			//             'FHEE__EED_Messages___maybe_registration__deliver_notifications'
343
+			//         ),
344
+			//     )
345
+			// );
346
+			return true;
347
+		}
348
+		return false;
349
+	}
350
+
351
+
352
+	/**
353
+	 *    toggle_registration_statuses_if_no_monies_owing
354
+	 *
355
+	 * @access public
356
+	 * @param EE_Registration $registration
357
+	 * @param bool            $save TRUE will save the registration if the status is updated, FALSE will leave that up
358
+	 *                              to client code
359
+	 * @param array           $additional_details
360
+	 * @return bool
361
+	 * @throws EE_Error
362
+	 * @throws EntityNotFoundException
363
+	 * @throws InvalidArgumentException
364
+	 * @throws InvalidDataTypeException
365
+	 * @throws InvalidInterfaceException
366
+	 * @throws ReflectionException
367
+	 * @throws RuntimeException
368
+	 */
369
+	public function toggle_registration_status_if_no_monies_owing(
370
+		EE_Registration $registration,
371
+		$save = true,
372
+		array $additional_details = array()
373
+	) {
374
+		// set initial REG_Status
375
+		$this->set_old_reg_status($registration->ID(), $registration->status_ID());
376
+		// was a payment just made ?
377
+		$payment = isset($additional_details['payment_updates'], $additional_details['last_payment'])
378
+				   && $additional_details['payment_updates']
379
+				   && $additional_details['last_payment'] instanceof EE_Payment
380
+			? $additional_details['last_payment']
381
+			: null;
382
+		$total_paid = array_sum(self::$_amount_paid);
383
+		// toggle reg status to approved IF
384
+		if (// REG status is pending payment
385
+			$registration->status_ID() === EEM_Registration::status_id_pending_payment
386
+			// AND no monies are owing
387
+			&& (
388
+				(
389
+					$registration->transaction()->is_completed()
390
+					|| $registration->transaction()->is_overpaid()
391
+					|| $registration->transaction()->is_free()
392
+					|| apply_filters(
393
+						'FHEE__EE_Registration_Processor__toggle_registration_status_if_no_monies_owing',
394
+						false,
395
+						$registration
396
+					)
397
+				)
398
+				|| (
399
+					$payment instanceof EE_Payment && $payment->is_approved()
400
+					&& // this specific registration has not yet been paid for
401
+					! isset(self::$_amount_paid[ $registration->ID() ])
402
+					&& // payment amount, less what we have already attributed to other registrations, is greater than this reg's final price
403
+					$payment->amount() - $total_paid >= $registration->final_price()
404
+				)
405
+			)
406
+		) {
407
+			// mark as paid
408
+			self::$_amount_paid[ $registration->ID() ] = $registration->final_price();
409
+			// track new REG_Status
410
+			$this->set_new_reg_status($registration->ID(), EEM_Registration::status_id_approved);
411
+			// toggle status to approved
412
+			$registration->set_status(EEM_Registration::status_id_approved);
413
+			if ($save) {
414
+				$registration->save();
415
+			}
416
+			// don't trigger notifications during IPNs because they will get triggered by EE_Payment_Processor
417
+			if (! EE_Processor_Base::$IPN) {
418
+				// otherwise, send out notifications
419
+				add_filter('FHEE__EED_Messages___maybe_registration__deliver_notifications', '__return_true', 10);
420
+			}
421
+			// DEBUG LOG
422
+			// $this->log(
423
+			//     __CLASS__,
424
+			//     __FUNCTION__,
425
+			//     __LINE__,
426
+			//     $registration->transaction(),
427
+			//     array(
428
+			//         'IPN' => EE_Processor_Base::$IPN,
429
+			//         'deliver_notifications' => has_filter(
430
+			//             'FHEE__EED_Messages___maybe_registration__deliver_notifications'
431
+			//         ),
432
+			//     )
433
+			// );
434
+			return true;
435
+		}
436
+		return false;
437
+	}
438
+
439
+
440
+	/**
441
+	 *    registration_status_changed
442
+	 *
443
+	 * @access public
444
+	 * @param EE_Registration $registration
445
+	 * @param array           $additional_details
446
+	 * @return void
447
+	 */
448
+	public function trigger_registration_update_notifications($registration, array $additional_details = array())
449
+	{
450
+		try {
451
+			if (! $registration instanceof EE_Registration) {
452
+				throw new EE_Error(
453
+					esc_html__('An invalid registration was received.', 'event_espresso')
454
+				);
455
+			}
456
+			// EE_Registry::instance()->load_helper('Debug_Tools');
457
+			// EEH_Debug_Tools::log(
458
+			//     __CLASS__,
459
+			//     __FUNCTION__,
460
+			//     __LINE__,
461
+			//     array($registration->transaction(), $additional_details),
462
+			//     false,
463
+			//     'EE_Transaction: ' . $registration->transaction()->ID()
464
+			// );
465
+			if (! $registration->is_primary_registrant()) {
466
+				return;
467
+			}
468
+			do_action(
469
+				'AHEE__EE_Registration_Processor__trigger_registration_update_notifications',
470
+				$registration,
471
+				$additional_details
472
+			);
473
+		} catch (Exception $e) {
474
+			EE_Error::add_error($e->getMessage(), $e->getFile(), 'unknown_function_from_exception', $e->getLine());
475
+		}
476
+	}
477
+
478
+
479
+	/**
480
+	 * sets reg status based either on passed param or on transaction status and event pre-approval setting
481
+	 *
482
+	 * @param EE_Registration $registration
483
+	 * @param array           $additional_details
484
+	 * @return bool
485
+	 * @throws EE_Error
486
+	 * @throws EntityNotFoundException
487
+	 * @throws InvalidArgumentException
488
+	 * @throws InvalidDataTypeException
489
+	 * @throws InvalidInterfaceException
490
+	 * @throws ReflectionException
491
+	 * @throws RuntimeException
492
+	 */
493
+	public function update_registration_after_checkout_or_payment(
494
+		EE_Registration $registration,
495
+		array $additional_details = array()
496
+	) {
497
+		// set initial REG_Status
498
+		$this->set_old_reg_status($registration->ID(), $registration->status_ID());
499
+		// if the registration status gets updated, then save the registration
500
+		if ($this->toggle_registration_status_for_default_approved_events($registration, false)
501
+			|| $this->toggle_registration_status_if_no_monies_owing(
502
+				$registration,
503
+				false,
504
+				$additional_details
505
+			)
506
+		) {
507
+			$registration->save();
508
+		}
509
+		// set new  REG_Status
510
+		$this->set_new_reg_status($registration->ID(), $registration->status_ID());
511
+		return $this->reg_status_updated($registration->ID())
512
+			   && $this->new_reg_status($registration->ID()) === EEM_Registration::status_id_approved;
513
+	}
514
+
515
+
516
+	/**
517
+	 * Updates the registration' final prices based on the current line item tree (taking into account
518
+	 * discounts, taxes, and other line items unrelated to tickets.)
519
+	 *
520
+	 * @param EE_Transaction $transaction
521
+	 * @param boolean        $save_regs whether to immediately save registrations in this function or not
522
+	 * @return void
523
+	 * @throws EE_Error
524
+	 * @throws InvalidArgumentException
525
+	 * @throws InvalidDataTypeException
526
+	 * @throws InvalidInterfaceException
527
+	 * @throws RuntimeException
528
+	 */
529
+	public function update_registration_final_prices($transaction, $save_regs = true)
530
+	{
531
+		$reg_final_price_per_ticket_line_item = EEH_Line_Item::calculate_reg_final_prices_per_line_item(
532
+			$transaction->total_line_item()
533
+		);
534
+		foreach ($transaction->registrations() as $registration) {
535
+			/** @var EE_Line_Item $line_item */
536
+			$line_item = EEM_Line_Item::instance()->get_line_item_for_registration($registration);
537
+			if (isset($reg_final_price_per_ticket_line_item[ $line_item->ID() ])) {
538
+				$registration->set_final_price($reg_final_price_per_ticket_line_item[ $line_item->ID() ]);
539
+				if ($save_regs) {
540
+					$registration->save();
541
+				}
542
+			}
543
+		}
544
+		// and make sure there's no rounding problem
545
+		$this->fix_reg_final_price_rounding_issue($transaction);
546
+	}
547
+
548
+
549
+	/**
550
+	 * Makes sure there is no rounding errors for the REG_final_prices.
551
+	 * Eg, if we have 3 registrations for $1, and there is a $0.01 discount between the three of them,
552
+	 * they will each be for $0.99333333, which gets rounded to $1 again.
553
+	 * So the transaction total will be $2.99, but each registration will be for $1,
554
+	 * so if each registrant paid individually they will have overpaid by $0.01.
555
+	 * So in order to overcome this, we check for any difference, and if there is a difference
556
+	 * we just grab one registrant at random and make them responsible for it.
557
+	 * This should be used after setting REG_final_prices (it's done automatically as part of
558
+	 * EE_Registration_Processor::update_registration_final_prices())
559
+	 *
560
+	 * @param EE_Transaction $transaction
561
+	 * @return bool success verifying that there is NO difference after this method is done
562
+	 * @throws EE_Error
563
+	 * @throws InvalidArgumentException
564
+	 * @throws InvalidDataTypeException
565
+	 * @throws InvalidInterfaceException
566
+	 */
567
+	public function fix_reg_final_price_rounding_issue($transaction)
568
+	{
569
+		$reg_final_price_sum = EEM_Registration::instance()->sum(
570
+			array(
571
+				array(
572
+					'TXN_ID' => $transaction->ID(),
573
+				),
574
+			),
575
+			'REG_final_price'
576
+		);
577
+		$diff = $transaction->total() - $reg_final_price_sum;
578
+		// ok then, just grab one of the registrations
579
+		if ($diff !== 0) {
580
+			$a_reg = EEM_Registration::instance()->get_one(
581
+				array(
582
+					array(
583
+						'TXN_ID' => $transaction->ID(),
584
+					),
585
+				)
586
+			);
587
+			return $a_reg instanceof EE_Registration
588
+				? (bool) $a_reg->save(array('REG_final_price' => $a_reg->final_price() + $diff))
589
+				: false;
590
+		}
591
+		return true;
592
+	}
593
+
594
+
595
+	/**
596
+	 * update_registration_after_being_canceled_or_declined
597
+	 *
598
+	 * @param EE_Registration $registration
599
+	 * @param array           $closed_reg_statuses
600
+	 * @param bool            $update_reg
601
+	 * @return bool
602
+	 * @throws EE_Error
603
+	 * @throws RuntimeException
604
+	 */
605
+	public function update_registration_after_being_canceled_or_declined(
606
+		EE_Registration $registration,
607
+		array $closed_reg_statuses = array(),
608
+		$update_reg = true
609
+	) {
610
+		// these reg statuses should not be considered in any calculations involving monies owing
611
+		$closed_reg_statuses = ! empty($closed_reg_statuses)
612
+			? $closed_reg_statuses
613
+			: EEM_Registration::closed_reg_statuses();
614
+		if (! in_array($registration->status_ID(), $closed_reg_statuses, true)) {
615
+			return false;
616
+		}
617
+		// release a reserved ticket by decrementing ticket and datetime reserved values
618
+		$registration->release_reserved_ticket(true, 'RegProcessor:' . __LINE__);
619
+		$registration->set_final_price(0);
620
+		if ($update_reg) {
621
+			$registration->save();
622
+		}
623
+		return true;
624
+	}
625
+
626
+
627
+	/**
628
+	 * update_canceled_or_declined_registration_after_being_reinstated
629
+	 *
630
+	 * @param EE_Registration $registration
631
+	 * @param array           $closed_reg_statuses
632
+	 * @param bool            $update_reg
633
+	 * @return bool
634
+	 * @throws EE_Error
635
+	 * @throws RuntimeException
636
+	 */
637
+	public function update_canceled_or_declined_registration_after_being_reinstated(
638
+		EE_Registration $registration,
639
+		array $closed_reg_statuses = array(),
640
+		$update_reg = true
641
+	) {
642
+		// these reg statuses should not be considered in any calculations involving monies owing
643
+		$closed_reg_statuses = ! empty($closed_reg_statuses) ? $closed_reg_statuses
644
+			: EEM_Registration::closed_reg_statuses();
645
+		if (in_array($registration->status_ID(), $closed_reg_statuses, true)) {
646
+			return false;
647
+		}
648
+		$ticket = $registration->ticket();
649
+		if (! $ticket instanceof EE_Ticket) {
650
+			throw new EE_Error(
651
+				sprintf(
652
+					esc_html__(
653
+						'The Ticket for Registration %1$d was not found or is invalid.',
654
+						'event_espresso'
655
+					),
656
+					$registration->ticket_ID()
657
+				)
658
+			);
659
+		}
660
+		$registration->set_final_price($ticket->price());
661
+		if ($update_reg) {
662
+			$registration->save();
663
+		}
664
+		return true;
665
+	}
666
+
667
+
668
+	/**
669
+	 * generate_ONE_registration_from_line_item
670
+	 * Although a ticket line item may have a quantity greater than 1,
671
+	 * this method will ONLY CREATE ONE REGISTRATION !!!
672
+	 * Regardless of the ticket line item quantity.
673
+	 * This means that any code calling this method is responsible for ensuring
674
+	 * that the final registration count matches the ticket line item quantity.
675
+	 * This was done to make it easier to match the number of registrations
676
+	 * to the number of tickets in the cart, when the cart has been edited
677
+	 * after SPCO has already been initialized. So if an additional ticket was added to the cart, you can simply pass
678
+	 * the line item to this method to add a second ticket, and in this case, you would not want to add 2 tickets.
679
+	 *
680
+	 * @deprecated
681
+	 * @since 4.9.1
682
+	 * @param EE_Line_Item    $line_item
683
+	 * @param \EE_Transaction $transaction
684
+	 * @param int             $att_nmbr
685
+	 * @param int             $total_ticket_count
686
+	 * @return EE_Registration | null
687
+	 * @throws \OutOfRangeException
688
+	 * @throws \EventEspresso\core\exceptions\UnexpectedEntityException
689
+	 * @throws \EE_Error
690
+	 */
691
+	public function generate_ONE_registration_from_line_item(
692
+		EE_Line_Item $line_item,
693
+		EE_Transaction $transaction,
694
+		$att_nmbr = 1,
695
+		$total_ticket_count = 1
696
+	) {
697
+		EE_Error::doing_it_wrong(
698
+			__CLASS__ . '::' . __FUNCTION__,
699
+			sprintf(
700
+				esc_html__('This method is deprecated. Please use "%s" instead', 'event_espresso'),
701
+				'\EventEspresso\core\domain\services\registration\CreateRegistrationService::create()'
702
+			),
703
+			'4.9.1',
704
+			'5.0.0'
705
+		);
706
+		// grab the related ticket object for this line_item
707
+		$ticket = $line_item->ticket();
708
+		if (! $ticket instanceof EE_Ticket) {
709
+			EE_Error::add_error(
710
+				sprintf(
711
+					esc_html__('Line item %s did not contain a valid ticket', 'event_espresso'),
712
+					$line_item->ID()
713
+				),
714
+				__FILE__,
715
+				__FUNCTION__,
716
+				__LINE__
717
+			);
718
+			return null;
719
+		}
720
+		$registration_service = new CreateRegistrationService();
721
+		// then generate a new registration from that
722
+		return $registration_service->create(
723
+			$ticket->get_related_event(),
724
+			$transaction,
725
+			$ticket,
726
+			$line_item,
727
+			$att_nmbr,
728
+			$total_ticket_count
729
+		);
730
+	}
731
+
732
+
733
+	/**
734
+	 * generates reg_url_link
735
+	 *
736
+	 * @deprecated
737
+	 * @since 4.9.1
738
+	 * @param int                   $att_nmbr
739
+	 * @param EE_Line_Item | string $item
740
+	 * @return string
741
+	 * @throws InvalidArgumentException
742
+	 */
743
+	public function generate_reg_url_link($att_nmbr, $item)
744
+	{
745
+		EE_Error::doing_it_wrong(
746
+			__CLASS__ . '::' . __FUNCTION__,
747
+			sprintf(
748
+				esc_html__('This method is deprecated. Please use "%s" instead', 'event_espresso'),
749
+				'EventEspresso\core\domain\entities\RegUrlLink'
750
+			),
751
+			'4.9.1',
752
+			'5.0.0'
753
+		);
754
+		return new RegUrlLink($att_nmbr, $item);
755
+	}
756
+
757
+
758
+	/**
759
+	 * generates reg code
760
+	 *
761
+	 * @deprecated
762
+	 * @since 4.9.1
763
+	 * @param EE_Registration $registration
764
+	 * @return string
765
+	 * @throws EE_Error
766
+	 * @throws EntityNotFoundException
767
+	 * @throws InvalidArgumentException
768
+	 */
769
+	public function generate_reg_code(EE_Registration $registration)
770
+	{
771
+		EE_Error::doing_it_wrong(
772
+			__CLASS__ . '::' . __FUNCTION__,
773
+			sprintf(
774
+				esc_html__('This method is deprecated. Please use "%s" instead', 'event_espresso'),
775
+				'EventEspresso\core\domain\entities\RegCode'
776
+			),
777
+			'4.9.1',
778
+			'5.0.0'
779
+		);
780
+		return apply_filters(
781
+			'FHEE__EE_Registration_Processor___generate_reg_code__new_reg_code',
782
+			new RegCode(
783
+				RegUrlLink::fromRegistration($registration),
784
+				$registration->transaction(),
785
+				$registration->ticket()
786
+			),
787
+			$registration
788
+		);
789
+	}
790 790
 }
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
 
@@ -205,7 +205,7 @@  discard block
 block discarded – undo
205 205
         // toggle reg status but only if it has changed and the user can do so
206 206
         if ($this->reg_status_updated($registration->ID())
207 207
             && (
208
-                (! $this->request->isAdmin() || $this->request->isFrontAjax())
208
+                ( ! $this->request->isAdmin() || $this->request->isFrontAjax())
209 209
                 || EE_Registry::instance()->CAP->current_user_can(
210 210
                     'ee_edit_registration',
211 211
                     'toggle_registration_status',
@@ -268,7 +268,7 @@  discard block
 block discarded – undo
268 268
                 $registration->save();
269 269
             }
270 270
             // don't trigger notifications during IPNs because they will get triggered by EE_Payment_Processor
271
-            if (! EE_Processor_Base::$IPN) {
271
+            if ( ! EE_Processor_Base::$IPN) {
272 272
                 // otherwise, send out notifications
273 273
                 add_filter('FHEE__EED_Messages___maybe_registration__deliver_notifications', '__return_true', 10);
274 274
             }
@@ -326,7 +326,7 @@  discard block
 block discarded – undo
326 326
                 $registration->save();
327 327
             }
328 328
             // don't trigger notifications during IPNs because they will get triggered by EE_Payment_Processor
329
-            if (! EE_Processor_Base::$IPN) {
329
+            if ( ! EE_Processor_Base::$IPN) {
330 330
                 // otherwise, send out notifications
331 331
                 add_filter('FHEE__EED_Messages___maybe_registration__deliver_notifications', '__return_true', 10);
332 332
             }
@@ -398,14 +398,14 @@  discard block
 block discarded – undo
398 398
                 || (
399 399
                     $payment instanceof EE_Payment && $payment->is_approved()
400 400
                     && // this specific registration has not yet been paid for
401
-                    ! isset(self::$_amount_paid[ $registration->ID() ])
401
+                    ! isset(self::$_amount_paid[$registration->ID()])
402 402
                     && // payment amount, less what we have already attributed to other registrations, is greater than this reg's final price
403 403
                     $payment->amount() - $total_paid >= $registration->final_price()
404 404
                 )
405 405
             )
406 406
         ) {
407 407
             // mark as paid
408
-            self::$_amount_paid[ $registration->ID() ] = $registration->final_price();
408
+            self::$_amount_paid[$registration->ID()] = $registration->final_price();
409 409
             // track new REG_Status
410 410
             $this->set_new_reg_status($registration->ID(), EEM_Registration::status_id_approved);
411 411
             // toggle status to approved
@@ -414,7 +414,7 @@  discard block
 block discarded – undo
414 414
                 $registration->save();
415 415
             }
416 416
             // don't trigger notifications during IPNs because they will get triggered by EE_Payment_Processor
417
-            if (! EE_Processor_Base::$IPN) {
417
+            if ( ! EE_Processor_Base::$IPN) {
418 418
                 // otherwise, send out notifications
419 419
                 add_filter('FHEE__EED_Messages___maybe_registration__deliver_notifications', '__return_true', 10);
420 420
             }
@@ -448,7 +448,7 @@  discard block
 block discarded – undo
448 448
     public function trigger_registration_update_notifications($registration, array $additional_details = array())
449 449
     {
450 450
         try {
451
-            if (! $registration instanceof EE_Registration) {
451
+            if ( ! $registration instanceof EE_Registration) {
452 452
                 throw new EE_Error(
453 453
                     esc_html__('An invalid registration was received.', 'event_espresso')
454 454
                 );
@@ -462,7 +462,7 @@  discard block
 block discarded – undo
462 462
             //     false,
463 463
             //     'EE_Transaction: ' . $registration->transaction()->ID()
464 464
             // );
465
-            if (! $registration->is_primary_registrant()) {
465
+            if ( ! $registration->is_primary_registrant()) {
466 466
                 return;
467 467
             }
468 468
             do_action(
@@ -534,8 +534,8 @@  discard block
 block discarded – undo
534 534
         foreach ($transaction->registrations() as $registration) {
535 535
             /** @var EE_Line_Item $line_item */
536 536
             $line_item = EEM_Line_Item::instance()->get_line_item_for_registration($registration);
537
-            if (isset($reg_final_price_per_ticket_line_item[ $line_item->ID() ])) {
538
-                $registration->set_final_price($reg_final_price_per_ticket_line_item[ $line_item->ID() ]);
537
+            if (isset($reg_final_price_per_ticket_line_item[$line_item->ID()])) {
538
+                $registration->set_final_price($reg_final_price_per_ticket_line_item[$line_item->ID()]);
539 539
                 if ($save_regs) {
540 540
                     $registration->save();
541 541
                 }
@@ -611,11 +611,11 @@  discard block
 block discarded – undo
611 611
         $closed_reg_statuses = ! empty($closed_reg_statuses)
612 612
             ? $closed_reg_statuses
613 613
             : EEM_Registration::closed_reg_statuses();
614
-        if (! in_array($registration->status_ID(), $closed_reg_statuses, true)) {
614
+        if ( ! in_array($registration->status_ID(), $closed_reg_statuses, true)) {
615 615
             return false;
616 616
         }
617 617
         // release a reserved ticket by decrementing ticket and datetime reserved values
618
-        $registration->release_reserved_ticket(true, 'RegProcessor:' . __LINE__);
618
+        $registration->release_reserved_ticket(true, 'RegProcessor:'.__LINE__);
619 619
         $registration->set_final_price(0);
620 620
         if ($update_reg) {
621 621
             $registration->save();
@@ -646,7 +646,7 @@  discard block
 block discarded – undo
646 646
             return false;
647 647
         }
648 648
         $ticket = $registration->ticket();
649
-        if (! $ticket instanceof EE_Ticket) {
649
+        if ( ! $ticket instanceof EE_Ticket) {
650 650
             throw new EE_Error(
651 651
                 sprintf(
652 652
                     esc_html__(
@@ -695,7 +695,7 @@  discard block
 block discarded – undo
695 695
         $total_ticket_count = 1
696 696
     ) {
697 697
         EE_Error::doing_it_wrong(
698
-            __CLASS__ . '::' . __FUNCTION__,
698
+            __CLASS__.'::'.__FUNCTION__,
699 699
             sprintf(
700 700
                 esc_html__('This method is deprecated. Please use "%s" instead', 'event_espresso'),
701 701
                 '\EventEspresso\core\domain\services\registration\CreateRegistrationService::create()'
@@ -705,7 +705,7 @@  discard block
 block discarded – undo
705 705
         );
706 706
         // grab the related ticket object for this line_item
707 707
         $ticket = $line_item->ticket();
708
-        if (! $ticket instanceof EE_Ticket) {
708
+        if ( ! $ticket instanceof EE_Ticket) {
709 709
             EE_Error::add_error(
710 710
                 sprintf(
711 711
                     esc_html__('Line item %s did not contain a valid ticket', 'event_espresso'),
@@ -743,7 +743,7 @@  discard block
 block discarded – undo
743 743
     public function generate_reg_url_link($att_nmbr, $item)
744 744
     {
745 745
         EE_Error::doing_it_wrong(
746
-            __CLASS__ . '::' . __FUNCTION__,
746
+            __CLASS__.'::'.__FUNCTION__,
747 747
             sprintf(
748 748
                 esc_html__('This method is deprecated. Please use "%s" instead', 'event_espresso'),
749 749
                 'EventEspresso\core\domain\entities\RegUrlLink'
@@ -769,7 +769,7 @@  discard block
 block discarded – undo
769 769
     public function generate_reg_code(EE_Registration $registration)
770 770
     {
771 771
         EE_Error::doing_it_wrong(
772
-            __CLASS__ . '::' . __FUNCTION__,
772
+            __CLASS__.'::'.__FUNCTION__,
773 773
             sprintf(
774 774
                 esc_html__('This method is deprecated. Please use "%s" instead', 'event_espresso'),
775 775
                 '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   +713 added lines, -713 removed lines patch added patch discarded remove patch
@@ -13,717 +13,717 @@
 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 (! isset($this->_req_data['page'])
208
-            || (isset($this->_req_data['page'])
209
-                && $this->_adminpage_obj->page_slug
210
-                   != $this->_req_data['page'])) {
211
-            return;
212
-        } //get out nothing more to be done here.
213
-        // allow for extends to modify properties
214
-        if (method_exists($this, '_extend_properties')) {
215
-            $this->_extend_properties();
216
-        }
217
-        $this->_set_page_object();
218
-        $this->_init_hooks();
219
-        $this->_load_custom_methods();
220
-        $this->_load_routed_hooks();
221
-        add_action('admin_enqueue_scripts', array($this, 'enqueue_scripts_styles'));
222
-        add_action('admin_enqueue_scripts', array($this, 'add_metaboxes'), 20);
223
-        add_action('admin_enqueue_scripts', array($this, 'remove_metaboxes'), 15);
224
-        $this->_ajax_hooks();
225
-    }
226
-
227
-
228
-    /**
229
-     * used by child classes to set the following properties:
230
-     * $_ajax_func (optional)
231
-     * $_init_func (optional)
232
-     * $_metaboxes (optional)
233
-     * $_scripts (optional)
234
-     * $_styles (optional)
235
-     * $_name (required)
236
-     * Also in this method will be registered any scripts or styles loaded on the targeted page (as indicated in the
237
-     * _scripts/_styles properties) Also children should place in this method any filters/actions that have to happen
238
-     * really early on page load (just after admin_init) if they want to have them registered for handling early.
239
-     *
240
-     * @access protected
241
-     * @abstract
242
-     * @return void
243
-     */
244
-    abstract protected function _set_hooks_properties();
245
-
246
-
247
-    /**
248
-     * The hooks for enqueue_scripts and enqueue_styles will be run in here.  Child classes need to define their
249
-     * scripts and styles in the relevant $_scripts and $_styles properties.  Child classes must have also already
250
-     * registered the scripts and styles using wp_register_script and wp_register_style functions.
251
-     *
252
-     * @access public
253
-     * @return void
254
-     */
255
-    public function enqueue_scripts_styles()
256
-    {
257
-        if (! empty($this->_scripts_styles)) {
258
-            // first let's do all the registrations
259
-            if (! isset($this->_scripts_styles['registers'])) {
260
-                $msg[] = __(
261
-                    'There is no "registers" index in the <code>$this->_scripts_styles</code> property.',
262
-                    'event_espresso'
263
-                );
264
-                $msg[] = sprintf(
265
-                    __(
266
-                        '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',
267
-                        'event_espresso'
268
-                    ),
269
-                    '<strong>' . $this->caller . '</strong>'
270
-                );
271
-                throw new EE_Error(implode('||', $msg));
272
-            }
273
-            foreach ($this->_scripts_styles['registers'] as $ref => $details) {
274
-                $defaults = array(
275
-                    'type'    => 'js',
276
-                    'url'     => '',
277
-                    'depends' => array(),
278
-                    'version' => EVENT_ESPRESSO_VERSION,
279
-                    'footer'  => true,
280
-                );
281
-                $details = wp_parse_args($details, $defaults);
282
-                extract($details);
283
-                // 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
284
-                $this->_scripts_styles['registers'][ $ref ]['type'] = $type;
285
-                // let's make sure we're not missing any REQUIRED parameters
286
-                if (empty($url)) {
287
-                    $msg[] = sprintf(
288
-                        __('Missing the url for the requested %s', 'event_espresso'),
289
-                        $type == 'js' ? 'script' : 'stylesheet'
290
-                    );
291
-                    $msg[] = sprintf(
292
-                        __(
293
-                            'Doublecheck your <code>$this->_scripts_styles</code> array in %s and make sure that there is a "url" set for the %s ref',
294
-                            'event_espresso'
295
-                        ),
296
-                        '<strong>' . $this->caller . '</strong>',
297
-                        $ref
298
-                    );
299
-                    throw new EE_Error(implode('||', $msg));
300
-                }
301
-                // made it here so let's do the appropriate registration
302
-                $type == 'js'
303
-                    ? wp_register_script($ref, $url, $depends, $version, $footer)
304
-                    : wp_register_style(
305
-                        $ref,
306
-                        $url,
307
-                        $depends,
308
-                        $version
309
-                    );
310
-            }
311
-            // k now lets do the enqueues
312
-            if (! isset($this->_scripts_styles['enqueues'])) {
313
-                return;
314
-            }  //not sure if we should throw an error here or not.
315
-
316
-            foreach ($this->_scripts_styles['enqueues'] as $ref => $routes) {
317
-                // make sure $routes is an array
318
-                $routes = (array) $routes;
319
-                if (in_array($this->_current_route, $routes)) {
320
-                    $this->_scripts_styles['registers'][ $ref ]['type'] == 'js' ? wp_enqueue_script($ref)
321
-                        : wp_enqueue_style($ref);
322
-                    // if we have a localization for the script let's do that too.
323
-                    if (isset($this->_scripts_styles['localize'][ $ref ])) {
324
-                        foreach ($this->_scripts_styles['localize'][ $ref ] as $object_name => $indexes) {
325
-                            wp_localize_script(
326
-                                $ref,
327
-                                $object_name,
328
-                                $this->_scripts_styles['localize'][ $ref ][ $object_name ]
329
-                            );
330
-                        }
331
-                    }
332
-                }
333
-            }
334
-            // let's do the deregisters
335
-            if (! isset($this->_scripts_styles['deregisters'])) {
336
-                return;
337
-            }
338
-            foreach ($this->_scripts_styles['deregisters'] as $ref => $details) {
339
-                $defaults = array(
340
-                    'type' => 'js',
341
-                );
342
-                $details = wp_parse_args($details, $defaults);
343
-                extract($details);
344
-                $type == 'js' ? wp_deregister_script($ref) : wp_deregister_style($ref);
345
-            }
346
-        }
347
-    }
348
-
349
-
350
-    /**
351
-     * just set the defaults for the hooks properties.
352
-     *
353
-     * @access private
354
-     * @return void
355
-     */
356
-    private function _set_defaults()
357
-    {
358
-        $this->_ajax_func = $this->_init_func = $this->_metaboxes = $this->_scripts = $this->_styles = $this->_wp_action_filters_priority = array();
359
-        $this->_current_route = $this->getCurrentRoute();
360
-        $this->caller = get_class($this);
361
-        $this->_extend = stripos($this->caller, 'Extend') ? true : false;
362
-    }
363
-
364
-
365
-    /**
366
-     * A helper for determining the current route.
367
-     * @return string
368
-     */
369
-    private function getCurrentRoute()
370
-    {
371
-        // list tables do something else with 'action' for bulk actions.
372
-        $action = ! empty($_REQUEST['action']) && $_REQUEST['action'] !== '-1' ? $_REQUEST['action'] : 'default';
373
-        // we set a 'route' variable in some cases where action is being used by something else.
374
-        $action = $action === 'default' && isset($_REQUEST['route']) ? $_REQUEST['route'] : $action;
375
-        return sanitize_key($action);
376
-    }
377
-
378
-
379
-    /**
380
-     * this sets the _page_object property
381
-     *
382
-     * @access protected
383
-     * @return void
384
-     */
385
-    protected function _set_page_object()
386
-    {
387
-        // first make sure $this->_name is set
388
-        if (empty($this->_name)) {
389
-            $msg[] = __('We can\'t load the page object', 'event_espresso');
390
-            $msg[] = sprintf(
391
-                __("This is because the %s child class has not set the '_name' property", 'event_espresso'),
392
-                $this->caller
393
-            );
394
-            throw new EE_Error(implode('||', $msg));
395
-        }
396
-        $ref = str_replace('_', ' ', $this->_name); // take the_message -> the message
397
-        $ref = str_replace(' ', '_', ucwords($ref)) . '_Admin_Page'; // take the message -> The_Message
398
-        // first default file (if exists)
399
-        $decaf_file = EE_ADMIN_PAGES . $this->_name . '/' . $ref . '.core.php';
400
-        if (is_readable($decaf_file)) {
401
-            require_once($decaf_file);
402
-        }
403
-        // now we have to do require for extended file (if needed)
404
-        if ($this->_extend) {
405
-            require_once(EE_CORE_CAF_ADMIN_EXTEND . $this->_name . '/Extend_' . $ref . '.core.php');
406
-        }
407
-        // if we've got an extended class we use that!
408
-        $ref = $this->_extend ? 'Extend_' . $ref : $ref;
409
-        // let's make sure the class exists
410
-        if (! class_exists($ref)) {
411
-            $msg[] = __('We can\'t load the page object', 'event_espresso');
412
-            $msg[] = sprintf(
413
-                __(
414
-                    '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',
415
-                    'event_espresso'
416
-                ),
417
-                $ref
418
-            );
419
-            throw new EE_Error(implode('||', $msg));
420
-        }
421
-        $a = new ReflectionClass($ref);
422
-        $this->_page_object = $a->newInstance(false);
423
-    }
424
-
425
-
426
-    /**
427
-     * Child "hook" classes can declare any methods that they want executed when a specific page route is loaded.  The
428
-     * advantage of this is when doing things like running our own db interactions on saves etc.  Remember that
429
-     * $this->_req_data (all the _POST and _GET data) is available to your methods.
430
-     *
431
-     * @access private
432
-     * @return void
433
-     */
434
-    private function _load_custom_methods()
435
-    {
436
-        /**
437
-         * method cannot be named 'default' (@see http://us3.php
438
-         * .net/manual/en/reserved.keywords.php) so need to
439
-         * handle routes that are "default"
440
-         *
441
-         * @since 4.3.0
442
-         */
443
-        $method_callback = $this->_current_route == 'default' ? 'default_callback' : $this->_current_route;
444
-        // these run before the Admin_Page route executes.
445
-        if (method_exists($this, $method_callback)) {
446
-            call_user_func(array($this, $method_callback));
447
-        }
448
-        // 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.
449
-        // first the actions
450
-        // note that these action hooks will have the $query_args value available.
451
-        $admin_class_name = get_class($this->_adminpage_obj);
452
-        if (method_exists($this, '_redirect_action_early_' . $this->_current_route)) {
453
-            add_action(
454
-                'AHEE__'
455
-                . $admin_class_name
456
-                . '___redirect_after_action__before_redirect_modification_'
457
-                . $this->_current_route,
458
-                array($this, '_redirect_action_early_' . $this->_current_route),
459
-                10
460
-            );
461
-        }
462
-        if (method_exists($this, '_redirect_action_' . $this->_current_route)) {
463
-            add_action(
464
-                'AHEE_redirect_' . $admin_class_name . $this->_current_route,
465
-                array($this, '_redirect_action_' . $this->_current_route),
466
-                10
467
-            );
468
-        }
469
-        // 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.
470
-        if (method_exists($this, '_redirect_filter_' . $this->_current_route)) {
471
-            add_filter(
472
-                'FHEE_redirect_' . $admin_class_name . $this->_current_route,
473
-                array($this, '_redirect_filter_' . $this->_current_route),
474
-                10,
475
-                2
476
-            );
477
-        }
478
-    }
479
-
480
-
481
-    /**
482
-     * This method will search for a corresponding method with a name matching the route and the wp_hook to run.  This
483
-     * allows child hook classes to target hooking into a specific wp action or filter hook ONLY on a certain route.
484
-     * just remember, methods MUST be public Future hooks should be added in here to be access by child classes.
485
-     *
486
-     * @return void
487
-     */
488
-    private function _load_routed_hooks()
489
-    {
490
-
491
-        // 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.
492
-        $hook_filter_array = array(
493
-            'admin_footer'                                                                            => array(
494
-                'type'     => 'action',
495
-                'argnum'   => 1,
496
-                'priority' => 10,
497
-            ),
498
-            'FHEE_list_table_views_' . $this->_adminpage_obj->page_slug . '_' . $this->_current_route => array(
499
-                'type'     => 'filter',
500
-                'argnum'   => 1,
501
-                'priority' => 10,
502
-            ),
503
-            'FHEE_list_table_views_' . $this->_adminpage_obj->page_slug                               => array(
504
-                'type'     => 'filter',
505
-                'argnum'   => 1,
506
-                'priority' => 10,
507
-            ),
508
-            'FHEE_list_table_views'                                                                   => array(
509
-                'type'     => 'filter',
510
-                'argnum'   => 1,
511
-                'priority' => 10,
512
-            ),
513
-            'AHEE__EE_Admin_Page___display_admin_page__modify_metaboxes'                              => array(
514
-                'type'     => 'action',
515
-                'argnum'   => 1,
516
-                'priority' => 10,
517
-            ),
518
-        );
519
-        foreach ($hook_filter_array as $hook => $args) {
520
-            if (method_exists($this, $this->_current_route . '_' . $hook)) {
521
-                if (isset($this->_wp_action_filters_priority[ $hook ])) {
522
-                    $args['priority'] = $this->_wp_action_filters_priority[ $hook ];
523
-                }
524
-                if ($args['type'] == 'action') {
525
-                    add_action(
526
-                        $hook,
527
-                        array($this, $this->_current_route . '_' . $hook),
528
-                        $args['priority'],
529
-                        $args['argnum']
530
-                    );
531
-                } else {
532
-                    add_filter(
533
-                        $hook,
534
-                        array($this, $this->_current_route . '_' . $hook),
535
-                        $args['priority'],
536
-                        $args['argnum']
537
-                    );
538
-                }
539
-            }
540
-        }
541
-    }
542
-
543
-
544
-    /**
545
-     * Loop throught the $_ajax_func array and add_actions for the array.
546
-     *
547
-     * @return void
548
-     */
549
-    private function _ajax_hooks()
550
-    {
551
-        if (empty($this->_ajax_func)) {
552
-            return;
553
-        } //get out there's nothing to take care of.
554
-        foreach ($this->_ajax_func as $action => $method) {
555
-            // make sure method exists
556
-            if (! method_exists($this, $method)) {
557
-                $msg[] = __(
558
-                    'There is no corresponding method for the hook labeled in the _ajax_func array',
559
-                    'event_espresso'
560
-                ) . '<br />';
561
-                $msg[] = sprintf(
562
-                    __(
563
-                        'The method name given in the array is %s, check the spelling and make sure it exists in the %s class',
564
-                        'event_espresso'
565
-                    ),
566
-                    $method,
567
-                    $this->caller
568
-                );
569
-                throw new EE_Error(implode('||', $msg));
570
-            }
571
-            add_action('wp_ajax_' . $action, array($this, $method));
572
-        }
573
-    }
574
-
575
-
576
-    /**
577
-     * Loop throught the $_init_func array and add_actions for the array.
578
-     *
579
-     * @return void
580
-     */
581
-    protected function _init_hooks()
582
-    {
583
-        if (empty($this->_init_func)) {
584
-            return;
585
-        } //get out there's nothing to take care of.
586
-        // We need to determine what page_route we are on!
587
-        $current_route = isset($_REQUEST['action']) ? $_REQUEST['action'] : 'default';
588
-        foreach ($this->_init_func as $route => $method) {
589
-            // make sure method exists
590
-            if (! method_exists($this, $method)) {
591
-                $msg[] = __(
592
-                    'There is no corresponding method for the hook labeled in the _init_func array',
593
-                    'event_espresso'
594
-                ) . '<br />';
595
-                $msg[] = sprintf(
596
-                    __(
597
-                        'The method name given in the array is %s, check the spelling and make sure it exists in the %s class',
598
-                        'event_espresso'
599
-                    ),
600
-                    $method,
601
-                    $this->caller
602
-                );
603
-                throw new EE_Error(implode('||', $msg));
604
-            }
605
-            if ($route == $this->_current_route) {
606
-                add_action('admin_init', array($this, $method));
607
-            }
608
-        }
609
-    }
610
-
611
-
612
-    /**
613
-     * Loop through the _metaboxes property and add_metaboxes accordingly
614
-     * //todo we could eventually make this a config component class (i.e. new EE_Metabox);
615
-     *
616
-     * @access public
617
-     * @return void
618
-     */
619
-    public function add_metaboxes()
620
-    {
621
-        if (empty($this->_metaboxes)) {
622
-            return;
623
-        } //get out we don't have any metaboxes to set for this connection
624
-        $this->_handle_metabox_array($this->_metaboxes);
625
-    }
626
-
627
-
628
-    private function _handle_metabox_array($boxes, $add = true)
629
-    {
630
-        foreach ($boxes as $box) {
631
-            if (! isset($box['page_route'])) {
632
-                continue;
633
-            } //we dont' have a valid array
634
-            // let's make sure $box['page_route'] is an array so the "foreach" will work.
635
-            $box['page_route'] = (array) $box['page_route'];
636
-            foreach ($box['page_route'] as $route) {
637
-                if ($route != $this->_current_route) {
638
-                    continue;
639
-                } //get out we only add metaboxes for set route.
640
-                if ($add) {
641
-                    $this->_add_metabox($box);
642
-                } else {
643
-                    $this->_remove_metabox($box);
644
-                }
645
-            }
646
-        }
647
-    }
648
-
649
-
650
-    /**
651
-     * Loop through the _remove_metaboxes property and remove metaboxes accordingly.
652
-     *
653
-     * @access public
654
-     * @return void
655
-     */
656
-    public function remove_metaboxes()
657
-    {
658
-        if (empty($this->_remove_metaboxes)) {
659
-            return;
660
-        } //get out there are no metaboxes to remove
661
-        $this->_handle_metabox_array($this->_remove_metaboxes, false);
662
-    }
663
-
664
-
665
-    /**
666
-     * This just handles adding a metabox
667
-     *
668
-     * @access private
669
-     * @param array $args an array of args that have been set for this metabox by the child class
670
-     */
671
-    private function _add_metabox($args)
672
-    {
673
-        $current_screen = get_current_screen();
674
-        $screen_id = is_object($current_screen) ? $current_screen->id : null;
675
-        $func = isset($args['func']) ? $args['func'] : 'some_invalid_callback';
676
-        // set defaults
677
-        $defaults = array(
678
-            'func'          => $func,
679
-            'id'            => $this->caller . '_' . $func . '_metabox',
680
-            'priority'      => 'default',
681
-            'label'         => $this->caller,
682
-            'context'       => 'advanced',
683
-            'callback_args' => array(),
684
-            'page'          => isset($args['page']) ? $args['page'] : $screen_id,
685
-        );
686
-        $args = wp_parse_args($args, $defaults);
687
-        extract($args);
688
-        // make sure method exists
689
-        if (! method_exists($this, $func)) {
690
-            $msg[] = __('There is no corresponding method to display the metabox content', 'event_espresso') . '<br />';
691
-            $msg[] = sprintf(
692
-                __(
693
-                    'The method name given in the array is %s, check the spelling and make sure it exists in the %s class',
694
-                    'event_espresso'
695
-                ),
696
-                $func,
697
-                $this->caller
698
-            );
699
-            throw new EE_Error(implode('||', $msg));
700
-        }
701
-        // everything checks out so lets add the metabox
702
-        add_meta_box($id, $label, array($this, $func), $page, $context, $priority, $callback_args);
703
-    }
704
-
705
-
706
-    private function _remove_metabox($args)
707
-    {
708
-        $current_screen = get_current_screen();
709
-        $screen_id = is_object($current_screen) ? $current_screen->id : null;
710
-        $func = isset($args['func']) ? $args['func'] : 'some_invalid_callback';
711
-        // set defaults
712
-        $defaults = array(
713
-            'id'      => isset($args['id'])
714
-                ? $args['id']
715
-                : $this->_current_route
716
-                  . '_'
717
-                  . $this->caller
718
-                  . '_'
719
-                  . $func
720
-                  . '_metabox',
721
-            'context' => 'default',
722
-            'screen'  => isset($args['screen']) ? $args['screen'] : $screen_id,
723
-        );
724
-        $args = wp_parse_args($args, $defaults);
725
-        extract($args);
726
-        // everything checks out so lets remove the box!
727
-        remove_meta_box($id, $screen, $context);
728
-    }
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 (! isset($this->_req_data['page'])
208
+			|| (isset($this->_req_data['page'])
209
+				&& $this->_adminpage_obj->page_slug
210
+				   != $this->_req_data['page'])) {
211
+			return;
212
+		} //get out nothing more to be done here.
213
+		// allow for extends to modify properties
214
+		if (method_exists($this, '_extend_properties')) {
215
+			$this->_extend_properties();
216
+		}
217
+		$this->_set_page_object();
218
+		$this->_init_hooks();
219
+		$this->_load_custom_methods();
220
+		$this->_load_routed_hooks();
221
+		add_action('admin_enqueue_scripts', array($this, 'enqueue_scripts_styles'));
222
+		add_action('admin_enqueue_scripts', array($this, 'add_metaboxes'), 20);
223
+		add_action('admin_enqueue_scripts', array($this, 'remove_metaboxes'), 15);
224
+		$this->_ajax_hooks();
225
+	}
226
+
227
+
228
+	/**
229
+	 * used by child classes to set the following properties:
230
+	 * $_ajax_func (optional)
231
+	 * $_init_func (optional)
232
+	 * $_metaboxes (optional)
233
+	 * $_scripts (optional)
234
+	 * $_styles (optional)
235
+	 * $_name (required)
236
+	 * Also in this method will be registered any scripts or styles loaded on the targeted page (as indicated in the
237
+	 * _scripts/_styles properties) Also children should place in this method any filters/actions that have to happen
238
+	 * really early on page load (just after admin_init) if they want to have them registered for handling early.
239
+	 *
240
+	 * @access protected
241
+	 * @abstract
242
+	 * @return void
243
+	 */
244
+	abstract protected function _set_hooks_properties();
245
+
246
+
247
+	/**
248
+	 * The hooks for enqueue_scripts and enqueue_styles will be run in here.  Child classes need to define their
249
+	 * scripts and styles in the relevant $_scripts and $_styles properties.  Child classes must have also already
250
+	 * registered the scripts and styles using wp_register_script and wp_register_style functions.
251
+	 *
252
+	 * @access public
253
+	 * @return void
254
+	 */
255
+	public function enqueue_scripts_styles()
256
+	{
257
+		if (! empty($this->_scripts_styles)) {
258
+			// first let's do all the registrations
259
+			if (! isset($this->_scripts_styles['registers'])) {
260
+				$msg[] = __(
261
+					'There is no "registers" index in the <code>$this->_scripts_styles</code> property.',
262
+					'event_espresso'
263
+				);
264
+				$msg[] = sprintf(
265
+					__(
266
+						'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',
267
+						'event_espresso'
268
+					),
269
+					'<strong>' . $this->caller . '</strong>'
270
+				);
271
+				throw new EE_Error(implode('||', $msg));
272
+			}
273
+			foreach ($this->_scripts_styles['registers'] as $ref => $details) {
274
+				$defaults = array(
275
+					'type'    => 'js',
276
+					'url'     => '',
277
+					'depends' => array(),
278
+					'version' => EVENT_ESPRESSO_VERSION,
279
+					'footer'  => true,
280
+				);
281
+				$details = wp_parse_args($details, $defaults);
282
+				extract($details);
283
+				// 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
284
+				$this->_scripts_styles['registers'][ $ref ]['type'] = $type;
285
+				// let's make sure we're not missing any REQUIRED parameters
286
+				if (empty($url)) {
287
+					$msg[] = sprintf(
288
+						__('Missing the url for the requested %s', 'event_espresso'),
289
+						$type == 'js' ? 'script' : 'stylesheet'
290
+					);
291
+					$msg[] = sprintf(
292
+						__(
293
+							'Doublecheck your <code>$this->_scripts_styles</code> array in %s and make sure that there is a "url" set for the %s ref',
294
+							'event_espresso'
295
+						),
296
+						'<strong>' . $this->caller . '</strong>',
297
+						$ref
298
+					);
299
+					throw new EE_Error(implode('||', $msg));
300
+				}
301
+				// made it here so let's do the appropriate registration
302
+				$type == 'js'
303
+					? wp_register_script($ref, $url, $depends, $version, $footer)
304
+					: wp_register_style(
305
+						$ref,
306
+						$url,
307
+						$depends,
308
+						$version
309
+					);
310
+			}
311
+			// k now lets do the enqueues
312
+			if (! isset($this->_scripts_styles['enqueues'])) {
313
+				return;
314
+			}  //not sure if we should throw an error here or not.
315
+
316
+			foreach ($this->_scripts_styles['enqueues'] as $ref => $routes) {
317
+				// make sure $routes is an array
318
+				$routes = (array) $routes;
319
+				if (in_array($this->_current_route, $routes)) {
320
+					$this->_scripts_styles['registers'][ $ref ]['type'] == 'js' ? wp_enqueue_script($ref)
321
+						: wp_enqueue_style($ref);
322
+					// if we have a localization for the script let's do that too.
323
+					if (isset($this->_scripts_styles['localize'][ $ref ])) {
324
+						foreach ($this->_scripts_styles['localize'][ $ref ] as $object_name => $indexes) {
325
+							wp_localize_script(
326
+								$ref,
327
+								$object_name,
328
+								$this->_scripts_styles['localize'][ $ref ][ $object_name ]
329
+							);
330
+						}
331
+					}
332
+				}
333
+			}
334
+			// let's do the deregisters
335
+			if (! isset($this->_scripts_styles['deregisters'])) {
336
+				return;
337
+			}
338
+			foreach ($this->_scripts_styles['deregisters'] as $ref => $details) {
339
+				$defaults = array(
340
+					'type' => 'js',
341
+				);
342
+				$details = wp_parse_args($details, $defaults);
343
+				extract($details);
344
+				$type == 'js' ? wp_deregister_script($ref) : wp_deregister_style($ref);
345
+			}
346
+		}
347
+	}
348
+
349
+
350
+	/**
351
+	 * just set the defaults for the hooks properties.
352
+	 *
353
+	 * @access private
354
+	 * @return void
355
+	 */
356
+	private function _set_defaults()
357
+	{
358
+		$this->_ajax_func = $this->_init_func = $this->_metaboxes = $this->_scripts = $this->_styles = $this->_wp_action_filters_priority = array();
359
+		$this->_current_route = $this->getCurrentRoute();
360
+		$this->caller = get_class($this);
361
+		$this->_extend = stripos($this->caller, 'Extend') ? true : false;
362
+	}
363
+
364
+
365
+	/**
366
+	 * A helper for determining the current route.
367
+	 * @return string
368
+	 */
369
+	private function getCurrentRoute()
370
+	{
371
+		// list tables do something else with 'action' for bulk actions.
372
+		$action = ! empty($_REQUEST['action']) && $_REQUEST['action'] !== '-1' ? $_REQUEST['action'] : 'default';
373
+		// we set a 'route' variable in some cases where action is being used by something else.
374
+		$action = $action === 'default' && isset($_REQUEST['route']) ? $_REQUEST['route'] : $action;
375
+		return sanitize_key($action);
376
+	}
377
+
378
+
379
+	/**
380
+	 * this sets the _page_object property
381
+	 *
382
+	 * @access protected
383
+	 * @return void
384
+	 */
385
+	protected function _set_page_object()
386
+	{
387
+		// first make sure $this->_name is set
388
+		if (empty($this->_name)) {
389
+			$msg[] = __('We can\'t load the page object', 'event_espresso');
390
+			$msg[] = sprintf(
391
+				__("This is because the %s child class has not set the '_name' property", 'event_espresso'),
392
+				$this->caller
393
+			);
394
+			throw new EE_Error(implode('||', $msg));
395
+		}
396
+		$ref = str_replace('_', ' ', $this->_name); // take the_message -> the message
397
+		$ref = str_replace(' ', '_', ucwords($ref)) . '_Admin_Page'; // take the message -> The_Message
398
+		// first default file (if exists)
399
+		$decaf_file = EE_ADMIN_PAGES . $this->_name . '/' . $ref . '.core.php';
400
+		if (is_readable($decaf_file)) {
401
+			require_once($decaf_file);
402
+		}
403
+		// now we have to do require for extended file (if needed)
404
+		if ($this->_extend) {
405
+			require_once(EE_CORE_CAF_ADMIN_EXTEND . $this->_name . '/Extend_' . $ref . '.core.php');
406
+		}
407
+		// if we've got an extended class we use that!
408
+		$ref = $this->_extend ? 'Extend_' . $ref : $ref;
409
+		// let's make sure the class exists
410
+		if (! class_exists($ref)) {
411
+			$msg[] = __('We can\'t load the page object', 'event_espresso');
412
+			$msg[] = sprintf(
413
+				__(
414
+					'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',
415
+					'event_espresso'
416
+				),
417
+				$ref
418
+			);
419
+			throw new EE_Error(implode('||', $msg));
420
+		}
421
+		$a = new ReflectionClass($ref);
422
+		$this->_page_object = $a->newInstance(false);
423
+	}
424
+
425
+
426
+	/**
427
+	 * Child "hook" classes can declare any methods that they want executed when a specific page route is loaded.  The
428
+	 * advantage of this is when doing things like running our own db interactions on saves etc.  Remember that
429
+	 * $this->_req_data (all the _POST and _GET data) is available to your methods.
430
+	 *
431
+	 * @access private
432
+	 * @return void
433
+	 */
434
+	private function _load_custom_methods()
435
+	{
436
+		/**
437
+		 * method cannot be named 'default' (@see http://us3.php
438
+		 * .net/manual/en/reserved.keywords.php) so need to
439
+		 * handle routes that are "default"
440
+		 *
441
+		 * @since 4.3.0
442
+		 */
443
+		$method_callback = $this->_current_route == 'default' ? 'default_callback' : $this->_current_route;
444
+		// these run before the Admin_Page route executes.
445
+		if (method_exists($this, $method_callback)) {
446
+			call_user_func(array($this, $method_callback));
447
+		}
448
+		// 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.
449
+		// first the actions
450
+		// note that these action hooks will have the $query_args value available.
451
+		$admin_class_name = get_class($this->_adminpage_obj);
452
+		if (method_exists($this, '_redirect_action_early_' . $this->_current_route)) {
453
+			add_action(
454
+				'AHEE__'
455
+				. $admin_class_name
456
+				. '___redirect_after_action__before_redirect_modification_'
457
+				. $this->_current_route,
458
+				array($this, '_redirect_action_early_' . $this->_current_route),
459
+				10
460
+			);
461
+		}
462
+		if (method_exists($this, '_redirect_action_' . $this->_current_route)) {
463
+			add_action(
464
+				'AHEE_redirect_' . $admin_class_name . $this->_current_route,
465
+				array($this, '_redirect_action_' . $this->_current_route),
466
+				10
467
+			);
468
+		}
469
+		// 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.
470
+		if (method_exists($this, '_redirect_filter_' . $this->_current_route)) {
471
+			add_filter(
472
+				'FHEE_redirect_' . $admin_class_name . $this->_current_route,
473
+				array($this, '_redirect_filter_' . $this->_current_route),
474
+				10,
475
+				2
476
+			);
477
+		}
478
+	}
479
+
480
+
481
+	/**
482
+	 * This method will search for a corresponding method with a name matching the route and the wp_hook to run.  This
483
+	 * allows child hook classes to target hooking into a specific wp action or filter hook ONLY on a certain route.
484
+	 * just remember, methods MUST be public Future hooks should be added in here to be access by child classes.
485
+	 *
486
+	 * @return void
487
+	 */
488
+	private function _load_routed_hooks()
489
+	{
490
+
491
+		// 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.
492
+		$hook_filter_array = array(
493
+			'admin_footer'                                                                            => array(
494
+				'type'     => 'action',
495
+				'argnum'   => 1,
496
+				'priority' => 10,
497
+			),
498
+			'FHEE_list_table_views_' . $this->_adminpage_obj->page_slug . '_' . $this->_current_route => array(
499
+				'type'     => 'filter',
500
+				'argnum'   => 1,
501
+				'priority' => 10,
502
+			),
503
+			'FHEE_list_table_views_' . $this->_adminpage_obj->page_slug                               => array(
504
+				'type'     => 'filter',
505
+				'argnum'   => 1,
506
+				'priority' => 10,
507
+			),
508
+			'FHEE_list_table_views'                                                                   => array(
509
+				'type'     => 'filter',
510
+				'argnum'   => 1,
511
+				'priority' => 10,
512
+			),
513
+			'AHEE__EE_Admin_Page___display_admin_page__modify_metaboxes'                              => array(
514
+				'type'     => 'action',
515
+				'argnum'   => 1,
516
+				'priority' => 10,
517
+			),
518
+		);
519
+		foreach ($hook_filter_array as $hook => $args) {
520
+			if (method_exists($this, $this->_current_route . '_' . $hook)) {
521
+				if (isset($this->_wp_action_filters_priority[ $hook ])) {
522
+					$args['priority'] = $this->_wp_action_filters_priority[ $hook ];
523
+				}
524
+				if ($args['type'] == 'action') {
525
+					add_action(
526
+						$hook,
527
+						array($this, $this->_current_route . '_' . $hook),
528
+						$args['priority'],
529
+						$args['argnum']
530
+					);
531
+				} else {
532
+					add_filter(
533
+						$hook,
534
+						array($this, $this->_current_route . '_' . $hook),
535
+						$args['priority'],
536
+						$args['argnum']
537
+					);
538
+				}
539
+			}
540
+		}
541
+	}
542
+
543
+
544
+	/**
545
+	 * Loop throught the $_ajax_func array and add_actions for the array.
546
+	 *
547
+	 * @return void
548
+	 */
549
+	private function _ajax_hooks()
550
+	{
551
+		if (empty($this->_ajax_func)) {
552
+			return;
553
+		} //get out there's nothing to take care of.
554
+		foreach ($this->_ajax_func as $action => $method) {
555
+			// make sure method exists
556
+			if (! method_exists($this, $method)) {
557
+				$msg[] = __(
558
+					'There is no corresponding method for the hook labeled in the _ajax_func array',
559
+					'event_espresso'
560
+				) . '<br />';
561
+				$msg[] = sprintf(
562
+					__(
563
+						'The method name given in the array is %s, check the spelling and make sure it exists in the %s class',
564
+						'event_espresso'
565
+					),
566
+					$method,
567
+					$this->caller
568
+				);
569
+				throw new EE_Error(implode('||', $msg));
570
+			}
571
+			add_action('wp_ajax_' . $action, array($this, $method));
572
+		}
573
+	}
574
+
575
+
576
+	/**
577
+	 * Loop throught the $_init_func array and add_actions for the array.
578
+	 *
579
+	 * @return void
580
+	 */
581
+	protected function _init_hooks()
582
+	{
583
+		if (empty($this->_init_func)) {
584
+			return;
585
+		} //get out there's nothing to take care of.
586
+		// We need to determine what page_route we are on!
587
+		$current_route = isset($_REQUEST['action']) ? $_REQUEST['action'] : 'default';
588
+		foreach ($this->_init_func as $route => $method) {
589
+			// make sure method exists
590
+			if (! method_exists($this, $method)) {
591
+				$msg[] = __(
592
+					'There is no corresponding method for the hook labeled in the _init_func array',
593
+					'event_espresso'
594
+				) . '<br />';
595
+				$msg[] = sprintf(
596
+					__(
597
+						'The method name given in the array is %s, check the spelling and make sure it exists in the %s class',
598
+						'event_espresso'
599
+					),
600
+					$method,
601
+					$this->caller
602
+				);
603
+				throw new EE_Error(implode('||', $msg));
604
+			}
605
+			if ($route == $this->_current_route) {
606
+				add_action('admin_init', array($this, $method));
607
+			}
608
+		}
609
+	}
610
+
611
+
612
+	/**
613
+	 * Loop through the _metaboxes property and add_metaboxes accordingly
614
+	 * //todo we could eventually make this a config component class (i.e. new EE_Metabox);
615
+	 *
616
+	 * @access public
617
+	 * @return void
618
+	 */
619
+	public function add_metaboxes()
620
+	{
621
+		if (empty($this->_metaboxes)) {
622
+			return;
623
+		} //get out we don't have any metaboxes to set for this connection
624
+		$this->_handle_metabox_array($this->_metaboxes);
625
+	}
626
+
627
+
628
+	private function _handle_metabox_array($boxes, $add = true)
629
+	{
630
+		foreach ($boxes as $box) {
631
+			if (! isset($box['page_route'])) {
632
+				continue;
633
+			} //we dont' have a valid array
634
+			// let's make sure $box['page_route'] is an array so the "foreach" will work.
635
+			$box['page_route'] = (array) $box['page_route'];
636
+			foreach ($box['page_route'] as $route) {
637
+				if ($route != $this->_current_route) {
638
+					continue;
639
+				} //get out we only add metaboxes for set route.
640
+				if ($add) {
641
+					$this->_add_metabox($box);
642
+				} else {
643
+					$this->_remove_metabox($box);
644
+				}
645
+			}
646
+		}
647
+	}
648
+
649
+
650
+	/**
651
+	 * Loop through the _remove_metaboxes property and remove metaboxes accordingly.
652
+	 *
653
+	 * @access public
654
+	 * @return void
655
+	 */
656
+	public function remove_metaboxes()
657
+	{
658
+		if (empty($this->_remove_metaboxes)) {
659
+			return;
660
+		} //get out there are no metaboxes to remove
661
+		$this->_handle_metabox_array($this->_remove_metaboxes, false);
662
+	}
663
+
664
+
665
+	/**
666
+	 * This just handles adding a metabox
667
+	 *
668
+	 * @access private
669
+	 * @param array $args an array of args that have been set for this metabox by the child class
670
+	 */
671
+	private function _add_metabox($args)
672
+	{
673
+		$current_screen = get_current_screen();
674
+		$screen_id = is_object($current_screen) ? $current_screen->id : null;
675
+		$func = isset($args['func']) ? $args['func'] : 'some_invalid_callback';
676
+		// set defaults
677
+		$defaults = array(
678
+			'func'          => $func,
679
+			'id'            => $this->caller . '_' . $func . '_metabox',
680
+			'priority'      => 'default',
681
+			'label'         => $this->caller,
682
+			'context'       => 'advanced',
683
+			'callback_args' => array(),
684
+			'page'          => isset($args['page']) ? $args['page'] : $screen_id,
685
+		);
686
+		$args = wp_parse_args($args, $defaults);
687
+		extract($args);
688
+		// make sure method exists
689
+		if (! method_exists($this, $func)) {
690
+			$msg[] = __('There is no corresponding method to display the metabox content', 'event_espresso') . '<br />';
691
+			$msg[] = sprintf(
692
+				__(
693
+					'The method name given in the array is %s, check the spelling and make sure it exists in the %s class',
694
+					'event_espresso'
695
+				),
696
+				$func,
697
+				$this->caller
698
+			);
699
+			throw new EE_Error(implode('||', $msg));
700
+		}
701
+		// everything checks out so lets add the metabox
702
+		add_meta_box($id, $label, array($this, $func), $page, $context, $priority, $callback_args);
703
+	}
704
+
705
+
706
+	private function _remove_metabox($args)
707
+	{
708
+		$current_screen = get_current_screen();
709
+		$screen_id = is_object($current_screen) ? $current_screen->id : null;
710
+		$func = isset($args['func']) ? $args['func'] : 'some_invalid_callback';
711
+		// set defaults
712
+		$defaults = array(
713
+			'id'      => isset($args['id'])
714
+				? $args['id']
715
+				: $this->_current_route
716
+				  . '_'
717
+				  . $this->caller
718
+				  . '_'
719
+				  . $func
720
+				  . '_metabox',
721
+			'context' => 'default',
722
+			'screen'  => isset($args['screen']) ? $args['screen'] : $screen_id,
723
+		);
724
+		$args = wp_parse_args($args, $defaults);
725
+		extract($args);
726
+		// everything checks out so lets remove the box!
727
+		remove_meta_box($id, $screen, $context);
728
+	}
729 729
 }
Please login to merge, or discard this patch.
Spacing   +41 added lines, -41 removed lines patch added patch discarded remove patch
@@ -204,7 +204,7 @@  discard block
 block discarded – undo
204 204
         $this->_set_defaults();
205 205
         $this->_set_hooks_properties();
206 206
         // first let's verify we're on the right page
207
-        if (! isset($this->_req_data['page'])
207
+        if ( ! isset($this->_req_data['page'])
208 208
             || (isset($this->_req_data['page'])
209 209
                 && $this->_adminpage_obj->page_slug
210 210
                    != $this->_req_data['page'])) {
@@ -254,9 +254,9 @@  discard block
 block discarded – undo
254 254
      */
255 255
     public function enqueue_scripts_styles()
256 256
     {
257
-        if (! empty($this->_scripts_styles)) {
257
+        if ( ! empty($this->_scripts_styles)) {
258 258
             // first let's do all the registrations
259
-            if (! isset($this->_scripts_styles['registers'])) {
259
+            if ( ! isset($this->_scripts_styles['registers'])) {
260 260
                 $msg[] = __(
261 261
                     'There is no "registers" index in the <code>$this->_scripts_styles</code> property.',
262 262
                     'event_espresso'
@@ -266,7 +266,7 @@  discard block
 block discarded – undo
266 266
                         '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',
267 267
                         'event_espresso'
268 268
                     ),
269
-                    '<strong>' . $this->caller . '</strong>'
269
+                    '<strong>'.$this->caller.'</strong>'
270 270
                 );
271 271
                 throw new EE_Error(implode('||', $msg));
272 272
             }
@@ -281,7 +281,7 @@  discard block
 block discarded – undo
281 281
                 $details = wp_parse_args($details, $defaults);
282 282
                 extract($details);
283 283
                 // 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
284
-                $this->_scripts_styles['registers'][ $ref ]['type'] = $type;
284
+                $this->_scripts_styles['registers'][$ref]['type'] = $type;
285 285
                 // let's make sure we're not missing any REQUIRED parameters
286 286
                 if (empty($url)) {
287 287
                     $msg[] = sprintf(
@@ -293,7 +293,7 @@  discard block
 block discarded – undo
293 293
                             'Doublecheck your <code>$this->_scripts_styles</code> array in %s and make sure that there is a "url" set for the %s ref',
294 294
                             'event_espresso'
295 295
                         ),
296
-                        '<strong>' . $this->caller . '</strong>',
296
+                        '<strong>'.$this->caller.'</strong>',
297 297
                         $ref
298 298
                     );
299 299
                     throw new EE_Error(implode('||', $msg));
@@ -309,7 +309,7 @@  discard block
 block discarded – undo
309 309
                     );
310 310
             }
311 311
             // k now lets do the enqueues
312
-            if (! isset($this->_scripts_styles['enqueues'])) {
312
+            if ( ! isset($this->_scripts_styles['enqueues'])) {
313 313
                 return;
314 314
             }  //not sure if we should throw an error here or not.
315 315
 
@@ -317,22 +317,22 @@  discard block
 block discarded – undo
317 317
                 // make sure $routes is an array
318 318
                 $routes = (array) $routes;
319 319
                 if (in_array($this->_current_route, $routes)) {
320
-                    $this->_scripts_styles['registers'][ $ref ]['type'] == 'js' ? wp_enqueue_script($ref)
320
+                    $this->_scripts_styles['registers'][$ref]['type'] == 'js' ? wp_enqueue_script($ref)
321 321
                         : wp_enqueue_style($ref);
322 322
                     // if we have a localization for the script let's do that too.
323
-                    if (isset($this->_scripts_styles['localize'][ $ref ])) {
324
-                        foreach ($this->_scripts_styles['localize'][ $ref ] as $object_name => $indexes) {
323
+                    if (isset($this->_scripts_styles['localize'][$ref])) {
324
+                        foreach ($this->_scripts_styles['localize'][$ref] as $object_name => $indexes) {
325 325
                             wp_localize_script(
326 326
                                 $ref,
327 327
                                 $object_name,
328
-                                $this->_scripts_styles['localize'][ $ref ][ $object_name ]
328
+                                $this->_scripts_styles['localize'][$ref][$object_name]
329 329
                             );
330 330
                         }
331 331
                     }
332 332
                 }
333 333
             }
334 334
             // let's do the deregisters
335
-            if (! isset($this->_scripts_styles['deregisters'])) {
335
+            if ( ! isset($this->_scripts_styles['deregisters'])) {
336 336
                 return;
337 337
             }
338 338
             foreach ($this->_scripts_styles['deregisters'] as $ref => $details) {
@@ -394,20 +394,20 @@  discard block
 block discarded – undo
394 394
             throw new EE_Error(implode('||', $msg));
395 395
         }
396 396
         $ref = str_replace('_', ' ', $this->_name); // take the_message -> the message
397
-        $ref = str_replace(' ', '_', ucwords($ref)) . '_Admin_Page'; // take the message -> The_Message
397
+        $ref = str_replace(' ', '_', ucwords($ref)).'_Admin_Page'; // take the message -> The_Message
398 398
         // first default file (if exists)
399
-        $decaf_file = EE_ADMIN_PAGES . $this->_name . '/' . $ref . '.core.php';
399
+        $decaf_file = EE_ADMIN_PAGES.$this->_name.'/'.$ref.'.core.php';
400 400
         if (is_readable($decaf_file)) {
401 401
             require_once($decaf_file);
402 402
         }
403 403
         // now we have to do require for extended file (if needed)
404 404
         if ($this->_extend) {
405
-            require_once(EE_CORE_CAF_ADMIN_EXTEND . $this->_name . '/Extend_' . $ref . '.core.php');
405
+            require_once(EE_CORE_CAF_ADMIN_EXTEND.$this->_name.'/Extend_'.$ref.'.core.php');
406 406
         }
407 407
         // if we've got an extended class we use that!
408
-        $ref = $this->_extend ? 'Extend_' . $ref : $ref;
408
+        $ref = $this->_extend ? 'Extend_'.$ref : $ref;
409 409
         // let's make sure the class exists
410
-        if (! class_exists($ref)) {
410
+        if ( ! class_exists($ref)) {
411 411
             $msg[] = __('We can\'t load the page object', 'event_espresso');
412 412
             $msg[] = sprintf(
413 413
                 __(
@@ -449,28 +449,28 @@  discard block
 block discarded – undo
449 449
         // first the actions
450 450
         // note that these action hooks will have the $query_args value available.
451 451
         $admin_class_name = get_class($this->_adminpage_obj);
452
-        if (method_exists($this, '_redirect_action_early_' . $this->_current_route)) {
452
+        if (method_exists($this, '_redirect_action_early_'.$this->_current_route)) {
453 453
             add_action(
454 454
                 'AHEE__'
455 455
                 . $admin_class_name
456 456
                 . '___redirect_after_action__before_redirect_modification_'
457 457
                 . $this->_current_route,
458
-                array($this, '_redirect_action_early_' . $this->_current_route),
458
+                array($this, '_redirect_action_early_'.$this->_current_route),
459 459
                 10
460 460
             );
461 461
         }
462
-        if (method_exists($this, '_redirect_action_' . $this->_current_route)) {
462
+        if (method_exists($this, '_redirect_action_'.$this->_current_route)) {
463 463
             add_action(
464
-                'AHEE_redirect_' . $admin_class_name . $this->_current_route,
465
-                array($this, '_redirect_action_' . $this->_current_route),
464
+                'AHEE_redirect_'.$admin_class_name.$this->_current_route,
465
+                array($this, '_redirect_action_'.$this->_current_route),
466 466
                 10
467 467
             );
468 468
         }
469 469
         // 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.
470
-        if (method_exists($this, '_redirect_filter_' . $this->_current_route)) {
470
+        if (method_exists($this, '_redirect_filter_'.$this->_current_route)) {
471 471
             add_filter(
472
-                'FHEE_redirect_' . $admin_class_name . $this->_current_route,
473
-                array($this, '_redirect_filter_' . $this->_current_route),
472
+                'FHEE_redirect_'.$admin_class_name.$this->_current_route,
473
+                array($this, '_redirect_filter_'.$this->_current_route),
474 474
                 10,
475 475
                 2
476 476
             );
@@ -495,12 +495,12 @@  discard block
 block discarded – undo
495 495
                 'argnum'   => 1,
496 496
                 'priority' => 10,
497 497
             ),
498
-            'FHEE_list_table_views_' . $this->_adminpage_obj->page_slug . '_' . $this->_current_route => array(
498
+            'FHEE_list_table_views_'.$this->_adminpage_obj->page_slug.'_'.$this->_current_route => array(
499 499
                 'type'     => 'filter',
500 500
                 'argnum'   => 1,
501 501
                 'priority' => 10,
502 502
             ),
503
-            'FHEE_list_table_views_' . $this->_adminpage_obj->page_slug                               => array(
503
+            'FHEE_list_table_views_'.$this->_adminpage_obj->page_slug                               => array(
504 504
                 'type'     => 'filter',
505 505
                 'argnum'   => 1,
506 506
                 'priority' => 10,
@@ -517,21 +517,21 @@  discard block
 block discarded – undo
517 517
             ),
518 518
         );
519 519
         foreach ($hook_filter_array as $hook => $args) {
520
-            if (method_exists($this, $this->_current_route . '_' . $hook)) {
521
-                if (isset($this->_wp_action_filters_priority[ $hook ])) {
522
-                    $args['priority'] = $this->_wp_action_filters_priority[ $hook ];
520
+            if (method_exists($this, $this->_current_route.'_'.$hook)) {
521
+                if (isset($this->_wp_action_filters_priority[$hook])) {
522
+                    $args['priority'] = $this->_wp_action_filters_priority[$hook];
523 523
                 }
524 524
                 if ($args['type'] == 'action') {
525 525
                     add_action(
526 526
                         $hook,
527
-                        array($this, $this->_current_route . '_' . $hook),
527
+                        array($this, $this->_current_route.'_'.$hook),
528 528
                         $args['priority'],
529 529
                         $args['argnum']
530 530
                     );
531 531
                 } else {
532 532
                     add_filter(
533 533
                         $hook,
534
-                        array($this, $this->_current_route . '_' . $hook),
534
+                        array($this, $this->_current_route.'_'.$hook),
535 535
                         $args['priority'],
536 536
                         $args['argnum']
537 537
                     );
@@ -553,11 +553,11 @@  discard block
 block discarded – undo
553 553
         } //get out there's nothing to take care of.
554 554
         foreach ($this->_ajax_func as $action => $method) {
555 555
             // make sure method exists
556
-            if (! method_exists($this, $method)) {
556
+            if ( ! method_exists($this, $method)) {
557 557
                 $msg[] = __(
558 558
                     'There is no corresponding method for the hook labeled in the _ajax_func array',
559 559
                     'event_espresso'
560
-                ) . '<br />';
560
+                ).'<br />';
561 561
                 $msg[] = sprintf(
562 562
                     __(
563 563
                         'The method name given in the array is %s, check the spelling and make sure it exists in the %s class',
@@ -568,7 +568,7 @@  discard block
 block discarded – undo
568 568
                 );
569 569
                 throw new EE_Error(implode('||', $msg));
570 570
             }
571
-            add_action('wp_ajax_' . $action, array($this, $method));
571
+            add_action('wp_ajax_'.$action, array($this, $method));
572 572
         }
573 573
     }
574 574
 
@@ -587,11 +587,11 @@  discard block
 block discarded – undo
587 587
         $current_route = isset($_REQUEST['action']) ? $_REQUEST['action'] : 'default';
588 588
         foreach ($this->_init_func as $route => $method) {
589 589
             // make sure method exists
590
-            if (! method_exists($this, $method)) {
590
+            if ( ! method_exists($this, $method)) {
591 591
                 $msg[] = __(
592 592
                     'There is no corresponding method for the hook labeled in the _init_func array',
593 593
                     'event_espresso'
594
-                ) . '<br />';
594
+                ).'<br />';
595 595
                 $msg[] = sprintf(
596 596
                     __(
597 597
                         'The method name given in the array is %s, check the spelling and make sure it exists in the %s class',
@@ -628,7 +628,7 @@  discard block
 block discarded – undo
628 628
     private function _handle_metabox_array($boxes, $add = true)
629 629
     {
630 630
         foreach ($boxes as $box) {
631
-            if (! isset($box['page_route'])) {
631
+            if ( ! isset($box['page_route'])) {
632 632
                 continue;
633 633
             } //we dont' have a valid array
634 634
             // let's make sure $box['page_route'] is an array so the "foreach" will work.
@@ -676,7 +676,7 @@  discard block
 block discarded – undo
676 676
         // set defaults
677 677
         $defaults = array(
678 678
             'func'          => $func,
679
-            'id'            => $this->caller . '_' . $func . '_metabox',
679
+            'id'            => $this->caller.'_'.$func.'_metabox',
680 680
             'priority'      => 'default',
681 681
             'label'         => $this->caller,
682 682
             'context'       => 'advanced',
@@ -686,8 +686,8 @@  discard block
 block discarded – undo
686 686
         $args = wp_parse_args($args, $defaults);
687 687
         extract($args);
688 688
         // make sure method exists
689
-        if (! method_exists($this, $func)) {
690
-            $msg[] = __('There is no corresponding method to display the metabox content', 'event_espresso') . '<br />';
689
+        if ( ! method_exists($this, $func)) {
690
+            $msg[] = __('There is no corresponding method to display the metabox content', 'event_espresso').'<br />';
691 691
             $msg[] = sprintf(
692 692
                 __(
693 693
                     '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.
Indentation   +903 added lines, -903 removed lines patch added patch discarded remove patch
@@ -17,913 +17,913 @@
 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 (isset($this->_data->reg_obj)
864
-                && ($this->_data->reg_obj->attendee_ID() != $att_id)
865
-                && $this->_single_message
866
-            ) {
867
-                continue;
868
-            }
869
-            // is $this->_regs_for_sending present?
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)) {
872
-                $regs_allowed = array_intersect_key(array_flip($this->_regs_for_sending), $details['reg_objs']);
873
-                if (empty($regs_allowed)) {
874
-                    continue;
875
-                }
876
-            }
877
-            if (apply_filters(
878
-                'FHEE__EE_message_type___attendee_addressees__prevent_duplicate_email_sends',
879
-                true,
880
-                $this->_data,
881
-                $this
882
-            )
883
-                && in_array($att_id, $already_processed, true)
884
-            ) {
885
-                continue;
886
-            }
887
-            $already_processed[] = $att_id;
888
-            foreach ($details as $item => $value) {
889
-                $aee[ $item ] = $value;
890
-                if ($item === 'line_ref') {
891
-                    foreach ($value as $event_id) {
892
-                        $aee['events'][ $event_id ] = $this->_data->events[ $event_id ];
893
-                    }
894
-                }
895
-                if ($item === 'attendee_email') {
896
-                    $aee['attendee_email'] = $value;
897
-                }
898
-                /*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 (isset($this->_data->reg_obj)
864
+				&& ($this->_data->reg_obj->attendee_ID() != $att_id)
865
+				&& $this->_single_message
866
+			) {
867
+				continue;
868
+			}
869
+			// is $this->_regs_for_sending present?
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)) {
872
+				$regs_allowed = array_intersect_key(array_flip($this->_regs_for_sending), $details['reg_objs']);
873
+				if (empty($regs_allowed)) {
874
+					continue;
875
+				}
876
+			}
877
+			if (apply_filters(
878
+				'FHEE__EE_message_type___attendee_addressees__prevent_duplicate_email_sends',
879
+				true,
880
+				$this->_data,
881
+				$this
882
+			)
883
+				&& in_array($att_id, $already_processed, true)
884
+			) {
885
+				continue;
886
+			}
887
+			$already_processed[] = $att_id;
888
+			foreach ($details as $item => $value) {
889
+				$aee[ $item ] = $value;
890
+				if ($item === 'line_ref') {
891
+					foreach ($value as $event_id) {
892
+						$aee['events'][ $event_id ] = $this->_data->events[ $event_id ];
893
+					}
894
+				}
895
+				if ($item === 'attendee_email') {
896
+					$aee['attendee_email'] = $value;
897
+				}
898
+				/*if ( $item == 'registration_id' ) {
899 899
                     $aee['attendee_registration_id'] = $value;
900 900
                 }/**/
901
-            }
902
-            // note the FIRST reg object in this array is the one
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']);
905
-            $aee['attendees']      = $this->_data->attendees;
906
-            $aee['recipient_id']   = $att_id;
907
-            $aee['recipient_type'] = 'Attendee';
908
-            // merge in the primary attendee data
909
-            $aee   = array_merge($this->_default_addressee_data, $aee);
910
-            $add[] = new EE_Messages_Addressee($aee);
911
-        }
912
-        return $add;
913
-    }
914
-
915
-
916
-    /**
917
-     * @param $event_id
918
-     * @return int
919
-     * @throws EE_Error
920
-     * @throws InvalidArgumentException
921
-     * @throws InvalidDataTypeException
922
-     * @throws InvalidInterfaceException
923
-     */
924
-    protected function _get_event_admin_id($event_id)
925
-    {
926
-        $event = EEM_Event::instance()->get_one_by_ID($event_id);
927
-        return $event instanceof EE_Event ? $event->wp_user() : 0;
928
-    }
901
+			}
902
+			// note the FIRST reg object in this array is the one
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']);
905
+			$aee['attendees']      = $this->_data->attendees;
906
+			$aee['recipient_id']   = $att_id;
907
+			$aee['recipient_type'] = 'Attendee';
908
+			// merge in the primary attendee data
909
+			$aee   = array_merge($this->_default_addressee_data, $aee);
910
+			$add[] = new EE_Messages_Addressee($aee);
911
+		}
912
+		return $add;
913
+	}
914
+
915
+
916
+	/**
917
+	 * @param $event_id
918
+	 * @return int
919
+	 * @throws EE_Error
920
+	 * @throws InvalidArgumentException
921
+	 * @throws InvalidDataTypeException
922
+	 * @throws InvalidInterfaceException
923
+	 */
924
+	protected function _get_event_admin_id($event_id)
925
+	{
926
+		$event = EEM_Event::instance()->get_one_by_ID($event_id);
927
+		return $event instanceof EE_Event ? $event->wp_user() : 0;
928
+	}
929 929
 }
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.
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   +1320 added lines, -1320 removed lines patch added patch discarded remove patch
@@ -16,1333 +16,1333 @@
 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 (empty($_REQUEST['txn_reg_status_change']['send_notifications'])
631
-                || ! absint($_REQUEST['txn_reg_status_change']['send_notifications'])
632
-            ) {
633
-                // no messages sent please.
634
-                return false;
635
-            }
636
-        } else {
637
-            // frontend request (either regular or via AJAX)
638
-            // TXN is NOT finalized ?
639
-            if (! isset($extra_details['finalized']) || $extra_details['finalized'] === false) {
640
-                return false;
641
-            }
642
-            // return visit but nothing changed ???
643
-            if (isset($extra_details['revisit'], $extra_details['status_updates']) &&
644
-                $extra_details['revisit'] && ! $extra_details['status_updates']
645
-            ) {
646
-                return false;
647
-            }
648
-            // NOT sending messages && reg status is something other than "Not-Approved"
649
-            if (! apply_filters('FHEE__EED_Messages___maybe_registration__deliver_notifications', false) &&
650
-                $registration->status_ID() !== EEM_Registration::status_id_not_approved
651
-            ) {
652
-                return false;
653
-            }
654
-        }
655
-        // release the kraken
656
-        return true;
657
-    }
658
-
659
-
660
-    /**
661
-     * Simply returns an array indexed by Registration Status ID and the related message_type name associated with that
662
-     * status id.
663
-     *
664
-     * @deprecated 4.9.0  Use EEH_MSG_Template::reg_status_to_message_type_array()
665
-     *                    or EEH_MSG_Template::convert_reg_status_to_message_type
666
-     * @param string $reg_status
667
-     * @return array
668
-     * @throws EE_Error
669
-     * @throws InvalidArgumentException
670
-     * @throws ReflectionException
671
-     * @throws InvalidDataTypeException
672
-     * @throws InvalidInterfaceException
673
-     */
674
-    protected static function _get_reg_status_array($reg_status = '')
675
-    {
676
-        EE_Registry::instance()->load_helper('MSG_Template');
677
-        return EEH_MSG_Template::convert_reg_status_to_message_type($reg_status)
678
-            ? EEH_MSG_Template::convert_reg_status_to_message_type($reg_status)
679
-            : EEH_MSG_Template::reg_status_to_message_type_array();
680
-    }
681
-
682
-
683
-    /**
684
-     * Simply returns the payment message type for the given payment status.
685
-     *
686
-     * @deprecated 4.9.0 Use EEH_MSG_Template::payment_status_to_message_type_array
687
-     *                   or EEH_MSG_Template::convert_payment_status_to_message_type
688
-     * @param string $payment_status The payment status being matched.
689
-     * @return bool|string The payment message type slug matching the status or false if no match.
690
-     * @throws EE_Error
691
-     * @throws InvalidArgumentException
692
-     * @throws ReflectionException
693
-     * @throws InvalidDataTypeException
694
-     * @throws InvalidInterfaceException
695
-     */
696
-    protected static function _get_payment_message_type($payment_status)
697
-    {
698
-        EE_Registry::instance()->load_helper('MSG_Template');
699
-        return EEH_MSG_Template::convert_payment_status_to_message_type($payment_status)
700
-            ? EEH_MSG_Template::convert_payment_status_to_message_type($payment_status)
701
-            : false;
702
-    }
703
-
704
-
705
-    /**
706
-     * Message triggers for a resending already sent message(s) (via EE_Message list table)
707
-     *
708
-     * @access public
709
-     * @param array $req_data This is the $_POST & $_GET data sent from EE_Admin Pages
710
-     * @return bool success/fail
711
-     * @throws EE_Error
712
-     * @throws InvalidArgumentException
713
-     * @throws InvalidDataTypeException
714
-     * @throws InvalidInterfaceException
715
-     * @throws ReflectionException
716
-     */
717
-    public static function process_resend($req_data)
718
-    {
719
-        self::_load_controller();
720
-
721
-        // if $msgID in this request then skip to the new resend_message
722
-        if (EE_Registry::instance()->REQ->get('MSG_ID')) {
723
-            return self::resend_message();
724
-        }
725
-
726
-        // make sure any incoming request data is set on the REQ so that it gets picked up later.
727
-        $req_data = (array) $req_data;
728
-        foreach ($req_data as $request_key => $request_value) {
729
-            EE_Registry::instance()->REQ->set($request_key, $request_value);
730
-        }
731
-
732
-        if (! $messages_to_send = self::$_MSG_PROCESSOR->setup_messages_to_generate_from_registration_ids_in_request(
733
-        )) {
734
-            return false;
735
-        }
736
-
737
-        try {
738
-            self::$_MSG_PROCESSOR->batch_queue_for_generation_and_persist($messages_to_send);
739
-            self::$_MSG_PROCESSOR->get_queue()->initiate_request_by_priority();
740
-        } catch (EE_Error $e) {
741
-            EE_Error::add_error($e->getMessage(), __FILE__, __FUNCTION__, __LINE__);
742
-            return false;
743
-        }
744
-        EE_Error::add_success(
745
-            __('Messages have been successfully queued for generation and sending.', 'event_espresso')
746
-        );
747
-        return true; // everything got queued.
748
-    }
749
-
750
-
751
-    /**
752
-     * Message triggers for a resending already sent message(s) (via EE_Message list table)
753
-     *
754
-     * @return bool
755
-     * @throws EE_Error
756
-     * @throws InvalidArgumentException
757
-     * @throws InvalidDataTypeException
758
-     * @throws InvalidInterfaceException
759
-     * @throws ReflectionException
760
-     */
761
-    public static function resend_message()
762
-    {
763
-        self::_load_controller();
764
-
765
-        $msgID = EE_Registry::instance()->REQ->get('MSG_ID');
766
-        if (! $msgID) {
767
-            EE_Error::add_error(
768
-                __(
769
-                    'Something went wrong because there is no "MSG_ID" value in the request',
770
-                    'event_espresso'
771
-                ),
772
-                __FILE__,
773
-                __FUNCTION__,
774
-                __LINE__
775
-            );
776
-            return false;
777
-        }
778
-
779
-        self::$_MSG_PROCESSOR->setup_messages_from_ids_and_send((array) $msgID);
780
-
781
-        // setup success message.
782
-        $count_ready_for_resend = self::$_MSG_PROCESSOR->get_queue()->count_STS_in_queue(EEM_Message::status_resend);
783
-        EE_Error::add_success(
784
-            sprintf(
785
-                _n(
786
-                    'There was %d message queued for resending.',
787
-                    'There were %d messages queued for resending.',
788
-                    $count_ready_for_resend,
789
-                    'event_espresso'
790
-                ),
791
-                $count_ready_for_resend
792
-            )
793
-        );
794
-        return true;
795
-    }
796
-
797
-
798
-    /**
799
-     * Message triggers for manual payment applied by admin
800
-     *
801
-     * @param  EE_Payment $payment EE_payment object
802
-     * @return bool success/fail
803
-     * @throws EE_Error
804
-     * @throws InvalidArgumentException
805
-     * @throws ReflectionException
806
-     * @throws InvalidDataTypeException
807
-     * @throws InvalidInterfaceException
808
-     */
809
-    public static function process_admin_payment(EE_Payment $payment)
810
-    {
811
-        EE_Registry::instance()->load_helper('MSG_Template');
812
-        // we need to get the transaction object
813
-        $transaction = $payment->transaction();
814
-        if ($transaction instanceof EE_Transaction) {
815
-            $data = array($transaction, $payment);
816
-            $message_type = EEH_MSG_Template::convert_payment_status_to_message_type($payment->STS_ID());
817
-
818
-            // if payment amount is less than 0 then switch to payment_refund message type.
819
-            $message_type = $payment->amount() < 0 ? 'payment_refund' : $message_type;
820
-
821
-            // if payment_refund is selected, but the status is NOT accepted.  Then change message type to false so NO message notification goes out.
822
-            $message_type = $message_type == 'payment_refund' && $payment->STS_ID() != EEM_Payment::status_id_approved
823
-                ? false : $message_type;
824
-
825
-            self::_load_controller();
826
-
827
-            self::$_MSG_PROCESSOR->generate_for_all_active_messengers($message_type, $data);
828
-
829
-            // get count of queued for generation
830
-            $count_to_generate = self::$_MSG_PROCESSOR->get_queue()->count_STS_in_queue(
831
-                array(
832
-                    EEM_Message::status_incomplete,
833
-                    EEM_Message::status_idle,
834
-                )
835
-            );
836
-
837
-            if ($count_to_generate > 0 && self::$_MSG_PROCESSOR->get_queue()->get_message_repository()->count() !== 0) {
838
-                add_filter('FHEE__EE_Admin_Page___process_admin_payment_notification__success', '__return_true');
839
-                return true;
840
-            } else {
841
-                $count_failed = self::$_MSG_PROCESSOR->get_queue()->count_STS_in_queue(
842
-                    EEM_Message::instance()->stati_indicating_failed_sending()
843
-                );
844
-                /**
845
-                 * Verify that there are actually errors.  If not then we return a success message because the queue might have been emptied due to successful
846
-                 * IMMEDIATE generation.
847
-                 */
848
-                if ($count_failed > 0) {
849
-                    EE_Error::add_error(
850
-                        sprintf(
851
-                            _n(
852
-                                'The payment notification generation failed.',
853
-                                '%d payment notifications failed being sent.',
854
-                                $count_failed,
855
-                                'event_espresso'
856
-                            ),
857
-                            $count_failed
858
-                        ),
859
-                        __FILE__,
860
-                        __FUNCTION__,
861
-                        __LINE__
862
-                    );
863
-
864
-                    return false;
865
-                } else {
866
-                    add_filter('FHEE__EE_Admin_Page___process_admin_payment_notification__success', '__return_true');
867
-                    return true;
868
-                }
869
-            }
870
-        } else {
871
-            EE_Error::add_error(
872
-                'Unable to generate the payment notification because the given value for the transaction is invalid.',
873
-                'event_espresso'
874
-            );
875
-            return false;
876
-        }
877
-    }
878
-
879
-
880
-    /**
881
-     * Callback for AHEE__Extend_Registrations_Admin_Page___newsletter_selected_send_with_registrations trigger
882
-     *
883
-     * @since   4.3.0
884
-     * @param  EE_Registration[] $registrations an array of EE_Registration objects
885
-     * @param  int               $grp_id        a specific message template group id.
886
-     * @return void
887
-     * @throws EE_Error
888
-     * @throws InvalidArgumentException
889
-     * @throws InvalidDataTypeException
890
-     * @throws InvalidInterfaceException
891
-     * @throws ReflectionException
892
-     */
893
-    public static function send_newsletter_message($registrations, $grp_id)
894
-    {
895
-        // make sure mtp is id and set it in the EE_Request Handler later messages setup.
896
-        EE_Registry::instance()->REQ->set('GRP_ID', (int) $grp_id);
897
-        self::_load_controller();
898
-        self::$_MSG_PROCESSOR->generate_for_all_active_messengers('newsletter', $registrations);
899
-    }
900
-
901
-
902
-    /**
903
-     * Callback for FHEE__EE_Registration__invoice_url__invoice_url or FHEE__EE_Registration__receipt_url__receipt_url
904
-     *
905
-     * @since   4.3.0
906
-     * @param    string          $registration_message_trigger_url
907
-     * @param    EE_Registration $registration
908
-     * @param string             $messenger
909
-     * @param string             $message_type
910
-     * @return string
911
-     * @throws EE_Error
912
-     * @throws InvalidArgumentException
913
-     * @throws InvalidDataTypeException
914
-     * @throws InvalidInterfaceException
915
-     */
916
-    public static function registration_message_trigger_url(
917
-        $registration_message_trigger_url,
918
-        EE_Registration $registration,
919
-        $messenger = 'html',
920
-        $message_type = 'invoice'
921
-    ) {
922
-        // whitelist $messenger
923
-        switch ($messenger) {
924
-            case 'pdf':
925
-                $sending_messenger = 'pdf';
926
-                $generating_messenger = 'html';
927
-                break;
928
-            case 'html':
929
-            default:
930
-                $sending_messenger = 'html';
931
-                $generating_messenger = 'html';
932
-                break;
933
-        }
934
-        // whitelist $message_type
935
-        switch ($message_type) {
936
-            case 'receipt':
937
-                $message_type = 'receipt';
938
-                break;
939
-            case 'invoice':
940
-            default:
941
-                $message_type = 'invoice';
942
-                break;
943
-        }
944
-        // verify that both the messenger AND the message type are active
945
-        if (EEH_MSG_Template::is_messenger_active($sending_messenger)
946
-            && EEH_MSG_Template::is_mt_active($message_type)
947
-        ) {
948
-            // 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?)
949
-            $template_query_params = array(
950
-                'MTP_is_active'    => true,
951
-                'MTP_messenger'    => $generating_messenger,
952
-                'MTP_message_type' => $message_type,
953
-                'Event.EVT_ID'     => $registration->event_ID(),
954
-            );
955
-            // get the message template group.
956
-            $msg_template_group = EEM_Message_Template_Group::instance()->get_one(array($template_query_params));
957
-            // if we don't have an EE_Message_Template_Group then return
958
-            if (! $msg_template_group instanceof EE_Message_Template_Group) {
959
-                // remove EVT_ID from query params so that global templates get picked up
960
-                unset($template_query_params['Event.EVT_ID']);
961
-                // get global template as the fallback
962
-                $msg_template_group = EEM_Message_Template_Group::instance()->get_one(array($template_query_params));
963
-            }
964
-            // if we don't have an EE_Message_Template_Group then return
965
-            if (! $msg_template_group instanceof EE_Message_Template_Group) {
966
-                return '';
967
-            }
968
-            // generate the URL
969
-            $registration_message_trigger_url = EEH_MSG_Template::generate_url_trigger(
970
-                $sending_messenger,
971
-                $generating_messenger,
972
-                'purchaser',
973
-                $message_type,
974
-                $registration,
975
-                $msg_template_group->ID(),
976
-                $registration->transaction_ID()
977
-            );
978
-        }
979
-        return $registration_message_trigger_url;
980
-    }
981
-
982
-
983
-    /**
984
-     * Use to generate and return a message preview!
985
-     *
986
-     * @param  string $type      This should correspond with a valid message type
987
-     * @param  string $context   This should correspond with a valid context for the message type
988
-     * @param  string $messenger This should correspond with a valid messenger.
989
-     * @param bool    $send      true we will do a test send using the messenger delivery, false we just do a regular
990
-     *                           preview
991
-     * @return bool|string The body of the message or if send is requested, sends.
992
-     * @throws EE_Error
993
-     * @throws InvalidArgumentException
994
-     * @throws InvalidDataTypeException
995
-     * @throws InvalidInterfaceException
996
-     * @throws ReflectionException
997
-     */
998
-    public static function preview_message($type, $context, $messenger, $send = false)
999
-    {
1000
-        self::_load_controller();
1001
-        $mtg = new EE_Message_To_Generate(
1002
-            $messenger,
1003
-            $type,
1004
-            array(),
1005
-            $context,
1006
-            true
1007
-        );
1008
-        $generated_preview_queue = self::$_MSG_PROCESSOR->generate_for_preview($mtg, $send);
1009
-        if ($generated_preview_queue instanceof EE_Messages_Queue) {
1010
-            // loop through all content for the preview and remove any persisted records.
1011
-            $content = '';
1012
-            foreach ($generated_preview_queue->get_message_repository() as $message) {
1013
-                $content = $message->content();
1014
-                if ($message->ID() > 0 && $message->STS_ID() !== EEM_Message::status_failed) {
1015
-                    $message->delete();
1016
-                }
1017
-            }
1018
-            return $content;
1019
-        } else {
1020
-            return $generated_preview_queue;
1021
-        }
1022
-    }
1023
-
1024
-
1025
-    /**
1026
-     * This is a method that allows for sending a message using a messenger matching the string given and the provided
1027
-     * EE_Message_Queue object.  The EE_Message_Queue object is used to create a single aggregate EE_Message via the
1028
-     * content found in the EE_Message objects in the queue.
1029
-     *
1030
-     * @since 4.9.0
1031
-     * @param string            $messenger            a string matching a valid active messenger in the system
1032
-     * @param string            $message_type         Although it seems contrary to the name of the method, a message
1033
-     *                                                type name is still required to send along the message type to the
1034
-     *                                                messenger because this is used for determining what specific
1035
-     *                                                variations might be loaded for the generated message.
1036
-     * @param EE_Messages_Queue $queue
1037
-     * @param string            $custom_subject       Can be used to set what the custom subject string will be on the
1038
-     *                                                aggregate EE_Message object.
1039
-     * @return bool success or fail.
1040
-     * @throws EE_Error
1041
-     * @throws InvalidArgumentException
1042
-     * @throws ReflectionException
1043
-     * @throws InvalidDataTypeException
1044
-     * @throws InvalidInterfaceException
1045
-     */
1046
-    public static function send_message_with_messenger_only(
1047
-        $messenger,
1048
-        $message_type,
1049
-        EE_Messages_Queue $queue,
1050
-        $custom_subject = ''
1051
-    ) {
1052
-        self::_load_controller();
1053
-        /** @type EE_Message_To_Generate_From_Queue $message_to_generate */
1054
-        $message_to_generate = EE_Registry::instance()->load_lib(
1055
-            'Message_To_Generate_From_Queue',
1056
-            array(
1057
-                $messenger,
1058
-                $message_type,
1059
-                $queue,
1060
-                $custom_subject,
1061
-            )
1062
-        );
1063
-        return self::$_MSG_PROCESSOR->queue_for_sending($message_to_generate);
1064
-    }
1065
-
1066
-
1067
-    /**
1068
-     * Generates Messages immediately for EE_Message IDs (but only for the correct status for generation)
1069
-     *
1070
-     * @since 4.9.0
1071
-     * @param array $message_ids An array of message ids
1072
-     * @return bool|EE_Messages_Queue false if nothing was generated, EE_Messages_Queue containing generated
1073
-     *                           messages.
1074
-     * @throws EE_Error
1075
-     * @throws InvalidArgumentException
1076
-     * @throws InvalidDataTypeException
1077
-     * @throws InvalidInterfaceException
1078
-     * @throws ReflectionException
1079
-     */
1080
-    public static function generate_now($message_ids)
1081
-    {
1082
-        self::_load_controller();
1083
-        $messages = EEM_Message::instance()->get_all(
1084
-            array(
1085
-                0 => array(
1086
-                    'MSG_ID' => array('IN', $message_ids),
1087
-                    'STS_ID' => EEM_Message::status_incomplete,
1088
-                ),
1089
-            )
1090
-        );
1091
-        $generated_queue = false;
1092
-        if ($messages) {
1093
-            $generated_queue = self::$_MSG_PROCESSOR->batch_generate_from_queue($messages);
1094
-        }
1095
-
1096
-        if (! $generated_queue instanceof EE_Messages_Queue) {
1097
-            EE_Error::add_error(
1098
-                __(
1099
-                    '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.',
1100
-                    'event_espresso'
1101
-                ),
1102
-                __FILE__,
1103
-                __FUNCTION__,
1104
-                __LINE__
1105
-            );
1106
-        }
1107
-        return $generated_queue;
1108
-    }
1109
-
1110
-
1111
-    /**
1112
-     * Sends messages immediately for the incoming message_ids that have the status of EEM_Message::status_resend or,
1113
-     * EEM_Message::status_idle
1114
-     *
1115
-     * @since 4.9.0
1116
-     * @param $message_ids
1117
-     * @return bool|EE_Messages_Queue false if no messages sent.
1118
-     * @throws EE_Error
1119
-     * @throws InvalidArgumentException
1120
-     * @throws InvalidDataTypeException
1121
-     * @throws InvalidInterfaceException
1122
-     * @throws ReflectionException
1123
-     */
1124
-    public static function send_now($message_ids)
1125
-    {
1126
-        self::_load_controller();
1127
-        $messages = EEM_Message::instance()->get_all(
1128
-            array(
1129
-                0 => array(
1130
-                    'MSG_ID' => array('IN', $message_ids),
1131
-                    'STS_ID' => array(
1132
-                        'IN',
1133
-                        array(EEM_Message::status_idle, EEM_Message::status_resend, EEM_Message::status_retry),
1134
-                    ),
1135
-                ),
1136
-            )
1137
-        );
1138
-        $sent_queue = false;
1139
-        if ($messages) {
1140
-            $sent_queue = self::$_MSG_PROCESSOR->batch_send_from_queue($messages);
1141
-        }
1142
-
1143
-        if (! $sent_queue instanceof EE_Messages_Queue) {
1144
-            EE_Error::add_error(
1145
-                __(
1146
-                    '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.',
1147
-                    'event_espresso'
1148
-                ),
1149
-                __FILE__,
1150
-                __FUNCTION__,
1151
-                __LINE__
1152
-            );
1153
-        } else {
1154
-            // can count how many sent by using the messages in the queue
1155
-            $sent_count = $sent_queue->count_STS_in_queue(EEM_Message::instance()->stati_indicating_sent());
1156
-            if ($sent_count > 0) {
1157
-                EE_Error::add_success(
1158
-                    sprintf(
1159
-                        _n(
1160
-                            'There was %d message successfully sent.',
1161
-                            'There were %d messages successfully sent.',
1162
-                            $sent_count,
1163
-                            'event_espresso'
1164
-                        ),
1165
-                        $sent_count
1166
-                    )
1167
-                );
1168
-            } else {
1169
-                EE_Error::overwrite_errors();
1170
-                EE_Error::add_error(
1171
-                    __(
1172
-                        '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 (empty($_REQUEST['txn_reg_status_change']['send_notifications'])
631
+				|| ! absint($_REQUEST['txn_reg_status_change']['send_notifications'])
632
+			) {
633
+				// no messages sent please.
634
+				return false;
635
+			}
636
+		} else {
637
+			// frontend request (either regular or via AJAX)
638
+			// TXN is NOT finalized ?
639
+			if (! isset($extra_details['finalized']) || $extra_details['finalized'] === false) {
640
+				return false;
641
+			}
642
+			// return visit but nothing changed ???
643
+			if (isset($extra_details['revisit'], $extra_details['status_updates']) &&
644
+				$extra_details['revisit'] && ! $extra_details['status_updates']
645
+			) {
646
+				return false;
647
+			}
648
+			// NOT sending messages && reg status is something other than "Not-Approved"
649
+			if (! apply_filters('FHEE__EED_Messages___maybe_registration__deliver_notifications', false) &&
650
+				$registration->status_ID() !== EEM_Registration::status_id_not_approved
651
+			) {
652
+				return false;
653
+			}
654
+		}
655
+		// release the kraken
656
+		return true;
657
+	}
658
+
659
+
660
+	/**
661
+	 * Simply returns an array indexed by Registration Status ID and the related message_type name associated with that
662
+	 * status id.
663
+	 *
664
+	 * @deprecated 4.9.0  Use EEH_MSG_Template::reg_status_to_message_type_array()
665
+	 *                    or EEH_MSG_Template::convert_reg_status_to_message_type
666
+	 * @param string $reg_status
667
+	 * @return array
668
+	 * @throws EE_Error
669
+	 * @throws InvalidArgumentException
670
+	 * @throws ReflectionException
671
+	 * @throws InvalidDataTypeException
672
+	 * @throws InvalidInterfaceException
673
+	 */
674
+	protected static function _get_reg_status_array($reg_status = '')
675
+	{
676
+		EE_Registry::instance()->load_helper('MSG_Template');
677
+		return EEH_MSG_Template::convert_reg_status_to_message_type($reg_status)
678
+			? EEH_MSG_Template::convert_reg_status_to_message_type($reg_status)
679
+			: EEH_MSG_Template::reg_status_to_message_type_array();
680
+	}
681
+
682
+
683
+	/**
684
+	 * Simply returns the payment message type for the given payment status.
685
+	 *
686
+	 * @deprecated 4.9.0 Use EEH_MSG_Template::payment_status_to_message_type_array
687
+	 *                   or EEH_MSG_Template::convert_payment_status_to_message_type
688
+	 * @param string $payment_status The payment status being matched.
689
+	 * @return bool|string The payment message type slug matching the status or false if no match.
690
+	 * @throws EE_Error
691
+	 * @throws InvalidArgumentException
692
+	 * @throws ReflectionException
693
+	 * @throws InvalidDataTypeException
694
+	 * @throws InvalidInterfaceException
695
+	 */
696
+	protected static function _get_payment_message_type($payment_status)
697
+	{
698
+		EE_Registry::instance()->load_helper('MSG_Template');
699
+		return EEH_MSG_Template::convert_payment_status_to_message_type($payment_status)
700
+			? EEH_MSG_Template::convert_payment_status_to_message_type($payment_status)
701
+			: false;
702
+	}
703
+
704
+
705
+	/**
706
+	 * Message triggers for a resending already sent message(s) (via EE_Message list table)
707
+	 *
708
+	 * @access public
709
+	 * @param array $req_data This is the $_POST & $_GET data sent from EE_Admin Pages
710
+	 * @return bool success/fail
711
+	 * @throws EE_Error
712
+	 * @throws InvalidArgumentException
713
+	 * @throws InvalidDataTypeException
714
+	 * @throws InvalidInterfaceException
715
+	 * @throws ReflectionException
716
+	 */
717
+	public static function process_resend($req_data)
718
+	{
719
+		self::_load_controller();
720
+
721
+		// if $msgID in this request then skip to the new resend_message
722
+		if (EE_Registry::instance()->REQ->get('MSG_ID')) {
723
+			return self::resend_message();
724
+		}
725
+
726
+		// make sure any incoming request data is set on the REQ so that it gets picked up later.
727
+		$req_data = (array) $req_data;
728
+		foreach ($req_data as $request_key => $request_value) {
729
+			EE_Registry::instance()->REQ->set($request_key, $request_value);
730
+		}
731
+
732
+		if (! $messages_to_send = self::$_MSG_PROCESSOR->setup_messages_to_generate_from_registration_ids_in_request(
733
+		)) {
734
+			return false;
735
+		}
736
+
737
+		try {
738
+			self::$_MSG_PROCESSOR->batch_queue_for_generation_and_persist($messages_to_send);
739
+			self::$_MSG_PROCESSOR->get_queue()->initiate_request_by_priority();
740
+		} catch (EE_Error $e) {
741
+			EE_Error::add_error($e->getMessage(), __FILE__, __FUNCTION__, __LINE__);
742
+			return false;
743
+		}
744
+		EE_Error::add_success(
745
+			__('Messages have been successfully queued for generation and sending.', 'event_espresso')
746
+		);
747
+		return true; // everything got queued.
748
+	}
749
+
750
+
751
+	/**
752
+	 * Message triggers for a resending already sent message(s) (via EE_Message list table)
753
+	 *
754
+	 * @return bool
755
+	 * @throws EE_Error
756
+	 * @throws InvalidArgumentException
757
+	 * @throws InvalidDataTypeException
758
+	 * @throws InvalidInterfaceException
759
+	 * @throws ReflectionException
760
+	 */
761
+	public static function resend_message()
762
+	{
763
+		self::_load_controller();
764
+
765
+		$msgID = EE_Registry::instance()->REQ->get('MSG_ID');
766
+		if (! $msgID) {
767
+			EE_Error::add_error(
768
+				__(
769
+					'Something went wrong because there is no "MSG_ID" value in the request',
770
+					'event_espresso'
771
+				),
772
+				__FILE__,
773
+				__FUNCTION__,
774
+				__LINE__
775
+			);
776
+			return false;
777
+		}
778
+
779
+		self::$_MSG_PROCESSOR->setup_messages_from_ids_and_send((array) $msgID);
780
+
781
+		// setup success message.
782
+		$count_ready_for_resend = self::$_MSG_PROCESSOR->get_queue()->count_STS_in_queue(EEM_Message::status_resend);
783
+		EE_Error::add_success(
784
+			sprintf(
785
+				_n(
786
+					'There was %d message queued for resending.',
787
+					'There were %d messages queued for resending.',
788
+					$count_ready_for_resend,
789
+					'event_espresso'
790
+				),
791
+				$count_ready_for_resend
792
+			)
793
+		);
794
+		return true;
795
+	}
796
+
797
+
798
+	/**
799
+	 * Message triggers for manual payment applied by admin
800
+	 *
801
+	 * @param  EE_Payment $payment EE_payment object
802
+	 * @return bool success/fail
803
+	 * @throws EE_Error
804
+	 * @throws InvalidArgumentException
805
+	 * @throws ReflectionException
806
+	 * @throws InvalidDataTypeException
807
+	 * @throws InvalidInterfaceException
808
+	 */
809
+	public static function process_admin_payment(EE_Payment $payment)
810
+	{
811
+		EE_Registry::instance()->load_helper('MSG_Template');
812
+		// we need to get the transaction object
813
+		$transaction = $payment->transaction();
814
+		if ($transaction instanceof EE_Transaction) {
815
+			$data = array($transaction, $payment);
816
+			$message_type = EEH_MSG_Template::convert_payment_status_to_message_type($payment->STS_ID());
817
+
818
+			// if payment amount is less than 0 then switch to payment_refund message type.
819
+			$message_type = $payment->amount() < 0 ? 'payment_refund' : $message_type;
820
+
821
+			// if payment_refund is selected, but the status is NOT accepted.  Then change message type to false so NO message notification goes out.
822
+			$message_type = $message_type == 'payment_refund' && $payment->STS_ID() != EEM_Payment::status_id_approved
823
+				? false : $message_type;
824
+
825
+			self::_load_controller();
826
+
827
+			self::$_MSG_PROCESSOR->generate_for_all_active_messengers($message_type, $data);
828
+
829
+			// get count of queued for generation
830
+			$count_to_generate = self::$_MSG_PROCESSOR->get_queue()->count_STS_in_queue(
831
+				array(
832
+					EEM_Message::status_incomplete,
833
+					EEM_Message::status_idle,
834
+				)
835
+			);
836
+
837
+			if ($count_to_generate > 0 && self::$_MSG_PROCESSOR->get_queue()->get_message_repository()->count() !== 0) {
838
+				add_filter('FHEE__EE_Admin_Page___process_admin_payment_notification__success', '__return_true');
839
+				return true;
840
+			} else {
841
+				$count_failed = self::$_MSG_PROCESSOR->get_queue()->count_STS_in_queue(
842
+					EEM_Message::instance()->stati_indicating_failed_sending()
843
+				);
844
+				/**
845
+				 * Verify that there are actually errors.  If not then we return a success message because the queue might have been emptied due to successful
846
+				 * IMMEDIATE generation.
847
+				 */
848
+				if ($count_failed > 0) {
849
+					EE_Error::add_error(
850
+						sprintf(
851
+							_n(
852
+								'The payment notification generation failed.',
853
+								'%d payment notifications failed being sent.',
854
+								$count_failed,
855
+								'event_espresso'
856
+							),
857
+							$count_failed
858
+						),
859
+						__FILE__,
860
+						__FUNCTION__,
861
+						__LINE__
862
+					);
863
+
864
+					return false;
865
+				} else {
866
+					add_filter('FHEE__EE_Admin_Page___process_admin_payment_notification__success', '__return_true');
867
+					return true;
868
+				}
869
+			}
870
+		} else {
871
+			EE_Error::add_error(
872
+				'Unable to generate the payment notification because the given value for the transaction is invalid.',
873
+				'event_espresso'
874
+			);
875
+			return false;
876
+		}
877
+	}
878
+
879
+
880
+	/**
881
+	 * Callback for AHEE__Extend_Registrations_Admin_Page___newsletter_selected_send_with_registrations trigger
882
+	 *
883
+	 * @since   4.3.0
884
+	 * @param  EE_Registration[] $registrations an array of EE_Registration objects
885
+	 * @param  int               $grp_id        a specific message template group id.
886
+	 * @return void
887
+	 * @throws EE_Error
888
+	 * @throws InvalidArgumentException
889
+	 * @throws InvalidDataTypeException
890
+	 * @throws InvalidInterfaceException
891
+	 * @throws ReflectionException
892
+	 */
893
+	public static function send_newsletter_message($registrations, $grp_id)
894
+	{
895
+		// make sure mtp is id and set it in the EE_Request Handler later messages setup.
896
+		EE_Registry::instance()->REQ->set('GRP_ID', (int) $grp_id);
897
+		self::_load_controller();
898
+		self::$_MSG_PROCESSOR->generate_for_all_active_messengers('newsletter', $registrations);
899
+	}
900
+
901
+
902
+	/**
903
+	 * Callback for FHEE__EE_Registration__invoice_url__invoice_url or FHEE__EE_Registration__receipt_url__receipt_url
904
+	 *
905
+	 * @since   4.3.0
906
+	 * @param    string          $registration_message_trigger_url
907
+	 * @param    EE_Registration $registration
908
+	 * @param string             $messenger
909
+	 * @param string             $message_type
910
+	 * @return string
911
+	 * @throws EE_Error
912
+	 * @throws InvalidArgumentException
913
+	 * @throws InvalidDataTypeException
914
+	 * @throws InvalidInterfaceException
915
+	 */
916
+	public static function registration_message_trigger_url(
917
+		$registration_message_trigger_url,
918
+		EE_Registration $registration,
919
+		$messenger = 'html',
920
+		$message_type = 'invoice'
921
+	) {
922
+		// whitelist $messenger
923
+		switch ($messenger) {
924
+			case 'pdf':
925
+				$sending_messenger = 'pdf';
926
+				$generating_messenger = 'html';
927
+				break;
928
+			case 'html':
929
+			default:
930
+				$sending_messenger = 'html';
931
+				$generating_messenger = 'html';
932
+				break;
933
+		}
934
+		// whitelist $message_type
935
+		switch ($message_type) {
936
+			case 'receipt':
937
+				$message_type = 'receipt';
938
+				break;
939
+			case 'invoice':
940
+			default:
941
+				$message_type = 'invoice';
942
+				break;
943
+		}
944
+		// verify that both the messenger AND the message type are active
945
+		if (EEH_MSG_Template::is_messenger_active($sending_messenger)
946
+			&& EEH_MSG_Template::is_mt_active($message_type)
947
+		) {
948
+			// 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?)
949
+			$template_query_params = array(
950
+				'MTP_is_active'    => true,
951
+				'MTP_messenger'    => $generating_messenger,
952
+				'MTP_message_type' => $message_type,
953
+				'Event.EVT_ID'     => $registration->event_ID(),
954
+			);
955
+			// get the message template group.
956
+			$msg_template_group = EEM_Message_Template_Group::instance()->get_one(array($template_query_params));
957
+			// if we don't have an EE_Message_Template_Group then return
958
+			if (! $msg_template_group instanceof EE_Message_Template_Group) {
959
+				// remove EVT_ID from query params so that global templates get picked up
960
+				unset($template_query_params['Event.EVT_ID']);
961
+				// get global template as the fallback
962
+				$msg_template_group = EEM_Message_Template_Group::instance()->get_one(array($template_query_params));
963
+			}
964
+			// if we don't have an EE_Message_Template_Group then return
965
+			if (! $msg_template_group instanceof EE_Message_Template_Group) {
966
+				return '';
967
+			}
968
+			// generate the URL
969
+			$registration_message_trigger_url = EEH_MSG_Template::generate_url_trigger(
970
+				$sending_messenger,
971
+				$generating_messenger,
972
+				'purchaser',
973
+				$message_type,
974
+				$registration,
975
+				$msg_template_group->ID(),
976
+				$registration->transaction_ID()
977
+			);
978
+		}
979
+		return $registration_message_trigger_url;
980
+	}
981
+
982
+
983
+	/**
984
+	 * Use to generate and return a message preview!
985
+	 *
986
+	 * @param  string $type      This should correspond with a valid message type
987
+	 * @param  string $context   This should correspond with a valid context for the message type
988
+	 * @param  string $messenger This should correspond with a valid messenger.
989
+	 * @param bool    $send      true we will do a test send using the messenger delivery, false we just do a regular
990
+	 *                           preview
991
+	 * @return bool|string The body of the message or if send is requested, sends.
992
+	 * @throws EE_Error
993
+	 * @throws InvalidArgumentException
994
+	 * @throws InvalidDataTypeException
995
+	 * @throws InvalidInterfaceException
996
+	 * @throws ReflectionException
997
+	 */
998
+	public static function preview_message($type, $context, $messenger, $send = false)
999
+	{
1000
+		self::_load_controller();
1001
+		$mtg = new EE_Message_To_Generate(
1002
+			$messenger,
1003
+			$type,
1004
+			array(),
1005
+			$context,
1006
+			true
1007
+		);
1008
+		$generated_preview_queue = self::$_MSG_PROCESSOR->generate_for_preview($mtg, $send);
1009
+		if ($generated_preview_queue instanceof EE_Messages_Queue) {
1010
+			// loop through all content for the preview and remove any persisted records.
1011
+			$content = '';
1012
+			foreach ($generated_preview_queue->get_message_repository() as $message) {
1013
+				$content = $message->content();
1014
+				if ($message->ID() > 0 && $message->STS_ID() !== EEM_Message::status_failed) {
1015
+					$message->delete();
1016
+				}
1017
+			}
1018
+			return $content;
1019
+		} else {
1020
+			return $generated_preview_queue;
1021
+		}
1022
+	}
1023
+
1024
+
1025
+	/**
1026
+	 * This is a method that allows for sending a message using a messenger matching the string given and the provided
1027
+	 * EE_Message_Queue object.  The EE_Message_Queue object is used to create a single aggregate EE_Message via the
1028
+	 * content found in the EE_Message objects in the queue.
1029
+	 *
1030
+	 * @since 4.9.0
1031
+	 * @param string            $messenger            a string matching a valid active messenger in the system
1032
+	 * @param string            $message_type         Although it seems contrary to the name of the method, a message
1033
+	 *                                                type name is still required to send along the message type to the
1034
+	 *                                                messenger because this is used for determining what specific
1035
+	 *                                                variations might be loaded for the generated message.
1036
+	 * @param EE_Messages_Queue $queue
1037
+	 * @param string            $custom_subject       Can be used to set what the custom subject string will be on the
1038
+	 *                                                aggregate EE_Message object.
1039
+	 * @return bool success or fail.
1040
+	 * @throws EE_Error
1041
+	 * @throws InvalidArgumentException
1042
+	 * @throws ReflectionException
1043
+	 * @throws InvalidDataTypeException
1044
+	 * @throws InvalidInterfaceException
1045
+	 */
1046
+	public static function send_message_with_messenger_only(
1047
+		$messenger,
1048
+		$message_type,
1049
+		EE_Messages_Queue $queue,
1050
+		$custom_subject = ''
1051
+	) {
1052
+		self::_load_controller();
1053
+		/** @type EE_Message_To_Generate_From_Queue $message_to_generate */
1054
+		$message_to_generate = EE_Registry::instance()->load_lib(
1055
+			'Message_To_Generate_From_Queue',
1056
+			array(
1057
+				$messenger,
1058
+				$message_type,
1059
+				$queue,
1060
+				$custom_subject,
1061
+			)
1062
+		);
1063
+		return self::$_MSG_PROCESSOR->queue_for_sending($message_to_generate);
1064
+	}
1065
+
1066
+
1067
+	/**
1068
+	 * Generates Messages immediately for EE_Message IDs (but only for the correct status for generation)
1069
+	 *
1070
+	 * @since 4.9.0
1071
+	 * @param array $message_ids An array of message ids
1072
+	 * @return bool|EE_Messages_Queue false if nothing was generated, EE_Messages_Queue containing generated
1073
+	 *                           messages.
1074
+	 * @throws EE_Error
1075
+	 * @throws InvalidArgumentException
1076
+	 * @throws InvalidDataTypeException
1077
+	 * @throws InvalidInterfaceException
1078
+	 * @throws ReflectionException
1079
+	 */
1080
+	public static function generate_now($message_ids)
1081
+	{
1082
+		self::_load_controller();
1083
+		$messages = EEM_Message::instance()->get_all(
1084
+			array(
1085
+				0 => array(
1086
+					'MSG_ID' => array('IN', $message_ids),
1087
+					'STS_ID' => EEM_Message::status_incomplete,
1088
+				),
1089
+			)
1090
+		);
1091
+		$generated_queue = false;
1092
+		if ($messages) {
1093
+			$generated_queue = self::$_MSG_PROCESSOR->batch_generate_from_queue($messages);
1094
+		}
1095
+
1096
+		if (! $generated_queue instanceof EE_Messages_Queue) {
1097
+			EE_Error::add_error(
1098
+				__(
1099
+					'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.',
1100
+					'event_espresso'
1101
+				),
1102
+				__FILE__,
1103
+				__FUNCTION__,
1104
+				__LINE__
1105
+			);
1106
+		}
1107
+		return $generated_queue;
1108
+	}
1109
+
1110
+
1111
+	/**
1112
+	 * Sends messages immediately for the incoming message_ids that have the status of EEM_Message::status_resend or,
1113
+	 * EEM_Message::status_idle
1114
+	 *
1115
+	 * @since 4.9.0
1116
+	 * @param $message_ids
1117
+	 * @return bool|EE_Messages_Queue false if no messages sent.
1118
+	 * @throws EE_Error
1119
+	 * @throws InvalidArgumentException
1120
+	 * @throws InvalidDataTypeException
1121
+	 * @throws InvalidInterfaceException
1122
+	 * @throws ReflectionException
1123
+	 */
1124
+	public static function send_now($message_ids)
1125
+	{
1126
+		self::_load_controller();
1127
+		$messages = EEM_Message::instance()->get_all(
1128
+			array(
1129
+				0 => array(
1130
+					'MSG_ID' => array('IN', $message_ids),
1131
+					'STS_ID' => array(
1132
+						'IN',
1133
+						array(EEM_Message::status_idle, EEM_Message::status_resend, EEM_Message::status_retry),
1134
+					),
1135
+				),
1136
+			)
1137
+		);
1138
+		$sent_queue = false;
1139
+		if ($messages) {
1140
+			$sent_queue = self::$_MSG_PROCESSOR->batch_send_from_queue($messages);
1141
+		}
1142
+
1143
+		if (! $sent_queue instanceof EE_Messages_Queue) {
1144
+			EE_Error::add_error(
1145
+				__(
1146
+					'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.',
1147
+					'event_espresso'
1148
+				),
1149
+				__FILE__,
1150
+				__FUNCTION__,
1151
+				__LINE__
1152
+			);
1153
+		} else {
1154
+			// can count how many sent by using the messages in the queue
1155
+			$sent_count = $sent_queue->count_STS_in_queue(EEM_Message::instance()->stati_indicating_sent());
1156
+			if ($sent_count > 0) {
1157
+				EE_Error::add_success(
1158
+					sprintf(
1159
+						_n(
1160
+							'There was %d message successfully sent.',
1161
+							'There were %d messages successfully sent.',
1162
+							$sent_count,
1163
+							'event_espresso'
1164
+						),
1165
+						$sent_count
1166
+					)
1167
+				);
1168
+			} else {
1169
+				EE_Error::overwrite_errors();
1170
+				EE_Error::add_error(
1171
+					__(
1172
+						'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.
1173 1173
 					If there was an error, you can look at the messages in the message activity list table for any error messages.',
1174
-                        'event_espresso'
1175
-                    ),
1176
-                    __FILE__,
1177
-                    __FUNCTION__,
1178
-                    __LINE__
1179
-                );
1180
-            }
1181
-        }
1182
-        return $sent_queue;
1183
-    }
1184
-
1185
-
1186
-    /**
1187
-     * Generate and send immediately from the given $message_ids
1188
-     *
1189
-     * @param array $message_ids EE_Message entity ids.
1190
-     * @throws EE_Error
1191
-     * @throws InvalidArgumentException
1192
-     * @throws InvalidDataTypeException
1193
-     * @throws InvalidInterfaceException
1194
-     * @throws ReflectionException
1195
-     */
1196
-    public static function generate_and_send_now(array $message_ids)
1197
-    {
1198
-        $generated_queue = self::generate_now($message_ids);
1199
-        // now let's just trigger sending immediately from this queue.
1200
-        $messages_sent = $generated_queue instanceof EE_Messages_Queue
1201
-            ? $generated_queue->execute()
1202
-            : 0;
1203
-        if ($messages_sent) {
1204
-            EE_Error::add_success(
1205
-                esc_html(
1206
-                    sprintf(
1207
-                        _n(
1208
-                            'There was %d message successfully generated and sent.',
1209
-                            'There were %d messages successfully generated and sent.',
1210
-                            $messages_sent,
1211
-                            'event_espresso'
1212
-                        ),
1213
-                        $messages_sent
1214
-                    )
1215
-                )
1216
-            );
1217
-            // errors would be added via the generate_now method.
1218
-        }
1219
-    }
1220
-
1221
-
1222
-    /**
1223
-     * This will queue the incoming message ids for resending.
1224
-     * Note, only message_ids corresponding to messages with the status of EEM_Message::sent will be queued.
1225
-     *
1226
-     * @since 4.9.0
1227
-     * @param array $message_ids An array of EE_Message IDs
1228
-     * @return bool true means messages were successfully queued for resending, false means none were queued for
1229
-     *                           resending.
1230
-     * @throws EE_Error
1231
-     * @throws InvalidArgumentException
1232
-     * @throws InvalidDataTypeException
1233
-     * @throws InvalidInterfaceException
1234
-     * @throws ReflectionException
1235
-     */
1236
-    public static function queue_for_resending($message_ids)
1237
-    {
1238
-        self::_load_controller();
1239
-        self::$_MSG_PROCESSOR->setup_messages_from_ids_and_send($message_ids);
1240
-
1241
-        // get queue and count
1242
-        $queue_count = self::$_MSG_PROCESSOR->get_queue()->count_STS_in_queue(EEM_Message::status_resend);
1243
-
1244
-        if ($queue_count > 0
1245
-        ) {
1246
-            EE_Error::add_success(
1247
-                sprintf(
1248
-                    _n(
1249
-                        '%d message successfully queued for resending.',
1250
-                        '%d messages successfully queued for resending.',
1251
-                        $queue_count,
1252
-                        'event_espresso'
1253
-                    ),
1254
-                    $queue_count
1255
-                )
1256
-            );
1257
-            /**
1258
-             * @see filter usage in EE_Messages_Queue::initiate_request_by_priority
1259
-             */
1260
-        } elseif (apply_filters('FHEE__EE_Messages_Processor__initiate_request_by_priority__do_immediate_processing', true)
1261
-            || EE_Registry::instance()->NET_CFG->core->do_messages_on_same_request
1262
-        ) {
1263
-            $queue_count = self::$_MSG_PROCESSOR->get_queue()->count_STS_in_queue(EEM_Message::status_sent);
1264
-            if ($queue_count > 0) {
1265
-                EE_Error::add_success(
1266
-                    sprintf(
1267
-                        _n(
1268
-                            '%d message successfully sent.',
1269
-                            '%d messages successfully sent.',
1270
-                            $queue_count,
1271
-                            'event_espresso'
1272
-                        ),
1273
-                        $queue_count
1274
-                    )
1275
-                );
1276
-            } else {
1277
-                EE_Error::add_error(
1278
-                    __(
1279
-                        '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.',
1280
-                        'event_espresso'
1281
-                    ),
1282
-                    __FILE__,
1283
-                    __FUNCTION__,
1284
-                    __LINE__
1285
-                );
1286
-            }
1287
-        } else {
1288
-            EE_Error::add_error(
1289
-                __(
1290
-                    '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.',
1291
-                    'event_espresso'
1292
-                ),
1293
-                __FILE__,
1294
-                __FUNCTION__,
1295
-                __LINE__
1296
-            );
1297
-        }
1298
-        return (bool) $queue_count;
1299
-    }
1300
-
1301
-
1302
-    /**
1303
-     * debug
1304
-     *
1305
-     * @param string          $class
1306
-     * @param string          $func
1307
-     * @param string          $line
1308
-     * @param \EE_Transaction $transaction
1309
-     * @param array           $info
1310
-     * @param bool            $display_request
1311
-     * @throws EE_Error
1312
-     * @throws \EventEspresso\core\exceptions\InvalidSessionDataException
1313
-     */
1314
-    protected static function log(
1315
-        $class = '',
1316
-        $func = '',
1317
-        $line = '',
1318
-        EE_Transaction $transaction,
1319
-        $info = array(),
1320
-        $display_request = false
1321
-    ) {
1322
-        if (defined('EE_DEBUG') && EE_DEBUG) {
1323
-            if ($transaction instanceof EE_Transaction) {
1324
-                // don't serialize objects
1325
-                $info = EEH_Debug_Tools::strip_objects($info);
1326
-                $info['TXN_status'] = $transaction->status_ID();
1327
-                $info['TXN_reg_steps'] = $transaction->reg_steps();
1328
-                if ($transaction->ID()) {
1329
-                    $index = 'EE_Transaction: ' . $transaction->ID();
1330
-                    EEH_Debug_Tools::log($class, $func, $line, $info, $display_request, $index);
1331
-                }
1332
-            }
1333
-        }
1334
-    }
1335
-
1336
-
1337
-    /**
1338
-     *  Resets all the static properties in this class when called.
1339
-     */
1340
-    public static function reset()
1341
-    {
1342
-        self::$_EEMSG = null;
1343
-        self::$_message_resource_manager = null;
1344
-        self::$_MSG_PROCESSOR = null;
1345
-        self::$_MSG_PATHS = null;
1346
-        self::$_TMP_PACKS = array();
1347
-    }
1174
+						'event_espresso'
1175
+					),
1176
+					__FILE__,
1177
+					__FUNCTION__,
1178
+					__LINE__
1179
+				);
1180
+			}
1181
+		}
1182
+		return $sent_queue;
1183
+	}
1184
+
1185
+
1186
+	/**
1187
+	 * Generate and send immediately from the given $message_ids
1188
+	 *
1189
+	 * @param array $message_ids EE_Message entity ids.
1190
+	 * @throws EE_Error
1191
+	 * @throws InvalidArgumentException
1192
+	 * @throws InvalidDataTypeException
1193
+	 * @throws InvalidInterfaceException
1194
+	 * @throws ReflectionException
1195
+	 */
1196
+	public static function generate_and_send_now(array $message_ids)
1197
+	{
1198
+		$generated_queue = self::generate_now($message_ids);
1199
+		// now let's just trigger sending immediately from this queue.
1200
+		$messages_sent = $generated_queue instanceof EE_Messages_Queue
1201
+			? $generated_queue->execute()
1202
+			: 0;
1203
+		if ($messages_sent) {
1204
+			EE_Error::add_success(
1205
+				esc_html(
1206
+					sprintf(
1207
+						_n(
1208
+							'There was %d message successfully generated and sent.',
1209
+							'There were %d messages successfully generated and sent.',
1210
+							$messages_sent,
1211
+							'event_espresso'
1212
+						),
1213
+						$messages_sent
1214
+					)
1215
+				)
1216
+			);
1217
+			// errors would be added via the generate_now method.
1218
+		}
1219
+	}
1220
+
1221
+
1222
+	/**
1223
+	 * This will queue the incoming message ids for resending.
1224
+	 * Note, only message_ids corresponding to messages with the status of EEM_Message::sent will be queued.
1225
+	 *
1226
+	 * @since 4.9.0
1227
+	 * @param array $message_ids An array of EE_Message IDs
1228
+	 * @return bool true means messages were successfully queued for resending, false means none were queued for
1229
+	 *                           resending.
1230
+	 * @throws EE_Error
1231
+	 * @throws InvalidArgumentException
1232
+	 * @throws InvalidDataTypeException
1233
+	 * @throws InvalidInterfaceException
1234
+	 * @throws ReflectionException
1235
+	 */
1236
+	public static function queue_for_resending($message_ids)
1237
+	{
1238
+		self::_load_controller();
1239
+		self::$_MSG_PROCESSOR->setup_messages_from_ids_and_send($message_ids);
1240
+
1241
+		// get queue and count
1242
+		$queue_count = self::$_MSG_PROCESSOR->get_queue()->count_STS_in_queue(EEM_Message::status_resend);
1243
+
1244
+		if ($queue_count > 0
1245
+		) {
1246
+			EE_Error::add_success(
1247
+				sprintf(
1248
+					_n(
1249
+						'%d message successfully queued for resending.',
1250
+						'%d messages successfully queued for resending.',
1251
+						$queue_count,
1252
+						'event_espresso'
1253
+					),
1254
+					$queue_count
1255
+				)
1256
+			);
1257
+			/**
1258
+			 * @see filter usage in EE_Messages_Queue::initiate_request_by_priority
1259
+			 */
1260
+		} elseif (apply_filters('FHEE__EE_Messages_Processor__initiate_request_by_priority__do_immediate_processing', true)
1261
+			|| EE_Registry::instance()->NET_CFG->core->do_messages_on_same_request
1262
+		) {
1263
+			$queue_count = self::$_MSG_PROCESSOR->get_queue()->count_STS_in_queue(EEM_Message::status_sent);
1264
+			if ($queue_count > 0) {
1265
+				EE_Error::add_success(
1266
+					sprintf(
1267
+						_n(
1268
+							'%d message successfully sent.',
1269
+							'%d messages successfully sent.',
1270
+							$queue_count,
1271
+							'event_espresso'
1272
+						),
1273
+						$queue_count
1274
+					)
1275
+				);
1276
+			} else {
1277
+				EE_Error::add_error(
1278
+					__(
1279
+						'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.',
1280
+						'event_espresso'
1281
+					),
1282
+					__FILE__,
1283
+					__FUNCTION__,
1284
+					__LINE__
1285
+				);
1286
+			}
1287
+		} else {
1288
+			EE_Error::add_error(
1289
+				__(
1290
+					'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.',
1291
+					'event_espresso'
1292
+				),
1293
+				__FILE__,
1294
+				__FUNCTION__,
1295
+				__LINE__
1296
+			);
1297
+		}
1298
+		return (bool) $queue_count;
1299
+	}
1300
+
1301
+
1302
+	/**
1303
+	 * debug
1304
+	 *
1305
+	 * @param string          $class
1306
+	 * @param string          $func
1307
+	 * @param string          $line
1308
+	 * @param \EE_Transaction $transaction
1309
+	 * @param array           $info
1310
+	 * @param bool            $display_request
1311
+	 * @throws EE_Error
1312
+	 * @throws \EventEspresso\core\exceptions\InvalidSessionDataException
1313
+	 */
1314
+	protected static function log(
1315
+		$class = '',
1316
+		$func = '',
1317
+		$line = '',
1318
+		EE_Transaction $transaction,
1319
+		$info = array(),
1320
+		$display_request = false
1321
+	) {
1322
+		if (defined('EE_DEBUG') && EE_DEBUG) {
1323
+			if ($transaction instanceof EE_Transaction) {
1324
+				// don't serialize objects
1325
+				$info = EEH_Debug_Tools::strip_objects($info);
1326
+				$info['TXN_status'] = $transaction->status_ID();
1327
+				$info['TXN_reg_steps'] = $transaction->reg_steps();
1328
+				if ($transaction->ID()) {
1329
+					$index = 'EE_Transaction: ' . $transaction->ID();
1330
+					EEH_Debug_Tools::log($class, $func, $line, $info, $display_request, $index);
1331
+				}
1332
+			}
1333
+		}
1334
+	}
1335
+
1336
+
1337
+	/**
1338
+	 *  Resets all the static properties in this class when called.
1339
+	 */
1340
+	public static function reset()
1341
+	{
1342
+		self::$_EEMSG = null;
1343
+		self::$_message_resource_manager = null;
1344
+		self::$_MSG_PROCESSOR = null;
1345
+		self::$_MSG_PATHS = null;
1346
+		self::$_TMP_PACKS = array();
1347
+	}
1348 1348
 }
Please login to merge, or discard this patch.
Spacing   +27 added lines, -27 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
@@ -636,7 +636,7 @@  discard block
 block discarded – undo
636 636
         } else {
637 637
             // frontend request (either regular or via AJAX)
638 638
             // TXN is NOT finalized ?
639
-            if (! isset($extra_details['finalized']) || $extra_details['finalized'] === false) {
639
+            if ( ! isset($extra_details['finalized']) || $extra_details['finalized'] === false) {
640 640
                 return false;
641 641
             }
642 642
             // return visit but nothing changed ???
@@ -646,7 +646,7 @@  discard block
 block discarded – undo
646 646
                 return false;
647 647
             }
648 648
             // NOT sending messages && reg status is something other than "Not-Approved"
649
-            if (! apply_filters('FHEE__EED_Messages___maybe_registration__deliver_notifications', false) &&
649
+            if ( ! apply_filters('FHEE__EED_Messages___maybe_registration__deliver_notifications', false) &&
650 650
                 $registration->status_ID() !== EEM_Registration::status_id_not_approved
651 651
             ) {
652 652
                 return false;
@@ -729,7 +729,7 @@  discard block
 block discarded – undo
729 729
             EE_Registry::instance()->REQ->set($request_key, $request_value);
730 730
         }
731 731
 
732
-        if (! $messages_to_send = self::$_MSG_PROCESSOR->setup_messages_to_generate_from_registration_ids_in_request(
732
+        if ( ! $messages_to_send = self::$_MSG_PROCESSOR->setup_messages_to_generate_from_registration_ids_in_request(
733 733
         )) {
734 734
             return false;
735 735
         }
@@ -763,7 +763,7 @@  discard block
 block discarded – undo
763 763
         self::_load_controller();
764 764
 
765 765
         $msgID = EE_Registry::instance()->REQ->get('MSG_ID');
766
-        if (! $msgID) {
766
+        if ( ! $msgID) {
767 767
             EE_Error::add_error(
768 768
                 __(
769 769
                     'Something went wrong because there is no "MSG_ID" value in the request',
@@ -955,14 +955,14 @@  discard block
 block discarded – undo
955 955
             // get the message template group.
956 956
             $msg_template_group = EEM_Message_Template_Group::instance()->get_one(array($template_query_params));
957 957
             // if we don't have an EE_Message_Template_Group then return
958
-            if (! $msg_template_group instanceof EE_Message_Template_Group) {
958
+            if ( ! $msg_template_group instanceof EE_Message_Template_Group) {
959 959
                 // remove EVT_ID from query params so that global templates get picked up
960 960
                 unset($template_query_params['Event.EVT_ID']);
961 961
                 // get global template as the fallback
962 962
                 $msg_template_group = EEM_Message_Template_Group::instance()->get_one(array($template_query_params));
963 963
             }
964 964
             // if we don't have an EE_Message_Template_Group then return
965
-            if (! $msg_template_group instanceof EE_Message_Template_Group) {
965
+            if ( ! $msg_template_group instanceof EE_Message_Template_Group) {
966 966
                 return '';
967 967
             }
968 968
             // generate the URL
@@ -1093,7 +1093,7 @@  discard block
 block discarded – undo
1093 1093
             $generated_queue = self::$_MSG_PROCESSOR->batch_generate_from_queue($messages);
1094 1094
         }
1095 1095
 
1096
-        if (! $generated_queue instanceof EE_Messages_Queue) {
1096
+        if ( ! $generated_queue instanceof EE_Messages_Queue) {
1097 1097
             EE_Error::add_error(
1098 1098
                 __(
1099 1099
                     '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.',
@@ -1140,7 +1140,7 @@  discard block
 block discarded – undo
1140 1140
             $sent_queue = self::$_MSG_PROCESSOR->batch_send_from_queue($messages);
1141 1141
         }
1142 1142
 
1143
-        if (! $sent_queue instanceof EE_Messages_Queue) {
1143
+        if ( ! $sent_queue instanceof EE_Messages_Queue) {
1144 1144
             EE_Error::add_error(
1145 1145
                 __(
1146 1146
                     '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.',
@@ -1326,7 +1326,7 @@  discard block
 block discarded – undo
1326 1326
                 $info['TXN_status'] = $transaction->status_ID();
1327 1327
                 $info['TXN_reg_steps'] = $transaction->reg_steps();
1328 1328
                 if ($transaction->ID()) {
1329
-                    $index = 'EE_Transaction: ' . $transaction->ID();
1329
+                    $index = 'EE_Transaction: '.$transaction->ID();
1330 1330
                     EEH_Debug_Tools::log($class, $func, $line, $info, $display_request, $index);
1331 1331
                 }
1332 1332
             }
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.
modules/events_archive/EED_Events_Archive.module.php 3 patches
Doc Comments   +2 added lines, -2 removed lines patch added patch discarded remove patch
@@ -274,7 +274,7 @@  discard block
 block discarded – undo
274 274
 
275 275
     /**
276 276
      * @access public
277
-     * @return string
277
+     * @return boolean
278 278
      */
279 279
     public static function is_iframe()
280 280
     {
@@ -892,7 +892,7 @@  discard block
 block discarded – undo
892 892
      *    display_description
893 893
      *
894 894
      * @access    public
895
-     * @param $value
895
+     * @param integer $value
896 896
      * @return    bool
897 897
      */
898 898
     public static function display_description($value)
Please login to merge, or discard this patch.
Spacing   +16 added lines, -16 removed lines patch added patch discarded remove patch
@@ -123,8 +123,8 @@  discard block
 block discarded – undo
123 123
      */
124 124
     public static function set_definitions()
125 125
     {
126
-        define('EVENTS_ARCHIVE_ASSETS_URL', plugin_dir_url(__FILE__) . 'assets/');
127
-        define('EVENTS_ARCHIVE_TEMPLATES_PATH', str_replace('\\', '/', plugin_dir_path(__FILE__)) . 'templates/');
126
+        define('EVENTS_ARCHIVE_ASSETS_URL', plugin_dir_url(__FILE__).'assets/');
127
+        define('EVENTS_ARCHIVE_TEMPLATES_PATH', str_replace('\\', '/', plugin_dir_path(__FILE__)).'templates/');
128 128
     }
129 129
 
130 130
 
@@ -144,7 +144,7 @@  discard block
 block discarded – undo
144 144
      */
145 145
     public static function get_iframe_embed_button()
146 146
     {
147
-        if (! self::$_iframe_embed_button instanceof EventListIframeEmbedButton) {
147
+        if ( ! self::$_iframe_embed_button instanceof EventListIframeEmbedButton) {
148 148
             self::$_iframe_embed_button = new EventListIframeEmbedButton();
149 149
         }
150 150
         return self::$_iframe_embed_button;
@@ -227,10 +227,10 @@  discard block
 block discarded – undo
227 227
         EEH_Event_Query::add_query_filters();
228 228
         // set params that will get used by the filters
229 229
         EEH_Event_Query::set_query_params(
230
-            '',    // month
231
-            '',    // category
232
-            $config->display_expired_events,    // show_expired
233
-            'start_date',    // orderby
230
+            '', // month
231
+            '', // category
232
+            $config->display_expired_events, // show_expired
233
+            'start_date', // orderby
234 234
             'ASC'    // sort
235 235
         );
236 236
         // check what template is loaded
@@ -296,7 +296,7 @@  discard block
 block discarded – undo
296 296
     public function template_include($template = '')
297 297
     {
298 298
         // don't add content filter for dedicated EE child themes or private posts
299
-        if (! EEH_Template::is_espresso_theme()) {
299
+        if ( ! EEH_Template::is_espresso_theme()) {
300 300
             /** @type EE_Events_Archive_Config $config */
301 301
             $config = $this->config();
302 302
             // add status banner ?
@@ -394,7 +394,7 @@  discard block
 block discarded – undo
394 394
     {
395 395
         global $post;
396 396
         if ($post instanceof WP_Post) {
397
-            return in_the_loop() && $post->ID == $id ? espresso_event_status_banner($post->ID) . $title : $title;
397
+            return in_the_loop() && $post->ID == $id ? espresso_event_status_banner($post->ID).$title : $title;
398 398
         }
399 399
         return $title;
400 400
     }
@@ -544,7 +544,7 @@  discard block
 block discarded – undo
544 544
         if (post_password_required()) {
545 545
             return $content;
546 546
         }
547
-        return EEH_Template::locate_template('content-espresso_events-datetimes.php') . $content;
547
+        return EEH_Template::locate_template('content-espresso_events-datetimes.php').$content;
548 548
     }
549 549
 
550 550
 
@@ -560,7 +560,7 @@  discard block
 block discarded – undo
560 560
         if (post_password_required()) {
561 561
             return $content;
562 562
         }
563
-        return EEH_Template::locate_template('content-espresso_events-tickets.php') . $content;
563
+        return EEH_Template::locate_template('content-espresso_events-tickets.php').$content;
564 564
     }
565 565
 
566 566
 
@@ -589,7 +589,7 @@  discard block
 block discarded – undo
589 589
         if (post_password_required()) {
590 590
             return $content;
591 591
         }
592
-        return $content . EEH_Template::locate_template('content-espresso_events-venues.php');
592
+        return $content.EEH_Template::locate_template('content-espresso_events-venues.php');
593 593
     }
594 594
 
595 595
 
@@ -773,10 +773,10 @@  discard block
 block discarded – undo
773 773
         // get some style
774 774
         if (apply_filters('FHEE_enable_default_espresso_css', false)) {
775 775
             // first check uploads folder
776
-            if (EEH_File::is_readable(get_stylesheet_directory() . $this->theme . '/style.css')) {
776
+            if (EEH_File::is_readable(get_stylesheet_directory().$this->theme.'/style.css')) {
777 777
                 wp_register_style(
778 778
                     $this->theme,
779
-                    get_stylesheet_directory_uri() . $this->theme . '/style.css',
779
+                    get_stylesheet_directory_uri().$this->theme.'/style.css',
780 780
                     array('dashicons', 'espresso_default')
781 781
                 );
782 782
             } else {
@@ -815,7 +815,7 @@  discard block
 block discarded – undo
815 815
             (array) $template_settings->EED_Events_Archive
816 816
         );
817 817
         EEH_Template::display_template(
818
-            EVENTS_ARCHIVE_TEMPLATES_PATH . 'admin-event-list-settings.template.php',
818
+            EVENTS_ARCHIVE_TEMPLATES_PATH.'admin-event-list-settings.template.php',
819 819
             $events_archive_settings
820 820
         );
821 821
     }
@@ -833,7 +833,7 @@  discard block
 block discarded – undo
833 833
     {
834 834
         $CFG->EED_Events_Archive = new EE_Events_Archive_Config();
835 835
         // unless we are resetting the config...
836
-        if (! isset($REQ['EED_Events_Archive_reset_event_list_settings'])
836
+        if ( ! isset($REQ['EED_Events_Archive_reset_event_list_settings'])
837 837
             || absint($REQ['EED_Events_Archive_reset_event_list_settings']) !== 1
838 838
         ) {
839 839
             $CFG->EED_Events_Archive->display_status_banner = isset($REQ['EED_Events_Archive_display_status_banner'])
Please login to merge, or discard this patch.
Indentation   +1110 added lines, -1110 removed lines patch added patch discarded remove patch
@@ -16,1105 +16,1105 @@  discard block
 block discarded – undo
16 16
 class EED_Events_Archive extends EED_Module
17 17
 {
18 18
 
19
-    const EVENT_DETAILS_PRIORITY = 100;
20
-
21
-    const EVENT_DATETIMES_PRIORITY = 110;
22
-
23
-    const EVENT_TICKETS_PRIORITY = 120;
24
-
25
-    const EVENT_VENUES_PRIORITY = 130;
26
-
27
-
28
-    public static $espresso_event_list_ID = 0;
29
-
30
-    public static $espresso_grid_event_lists = array();
31
-
32
-    /**
33
-     * @type bool $using_get_the_excerpt
34
-     */
35
-    protected static $using_get_the_excerpt = false;
36
-
37
-    /**
38
-     * Used to flag when the event list is being called from an external iframe.
39
-     *
40
-     * @var bool $iframe
41
-     */
42
-    protected static $iframe = false;
43
-
44
-    /**
45
-     * @var EventListIframeEmbedButton $_iframe_embed_button
46
-     */
47
-    private static $_iframe_embed_button;
48
-
49
-    /**
50
-     * @type EE_Template_Part_Manager $template_parts
51
-     */
52
-    protected $template_parts;
53
-
54
-
55
-    /**
56
-     * @return EED_Events_Archive
57
-     */
58
-    public static function instance()
59
-    {
60
-        return parent::get_instance(__CLASS__);
61
-    }
62
-
63
-
64
-    /**
65
-     * set_hooks - for hooking into EE Core, other modules, etc
66
-     *
67
-     * @return void
68
-     * @throws InvalidArgumentException
69
-     * @throws InvalidDataTypeException
70
-     * @throws InvalidInterfaceException
71
-     */
72
-    public static function set_hooks()
73
-    {
74
-        /** @var EventEspresso\core\domain\entities\custom_post_types\CustomPostTypeDefinitions $custom_post_type_definitions */
75
-        $custom_post_type_definitions = LoaderFactory::getLoader()->getShared(
76
-            'EventEspresso\core\domain\entities\custom_post_types\CustomPostTypeDefinitions'
77
-        );
78
-        $custom_post_types = $custom_post_type_definitions->getDefinitions();
79
-        EE_Config::register_route(
80
-            $custom_post_types['espresso_events']['plural_slug'],
81
-            'Events_Archive',
82
-            'run'
83
-        );
84
-        EE_Config::register_route(
85
-            'event_list',
86
-            'Events_Archive',
87
-            'event_list'
88
-        );
89
-        EE_Config::register_route(
90
-            'iframe',
91
-            'Events_Archive',
92
-            'event_list_iframe',
93
-            'event_list'
94
-        );
95
-        add_action('wp_loaded', array('EED_Events_Archive', 'set_definitions'), 2);
96
-    }
97
-
98
-
99
-    /**
100
-     *    set_hooks_admin - for hooking into EE Admin Core, other modules, etc
101
-     *
102
-     * @access    public
103
-     * @return    void
104
-     */
105
-    public static function set_hooks_admin()
106
-    {
107
-        add_action('wp_loaded', array('EED_Events_Archive', 'set_definitions'), 2);
108
-        // hook into the end of the \EE_Admin_Page::_load_page_dependencies()
109
-        // to load assets for "espresso_events" page on the "default" route (action)
110
-        add_action(
111
-            'FHEE__EE_Admin_Page___load_page_dependencies__after_load__espresso_events__default',
112
-            array('EED_Events_Archive', 'event_list_iframe_embed_button'),
113
-            10
114
-        );
115
-    }
116
-
117
-
118
-    /**
119
-     *    set_definitions
120
-     *
121
-     * @access    public
122
-     * @return    void
123
-     */
124
-    public static function set_definitions()
125
-    {
126
-        define('EVENTS_ARCHIVE_ASSETS_URL', plugin_dir_url(__FILE__) . 'assets/');
127
-        define('EVENTS_ARCHIVE_TEMPLATES_PATH', str_replace('\\', '/', plugin_dir_path(__FILE__)) . 'templates/');
128
-    }
129
-
130
-
131
-    /**
132
-     * set up EE_Events_Archive_Config
133
-     */
134
-    protected function set_config()
135
-    {
136
-        $this->set_config_section('template_settings');
137
-        $this->set_config_class('EE_Events_Archive_Config');
138
-        $this->set_config_name('EED_Events_Archive');
139
-    }
140
-
141
-
142
-    /**
143
-     * @return EventListIframeEmbedButton
144
-     */
145
-    public static function get_iframe_embed_button()
146
-    {
147
-        if (! self::$_iframe_embed_button instanceof EventListIframeEmbedButton) {
148
-            self::$_iframe_embed_button = new EventListIframeEmbedButton();
149
-        }
150
-        return self::$_iframe_embed_button;
151
-    }
152
-
153
-
154
-    /**
155
-     * event_list_iframe_embed_button
156
-     *
157
-     * @return    void
158
-     * @throws EE_Error
159
-     */
160
-    public static function event_list_iframe_embed_button()
161
-    {
162
-        $iframe_embed_button = EED_Events_Archive::get_iframe_embed_button();
163
-        $iframe_embed_button->addEmbedButton();
164
-    }
165
-
166
-
167
-    /**
168
-     *    initialize_template_parts
169
-     *
170
-     * @access    public
171
-     * @param EE_Events_Archive_Config $config
172
-     * @return EE_Template_Part_Manager
173
-     * @throws EE_Error
174
-     */
175
-    public function initialize_template_parts(EE_Events_Archive_Config $config = null)
176
-    {
177
-        $config = $config instanceof EE_Events_Archive_Config ? $config : $this->config();
178
-        EEH_Autoloader::register_template_part_autoloaders();
179
-        $template_parts = new EE_Template_Part_Manager();
180
-        $template_parts->add_template_part(
181
-            'tickets',
182
-            __('Ticket Selector', 'event_espresso'),
183
-            'content-espresso_events-tickets.php',
184
-            $config->display_order_tickets
185
-        );
186
-        $template_parts->add_template_part(
187
-            'datetimes',
188
-            __('Dates and Times', 'event_espresso'),
189
-            'content-espresso_events-datetimes.php',
190
-            $config->display_order_datetimes
191
-        );
192
-        $template_parts->add_template_part(
193
-            'event',
194
-            __('Event Description', 'event_espresso'),
195
-            'content-espresso_events-details.php',
196
-            $config->display_order_event
197
-        );
198
-        $template_parts->add_template_part(
199
-            'venue',
200
-            __('Venue Information', 'event_espresso'),
201
-            'content-espresso_events-venues.php',
202
-            $config->display_order_venue
203
-        );
204
-        do_action('AHEE__EED_Event_Archive__initialize_template_parts', $template_parts);
205
-        return $template_parts;
206
-    }
207
-
208
-
209
-    /**
210
-     *    run - initial module setup - this gets called by the EE_Front_Controller if the module route is found in the
211
-     *    incoming request
212
-     *
213
-     * @access    public
214
-     * @param WP $WP
215
-     * @return    void
216
-     */
217
-    public function run($WP)
218
-    {
219
-        do_action('AHEE__EED_Events_Archive__before_run');
220
-        // ensure valid EE_Events_Archive_Config() object exists
221
-        $this->set_config();
222
-        /** @type EE_Events_Archive_Config $config */
223
-        $config = $this->config();
224
-        // load other required components
225
-        $this->load_event_list_assets();
226
-        // filter the WP posts_join, posts_where, and posts_orderby SQL clauses
227
-        // add query filters
228
-        EEH_Event_Query::add_query_filters();
229
-        // set params that will get used by the filters
230
-        EEH_Event_Query::set_query_params(
231
-            '',    // month
232
-            '',    // category
233
-            $config->display_expired_events,    // show_expired
234
-            'start_date',    // orderby
235
-            'ASC'    // sort
236
-        );
237
-        // check what template is loaded
238
-        add_filter('template_include', array($this, 'template_include'), 999, 1);
239
-    }
240
-
241
-
242
-    /**
243
-     * most likely called by the ESPRESSO_EVENTS shortcode which uses this module to do some of it's lifting
244
-     *
245
-     * @return    void
246
-     */
247
-    public function event_list()
248
-    {
249
-        // ensure valid EE_Events_Archive_Config() object exists
250
-        $this->set_config();
251
-        // load other required components
252
-        $this->load_event_list_assets();
253
-    }
254
-
255
-
256
-    /**
257
-     * @access    public
258
-     * @return    void
259
-     * @throws EE_Error
260
-     * @throws DomainException
261
-     */
262
-    public function event_list_iframe()
263
-    {
264
-        EED_Events_Archive::$iframe = true;
265
-        $event_list_iframe = new EventsArchiveIframe($this);
266
-        $event_list_iframe->display();
267
-    }
268
-
269
-
270
-    /**
271
-     * @access public
272
-     * @return string
273
-     */
274
-    public static function is_iframe()
275
-    {
276
-        return EED_Events_Archive::$iframe;
277
-    }
278
-
279
-
280
-    /**
281
-     * @access public
282
-     * @return string
283
-     */
284
-    public static function link_target()
285
-    {
286
-        return EED_Events_Archive::$iframe ? ' target="_blank"' : '';
287
-    }
288
-
289
-
290
-    /**
291
-     *    template_include
292
-     *
293
-     * @access    public
294
-     * @param string $template
295
-     * @return    string
296
-     */
297
-    public function template_include($template = '')
298
-    {
299
-        // don't add content filter for dedicated EE child themes or private posts
300
-        if (! EEH_Template::is_espresso_theme()) {
301
-            /** @type EE_Events_Archive_Config $config */
302
-            $config = $this->config();
303
-            // add status banner ?
304
-            if ($config->display_status_banner) {
305
-                add_filter('the_title', array('EED_Events_Archive', 'the_title'), 100, 2);
306
-            }
307
-            // if NOT a custom template
308
-            if (apply_filters('FHEE__EED_Event_Archive__template_include__allow_custom_selected_template', false)
309
-                || EE_Registry::instance()
310
-                              ->load_core('Front_Controller')
311
-                              ->get_selected_template() !== 'archive-espresso_events.php'
312
-            ) {
313
-                // don't display entry meta because the existing theme will take care of that
314
-                add_filter('FHEE__EED_Events_Archive__template_include__events_list_active', '__return_true');
315
-                // load functions.php file for the theme (loaded by WP if using child theme)
316
-                EEH_Template::load_espresso_theme_functions();
317
-                // because we don't know if the theme is using the_excerpt()
318
-                add_filter(
319
-                    'the_excerpt',
320
-                    array('EED_Events_Archive', 'event_details'),
321
-                    EED_Events_Archive::EVENT_DETAILS_PRIORITY
322
-                );
323
-                // or the_content
324
-                add_filter(
325
-                    'the_content',
326
-                    array('EED_Events_Archive', 'event_details'),
327
-                    EED_Events_Archive::EVENT_DETAILS_PRIORITY
328
-                );
329
-                // and just in case they are running get_the_excerpt() which DESTROYS things
330
-                add_filter('get_the_excerpt', array('EED_Events_Archive', 'get_the_excerpt'), 1, 1);
331
-                // don't display entry meta because the existing theme will take care of that
332
-                add_filter('FHEE__content_espresso_events_details_template__display_entry_meta', '__return_false');
333
-            }
334
-        }
335
-        return $template;
336
-    }
337
-
338
-
339
-    /**
340
-     *    get_the_excerpt - kinda hacky, but if a theme is using get_the_excerpt(), then we need to remove our filters
341
-     *    on the_content()
342
-     *
343
-     * @access    public
344
-     * @param        string $excerpt
345
-     * @return        string
346
-     */
347
-    public static function get_the_excerpt($excerpt = '')
348
-    {
349
-        if (post_password_required()) {
350
-            return $excerpt;
351
-        }
352
-        if (apply_filters('FHEE__EED_Events_Archive__get_the_excerpt__theme_uses_get_the_excerpt', false)) {
353
-            remove_filter(
354
-                'the_excerpt',
355
-                array('EED_Events_Archive', 'event_details'),
356
-                EED_Events_Archive::EVENT_DETAILS_PRIORITY
357
-            );
358
-            remove_filter(
359
-                'the_content',
360
-                array('EED_Events_Archive', 'event_details'),
361
-                EED_Events_Archive::EVENT_DETAILS_PRIORITY
362
-            );
363
-            $excerpt = EED_Events_Archive::event_details($excerpt);
364
-        } else {
365
-            EED_Events_Archive::$using_get_the_excerpt = true;
366
-            add_filter('wp_trim_excerpt', array('EED_Events_Archive', 'end_get_the_excerpt'), 999, 1);
367
-        }
368
-        return $excerpt;
369
-    }
370
-
371
-
372
-    /**
373
-     * end_get_the_excerpt
374
-     *
375
-     * @access public
376
-     * @param  string $text
377
-     * @return string
378
-     */
379
-    public static function end_get_the_excerpt($text = '')
380
-    {
381
-        EED_Events_Archive::$using_get_the_excerpt = false;
382
-        return $text;
383
-    }
384
-
385
-
386
-    /**
387
-     *    the_title
388
-     *
389
-     * @access        public
390
-     * @param        string $title
391
-     * @param        string $id
392
-     * @return        string
393
-     */
394
-    public static function the_title($title = '', $id = '')
395
-    {
396
-        global $post;
397
-        if ($post instanceof WP_Post) {
398
-            return in_the_loop() && $post->ID == $id ? espresso_event_status_banner($post->ID) . $title : $title;
399
-        }
400
-        return $title;
401
-    }
402
-
403
-
404
-    /**
405
-     *    event_details
406
-     *
407
-     * @access    public
408
-     * @param        string $content
409
-     * @return        string
410
-     */
411
-    public static function event_details($content)
412
-    {
413
-        global $post;
414
-        static $current_post_ID = 0;
415
-        if ($current_post_ID !== $post->ID
416
-            && $post->post_type === 'espresso_events'
417
-            && ! EED_Events_Archive::$using_get_the_excerpt
418
-            && ! post_password_required()
419
-            && (
420
-                apply_filters('FHEE__EES_Espresso_Events__process_shortcode__true', false)
421
-                || ! apply_filters('FHEE__content_espresso_events__template_loaded', false)
422
-            )
423
-        ) {
424
-            // Set current post ID to prevent showing content twice, but only if headers have definitely been sent.
425
-            // Reason being is that some plugins, like Yoast, need to run through a copy of the loop early
426
-            // BEFORE headers are sent in order to examine the post content and generate content for the HTML header.
427
-            // We want to allow those plugins to still do their thing and have access to our content, but depending on
428
-            // how your event content is being displayed (shortcode, CPT route, etc), this filter can get applied twice,
429
-            // so the following allows this filter to be applied multiple times, but only once for real
430
-            $current_post_ID = did_action('loop_start') ? $post->ID : 0;
431
-            if (EE_Registry::instance()->CFG->template_settings->EED_Events_Archive->use_sortable_display_order) {
432
-                $content = EED_Events_Archive::use_sortable_display_order();
433
-            } else {
434
-                $content = EED_Events_Archive::use_filterable_display_order();
435
-            }
436
-        }
437
-        return $content;
438
-    }
439
-
440
-
441
-    /**
442
-     *    use_sortable_display_order
443
-     *
444
-     * @access    protected
445
-     * @return string
446
-     */
447
-    protected static function use_sortable_display_order()
448
-    {
449
-        // no further password checks required atm
450
-        add_filter('FHEE__EED_Events_Archive__event_details__no_post_password_required', '__return_true');
451
-        // we need to first remove this callback from being applied to the_content() or the_excerpt()
452
-        // (otherwise it will recurse and blow up the interweb)
453
-        remove_filter(
454
-            'the_excerpt',
455
-            array('EED_Events_Archive', 'event_details'),
456
-            EED_Events_Archive::EVENT_DETAILS_PRIORITY
457
-        );
458
-        remove_filter(
459
-            'the_content',
460
-            array('EED_Events_Archive', 'event_details'),
461
-            EED_Events_Archive::EVENT_DETAILS_PRIORITY
462
-        );
463
-        remove_filter('get_the_excerpt', array('EED_Events_Archive', 'get_the_excerpt'), 1);
464
-        // now add additional content depending on whether event is using the_excerpt() or the_content()
465
-        EED_Events_Archive::instance()->template_parts = EED_Events_Archive::instance()->initialize_template_parts();
466
-        $content = EEH_Template::locate_template('content-espresso_events-details.php');
467
-        $content = EED_Events_Archive::instance()->template_parts->apply_template_part_filters($content);
468
-        // re-add our main filters (or else the next event won't have them)
469
-        add_filter(
470
-            'the_excerpt',
471
-            array('EED_Events_Archive', 'event_details'),
472
-            EED_Events_Archive::EVENT_DETAILS_PRIORITY
473
-        );
474
-        add_filter(
475
-            'the_content',
476
-            array('EED_Events_Archive', 'event_details'),
477
-            EED_Events_Archive::EVENT_DETAILS_PRIORITY
478
-        );
479
-        add_filter('get_the_excerpt', array('EED_Events_Archive', 'get_the_excerpt'), 1, 1);
480
-        remove_filter(
481
-            'FHEE__EED_Events_Archive__event_details__no_post_password_required',
482
-            '__return_true'
483
-        );
484
-        return $content;
485
-    }
486
-
487
-
488
-    /**
489
-     *    use_filterable_display_order
490
-     *
491
-     * @access    protected
492
-     * @return    string
493
-     */
494
-    protected static function use_filterable_display_order()
495
-    {
496
-        // we need to first remove this callback from being applied to the_content()
497
-        // (otherwise it will recurse and blow up the interweb)
498
-        remove_filter(
499
-            'the_excerpt',
500
-            array('EED_Events_Archive', 'event_details'),
501
-            EED_Events_Archive::EVENT_DETAILS_PRIORITY
502
-        );
503
-        remove_filter(
504
-            'the_content',
505
-            array('EED_Events_Archive', 'event_details'),
506
-            EED_Events_Archive::EVENT_DETAILS_PRIORITY
507
-        );
508
-        remove_filter('get_the_excerpt', array('EED_Events_Archive', 'get_the_excerpt'), 1);
509
-        // now add additional content depending on whether event is using the_excerpt() or the_content()
510
-        EED_Events_Archive::_add_additional_excerpt_filters();
511
-        EED_Events_Archive::_add_additional_content_filters();
512
-        do_action('AHEE__EED_Events_Archive__use_filterable_display_order__after_add_filters');
513
-        // now load our template
514
-        $content = EEH_Template::locate_template('content-espresso_events-details.php');
515
-        // re-add our main filters (or else the next event won't have them)
516
-        add_filter(
517
-            'the_excerpt',
518
-            array('EED_Events_Archive', 'event_details'),
519
-            EED_Events_Archive::EVENT_DETAILS_PRIORITY
520
-        );
521
-        add_filter(
522
-            'the_content',
523
-            array('EED_Events_Archive', 'event_details'),
524
-            EED_Events_Archive::EVENT_DETAILS_PRIORITY
525
-        );
526
-        add_filter('get_the_excerpt', array('EED_Events_Archive', 'get_the_excerpt'), 1, 1);
527
-        // but remove the other filters so that they don't get applied to the next post
528
-        EED_Events_Archive::_remove_additional_events_archive_filters();
529
-        do_action('AHEE__EED_Events_Archive__use_filterable_display_order__after_remove_filters');
530
-        // we're not returning the $content directly because the template we are loading uses the_content (or the_excerpt)
531
-        // return ! empty( $template ) ? $template : $content;
532
-        return $content;
533
-    }
534
-
535
-
536
-    /**
537
-     *    event_datetimes - adds datetimes ABOVE content
538
-     *
539
-     * @access    public
540
-     * @param        string $content
541
-     * @return        string
542
-     */
543
-    public static function event_datetimes($content)
544
-    {
545
-        if (post_password_required()) {
546
-            return $content;
547
-        }
548
-        return EEH_Template::locate_template('content-espresso_events-datetimes.php') . $content;
549
-    }
550
-
551
-
552
-    /**
553
-     *    event_tickets - adds tickets ABOVE content (which includes datetimes)
554
-     *
555
-     * @access    public
556
-     * @param        string $content
557
-     * @return        string
558
-     */
559
-    public static function event_tickets($content)
560
-    {
561
-        if (post_password_required()) {
562
-            return $content;
563
-        }
564
-        return EEH_Template::locate_template('content-espresso_events-tickets.php') . $content;
565
-    }
566
-
567
-
568
-    /**
569
-     *    event_venues - adds venues BELOW content
570
-     *
571
-     * @access    public
572
-     * @param    string $content
573
-     * @return    string
574
-     */
575
-    public static function event_venue($content)
576
-    {
577
-        return EED_Events_Archive::event_venues($content);
578
-    }
579
-
580
-
581
-    /**
582
-     *    event_venues - adds venues BELOW content
583
-     *
584
-     * @access    public
585
-     * @param        string $content
586
-     * @return        string
587
-     */
588
-    public static function event_venues($content)
589
-    {
590
-        if (post_password_required()) {
591
-            return $content;
592
-        }
593
-        return $content . EEH_Template::locate_template('content-espresso_events-venues.php');
594
-    }
595
-
596
-
597
-    /**
598
-     *    _add_additional_content_filters
599
-     *
600
-     * @access    private
601
-     * @return        void
602
-     */
603
-    private static function _add_additional_excerpt_filters()
604
-    {
605
-        add_filter(
606
-            'the_excerpt',
607
-            array('EED_Events_Archive', 'event_datetimes'),
608
-            EED_Events_Archive::EVENT_DATETIMES_PRIORITY
609
-        );
610
-        add_filter(
611
-            'the_excerpt',
612
-            array('EED_Events_Archive', 'event_tickets'),
613
-            EED_Events_Archive::EVENT_TICKETS_PRIORITY
614
-        );
615
-        add_filter(
616
-            'the_excerpt',
617
-            array('EED_Events_Archive', 'event_venues'),
618
-            EED_Events_Archive::EVENT_VENUES_PRIORITY
619
-        );
620
-    }
621
-
622
-
623
-    /**
624
-     *    _add_additional_content_filters
625
-     *
626
-     * @access    private
627
-     * @return        void
628
-     */
629
-    private static function _add_additional_content_filters()
630
-    {
631
-        add_filter(
632
-            'the_content',
633
-            array('EED_Events_Archive', 'event_datetimes'),
634
-            EED_Events_Archive::EVENT_DATETIMES_PRIORITY
635
-        );
636
-        add_filter(
637
-            'the_content',
638
-            array('EED_Events_Archive', 'event_tickets'),
639
-            EED_Events_Archive::EVENT_TICKETS_PRIORITY
640
-        );
641
-        add_filter(
642
-            'the_content',
643
-            array('EED_Events_Archive', 'event_venues'),
644
-            EED_Events_Archive::EVENT_VENUES_PRIORITY
645
-        );
646
-    }
647
-
648
-
649
-    /**
650
-     *    _remove_additional_events_archive_filters
651
-     *
652
-     * @access    private
653
-     * @return        void
654
-     */
655
-    private static function _remove_additional_events_archive_filters()
656
-    {
657
-        remove_filter(
658
-            'the_excerpt',
659
-            array('EED_Events_Archive', 'event_datetimes'),
660
-            EED_Events_Archive::EVENT_DATETIMES_PRIORITY
661
-        );
662
-        remove_filter(
663
-            'the_excerpt',
664
-            array('EED_Events_Archive', 'event_tickets'),
665
-            EED_Events_Archive::EVENT_TICKETS_PRIORITY
666
-        );
667
-        remove_filter(
668
-            'the_excerpt',
669
-            array('EED_Events_Archive', 'event_venues'),
670
-            EED_Events_Archive::EVENT_VENUES_PRIORITY
671
-        );
672
-        remove_filter(
673
-            'the_content',
674
-            array('EED_Events_Archive', 'event_datetimes'),
675
-            EED_Events_Archive::EVENT_DATETIMES_PRIORITY
676
-        );
677
-        remove_filter(
678
-            'the_content',
679
-            array('EED_Events_Archive', 'event_tickets'),
680
-            EED_Events_Archive::EVENT_TICKETS_PRIORITY
681
-        );
682
-        remove_filter(
683
-            'the_content',
684
-            array('EED_Events_Archive', 'event_venues'),
685
-            EED_Events_Archive::EVENT_VENUES_PRIORITY
686
-        );
687
-    }
688
-
689
-
690
-    /**
691
-     *    remove_all_events_archive_filters
692
-     *
693
-     * @access    public
694
-     * @return        void
695
-     */
696
-    public static function remove_all_events_archive_filters()
697
-    {
698
-        // remove_filter( 'get_the_excerpt', array( 'EED_Events_Archive', 'get_the_excerpt' ), 1 );
699
-        remove_filter('the_title', array('EED_Events_Archive', 'the_title'), 1);
700
-        remove_filter(
701
-            'the_excerpt',
702
-            array('EED_Events_Archive', 'event_details'),
703
-            EED_Events_Archive::EVENT_DETAILS_PRIORITY
704
-        );
705
-        remove_filter(
706
-            'the_excerpt',
707
-            array('EED_Events_Archive', 'event_datetimes'),
708
-            EED_Events_Archive::EVENT_DATETIMES_PRIORITY
709
-        );
710
-        remove_filter(
711
-            'the_excerpt',
712
-            array('EED_Events_Archive', 'event_tickets'),
713
-            EED_Events_Archive::EVENT_TICKETS_PRIORITY
714
-        );
715
-        remove_filter(
716
-            'the_excerpt',
717
-            array('EED_Events_Archive', 'event_venues'),
718
-            EED_Events_Archive::EVENT_VENUES_PRIORITY
719
-        );
720
-        remove_filter(
721
-            'the_content',
722
-            array('EED_Events_Archive', 'event_details'),
723
-            EED_Events_Archive::EVENT_DETAILS_PRIORITY
724
-        );
725
-        remove_filter(
726
-            'the_content',
727
-            array('EED_Events_Archive', 'event_datetimes'),
728
-            EED_Events_Archive::EVENT_DATETIMES_PRIORITY
729
-        );
730
-        remove_filter(
731
-            'the_content',
732
-            array('EED_Events_Archive', 'event_tickets'),
733
-            EED_Events_Archive::EVENT_TICKETS_PRIORITY
734
-        );
735
-        remove_filter(
736
-            'the_content',
737
-            array('EED_Events_Archive', 'event_venues'),
738
-            EED_Events_Archive::EVENT_VENUES_PRIORITY
739
-        );
740
-        // don't display entry meta because the existing theme will take care of that
741
-        remove_filter(
742
-            'FHEE__content_espresso_events_details_template__display_entry_meta',
743
-            '__return_false'
744
-        );
745
-    }
746
-
747
-
748
-    /**
749
-     *    load_event_list_assets
750
-     *
751
-     * @access    public
752
-     * @return    void
753
-     */
754
-    public function load_event_list_assets()
755
-    {
756
-        do_action('AHEE__EED_Events_Archive__before_load_assets');
757
-        add_filter('FHEE_load_EE_Session', '__return_true');
758
-        add_filter('FHEE__EED_Ticket_Selector__load_tckt_slctr_assets', '__return_true');
759
-        add_action('wp_enqueue_scripts', array($this, 'wp_enqueue_scripts'), 10);
760
-        if (EE_Registry::instance()->CFG->map_settings->use_google_maps) {
761
-            add_action('wp_enqueue_scripts', array('EEH_Maps', 'espresso_google_map_js'), 11);
762
-        }
763
-    }
764
-
765
-
766
-    /**
767
-     *    wp_enqueue_scripts
768
-     *
769
-     * @access    public
770
-     * @return    void
771
-     * @throws EE_Error
772
-     */
773
-    public function wp_enqueue_scripts()
774
-    {
775
-        // get some style
776
-        if (apply_filters('FHEE_enable_default_espresso_css', false)) {
777
-            // first check uploads folder
778
-            if (EEH_File::is_readable(get_stylesheet_directory() . $this->theme . '/style.css')) {
779
-                wp_register_style(
780
-                    $this->theme,
781
-                    get_stylesheet_directory_uri() . $this->theme . '/style.css',
782
-                    array('dashicons', 'espresso_default')
783
-                );
784
-            } else {
785
-            }
786
-            wp_enqueue_style($this->theme);
787
-        }
788
-    }
789
-
790
-
791
-    /**
792
-     *    template_settings_form
793
-     *
794
-     * @access    public
795
-     * @static
796
-     * @return    string
797
-     */
798
-    public static function template_settings_form()
799
-    {
800
-        $template_settings = EE_Registry::instance()->CFG->template_settings;
801
-        $template_settings->EED_Events_Archive = isset($template_settings->EED_Events_Archive)
802
-            ? $template_settings->EED_Events_Archive : new EE_Events_Archive_Config();
803
-        $template_settings->EED_Events_Archive = apply_filters(
804
-            'FHEE__EED_Events_Archive__template_settings_form__event_list_config',
805
-            $template_settings->EED_Events_Archive
806
-        );
807
-        $events_archive_settings = array(
808
-            'display_status_banner' => 0,
809
-            'display_description' => 1,
810
-            'display_ticket_selector' => 0,
811
-            'display_datetimes' => 1,
812
-            'display_venue' => 0,
813
-            'display_expired_events' => 0,
814
-        );
815
-        $events_archive_settings = array_merge(
816
-            $events_archive_settings,
817
-            (array) $template_settings->EED_Events_Archive
818
-        );
819
-        EEH_Template::display_template(
820
-            EVENTS_ARCHIVE_TEMPLATES_PATH . 'admin-event-list-settings.template.php',
821
-            $events_archive_settings
822
-        );
823
-    }
824
-
825
-
826
-    /**
827
-     *    update_template_settings
828
-     *
829
-     * @access    public
830
-     * @param    EE_Template_Config $CFG
831
-     * @param    EE_Request_Handler $REQ
832
-     * @return    EE_Template_Config
833
-     */
834
-    public static function update_template_settings($CFG, $REQ)
835
-    {
836
-        $CFG->EED_Events_Archive = new EE_Events_Archive_Config();
837
-        // unless we are resetting the config...
838
-        if (! isset($REQ['EED_Events_Archive_reset_event_list_settings'])
839
-            || absint($REQ['EED_Events_Archive_reset_event_list_settings']) !== 1
840
-        ) {
841
-            $CFG->EED_Events_Archive->display_status_banner = isset($REQ['EED_Events_Archive_display_status_banner'])
842
-                ? absint($REQ['EED_Events_Archive_display_status_banner']) : 0;
843
-            $CFG->EED_Events_Archive->display_description = isset($REQ['EED_Events_Archive_display_description'])
844
-                ? absint($REQ['EED_Events_Archive_display_description']) : 1;
845
-            $CFG->EED_Events_Archive->display_ticket_selector = isset($REQ['EED_Events_Archive_display_ticket_selector'])
846
-                ? absint($REQ['EED_Events_Archive_display_ticket_selector']) : 0;
847
-            $CFG->EED_Events_Archive->display_datetimes = isset($REQ['EED_Events_Archive_display_datetimes']) ? absint(
848
-                $REQ['EED_Events_Archive_display_datetimes']
849
-            ) : 1;
850
-            $CFG->EED_Events_Archive->display_venue = isset($REQ['EED_Events_Archive_display_venue']) ? absint(
851
-                $REQ['EED_Events_Archive_display_venue']
852
-            ) : 0;
853
-            $CFG->EED_Events_Archive->display_expired_events = isset($REQ['EED_Events_Archive_display_expired_events'])
854
-                ? absint($REQ['EED_Events_Archive_display_expired_events']) : 0;
855
-        }
856
-        return $CFG;
857
-    }
858
-
859
-
860
-    /**
861
-     *    event_list_css
862
-     *
863
-     * @access    public
864
-     * @param string $extra_class
865
-     * @return    string
866
-     */
867
-    public static function event_list_css($extra_class = '')
868
-    {
869
-        $event_list_css = ! empty($extra_class) ? array($extra_class) : array();
870
-        $event_list_css[] = 'espresso-event-list-event';
871
-        return implode(' ', $event_list_css);
872
-    }
873
-
874
-
875
-    /**
876
-     *    event_categories
877
-     *
878
-     * @access    public
879
-     * @return    array
880
-     */
881
-    public static function event_categories()
882
-    {
883
-        return EE_Registry::instance()->load_model('Term')->get_all_ee_categories();
884
-    }
885
-
886
-
887
-    /**
888
-     *    display_description
889
-     *
890
-     * @access    public
891
-     * @param $value
892
-     * @return    bool
893
-     */
894
-    public static function display_description($value)
895
-    {
896
-        $config = EE_Registry::instance()->CFG->template_settings->EED_Events_Archive;
897
-        $display_description = isset($config->display_description) ? $config->display_description : 1;
898
-        return $display_description === $value ? true : false;
899
-    }
900
-
901
-
902
-    /**
903
-     *    display_ticket_selector
904
-     *
905
-     * @access    public
906
-     * @return    bool
907
-     */
908
-    public static function display_ticket_selector()
909
-    {
910
-        $config = EE_Registry::instance()->CFG->template_settings->EED_Events_Archive;
911
-        return isset($config->display_ticket_selector) && $config->display_ticket_selector ? true : false;
912
-    }
913
-
914
-
915
-    /**
916
-     *    display_venue
917
-     *
918
-     * @access    public
919
-     * @return    bool
920
-     */
921
-    public static function display_venue()
922
-    {
923
-        $config = EE_Registry::instance()->CFG->template_settings->EED_Events_Archive;
924
-        return isset($config->display_venue) && $config->display_venue && EEH_Venue_View::venue_name() ? true : false;
925
-    }
926
-
927
-
928
-    /**
929
-     *    display_datetimes
930
-     *
931
-     * @access    public
932
-     * @return    bool
933
-     */
934
-    public static function display_datetimes()
935
-    {
936
-        $config = EE_Registry::instance()->CFG->template_settings->EED_Events_Archive;
937
-        return isset($config->display_datetimes) && $config->display_datetimes ? true : false;
938
-    }
939
-
940
-
941
-    /**
942
-     *    event_list_title
943
-     *
944
-     * @access    public
945
-     * @return    string
946
-     */
947
-    public static function event_list_title()
948
-    {
949
-        return apply_filters(
950
-            'FHEE__archive_espresso_events_template__upcoming_events_h1',
951
-            __('Upcoming Events', 'event_espresso')
952
-        );
953
-    }
954
-
955
-
956
-    // GRAVEYARD
957
-
958
-
959
-    /**
960
-     * @since 4.4.0
961
-     */
962
-    public static function _doing_it_wrong_notice($function = '')
963
-    {
964
-        EE_Error::doing_it_wrong(
965
-            __FUNCTION__,
966
-            sprintf(
967
-                __(
968
-                    'EED_Events_Archive::%1$s was moved to EEH_Event_Query::%1$s:%2$sPlease update your existing code because the method it calls will be removed in version %3$s',
969
-                    'event_espresso'
970
-                ),
971
-                $function,
972
-                '<br />',
973
-                '4.6.0'
974
-            ),
975
-            '4.4.0'
976
-        );
977
-    }
978
-
979
-
980
-    /**
981
-     * @deprecated
982
-     * @since 4.4.0
983
-     */
984
-    public function get_post_data()
985
-    {
986
-        EEH_Event_Query::set_query_params();
987
-    }
988
-
989
-
990
-    /**
991
-     * @throws EE_Error
992
-     * @since 4.4.0
993
-     * @deprecated
994
-     */
995
-    public function posts_fields($SQL, WP_Query $wp_query)
996
-    {
997
-        EED_Events_Archive::_doing_it_wrong_notice(__FUNCTION__);
998
-        return EEH_Event_Query::posts_fields($SQL, $wp_query);
999
-    }
1000
-
1001
-
1002
-    /**
1003
-     * @throws EE_Error
1004
-     * @since 4.4.0
1005
-     * @deprecated
1006
-     */
1007
-    public static function posts_fields_sql_for_orderby($orderby_params = array())
1008
-    {
1009
-        EED_Events_Archive::_doing_it_wrong_notice(__FUNCTION__);
1010
-        return EEH_Event_Query::posts_fields_sql_for_orderby($orderby_params);
1011
-    }
1012
-
1013
-
1014
-    /**
1015
-     * @throws EE_Error
1016
-     * @since 4.4.0
1017
-     * @deprecated
1018
-     */
1019
-    public function posts_join($SQL, WP_Query $wp_query)
1020
-    {
1021
-        EED_Events_Archive::_doing_it_wrong_notice(__FUNCTION__);
1022
-        return EEH_Event_Query::posts_join($SQL, $wp_query);
1023
-    }
1024
-
1025
-
1026
-    /**
1027
-     * @deprecated
1028
-     * @since 4.4.0
1029
-     */
1030
-    public static function posts_join_sql_for_terms($join_terms = null)
1031
-    {
1032
-        EED_Events_Archive::_doing_it_wrong_notice(__FUNCTION__);
1033
-        return EEH_Event_Query::posts_join_sql_for_terms($join_terms);
1034
-    }
1035
-
1036
-
1037
-    /**
1038
-     * @throws EE_Error
1039
-     * @since 4.4.0
1040
-     * @deprecated
1041
-     */
1042
-    public static function posts_join_for_orderby($orderby_params = array())
1043
-    {
1044
-        EED_Events_Archive::_doing_it_wrong_notice(__FUNCTION__);
1045
-        return EEH_Event_Query::posts_join_for_orderby($orderby_params);
1046
-    }
1047
-
1048
-
1049
-    /**
1050
-     * @throws EE_Error
1051
-     * @since 4.4.0
1052
-     * @deprecated
1053
-     */
1054
-    public function posts_where($SQL, WP_Query $wp_query)
1055
-    {
1056
-        EED_Events_Archive::_doing_it_wrong_notice(__FUNCTION__);
1057
-        return EEH_Event_Query::posts_where($SQL, $wp_query);
1058
-    }
1059
-
1060
-
1061
-    /**
1062
-     * @throws EE_Error
1063
-     * @since 4.4.0
1064
-     * @deprecated
1065
-     */
1066
-    public static function posts_where_sql_for_show_expired($show_expired = false)
1067
-    {
1068
-        EED_Events_Archive::_doing_it_wrong_notice(__FUNCTION__);
1069
-        return EEH_Event_Query::posts_where_sql_for_show_expired($show_expired);
1070
-    }
1071
-
1072
-
1073
-    /**
1074
-     * @deprecated
1075
-     * @since 4.4.0
1076
-     */
1077
-    public static function posts_where_sql_for_event_category_slug($event_category_slug = null)
1078
-    {
1079
-        EED_Events_Archive::_doing_it_wrong_notice(__FUNCTION__);
1080
-        return EEH_Event_Query::posts_where_sql_for_event_category_slug($event_category_slug);
1081
-    }
1082
-
1083
-
1084
-    /**
1085
-     * @throws EE_Error
1086
-     * @since 4.4.0
1087
-     * @deprecated
1088
-     */
1089
-    public static function posts_where_sql_for_event_list_month($month = null)
1090
-    {
1091
-        EED_Events_Archive::_doing_it_wrong_notice(__FUNCTION__);
1092
-        return EEH_Event_Query::posts_where_sql_for_event_list_month($month);
1093
-    }
1094
-
1095
-
1096
-    /**
1097
-     * @throws EE_Error
1098
-     * @since 4.4.0
1099
-     * @deprecated
1100
-     */
1101
-    public function posts_orderby($SQL, WP_Query $wp_query)
1102
-    {
1103
-        EED_Events_Archive::_doing_it_wrong_notice(__FUNCTION__);
1104
-        return EEH_Event_Query::posts_orderby($SQL, $wp_query);
1105
-    }
1106
-
1107
-
1108
-    /**
1109
-     * @throws EE_Error
1110
-     * @since 4.4.0
1111
-     * @deprecated
1112
-     */
1113
-    public static function posts_orderby_sql($orderby_params = array(), $sort = 'ASC')
1114
-    {
1115
-        EED_Events_Archive::_doing_it_wrong_notice(__FUNCTION__);
1116
-        return EEH_Event_Query::posts_orderby_sql($orderby_params, $sort);
1117
-    }
19
+	const EVENT_DETAILS_PRIORITY = 100;
20
+
21
+	const EVENT_DATETIMES_PRIORITY = 110;
22
+
23
+	const EVENT_TICKETS_PRIORITY = 120;
24
+
25
+	const EVENT_VENUES_PRIORITY = 130;
26
+
27
+
28
+	public static $espresso_event_list_ID = 0;
29
+
30
+	public static $espresso_grid_event_lists = array();
31
+
32
+	/**
33
+	 * @type bool $using_get_the_excerpt
34
+	 */
35
+	protected static $using_get_the_excerpt = false;
36
+
37
+	/**
38
+	 * Used to flag when the event list is being called from an external iframe.
39
+	 *
40
+	 * @var bool $iframe
41
+	 */
42
+	protected static $iframe = false;
43
+
44
+	/**
45
+	 * @var EventListIframeEmbedButton $_iframe_embed_button
46
+	 */
47
+	private static $_iframe_embed_button;
48
+
49
+	/**
50
+	 * @type EE_Template_Part_Manager $template_parts
51
+	 */
52
+	protected $template_parts;
53
+
54
+
55
+	/**
56
+	 * @return EED_Events_Archive
57
+	 */
58
+	public static function instance()
59
+	{
60
+		return parent::get_instance(__CLASS__);
61
+	}
62
+
63
+
64
+	/**
65
+	 * set_hooks - for hooking into EE Core, other modules, etc
66
+	 *
67
+	 * @return void
68
+	 * @throws InvalidArgumentException
69
+	 * @throws InvalidDataTypeException
70
+	 * @throws InvalidInterfaceException
71
+	 */
72
+	public static function set_hooks()
73
+	{
74
+		/** @var EventEspresso\core\domain\entities\custom_post_types\CustomPostTypeDefinitions $custom_post_type_definitions */
75
+		$custom_post_type_definitions = LoaderFactory::getLoader()->getShared(
76
+			'EventEspresso\core\domain\entities\custom_post_types\CustomPostTypeDefinitions'
77
+		);
78
+		$custom_post_types = $custom_post_type_definitions->getDefinitions();
79
+		EE_Config::register_route(
80
+			$custom_post_types['espresso_events']['plural_slug'],
81
+			'Events_Archive',
82
+			'run'
83
+		);
84
+		EE_Config::register_route(
85
+			'event_list',
86
+			'Events_Archive',
87
+			'event_list'
88
+		);
89
+		EE_Config::register_route(
90
+			'iframe',
91
+			'Events_Archive',
92
+			'event_list_iframe',
93
+			'event_list'
94
+		);
95
+		add_action('wp_loaded', array('EED_Events_Archive', 'set_definitions'), 2);
96
+	}
97
+
98
+
99
+	/**
100
+	 *    set_hooks_admin - for hooking into EE Admin Core, other modules, etc
101
+	 *
102
+	 * @access    public
103
+	 * @return    void
104
+	 */
105
+	public static function set_hooks_admin()
106
+	{
107
+		add_action('wp_loaded', array('EED_Events_Archive', 'set_definitions'), 2);
108
+		// hook into the end of the \EE_Admin_Page::_load_page_dependencies()
109
+		// to load assets for "espresso_events" page on the "default" route (action)
110
+		add_action(
111
+			'FHEE__EE_Admin_Page___load_page_dependencies__after_load__espresso_events__default',
112
+			array('EED_Events_Archive', 'event_list_iframe_embed_button'),
113
+			10
114
+		);
115
+	}
116
+
117
+
118
+	/**
119
+	 *    set_definitions
120
+	 *
121
+	 * @access    public
122
+	 * @return    void
123
+	 */
124
+	public static function set_definitions()
125
+	{
126
+		define('EVENTS_ARCHIVE_ASSETS_URL', plugin_dir_url(__FILE__) . 'assets/');
127
+		define('EVENTS_ARCHIVE_TEMPLATES_PATH', str_replace('\\', '/', plugin_dir_path(__FILE__)) . 'templates/');
128
+	}
129
+
130
+
131
+	/**
132
+	 * set up EE_Events_Archive_Config
133
+	 */
134
+	protected function set_config()
135
+	{
136
+		$this->set_config_section('template_settings');
137
+		$this->set_config_class('EE_Events_Archive_Config');
138
+		$this->set_config_name('EED_Events_Archive');
139
+	}
140
+
141
+
142
+	/**
143
+	 * @return EventListIframeEmbedButton
144
+	 */
145
+	public static function get_iframe_embed_button()
146
+	{
147
+		if (! self::$_iframe_embed_button instanceof EventListIframeEmbedButton) {
148
+			self::$_iframe_embed_button = new EventListIframeEmbedButton();
149
+		}
150
+		return self::$_iframe_embed_button;
151
+	}
152
+
153
+
154
+	/**
155
+	 * event_list_iframe_embed_button
156
+	 *
157
+	 * @return    void
158
+	 * @throws EE_Error
159
+	 */
160
+	public static function event_list_iframe_embed_button()
161
+	{
162
+		$iframe_embed_button = EED_Events_Archive::get_iframe_embed_button();
163
+		$iframe_embed_button->addEmbedButton();
164
+	}
165
+
166
+
167
+	/**
168
+	 *    initialize_template_parts
169
+	 *
170
+	 * @access    public
171
+	 * @param EE_Events_Archive_Config $config
172
+	 * @return EE_Template_Part_Manager
173
+	 * @throws EE_Error
174
+	 */
175
+	public function initialize_template_parts(EE_Events_Archive_Config $config = null)
176
+	{
177
+		$config = $config instanceof EE_Events_Archive_Config ? $config : $this->config();
178
+		EEH_Autoloader::register_template_part_autoloaders();
179
+		$template_parts = new EE_Template_Part_Manager();
180
+		$template_parts->add_template_part(
181
+			'tickets',
182
+			__('Ticket Selector', 'event_espresso'),
183
+			'content-espresso_events-tickets.php',
184
+			$config->display_order_tickets
185
+		);
186
+		$template_parts->add_template_part(
187
+			'datetimes',
188
+			__('Dates and Times', 'event_espresso'),
189
+			'content-espresso_events-datetimes.php',
190
+			$config->display_order_datetimes
191
+		);
192
+		$template_parts->add_template_part(
193
+			'event',
194
+			__('Event Description', 'event_espresso'),
195
+			'content-espresso_events-details.php',
196
+			$config->display_order_event
197
+		);
198
+		$template_parts->add_template_part(
199
+			'venue',
200
+			__('Venue Information', 'event_espresso'),
201
+			'content-espresso_events-venues.php',
202
+			$config->display_order_venue
203
+		);
204
+		do_action('AHEE__EED_Event_Archive__initialize_template_parts', $template_parts);
205
+		return $template_parts;
206
+	}
207
+
208
+
209
+	/**
210
+	 *    run - initial module setup - this gets called by the EE_Front_Controller if the module route is found in the
211
+	 *    incoming request
212
+	 *
213
+	 * @access    public
214
+	 * @param WP $WP
215
+	 * @return    void
216
+	 */
217
+	public function run($WP)
218
+	{
219
+		do_action('AHEE__EED_Events_Archive__before_run');
220
+		// ensure valid EE_Events_Archive_Config() object exists
221
+		$this->set_config();
222
+		/** @type EE_Events_Archive_Config $config */
223
+		$config = $this->config();
224
+		// load other required components
225
+		$this->load_event_list_assets();
226
+		// filter the WP posts_join, posts_where, and posts_orderby SQL clauses
227
+		// add query filters
228
+		EEH_Event_Query::add_query_filters();
229
+		// set params that will get used by the filters
230
+		EEH_Event_Query::set_query_params(
231
+			'',    // month
232
+			'',    // category
233
+			$config->display_expired_events,    // show_expired
234
+			'start_date',    // orderby
235
+			'ASC'    // sort
236
+		);
237
+		// check what template is loaded
238
+		add_filter('template_include', array($this, 'template_include'), 999, 1);
239
+	}
240
+
241
+
242
+	/**
243
+	 * most likely called by the ESPRESSO_EVENTS shortcode which uses this module to do some of it's lifting
244
+	 *
245
+	 * @return    void
246
+	 */
247
+	public function event_list()
248
+	{
249
+		// ensure valid EE_Events_Archive_Config() object exists
250
+		$this->set_config();
251
+		// load other required components
252
+		$this->load_event_list_assets();
253
+	}
254
+
255
+
256
+	/**
257
+	 * @access    public
258
+	 * @return    void
259
+	 * @throws EE_Error
260
+	 * @throws DomainException
261
+	 */
262
+	public function event_list_iframe()
263
+	{
264
+		EED_Events_Archive::$iframe = true;
265
+		$event_list_iframe = new EventsArchiveIframe($this);
266
+		$event_list_iframe->display();
267
+	}
268
+
269
+
270
+	/**
271
+	 * @access public
272
+	 * @return string
273
+	 */
274
+	public static function is_iframe()
275
+	{
276
+		return EED_Events_Archive::$iframe;
277
+	}
278
+
279
+
280
+	/**
281
+	 * @access public
282
+	 * @return string
283
+	 */
284
+	public static function link_target()
285
+	{
286
+		return EED_Events_Archive::$iframe ? ' target="_blank"' : '';
287
+	}
288
+
289
+
290
+	/**
291
+	 *    template_include
292
+	 *
293
+	 * @access    public
294
+	 * @param string $template
295
+	 * @return    string
296
+	 */
297
+	public function template_include($template = '')
298
+	{
299
+		// don't add content filter for dedicated EE child themes or private posts
300
+		if (! EEH_Template::is_espresso_theme()) {
301
+			/** @type EE_Events_Archive_Config $config */
302
+			$config = $this->config();
303
+			// add status banner ?
304
+			if ($config->display_status_banner) {
305
+				add_filter('the_title', array('EED_Events_Archive', 'the_title'), 100, 2);
306
+			}
307
+			// if NOT a custom template
308
+			if (apply_filters('FHEE__EED_Event_Archive__template_include__allow_custom_selected_template', false)
309
+				|| EE_Registry::instance()
310
+							  ->load_core('Front_Controller')
311
+							  ->get_selected_template() !== 'archive-espresso_events.php'
312
+			) {
313
+				// don't display entry meta because the existing theme will take care of that
314
+				add_filter('FHEE__EED_Events_Archive__template_include__events_list_active', '__return_true');
315
+				// load functions.php file for the theme (loaded by WP if using child theme)
316
+				EEH_Template::load_espresso_theme_functions();
317
+				// because we don't know if the theme is using the_excerpt()
318
+				add_filter(
319
+					'the_excerpt',
320
+					array('EED_Events_Archive', 'event_details'),
321
+					EED_Events_Archive::EVENT_DETAILS_PRIORITY
322
+				);
323
+				// or the_content
324
+				add_filter(
325
+					'the_content',
326
+					array('EED_Events_Archive', 'event_details'),
327
+					EED_Events_Archive::EVENT_DETAILS_PRIORITY
328
+				);
329
+				// and just in case they are running get_the_excerpt() which DESTROYS things
330
+				add_filter('get_the_excerpt', array('EED_Events_Archive', 'get_the_excerpt'), 1, 1);
331
+				// don't display entry meta because the existing theme will take care of that
332
+				add_filter('FHEE__content_espresso_events_details_template__display_entry_meta', '__return_false');
333
+			}
334
+		}
335
+		return $template;
336
+	}
337
+
338
+
339
+	/**
340
+	 *    get_the_excerpt - kinda hacky, but if a theme is using get_the_excerpt(), then we need to remove our filters
341
+	 *    on the_content()
342
+	 *
343
+	 * @access    public
344
+	 * @param        string $excerpt
345
+	 * @return        string
346
+	 */
347
+	public static function get_the_excerpt($excerpt = '')
348
+	{
349
+		if (post_password_required()) {
350
+			return $excerpt;
351
+		}
352
+		if (apply_filters('FHEE__EED_Events_Archive__get_the_excerpt__theme_uses_get_the_excerpt', false)) {
353
+			remove_filter(
354
+				'the_excerpt',
355
+				array('EED_Events_Archive', 'event_details'),
356
+				EED_Events_Archive::EVENT_DETAILS_PRIORITY
357
+			);
358
+			remove_filter(
359
+				'the_content',
360
+				array('EED_Events_Archive', 'event_details'),
361
+				EED_Events_Archive::EVENT_DETAILS_PRIORITY
362
+			);
363
+			$excerpt = EED_Events_Archive::event_details($excerpt);
364
+		} else {
365
+			EED_Events_Archive::$using_get_the_excerpt = true;
366
+			add_filter('wp_trim_excerpt', array('EED_Events_Archive', 'end_get_the_excerpt'), 999, 1);
367
+		}
368
+		return $excerpt;
369
+	}
370
+
371
+
372
+	/**
373
+	 * end_get_the_excerpt
374
+	 *
375
+	 * @access public
376
+	 * @param  string $text
377
+	 * @return string
378
+	 */
379
+	public static function end_get_the_excerpt($text = '')
380
+	{
381
+		EED_Events_Archive::$using_get_the_excerpt = false;
382
+		return $text;
383
+	}
384
+
385
+
386
+	/**
387
+	 *    the_title
388
+	 *
389
+	 * @access        public
390
+	 * @param        string $title
391
+	 * @param        string $id
392
+	 * @return        string
393
+	 */
394
+	public static function the_title($title = '', $id = '')
395
+	{
396
+		global $post;
397
+		if ($post instanceof WP_Post) {
398
+			return in_the_loop() && $post->ID == $id ? espresso_event_status_banner($post->ID) . $title : $title;
399
+		}
400
+		return $title;
401
+	}
402
+
403
+
404
+	/**
405
+	 *    event_details
406
+	 *
407
+	 * @access    public
408
+	 * @param        string $content
409
+	 * @return        string
410
+	 */
411
+	public static function event_details($content)
412
+	{
413
+		global $post;
414
+		static $current_post_ID = 0;
415
+		if ($current_post_ID !== $post->ID
416
+			&& $post->post_type === 'espresso_events'
417
+			&& ! EED_Events_Archive::$using_get_the_excerpt
418
+			&& ! post_password_required()
419
+			&& (
420
+				apply_filters('FHEE__EES_Espresso_Events__process_shortcode__true', false)
421
+				|| ! apply_filters('FHEE__content_espresso_events__template_loaded', false)
422
+			)
423
+		) {
424
+			// Set current post ID to prevent showing content twice, but only if headers have definitely been sent.
425
+			// Reason being is that some plugins, like Yoast, need to run through a copy of the loop early
426
+			// BEFORE headers are sent in order to examine the post content and generate content for the HTML header.
427
+			// We want to allow those plugins to still do their thing and have access to our content, but depending on
428
+			// how your event content is being displayed (shortcode, CPT route, etc), this filter can get applied twice,
429
+			// so the following allows this filter to be applied multiple times, but only once for real
430
+			$current_post_ID = did_action('loop_start') ? $post->ID : 0;
431
+			if (EE_Registry::instance()->CFG->template_settings->EED_Events_Archive->use_sortable_display_order) {
432
+				$content = EED_Events_Archive::use_sortable_display_order();
433
+			} else {
434
+				$content = EED_Events_Archive::use_filterable_display_order();
435
+			}
436
+		}
437
+		return $content;
438
+	}
439
+
440
+
441
+	/**
442
+	 *    use_sortable_display_order
443
+	 *
444
+	 * @access    protected
445
+	 * @return string
446
+	 */
447
+	protected static function use_sortable_display_order()
448
+	{
449
+		// no further password checks required atm
450
+		add_filter('FHEE__EED_Events_Archive__event_details__no_post_password_required', '__return_true');
451
+		// we need to first remove this callback from being applied to the_content() or the_excerpt()
452
+		// (otherwise it will recurse and blow up the interweb)
453
+		remove_filter(
454
+			'the_excerpt',
455
+			array('EED_Events_Archive', 'event_details'),
456
+			EED_Events_Archive::EVENT_DETAILS_PRIORITY
457
+		);
458
+		remove_filter(
459
+			'the_content',
460
+			array('EED_Events_Archive', 'event_details'),
461
+			EED_Events_Archive::EVENT_DETAILS_PRIORITY
462
+		);
463
+		remove_filter('get_the_excerpt', array('EED_Events_Archive', 'get_the_excerpt'), 1);
464
+		// now add additional content depending on whether event is using the_excerpt() or the_content()
465
+		EED_Events_Archive::instance()->template_parts = EED_Events_Archive::instance()->initialize_template_parts();
466
+		$content = EEH_Template::locate_template('content-espresso_events-details.php');
467
+		$content = EED_Events_Archive::instance()->template_parts->apply_template_part_filters($content);
468
+		// re-add our main filters (or else the next event won't have them)
469
+		add_filter(
470
+			'the_excerpt',
471
+			array('EED_Events_Archive', 'event_details'),
472
+			EED_Events_Archive::EVENT_DETAILS_PRIORITY
473
+		);
474
+		add_filter(
475
+			'the_content',
476
+			array('EED_Events_Archive', 'event_details'),
477
+			EED_Events_Archive::EVENT_DETAILS_PRIORITY
478
+		);
479
+		add_filter('get_the_excerpt', array('EED_Events_Archive', 'get_the_excerpt'), 1, 1);
480
+		remove_filter(
481
+			'FHEE__EED_Events_Archive__event_details__no_post_password_required',
482
+			'__return_true'
483
+		);
484
+		return $content;
485
+	}
486
+
487
+
488
+	/**
489
+	 *    use_filterable_display_order
490
+	 *
491
+	 * @access    protected
492
+	 * @return    string
493
+	 */
494
+	protected static function use_filterable_display_order()
495
+	{
496
+		// we need to first remove this callback from being applied to the_content()
497
+		// (otherwise it will recurse and blow up the interweb)
498
+		remove_filter(
499
+			'the_excerpt',
500
+			array('EED_Events_Archive', 'event_details'),
501
+			EED_Events_Archive::EVENT_DETAILS_PRIORITY
502
+		);
503
+		remove_filter(
504
+			'the_content',
505
+			array('EED_Events_Archive', 'event_details'),
506
+			EED_Events_Archive::EVENT_DETAILS_PRIORITY
507
+		);
508
+		remove_filter('get_the_excerpt', array('EED_Events_Archive', 'get_the_excerpt'), 1);
509
+		// now add additional content depending on whether event is using the_excerpt() or the_content()
510
+		EED_Events_Archive::_add_additional_excerpt_filters();
511
+		EED_Events_Archive::_add_additional_content_filters();
512
+		do_action('AHEE__EED_Events_Archive__use_filterable_display_order__after_add_filters');
513
+		// now load our template
514
+		$content = EEH_Template::locate_template('content-espresso_events-details.php');
515
+		// re-add our main filters (or else the next event won't have them)
516
+		add_filter(
517
+			'the_excerpt',
518
+			array('EED_Events_Archive', 'event_details'),
519
+			EED_Events_Archive::EVENT_DETAILS_PRIORITY
520
+		);
521
+		add_filter(
522
+			'the_content',
523
+			array('EED_Events_Archive', 'event_details'),
524
+			EED_Events_Archive::EVENT_DETAILS_PRIORITY
525
+		);
526
+		add_filter('get_the_excerpt', array('EED_Events_Archive', 'get_the_excerpt'), 1, 1);
527
+		// but remove the other filters so that they don't get applied to the next post
528
+		EED_Events_Archive::_remove_additional_events_archive_filters();
529
+		do_action('AHEE__EED_Events_Archive__use_filterable_display_order__after_remove_filters');
530
+		// we're not returning the $content directly because the template we are loading uses the_content (or the_excerpt)
531
+		// return ! empty( $template ) ? $template : $content;
532
+		return $content;
533
+	}
534
+
535
+
536
+	/**
537
+	 *    event_datetimes - adds datetimes ABOVE content
538
+	 *
539
+	 * @access    public
540
+	 * @param        string $content
541
+	 * @return        string
542
+	 */
543
+	public static function event_datetimes($content)
544
+	{
545
+		if (post_password_required()) {
546
+			return $content;
547
+		}
548
+		return EEH_Template::locate_template('content-espresso_events-datetimes.php') . $content;
549
+	}
550
+
551
+
552
+	/**
553
+	 *    event_tickets - adds tickets ABOVE content (which includes datetimes)
554
+	 *
555
+	 * @access    public
556
+	 * @param        string $content
557
+	 * @return        string
558
+	 */
559
+	public static function event_tickets($content)
560
+	{
561
+		if (post_password_required()) {
562
+			return $content;
563
+		}
564
+		return EEH_Template::locate_template('content-espresso_events-tickets.php') . $content;
565
+	}
566
+
567
+
568
+	/**
569
+	 *    event_venues - adds venues BELOW content
570
+	 *
571
+	 * @access    public
572
+	 * @param    string $content
573
+	 * @return    string
574
+	 */
575
+	public static function event_venue($content)
576
+	{
577
+		return EED_Events_Archive::event_venues($content);
578
+	}
579
+
580
+
581
+	/**
582
+	 *    event_venues - adds venues BELOW content
583
+	 *
584
+	 * @access    public
585
+	 * @param        string $content
586
+	 * @return        string
587
+	 */
588
+	public static function event_venues($content)
589
+	{
590
+		if (post_password_required()) {
591
+			return $content;
592
+		}
593
+		return $content . EEH_Template::locate_template('content-espresso_events-venues.php');
594
+	}
595
+
596
+
597
+	/**
598
+	 *    _add_additional_content_filters
599
+	 *
600
+	 * @access    private
601
+	 * @return        void
602
+	 */
603
+	private static function _add_additional_excerpt_filters()
604
+	{
605
+		add_filter(
606
+			'the_excerpt',
607
+			array('EED_Events_Archive', 'event_datetimes'),
608
+			EED_Events_Archive::EVENT_DATETIMES_PRIORITY
609
+		);
610
+		add_filter(
611
+			'the_excerpt',
612
+			array('EED_Events_Archive', 'event_tickets'),
613
+			EED_Events_Archive::EVENT_TICKETS_PRIORITY
614
+		);
615
+		add_filter(
616
+			'the_excerpt',
617
+			array('EED_Events_Archive', 'event_venues'),
618
+			EED_Events_Archive::EVENT_VENUES_PRIORITY
619
+		);
620
+	}
621
+
622
+
623
+	/**
624
+	 *    _add_additional_content_filters
625
+	 *
626
+	 * @access    private
627
+	 * @return        void
628
+	 */
629
+	private static function _add_additional_content_filters()
630
+	{
631
+		add_filter(
632
+			'the_content',
633
+			array('EED_Events_Archive', 'event_datetimes'),
634
+			EED_Events_Archive::EVENT_DATETIMES_PRIORITY
635
+		);
636
+		add_filter(
637
+			'the_content',
638
+			array('EED_Events_Archive', 'event_tickets'),
639
+			EED_Events_Archive::EVENT_TICKETS_PRIORITY
640
+		);
641
+		add_filter(
642
+			'the_content',
643
+			array('EED_Events_Archive', 'event_venues'),
644
+			EED_Events_Archive::EVENT_VENUES_PRIORITY
645
+		);
646
+	}
647
+
648
+
649
+	/**
650
+	 *    _remove_additional_events_archive_filters
651
+	 *
652
+	 * @access    private
653
+	 * @return        void
654
+	 */
655
+	private static function _remove_additional_events_archive_filters()
656
+	{
657
+		remove_filter(
658
+			'the_excerpt',
659
+			array('EED_Events_Archive', 'event_datetimes'),
660
+			EED_Events_Archive::EVENT_DATETIMES_PRIORITY
661
+		);
662
+		remove_filter(
663
+			'the_excerpt',
664
+			array('EED_Events_Archive', 'event_tickets'),
665
+			EED_Events_Archive::EVENT_TICKETS_PRIORITY
666
+		);
667
+		remove_filter(
668
+			'the_excerpt',
669
+			array('EED_Events_Archive', 'event_venues'),
670
+			EED_Events_Archive::EVENT_VENUES_PRIORITY
671
+		);
672
+		remove_filter(
673
+			'the_content',
674
+			array('EED_Events_Archive', 'event_datetimes'),
675
+			EED_Events_Archive::EVENT_DATETIMES_PRIORITY
676
+		);
677
+		remove_filter(
678
+			'the_content',
679
+			array('EED_Events_Archive', 'event_tickets'),
680
+			EED_Events_Archive::EVENT_TICKETS_PRIORITY
681
+		);
682
+		remove_filter(
683
+			'the_content',
684
+			array('EED_Events_Archive', 'event_venues'),
685
+			EED_Events_Archive::EVENT_VENUES_PRIORITY
686
+		);
687
+	}
688
+
689
+
690
+	/**
691
+	 *    remove_all_events_archive_filters
692
+	 *
693
+	 * @access    public
694
+	 * @return        void
695
+	 */
696
+	public static function remove_all_events_archive_filters()
697
+	{
698
+		// remove_filter( 'get_the_excerpt', array( 'EED_Events_Archive', 'get_the_excerpt' ), 1 );
699
+		remove_filter('the_title', array('EED_Events_Archive', 'the_title'), 1);
700
+		remove_filter(
701
+			'the_excerpt',
702
+			array('EED_Events_Archive', 'event_details'),
703
+			EED_Events_Archive::EVENT_DETAILS_PRIORITY
704
+		);
705
+		remove_filter(
706
+			'the_excerpt',
707
+			array('EED_Events_Archive', 'event_datetimes'),
708
+			EED_Events_Archive::EVENT_DATETIMES_PRIORITY
709
+		);
710
+		remove_filter(
711
+			'the_excerpt',
712
+			array('EED_Events_Archive', 'event_tickets'),
713
+			EED_Events_Archive::EVENT_TICKETS_PRIORITY
714
+		);
715
+		remove_filter(
716
+			'the_excerpt',
717
+			array('EED_Events_Archive', 'event_venues'),
718
+			EED_Events_Archive::EVENT_VENUES_PRIORITY
719
+		);
720
+		remove_filter(
721
+			'the_content',
722
+			array('EED_Events_Archive', 'event_details'),
723
+			EED_Events_Archive::EVENT_DETAILS_PRIORITY
724
+		);
725
+		remove_filter(
726
+			'the_content',
727
+			array('EED_Events_Archive', 'event_datetimes'),
728
+			EED_Events_Archive::EVENT_DATETIMES_PRIORITY
729
+		);
730
+		remove_filter(
731
+			'the_content',
732
+			array('EED_Events_Archive', 'event_tickets'),
733
+			EED_Events_Archive::EVENT_TICKETS_PRIORITY
734
+		);
735
+		remove_filter(
736
+			'the_content',
737
+			array('EED_Events_Archive', 'event_venues'),
738
+			EED_Events_Archive::EVENT_VENUES_PRIORITY
739
+		);
740
+		// don't display entry meta because the existing theme will take care of that
741
+		remove_filter(
742
+			'FHEE__content_espresso_events_details_template__display_entry_meta',
743
+			'__return_false'
744
+		);
745
+	}
746
+
747
+
748
+	/**
749
+	 *    load_event_list_assets
750
+	 *
751
+	 * @access    public
752
+	 * @return    void
753
+	 */
754
+	public function load_event_list_assets()
755
+	{
756
+		do_action('AHEE__EED_Events_Archive__before_load_assets');
757
+		add_filter('FHEE_load_EE_Session', '__return_true');
758
+		add_filter('FHEE__EED_Ticket_Selector__load_tckt_slctr_assets', '__return_true');
759
+		add_action('wp_enqueue_scripts', array($this, 'wp_enqueue_scripts'), 10);
760
+		if (EE_Registry::instance()->CFG->map_settings->use_google_maps) {
761
+			add_action('wp_enqueue_scripts', array('EEH_Maps', 'espresso_google_map_js'), 11);
762
+		}
763
+	}
764
+
765
+
766
+	/**
767
+	 *    wp_enqueue_scripts
768
+	 *
769
+	 * @access    public
770
+	 * @return    void
771
+	 * @throws EE_Error
772
+	 */
773
+	public function wp_enqueue_scripts()
774
+	{
775
+		// get some style
776
+		if (apply_filters('FHEE_enable_default_espresso_css', false)) {
777
+			// first check uploads folder
778
+			if (EEH_File::is_readable(get_stylesheet_directory() . $this->theme . '/style.css')) {
779
+				wp_register_style(
780
+					$this->theme,
781
+					get_stylesheet_directory_uri() . $this->theme . '/style.css',
782
+					array('dashicons', 'espresso_default')
783
+				);
784
+			} else {
785
+			}
786
+			wp_enqueue_style($this->theme);
787
+		}
788
+	}
789
+
790
+
791
+	/**
792
+	 *    template_settings_form
793
+	 *
794
+	 * @access    public
795
+	 * @static
796
+	 * @return    string
797
+	 */
798
+	public static function template_settings_form()
799
+	{
800
+		$template_settings = EE_Registry::instance()->CFG->template_settings;
801
+		$template_settings->EED_Events_Archive = isset($template_settings->EED_Events_Archive)
802
+			? $template_settings->EED_Events_Archive : new EE_Events_Archive_Config();
803
+		$template_settings->EED_Events_Archive = apply_filters(
804
+			'FHEE__EED_Events_Archive__template_settings_form__event_list_config',
805
+			$template_settings->EED_Events_Archive
806
+		);
807
+		$events_archive_settings = array(
808
+			'display_status_banner' => 0,
809
+			'display_description' => 1,
810
+			'display_ticket_selector' => 0,
811
+			'display_datetimes' => 1,
812
+			'display_venue' => 0,
813
+			'display_expired_events' => 0,
814
+		);
815
+		$events_archive_settings = array_merge(
816
+			$events_archive_settings,
817
+			(array) $template_settings->EED_Events_Archive
818
+		);
819
+		EEH_Template::display_template(
820
+			EVENTS_ARCHIVE_TEMPLATES_PATH . 'admin-event-list-settings.template.php',
821
+			$events_archive_settings
822
+		);
823
+	}
824
+
825
+
826
+	/**
827
+	 *    update_template_settings
828
+	 *
829
+	 * @access    public
830
+	 * @param    EE_Template_Config $CFG
831
+	 * @param    EE_Request_Handler $REQ
832
+	 * @return    EE_Template_Config
833
+	 */
834
+	public static function update_template_settings($CFG, $REQ)
835
+	{
836
+		$CFG->EED_Events_Archive = new EE_Events_Archive_Config();
837
+		// unless we are resetting the config...
838
+		if (! isset($REQ['EED_Events_Archive_reset_event_list_settings'])
839
+			|| absint($REQ['EED_Events_Archive_reset_event_list_settings']) !== 1
840
+		) {
841
+			$CFG->EED_Events_Archive->display_status_banner = isset($REQ['EED_Events_Archive_display_status_banner'])
842
+				? absint($REQ['EED_Events_Archive_display_status_banner']) : 0;
843
+			$CFG->EED_Events_Archive->display_description = isset($REQ['EED_Events_Archive_display_description'])
844
+				? absint($REQ['EED_Events_Archive_display_description']) : 1;
845
+			$CFG->EED_Events_Archive->display_ticket_selector = isset($REQ['EED_Events_Archive_display_ticket_selector'])
846
+				? absint($REQ['EED_Events_Archive_display_ticket_selector']) : 0;
847
+			$CFG->EED_Events_Archive->display_datetimes = isset($REQ['EED_Events_Archive_display_datetimes']) ? absint(
848
+				$REQ['EED_Events_Archive_display_datetimes']
849
+			) : 1;
850
+			$CFG->EED_Events_Archive->display_venue = isset($REQ['EED_Events_Archive_display_venue']) ? absint(
851
+				$REQ['EED_Events_Archive_display_venue']
852
+			) : 0;
853
+			$CFG->EED_Events_Archive->display_expired_events = isset($REQ['EED_Events_Archive_display_expired_events'])
854
+				? absint($REQ['EED_Events_Archive_display_expired_events']) : 0;
855
+		}
856
+		return $CFG;
857
+	}
858
+
859
+
860
+	/**
861
+	 *    event_list_css
862
+	 *
863
+	 * @access    public
864
+	 * @param string $extra_class
865
+	 * @return    string
866
+	 */
867
+	public static function event_list_css($extra_class = '')
868
+	{
869
+		$event_list_css = ! empty($extra_class) ? array($extra_class) : array();
870
+		$event_list_css[] = 'espresso-event-list-event';
871
+		return implode(' ', $event_list_css);
872
+	}
873
+
874
+
875
+	/**
876
+	 *    event_categories
877
+	 *
878
+	 * @access    public
879
+	 * @return    array
880
+	 */
881
+	public static function event_categories()
882
+	{
883
+		return EE_Registry::instance()->load_model('Term')->get_all_ee_categories();
884
+	}
885
+
886
+
887
+	/**
888
+	 *    display_description
889
+	 *
890
+	 * @access    public
891
+	 * @param $value
892
+	 * @return    bool
893
+	 */
894
+	public static function display_description($value)
895
+	{
896
+		$config = EE_Registry::instance()->CFG->template_settings->EED_Events_Archive;
897
+		$display_description = isset($config->display_description) ? $config->display_description : 1;
898
+		return $display_description === $value ? true : false;
899
+	}
900
+
901
+
902
+	/**
903
+	 *    display_ticket_selector
904
+	 *
905
+	 * @access    public
906
+	 * @return    bool
907
+	 */
908
+	public static function display_ticket_selector()
909
+	{
910
+		$config = EE_Registry::instance()->CFG->template_settings->EED_Events_Archive;
911
+		return isset($config->display_ticket_selector) && $config->display_ticket_selector ? true : false;
912
+	}
913
+
914
+
915
+	/**
916
+	 *    display_venue
917
+	 *
918
+	 * @access    public
919
+	 * @return    bool
920
+	 */
921
+	public static function display_venue()
922
+	{
923
+		$config = EE_Registry::instance()->CFG->template_settings->EED_Events_Archive;
924
+		return isset($config->display_venue) && $config->display_venue && EEH_Venue_View::venue_name() ? true : false;
925
+	}
926
+
927
+
928
+	/**
929
+	 *    display_datetimes
930
+	 *
931
+	 * @access    public
932
+	 * @return    bool
933
+	 */
934
+	public static function display_datetimes()
935
+	{
936
+		$config = EE_Registry::instance()->CFG->template_settings->EED_Events_Archive;
937
+		return isset($config->display_datetimes) && $config->display_datetimes ? true : false;
938
+	}
939
+
940
+
941
+	/**
942
+	 *    event_list_title
943
+	 *
944
+	 * @access    public
945
+	 * @return    string
946
+	 */
947
+	public static function event_list_title()
948
+	{
949
+		return apply_filters(
950
+			'FHEE__archive_espresso_events_template__upcoming_events_h1',
951
+			__('Upcoming Events', 'event_espresso')
952
+		);
953
+	}
954
+
955
+
956
+	// GRAVEYARD
957
+
958
+
959
+	/**
960
+	 * @since 4.4.0
961
+	 */
962
+	public static function _doing_it_wrong_notice($function = '')
963
+	{
964
+		EE_Error::doing_it_wrong(
965
+			__FUNCTION__,
966
+			sprintf(
967
+				__(
968
+					'EED_Events_Archive::%1$s was moved to EEH_Event_Query::%1$s:%2$sPlease update your existing code because the method it calls will be removed in version %3$s',
969
+					'event_espresso'
970
+				),
971
+				$function,
972
+				'<br />',
973
+				'4.6.0'
974
+			),
975
+			'4.4.0'
976
+		);
977
+	}
978
+
979
+
980
+	/**
981
+	 * @deprecated
982
+	 * @since 4.4.0
983
+	 */
984
+	public function get_post_data()
985
+	{
986
+		EEH_Event_Query::set_query_params();
987
+	}
988
+
989
+
990
+	/**
991
+	 * @throws EE_Error
992
+	 * @since 4.4.0
993
+	 * @deprecated
994
+	 */
995
+	public function posts_fields($SQL, WP_Query $wp_query)
996
+	{
997
+		EED_Events_Archive::_doing_it_wrong_notice(__FUNCTION__);
998
+		return EEH_Event_Query::posts_fields($SQL, $wp_query);
999
+	}
1000
+
1001
+
1002
+	/**
1003
+	 * @throws EE_Error
1004
+	 * @since 4.4.0
1005
+	 * @deprecated
1006
+	 */
1007
+	public static function posts_fields_sql_for_orderby($orderby_params = array())
1008
+	{
1009
+		EED_Events_Archive::_doing_it_wrong_notice(__FUNCTION__);
1010
+		return EEH_Event_Query::posts_fields_sql_for_orderby($orderby_params);
1011
+	}
1012
+
1013
+
1014
+	/**
1015
+	 * @throws EE_Error
1016
+	 * @since 4.4.0
1017
+	 * @deprecated
1018
+	 */
1019
+	public function posts_join($SQL, WP_Query $wp_query)
1020
+	{
1021
+		EED_Events_Archive::_doing_it_wrong_notice(__FUNCTION__);
1022
+		return EEH_Event_Query::posts_join($SQL, $wp_query);
1023
+	}
1024
+
1025
+
1026
+	/**
1027
+	 * @deprecated
1028
+	 * @since 4.4.0
1029
+	 */
1030
+	public static function posts_join_sql_for_terms($join_terms = null)
1031
+	{
1032
+		EED_Events_Archive::_doing_it_wrong_notice(__FUNCTION__);
1033
+		return EEH_Event_Query::posts_join_sql_for_terms($join_terms);
1034
+	}
1035
+
1036
+
1037
+	/**
1038
+	 * @throws EE_Error
1039
+	 * @since 4.4.0
1040
+	 * @deprecated
1041
+	 */
1042
+	public static function posts_join_for_orderby($orderby_params = array())
1043
+	{
1044
+		EED_Events_Archive::_doing_it_wrong_notice(__FUNCTION__);
1045
+		return EEH_Event_Query::posts_join_for_orderby($orderby_params);
1046
+	}
1047
+
1048
+
1049
+	/**
1050
+	 * @throws EE_Error
1051
+	 * @since 4.4.0
1052
+	 * @deprecated
1053
+	 */
1054
+	public function posts_where($SQL, WP_Query $wp_query)
1055
+	{
1056
+		EED_Events_Archive::_doing_it_wrong_notice(__FUNCTION__);
1057
+		return EEH_Event_Query::posts_where($SQL, $wp_query);
1058
+	}
1059
+
1060
+
1061
+	/**
1062
+	 * @throws EE_Error
1063
+	 * @since 4.4.0
1064
+	 * @deprecated
1065
+	 */
1066
+	public static function posts_where_sql_for_show_expired($show_expired = false)
1067
+	{
1068
+		EED_Events_Archive::_doing_it_wrong_notice(__FUNCTION__);
1069
+		return EEH_Event_Query::posts_where_sql_for_show_expired($show_expired);
1070
+	}
1071
+
1072
+
1073
+	/**
1074
+	 * @deprecated
1075
+	 * @since 4.4.0
1076
+	 */
1077
+	public static function posts_where_sql_for_event_category_slug($event_category_slug = null)
1078
+	{
1079
+		EED_Events_Archive::_doing_it_wrong_notice(__FUNCTION__);
1080
+		return EEH_Event_Query::posts_where_sql_for_event_category_slug($event_category_slug);
1081
+	}
1082
+
1083
+
1084
+	/**
1085
+	 * @throws EE_Error
1086
+	 * @since 4.4.0
1087
+	 * @deprecated
1088
+	 */
1089
+	public static function posts_where_sql_for_event_list_month($month = null)
1090
+	{
1091
+		EED_Events_Archive::_doing_it_wrong_notice(__FUNCTION__);
1092
+		return EEH_Event_Query::posts_where_sql_for_event_list_month($month);
1093
+	}
1094
+
1095
+
1096
+	/**
1097
+	 * @throws EE_Error
1098
+	 * @since 4.4.0
1099
+	 * @deprecated
1100
+	 */
1101
+	public function posts_orderby($SQL, WP_Query $wp_query)
1102
+	{
1103
+		EED_Events_Archive::_doing_it_wrong_notice(__FUNCTION__);
1104
+		return EEH_Event_Query::posts_orderby($SQL, $wp_query);
1105
+	}
1106
+
1107
+
1108
+	/**
1109
+	 * @throws EE_Error
1110
+	 * @since 4.4.0
1111
+	 * @deprecated
1112
+	 */
1113
+	public static function posts_orderby_sql($orderby_params = array(), $sort = 'ASC')
1114
+	{
1115
+		EED_Events_Archive::_doing_it_wrong_notice(__FUNCTION__);
1116
+		return EEH_Event_Query::posts_orderby_sql($orderby_params, $sort);
1117
+	}
1118 1118
 }
1119 1119
 
1120 1120
 
@@ -1123,9 +1123,9 @@  discard block
 block discarded – undo
1123 1123
  */
1124 1124
 function espresso_get_event_list_ID()
1125 1125
 {
1126
-    EED_Events_Archive::$espresso_event_list_ID++;
1127
-    EED_Events_Archive::$espresso_grid_event_lists[] = EED_Events_Archive::$espresso_event_list_ID;
1128
-    return EED_Events_Archive::$espresso_event_list_ID;
1126
+	EED_Events_Archive::$espresso_event_list_ID++;
1127
+	EED_Events_Archive::$espresso_grid_event_lists[] = EED_Events_Archive::$espresso_event_list_ID;
1128
+	return EED_Events_Archive::$espresso_event_list_ID;
1129 1129
 }
1130 1130
 
1131 1131
 /**
@@ -1133,7 +1133,7 @@  discard block
 block discarded – undo
1133 1133
  */
1134 1134
 function espresso_event_list_title()
1135 1135
 {
1136
-    return EED_Events_Archive::event_list_title();
1136
+	return EED_Events_Archive::event_list_title();
1137 1137
 }
1138 1138
 
1139 1139
 /**
@@ -1142,7 +1142,7 @@  discard block
 block discarded – undo
1142 1142
  */
1143 1143
 function espresso_event_list_css($extra_class = '')
1144 1144
 {
1145
-    return EED_Events_Archive::event_list_css($extra_class);
1145
+	return EED_Events_Archive::event_list_css($extra_class);
1146 1146
 }
1147 1147
 
1148 1148
 /**
@@ -1150,7 +1150,7 @@  discard block
 block discarded – undo
1150 1150
  */
1151 1151
 function espresso_get_event_categories()
1152 1152
 {
1153
-    return EED_Events_Archive::event_categories();
1153
+	return EED_Events_Archive::event_categories();
1154 1154
 }
1155 1155
 
1156 1156
 /**
@@ -1158,7 +1158,7 @@  discard block
 block discarded – undo
1158 1158
  */
1159 1159
 function espresso_display_full_description_in_event_list()
1160 1160
 {
1161
-    return EED_Events_Archive::display_description(2);
1161
+	return EED_Events_Archive::display_description(2);
1162 1162
 }
1163 1163
 
1164 1164
 /**
@@ -1166,7 +1166,7 @@  discard block
 block discarded – undo
1166 1166
  */
1167 1167
 function espresso_display_excerpt_in_event_list()
1168 1168
 {
1169
-    return EED_Events_Archive::display_description(1);
1169
+	return EED_Events_Archive::display_description(1);
1170 1170
 }
1171 1171
 
1172 1172
 /**
@@ -1174,7 +1174,7 @@  discard block
 block discarded – undo
1174 1174
  */
1175 1175
 function espresso_display_ticket_selector_in_event_list()
1176 1176
 {
1177
-    return EED_Events_Archive::display_ticket_selector();
1177
+	return EED_Events_Archive::display_ticket_selector();
1178 1178
 }
1179 1179
 
1180 1180
 /**
@@ -1182,7 +1182,7 @@  discard block
 block discarded – undo
1182 1182
  */
1183 1183
 function espresso_display_venue_in_event_list()
1184 1184
 {
1185
-    return EED_Events_Archive::display_venue();
1185
+	return EED_Events_Archive::display_venue();
1186 1186
 }
1187 1187
 
1188 1188
 /**
@@ -1190,5 +1190,5 @@  discard block
 block discarded – undo
1190 1190
  */
1191 1191
 function espresso_display_datetimes_in_event_list()
1192 1192
 {
1193
-    return EED_Events_Archive::display_datetimes();
1193
+	return EED_Events_Archive::display_datetimes();
1194 1194
 }
Please login to merge, or discard this patch.
payment_methods/Paypal_Express/EEG_Paypal_Express.gateway.php 3 patches
Doc Comments   +2 added lines, -2 removed lines patch added patch discarded remove patch
@@ -20,8 +20,8 @@
 block discarded – undo
20 20
      * Very simple mimic of mb_substr (which WP ensures exists in wp-includes/compat.php). Still has all the problems of mb_substr
21 21
      * (namely, that we might send too many characters to PayPal; however in this case they just issue a warning but nothing breaks)
22 22
      * @param $string
23
-     * @param $start
24
-     * @param $length
23
+     * @param integer $start
24
+     * @param integer $length
25 25
      * @return bool|string
26 26
      */
27 27
     function mb_strcut($string, $start, $length = null)
Please login to merge, or discard this patch.
Spacing   +38 added lines, -38 removed lines patch added patch discarded remove patch
@@ -10,7 +10,7 @@  discard block
 block discarded – undo
10 10
  * ----------------------------------------------
11 11
  */
12 12
 // Quickfix to address https://events.codebasehq.com/projects/event-espresso/tickets/11089 ASAP
13
-if (! function_exists('mb_strcut')) {
13
+if ( ! function_exists('mb_strcut')) {
14 14
     /**
15 15
      * Very simple mimic of mb_substr (which WP ensures exists in wp-includes/compat.php). Still has all the problems of mb_substr
16 16
      * (namely, that we might send too many characters to PayPal; however in this case they just issue a warning but nothing breaks)
@@ -141,7 +141,7 @@  discard block
 block discarded – undo
141 141
         $notify_url = null,
142 142
         $cancel_url = null
143 143
     ) {
144
-        if (! $payment instanceof EEI_Payment) {
144
+        if ( ! $payment instanceof EEI_Payment) {
145 145
             $payment->set_gateway_response(
146 146
                 esc_html__(
147 147
                     'Error. No associated payment was found.',
@@ -152,7 +152,7 @@  discard block
 block discarded – undo
152 152
             return $payment;
153 153
         }
154 154
         $transaction = $payment->transaction();
155
-        if (! $transaction instanceof EEI_Transaction) {
155
+        if ( ! $transaction instanceof EEI_Transaction) {
156 156
             $payment->set_gateway_response(
157 157
                 esc_html__(
158 158
                     'Could not process this payment because it has no associated transaction.',
@@ -199,13 +199,13 @@  discard block
 block discarded – undo
199 199
             $token_request_dtls['PAYMENTREQUEST_0_SHIPTOZIP'] = $primary_attendee->zip();
200 200
             $token_request_dtls['PAYMENTREQUEST_0_EMAIL'] = $primary_attendee->email();
201 201
             $token_request_dtls['PAYMENTREQUEST_0_SHIPTOPHONENUM'] = $primary_attendee->phone();
202
-        } elseif (! $this->_request_shipping_addr) {
202
+        } elseif ( ! $this->_request_shipping_addr) {
203 203
             // Do not request shipping details on the PP Checkout page.
204 204
             $token_request_dtls['NOSHIPPING'] = '1';
205 205
             $token_request_dtls['REQCONFIRMSHIPPING'] = '0';
206 206
         }
207 207
         // Used a business/personal logo on the PayPal page.
208
-        if (! empty($this->_image_url)) {
208
+        if ( ! empty($this->_image_url)) {
209 209
             $token_request_dtls['LOGOIMG'] = $this->_image_url;
210 210
         }
211 211
         $token_request_dtls = apply_filters(
@@ -230,7 +230,7 @@  discard block
 block discarded – undo
230 230
             );
231 231
         } else {
232 232
             if (isset($response_args['L_ERRORCODE'])) {
233
-                $payment->set_gateway_response($response_args['L_ERRORCODE'] . '; ' . $response_args['L_SHORTMESSAGE']);
233
+                $payment->set_gateway_response($response_args['L_ERRORCODE'].'; '.$response_args['L_SHORTMESSAGE']);
234 234
             } else {
235 235
                 $payment->set_gateway_response(
236 236
                     esc_html__(
@@ -261,7 +261,7 @@  discard block
 block discarded – undo
261 261
         if ($payment instanceof EEI_Payment) {
262 262
             $this->log(array('Return from Authorization' => $update_info), $payment);
263 263
             $transaction = $payment->transaction();
264
-            if (! $transaction instanceof EEI_Transaction) {
264
+            if ( ! $transaction instanceof EEI_Transaction) {
265 265
                 $payment->set_gateway_response(
266 266
                     esc_html__(
267 267
                         'Could not process this payment because it has no associated transaction.',
@@ -274,7 +274,7 @@  discard block
 block discarded – undo
274 274
             $primary_registrant = $transaction->primary_registration();
275 275
             $payment_details = $payment->details();
276 276
             // Check if we still have the token.
277
-            if (! isset($payment_details['TOKEN']) || empty($payment_details['TOKEN'])) {
277
+            if ( ! isset($payment_details['TOKEN']) || empty($payment_details['TOKEN'])) {
278 278
                 $payment->set_status($this->_pay_model->failed_status());
279 279
                 return $payment;
280 280
             }
@@ -399,7 +399,7 @@  discard block
 block discarded – undo
399 399
         $itemized_list = array();
400 400
         $gateway_formatter = $this->_get_gateway_formatter();
401 401
         // If we have data from a previous communication with PP (on this transaction) we may use that for our list...
402
-        if (! empty($request_response_args)
402
+        if ( ! empty($request_response_args)
403 403
             && array_key_exists('L_PAYMENTREQUEST_0_AMT0', $request_response_args)
404 404
             && array_key_exists('PAYMENTREQUEST_0_ITEMAMT', $request_response_args)
405 405
         ) {
@@ -407,7 +407,7 @@  discard block
 block discarded – undo
407 407
                 if (strpos($arg_key, 'PAYMENTREQUEST_') !== false
408 408
                     && strpos($arg_key, 'NOTIFYURL') === false
409 409
                 ) {
410
-                    $itemized_list[ $arg_key ] = $arg_val;
410
+                    $itemized_list[$arg_key] = $arg_val;
411 411
                 }
412 412
             }
413 413
             // If we got only a few Items then something is not right.
@@ -460,25 +460,25 @@  discard block
 block discarded – undo
460 460
                         $line_item_quantity = 1;
461 461
                     }
462 462
                     // Item Name.
463
-                    $itemized_list[ 'L_PAYMENTREQUEST_0_NAME' . $item_num ] = mb_strcut(
463
+                    $itemized_list['L_PAYMENTREQUEST_0_NAME'.$item_num] = mb_strcut(
464 464
                         $gateway_formatter->formatLineItemName($line_item, $payment),
465 465
                         0,
466 466
                         127
467 467
                     );
468 468
                     // Item description.
469
-                    $itemized_list[ 'L_PAYMENTREQUEST_0_DESC' . $item_num ] = mb_strcut(
469
+                    $itemized_list['L_PAYMENTREQUEST_0_DESC'.$item_num] = mb_strcut(
470 470
                         $gateway_formatter->formatLineItemDesc($line_item, $payment),
471 471
                         0,
472 472
                         127
473 473
                     );
474 474
                     // Cost of individual item.
475
-                    $itemized_list[ 'L_PAYMENTREQUEST_0_AMT' . $item_num ] = $gateway_formatter->formatCurrency($unit_price);
475
+                    $itemized_list['L_PAYMENTREQUEST_0_AMT'.$item_num] = $gateway_formatter->formatCurrency($unit_price);
476 476
                     // Item Number.
477
-                    $itemized_list[ 'L_PAYMENTREQUEST_0_NUMBER' . $item_num ] = $item_num + 1;
477
+                    $itemized_list['L_PAYMENTREQUEST_0_NUMBER'.$item_num] = $item_num + 1;
478 478
                     // Item quantity.
479
-                    $itemized_list[ 'L_PAYMENTREQUEST_0_QTY' . $item_num ] = $line_item_quantity;
479
+                    $itemized_list['L_PAYMENTREQUEST_0_QTY'.$item_num] = $line_item_quantity;
480 480
                     // Digital item is sold.
481
-                    $itemized_list[ 'L_PAYMENTREQUEST_0_ITEMCATEGORY' . $item_num ] = 'Physical';
481
+                    $itemized_list['L_PAYMENTREQUEST_0_ITEMCATEGORY'.$item_num] = 'Physical';
482 482
                     $itemized_sum += $line_item->total();
483 483
                     ++$item_num;
484 484
                 }
@@ -496,7 +496,7 @@  discard block
 block discarded – undo
496 496
             // add the difference as an extra line item.
497 497
             if ($this->_money->compare_floats($itemized_sum_diff_from_txn_total, 0, '!=')) {
498 498
                 // Item Name.
499
-                $itemized_list[ 'L_PAYMENTREQUEST_0_NAME' . $item_num ] = mb_strcut(
499
+                $itemized_list['L_PAYMENTREQUEST_0_NAME'.$item_num] = mb_strcut(
500 500
                     esc_html__(
501 501
                         'Other (promotion/surcharge/cancellation)',
502 502
                         'event_espresso'
@@ -505,17 +505,17 @@  discard block
 block discarded – undo
505 505
                     127
506 506
                 );
507 507
                 // Item description.
508
-                $itemized_list[ 'L_PAYMENTREQUEST_0_DESC' . $item_num ] = '';
508
+                $itemized_list['L_PAYMENTREQUEST_0_DESC'.$item_num] = '';
509 509
                 // Cost of individual item.
510
-                $itemized_list[ 'L_PAYMENTREQUEST_0_AMT' . $item_num ] = $gateway_formatter->formatCurrency(
510
+                $itemized_list['L_PAYMENTREQUEST_0_AMT'.$item_num] = $gateway_formatter->formatCurrency(
511 511
                     $itemized_sum_diff_from_txn_total
512 512
                 );
513 513
                 // Item Number.
514
-                $itemized_list[ 'L_PAYMENTREQUEST_0_NUMBER' . $item_num ] = $item_num + 1;
514
+                $itemized_list['L_PAYMENTREQUEST_0_NUMBER'.$item_num] = $item_num + 1;
515 515
                 // Item quantity.
516
-                $itemized_list[ 'L_PAYMENTREQUEST_0_QTY' . $item_num ] = 1;
516
+                $itemized_list['L_PAYMENTREQUEST_0_QTY'.$item_num] = 1;
517 517
                 // Digital item is sold.
518
-                $itemized_list[ 'L_PAYMENTREQUEST_0_ITEMCATEGORY' . $item_num ] = 'Physical';
518
+                $itemized_list['L_PAYMENTREQUEST_0_ITEMCATEGORY'.$item_num] = 'Physical';
519 519
                 $item_num++;
520 520
             }
521 521
         } else {
@@ -570,7 +570,7 @@  discard block
 block discarded – undo
570 570
             'BUTTONSOURCE' => 'EventEspresso_SP',
571 571
         );
572 572
         $dtls = array_merge($request_dtls, $request_params);
573
-        $this->_log_clean_request($dtls, $payment, $request_text . ' Request');
573
+        $this->_log_clean_request($dtls, $payment, $request_text.' Request');
574 574
         // Request Customer Details.
575 575
         $request_response = wp_remote_post(
576 576
             $this->_base_gateway_url,
@@ -584,7 +584,7 @@  discard block
 block discarded – undo
584 584
             )
585 585
         );
586 586
         // Log the response.
587
-        $this->log(array($request_text . ' Response' => $request_response), $payment);
587
+        $this->log(array($request_text.' Response' => $request_response), $payment);
588 588
         return $request_response;
589 589
     }
590 590
 
@@ -604,7 +604,7 @@  discard block
 block discarded – undo
604 604
         }
605 605
         $response_args = array();
606 606
         parse_str(urldecode($request_response['body']), $response_args);
607
-        if (! isset($response_args['ACK'])) {
607
+        if ( ! isset($response_args['ACK'])) {
608 608
             return array('status' => false, 'args' => $request_response);
609 609
         }
610 610
         if ((
@@ -651,18 +651,18 @@  discard block
 block discarded – undo
651 651
     {
652 652
         $errors = array();
653 653
         $n = 0;
654
-        while (isset($data_array[ "L_ERRORCODE{$n}" ])) {
655
-            $l_error_code = isset($data_array[ "L_ERRORCODE{$n}" ])
656
-                ? $data_array[ "L_ERRORCODE{$n}" ]
654
+        while (isset($data_array["L_ERRORCODE{$n}"])) {
655
+            $l_error_code = isset($data_array["L_ERRORCODE{$n}"])
656
+                ? $data_array["L_ERRORCODE{$n}"]
657 657
                 : '';
658
-            $l_severity_code = isset($data_array[ "L_SEVERITYCODE{$n}" ])
659
-                ? $data_array[ "L_SEVERITYCODE{$n}" ]
658
+            $l_severity_code = isset($data_array["L_SEVERITYCODE{$n}"])
659
+                ? $data_array["L_SEVERITYCODE{$n}"]
660 660
                 : '';
661
-            $l_short_message = isset($data_array[ "L_SHORTMESSAGE{$n}" ])
662
-                ? $data_array[ "L_SHORTMESSAGE{$n}" ]
661
+            $l_short_message = isset($data_array["L_SHORTMESSAGE{$n}"])
662
+                ? $data_array["L_SHORTMESSAGE{$n}"]
663 663
                 : '';
664
-            $l_long_message = isset($data_array[ "L_LONGMESSAGE{$n}" ])
665
-                ? $data_array[ "L_LONGMESSAGE{$n}" ]
664
+            $l_long_message = isset($data_array["L_LONGMESSAGE{$n}"])
665
+                ? $data_array["L_LONGMESSAGE{$n}"]
666 666
                 : '';
667 667
             if ($n === 0) {
668 668
                 $errors = array(
@@ -672,10 +672,10 @@  discard block
 block discarded – undo
672 672
                     'L_SEVERITYCODE' => $l_severity_code,
673 673
                 );
674 674
             } else {
675
-                $errors['L_ERRORCODE'] .= ', ' . $l_error_code;
676
-                $errors['L_SHORTMESSAGE'] .= ', ' . $l_short_message;
677
-                $errors['L_LONGMESSAGE'] .= ', ' . $l_long_message;
678
-                $errors['L_SEVERITYCODE'] .= ', ' . $l_severity_code;
675
+                $errors['L_ERRORCODE'] .= ', '.$l_error_code;
676
+                $errors['L_SHORTMESSAGE'] .= ', '.$l_short_message;
677
+                $errors['L_LONGMESSAGE'] .= ', '.$l_long_message;
678
+                $errors['L_SEVERITYCODE'] .= ', '.$l_severity_code;
679 679
             }
680 680
             $n++;
681 681
         }
Please login to merge, or discard this patch.
Indentation   +666 added lines, -666 removed lines patch added patch discarded remove patch
@@ -11,674 +11,674 @@
 block discarded – undo
11 11
  */
12 12
 // Quickfix to address https://events.codebasehq.com/projects/event-espresso/tickets/11089 ASAP
13 13
 if (! function_exists('mb_strcut')) {
14
-    /**
15
-     * Very simple mimic of mb_substr (which WP ensures exists in wp-includes/compat.php). Still has all the problems of mb_substr
16
-     * (namely, that we might send too many characters to PayPal; however in this case they just issue a warning but nothing breaks)
17
-     * @param $string
18
-     * @param $start
19
-     * @param $length
20
-     * @return bool|string
21
-     */
22
-    function mb_strcut($string, $start, $length = null)
23
-    {
24
-        return mb_substr($string, $start, $length);
25
-    }
14
+	/**
15
+	 * Very simple mimic of mb_substr (which WP ensures exists in wp-includes/compat.php). Still has all the problems of mb_substr
16
+	 * (namely, that we might send too many characters to PayPal; however in this case they just issue a warning but nothing breaks)
17
+	 * @param $string
18
+	 * @param $start
19
+	 * @param $length
20
+	 * @return bool|string
21
+	 */
22
+	function mb_strcut($string, $start, $length = null)
23
+	{
24
+		return mb_substr($string, $start, $length);
25
+	}
26 26
 }
27 27
 class EEG_Paypal_Express extends EE_Offsite_Gateway
28 28
 {
29 29
 
30
-    /**
31
-     * Merchant API Username.
32
-     *
33
-     * @var string
34
-     */
35
-    protected $_api_username;
36
-
37
-    /**
38
-     * Merchant API Password.
39
-     *
40
-     * @var string
41
-     */
42
-    protected $_api_password;
43
-
44
-    /**
45
-     * API Signature.
46
-     *
47
-     * @var string
48
-     */
49
-    protected $_api_signature;
50
-
51
-    /**
52
-     * Request Shipping address on PP checkout page.
53
-     *
54
-     * @var string
55
-     */
56
-    protected $_request_shipping_addr;
57
-
58
-    /**
59
-     * Business/personal logo.
60
-     *
61
-     * @var string
62
-     */
63
-    protected $_image_url;
64
-
65
-    /**
66
-     * gateway URL variable
67
-     *
68
-     * @var string
69
-     */
70
-    protected $_base_gateway_url = '';
71
-
72
-
73
-
74
-    /**
75
-     * EEG_Paypal_Express constructor.
76
-     */
77
-    public function __construct()
78
-    {
79
-        $this->_currencies_supported = array(
80
-            'USD',
81
-            'AUD',
82
-            'BRL',
83
-            'CAD',
84
-            'CZK',
85
-            'DKK',
86
-            'EUR',
87
-            'HKD',
88
-            'HUF',
89
-            'ILS',
90
-            'JPY',
91
-            'MYR',
92
-            'MXN',
93
-            'NOK',
94
-            'NZD',
95
-            'PHP',
96
-            'PLN',
97
-            'GBP',
98
-            'RUB',
99
-            'SGD',
100
-            'SEK',
101
-            'CHF',
102
-            'TWD',
103
-            'THB',
104
-            'TRY',
105
-            'INR',
106
-        );
107
-        parent::__construct();
108
-    }
109
-
110
-
111
-
112
-    /**
113
-     * Sets the gateway URL variable based on whether debug mode is enabled or not.
114
-     *
115
-     * @param array $settings_array
116
-     */
117
-    public function set_settings($settings_array)
118
-    {
119
-        parent::set_settings($settings_array);
120
-        // Redirect URL.
121
-        $this->_base_gateway_url = $this->_debug_mode
122
-            ? 'https://api-3t.sandbox.paypal.com/nvp'
123
-            : 'https://api-3t.paypal.com/nvp';
124
-    }
125
-
126
-
127
-
128
-    /**
129
-     * @param EEI_Payment $payment
130
-     * @param array       $billing_info
131
-     * @param string      $return_url
132
-     * @param string      $notify_url
133
-     * @param string      $cancel_url
134
-     * @return \EE_Payment|\EEI_Payment
135
-     * @throws \EE_Error
136
-     */
137
-    public function set_redirection_info(
138
-        $payment,
139
-        $billing_info = array(),
140
-        $return_url = null,
141
-        $notify_url = null,
142
-        $cancel_url = null
143
-    ) {
144
-        if (! $payment instanceof EEI_Payment) {
145
-            $payment->set_gateway_response(
146
-                esc_html__(
147
-                    'Error. No associated payment was found.',
148
-                    'event_espresso'
149
-                )
150
-            );
151
-            $payment->set_status($this->_pay_model->failed_status());
152
-            return $payment;
153
-        }
154
-        $transaction = $payment->transaction();
155
-        if (! $transaction instanceof EEI_Transaction) {
156
-            $payment->set_gateway_response(
157
-                esc_html__(
158
-                    'Could not process this payment because it has no associated transaction.',
159
-                    'event_espresso'
160
-                )
161
-            );
162
-            $payment->set_status($this->_pay_model->failed_status());
163
-            return $payment;
164
-        }
165
-        $gateway_formatter = $this->_get_gateway_formatter();
166
-        $order_description = mb_strcut($gateway_formatter->formatOrderDescription($payment), 0, 127);
167
-        $primary_registration = $transaction->primary_registration();
168
-        $primary_attendee = $primary_registration instanceof EE_Registration
169
-            ? $primary_registration->attendee()
170
-            : false;
171
-        $locale = explode('-', get_bloginfo('language'));
172
-        // Gather request parameters.
173
-        $token_request_dtls = array(
174
-            'METHOD'                         => 'SetExpressCheckout',
175
-            'PAYMENTREQUEST_0_AMT'           => $payment->amount(),
176
-            'PAYMENTREQUEST_0_CURRENCYCODE'  => $payment->currency_code(),
177
-            'PAYMENTREQUEST_0_DESC'          => $order_description,
178
-            'RETURNURL'                      => $return_url,
179
-            'CANCELURL'                      => $cancel_url,
180
-            'PAYMENTREQUEST_0_PAYMENTACTION' => 'Sale',
181
-            // Buyer does not need to create a PayPal account to check out.
182
-            // This is referred to as PayPal Account Optional.
183
-            'SOLUTIONTYPE'                   => 'Sole',
184
-            // Locale of the pages displayed by PayPal during Express Checkout.
185
-            'LOCALECODE'                     => $locale[1]
186
-        );
187
-        // Show itemized list.
188
-        $itemized_list = $this->itemize_list($payment, $transaction);
189
-        $token_request_dtls = array_merge($token_request_dtls, $itemized_list);
190
-        // Automatically filling out shipping and contact information.
191
-        if ($this->_request_shipping_addr && $primary_attendee instanceof EEI_Attendee) {
192
-            // If you do not pass the shipping address, PayPal obtains it from the buyer's account profile.
193
-            $token_request_dtls['NOSHIPPING'] = '2';
194
-            $token_request_dtls['PAYMENTREQUEST_0_SHIPTOSTREET'] = $primary_attendee->address();
195
-            $token_request_dtls['PAYMENTREQUEST_0_SHIPTOSTREET2'] = $primary_attendee->address2();
196
-            $token_request_dtls['PAYMENTREQUEST_0_SHIPTOCITY'] = $primary_attendee->city();
197
-            $token_request_dtls['PAYMENTREQUEST_0_SHIPTOSTATE'] = $primary_attendee->state_abbrev();
198
-            $token_request_dtls['PAYMENTREQUEST_0_SHIPTOCOUNTRYCODE'] = $primary_attendee->country_ID();
199
-            $token_request_dtls['PAYMENTREQUEST_0_SHIPTOZIP'] = $primary_attendee->zip();
200
-            $token_request_dtls['PAYMENTREQUEST_0_EMAIL'] = $primary_attendee->email();
201
-            $token_request_dtls['PAYMENTREQUEST_0_SHIPTOPHONENUM'] = $primary_attendee->phone();
202
-        } elseif (! $this->_request_shipping_addr) {
203
-            // Do not request shipping details on the PP Checkout page.
204
-            $token_request_dtls['NOSHIPPING'] = '1';
205
-            $token_request_dtls['REQCONFIRMSHIPPING'] = '0';
206
-        }
207
-        // Used a business/personal logo on the PayPal page.
208
-        if (! empty($this->_image_url)) {
209
-            $token_request_dtls['LOGOIMG'] = $this->_image_url;
210
-        }
211
-        $token_request_dtls = apply_filters(
212
-            'FHEE__EEG_Paypal_Express__set_redirection_info__arguments',
213
-            $token_request_dtls,
214
-            $this
215
-        );
216
-        // Request PayPal token.
217
-        $token_request_response = $this->_ppExpress_request($token_request_dtls, 'Payment Token', $payment);
218
-        $token_rstatus = $this->_ppExpress_check_response($token_request_response);
219
-        $response_args = (isset($token_rstatus['args']) && is_array($token_rstatus['args']))
220
-            ? $token_rstatus['args']
221
-            : array();
222
-        if ($token_rstatus['status']) {
223
-            // We got the Token so we may continue with the payment and redirect the client.
224
-            $payment->set_details($response_args);
225
-            $gateway_url = $this->_debug_mode ? 'https://www.sandbox.paypal.com' : 'https://www.paypal.com';
226
-            $payment->set_redirect_url(
227
-                $gateway_url
228
-                . '/checkoutnow?useraction=commit&cmd=_express-checkout&token='
229
-                . $response_args['TOKEN']
230
-            );
231
-        } else {
232
-            if (isset($response_args['L_ERRORCODE'])) {
233
-                $payment->set_gateway_response($response_args['L_ERRORCODE'] . '; ' . $response_args['L_SHORTMESSAGE']);
234
-            } else {
235
-                $payment->set_gateway_response(
236
-                    esc_html__(
237
-                        'Error occurred while trying to setup the Express Checkout.',
238
-                        'event_espresso'
239
-                    )
240
-                );
241
-            }
242
-            $payment->set_details($response_args);
243
-            $payment->set_status($this->_pay_model->failed_status());
244
-        }
245
-        return $payment;
246
-    }
247
-
248
-
249
-
250
-    /**
251
-     * @param array           $update_info {
252
-     * @type string           $gateway_txn_id
253
-     * @type string status an EEMI_Payment status
254
-     *                                     }
255
-     * @param EEI_Transaction $transaction
256
-     * @return EEI_Payment
257
-     */
258
-    public function handle_payment_update($update_info, $transaction)
259
-    {
260
-        $payment = $transaction instanceof EEI_Transaction ? $transaction->last_payment() : null;
261
-        if ($payment instanceof EEI_Payment) {
262
-            $this->log(array('Return from Authorization' => $update_info), $payment);
263
-            $transaction = $payment->transaction();
264
-            if (! $transaction instanceof EEI_Transaction) {
265
-                $payment->set_gateway_response(
266
-                    esc_html__(
267
-                        'Could not process this payment because it has no associated transaction.',
268
-                        'event_espresso'
269
-                    )
270
-                );
271
-                $payment->set_status($this->_pay_model->failed_status());
272
-                return $payment;
273
-            }
274
-            $primary_registrant = $transaction->primary_registration();
275
-            $payment_details = $payment->details();
276
-            // Check if we still have the token.
277
-            if (! isset($payment_details['TOKEN']) || empty($payment_details['TOKEN'])) {
278
-                $payment->set_status($this->_pay_model->failed_status());
279
-                return $payment;
280
-            }
281
-            $cdetails_request_dtls = array(
282
-                'METHOD' => 'GetExpressCheckoutDetails',
283
-                'TOKEN'  => $payment_details['TOKEN'],
284
-            );
285
-            // Request Customer Details.
286
-            $cdetails_request_response = $this->_ppExpress_request(
287
-                $cdetails_request_dtls,
288
-                'Customer Details',
289
-                $payment
290
-            );
291
-            $cdetails_rstatus = $this->_ppExpress_check_response($cdetails_request_response);
292
-            $cdata_response_args = (isset($cdetails_rstatus['args']) && is_array($cdetails_rstatus['args']))
293
-                ? $cdetails_rstatus['args']
294
-                : array();
295
-            if ($cdetails_rstatus['status']) {
296
-                // We got the PayerID so now we can Complete the transaction.
297
-                $docheckout_request_dtls = array(
298
-                    'METHOD'                         => 'DoExpressCheckoutPayment',
299
-                    'PAYERID'                        => $cdata_response_args['PAYERID'],
300
-                    'TOKEN'                          => $payment_details['TOKEN'],
301
-                    'PAYMENTREQUEST_0_PAYMENTACTION' => 'Sale',
302
-                    'PAYMENTREQUEST_0_AMT'           => $payment->amount(),
303
-                    'PAYMENTREQUEST_0_CURRENCYCODE'  => $payment->currency_code(),
304
-                );
305
-                 // Include itemized list.
306
-                $itemized_list = $this->itemize_list(
307
-                    $payment,
308
-                    $transaction,
309
-                    $cdata_response_args
310
-                );
311
-                $docheckout_request_dtls = array_merge($docheckout_request_dtls, $itemized_list);
312
-                // Payment Checkout/Capture.
313
-                $docheckout_request_response = $this->_ppExpress_request(
314
-                    $docheckout_request_dtls,
315
-                    'Do Payment',
316
-                    $payment
317
-                );
318
-                $docheckout_rstatus = $this->_ppExpress_check_response($docheckout_request_response);
319
-                $docheckout_response_args = (isset($docheckout_rstatus['args']) && is_array($docheckout_rstatus['args']))
320
-                    ? $docheckout_rstatus['args']
321
-                    : array();
322
-                if ($docheckout_rstatus['status']) {
323
-                    // All is well, payment approved.
324
-                    $primary_registration_code = $primary_registrant instanceof EE_Registration ?
325
-                        $primary_registrant->reg_code()
326
-                        : '';
327
-                    $payment->set_extra_accntng($primary_registration_code);
328
-                    $payment->set_amount(isset($docheckout_response_args['PAYMENTINFO_0_AMT'])
329
-                        ? (float) $docheckout_response_args['PAYMENTINFO_0_AMT']
330
-                        : 0);
331
-                    $payment->set_txn_id_chq_nmbr(isset($docheckout_response_args['PAYMENTINFO_0_TRANSACTIONID'])
332
-                        ? $docheckout_response_args['PAYMENTINFO_0_TRANSACTIONID']
333
-                        : null);
334
-                    $payment->set_details($cdata_response_args);
335
-                    $payment->set_gateway_response(isset($docheckout_response_args['PAYMENTINFO_0_ACK'])
336
-                        ? $docheckout_response_args['PAYMENTINFO_0_ACK']
337
-                        : '');
338
-                    $payment->set_status($this->_pay_model->approved_status());
339
-                } else {
340
-                    if (isset($docheckout_response_args['L_ERRORCODE'])) {
341
-                        $payment->set_gateway_response(
342
-                            $docheckout_response_args['L_ERRORCODE']
343
-                            . '; '
344
-                            . $docheckout_response_args['L_SHORTMESSAGE']
345
-                        );
346
-                    } else {
347
-                        $payment->set_gateway_response(
348
-                            esc_html__(
349
-                                'Error occurred while trying to Capture the funds.',
350
-                                'event_espresso'
351
-                            )
352
-                        );
353
-                    }
354
-                    $payment->set_details($docheckout_response_args);
355
-                    $payment->set_status($this->_pay_model->declined_status());
356
-                }
357
-            } else {
358
-                if (isset($cdata_response_args['L_ERRORCODE'])) {
359
-                    $payment->set_gateway_response(
360
-                        $cdata_response_args['L_ERRORCODE']
361
-                        . '; '
362
-                        . $cdata_response_args['L_SHORTMESSAGE']
363
-                    );
364
-                } else {
365
-                    $payment->set_gateway_response(
366
-                        esc_html__(
367
-                            'Error occurred while trying to get payment Details from PayPal.',
368
-                            'event_espresso'
369
-                        )
370
-                    );
371
-                }
372
-                $payment->set_details($cdata_response_args);
373
-                $payment->set_status($this->_pay_model->failed_status());
374
-            }
375
-        } else {
376
-            $payment->set_gateway_response(
377
-                esc_html__(
378
-                    'Error occurred while trying to process the payment.',
379
-                    'event_espresso'
380
-                )
381
-            );
382
-            $payment->set_status($this->_pay_model->failed_status());
383
-        }
384
-        return $payment;
385
-    }
386
-
387
-
388
-
389
-    /**
390
-     *  Make a list of items that are in the giver transaction.
391
-     *
392
-     * @param EEI_Payment     $payment
393
-     * @param EEI_Transaction $transaction
394
-     * @param array           $request_response_args Data from a previous communication with PP.
395
-     * @return array
396
-     */
397
-    public function itemize_list(EEI_Payment $payment, EEI_Transaction $transaction, $request_response_args = array())
398
-    {
399
-        $itemized_list = array();
400
-        $gateway_formatter = $this->_get_gateway_formatter();
401
-        // If we have data from a previous communication with PP (on this transaction) we may use that for our list...
402
-        if (! empty($request_response_args)
403
-            && array_key_exists('L_PAYMENTREQUEST_0_AMT0', $request_response_args)
404
-            && array_key_exists('PAYMENTREQUEST_0_ITEMAMT', $request_response_args)
405
-        ) {
406
-            foreach ($request_response_args as $arg_key => $arg_val) {
407
-                if (strpos($arg_key, 'PAYMENTREQUEST_') !== false
408
-                    && strpos($arg_key, 'NOTIFYURL') === false
409
-                ) {
410
-                    $itemized_list[ $arg_key ] = $arg_val;
411
-                }
412
-            }
413
-            // If we got only a few Items then something is not right.
414
-            if (count($itemized_list) > 2) {
415
-                return $itemized_list;
416
-            } else {
417
-                if (WP_DEBUG) {
418
-                    throw new EE_Error(
419
-                        sprintf(
420
-                            esc_html__(
421
-                                // @codingStandardsIgnoreStart
422
-                                'Unable to continue with the checkout because a proper purchase list could not be generated. The purchased list we could have sent was %1$s',
423
-                                // @codingStandardsIgnoreEnd
424
-                                'event_espresso'
425
-                            ),
426
-                            wp_json_encode($itemized_list)
427
-                        )
428
-                    );
429
-                }
430
-                // Reset the list and log an error, maybe allow to try and generate a new list (below).
431
-                $itemized_list = array();
432
-                $this->log(
433
-                    array(
434
-                        (string) esc_html__(
435
-                            'Could not generate a proper item list with:',
436
-                            'event_espresso'
437
-                        ) => $request_response_args
438
-                    ),
439
-                    $payment
440
-                );
441
-            }
442
-        }
443
-        // ...otherwise we generate a new list for this transaction.
444
-        if ($this->_money->compare_floats($payment->amount(), $transaction->total(), '==')) {
445
-            $item_num = 0;
446
-            $itemized_sum = 0;
447
-            $total_line_items = $transaction->total_line_item();
448
-            // Go through each item in the list.
449
-            foreach ($total_line_items->get_items() as $line_item) {
450
-                if ($line_item instanceof EE_Line_Item) {
451
-                    // PayPal doesn't like line items with 0.00 amount, so we may skip those.
452
-                    if (EEH_Money::compare_floats($line_item->total(), '0.00', '==')) {
453
-                        continue;
454
-                    }
455
-                    $unit_price = $line_item->unit_price();
456
-                    $line_item_quantity = $line_item->quantity();
457
-                    // This is a discount.
458
-                    if ($line_item->is_percent()) {
459
-                        $unit_price = $line_item->total();
460
-                        $line_item_quantity = 1;
461
-                    }
462
-                    // Item Name.
463
-                    $itemized_list[ 'L_PAYMENTREQUEST_0_NAME' . $item_num ] = mb_strcut(
464
-                        $gateway_formatter->formatLineItemName($line_item, $payment),
465
-                        0,
466
-                        127
467
-                    );
468
-                    // Item description.
469
-                    $itemized_list[ 'L_PAYMENTREQUEST_0_DESC' . $item_num ] = mb_strcut(
470
-                        $gateway_formatter->formatLineItemDesc($line_item, $payment),
471
-                        0,
472
-                        127
473
-                    );
474
-                    // Cost of individual item.
475
-                    $itemized_list[ 'L_PAYMENTREQUEST_0_AMT' . $item_num ] = $gateway_formatter->formatCurrency($unit_price);
476
-                    // Item Number.
477
-                    $itemized_list[ 'L_PAYMENTREQUEST_0_NUMBER' . $item_num ] = $item_num + 1;
478
-                    // Item quantity.
479
-                    $itemized_list[ 'L_PAYMENTREQUEST_0_QTY' . $item_num ] = $line_item_quantity;
480
-                    // Digital item is sold.
481
-                    $itemized_list[ 'L_PAYMENTREQUEST_0_ITEMCATEGORY' . $item_num ] = 'Physical';
482
-                    $itemized_sum += $line_item->total();
483
-                    ++$item_num;
484
-                }
485
-            }
486
-            // Item's sales S/H and tax amount.
487
-            $itemized_list['PAYMENTREQUEST_0_ITEMAMT'] = $total_line_items->get_items_total();
488
-            $itemized_list['PAYMENTREQUEST_0_TAXAMT'] = $total_line_items->get_total_tax();
489
-            $itemized_list['PAYMENTREQUEST_0_SHIPPINGAMT'] = '0';
490
-            $itemized_list['PAYMENTREQUEST_0_HANDLINGAMT'] = '0';
491
-            $itemized_sum_diff_from_txn_total = round(
492
-                $transaction->total() - $itemized_sum - $total_line_items->get_total_tax(),
493
-                2
494
-            );
495
-            // If we were not able to recognize some item like promotion, surcharge or cancellation,
496
-            // add the difference as an extra line item.
497
-            if ($this->_money->compare_floats($itemized_sum_diff_from_txn_total, 0, '!=')) {
498
-                // Item Name.
499
-                $itemized_list[ 'L_PAYMENTREQUEST_0_NAME' . $item_num ] = mb_strcut(
500
-                    esc_html__(
501
-                        'Other (promotion/surcharge/cancellation)',
502
-                        'event_espresso'
503
-                    ),
504
-                    0,
505
-                    127
506
-                );
507
-                // Item description.
508
-                $itemized_list[ 'L_PAYMENTREQUEST_0_DESC' . $item_num ] = '';
509
-                // Cost of individual item.
510
-                $itemized_list[ 'L_PAYMENTREQUEST_0_AMT' . $item_num ] = $gateway_formatter->formatCurrency(
511
-                    $itemized_sum_diff_from_txn_total
512
-                );
513
-                // Item Number.
514
-                $itemized_list[ 'L_PAYMENTREQUEST_0_NUMBER' . $item_num ] = $item_num + 1;
515
-                // Item quantity.
516
-                $itemized_list[ 'L_PAYMENTREQUEST_0_QTY' . $item_num ] = 1;
517
-                // Digital item is sold.
518
-                $itemized_list[ 'L_PAYMENTREQUEST_0_ITEMCATEGORY' . $item_num ] = 'Physical';
519
-                $item_num++;
520
-            }
521
-        } else {
522
-            // Just one Item.
523
-            // Item Name.
524
-            $itemized_list['L_PAYMENTREQUEST_0_NAME0'] = mb_strcut(
525
-                $gateway_formatter->formatPartialPaymentLineItemName($payment),
526
-                0,
527
-                127
528
-            );
529
-            // Item description.
530
-            $itemized_list['L_PAYMENTREQUEST_0_DESC0'] = mb_strcut(
531
-                $gateway_formatter->formatPartialPaymentLineItemDesc($payment),
532
-                0,
533
-                127
534
-            );
535
-            // Cost of individual item.
536
-            $itemized_list['L_PAYMENTREQUEST_0_AMT0'] = $gateway_formatter->formatCurrency($payment->amount());
537
-            // Item Number.
538
-            $itemized_list['L_PAYMENTREQUEST_0_NUMBER0'] = 1;
539
-            // Item quantity.
540
-            $itemized_list['L_PAYMENTREQUEST_0_QTY0'] = 1;
541
-            // Digital item is sold.
542
-            $itemized_list['L_PAYMENTREQUEST_0_ITEMCATEGORY0'] = 'Physical';
543
-            // Item's sales S/H and tax amount.
544
-            $itemized_list['PAYMENTREQUEST_0_ITEMAMT'] = $gateway_formatter->formatCurrency($payment->amount());
545
-            $itemized_list['PAYMENTREQUEST_0_TAXAMT'] = '0';
546
-            $itemized_list['PAYMENTREQUEST_0_SHIPPINGAMT'] = '0';
547
-            $itemized_list['PAYMENTREQUEST_0_HANDLINGAMT'] = '0';
548
-        }
549
-        return $itemized_list;
550
-    }
551
-
552
-
553
-
554
-    /**
555
-     *  Make the Express checkout request.
556
-     *
557
-     * @param array       $request_params
558
-     * @param string      $request_text
559
-     * @param EEI_Payment $payment
560
-     * @return mixed
561
-     */
562
-    public function _ppExpress_request($request_params, $request_text, $payment)
563
-    {
564
-        $request_dtls = array(
565
-            'VERSION' => '204.0',
566
-            'USER' => $this->_api_username,
567
-            'PWD' => $this->_api_password,
568
-            'SIGNATURE' => $this->_api_signature,
569
-            // EE will blow up if you change this
570
-            'BUTTONSOURCE' => 'EventEspresso_SP',
571
-        );
572
-        $dtls = array_merge($request_dtls, $request_params);
573
-        $this->_log_clean_request($dtls, $payment, $request_text . ' Request');
574
-        // Request Customer Details.
575
-        $request_response = wp_remote_post(
576
-            $this->_base_gateway_url,
577
-            array(
578
-                'method'      => 'POST',
579
-                'timeout'     => 45,
580
-                'httpversion' => '1.1',
581
-                'cookies'     => array(),
582
-                'headers'     => array(),
583
-                'body'        => http_build_query($dtls, '', '&'),
584
-            )
585
-        );
586
-        // Log the response.
587
-        $this->log(array($request_text . ' Response' => $request_response), $payment);
588
-        return $request_response;
589
-    }
590
-
591
-
592
-
593
-    /**
594
-     *  Check the response status.
595
-     *
596
-     * @param mixed $request_response
597
-     * @return array
598
-     */
599
-    public function _ppExpress_check_response($request_response)
600
-    {
601
-        if (is_wp_error($request_response) || empty($request_response['body'])) {
602
-            // If we got here then there was an error in this request.
603
-            return array('status' => false, 'args' => $request_response);
604
-        }
605
-        $response_args = array();
606
-        parse_str(urldecode($request_response['body']), $response_args);
607
-        if (! isset($response_args['ACK'])) {
608
-            return array('status' => false, 'args' => $request_response);
609
-        }
610
-        if ((
611
-                isset($response_args['PAYERID'])
612
-                || isset($response_args['TOKEN'])
613
-                || isset($response_args['PAYMENTINFO_0_TRANSACTIONID'])
614
-                || (isset($response_args['PAYMENTSTATUS']) && $response_args['PAYMENTSTATUS'] === 'Completed')
615
-            )
616
-            && in_array($response_args['ACK'], array('Success', 'SuccessWithWarning'), true)
617
-        ) {
618
-            // Response status OK, return response parameters for further processing.
619
-            return array('status' => true, 'args' => $response_args);
620
-        }
621
-        $errors = $this->_get_errors($response_args);
622
-        return array('status' => false, 'args' => $errors);
623
-    }
624
-
625
-
626
-
627
-    /**
628
-     *  Log a "Cleared" request.
629
-     *
630
-     * @param array       $request
631
-     * @param EEI_Payment $payment
632
-     * @param string      $info
633
-     * @return void
634
-     */
635
-    private function _log_clean_request($request, $payment, $info)
636
-    {
637
-        $cleaned_request_data = $request;
638
-        unset($cleaned_request_data['PWD'], $cleaned_request_data['USER'], $cleaned_request_data['SIGNATURE']);
639
-        $this->log(array($info => $cleaned_request_data), $payment);
640
-    }
641
-
642
-
643
-
644
-    /**
645
-     *  Get error from the response data.
646
-     *
647
-     * @param array $data_array
648
-     * @return array
649
-     */
650
-    private function _get_errors($data_array)
651
-    {
652
-        $errors = array();
653
-        $n = 0;
654
-        while (isset($data_array[ "L_ERRORCODE{$n}" ])) {
655
-            $l_error_code = isset($data_array[ "L_ERRORCODE{$n}" ])
656
-                ? $data_array[ "L_ERRORCODE{$n}" ]
657
-                : '';
658
-            $l_severity_code = isset($data_array[ "L_SEVERITYCODE{$n}" ])
659
-                ? $data_array[ "L_SEVERITYCODE{$n}" ]
660
-                : '';
661
-            $l_short_message = isset($data_array[ "L_SHORTMESSAGE{$n}" ])
662
-                ? $data_array[ "L_SHORTMESSAGE{$n}" ]
663
-                : '';
664
-            $l_long_message = isset($data_array[ "L_LONGMESSAGE{$n}" ])
665
-                ? $data_array[ "L_LONGMESSAGE{$n}" ]
666
-                : '';
667
-            if ($n === 0) {
668
-                $errors = array(
669
-                    'L_ERRORCODE'    => $l_error_code,
670
-                    'L_SHORTMESSAGE' => $l_short_message,
671
-                    'L_LONGMESSAGE'  => $l_long_message,
672
-                    'L_SEVERITYCODE' => $l_severity_code,
673
-                );
674
-            } else {
675
-                $errors['L_ERRORCODE'] .= ', ' . $l_error_code;
676
-                $errors['L_SHORTMESSAGE'] .= ', ' . $l_short_message;
677
-                $errors['L_LONGMESSAGE'] .= ', ' . $l_long_message;
678
-                $errors['L_SEVERITYCODE'] .= ', ' . $l_severity_code;
679
-            }
680
-            $n++;
681
-        }
682
-        return $errors;
683
-    }
30
+	/**
31
+	 * Merchant API Username.
32
+	 *
33
+	 * @var string
34
+	 */
35
+	protected $_api_username;
36
+
37
+	/**
38
+	 * Merchant API Password.
39
+	 *
40
+	 * @var string
41
+	 */
42
+	protected $_api_password;
43
+
44
+	/**
45
+	 * API Signature.
46
+	 *
47
+	 * @var string
48
+	 */
49
+	protected $_api_signature;
50
+
51
+	/**
52
+	 * Request Shipping address on PP checkout page.
53
+	 *
54
+	 * @var string
55
+	 */
56
+	protected $_request_shipping_addr;
57
+
58
+	/**
59
+	 * Business/personal logo.
60
+	 *
61
+	 * @var string
62
+	 */
63
+	protected $_image_url;
64
+
65
+	/**
66
+	 * gateway URL variable
67
+	 *
68
+	 * @var string
69
+	 */
70
+	protected $_base_gateway_url = '';
71
+
72
+
73
+
74
+	/**
75
+	 * EEG_Paypal_Express constructor.
76
+	 */
77
+	public function __construct()
78
+	{
79
+		$this->_currencies_supported = array(
80
+			'USD',
81
+			'AUD',
82
+			'BRL',
83
+			'CAD',
84
+			'CZK',
85
+			'DKK',
86
+			'EUR',
87
+			'HKD',
88
+			'HUF',
89
+			'ILS',
90
+			'JPY',
91
+			'MYR',
92
+			'MXN',
93
+			'NOK',
94
+			'NZD',
95
+			'PHP',
96
+			'PLN',
97
+			'GBP',
98
+			'RUB',
99
+			'SGD',
100
+			'SEK',
101
+			'CHF',
102
+			'TWD',
103
+			'THB',
104
+			'TRY',
105
+			'INR',
106
+		);
107
+		parent::__construct();
108
+	}
109
+
110
+
111
+
112
+	/**
113
+	 * Sets the gateway URL variable based on whether debug mode is enabled or not.
114
+	 *
115
+	 * @param array $settings_array
116
+	 */
117
+	public function set_settings($settings_array)
118
+	{
119
+		parent::set_settings($settings_array);
120
+		// Redirect URL.
121
+		$this->_base_gateway_url = $this->_debug_mode
122
+			? 'https://api-3t.sandbox.paypal.com/nvp'
123
+			: 'https://api-3t.paypal.com/nvp';
124
+	}
125
+
126
+
127
+
128
+	/**
129
+	 * @param EEI_Payment $payment
130
+	 * @param array       $billing_info
131
+	 * @param string      $return_url
132
+	 * @param string      $notify_url
133
+	 * @param string      $cancel_url
134
+	 * @return \EE_Payment|\EEI_Payment
135
+	 * @throws \EE_Error
136
+	 */
137
+	public function set_redirection_info(
138
+		$payment,
139
+		$billing_info = array(),
140
+		$return_url = null,
141
+		$notify_url = null,
142
+		$cancel_url = null
143
+	) {
144
+		if (! $payment instanceof EEI_Payment) {
145
+			$payment->set_gateway_response(
146
+				esc_html__(
147
+					'Error. No associated payment was found.',
148
+					'event_espresso'
149
+				)
150
+			);
151
+			$payment->set_status($this->_pay_model->failed_status());
152
+			return $payment;
153
+		}
154
+		$transaction = $payment->transaction();
155
+		if (! $transaction instanceof EEI_Transaction) {
156
+			$payment->set_gateway_response(
157
+				esc_html__(
158
+					'Could not process this payment because it has no associated transaction.',
159
+					'event_espresso'
160
+				)
161
+			);
162
+			$payment->set_status($this->_pay_model->failed_status());
163
+			return $payment;
164
+		}
165
+		$gateway_formatter = $this->_get_gateway_formatter();
166
+		$order_description = mb_strcut($gateway_formatter->formatOrderDescription($payment), 0, 127);
167
+		$primary_registration = $transaction->primary_registration();
168
+		$primary_attendee = $primary_registration instanceof EE_Registration
169
+			? $primary_registration->attendee()
170
+			: false;
171
+		$locale = explode('-', get_bloginfo('language'));
172
+		// Gather request parameters.
173
+		$token_request_dtls = array(
174
+			'METHOD'                         => 'SetExpressCheckout',
175
+			'PAYMENTREQUEST_0_AMT'           => $payment->amount(),
176
+			'PAYMENTREQUEST_0_CURRENCYCODE'  => $payment->currency_code(),
177
+			'PAYMENTREQUEST_0_DESC'          => $order_description,
178
+			'RETURNURL'                      => $return_url,
179
+			'CANCELURL'                      => $cancel_url,
180
+			'PAYMENTREQUEST_0_PAYMENTACTION' => 'Sale',
181
+			// Buyer does not need to create a PayPal account to check out.
182
+			// This is referred to as PayPal Account Optional.
183
+			'SOLUTIONTYPE'                   => 'Sole',
184
+			// Locale of the pages displayed by PayPal during Express Checkout.
185
+			'LOCALECODE'                     => $locale[1]
186
+		);
187
+		// Show itemized list.
188
+		$itemized_list = $this->itemize_list($payment, $transaction);
189
+		$token_request_dtls = array_merge($token_request_dtls, $itemized_list);
190
+		// Automatically filling out shipping and contact information.
191
+		if ($this->_request_shipping_addr && $primary_attendee instanceof EEI_Attendee) {
192
+			// If you do not pass the shipping address, PayPal obtains it from the buyer's account profile.
193
+			$token_request_dtls['NOSHIPPING'] = '2';
194
+			$token_request_dtls['PAYMENTREQUEST_0_SHIPTOSTREET'] = $primary_attendee->address();
195
+			$token_request_dtls['PAYMENTREQUEST_0_SHIPTOSTREET2'] = $primary_attendee->address2();
196
+			$token_request_dtls['PAYMENTREQUEST_0_SHIPTOCITY'] = $primary_attendee->city();
197
+			$token_request_dtls['PAYMENTREQUEST_0_SHIPTOSTATE'] = $primary_attendee->state_abbrev();
198
+			$token_request_dtls['PAYMENTREQUEST_0_SHIPTOCOUNTRYCODE'] = $primary_attendee->country_ID();
199
+			$token_request_dtls['PAYMENTREQUEST_0_SHIPTOZIP'] = $primary_attendee->zip();
200
+			$token_request_dtls['PAYMENTREQUEST_0_EMAIL'] = $primary_attendee->email();
201
+			$token_request_dtls['PAYMENTREQUEST_0_SHIPTOPHONENUM'] = $primary_attendee->phone();
202
+		} elseif (! $this->_request_shipping_addr) {
203
+			// Do not request shipping details on the PP Checkout page.
204
+			$token_request_dtls['NOSHIPPING'] = '1';
205
+			$token_request_dtls['REQCONFIRMSHIPPING'] = '0';
206
+		}
207
+		// Used a business/personal logo on the PayPal page.
208
+		if (! empty($this->_image_url)) {
209
+			$token_request_dtls['LOGOIMG'] = $this->_image_url;
210
+		}
211
+		$token_request_dtls = apply_filters(
212
+			'FHEE__EEG_Paypal_Express__set_redirection_info__arguments',
213
+			$token_request_dtls,
214
+			$this
215
+		);
216
+		// Request PayPal token.
217
+		$token_request_response = $this->_ppExpress_request($token_request_dtls, 'Payment Token', $payment);
218
+		$token_rstatus = $this->_ppExpress_check_response($token_request_response);
219
+		$response_args = (isset($token_rstatus['args']) && is_array($token_rstatus['args']))
220
+			? $token_rstatus['args']
221
+			: array();
222
+		if ($token_rstatus['status']) {
223
+			// We got the Token so we may continue with the payment and redirect the client.
224
+			$payment->set_details($response_args);
225
+			$gateway_url = $this->_debug_mode ? 'https://www.sandbox.paypal.com' : 'https://www.paypal.com';
226
+			$payment->set_redirect_url(
227
+				$gateway_url
228
+				. '/checkoutnow?useraction=commit&cmd=_express-checkout&token='
229
+				. $response_args['TOKEN']
230
+			);
231
+		} else {
232
+			if (isset($response_args['L_ERRORCODE'])) {
233
+				$payment->set_gateway_response($response_args['L_ERRORCODE'] . '; ' . $response_args['L_SHORTMESSAGE']);
234
+			} else {
235
+				$payment->set_gateway_response(
236
+					esc_html__(
237
+						'Error occurred while trying to setup the Express Checkout.',
238
+						'event_espresso'
239
+					)
240
+				);
241
+			}
242
+			$payment->set_details($response_args);
243
+			$payment->set_status($this->_pay_model->failed_status());
244
+		}
245
+		return $payment;
246
+	}
247
+
248
+
249
+
250
+	/**
251
+	 * @param array           $update_info {
252
+	 * @type string           $gateway_txn_id
253
+	 * @type string status an EEMI_Payment status
254
+	 *                                     }
255
+	 * @param EEI_Transaction $transaction
256
+	 * @return EEI_Payment
257
+	 */
258
+	public function handle_payment_update($update_info, $transaction)
259
+	{
260
+		$payment = $transaction instanceof EEI_Transaction ? $transaction->last_payment() : null;
261
+		if ($payment instanceof EEI_Payment) {
262
+			$this->log(array('Return from Authorization' => $update_info), $payment);
263
+			$transaction = $payment->transaction();
264
+			if (! $transaction instanceof EEI_Transaction) {
265
+				$payment->set_gateway_response(
266
+					esc_html__(
267
+						'Could not process this payment because it has no associated transaction.',
268
+						'event_espresso'
269
+					)
270
+				);
271
+				$payment->set_status($this->_pay_model->failed_status());
272
+				return $payment;
273
+			}
274
+			$primary_registrant = $transaction->primary_registration();
275
+			$payment_details = $payment->details();
276
+			// Check if we still have the token.
277
+			if (! isset($payment_details['TOKEN']) || empty($payment_details['TOKEN'])) {
278
+				$payment->set_status($this->_pay_model->failed_status());
279
+				return $payment;
280
+			}
281
+			$cdetails_request_dtls = array(
282
+				'METHOD' => 'GetExpressCheckoutDetails',
283
+				'TOKEN'  => $payment_details['TOKEN'],
284
+			);
285
+			// Request Customer Details.
286
+			$cdetails_request_response = $this->_ppExpress_request(
287
+				$cdetails_request_dtls,
288
+				'Customer Details',
289
+				$payment
290
+			);
291
+			$cdetails_rstatus = $this->_ppExpress_check_response($cdetails_request_response);
292
+			$cdata_response_args = (isset($cdetails_rstatus['args']) && is_array($cdetails_rstatus['args']))
293
+				? $cdetails_rstatus['args']
294
+				: array();
295
+			if ($cdetails_rstatus['status']) {
296
+				// We got the PayerID so now we can Complete the transaction.
297
+				$docheckout_request_dtls = array(
298
+					'METHOD'                         => 'DoExpressCheckoutPayment',
299
+					'PAYERID'                        => $cdata_response_args['PAYERID'],
300
+					'TOKEN'                          => $payment_details['TOKEN'],
301
+					'PAYMENTREQUEST_0_PAYMENTACTION' => 'Sale',
302
+					'PAYMENTREQUEST_0_AMT'           => $payment->amount(),
303
+					'PAYMENTREQUEST_0_CURRENCYCODE'  => $payment->currency_code(),
304
+				);
305
+				 // Include itemized list.
306
+				$itemized_list = $this->itemize_list(
307
+					$payment,
308
+					$transaction,
309
+					$cdata_response_args
310
+				);
311
+				$docheckout_request_dtls = array_merge($docheckout_request_dtls, $itemized_list);
312
+				// Payment Checkout/Capture.
313
+				$docheckout_request_response = $this->_ppExpress_request(
314
+					$docheckout_request_dtls,
315
+					'Do Payment',
316
+					$payment
317
+				);
318
+				$docheckout_rstatus = $this->_ppExpress_check_response($docheckout_request_response);
319
+				$docheckout_response_args = (isset($docheckout_rstatus['args']) && is_array($docheckout_rstatus['args']))
320
+					? $docheckout_rstatus['args']
321
+					: array();
322
+				if ($docheckout_rstatus['status']) {
323
+					// All is well, payment approved.
324
+					$primary_registration_code = $primary_registrant instanceof EE_Registration ?
325
+						$primary_registrant->reg_code()
326
+						: '';
327
+					$payment->set_extra_accntng($primary_registration_code);
328
+					$payment->set_amount(isset($docheckout_response_args['PAYMENTINFO_0_AMT'])
329
+						? (float) $docheckout_response_args['PAYMENTINFO_0_AMT']
330
+						: 0);
331
+					$payment->set_txn_id_chq_nmbr(isset($docheckout_response_args['PAYMENTINFO_0_TRANSACTIONID'])
332
+						? $docheckout_response_args['PAYMENTINFO_0_TRANSACTIONID']
333
+						: null);
334
+					$payment->set_details($cdata_response_args);
335
+					$payment->set_gateway_response(isset($docheckout_response_args['PAYMENTINFO_0_ACK'])
336
+						? $docheckout_response_args['PAYMENTINFO_0_ACK']
337
+						: '');
338
+					$payment->set_status($this->_pay_model->approved_status());
339
+				} else {
340
+					if (isset($docheckout_response_args['L_ERRORCODE'])) {
341
+						$payment->set_gateway_response(
342
+							$docheckout_response_args['L_ERRORCODE']
343
+							. '; '
344
+							. $docheckout_response_args['L_SHORTMESSAGE']
345
+						);
346
+					} else {
347
+						$payment->set_gateway_response(
348
+							esc_html__(
349
+								'Error occurred while trying to Capture the funds.',
350
+								'event_espresso'
351
+							)
352
+						);
353
+					}
354
+					$payment->set_details($docheckout_response_args);
355
+					$payment->set_status($this->_pay_model->declined_status());
356
+				}
357
+			} else {
358
+				if (isset($cdata_response_args['L_ERRORCODE'])) {
359
+					$payment->set_gateway_response(
360
+						$cdata_response_args['L_ERRORCODE']
361
+						. '; '
362
+						. $cdata_response_args['L_SHORTMESSAGE']
363
+					);
364
+				} else {
365
+					$payment->set_gateway_response(
366
+						esc_html__(
367
+							'Error occurred while trying to get payment Details from PayPal.',
368
+							'event_espresso'
369
+						)
370
+					);
371
+				}
372
+				$payment->set_details($cdata_response_args);
373
+				$payment->set_status($this->_pay_model->failed_status());
374
+			}
375
+		} else {
376
+			$payment->set_gateway_response(
377
+				esc_html__(
378
+					'Error occurred while trying to process the payment.',
379
+					'event_espresso'
380
+				)
381
+			);
382
+			$payment->set_status($this->_pay_model->failed_status());
383
+		}
384
+		return $payment;
385
+	}
386
+
387
+
388
+
389
+	/**
390
+	 *  Make a list of items that are in the giver transaction.
391
+	 *
392
+	 * @param EEI_Payment     $payment
393
+	 * @param EEI_Transaction $transaction
394
+	 * @param array           $request_response_args Data from a previous communication with PP.
395
+	 * @return array
396
+	 */
397
+	public function itemize_list(EEI_Payment $payment, EEI_Transaction $transaction, $request_response_args = array())
398
+	{
399
+		$itemized_list = array();
400
+		$gateway_formatter = $this->_get_gateway_formatter();
401
+		// If we have data from a previous communication with PP (on this transaction) we may use that for our list...
402
+		if (! empty($request_response_args)
403
+			&& array_key_exists('L_PAYMENTREQUEST_0_AMT0', $request_response_args)
404
+			&& array_key_exists('PAYMENTREQUEST_0_ITEMAMT', $request_response_args)
405
+		) {
406
+			foreach ($request_response_args as $arg_key => $arg_val) {
407
+				if (strpos($arg_key, 'PAYMENTREQUEST_') !== false
408
+					&& strpos($arg_key, 'NOTIFYURL') === false
409
+				) {
410
+					$itemized_list[ $arg_key ] = $arg_val;
411
+				}
412
+			}
413
+			// If we got only a few Items then something is not right.
414
+			if (count($itemized_list) > 2) {
415
+				return $itemized_list;
416
+			} else {
417
+				if (WP_DEBUG) {
418
+					throw new EE_Error(
419
+						sprintf(
420
+							esc_html__(
421
+								// @codingStandardsIgnoreStart
422
+								'Unable to continue with the checkout because a proper purchase list could not be generated. The purchased list we could have sent was %1$s',
423
+								// @codingStandardsIgnoreEnd
424
+								'event_espresso'
425
+							),
426
+							wp_json_encode($itemized_list)
427
+						)
428
+					);
429
+				}
430
+				// Reset the list and log an error, maybe allow to try and generate a new list (below).
431
+				$itemized_list = array();
432
+				$this->log(
433
+					array(
434
+						(string) esc_html__(
435
+							'Could not generate a proper item list with:',
436
+							'event_espresso'
437
+						) => $request_response_args
438
+					),
439
+					$payment
440
+				);
441
+			}
442
+		}
443
+		// ...otherwise we generate a new list for this transaction.
444
+		if ($this->_money->compare_floats($payment->amount(), $transaction->total(), '==')) {
445
+			$item_num = 0;
446
+			$itemized_sum = 0;
447
+			$total_line_items = $transaction->total_line_item();
448
+			// Go through each item in the list.
449
+			foreach ($total_line_items->get_items() as $line_item) {
450
+				if ($line_item instanceof EE_Line_Item) {
451
+					// PayPal doesn't like line items with 0.00 amount, so we may skip those.
452
+					if (EEH_Money::compare_floats($line_item->total(), '0.00', '==')) {
453
+						continue;
454
+					}
455
+					$unit_price = $line_item->unit_price();
456
+					$line_item_quantity = $line_item->quantity();
457
+					// This is a discount.
458
+					if ($line_item->is_percent()) {
459
+						$unit_price = $line_item->total();
460
+						$line_item_quantity = 1;
461
+					}
462
+					// Item Name.
463
+					$itemized_list[ 'L_PAYMENTREQUEST_0_NAME' . $item_num ] = mb_strcut(
464
+						$gateway_formatter->formatLineItemName($line_item, $payment),
465
+						0,
466
+						127
467
+					);
468
+					// Item description.
469
+					$itemized_list[ 'L_PAYMENTREQUEST_0_DESC' . $item_num ] = mb_strcut(
470
+						$gateway_formatter->formatLineItemDesc($line_item, $payment),
471
+						0,
472
+						127
473
+					);
474
+					// Cost of individual item.
475
+					$itemized_list[ 'L_PAYMENTREQUEST_0_AMT' . $item_num ] = $gateway_formatter->formatCurrency($unit_price);
476
+					// Item Number.
477
+					$itemized_list[ 'L_PAYMENTREQUEST_0_NUMBER' . $item_num ] = $item_num + 1;
478
+					// Item quantity.
479
+					$itemized_list[ 'L_PAYMENTREQUEST_0_QTY' . $item_num ] = $line_item_quantity;
480
+					// Digital item is sold.
481
+					$itemized_list[ 'L_PAYMENTREQUEST_0_ITEMCATEGORY' . $item_num ] = 'Physical';
482
+					$itemized_sum += $line_item->total();
483
+					++$item_num;
484
+				}
485
+			}
486
+			// Item's sales S/H and tax amount.
487
+			$itemized_list['PAYMENTREQUEST_0_ITEMAMT'] = $total_line_items->get_items_total();
488
+			$itemized_list['PAYMENTREQUEST_0_TAXAMT'] = $total_line_items->get_total_tax();
489
+			$itemized_list['PAYMENTREQUEST_0_SHIPPINGAMT'] = '0';
490
+			$itemized_list['PAYMENTREQUEST_0_HANDLINGAMT'] = '0';
491
+			$itemized_sum_diff_from_txn_total = round(
492
+				$transaction->total() - $itemized_sum - $total_line_items->get_total_tax(),
493
+				2
494
+			);
495
+			// If we were not able to recognize some item like promotion, surcharge or cancellation,
496
+			// add the difference as an extra line item.
497
+			if ($this->_money->compare_floats($itemized_sum_diff_from_txn_total, 0, '!=')) {
498
+				// Item Name.
499
+				$itemized_list[ 'L_PAYMENTREQUEST_0_NAME' . $item_num ] = mb_strcut(
500
+					esc_html__(
501
+						'Other (promotion/surcharge/cancellation)',
502
+						'event_espresso'
503
+					),
504
+					0,
505
+					127
506
+				);
507
+				// Item description.
508
+				$itemized_list[ 'L_PAYMENTREQUEST_0_DESC' . $item_num ] = '';
509
+				// Cost of individual item.
510
+				$itemized_list[ 'L_PAYMENTREQUEST_0_AMT' . $item_num ] = $gateway_formatter->formatCurrency(
511
+					$itemized_sum_diff_from_txn_total
512
+				);
513
+				// Item Number.
514
+				$itemized_list[ 'L_PAYMENTREQUEST_0_NUMBER' . $item_num ] = $item_num + 1;
515
+				// Item quantity.
516
+				$itemized_list[ 'L_PAYMENTREQUEST_0_QTY' . $item_num ] = 1;
517
+				// Digital item is sold.
518
+				$itemized_list[ 'L_PAYMENTREQUEST_0_ITEMCATEGORY' . $item_num ] = 'Physical';
519
+				$item_num++;
520
+			}
521
+		} else {
522
+			// Just one Item.
523
+			// Item Name.
524
+			$itemized_list['L_PAYMENTREQUEST_0_NAME0'] = mb_strcut(
525
+				$gateway_formatter->formatPartialPaymentLineItemName($payment),
526
+				0,
527
+				127
528
+			);
529
+			// Item description.
530
+			$itemized_list['L_PAYMENTREQUEST_0_DESC0'] = mb_strcut(
531
+				$gateway_formatter->formatPartialPaymentLineItemDesc($payment),
532
+				0,
533
+				127
534
+			);
535
+			// Cost of individual item.
536
+			$itemized_list['L_PAYMENTREQUEST_0_AMT0'] = $gateway_formatter->formatCurrency($payment->amount());
537
+			// Item Number.
538
+			$itemized_list['L_PAYMENTREQUEST_0_NUMBER0'] = 1;
539
+			// Item quantity.
540
+			$itemized_list['L_PAYMENTREQUEST_0_QTY0'] = 1;
541
+			// Digital item is sold.
542
+			$itemized_list['L_PAYMENTREQUEST_0_ITEMCATEGORY0'] = 'Physical';
543
+			// Item's sales S/H and tax amount.
544
+			$itemized_list['PAYMENTREQUEST_0_ITEMAMT'] = $gateway_formatter->formatCurrency($payment->amount());
545
+			$itemized_list['PAYMENTREQUEST_0_TAXAMT'] = '0';
546
+			$itemized_list['PAYMENTREQUEST_0_SHIPPINGAMT'] = '0';
547
+			$itemized_list['PAYMENTREQUEST_0_HANDLINGAMT'] = '0';
548
+		}
549
+		return $itemized_list;
550
+	}
551
+
552
+
553
+
554
+	/**
555
+	 *  Make the Express checkout request.
556
+	 *
557
+	 * @param array       $request_params
558
+	 * @param string      $request_text
559
+	 * @param EEI_Payment $payment
560
+	 * @return mixed
561
+	 */
562
+	public function _ppExpress_request($request_params, $request_text, $payment)
563
+	{
564
+		$request_dtls = array(
565
+			'VERSION' => '204.0',
566
+			'USER' => $this->_api_username,
567
+			'PWD' => $this->_api_password,
568
+			'SIGNATURE' => $this->_api_signature,
569
+			// EE will blow up if you change this
570
+			'BUTTONSOURCE' => 'EventEspresso_SP',
571
+		);
572
+		$dtls = array_merge($request_dtls, $request_params);
573
+		$this->_log_clean_request($dtls, $payment, $request_text . ' Request');
574
+		// Request Customer Details.
575
+		$request_response = wp_remote_post(
576
+			$this->_base_gateway_url,
577
+			array(
578
+				'method'      => 'POST',
579
+				'timeout'     => 45,
580
+				'httpversion' => '1.1',
581
+				'cookies'     => array(),
582
+				'headers'     => array(),
583
+				'body'        => http_build_query($dtls, '', '&'),
584
+			)
585
+		);
586
+		// Log the response.
587
+		$this->log(array($request_text . ' Response' => $request_response), $payment);
588
+		return $request_response;
589
+	}
590
+
591
+
592
+
593
+	/**
594
+	 *  Check the response status.
595
+	 *
596
+	 * @param mixed $request_response
597
+	 * @return array
598
+	 */
599
+	public function _ppExpress_check_response($request_response)
600
+	{
601
+		if (is_wp_error($request_response) || empty($request_response['body'])) {
602
+			// If we got here then there was an error in this request.
603
+			return array('status' => false, 'args' => $request_response);
604
+		}
605
+		$response_args = array();
606
+		parse_str(urldecode($request_response['body']), $response_args);
607
+		if (! isset($response_args['ACK'])) {
608
+			return array('status' => false, 'args' => $request_response);
609
+		}
610
+		if ((
611
+				isset($response_args['PAYERID'])
612
+				|| isset($response_args['TOKEN'])
613
+				|| isset($response_args['PAYMENTINFO_0_TRANSACTIONID'])
614
+				|| (isset($response_args['PAYMENTSTATUS']) && $response_args['PAYMENTSTATUS'] === 'Completed')
615
+			)
616
+			&& in_array($response_args['ACK'], array('Success', 'SuccessWithWarning'), true)
617
+		) {
618
+			// Response status OK, return response parameters for further processing.
619
+			return array('status' => true, 'args' => $response_args);
620
+		}
621
+		$errors = $this->_get_errors($response_args);
622
+		return array('status' => false, 'args' => $errors);
623
+	}
624
+
625
+
626
+
627
+	/**
628
+	 *  Log a "Cleared" request.
629
+	 *
630
+	 * @param array       $request
631
+	 * @param EEI_Payment $payment
632
+	 * @param string      $info
633
+	 * @return void
634
+	 */
635
+	private function _log_clean_request($request, $payment, $info)
636
+	{
637
+		$cleaned_request_data = $request;
638
+		unset($cleaned_request_data['PWD'], $cleaned_request_data['USER'], $cleaned_request_data['SIGNATURE']);
639
+		$this->log(array($info => $cleaned_request_data), $payment);
640
+	}
641
+
642
+
643
+
644
+	/**
645
+	 *  Get error from the response data.
646
+	 *
647
+	 * @param array $data_array
648
+	 * @return array
649
+	 */
650
+	private function _get_errors($data_array)
651
+	{
652
+		$errors = array();
653
+		$n = 0;
654
+		while (isset($data_array[ "L_ERRORCODE{$n}" ])) {
655
+			$l_error_code = isset($data_array[ "L_ERRORCODE{$n}" ])
656
+				? $data_array[ "L_ERRORCODE{$n}" ]
657
+				: '';
658
+			$l_severity_code = isset($data_array[ "L_SEVERITYCODE{$n}" ])
659
+				? $data_array[ "L_SEVERITYCODE{$n}" ]
660
+				: '';
661
+			$l_short_message = isset($data_array[ "L_SHORTMESSAGE{$n}" ])
662
+				? $data_array[ "L_SHORTMESSAGE{$n}" ]
663
+				: '';
664
+			$l_long_message = isset($data_array[ "L_LONGMESSAGE{$n}" ])
665
+				? $data_array[ "L_LONGMESSAGE{$n}" ]
666
+				: '';
667
+			if ($n === 0) {
668
+				$errors = array(
669
+					'L_ERRORCODE'    => $l_error_code,
670
+					'L_SHORTMESSAGE' => $l_short_message,
671
+					'L_LONGMESSAGE'  => $l_long_message,
672
+					'L_SEVERITYCODE' => $l_severity_code,
673
+				);
674
+			} else {
675
+				$errors['L_ERRORCODE'] .= ', ' . $l_error_code;
676
+				$errors['L_SHORTMESSAGE'] .= ', ' . $l_short_message;
677
+				$errors['L_LONGMESSAGE'] .= ', ' . $l_long_message;
678
+				$errors['L_SEVERITYCODE'] .= ', ' . $l_severity_code;
679
+			}
680
+			$n++;
681
+		}
682
+		return $errors;
683
+	}
684 684
 }
Please login to merge, or discard this patch.
admin/extend/registrations/Extend_Registrations_Admin_Page.core.php 3 patches
Doc Comments   +1 added lines, -1 removed lines patch added patch discarded remove patch
@@ -924,7 +924,7 @@
 block discarded – undo
924 924
      * handles toggling the checkin status for the registration,
925 925
      *
926 926
      * @access protected
927
-     * @return int|void
927
+     * @return integer
928 928
      * @throws EE_Error
929 929
      * @throws InvalidArgumentException
930 930
      * @throws InvalidDataTypeException
Please login to merge, or discard this patch.
Spacing   +50 added lines, -50 removed lines patch added patch discarded remove patch
@@ -32,10 +32,10 @@  discard block
 block discarded – undo
32 32
     public function __construct($routing = true)
33 33
     {
34 34
         parent::__construct($routing);
35
-        if (! defined('REG_CAF_TEMPLATE_PATH')) {
36
-            define('REG_CAF_TEMPLATE_PATH', EE_CORE_CAF_ADMIN_EXTEND . 'registrations/templates/');
37
-            define('REG_CAF_ASSETS', EE_CORE_CAF_ADMIN_EXTEND . 'registrations/assets/');
38
-            define('REG_CAF_ASSETS_URL', EE_CORE_CAF_ADMIN_EXTEND_URL . 'registrations/assets/');
35
+        if ( ! defined('REG_CAF_TEMPLATE_PATH')) {
36
+            define('REG_CAF_TEMPLATE_PATH', EE_CORE_CAF_ADMIN_EXTEND.'registrations/templates/');
37
+            define('REG_CAF_ASSETS', EE_CORE_CAF_ADMIN_EXTEND.'registrations/assets/');
38
+            define('REG_CAF_ASSETS_URL', EE_CORE_CAF_ADMIN_EXTEND_URL.'registrations/assets/');
39 39
         }
40 40
     }
41 41
 
@@ -45,7 +45,7 @@  discard block
 block discarded – undo
45 45
      */
46 46
     protected function _extend_page_config()
47 47
     {
48
-        $this->_admin_base_path = EE_CORE_CAF_ADMIN_EXTEND . 'registrations';
48
+        $this->_admin_base_path = EE_CORE_CAF_ADMIN_EXTEND.'registrations';
49 49
         $reg_id = ! empty($this->_req_data['_REG_ID']) && ! is_array($this->_req_data['_REG_ID'])
50 50
             ? $this->_req_data['_REG_ID']
51 51
             : 0;
@@ -185,14 +185,14 @@  discard block
 block discarded – undo
185 185
             // enqueue newsletter js
186 186
             wp_enqueue_script(
187 187
                 'ee-newsletter-trigger',
188
-                REG_CAF_ASSETS_URL . 'ee-newsletter-trigger.js',
188
+                REG_CAF_ASSETS_URL.'ee-newsletter-trigger.js',
189 189
                 array('ee-dialog'),
190 190
                 EVENT_ESPRESSO_VERSION,
191 191
                 true
192 192
             );
193 193
             wp_enqueue_style(
194 194
                 'ee-newsletter-trigger-css',
195
-                REG_CAF_ASSETS_URL . 'ee-newsletter-trigger.css',
195
+                REG_CAF_ASSETS_URL.'ee-newsletter-trigger.css',
196 196
                 array(),
197 197
                 EVENT_ESPRESSO_VERSION
198 198
             );
@@ -213,7 +213,7 @@  discard block
 block discarded – undo
213 213
     {
214 214
         wp_register_script(
215 215
             'ee-reg-reports-js',
216
-            REG_CAF_ASSETS_URL . 'ee-registration-admin-reports.js',
216
+            REG_CAF_ASSETS_URL.'ee-registration-admin-reports.js',
217 217
             array('google-charts'),
218 218
             EVENT_ESPRESSO_VERSION,
219 219
             true
@@ -299,7 +299,7 @@  discard block
 block discarded – undo
299 299
         $nonce_ref = 'get_newsletter_form_content_nonce';
300 300
         $this->_verify_nonce($nonce, $nonce_ref);
301 301
         // let's get the mtp for the incoming MTP_ ID
302
-        if (! isset($this->_req_data['GRP_ID'])) {
302
+        if ( ! isset($this->_req_data['GRP_ID'])) {
303 303
             EE_Error::add_error(
304 304
                 esc_html__(
305 305
                     'There must be something broken with the js or html structure because the required data for getting a message template group is not present (need an GRP_ID).',
@@ -314,7 +314,7 @@  discard block
 block discarded – undo
314 314
             $this->_return_json();
315 315
         }
316 316
         $MTPG = EEM_Message_Template_Group::instance()->get_one_by_ID($this->_req_data['GRP_ID']);
317
-        if (! $MTPG instanceof EE_Message_Template_Group) {
317
+        if ( ! $MTPG instanceof EE_Message_Template_Group) {
318 318
             EE_Error::add_error(
319 319
                 sprintf(
320 320
                     esc_html__(
@@ -339,12 +339,12 @@  discard block
 block discarded – undo
339 339
             $field = $MTP->get('MTP_template_field');
340 340
             if ($field === 'content') {
341 341
                 $content = $MTP->get('MTP_content');
342
-                if (! empty($content['newsletter_content'])) {
342
+                if ( ! empty($content['newsletter_content'])) {
343 343
                     $template_fields['newsletter_content'] = $content['newsletter_content'];
344 344
                 }
345 345
                 continue;
346 346
             }
347
-            $template_fields[ $MTP->get('MTP_template_field') ] = $MTP->get('MTP_content');
347
+            $template_fields[$MTP->get('MTP_template_field')] = $MTP->get('MTP_content');
348 348
         }
349 349
         $this->_template_args['success'] = true;
350 350
         $this->_template_args['error'] = false;
@@ -375,7 +375,7 @@  discard block
 block discarded – undo
375 375
      */
376 376
     public function add_newsletter_action_buttons(EE_Admin_List_Table $list_table)
377 377
     {
378
-        if (! EE_Registry::instance()->CAP->current_user_can(
378
+        if ( ! EE_Registry::instance()->CAP->current_user_can(
379 379
             'ee_send_message',
380 380
             'espresso_registrations_newsletter_selected_send'
381 381
         )
@@ -444,17 +444,17 @@  discard block
 block discarded – undo
444 444
                 $field_id = $field === '[NEWSLETTER_CONTENT]'
445 445
                     ? 'content'
446 446
                     : $field;
447
-                $field_id = 'batch-message-' . strtolower($field_id);
447
+                $field_id = 'batch-message-'.strtolower($field_id);
448 448
                 $available_shortcodes[] = '<span class="js-shortcode-selection" data-value="'
449 449
                                           . $shortcode
450
-                                          . '" data-linked-input-id="' . $field_id . '">'
450
+                                          . '" data-linked-input-id="'.$field_id.'">'
451 451
                                           . $shortcode
452 452
                                           . '</span>';
453 453
             }
454
-            $codes[ $field ] = implode(', ', $available_shortcodes);
454
+            $codes[$field] = implode(', ', $available_shortcodes);
455 455
         }
456 456
         $shortcodes = $codes;
457
-        $form_template = REG_CAF_TEMPLATE_PATH . 'newsletter-send-form.template.php';
457
+        $form_template = REG_CAF_TEMPLATE_PATH.'newsletter-send-form.template.php';
458 458
         $form_template_args = array(
459 459
             'form_action'       => admin_url('admin.php?page=espresso_registrations'),
460 460
             'form_route'        => 'newsletter_selected_send',
@@ -622,7 +622,7 @@  discard block
 block discarded – undo
622 622
      */
623 623
     protected function _registration_reports()
624 624
     {
625
-        $template_path = EE_ADMIN_TEMPLATE . 'admin_reports.template.php';
625
+        $template_path = EE_ADMIN_TEMPLATE.'admin_reports.template.php';
626 626
         $this->_template_args['admin_page_content'] = EEH_Template::display_template(
627 627
             $template_path,
628 628
             $this->_reports_template_data,
@@ -677,7 +677,7 @@  discard block
 block discarded – undo
677 677
             array_unshift($regs, $column_titles);
678 678
             // setup the date range.
679 679
             $DateTimeZone = new DateTimeZone(EEH_DTT_Helper::get_timezone());
680
-            $beginning_date = new DateTime("now " . $period, $DateTimeZone);
680
+            $beginning_date = new DateTime("now ".$period, $DateTimeZone);
681 681
             $ending_date = new DateTime("now", $DateTimeZone);
682 682
             $subtitle = sprintf(
683 683
                 _x('For the period: %1$s to %2$s', 'Used to give date range', 'event_espresso'),
@@ -697,7 +697,7 @@  discard block
 block discarded – undo
697 697
                     '%sThere are currently no registration records in the last month for this report.%s',
698 698
                     'event_espresso'
699 699
                 ),
700
-                '<h2>' . $report_title . '</h2><p>',
700
+                '<h2>'.$report_title.'</h2><p>',
701 701
                 '</p>'
702 702
             ),
703 703
         );
@@ -750,7 +750,7 @@  discard block
 block discarded – undo
750 750
             array_unshift($regs, $column_titles);
751 751
             // setup the date range.
752 752
             $DateTimeZone = new DateTimeZone(EEH_DTT_Helper::get_timezone());
753
-            $beginning_date = new DateTime("now " . $period, $DateTimeZone);
753
+            $beginning_date = new DateTime("now ".$period, $DateTimeZone);
754 754
             $ending_date = new DateTime("now", $DateTimeZone);
755 755
             $subtitle = sprintf(
756 756
                 _x('For the period: %1$s to %2$s', 'Used to give date range', 'event_espresso'),
@@ -770,7 +770,7 @@  discard block
 block discarded – undo
770 770
                     '%sThere are currently no registration records in the last month for this report.%s',
771 771
                     'event_espresso'
772 772
                 ),
773
-                '<h2>' . $report_title . '</h2><p>',
773
+                '<h2>'.$report_title.'</h2><p>',
774 774
                 '</p>'
775 775
             ),
776 776
         );
@@ -796,7 +796,7 @@  discard block
 block discarded – undo
796 796
         $reg_id = isset($this->_req_data['_REG_ID']) ? $this->_req_data['_REG_ID'] : null;
797 797
         /** @var EE_Registration $registration */
798 798
         $registration = EEM_Registration::instance()->get_one_by_ID($reg_id);
799
-        if (! $registration instanceof EE_Registration) {
799
+        if ( ! $registration instanceof EE_Registration) {
800 800
             throw new EE_Error(
801 801
                 sprintf(
802 802
                     esc_html__('An error occurred. There is no registration with ID (%d)', 'event_espresso'),
@@ -831,7 +831,7 @@  discard block
 block discarded – undo
831 831
         if ($datetime instanceof EE_Datetime) {
832 832
             $datetime_label = $datetime->get_dtt_display_name(true);
833 833
             $datetime_label .= ! empty($datetime_label)
834
-                ? ' (' . $datetime->get_dtt_display_name() . ')'
834
+                ? ' ('.$datetime->get_dtt_display_name().')'
835 835
                 : $datetime->get_dtt_display_name();
836 836
         }
837 837
         $datetime_link = ! empty($dtt_id) && $registration instanceof EE_Registration
@@ -845,7 +845,7 @@  discard block
 block discarded – undo
845 845
             )
846 846
             : '';
847 847
         $datetime_link = ! empty($datetime_link)
848
-            ? '<a href="' . $datetime_link . '">'
848
+            ? '<a href="'.$datetime_link.'">'
849 849
               . '<span id="checkin-dtt">'
850 850
               . $datetime_label
851 851
               . '</span></a>'
@@ -857,8 +857,8 @@  discard block
 block discarded – undo
857 857
             ? $attendee->get_admin_details_link()
858 858
             : '';
859 859
         $attendee_link = ! empty($attendee_link)
860
-            ? '<a href="' . $attendee->get_admin_details_link() . '"'
861
-              . ' title="' . esc_html__('Click for attendee details', 'event_espresso') . '">'
860
+            ? '<a href="'.$attendee->get_admin_details_link().'"'
861
+              . ' title="'.esc_html__('Click for attendee details', 'event_espresso').'">'
862 862
               . '<span id="checkin-attendee-name">'
863 863
               . $attendee_name
864 864
               . '</span></a>'
@@ -867,25 +867,25 @@  discard block
 block discarded – undo
867 867
             ? $registration->event()->get_admin_details_link()
868 868
             : '';
869 869
         $event_link = ! empty($event_link)
870
-            ? '<a href="' . $event_link . '"'
871
-              . ' title="' . esc_html__('Click here to edit event.', 'event_espresso') . '">'
870
+            ? '<a href="'.$event_link.'"'
871
+              . ' title="'.esc_html__('Click here to edit event.', 'event_espresso').'">'
872 872
               . '<span id="checkin-event-name">'
873 873
               . $registration->event_name()
874 874
               . '</span>'
875 875
               . '</a>'
876 876
             : '';
877 877
         $this->_template_args['before_list_table'] = ! empty($reg_id) && ! empty($dtt_id)
878
-            ? '<h2>' . sprintf(
878
+            ? '<h2>'.sprintf(
879 879
                 esc_html__('Displaying check in records for %1$s for %2$s at the event, %3$s', 'event_espresso'),
880 880
                 $attendee_link,
881 881
                 $datetime_link,
882 882
                 $event_link
883
-            ) . '</h2>'
883
+            ).'</h2>'
884 884
             : '';
885 885
         $this->_template_args['list_table_hidden_fields'] = ! empty($reg_id)
886
-            ? '<input type="hidden" name="_REG_ID" value="' . $reg_id . '">' : '';
886
+            ? '<input type="hidden" name="_REG_ID" value="'.$reg_id.'">' : '';
887 887
         $this->_template_args['list_table_hidden_fields'] .= ! empty($dtt_id)
888
-            ? '<input type="hidden" name="DTT_ID" value="' . $dtt_id . '">' : '';
888
+            ? '<input type="hidden" name="DTT_ID" value="'.$dtt_id.'">' : '';
889 889
         $this->display_admin_list_table_page_with_no_sidebar();
890 890
     }
891 891
 
@@ -902,7 +902,7 @@  discard block
 block discarded – undo
902 902
     public function toggle_checkin_status()
903 903
     {
904 904
         // first make sure we have the necessary data
905
-        if (! isset($this->_req_data['_regid'])) {
905
+        if ( ! isset($this->_req_data['_regid'])) {
906 906
             EE_Error::add_error(
907 907
                 esc_html__(
908 908
                     'There must be something broken with the html structure because the required data for toggling the Check-in status is not being sent via ajax',
@@ -924,7 +924,7 @@  discard block
 block discarded – undo
924 924
         // beautiful! Made it this far so let's get the status.
925 925
         $new_status = new CheckinStatusDashicon($this->_toggle_checkin_status());
926 926
         // setup new class to return via ajax
927
-        $this->_template_args['admin_page_content'] = 'clickable trigger-checkin ' . $new_status->cssClasses();
927
+        $this->_template_args['admin_page_content'] = 'clickable trigger-checkin '.$new_status->cssClasses();
928 928
         $this->_template_args['success'] = true;
929 929
         $this->_return_json();
930 930
     }
@@ -950,7 +950,7 @@  discard block
 block discarded – undo
950 950
         );
951 951
         $new_status = false;
952 952
         // bulk action check in toggle
953
-        if (! empty($this->_req_data['checkbox']) && is_array($this->_req_data['checkbox'])) {
953
+        if ( ! empty($this->_req_data['checkbox']) && is_array($this->_req_data['checkbox'])) {
954 954
             // cycle thru checkboxes
955 955
             while (list($REG_ID, $value) = each($this->_req_data['checkbox'])) {
956 956
                 $DTT_ID = isset($this->_req_data['DTT_ID']) ? $this->_req_data['DTT_ID'] : null;
@@ -1020,9 +1020,9 @@  discard block
 block discarded – undo
1020 1020
             '_REG_ID' => isset($this->_req_data['_REG_ID']) ? $this->_req_data['_REG_ID'] : 0,
1021 1021
         );
1022 1022
         $errors = 0;
1023
-        if (! empty($this->_req_data['checkbox']) && is_array($this->_req_data['checkbox'])) {
1023
+        if ( ! empty($this->_req_data['checkbox']) && is_array($this->_req_data['checkbox'])) {
1024 1024
             while (list($CHK_ID, $value) = each($this->_req_data['checkbox'])) {
1025
-                if (! EEM_Checkin::instance()->delete_by_ID($CHK_ID)) {
1025
+                if ( ! EEM_Checkin::instance()->delete_by_ID($CHK_ID)) {
1026 1026
                     $errors++;
1027 1027
                 }
1028 1028
             }
@@ -1068,8 +1068,8 @@  discard block
 block discarded – undo
1068 1068
             'DTT_ID'  => isset($this->_req_data['DTT_ID']) ? $this->_req_data['DTT_ID'] : 0,
1069 1069
             '_REG_ID' => isset($this->_req_data['_REG_ID']) ? $this->_req_data['_REG_ID'] : 0,
1070 1070
         );
1071
-        if (! empty($this->_req_data['CHK_ID'])) {
1072
-            if (! EEM_Checkin::instance()->delete_by_ID($this->_req_data['CHK_ID'])) {
1071
+        if ( ! empty($this->_req_data['CHK_ID'])) {
1072
+            if ( ! EEM_Checkin::instance()->delete_by_ID($this->_req_data['CHK_ID'])) {
1073 1073
                 EE_Error::add_error(
1074 1074
                     esc_html__('Something went wrong and this check-in record was not deleted', 'event_espresso'),
1075 1075
                     __FILE__,
@@ -1138,27 +1138,27 @@  discard block
 block discarded – undo
1138 1138
                 'desc'  => $checked_never->legendLabel(),
1139 1139
             ),
1140 1140
             'approved_status'  => array(
1141
-                'class' => 'ee-status-legend ee-status-legend-' . EEM_Registration::status_id_approved,
1141
+                'class' => 'ee-status-legend ee-status-legend-'.EEM_Registration::status_id_approved,
1142 1142
                 'desc'  => EEH_Template::pretty_status(EEM_Registration::status_id_approved, false, 'sentence'),
1143 1143
             ),
1144 1144
             'cancelled_status' => array(
1145
-                'class' => 'ee-status-legend ee-status-legend-' . EEM_Registration::status_id_cancelled,
1145
+                'class' => 'ee-status-legend ee-status-legend-'.EEM_Registration::status_id_cancelled,
1146 1146
                 'desc'  => EEH_Template::pretty_status(EEM_Registration::status_id_cancelled, false, 'sentence'),
1147 1147
             ),
1148 1148
             'declined_status'  => array(
1149
-                'class' => 'ee-status-legend ee-status-legend-' . EEM_Registration::status_id_declined,
1149
+                'class' => 'ee-status-legend ee-status-legend-'.EEM_Registration::status_id_declined,
1150 1150
                 'desc'  => EEH_Template::pretty_status(EEM_Registration::status_id_declined, false, 'sentence'),
1151 1151
             ),
1152 1152
             'not_approved'     => array(
1153
-                'class' => 'ee-status-legend ee-status-legend-' . EEM_Registration::status_id_not_approved,
1153
+                'class' => 'ee-status-legend ee-status-legend-'.EEM_Registration::status_id_not_approved,
1154 1154
                 'desc'  => EEH_Template::pretty_status(EEM_Registration::status_id_not_approved, false, 'sentence'),
1155 1155
             ),
1156 1156
             'pending_status'   => array(
1157
-                'class' => 'ee-status-legend ee-status-legend-' . EEM_Registration::status_id_pending_payment,
1157
+                'class' => 'ee-status-legend ee-status-legend-'.EEM_Registration::status_id_pending_payment,
1158 1158
                 'desc'  => EEH_Template::pretty_status(EEM_Registration::status_id_pending_payment, false, 'sentence'),
1159 1159
             ),
1160 1160
             'wait_list'        => array(
1161
-                'class' => 'ee-status-legend ee-status-legend-' . EEM_Registration::status_id_wait_list,
1161
+                'class' => 'ee-status-legend ee-status-legend-'.EEM_Registration::status_id_wait_list,
1162 1162
                 'desc'  => EEH_Template::pretty_status(EEM_Registration::status_id_wait_list, false, 'sentence'),
1163 1163
             ),
1164 1164
         );
@@ -1167,10 +1167,10 @@  discard block
 block discarded – undo
1167 1167
         /** @var EE_Event $event */
1168 1168
         $event = EEM_Event::instance()->get_one_by_ID($event_id);
1169 1169
         $this->_template_args['before_list_table'] = $event instanceof EE_Event
1170
-            ? '<h2>' . sprintf(
1170
+            ? '<h2>'.sprintf(
1171 1171
                 esc_html__('Viewing Registrations for Event: %s', 'event_espresso'),
1172 1172
                 EEM_Event::instance()->get_one_by_ID($event_id)->get('EVT_name')
1173
-            ) . '</h2>'
1173
+            ).'</h2>'
1174 1174
             : '';
1175 1175
         // need to get the number of datetimes on the event and set default datetime_id if there is only one datetime on
1176 1176
         // the event.
@@ -1188,12 +1188,12 @@  discard block
 block discarded – undo
1188 1188
             $this->_template_args['before_list_table'] .= ' &nbsp;<span class="drk-grey-text">';
1189 1189
             $this->_template_args['before_list_table'] .= '<span class="dashicons dashicons-calendar"></span>';
1190 1190
             $this->_template_args['before_list_table'] .= $datetime->name();
1191
-            $this->_template_args['before_list_table'] .= ' ( ' . $datetime->date_and_time_range() . ' )';
1191
+            $this->_template_args['before_list_table'] .= ' ( '.$datetime->date_and_time_range().' )';
1192 1192
             $this->_template_args['before_list_table'] .= '</span></h2>';
1193 1193
         }
1194 1194
         // if no datetime, then we're on the initial view, so let's give some helpful instructions on what the status
1195 1195
         // column represents
1196
-        if (! $datetime instanceof EE_Datetime) {
1196
+        if ( ! $datetime instanceof EE_Datetime) {
1197 1197
             $this->_template_args['before_list_table'] .= '<br><p class="description">'
1198 1198
                                                           . esc_html__(
1199 1199
                                                               'In this view, the check-in status represents the latest check-in record for the registration in that row.',
Please login to merge, or discard this patch.
Indentation   +1210 added lines, -1210 removed lines patch added patch discarded remove patch
@@ -16,1267 +16,1267 @@
 block discarded – undo
16 16
 {
17 17
 
18 18
 
19
-    /**
20
-     * This is used to hold the reports template data which is setup early in the request.
21
-     *
22
-     * @type array
23
-     */
24
-    protected $_reports_template_data = array();
19
+	/**
20
+	 * This is used to hold the reports template data which is setup early in the request.
21
+	 *
22
+	 * @type array
23
+	 */
24
+	protected $_reports_template_data = array();
25 25
 
26 26
 
27
-    /**
28
-     * Extend_Registrations_Admin_Page constructor.
29
-     *
30
-     * @param bool $routing
31
-     */
32
-    public function __construct($routing = true)
33
-    {
34
-        parent::__construct($routing);
35
-        if (! defined('REG_CAF_TEMPLATE_PATH')) {
36
-            define('REG_CAF_TEMPLATE_PATH', EE_CORE_CAF_ADMIN_EXTEND . 'registrations/templates/');
37
-            define('REG_CAF_ASSETS', EE_CORE_CAF_ADMIN_EXTEND . 'registrations/assets/');
38
-            define('REG_CAF_ASSETS_URL', EE_CORE_CAF_ADMIN_EXTEND_URL . 'registrations/assets/');
39
-        }
40
-    }
27
+	/**
28
+	 * Extend_Registrations_Admin_Page constructor.
29
+	 *
30
+	 * @param bool $routing
31
+	 */
32
+	public function __construct($routing = true)
33
+	{
34
+		parent::__construct($routing);
35
+		if (! defined('REG_CAF_TEMPLATE_PATH')) {
36
+			define('REG_CAF_TEMPLATE_PATH', EE_CORE_CAF_ADMIN_EXTEND . 'registrations/templates/');
37
+			define('REG_CAF_ASSETS', EE_CORE_CAF_ADMIN_EXTEND . 'registrations/assets/');
38
+			define('REG_CAF_ASSETS_URL', EE_CORE_CAF_ADMIN_EXTEND_URL . 'registrations/assets/');
39
+		}
40
+	}
41 41
 
42 42
 
43
-    /**
44
-     * Extending page configuration.
45
-     */
46
-    protected function _extend_page_config()
47
-    {
48
-        $this->_admin_base_path = EE_CORE_CAF_ADMIN_EXTEND . 'registrations';
49
-        $reg_id = ! empty($this->_req_data['_REG_ID']) && ! is_array($this->_req_data['_REG_ID'])
50
-            ? $this->_req_data['_REG_ID']
51
-            : 0;
52
-        $new_page_routes = array(
53
-            'reports'                      => array(
54
-                'func'       => '_registration_reports',
55
-                'capability' => 'ee_read_registrations',
56
-            ),
57
-            'registration_checkins'        => array(
58
-                'func'       => '_registration_checkin_list_table',
59
-                'capability' => 'ee_read_checkins',
60
-            ),
61
-            'newsletter_selected_send'     => array(
62
-                'func'       => '_newsletter_selected_send',
63
-                'noheader'   => true,
64
-                'capability' => 'ee_send_message',
65
-            ),
66
-            'delete_checkin_rows'          => array(
67
-                'func'       => '_delete_checkin_rows',
68
-                'noheader'   => true,
69
-                'capability' => 'ee_delete_checkins',
70
-            ),
71
-            'delete_checkin_row'           => array(
72
-                'func'       => '_delete_checkin_row',
73
-                'noheader'   => true,
74
-                'capability' => 'ee_delete_checkin',
75
-                'obj_id'     => $reg_id,
76
-            ),
77
-            'toggle_checkin_status'        => array(
78
-                'func'       => '_toggle_checkin_status',
79
-                'noheader'   => true,
80
-                'capability' => 'ee_edit_checkin',
81
-                'obj_id'     => $reg_id,
82
-            ),
83
-            'toggle_checkin_status_bulk'   => array(
84
-                'func'       => '_toggle_checkin_status',
85
-                'noheader'   => true,
86
-                'capability' => 'ee_edit_checkins',
87
-            ),
88
-            'event_registrations'          => array(
89
-                'func'       => '_event_registrations_list_table',
90
-                'capability' => 'ee_read_checkins',
91
-            ),
92
-            'registrations_checkin_report' => array(
93
-                'func'       => '_registrations_checkin_report',
94
-                'noheader'   => true,
95
-                'capability' => 'ee_read_registrations',
96
-            ),
97
-        );
98
-        $this->_page_routes = array_merge($this->_page_routes, $new_page_routes);
99
-        $new_page_config = array(
100
-            'reports'               => array(
101
-                'nav'           => array(
102
-                    'label' => esc_html__('Reports', 'event_espresso'),
103
-                    'order' => 30,
104
-                ),
105
-                'help_tabs'     => array(
106
-                    'registrations_reports_help_tab' => array(
107
-                        'title'    => esc_html__('Registration Reports', 'event_espresso'),
108
-                        'filename' => 'registrations_reports',
109
-                    ),
110
-                ),
111
-                /*'help_tour' => array( 'Registration_Reports_Help_Tour' ),*/
112
-                'require_nonce' => false,
113
-            ),
114
-            'event_registrations'   => array(
115
-                'nav'           => array(
116
-                    'label'      => esc_html__('Event Check-In', 'event_espresso'),
117
-                    'order'      => 10,
118
-                    'persistent' => true,
119
-                ),
120
-                'help_tabs'     => array(
121
-                    'registrations_event_checkin_help_tab'                       => array(
122
-                        'title'    => esc_html__('Registrations Event Check-In', 'event_espresso'),
123
-                        'filename' => 'registrations_event_checkin',
124
-                    ),
125
-                    'registrations_event_checkin_table_column_headings_help_tab' => array(
126
-                        'title'    => esc_html__('Event Check-In Table Column Headings', 'event_espresso'),
127
-                        'filename' => 'registrations_event_checkin_table_column_headings',
128
-                    ),
129
-                    'registrations_event_checkin_filters_help_tab'               => array(
130
-                        'title'    => esc_html__('Event Check-In Filters', 'event_espresso'),
131
-                        'filename' => 'registrations_event_checkin_filters',
132
-                    ),
133
-                    'registrations_event_checkin_views_help_tab'                 => array(
134
-                        'title'    => esc_html__('Event Check-In Views', 'event_espresso'),
135
-                        'filename' => 'registrations_event_checkin_views',
136
-                    ),
137
-                    'registrations_event_checkin_other_help_tab'                 => array(
138
-                        'title'    => esc_html__('Event Check-In Other', 'event_espresso'),
139
-                        'filename' => 'registrations_event_checkin_other',
140
-                    ),
141
-                ),
142
-                'help_tour'     => array('Event_Checkin_Help_Tour'),
143
-                'qtips'         => array('Registration_List_Table_Tips'),
144
-                'list_table'    => 'EE_Event_Registrations_List_Table',
145
-                'metaboxes'     => array(),
146
-                'require_nonce' => false,
147
-            ),
148
-            'registration_checkins' => array(
149
-                'nav'           => array(
150
-                    'label'      => esc_html__('Check-In Records', 'event_espresso'),
151
-                    'order'      => 15,
152
-                    'persistent' => false,
153
-                    'url'        => '',
154
-                ),
155
-                'list_table'    => 'EE_Registration_CheckIn_List_Table',
156
-                // 'help_tour' => array( 'Checkin_Toggle_View_Help_Tour' ),
157
-                'metaboxes'     => array(),
158
-                'require_nonce' => false,
159
-            ),
160
-        );
161
-        $this->_page_config = array_merge($this->_page_config, $new_page_config);
162
-        $this->_page_config['contact_list']['list_table'] = 'Extend_EE_Attendee_Contact_List_Table';
163
-        $this->_page_config['default']['list_table'] = 'Extend_EE_Registrations_List_Table';
164
-    }
43
+	/**
44
+	 * Extending page configuration.
45
+	 */
46
+	protected function _extend_page_config()
47
+	{
48
+		$this->_admin_base_path = EE_CORE_CAF_ADMIN_EXTEND . 'registrations';
49
+		$reg_id = ! empty($this->_req_data['_REG_ID']) && ! is_array($this->_req_data['_REG_ID'])
50
+			? $this->_req_data['_REG_ID']
51
+			: 0;
52
+		$new_page_routes = array(
53
+			'reports'                      => array(
54
+				'func'       => '_registration_reports',
55
+				'capability' => 'ee_read_registrations',
56
+			),
57
+			'registration_checkins'        => array(
58
+				'func'       => '_registration_checkin_list_table',
59
+				'capability' => 'ee_read_checkins',
60
+			),
61
+			'newsletter_selected_send'     => array(
62
+				'func'       => '_newsletter_selected_send',
63
+				'noheader'   => true,
64
+				'capability' => 'ee_send_message',
65
+			),
66
+			'delete_checkin_rows'          => array(
67
+				'func'       => '_delete_checkin_rows',
68
+				'noheader'   => true,
69
+				'capability' => 'ee_delete_checkins',
70
+			),
71
+			'delete_checkin_row'           => array(
72
+				'func'       => '_delete_checkin_row',
73
+				'noheader'   => true,
74
+				'capability' => 'ee_delete_checkin',
75
+				'obj_id'     => $reg_id,
76
+			),
77
+			'toggle_checkin_status'        => array(
78
+				'func'       => '_toggle_checkin_status',
79
+				'noheader'   => true,
80
+				'capability' => 'ee_edit_checkin',
81
+				'obj_id'     => $reg_id,
82
+			),
83
+			'toggle_checkin_status_bulk'   => array(
84
+				'func'       => '_toggle_checkin_status',
85
+				'noheader'   => true,
86
+				'capability' => 'ee_edit_checkins',
87
+			),
88
+			'event_registrations'          => array(
89
+				'func'       => '_event_registrations_list_table',
90
+				'capability' => 'ee_read_checkins',
91
+			),
92
+			'registrations_checkin_report' => array(
93
+				'func'       => '_registrations_checkin_report',
94
+				'noheader'   => true,
95
+				'capability' => 'ee_read_registrations',
96
+			),
97
+		);
98
+		$this->_page_routes = array_merge($this->_page_routes, $new_page_routes);
99
+		$new_page_config = array(
100
+			'reports'               => array(
101
+				'nav'           => array(
102
+					'label' => esc_html__('Reports', 'event_espresso'),
103
+					'order' => 30,
104
+				),
105
+				'help_tabs'     => array(
106
+					'registrations_reports_help_tab' => array(
107
+						'title'    => esc_html__('Registration Reports', 'event_espresso'),
108
+						'filename' => 'registrations_reports',
109
+					),
110
+				),
111
+				/*'help_tour' => array( 'Registration_Reports_Help_Tour' ),*/
112
+				'require_nonce' => false,
113
+			),
114
+			'event_registrations'   => array(
115
+				'nav'           => array(
116
+					'label'      => esc_html__('Event Check-In', 'event_espresso'),
117
+					'order'      => 10,
118
+					'persistent' => true,
119
+				),
120
+				'help_tabs'     => array(
121
+					'registrations_event_checkin_help_tab'                       => array(
122
+						'title'    => esc_html__('Registrations Event Check-In', 'event_espresso'),
123
+						'filename' => 'registrations_event_checkin',
124
+					),
125
+					'registrations_event_checkin_table_column_headings_help_tab' => array(
126
+						'title'    => esc_html__('Event Check-In Table Column Headings', 'event_espresso'),
127
+						'filename' => 'registrations_event_checkin_table_column_headings',
128
+					),
129
+					'registrations_event_checkin_filters_help_tab'               => array(
130
+						'title'    => esc_html__('Event Check-In Filters', 'event_espresso'),
131
+						'filename' => 'registrations_event_checkin_filters',
132
+					),
133
+					'registrations_event_checkin_views_help_tab'                 => array(
134
+						'title'    => esc_html__('Event Check-In Views', 'event_espresso'),
135
+						'filename' => 'registrations_event_checkin_views',
136
+					),
137
+					'registrations_event_checkin_other_help_tab'                 => array(
138
+						'title'    => esc_html__('Event Check-In Other', 'event_espresso'),
139
+						'filename' => 'registrations_event_checkin_other',
140
+					),
141
+				),
142
+				'help_tour'     => array('Event_Checkin_Help_Tour'),
143
+				'qtips'         => array('Registration_List_Table_Tips'),
144
+				'list_table'    => 'EE_Event_Registrations_List_Table',
145
+				'metaboxes'     => array(),
146
+				'require_nonce' => false,
147
+			),
148
+			'registration_checkins' => array(
149
+				'nav'           => array(
150
+					'label'      => esc_html__('Check-In Records', 'event_espresso'),
151
+					'order'      => 15,
152
+					'persistent' => false,
153
+					'url'        => '',
154
+				),
155
+				'list_table'    => 'EE_Registration_CheckIn_List_Table',
156
+				// 'help_tour' => array( 'Checkin_Toggle_View_Help_Tour' ),
157
+				'metaboxes'     => array(),
158
+				'require_nonce' => false,
159
+			),
160
+		);
161
+		$this->_page_config = array_merge($this->_page_config, $new_page_config);
162
+		$this->_page_config['contact_list']['list_table'] = 'Extend_EE_Attendee_Contact_List_Table';
163
+		$this->_page_config['default']['list_table'] = 'Extend_EE_Registrations_List_Table';
164
+	}
165 165
 
166 166
 
167
-    /**
168
-     * Ajax hooks for all routes in this page.
169
-     */
170
-    protected function _ajax_hooks()
171
-    {
172
-        parent::_ajax_hooks();
173
-        add_action('wp_ajax_get_newsletter_form_content', array($this, 'get_newsletter_form_content'));
174
-    }
167
+	/**
168
+	 * Ajax hooks for all routes in this page.
169
+	 */
170
+	protected function _ajax_hooks()
171
+	{
172
+		parent::_ajax_hooks();
173
+		add_action('wp_ajax_get_newsletter_form_content', array($this, 'get_newsletter_form_content'));
174
+	}
175 175
 
176 176
 
177
-    /**
178
-     * Global scripts for all routes in this page.
179
-     */
180
-    public function load_scripts_styles()
181
-    {
182
-        parent::load_scripts_styles();
183
-        // if newsletter message type is active then let's add filter and load js for it.
184
-        if (EEH_MSG_Template::is_mt_active('newsletter')) {
185
-            // enqueue newsletter js
186
-            wp_enqueue_script(
187
-                'ee-newsletter-trigger',
188
-                REG_CAF_ASSETS_URL . 'ee-newsletter-trigger.js',
189
-                array('ee-dialog'),
190
-                EVENT_ESPRESSO_VERSION,
191
-                true
192
-            );
193
-            wp_enqueue_style(
194
-                'ee-newsletter-trigger-css',
195
-                REG_CAF_ASSETS_URL . 'ee-newsletter-trigger.css',
196
-                array(),
197
-                EVENT_ESPRESSO_VERSION
198
-            );
199
-            // hook in buttons for newsletter message type trigger.
200
-            add_action(
201
-                'AHEE__EE_Admin_List_Table__extra_tablenav__after_bottom_buttons',
202
-                array($this, 'add_newsletter_action_buttons'),
203
-                10
204
-            );
205
-        }
206
-    }
177
+	/**
178
+	 * Global scripts for all routes in this page.
179
+	 */
180
+	public function load_scripts_styles()
181
+	{
182
+		parent::load_scripts_styles();
183
+		// if newsletter message type is active then let's add filter and load js for it.
184
+		if (EEH_MSG_Template::is_mt_active('newsletter')) {
185
+			// enqueue newsletter js
186
+			wp_enqueue_script(
187
+				'ee-newsletter-trigger',
188
+				REG_CAF_ASSETS_URL . 'ee-newsletter-trigger.js',
189
+				array('ee-dialog'),
190
+				EVENT_ESPRESSO_VERSION,
191
+				true
192
+			);
193
+			wp_enqueue_style(
194
+				'ee-newsletter-trigger-css',
195
+				REG_CAF_ASSETS_URL . 'ee-newsletter-trigger.css',
196
+				array(),
197
+				EVENT_ESPRESSO_VERSION
198
+			);
199
+			// hook in buttons for newsletter message type trigger.
200
+			add_action(
201
+				'AHEE__EE_Admin_List_Table__extra_tablenav__after_bottom_buttons',
202
+				array($this, 'add_newsletter_action_buttons'),
203
+				10
204
+			);
205
+		}
206
+	}
207 207
 
208 208
 
209
-    /**
210
-     * Scripts and styles for just the reports route.
211
-     */
212
-    public function load_scripts_styles_reports()
213
-    {
214
-        wp_register_script(
215
-            'ee-reg-reports-js',
216
-            REG_CAF_ASSETS_URL . 'ee-registration-admin-reports.js',
217
-            array('google-charts'),
218
-            EVENT_ESPRESSO_VERSION,
219
-            true
220
-        );
221
-        wp_enqueue_script('ee-reg-reports-js');
222
-        $this->_registration_reports_js_setup();
223
-    }
209
+	/**
210
+	 * Scripts and styles for just the reports route.
211
+	 */
212
+	public function load_scripts_styles_reports()
213
+	{
214
+		wp_register_script(
215
+			'ee-reg-reports-js',
216
+			REG_CAF_ASSETS_URL . 'ee-registration-admin-reports.js',
217
+			array('google-charts'),
218
+			EVENT_ESPRESSO_VERSION,
219
+			true
220
+		);
221
+		wp_enqueue_script('ee-reg-reports-js');
222
+		$this->_registration_reports_js_setup();
223
+	}
224 224
 
225 225
 
226
-    /**
227
-     * Register screen options for event_registrations route.
228
-     */
229
-    protected function _add_screen_options_event_registrations()
230
-    {
231
-        $this->_per_page_screen_option();
232
-    }
226
+	/**
227
+	 * Register screen options for event_registrations route.
228
+	 */
229
+	protected function _add_screen_options_event_registrations()
230
+	{
231
+		$this->_per_page_screen_option();
232
+	}
233 233
 
234 234
 
235
-    /**
236
-     * Register screen options for registration_checkins route
237
-     */
238
-    protected function _add_screen_options_registration_checkins()
239
-    {
240
-        $page_title = $this->_admin_page_title;
241
-        $this->_admin_page_title = esc_html__('Check-In Records', 'event_espresso');
242
-        $this->_per_page_screen_option();
243
-        $this->_admin_page_title = $page_title;
244
-    }
235
+	/**
236
+	 * Register screen options for registration_checkins route
237
+	 */
238
+	protected function _add_screen_options_registration_checkins()
239
+	{
240
+		$page_title = $this->_admin_page_title;
241
+		$this->_admin_page_title = esc_html__('Check-In Records', 'event_espresso');
242
+		$this->_per_page_screen_option();
243
+		$this->_admin_page_title = $page_title;
244
+	}
245 245
 
246 246
 
247
-    /**
248
-     * Set views property for event_registrations route.
249
-     */
250
-    protected function _set_list_table_views_event_registrations()
251
-    {
252
-        $this->_views = array(
253
-            'all' => array(
254
-                'slug'        => 'all',
255
-                'label'       => esc_html__('All', 'event_espresso'),
256
-                'count'       => 0,
257
-                'bulk_action' => ! isset($this->_req_data['event_id'])
258
-                    ? array()
259
-                    : array(
260
-                        'toggle_checkin_status_bulk' => esc_html__('Toggle Check-In', 'event_espresso'),
261
-                    ),
262
-            ),
263
-        );
264
-    }
247
+	/**
248
+	 * Set views property for event_registrations route.
249
+	 */
250
+	protected function _set_list_table_views_event_registrations()
251
+	{
252
+		$this->_views = array(
253
+			'all' => array(
254
+				'slug'        => 'all',
255
+				'label'       => esc_html__('All', 'event_espresso'),
256
+				'count'       => 0,
257
+				'bulk_action' => ! isset($this->_req_data['event_id'])
258
+					? array()
259
+					: array(
260
+						'toggle_checkin_status_bulk' => esc_html__('Toggle Check-In', 'event_espresso'),
261
+					),
262
+			),
263
+		);
264
+	}
265 265
 
266 266
 
267
-    /**
268
-     * Set views property for registration_checkins route.
269
-     */
270
-    protected function _set_list_table_views_registration_checkins()
271
-    {
272
-        $this->_views = array(
273
-            'all' => array(
274
-                'slug'        => 'all',
275
-                'label'       => esc_html__('All', 'event_espresso'),
276
-                'count'       => 0,
277
-                'bulk_action' => array('delete_checkin_rows' => esc_html__('Delete Check-In Rows', 'event_espresso')),
278
-            ),
279
-        );
280
-    }
267
+	/**
268
+	 * Set views property for registration_checkins route.
269
+	 */
270
+	protected function _set_list_table_views_registration_checkins()
271
+	{
272
+		$this->_views = array(
273
+			'all' => array(
274
+				'slug'        => 'all',
275
+				'label'       => esc_html__('All', 'event_espresso'),
276
+				'count'       => 0,
277
+				'bulk_action' => array('delete_checkin_rows' => esc_html__('Delete Check-In Rows', 'event_espresso')),
278
+			),
279
+		);
280
+	}
281 281
 
282 282
 
283
-    /**
284
-     * callback for ajax action.
285
-     *
286
-     * @since 4.3.0
287
-     * @return void (JSON)
288
-     * @throws EE_Error
289
-     * @throws InvalidArgumentException
290
-     * @throws InvalidDataTypeException
291
-     * @throws InvalidInterfaceException
292
-     */
293
-    public function get_newsletter_form_content()
294
-    {
295
-        // do a nonce check cause we're not coming in from an normal route here.
296
-        $nonce = isset($this->_req_data['get_newsletter_form_content_nonce']) ? sanitize_text_field(
297
-            $this->_req_data['get_newsletter_form_content_nonce']
298
-        ) : '';
299
-        $nonce_ref = 'get_newsletter_form_content_nonce';
300
-        $this->_verify_nonce($nonce, $nonce_ref);
301
-        // let's get the mtp for the incoming MTP_ ID
302
-        if (! isset($this->_req_data['GRP_ID'])) {
303
-            EE_Error::add_error(
304
-                esc_html__(
305
-                    'There must be something broken with the js or html structure because the required data for getting a message template group is not present (need an GRP_ID).',
306
-                    'event_espresso'
307
-                ),
308
-                __FILE__,
309
-                __FUNCTION__,
310
-                __LINE__
311
-            );
312
-            $this->_template_args['success'] = false;
313
-            $this->_template_args['error'] = true;
314
-            $this->_return_json();
315
-        }
316
-        $MTPG = EEM_Message_Template_Group::instance()->get_one_by_ID($this->_req_data['GRP_ID']);
317
-        if (! $MTPG instanceof EE_Message_Template_Group) {
318
-            EE_Error::add_error(
319
-                sprintf(
320
-                    esc_html__(
321
-                        'The GRP_ID given (%d) does not appear to have a corresponding row in the database.',
322
-                        'event_espresso'
323
-                    ),
324
-                    $this->_req_data['GRP_ID']
325
-                ),
326
-                __FILE__,
327
-                __FUNCTION__,
328
-                __LINE__
329
-            );
330
-            $this->_template_args['success'] = false;
331
-            $this->_template_args['error'] = true;
332
-            $this->_return_json();
333
-        }
334
-        $MTPs = $MTPG->context_templates();
335
-        $MTPs = $MTPs['attendee'];
336
-        $template_fields = array();
337
-        /** @var EE_Message_Template $MTP */
338
-        foreach ($MTPs as $MTP) {
339
-            $field = $MTP->get('MTP_template_field');
340
-            if ($field === 'content') {
341
-                $content = $MTP->get('MTP_content');
342
-                if (! empty($content['newsletter_content'])) {
343
-                    $template_fields['newsletter_content'] = $content['newsletter_content'];
344
-                }
345
-                continue;
346
-            }
347
-            $template_fields[ $MTP->get('MTP_template_field') ] = $MTP->get('MTP_content');
348
-        }
349
-        $this->_template_args['success'] = true;
350
-        $this->_template_args['error'] = false;
351
-        $this->_template_args['data'] = array(
352
-            'batch_message_from'    => isset($template_fields['from'])
353
-                ? $template_fields['from']
354
-                : '',
355
-            'batch_message_subject' => isset($template_fields['subject'])
356
-                ? $template_fields['subject']
357
-                : '',
358
-            'batch_message_content' => isset($template_fields['newsletter_content'])
359
-                ? $template_fields['newsletter_content']
360
-                : '',
361
-        );
362
-        $this->_return_json();
363
-    }
283
+	/**
284
+	 * callback for ajax action.
285
+	 *
286
+	 * @since 4.3.0
287
+	 * @return void (JSON)
288
+	 * @throws EE_Error
289
+	 * @throws InvalidArgumentException
290
+	 * @throws InvalidDataTypeException
291
+	 * @throws InvalidInterfaceException
292
+	 */
293
+	public function get_newsletter_form_content()
294
+	{
295
+		// do a nonce check cause we're not coming in from an normal route here.
296
+		$nonce = isset($this->_req_data['get_newsletter_form_content_nonce']) ? sanitize_text_field(
297
+			$this->_req_data['get_newsletter_form_content_nonce']
298
+		) : '';
299
+		$nonce_ref = 'get_newsletter_form_content_nonce';
300
+		$this->_verify_nonce($nonce, $nonce_ref);
301
+		// let's get the mtp for the incoming MTP_ ID
302
+		if (! isset($this->_req_data['GRP_ID'])) {
303
+			EE_Error::add_error(
304
+				esc_html__(
305
+					'There must be something broken with the js or html structure because the required data for getting a message template group is not present (need an GRP_ID).',
306
+					'event_espresso'
307
+				),
308
+				__FILE__,
309
+				__FUNCTION__,
310
+				__LINE__
311
+			);
312
+			$this->_template_args['success'] = false;
313
+			$this->_template_args['error'] = true;
314
+			$this->_return_json();
315
+		}
316
+		$MTPG = EEM_Message_Template_Group::instance()->get_one_by_ID($this->_req_data['GRP_ID']);
317
+		if (! $MTPG instanceof EE_Message_Template_Group) {
318
+			EE_Error::add_error(
319
+				sprintf(
320
+					esc_html__(
321
+						'The GRP_ID given (%d) does not appear to have a corresponding row in the database.',
322
+						'event_espresso'
323
+					),
324
+					$this->_req_data['GRP_ID']
325
+				),
326
+				__FILE__,
327
+				__FUNCTION__,
328
+				__LINE__
329
+			);
330
+			$this->_template_args['success'] = false;
331
+			$this->_template_args['error'] = true;
332
+			$this->_return_json();
333
+		}
334
+		$MTPs = $MTPG->context_templates();
335
+		$MTPs = $MTPs['attendee'];
336
+		$template_fields = array();
337
+		/** @var EE_Message_Template $MTP */
338
+		foreach ($MTPs as $MTP) {
339
+			$field = $MTP->get('MTP_template_field');
340
+			if ($field === 'content') {
341
+				$content = $MTP->get('MTP_content');
342
+				if (! empty($content['newsletter_content'])) {
343
+					$template_fields['newsletter_content'] = $content['newsletter_content'];
344
+				}
345
+				continue;
346
+			}
347
+			$template_fields[ $MTP->get('MTP_template_field') ] = $MTP->get('MTP_content');
348
+		}
349
+		$this->_template_args['success'] = true;
350
+		$this->_template_args['error'] = false;
351
+		$this->_template_args['data'] = array(
352
+			'batch_message_from'    => isset($template_fields['from'])
353
+				? $template_fields['from']
354
+				: '',
355
+			'batch_message_subject' => isset($template_fields['subject'])
356
+				? $template_fields['subject']
357
+				: '',
358
+			'batch_message_content' => isset($template_fields['newsletter_content'])
359
+				? $template_fields['newsletter_content']
360
+				: '',
361
+		);
362
+		$this->_return_json();
363
+	}
364 364
 
365 365
 
366
-    /**
367
-     * callback for AHEE__EE_Admin_List_Table__extra_tablenav__after_bottom_buttons action
368
-     *
369
-     * @since 4.3.0
370
-     * @param EE_Admin_List_Table $list_table
371
-     * @return void
372
-     * @throws InvalidArgumentException
373
-     * @throws InvalidDataTypeException
374
-     * @throws InvalidInterfaceException
375
-     */
376
-    public function add_newsletter_action_buttons(EE_Admin_List_Table $list_table)
377
-    {
378
-        if (! EE_Registry::instance()->CAP->current_user_can(
379
-            'ee_send_message',
380
-            'espresso_registrations_newsletter_selected_send'
381
-        )
382
-        ) {
383
-            return;
384
-        }
385
-        $routes_to_add_to = array(
386
-            'contact_list',
387
-            'event_registrations',
388
-            'default',
389
-        );
390
-        if ($this->_current_page === 'espresso_registrations' && in_array($this->_req_action, $routes_to_add_to)) {
391
-            if (($this->_req_action === 'event_registrations' && empty($this->_req_data['event_id']))
392
-                || (isset($this->_req_data['status']) && $this->_req_data['status'] === 'trash')
393
-            ) {
394
-                echo '';
395
-            } else {
396
-                $button_text = sprintf(
397
-                    esc_html__('Send Batch Message (%s selected)', 'event_espresso'),
398
-                    '<span class="send-selected-newsletter-count">0</span>'
399
-                );
400
-                echo '<button id="selected-batch-send-trigger" class="button secondary-button">'
401
-                     . '<span class="dashicons dashicons-email "></span>'
402
-                     . $button_text
403
-                     . '</button>';
404
-                add_action('admin_footer', array($this, 'newsletter_send_form_skeleton'));
405
-            }
406
-        }
407
-    }
366
+	/**
367
+	 * callback for AHEE__EE_Admin_List_Table__extra_tablenav__after_bottom_buttons action
368
+	 *
369
+	 * @since 4.3.0
370
+	 * @param EE_Admin_List_Table $list_table
371
+	 * @return void
372
+	 * @throws InvalidArgumentException
373
+	 * @throws InvalidDataTypeException
374
+	 * @throws InvalidInterfaceException
375
+	 */
376
+	public function add_newsletter_action_buttons(EE_Admin_List_Table $list_table)
377
+	{
378
+		if (! EE_Registry::instance()->CAP->current_user_can(
379
+			'ee_send_message',
380
+			'espresso_registrations_newsletter_selected_send'
381
+		)
382
+		) {
383
+			return;
384
+		}
385
+		$routes_to_add_to = array(
386
+			'contact_list',
387
+			'event_registrations',
388
+			'default',
389
+		);
390
+		if ($this->_current_page === 'espresso_registrations' && in_array($this->_req_action, $routes_to_add_to)) {
391
+			if (($this->_req_action === 'event_registrations' && empty($this->_req_data['event_id']))
392
+				|| (isset($this->_req_data['status']) && $this->_req_data['status'] === 'trash')
393
+			) {
394
+				echo '';
395
+			} else {
396
+				$button_text = sprintf(
397
+					esc_html__('Send Batch Message (%s selected)', 'event_espresso'),
398
+					'<span class="send-selected-newsletter-count">0</span>'
399
+				);
400
+				echo '<button id="selected-batch-send-trigger" class="button secondary-button">'
401
+					 . '<span class="dashicons dashicons-email "></span>'
402
+					 . $button_text
403
+					 . '</button>';
404
+				add_action('admin_footer', array($this, 'newsletter_send_form_skeleton'));
405
+			}
406
+		}
407
+	}
408 408
 
409 409
 
410
-    /**
411
-     * @throws DomainException
412
-     * @throws EE_Error
413
-     * @throws InvalidArgumentException
414
-     * @throws InvalidDataTypeException
415
-     * @throws InvalidInterfaceException
416
-     */
417
-    public function newsletter_send_form_skeleton()
418
-    {
419
-        $list_table = $this->_list_table_object;
420
-        $codes = array();
421
-        // need to templates for the newsletter message type for the template selector.
422
-        $values[] = array('text' => esc_html__('Select Template to Use', 'event_espresso'), 'id' => 0);
423
-        $mtps = EEM_Message_Template_Group::instance()->get_all(
424
-            array(array('MTP_message_type' => 'newsletter', 'MTP_messenger' => 'email'))
425
-        );
426
-        foreach ($mtps as $mtp) {
427
-            $name = $mtp->name();
428
-            $values[] = array(
429
-                'text' => empty($name) ? esc_html__('Global', 'event_espresso') : $name,
430
-                'id'   => $mtp->ID(),
431
-            );
432
-        }
433
-        // need to get a list of shortcodes that are available for the newsletter message type.
434
-        $shortcodes = EEH_MSG_Template::get_shortcodes(
435
-            'newsletter',
436
-            'email',
437
-            array(),
438
-            'attendee',
439
-            false
440
-        );
441
-        foreach ($shortcodes as $field => $shortcode_array) {
442
-            $available_shortcodes = array();
443
-            foreach ($shortcode_array as $shortcode => $shortcode_details) {
444
-                $field_id = $field === '[NEWSLETTER_CONTENT]'
445
-                    ? 'content'
446
-                    : $field;
447
-                $field_id = 'batch-message-' . strtolower($field_id);
448
-                $available_shortcodes[] = '<span class="js-shortcode-selection" data-value="'
449
-                                          . $shortcode
450
-                                          . '" data-linked-input-id="' . $field_id . '">'
451
-                                          . $shortcode
452
-                                          . '</span>';
453
-            }
454
-            $codes[ $field ] = implode(', ', $available_shortcodes);
455
-        }
456
-        $shortcodes = $codes;
457
-        $form_template = REG_CAF_TEMPLATE_PATH . 'newsletter-send-form.template.php';
458
-        $form_template_args = array(
459
-            'form_action'       => admin_url('admin.php?page=espresso_registrations'),
460
-            'form_route'        => 'newsletter_selected_send',
461
-            'form_nonce_name'   => 'newsletter_selected_send_nonce',
462
-            'form_nonce'        => wp_create_nonce('newsletter_selected_send_nonce'),
463
-            'redirect_back_to'  => $this->_req_action,
464
-            'ajax_nonce'        => wp_create_nonce('get_newsletter_form_content_nonce'),
465
-            'template_selector' => EEH_Form_Fields::select_input('newsletter_mtp_selected', $values),
466
-            'shortcodes'        => $shortcodes,
467
-            'id_type'           => $list_table instanceof EE_Attendee_Contact_List_Table ? 'contact' : 'registration',
468
-        );
469
-        EEH_Template::display_template($form_template, $form_template_args);
470
-    }
410
+	/**
411
+	 * @throws DomainException
412
+	 * @throws EE_Error
413
+	 * @throws InvalidArgumentException
414
+	 * @throws InvalidDataTypeException
415
+	 * @throws InvalidInterfaceException
416
+	 */
417
+	public function newsletter_send_form_skeleton()
418
+	{
419
+		$list_table = $this->_list_table_object;
420
+		$codes = array();
421
+		// need to templates for the newsletter message type for the template selector.
422
+		$values[] = array('text' => esc_html__('Select Template to Use', 'event_espresso'), 'id' => 0);
423
+		$mtps = EEM_Message_Template_Group::instance()->get_all(
424
+			array(array('MTP_message_type' => 'newsletter', 'MTP_messenger' => 'email'))
425
+		);
426
+		foreach ($mtps as $mtp) {
427
+			$name = $mtp->name();
428
+			$values[] = array(
429
+				'text' => empty($name) ? esc_html__('Global', 'event_espresso') : $name,
430
+				'id'   => $mtp->ID(),
431
+			);
432
+		}
433
+		// need to get a list of shortcodes that are available for the newsletter message type.
434
+		$shortcodes = EEH_MSG_Template::get_shortcodes(
435
+			'newsletter',
436
+			'email',
437
+			array(),
438
+			'attendee',
439
+			false
440
+		);
441
+		foreach ($shortcodes as $field => $shortcode_array) {
442
+			$available_shortcodes = array();
443
+			foreach ($shortcode_array as $shortcode => $shortcode_details) {
444
+				$field_id = $field === '[NEWSLETTER_CONTENT]'
445
+					? 'content'
446
+					: $field;
447
+				$field_id = 'batch-message-' . strtolower($field_id);
448
+				$available_shortcodes[] = '<span class="js-shortcode-selection" data-value="'
449
+										  . $shortcode
450
+										  . '" data-linked-input-id="' . $field_id . '">'
451
+										  . $shortcode
452
+										  . '</span>';
453
+			}
454
+			$codes[ $field ] = implode(', ', $available_shortcodes);
455
+		}
456
+		$shortcodes = $codes;
457
+		$form_template = REG_CAF_TEMPLATE_PATH . 'newsletter-send-form.template.php';
458
+		$form_template_args = array(
459
+			'form_action'       => admin_url('admin.php?page=espresso_registrations'),
460
+			'form_route'        => 'newsletter_selected_send',
461
+			'form_nonce_name'   => 'newsletter_selected_send_nonce',
462
+			'form_nonce'        => wp_create_nonce('newsletter_selected_send_nonce'),
463
+			'redirect_back_to'  => $this->_req_action,
464
+			'ajax_nonce'        => wp_create_nonce('get_newsletter_form_content_nonce'),
465
+			'template_selector' => EEH_Form_Fields::select_input('newsletter_mtp_selected', $values),
466
+			'shortcodes'        => $shortcodes,
467
+			'id_type'           => $list_table instanceof EE_Attendee_Contact_List_Table ? 'contact' : 'registration',
468
+		);
469
+		EEH_Template::display_template($form_template, $form_template_args);
470
+	}
471 471
 
472 472
 
473
-    /**
474
-     * Handles sending selected registrations/contacts a newsletter.
475
-     *
476
-     * @since  4.3.0
477
-     * @return void
478
-     * @throws EE_Error
479
-     * @throws InvalidArgumentException
480
-     * @throws InvalidDataTypeException
481
-     * @throws InvalidInterfaceException
482
-     */
483
-    protected function _newsletter_selected_send()
484
-    {
485
-        $success = true;
486
-        // first we need to make sure we have a GRP_ID so we know what template we're sending and updating!
487
-        if (empty($this->_req_data['newsletter_mtp_selected'])) {
488
-            EE_Error::add_error(
489
-                esc_html__(
490
-                    'In order to send a message, a Message Template GRP_ID is needed. It was not provided so messages were not sent.',
491
-                    'event_espresso'
492
-                ),
493
-                __FILE__,
494
-                __FUNCTION__,
495
-                __LINE__
496
-            );
497
-            $success = false;
498
-        }
499
-        if ($success) {
500
-            // update Message template in case there are any changes
501
-            $Message_Template_Group = EEM_Message_Template_Group::instance()->get_one_by_ID(
502
-                $this->_req_data['newsletter_mtp_selected']
503
-            );
504
-            $Message_Templates = $Message_Template_Group instanceof EE_Message_Template_Group
505
-                ? $Message_Template_Group->context_templates()
506
-                : array();
507
-            if (empty($Message_Templates)) {
508
-                EE_Error::add_error(
509
-                    esc_html__(
510
-                        'Unable to retrieve message template fields from the db. Messages not sent.',
511
-                        'event_espresso'
512
-                    ),
513
-                    __FILE__,
514
-                    __FUNCTION__,
515
-                    __LINE__
516
-                );
517
-            }
518
-            // let's just update the specific fields
519
-            foreach ($Message_Templates['attendee'] as $Message_Template) {
520
-                if ($Message_Template instanceof EE_Message_Template) {
521
-                    $field = $Message_Template->get('MTP_template_field');
522
-                    $content = $Message_Template->get('MTP_content');
523
-                    $new_content = $content;
524
-                    switch ($field) {
525
-                        case 'from':
526
-                            $new_content = ! empty($this->_req_data['batch_message']['from'])
527
-                                ? $this->_req_data['batch_message']['from']
528
-                                : $content;
529
-                            break;
530
-                        case 'subject':
531
-                            $new_content = ! empty($this->_req_data['batch_message']['subject'])
532
-                                ? $this->_req_data['batch_message']['subject']
533
-                                : $content;
534
-                            break;
535
-                        case 'content':
536
-                            $new_content = $content;
537
-                            $new_content['newsletter_content'] = ! empty($this->_req_data['batch_message']['content'])
538
-                                ? $this->_req_data['batch_message']['content']
539
-                                : $content['newsletter_content'];
540
-                            break;
541
-                        default:
542
-                            // continue the foreach loop, we don't want to set $new_content nor save.
543
-                            continue 2;
544
-                    }
545
-                    $Message_Template->set('MTP_content', $new_content);
546
-                    $Message_Template->save();
547
-                }
548
-            }
549
-            // great fields are updated!  now let's make sure we just have contact objects (EE_Attendee).
550
-            $id_type = ! empty($this->_req_data['batch_message']['id_type'])
551
-                ? $this->_req_data['batch_message']['id_type']
552
-                : 'registration';
553
-            // id_type will affect how we assemble the ids.
554
-            $ids = ! empty($this->_req_data['batch_message']['ids'])
555
-                ? json_decode(stripslashes($this->_req_data['batch_message']['ids']))
556
-                : array();
557
-            $registrations_used_for_contact_data = array();
558
-            // using switch because eventually we'll have other contexts that will be used for generating messages.
559
-            switch ($id_type) {
560
-                case 'registration':
561
-                    $registrations_used_for_contact_data = EEM_Registration::instance()->get_all(
562
-                        array(
563
-                            array(
564
-                                'REG_ID' => array('IN', $ids),
565
-                            ),
566
-                        )
567
-                    );
568
-                    break;
569
-                case 'contact':
570
-                    $registrations_used_for_contact_data = EEM_Registration::instance()
571
-                                                                           ->get_latest_registration_for_each_of_given_contacts(
572
-                                                                               $ids
573
-                                                                           );
574
-                    break;
575
-            }
576
-            do_action_ref_array(
577
-                'AHEE__Extend_Registrations_Admin_Page___newsletter_selected_send__with_registrations',
578
-                array(
579
-                    $registrations_used_for_contact_data,
580
-                    $Message_Template_Group->ID(),
581
-                )
582
-            );
583
-            // kept for backward compat, internally we no longer use this action.
584
-            // @deprecated 4.8.36.rc.002
585
-            $contacts = $id_type === 'registration'
586
-                ? EEM_Attendee::instance()->get_array_of_contacts_from_reg_ids($ids)
587
-                : EEM_Attendee::instance()->get_all(array(array('ATT_ID' => array('in', $ids))));
588
-            do_action_ref_array(
589
-                'AHEE__Extend_Registrations_Admin_Page___newsletter_selected_send',
590
-                array(
591
-                    $contacts,
592
-                    $Message_Template_Group->ID(),
593
-                )
594
-            );
595
-        }
596
-        $query_args = array(
597
-            'action' => ! empty($this->_req_data['redirect_back_to'])
598
-                ? $this->_req_data['redirect_back_to']
599
-                : 'default',
600
-        );
601
-        $this->_redirect_after_action(false, '', '', $query_args, true);
602
-    }
473
+	/**
474
+	 * Handles sending selected registrations/contacts a newsletter.
475
+	 *
476
+	 * @since  4.3.0
477
+	 * @return void
478
+	 * @throws EE_Error
479
+	 * @throws InvalidArgumentException
480
+	 * @throws InvalidDataTypeException
481
+	 * @throws InvalidInterfaceException
482
+	 */
483
+	protected function _newsletter_selected_send()
484
+	{
485
+		$success = true;
486
+		// first we need to make sure we have a GRP_ID so we know what template we're sending and updating!
487
+		if (empty($this->_req_data['newsletter_mtp_selected'])) {
488
+			EE_Error::add_error(
489
+				esc_html__(
490
+					'In order to send a message, a Message Template GRP_ID is needed. It was not provided so messages were not sent.',
491
+					'event_espresso'
492
+				),
493
+				__FILE__,
494
+				__FUNCTION__,
495
+				__LINE__
496
+			);
497
+			$success = false;
498
+		}
499
+		if ($success) {
500
+			// update Message template in case there are any changes
501
+			$Message_Template_Group = EEM_Message_Template_Group::instance()->get_one_by_ID(
502
+				$this->_req_data['newsletter_mtp_selected']
503
+			);
504
+			$Message_Templates = $Message_Template_Group instanceof EE_Message_Template_Group
505
+				? $Message_Template_Group->context_templates()
506
+				: array();
507
+			if (empty($Message_Templates)) {
508
+				EE_Error::add_error(
509
+					esc_html__(
510
+						'Unable to retrieve message template fields from the db. Messages not sent.',
511
+						'event_espresso'
512
+					),
513
+					__FILE__,
514
+					__FUNCTION__,
515
+					__LINE__
516
+				);
517
+			}
518
+			// let's just update the specific fields
519
+			foreach ($Message_Templates['attendee'] as $Message_Template) {
520
+				if ($Message_Template instanceof EE_Message_Template) {
521
+					$field = $Message_Template->get('MTP_template_field');
522
+					$content = $Message_Template->get('MTP_content');
523
+					$new_content = $content;
524
+					switch ($field) {
525
+						case 'from':
526
+							$new_content = ! empty($this->_req_data['batch_message']['from'])
527
+								? $this->_req_data['batch_message']['from']
528
+								: $content;
529
+							break;
530
+						case 'subject':
531
+							$new_content = ! empty($this->_req_data['batch_message']['subject'])
532
+								? $this->_req_data['batch_message']['subject']
533
+								: $content;
534
+							break;
535
+						case 'content':
536
+							$new_content = $content;
537
+							$new_content['newsletter_content'] = ! empty($this->_req_data['batch_message']['content'])
538
+								? $this->_req_data['batch_message']['content']
539
+								: $content['newsletter_content'];
540
+							break;
541
+						default:
542
+							// continue the foreach loop, we don't want to set $new_content nor save.
543
+							continue 2;
544
+					}
545
+					$Message_Template->set('MTP_content', $new_content);
546
+					$Message_Template->save();
547
+				}
548
+			}
549
+			// great fields are updated!  now let's make sure we just have contact objects (EE_Attendee).
550
+			$id_type = ! empty($this->_req_data['batch_message']['id_type'])
551
+				? $this->_req_data['batch_message']['id_type']
552
+				: 'registration';
553
+			// id_type will affect how we assemble the ids.
554
+			$ids = ! empty($this->_req_data['batch_message']['ids'])
555
+				? json_decode(stripslashes($this->_req_data['batch_message']['ids']))
556
+				: array();
557
+			$registrations_used_for_contact_data = array();
558
+			// using switch because eventually we'll have other contexts that will be used for generating messages.
559
+			switch ($id_type) {
560
+				case 'registration':
561
+					$registrations_used_for_contact_data = EEM_Registration::instance()->get_all(
562
+						array(
563
+							array(
564
+								'REG_ID' => array('IN', $ids),
565
+							),
566
+						)
567
+					);
568
+					break;
569
+				case 'contact':
570
+					$registrations_used_for_contact_data = EEM_Registration::instance()
571
+																		   ->get_latest_registration_for_each_of_given_contacts(
572
+																			   $ids
573
+																		   );
574
+					break;
575
+			}
576
+			do_action_ref_array(
577
+				'AHEE__Extend_Registrations_Admin_Page___newsletter_selected_send__with_registrations',
578
+				array(
579
+					$registrations_used_for_contact_data,
580
+					$Message_Template_Group->ID(),
581
+				)
582
+			);
583
+			// kept for backward compat, internally we no longer use this action.
584
+			// @deprecated 4.8.36.rc.002
585
+			$contacts = $id_type === 'registration'
586
+				? EEM_Attendee::instance()->get_array_of_contacts_from_reg_ids($ids)
587
+				: EEM_Attendee::instance()->get_all(array(array('ATT_ID' => array('in', $ids))));
588
+			do_action_ref_array(
589
+				'AHEE__Extend_Registrations_Admin_Page___newsletter_selected_send',
590
+				array(
591
+					$contacts,
592
+					$Message_Template_Group->ID(),
593
+				)
594
+			);
595
+		}
596
+		$query_args = array(
597
+			'action' => ! empty($this->_req_data['redirect_back_to'])
598
+				? $this->_req_data['redirect_back_to']
599
+				: 'default',
600
+		);
601
+		$this->_redirect_after_action(false, '', '', $query_args, true);
602
+	}
603 603
 
604 604
 
605
-    /**
606
-     * This is called when javascript is being enqueued to setup the various data needed for the reports js.
607
-     * Also $this->{$_reports_template_data} property is set for later usage by the _registration_reports method.
608
-     */
609
-    protected function _registration_reports_js_setup()
610
-    {
611
-        $this->_reports_template_data['admin_reports'][] = $this->_registrations_per_day_report();
612
-        $this->_reports_template_data['admin_reports'][] = $this->_registrations_per_event_report();
613
-    }
605
+	/**
606
+	 * This is called when javascript is being enqueued to setup the various data needed for the reports js.
607
+	 * Also $this->{$_reports_template_data} property is set for later usage by the _registration_reports method.
608
+	 */
609
+	protected function _registration_reports_js_setup()
610
+	{
611
+		$this->_reports_template_data['admin_reports'][] = $this->_registrations_per_day_report();
612
+		$this->_reports_template_data['admin_reports'][] = $this->_registrations_per_event_report();
613
+	}
614 614
 
615 615
 
616
-    /**
617
-     *        generates Business Reports regarding Registrations
618
-     *
619
-     * @access protected
620
-     * @return void
621
-     * @throws DomainException
622
-     */
623
-    protected function _registration_reports()
624
-    {
625
-        $template_path = EE_ADMIN_TEMPLATE . 'admin_reports.template.php';
626
-        $this->_template_args['admin_page_content'] = EEH_Template::display_template(
627
-            $template_path,
628
-            $this->_reports_template_data,
629
-            true
630
-        );
631
-        // the final template wrapper
632
-        $this->display_admin_page_with_no_sidebar();
633
-    }
616
+	/**
617
+	 *        generates Business Reports regarding Registrations
618
+	 *
619
+	 * @access protected
620
+	 * @return void
621
+	 * @throws DomainException
622
+	 */
623
+	protected function _registration_reports()
624
+	{
625
+		$template_path = EE_ADMIN_TEMPLATE . 'admin_reports.template.php';
626
+		$this->_template_args['admin_page_content'] = EEH_Template::display_template(
627
+			$template_path,
628
+			$this->_reports_template_data,
629
+			true
630
+		);
631
+		// the final template wrapper
632
+		$this->display_admin_page_with_no_sidebar();
633
+	}
634 634
 
635 635
 
636
-    /**
637
-     * Generates Business Report showing total registrations per day.
638
-     *
639
-     * @param string $period The period (acceptable by PHP Datetime constructor) for which the report is generated.
640
-     * @return string
641
-     * @throws EE_Error
642
-     * @throws InvalidArgumentException
643
-     * @throws InvalidDataTypeException
644
-     * @throws InvalidInterfaceException
645
-     */
646
-    private function _registrations_per_day_report($period = '-1 month')
647
-    {
648
-        $report_ID = 'reg-admin-registrations-per-day-report-dv';
649
-        $results = EEM_Registration::instance()->get_registrations_per_day_and_per_status_report($period);
650
-        $results = (array) $results;
651
-        $regs = array();
652
-        $subtitle = '';
653
-        if ($results) {
654
-            $column_titles = array();
655
-            $tracker = 0;
656
-            foreach ($results as $result) {
657
-                $report_column_values = array();
658
-                foreach ($result as $property_name => $property_value) {
659
-                    $property_value = $property_name === 'Registration_REG_date' ? $property_value
660
-                        : (int) $property_value;
661
-                    $report_column_values[] = $property_value;
662
-                    if ($tracker === 0) {
663
-                        if ($property_name === 'Registration_REG_date') {
664
-                            $column_titles[] = esc_html__(
665
-                                'Date (only days with registrations are shown)',
666
-                                'event_espresso'
667
-                            );
668
-                        } else {
669
-                            $column_titles[] = EEH_Template::pretty_status($property_name, false, 'sentence');
670
-                        }
671
-                    }
672
-                }
673
-                $tracker++;
674
-                $regs[] = $report_column_values;
675
-            }
676
-            // make sure the column_titles is pushed to the beginning of the array
677
-            array_unshift($regs, $column_titles);
678
-            // setup the date range.
679
-            $DateTimeZone = new DateTimeZone(EEH_DTT_Helper::get_timezone());
680
-            $beginning_date = new DateTime("now " . $period, $DateTimeZone);
681
-            $ending_date = new DateTime("now", $DateTimeZone);
682
-            $subtitle = sprintf(
683
-                _x('For the period: %1$s to %2$s', 'Used to give date range', 'event_espresso'),
684
-                $beginning_date->format('Y-m-d'),
685
-                $ending_date->format('Y-m-d')
686
-            );
687
-        }
688
-        $report_title = esc_html__('Total Registrations per Day', 'event_espresso');
689
-        $report_params = array(
690
-            'title'     => $report_title,
691
-            'subtitle'  => $subtitle,
692
-            'id'        => $report_ID,
693
-            'regs'      => $regs,
694
-            'noResults' => empty($regs),
695
-            'noRegsMsg' => sprintf(
696
-                esc_html__(
697
-                    '%sThere are currently no registration records in the last month for this report.%s',
698
-                    'event_espresso'
699
-                ),
700
-                '<h2>' . $report_title . '</h2><p>',
701
-                '</p>'
702
-            ),
703
-        );
704
-        wp_localize_script('ee-reg-reports-js', 'regPerDay', $report_params);
705
-        return $report_ID;
706
-    }
636
+	/**
637
+	 * Generates Business Report showing total registrations per day.
638
+	 *
639
+	 * @param string $period The period (acceptable by PHP Datetime constructor) for which the report is generated.
640
+	 * @return string
641
+	 * @throws EE_Error
642
+	 * @throws InvalidArgumentException
643
+	 * @throws InvalidDataTypeException
644
+	 * @throws InvalidInterfaceException
645
+	 */
646
+	private function _registrations_per_day_report($period = '-1 month')
647
+	{
648
+		$report_ID = 'reg-admin-registrations-per-day-report-dv';
649
+		$results = EEM_Registration::instance()->get_registrations_per_day_and_per_status_report($period);
650
+		$results = (array) $results;
651
+		$regs = array();
652
+		$subtitle = '';
653
+		if ($results) {
654
+			$column_titles = array();
655
+			$tracker = 0;
656
+			foreach ($results as $result) {
657
+				$report_column_values = array();
658
+				foreach ($result as $property_name => $property_value) {
659
+					$property_value = $property_name === 'Registration_REG_date' ? $property_value
660
+						: (int) $property_value;
661
+					$report_column_values[] = $property_value;
662
+					if ($tracker === 0) {
663
+						if ($property_name === 'Registration_REG_date') {
664
+							$column_titles[] = esc_html__(
665
+								'Date (only days with registrations are shown)',
666
+								'event_espresso'
667
+							);
668
+						} else {
669
+							$column_titles[] = EEH_Template::pretty_status($property_name, false, 'sentence');
670
+						}
671
+					}
672
+				}
673
+				$tracker++;
674
+				$regs[] = $report_column_values;
675
+			}
676
+			// make sure the column_titles is pushed to the beginning of the array
677
+			array_unshift($regs, $column_titles);
678
+			// setup the date range.
679
+			$DateTimeZone = new DateTimeZone(EEH_DTT_Helper::get_timezone());
680
+			$beginning_date = new DateTime("now " . $period, $DateTimeZone);
681
+			$ending_date = new DateTime("now", $DateTimeZone);
682
+			$subtitle = sprintf(
683
+				_x('For the period: %1$s to %2$s', 'Used to give date range', 'event_espresso'),
684
+				$beginning_date->format('Y-m-d'),
685
+				$ending_date->format('Y-m-d')
686
+			);
687
+		}
688
+		$report_title = esc_html__('Total Registrations per Day', 'event_espresso');
689
+		$report_params = array(
690
+			'title'     => $report_title,
691
+			'subtitle'  => $subtitle,
692
+			'id'        => $report_ID,
693
+			'regs'      => $regs,
694
+			'noResults' => empty($regs),
695
+			'noRegsMsg' => sprintf(
696
+				esc_html__(
697
+					'%sThere are currently no registration records in the last month for this report.%s',
698
+					'event_espresso'
699
+				),
700
+				'<h2>' . $report_title . '</h2><p>',
701
+				'</p>'
702
+			),
703
+		);
704
+		wp_localize_script('ee-reg-reports-js', 'regPerDay', $report_params);
705
+		return $report_ID;
706
+	}
707 707
 
708 708
 
709
-    /**
710
-     * Generates Business Report showing total registrations per event.
711
-     *
712
-     * @param string $period The period (acceptable by PHP Datetime constructor) for which the report is generated.
713
-     * @return string
714
-     * @throws EE_Error
715
-     * @throws InvalidArgumentException
716
-     * @throws InvalidDataTypeException
717
-     * @throws InvalidInterfaceException
718
-     */
719
-    private function _registrations_per_event_report($period = '-1 month')
720
-    {
721
-        $report_ID = 'reg-admin-registrations-per-event-report-dv';
722
-        $results = EEM_Registration::instance()->get_registrations_per_event_and_per_status_report($period);
723
-        $results = (array) $results;
724
-        $regs = array();
725
-        $subtitle = '';
726
-        if ($results) {
727
-            $column_titles = array();
728
-            $tracker = 0;
729
-            foreach ($results as $result) {
730
-                $report_column_values = array();
731
-                foreach ($result as $property_name => $property_value) {
732
-                    $property_value = $property_name === 'Registration_Event' ? wp_trim_words(
733
-                        $property_value,
734
-                        4,
735
-                        '...'
736
-                    ) : (int) $property_value;
737
-                    $report_column_values[] = $property_value;
738
-                    if ($tracker === 0) {
739
-                        if ($property_name === 'Registration_Event') {
740
-                            $column_titles[] = esc_html__('Event', 'event_espresso');
741
-                        } else {
742
-                            $column_titles[] = EEH_Template::pretty_status($property_name, false, 'sentence');
743
-                        }
744
-                    }
745
-                }
746
-                $tracker++;
747
-                $regs[] = $report_column_values;
748
-            }
749
-            // make sure the column_titles is pushed to the beginning of the array
750
-            array_unshift($regs, $column_titles);
751
-            // setup the date range.
752
-            $DateTimeZone = new DateTimeZone(EEH_DTT_Helper::get_timezone());
753
-            $beginning_date = new DateTime("now " . $period, $DateTimeZone);
754
-            $ending_date = new DateTime("now", $DateTimeZone);
755
-            $subtitle = sprintf(
756
-                _x('For the period: %1$s to %2$s', 'Used to give date range', 'event_espresso'),
757
-                $beginning_date->format('Y-m-d'),
758
-                $ending_date->format('Y-m-d')
759
-            );
760
-        }
761
-        $report_title = esc_html__('Total Registrations per Event', 'event_espresso');
762
-        $report_params = array(
763
-            'title'     => $report_title,
764
-            'subtitle'  => $subtitle,
765
-            'id'        => $report_ID,
766
-            'regs'      => $regs,
767
-            'noResults' => empty($regs),
768
-            'noRegsMsg' => sprintf(
769
-                esc_html__(
770
-                    '%sThere are currently no registration records in the last month for this report.%s',
771
-                    'event_espresso'
772
-                ),
773
-                '<h2>' . $report_title . '</h2><p>',
774
-                '</p>'
775
-            ),
776
-        );
777
-        wp_localize_script('ee-reg-reports-js', 'regPerEvent', $report_params);
778
-        return $report_ID;
779
-    }
709
+	/**
710
+	 * Generates Business Report showing total registrations per event.
711
+	 *
712
+	 * @param string $period The period (acceptable by PHP Datetime constructor) for which the report is generated.
713
+	 * @return string
714
+	 * @throws EE_Error
715
+	 * @throws InvalidArgumentException
716
+	 * @throws InvalidDataTypeException
717
+	 * @throws InvalidInterfaceException
718
+	 */
719
+	private function _registrations_per_event_report($period = '-1 month')
720
+	{
721
+		$report_ID = 'reg-admin-registrations-per-event-report-dv';
722
+		$results = EEM_Registration::instance()->get_registrations_per_event_and_per_status_report($period);
723
+		$results = (array) $results;
724
+		$regs = array();
725
+		$subtitle = '';
726
+		if ($results) {
727
+			$column_titles = array();
728
+			$tracker = 0;
729
+			foreach ($results as $result) {
730
+				$report_column_values = array();
731
+				foreach ($result as $property_name => $property_value) {
732
+					$property_value = $property_name === 'Registration_Event' ? wp_trim_words(
733
+						$property_value,
734
+						4,
735
+						'...'
736
+					) : (int) $property_value;
737
+					$report_column_values[] = $property_value;
738
+					if ($tracker === 0) {
739
+						if ($property_name === 'Registration_Event') {
740
+							$column_titles[] = esc_html__('Event', 'event_espresso');
741
+						} else {
742
+							$column_titles[] = EEH_Template::pretty_status($property_name, false, 'sentence');
743
+						}
744
+					}
745
+				}
746
+				$tracker++;
747
+				$regs[] = $report_column_values;
748
+			}
749
+			// make sure the column_titles is pushed to the beginning of the array
750
+			array_unshift($regs, $column_titles);
751
+			// setup the date range.
752
+			$DateTimeZone = new DateTimeZone(EEH_DTT_Helper::get_timezone());
753
+			$beginning_date = new DateTime("now " . $period, $DateTimeZone);
754
+			$ending_date = new DateTime("now", $DateTimeZone);
755
+			$subtitle = sprintf(
756
+				_x('For the period: %1$s to %2$s', 'Used to give date range', 'event_espresso'),
757
+				$beginning_date->format('Y-m-d'),
758
+				$ending_date->format('Y-m-d')
759
+			);
760
+		}
761
+		$report_title = esc_html__('Total Registrations per Event', 'event_espresso');
762
+		$report_params = array(
763
+			'title'     => $report_title,
764
+			'subtitle'  => $subtitle,
765
+			'id'        => $report_ID,
766
+			'regs'      => $regs,
767
+			'noResults' => empty($regs),
768
+			'noRegsMsg' => sprintf(
769
+				esc_html__(
770
+					'%sThere are currently no registration records in the last month for this report.%s',
771
+					'event_espresso'
772
+				),
773
+				'<h2>' . $report_title . '</h2><p>',
774
+				'</p>'
775
+			),
776
+		);
777
+		wp_localize_script('ee-reg-reports-js', 'regPerEvent', $report_params);
778
+		return $report_ID;
779
+	}
780 780
 
781 781
 
782
-    /**
783
-     * generates HTML for the Registration Check-in list table (showing all Check-ins for a specific registration)
784
-     *
785
-     * @access protected
786
-     * @return void
787
-     * @throws EE_Error
788
-     * @throws InvalidArgumentException
789
-     * @throws InvalidDataTypeException
790
-     * @throws InvalidInterfaceException
791
-     * @throws \EventEspresso\core\exceptions\EntityNotFoundException
792
-     */
793
-    protected function _registration_checkin_list_table()
794
-    {
795
-        do_action('AHEE_log', __FILE__, __FUNCTION__, '');
796
-        $reg_id = isset($this->_req_data['_REG_ID']) ? $this->_req_data['_REG_ID'] : null;
797
-        /** @var EE_Registration $registration */
798
-        $registration = EEM_Registration::instance()->get_one_by_ID($reg_id);
799
-        if (! $registration instanceof EE_Registration) {
800
-            throw new EE_Error(
801
-                sprintf(
802
-                    esc_html__('An error occurred. There is no registration with ID (%d)', 'event_espresso'),
803
-                    $reg_id
804
-                )
805
-            );
806
-        }
807
-        $attendee = $registration->attendee();
808
-        $this->_admin_page_title .= $this->get_action_link_or_button(
809
-            'new_registration',
810
-            'add-registrant',
811
-            array('event_id' => $registration->event_ID()),
812
-            'add-new-h2'
813
-        );
814
-        $checked_in = new CheckinStatusDashicon(EE_Checkin::status_checked_in);
815
-        $checked_out = new CheckinStatusDashicon(EE_Checkin::status_checked_out);
816
-        $legend_items = array(
817
-            'checkin'  => array(
818
-                'class' => $checked_in->cssClasses(),
819
-                'desc'  => $checked_in->legendLabel(),
820
-            ),
821
-            'checkout' => array(
822
-                'class' => $checked_out->cssClasses(),
823
-                'desc'  => $checked_out->legendLabel(),
824
-            ),
825
-        );
826
-        $this->_template_args['after_list_table'] = $this->_display_legend($legend_items);
827
-        $dtt_id = isset($this->_req_data['DTT_ID']) ? $this->_req_data['DTT_ID'] : null;
828
-        /** @var EE_Datetime $datetime */
829
-        $datetime = EEM_Datetime::instance()->get_one_by_ID($dtt_id);
830
-        $datetime_label = '';
831
-        if ($datetime instanceof EE_Datetime) {
832
-            $datetime_label = $datetime->get_dtt_display_name(true);
833
-            $datetime_label .= ! empty($datetime_label)
834
-                ? ' (' . $datetime->get_dtt_display_name() . ')'
835
-                : $datetime->get_dtt_display_name();
836
-        }
837
-        $datetime_link = ! empty($dtt_id) && $registration instanceof EE_Registration
838
-            ? EE_Admin_Page::add_query_args_and_nonce(
839
-                array(
840
-                    'action'   => 'event_registrations',
841
-                    'event_id' => $registration->event_ID(),
842
-                    'DTT_ID'   => $dtt_id,
843
-                ),
844
-                $this->_admin_base_url
845
-            )
846
-            : '';
847
-        $datetime_link = ! empty($datetime_link)
848
-            ? '<a href="' . $datetime_link . '">'
849
-              . '<span id="checkin-dtt">'
850
-              . $datetime_label
851
-              . '</span></a>'
852
-            : $datetime_label;
853
-        $attendee_name = $attendee instanceof EE_Attendee
854
-            ? $attendee->full_name()
855
-            : '';
856
-        $attendee_link = $attendee instanceof EE_Attendee
857
-            ? $attendee->get_admin_details_link()
858
-            : '';
859
-        $attendee_link = ! empty($attendee_link)
860
-            ? '<a href="' . $attendee->get_admin_details_link() . '"'
861
-              . ' title="' . esc_html__('Click for attendee details', 'event_espresso') . '">'
862
-              . '<span id="checkin-attendee-name">'
863
-              . $attendee_name
864
-              . '</span></a>'
865
-            : '';
866
-        $event_link = $registration->event() instanceof EE_Event
867
-            ? $registration->event()->get_admin_details_link()
868
-            : '';
869
-        $event_link = ! empty($event_link)
870
-            ? '<a href="' . $event_link . '"'
871
-              . ' title="' . esc_html__('Click here to edit event.', 'event_espresso') . '">'
872
-              . '<span id="checkin-event-name">'
873
-              . $registration->event_name()
874
-              . '</span>'
875
-              . '</a>'
876
-            : '';
877
-        $this->_template_args['before_list_table'] = ! empty($reg_id) && ! empty($dtt_id)
878
-            ? '<h2>' . sprintf(
879
-                esc_html__('Displaying check in records for %1$s for %2$s at the event, %3$s', 'event_espresso'),
880
-                $attendee_link,
881
-                $datetime_link,
882
-                $event_link
883
-            ) . '</h2>'
884
-            : '';
885
-        $this->_template_args['list_table_hidden_fields'] = ! empty($reg_id)
886
-            ? '<input type="hidden" name="_REG_ID" value="' . $reg_id . '">' : '';
887
-        $this->_template_args['list_table_hidden_fields'] .= ! empty($dtt_id)
888
-            ? '<input type="hidden" name="DTT_ID" value="' . $dtt_id . '">' : '';
889
-        $this->display_admin_list_table_page_with_no_sidebar();
890
-    }
782
+	/**
783
+	 * generates HTML for the Registration Check-in list table (showing all Check-ins for a specific registration)
784
+	 *
785
+	 * @access protected
786
+	 * @return void
787
+	 * @throws EE_Error
788
+	 * @throws InvalidArgumentException
789
+	 * @throws InvalidDataTypeException
790
+	 * @throws InvalidInterfaceException
791
+	 * @throws \EventEspresso\core\exceptions\EntityNotFoundException
792
+	 */
793
+	protected function _registration_checkin_list_table()
794
+	{
795
+		do_action('AHEE_log', __FILE__, __FUNCTION__, '');
796
+		$reg_id = isset($this->_req_data['_REG_ID']) ? $this->_req_data['_REG_ID'] : null;
797
+		/** @var EE_Registration $registration */
798
+		$registration = EEM_Registration::instance()->get_one_by_ID($reg_id);
799
+		if (! $registration instanceof EE_Registration) {
800
+			throw new EE_Error(
801
+				sprintf(
802
+					esc_html__('An error occurred. There is no registration with ID (%d)', 'event_espresso'),
803
+					$reg_id
804
+				)
805
+			);
806
+		}
807
+		$attendee = $registration->attendee();
808
+		$this->_admin_page_title .= $this->get_action_link_or_button(
809
+			'new_registration',
810
+			'add-registrant',
811
+			array('event_id' => $registration->event_ID()),
812
+			'add-new-h2'
813
+		);
814
+		$checked_in = new CheckinStatusDashicon(EE_Checkin::status_checked_in);
815
+		$checked_out = new CheckinStatusDashicon(EE_Checkin::status_checked_out);
816
+		$legend_items = array(
817
+			'checkin'  => array(
818
+				'class' => $checked_in->cssClasses(),
819
+				'desc'  => $checked_in->legendLabel(),
820
+			),
821
+			'checkout' => array(
822
+				'class' => $checked_out->cssClasses(),
823
+				'desc'  => $checked_out->legendLabel(),
824
+			),
825
+		);
826
+		$this->_template_args['after_list_table'] = $this->_display_legend($legend_items);
827
+		$dtt_id = isset($this->_req_data['DTT_ID']) ? $this->_req_data['DTT_ID'] : null;
828
+		/** @var EE_Datetime $datetime */
829
+		$datetime = EEM_Datetime::instance()->get_one_by_ID($dtt_id);
830
+		$datetime_label = '';
831
+		if ($datetime instanceof EE_Datetime) {
832
+			$datetime_label = $datetime->get_dtt_display_name(true);
833
+			$datetime_label .= ! empty($datetime_label)
834
+				? ' (' . $datetime->get_dtt_display_name() . ')'
835
+				: $datetime->get_dtt_display_name();
836
+		}
837
+		$datetime_link = ! empty($dtt_id) && $registration instanceof EE_Registration
838
+			? EE_Admin_Page::add_query_args_and_nonce(
839
+				array(
840
+					'action'   => 'event_registrations',
841
+					'event_id' => $registration->event_ID(),
842
+					'DTT_ID'   => $dtt_id,
843
+				),
844
+				$this->_admin_base_url
845
+			)
846
+			: '';
847
+		$datetime_link = ! empty($datetime_link)
848
+			? '<a href="' . $datetime_link . '">'
849
+			  . '<span id="checkin-dtt">'
850
+			  . $datetime_label
851
+			  . '</span></a>'
852
+			: $datetime_label;
853
+		$attendee_name = $attendee instanceof EE_Attendee
854
+			? $attendee->full_name()
855
+			: '';
856
+		$attendee_link = $attendee instanceof EE_Attendee
857
+			? $attendee->get_admin_details_link()
858
+			: '';
859
+		$attendee_link = ! empty($attendee_link)
860
+			? '<a href="' . $attendee->get_admin_details_link() . '"'
861
+			  . ' title="' . esc_html__('Click for attendee details', 'event_espresso') . '">'
862
+			  . '<span id="checkin-attendee-name">'
863
+			  . $attendee_name
864
+			  . '</span></a>'
865
+			: '';
866
+		$event_link = $registration->event() instanceof EE_Event
867
+			? $registration->event()->get_admin_details_link()
868
+			: '';
869
+		$event_link = ! empty($event_link)
870
+			? '<a href="' . $event_link . '"'
871
+			  . ' title="' . esc_html__('Click here to edit event.', 'event_espresso') . '">'
872
+			  . '<span id="checkin-event-name">'
873
+			  . $registration->event_name()
874
+			  . '</span>'
875
+			  . '</a>'
876
+			: '';
877
+		$this->_template_args['before_list_table'] = ! empty($reg_id) && ! empty($dtt_id)
878
+			? '<h2>' . sprintf(
879
+				esc_html__('Displaying check in records for %1$s for %2$s at the event, %3$s', 'event_espresso'),
880
+				$attendee_link,
881
+				$datetime_link,
882
+				$event_link
883
+			) . '</h2>'
884
+			: '';
885
+		$this->_template_args['list_table_hidden_fields'] = ! empty($reg_id)
886
+			? '<input type="hidden" name="_REG_ID" value="' . $reg_id . '">' : '';
887
+		$this->_template_args['list_table_hidden_fields'] .= ! empty($dtt_id)
888
+			? '<input type="hidden" name="DTT_ID" value="' . $dtt_id . '">' : '';
889
+		$this->display_admin_list_table_page_with_no_sidebar();
890
+	}
891 891
 
892 892
 
893
-    /**
894
-     * toggle the Check-in status for the given registration (coming from ajax)
895
-     *
896
-     * @return void (JSON)
897
-     * @throws EE_Error
898
-     * @throws InvalidArgumentException
899
-     * @throws InvalidDataTypeException
900
-     * @throws InvalidInterfaceException
901
-     */
902
-    public function toggle_checkin_status()
903
-    {
904
-        // first make sure we have the necessary data
905
-        if (! isset($this->_req_data['_regid'])) {
906
-            EE_Error::add_error(
907
-                esc_html__(
908
-                    'There must be something broken with the html structure because the required data for toggling the Check-in status is not being sent via ajax',
909
-                    'event_espresso'
910
-                ),
911
-                __FILE__,
912
-                __FUNCTION__,
913
-                __LINE__
914
-            );
915
-            $this->_template_args['success'] = false;
916
-            $this->_template_args['error'] = true;
917
-            $this->_return_json();
918
-        };
919
-        // do a nonce check cause we're not coming in from an normal route here.
920
-        $nonce = isset($this->_req_data['checkinnonce']) ? sanitize_text_field($this->_req_data['checkinnonce'])
921
-            : '';
922
-        $nonce_ref = 'checkin_nonce';
923
-        $this->_verify_nonce($nonce, $nonce_ref);
924
-        // beautiful! Made it this far so let's get the status.
925
-        $new_status = new CheckinStatusDashicon($this->_toggle_checkin_status());
926
-        // setup new class to return via ajax
927
-        $this->_template_args['admin_page_content'] = 'clickable trigger-checkin ' . $new_status->cssClasses();
928
-        $this->_template_args['success'] = true;
929
-        $this->_return_json();
930
-    }
893
+	/**
894
+	 * toggle the Check-in status for the given registration (coming from ajax)
895
+	 *
896
+	 * @return void (JSON)
897
+	 * @throws EE_Error
898
+	 * @throws InvalidArgumentException
899
+	 * @throws InvalidDataTypeException
900
+	 * @throws InvalidInterfaceException
901
+	 */
902
+	public function toggle_checkin_status()
903
+	{
904
+		// first make sure we have the necessary data
905
+		if (! isset($this->_req_data['_regid'])) {
906
+			EE_Error::add_error(
907
+				esc_html__(
908
+					'There must be something broken with the html structure because the required data for toggling the Check-in status is not being sent via ajax',
909
+					'event_espresso'
910
+				),
911
+				__FILE__,
912
+				__FUNCTION__,
913
+				__LINE__
914
+			);
915
+			$this->_template_args['success'] = false;
916
+			$this->_template_args['error'] = true;
917
+			$this->_return_json();
918
+		};
919
+		// do a nonce check cause we're not coming in from an normal route here.
920
+		$nonce = isset($this->_req_data['checkinnonce']) ? sanitize_text_field($this->_req_data['checkinnonce'])
921
+			: '';
922
+		$nonce_ref = 'checkin_nonce';
923
+		$this->_verify_nonce($nonce, $nonce_ref);
924
+		// beautiful! Made it this far so let's get the status.
925
+		$new_status = new CheckinStatusDashicon($this->_toggle_checkin_status());
926
+		// setup new class to return via ajax
927
+		$this->_template_args['admin_page_content'] = 'clickable trigger-checkin ' . $new_status->cssClasses();
928
+		$this->_template_args['success'] = true;
929
+		$this->_return_json();
930
+	}
931 931
 
932 932
 
933
-    /**
934
-     * handles toggling the checkin status for the registration,
935
-     *
936
-     * @access protected
937
-     * @return int|void
938
-     * @throws EE_Error
939
-     * @throws InvalidArgumentException
940
-     * @throws InvalidDataTypeException
941
-     * @throws InvalidInterfaceException
942
-     */
943
-    protected function _toggle_checkin_status()
944
-    {
945
-        // first let's get the query args out of the way for the redirect
946
-        $query_args = array(
947
-            'action'   => 'event_registrations',
948
-            'event_id' => isset($this->_req_data['event_id']) ? $this->_req_data['event_id'] : null,
949
-            'DTT_ID'   => isset($this->_req_data['DTT_ID']) ? $this->_req_data['DTT_ID'] : null,
950
-        );
951
-        $new_status = false;
952
-        // bulk action check in toggle
953
-        if (! empty($this->_req_data['checkbox']) && is_array($this->_req_data['checkbox'])) {
954
-            // cycle thru checkboxes
955
-            while (list($REG_ID, $value) = each($this->_req_data['checkbox'])) {
956
-                $DTT_ID = isset($this->_req_data['DTT_ID']) ? $this->_req_data['DTT_ID'] : null;
957
-                $new_status = $this->_toggle_checkin($REG_ID, $DTT_ID);
958
-            }
959
-        } elseif (isset($this->_req_data['_regid'])) {
960
-            // coming from ajax request
961
-            $DTT_ID = isset($this->_req_data['dttid']) ? $this->_req_data['dttid'] : null;
962
-            $query_args['DTT_ID'] = $DTT_ID;
963
-            $new_status = $this->_toggle_checkin($this->_req_data['_regid'], $DTT_ID);
964
-        } else {
965
-            EE_Error::add_error(
966
-                esc_html__('Missing some required data to toggle the Check-in', 'event_espresso'),
967
-                __FILE__,
968
-                __FUNCTION__,
969
-                __LINE__
970
-            );
971
-        }
972
-        if (defined('DOING_AJAX')) {
973
-            return $new_status;
974
-        }
975
-        $this->_redirect_after_action(false, '', '', $query_args, true);
976
-    }
933
+	/**
934
+	 * handles toggling the checkin status for the registration,
935
+	 *
936
+	 * @access protected
937
+	 * @return int|void
938
+	 * @throws EE_Error
939
+	 * @throws InvalidArgumentException
940
+	 * @throws InvalidDataTypeException
941
+	 * @throws InvalidInterfaceException
942
+	 */
943
+	protected function _toggle_checkin_status()
944
+	{
945
+		// first let's get the query args out of the way for the redirect
946
+		$query_args = array(
947
+			'action'   => 'event_registrations',
948
+			'event_id' => isset($this->_req_data['event_id']) ? $this->_req_data['event_id'] : null,
949
+			'DTT_ID'   => isset($this->_req_data['DTT_ID']) ? $this->_req_data['DTT_ID'] : null,
950
+		);
951
+		$new_status = false;
952
+		// bulk action check in toggle
953
+		if (! empty($this->_req_data['checkbox']) && is_array($this->_req_data['checkbox'])) {
954
+			// cycle thru checkboxes
955
+			while (list($REG_ID, $value) = each($this->_req_data['checkbox'])) {
956
+				$DTT_ID = isset($this->_req_data['DTT_ID']) ? $this->_req_data['DTT_ID'] : null;
957
+				$new_status = $this->_toggle_checkin($REG_ID, $DTT_ID);
958
+			}
959
+		} elseif (isset($this->_req_data['_regid'])) {
960
+			// coming from ajax request
961
+			$DTT_ID = isset($this->_req_data['dttid']) ? $this->_req_data['dttid'] : null;
962
+			$query_args['DTT_ID'] = $DTT_ID;
963
+			$new_status = $this->_toggle_checkin($this->_req_data['_regid'], $DTT_ID);
964
+		} else {
965
+			EE_Error::add_error(
966
+				esc_html__('Missing some required data to toggle the Check-in', 'event_espresso'),
967
+				__FILE__,
968
+				__FUNCTION__,
969
+				__LINE__
970
+			);
971
+		}
972
+		if (defined('DOING_AJAX')) {
973
+			return $new_status;
974
+		}
975
+		$this->_redirect_after_action(false, '', '', $query_args, true);
976
+	}
977 977
 
978 978
 
979
-    /**
980
-     * This is toggles a single Check-in for the given registration and datetime.
981
-     *
982
-     * @param  int $REG_ID The registration we're toggling
983
-     * @param  int $DTT_ID The datetime we're toggling
984
-     * @return int The new status toggled to.
985
-     * @throws EE_Error
986
-     * @throws InvalidArgumentException
987
-     * @throws InvalidDataTypeException
988
-     * @throws InvalidInterfaceException
989
-     */
990
-    private function _toggle_checkin($REG_ID, $DTT_ID)
991
-    {
992
-        /** @var EE_Registration $REG */
993
-        $REG = EEM_Registration::instance()->get_one_by_ID($REG_ID);
994
-        $new_status = $REG->toggle_checkin_status($DTT_ID);
995
-        if ($new_status !== false) {
996
-            EE_Error::add_success($REG->get_checkin_msg($DTT_ID));
997
-        } else {
998
-            EE_Error::add_error($REG->get_checkin_msg($DTT_ID, true), __FILE__, __FUNCTION__, __LINE__);
999
-            $new_status = false;
1000
-        }
1001
-        return $new_status;
1002
-    }
979
+	/**
980
+	 * This is toggles a single Check-in for the given registration and datetime.
981
+	 *
982
+	 * @param  int $REG_ID The registration we're toggling
983
+	 * @param  int $DTT_ID The datetime we're toggling
984
+	 * @return int The new status toggled to.
985
+	 * @throws EE_Error
986
+	 * @throws InvalidArgumentException
987
+	 * @throws InvalidDataTypeException
988
+	 * @throws InvalidInterfaceException
989
+	 */
990
+	private function _toggle_checkin($REG_ID, $DTT_ID)
991
+	{
992
+		/** @var EE_Registration $REG */
993
+		$REG = EEM_Registration::instance()->get_one_by_ID($REG_ID);
994
+		$new_status = $REG->toggle_checkin_status($DTT_ID);
995
+		if ($new_status !== false) {
996
+			EE_Error::add_success($REG->get_checkin_msg($DTT_ID));
997
+		} else {
998
+			EE_Error::add_error($REG->get_checkin_msg($DTT_ID, true), __FILE__, __FUNCTION__, __LINE__);
999
+			$new_status = false;
1000
+		}
1001
+		return $new_status;
1002
+	}
1003 1003
 
1004 1004
 
1005
-    /**
1006
-     * Takes care of deleting multiple EE_Checkin table rows
1007
-     *
1008
-     * @access protected
1009
-     * @return void
1010
-     * @throws EE_Error
1011
-     * @throws InvalidArgumentException
1012
-     * @throws InvalidDataTypeException
1013
-     * @throws InvalidInterfaceException
1014
-     */
1015
-    protected function _delete_checkin_rows()
1016
-    {
1017
-        $query_args = array(
1018
-            'action'  => 'registration_checkins',
1019
-            'DTT_ID'  => isset($this->_req_data['DTT_ID']) ? $this->_req_data['DTT_ID'] : 0,
1020
-            '_REG_ID' => isset($this->_req_data['_REG_ID']) ? $this->_req_data['_REG_ID'] : 0,
1021
-        );
1022
-        $errors = 0;
1023
-        if (! empty($this->_req_data['checkbox']) && is_array($this->_req_data['checkbox'])) {
1024
-            while (list($CHK_ID, $value) = each($this->_req_data['checkbox'])) {
1025
-                if (! EEM_Checkin::instance()->delete_by_ID($CHK_ID)) {
1026
-                    $errors++;
1027
-                }
1028
-            }
1029
-        } else {
1030
-            EE_Error::add_error(
1031
-                esc_html__(
1032
-                    'So, something went wrong with the bulk delete because there was no data received for instructions on WHAT to delete!',
1033
-                    'event_espresso'
1034
-                ),
1035
-                __FILE__,
1036
-                __FUNCTION__,
1037
-                __LINE__
1038
-            );
1039
-            $this->_redirect_after_action(false, '', '', $query_args, true);
1040
-        }
1041
-        if ($errors > 0) {
1042
-            EE_Error::add_error(
1043
-                sprintf(__('There were %d records that did not delete successfully', 'event_espresso'), $errors),
1044
-                __FILE__,
1045
-                __FUNCTION__,
1046
-                __LINE__
1047
-            );
1048
-        } else {
1049
-            EE_Error::add_success(__('Records were successfully deleted', 'event_espresso'));
1050
-        }
1051
-        $this->_redirect_after_action(false, '', '', $query_args, true);
1052
-    }
1005
+	/**
1006
+	 * Takes care of deleting multiple EE_Checkin table rows
1007
+	 *
1008
+	 * @access protected
1009
+	 * @return void
1010
+	 * @throws EE_Error
1011
+	 * @throws InvalidArgumentException
1012
+	 * @throws InvalidDataTypeException
1013
+	 * @throws InvalidInterfaceException
1014
+	 */
1015
+	protected function _delete_checkin_rows()
1016
+	{
1017
+		$query_args = array(
1018
+			'action'  => 'registration_checkins',
1019
+			'DTT_ID'  => isset($this->_req_data['DTT_ID']) ? $this->_req_data['DTT_ID'] : 0,
1020
+			'_REG_ID' => isset($this->_req_data['_REG_ID']) ? $this->_req_data['_REG_ID'] : 0,
1021
+		);
1022
+		$errors = 0;
1023
+		if (! empty($this->_req_data['checkbox']) && is_array($this->_req_data['checkbox'])) {
1024
+			while (list($CHK_ID, $value) = each($this->_req_data['checkbox'])) {
1025
+				if (! EEM_Checkin::instance()->delete_by_ID($CHK_ID)) {
1026
+					$errors++;
1027
+				}
1028
+			}
1029
+		} else {
1030
+			EE_Error::add_error(
1031
+				esc_html__(
1032
+					'So, something went wrong with the bulk delete because there was no data received for instructions on WHAT to delete!',
1033
+					'event_espresso'
1034
+				),
1035
+				__FILE__,
1036
+				__FUNCTION__,
1037
+				__LINE__
1038
+			);
1039
+			$this->_redirect_after_action(false, '', '', $query_args, true);
1040
+		}
1041
+		if ($errors > 0) {
1042
+			EE_Error::add_error(
1043
+				sprintf(__('There were %d records that did not delete successfully', 'event_espresso'), $errors),
1044
+				__FILE__,
1045
+				__FUNCTION__,
1046
+				__LINE__
1047
+			);
1048
+		} else {
1049
+			EE_Error::add_success(__('Records were successfully deleted', 'event_espresso'));
1050
+		}
1051
+		$this->_redirect_after_action(false, '', '', $query_args, true);
1052
+	}
1053 1053
 
1054 1054
 
1055
-    /**
1056
-     * Deletes a single EE_Checkin row
1057
-     *
1058
-     * @return void
1059
-     * @throws EE_Error
1060
-     * @throws InvalidArgumentException
1061
-     * @throws InvalidDataTypeException
1062
-     * @throws InvalidInterfaceException
1063
-     */
1064
-    protected function _delete_checkin_row()
1065
-    {
1066
-        $query_args = array(
1067
-            'action'  => 'registration_checkins',
1068
-            'DTT_ID'  => isset($this->_req_data['DTT_ID']) ? $this->_req_data['DTT_ID'] : 0,
1069
-            '_REG_ID' => isset($this->_req_data['_REG_ID']) ? $this->_req_data['_REG_ID'] : 0,
1070
-        );
1071
-        if (! empty($this->_req_data['CHK_ID'])) {
1072
-            if (! EEM_Checkin::instance()->delete_by_ID($this->_req_data['CHK_ID'])) {
1073
-                EE_Error::add_error(
1074
-                    esc_html__('Something went wrong and this check-in record was not deleted', 'event_espresso'),
1075
-                    __FILE__,
1076
-                    __FUNCTION__,
1077
-                    __LINE__
1078
-                );
1079
-            } else {
1080
-                EE_Error::add_success(__('Check-In record successfully deleted', 'event_espresso'));
1081
-            }
1082
-        } else {
1083
-            EE_Error::add_error(
1084
-                esc_html__(
1085
-                    'In order to delete a Check-in record, there must be a Check-In ID available. There is not. It is not your fault, there is just a gremlin living in the code',
1086
-                    'event_espresso'
1087
-                ),
1088
-                __FILE__,
1089
-                __FUNCTION__,
1090
-                __LINE__
1091
-            );
1092
-        }
1093
-        $this->_redirect_after_action(false, '', '', $query_args, true);
1094
-    }
1055
+	/**
1056
+	 * Deletes a single EE_Checkin row
1057
+	 *
1058
+	 * @return void
1059
+	 * @throws EE_Error
1060
+	 * @throws InvalidArgumentException
1061
+	 * @throws InvalidDataTypeException
1062
+	 * @throws InvalidInterfaceException
1063
+	 */
1064
+	protected function _delete_checkin_row()
1065
+	{
1066
+		$query_args = array(
1067
+			'action'  => 'registration_checkins',
1068
+			'DTT_ID'  => isset($this->_req_data['DTT_ID']) ? $this->_req_data['DTT_ID'] : 0,
1069
+			'_REG_ID' => isset($this->_req_data['_REG_ID']) ? $this->_req_data['_REG_ID'] : 0,
1070
+		);
1071
+		if (! empty($this->_req_data['CHK_ID'])) {
1072
+			if (! EEM_Checkin::instance()->delete_by_ID($this->_req_data['CHK_ID'])) {
1073
+				EE_Error::add_error(
1074
+					esc_html__('Something went wrong and this check-in record was not deleted', 'event_espresso'),
1075
+					__FILE__,
1076
+					__FUNCTION__,
1077
+					__LINE__
1078
+				);
1079
+			} else {
1080
+				EE_Error::add_success(__('Check-In record successfully deleted', 'event_espresso'));
1081
+			}
1082
+		} else {
1083
+			EE_Error::add_error(
1084
+				esc_html__(
1085
+					'In order to delete a Check-in record, there must be a Check-In ID available. There is not. It is not your fault, there is just a gremlin living in the code',
1086
+					'event_espresso'
1087
+				),
1088
+				__FILE__,
1089
+				__FUNCTION__,
1090
+				__LINE__
1091
+			);
1092
+		}
1093
+		$this->_redirect_after_action(false, '', '', $query_args, true);
1094
+	}
1095 1095
 
1096 1096
 
1097
-    /**
1098
-     *        generates HTML for the Event Registrations List Table
1099
-     *
1100
-     * @access protected
1101
-     * @return void
1102
-     * @throws EE_Error
1103
-     * @throws InvalidArgumentException
1104
-     * @throws InvalidDataTypeException
1105
-     * @throws InvalidInterfaceException
1106
-     */
1107
-    protected function _event_registrations_list_table()
1108
-    {
1109
-        do_action('AHEE_log', __FILE__, __FUNCTION__, '');
1110
-        $this->_admin_page_title .= isset($this->_req_data['event_id'])
1111
-            ? $this->get_action_link_or_button(
1112
-                'new_registration',
1113
-                'add-registrant',
1114
-                array('event_id' => $this->_req_data['event_id']),
1115
-                'add-new-h2',
1116
-                '',
1117
-                false
1118
-            )
1119
-            : '';
1120
-        $checked_in = new CheckinStatusDashicon(EE_Checkin::status_checked_in);
1121
-        $checked_out = new CheckinStatusDashicon(EE_Checkin::status_checked_out);
1122
-        $checked_never = new CheckinStatusDashicon(EE_Checkin::status_checked_never);
1123
-        $legend_items = array(
1124
-            'star-icon'        => array(
1125
-                'class' => 'dashicons dashicons-star-filled yellow-icon ee-icon-size-8',
1126
-                'desc'  => esc_html__('This Registrant is the Primary Registrant', 'event_espresso'),
1127
-            ),
1128
-            'checkin'          => array(
1129
-                'class' => $checked_in->cssClasses(),
1130
-                'desc'  => $checked_in->legendLabel(),
1131
-            ),
1132
-            'checkout'         => array(
1133
-                'class' => $checked_out->cssClasses(),
1134
-                'desc'  => $checked_out->legendLabel(),
1135
-            ),
1136
-            'nocheckinrecord'  => array(
1137
-                'class' => $checked_never->cssClasses(),
1138
-                'desc'  => $checked_never->legendLabel(),
1139
-            ),
1140
-            'approved_status'  => array(
1141
-                'class' => 'ee-status-legend ee-status-legend-' . EEM_Registration::status_id_approved,
1142
-                'desc'  => EEH_Template::pretty_status(EEM_Registration::status_id_approved, false, 'sentence'),
1143
-            ),
1144
-            'cancelled_status' => array(
1145
-                'class' => 'ee-status-legend ee-status-legend-' . EEM_Registration::status_id_cancelled,
1146
-                'desc'  => EEH_Template::pretty_status(EEM_Registration::status_id_cancelled, false, 'sentence'),
1147
-            ),
1148
-            'declined_status'  => array(
1149
-                'class' => 'ee-status-legend ee-status-legend-' . EEM_Registration::status_id_declined,
1150
-                'desc'  => EEH_Template::pretty_status(EEM_Registration::status_id_declined, false, 'sentence'),
1151
-            ),
1152
-            'not_approved'     => array(
1153
-                'class' => 'ee-status-legend ee-status-legend-' . EEM_Registration::status_id_not_approved,
1154
-                'desc'  => EEH_Template::pretty_status(EEM_Registration::status_id_not_approved, false, 'sentence'),
1155
-            ),
1156
-            'pending_status'   => array(
1157
-                'class' => 'ee-status-legend ee-status-legend-' . EEM_Registration::status_id_pending_payment,
1158
-                'desc'  => EEH_Template::pretty_status(EEM_Registration::status_id_pending_payment, false, 'sentence'),
1159
-            ),
1160
-            'wait_list'        => array(
1161
-                'class' => 'ee-status-legend ee-status-legend-' . EEM_Registration::status_id_wait_list,
1162
-                'desc'  => EEH_Template::pretty_status(EEM_Registration::status_id_wait_list, false, 'sentence'),
1163
-            ),
1164
-        );
1165
-        $this->_template_args['after_list_table'] = $this->_display_legend($legend_items);
1166
-        $event_id = isset($this->_req_data['event_id']) ? $this->_req_data['event_id'] : null;
1167
-        /** @var EE_Event $event */
1168
-        $event = EEM_Event::instance()->get_one_by_ID($event_id);
1169
-        $this->_template_args['before_list_table'] = $event instanceof EE_Event
1170
-            ? '<h2>' . sprintf(
1171
-                esc_html__('Viewing Registrations for Event: %s', 'event_espresso'),
1172
-                EEM_Event::instance()->get_one_by_ID($event_id)->get('EVT_name')
1173
-            ) . '</h2>'
1174
-            : '';
1175
-        // need to get the number of datetimes on the event and set default datetime_id if there is only one datetime on
1176
-        // the event.
1177
-        $DTT_ID = ! empty($this->_req_data['DTT_ID']) ? absint($this->_req_data['DTT_ID']) : 0;
1178
-        $datetime = null;
1179
-        if ($event instanceof EE_Event) {
1180
-            $datetimes_on_event = $event->datetimes();
1181
-            if (count($datetimes_on_event) === 1) {
1182
-                $datetime = reset($datetimes_on_event);
1183
-            }
1184
-        }
1185
-        $datetime = $datetime instanceof EE_Datetime ? $datetime : EEM_Datetime::instance()->get_one_by_ID($DTT_ID);
1186
-        if ($datetime instanceof EE_Datetime && $this->_template_args['before_list_table'] !== '') {
1187
-            $this->_template_args['before_list_table'] = substr($this->_template_args['before_list_table'], 0, -5);
1188
-            $this->_template_args['before_list_table'] .= ' &nbsp;<span class="drk-grey-text">';
1189
-            $this->_template_args['before_list_table'] .= '<span class="dashicons dashicons-calendar"></span>';
1190
-            $this->_template_args['before_list_table'] .= $datetime->name();
1191
-            $this->_template_args['before_list_table'] .= ' ( ' . $datetime->date_and_time_range() . ' )';
1192
-            $this->_template_args['before_list_table'] .= '</span></h2>';
1193
-        }
1194
-        // if no datetime, then we're on the initial view, so let's give some helpful instructions on what the status
1195
-        // column represents
1196
-        if (! $datetime instanceof EE_Datetime) {
1197
-            $this->_template_args['before_list_table'] .= '<br><p class="description">'
1198
-                                                          . esc_html__(
1199
-                                                              'In this view, the check-in status represents the latest check-in record for the registration in that row.',
1200
-                                                              'event_espresso'
1201
-                                                          )
1202
-                                                          . '</p>';
1203
-        }
1204
-        $this->display_admin_list_table_page_with_no_sidebar();
1205
-    }
1097
+	/**
1098
+	 *        generates HTML for the Event Registrations List Table
1099
+	 *
1100
+	 * @access protected
1101
+	 * @return void
1102
+	 * @throws EE_Error
1103
+	 * @throws InvalidArgumentException
1104
+	 * @throws InvalidDataTypeException
1105
+	 * @throws InvalidInterfaceException
1106
+	 */
1107
+	protected function _event_registrations_list_table()
1108
+	{
1109
+		do_action('AHEE_log', __FILE__, __FUNCTION__, '');
1110
+		$this->_admin_page_title .= isset($this->_req_data['event_id'])
1111
+			? $this->get_action_link_or_button(
1112
+				'new_registration',
1113
+				'add-registrant',
1114
+				array('event_id' => $this->_req_data['event_id']),
1115
+				'add-new-h2',
1116
+				'',
1117
+				false
1118
+			)
1119
+			: '';
1120
+		$checked_in = new CheckinStatusDashicon(EE_Checkin::status_checked_in);
1121
+		$checked_out = new CheckinStatusDashicon(EE_Checkin::status_checked_out);
1122
+		$checked_never = new CheckinStatusDashicon(EE_Checkin::status_checked_never);
1123
+		$legend_items = array(
1124
+			'star-icon'        => array(
1125
+				'class' => 'dashicons dashicons-star-filled yellow-icon ee-icon-size-8',
1126
+				'desc'  => esc_html__('This Registrant is the Primary Registrant', 'event_espresso'),
1127
+			),
1128
+			'checkin'          => array(
1129
+				'class' => $checked_in->cssClasses(),
1130
+				'desc'  => $checked_in->legendLabel(),
1131
+			),
1132
+			'checkout'         => array(
1133
+				'class' => $checked_out->cssClasses(),
1134
+				'desc'  => $checked_out->legendLabel(),
1135
+			),
1136
+			'nocheckinrecord'  => array(
1137
+				'class' => $checked_never->cssClasses(),
1138
+				'desc'  => $checked_never->legendLabel(),
1139
+			),
1140
+			'approved_status'  => array(
1141
+				'class' => 'ee-status-legend ee-status-legend-' . EEM_Registration::status_id_approved,
1142
+				'desc'  => EEH_Template::pretty_status(EEM_Registration::status_id_approved, false, 'sentence'),
1143
+			),
1144
+			'cancelled_status' => array(
1145
+				'class' => 'ee-status-legend ee-status-legend-' . EEM_Registration::status_id_cancelled,
1146
+				'desc'  => EEH_Template::pretty_status(EEM_Registration::status_id_cancelled, false, 'sentence'),
1147
+			),
1148
+			'declined_status'  => array(
1149
+				'class' => 'ee-status-legend ee-status-legend-' . EEM_Registration::status_id_declined,
1150
+				'desc'  => EEH_Template::pretty_status(EEM_Registration::status_id_declined, false, 'sentence'),
1151
+			),
1152
+			'not_approved'     => array(
1153
+				'class' => 'ee-status-legend ee-status-legend-' . EEM_Registration::status_id_not_approved,
1154
+				'desc'  => EEH_Template::pretty_status(EEM_Registration::status_id_not_approved, false, 'sentence'),
1155
+			),
1156
+			'pending_status'   => array(
1157
+				'class' => 'ee-status-legend ee-status-legend-' . EEM_Registration::status_id_pending_payment,
1158
+				'desc'  => EEH_Template::pretty_status(EEM_Registration::status_id_pending_payment, false, 'sentence'),
1159
+			),
1160
+			'wait_list'        => array(
1161
+				'class' => 'ee-status-legend ee-status-legend-' . EEM_Registration::status_id_wait_list,
1162
+				'desc'  => EEH_Template::pretty_status(EEM_Registration::status_id_wait_list, false, 'sentence'),
1163
+			),
1164
+		);
1165
+		$this->_template_args['after_list_table'] = $this->_display_legend($legend_items);
1166
+		$event_id = isset($this->_req_data['event_id']) ? $this->_req_data['event_id'] : null;
1167
+		/** @var EE_Event $event */
1168
+		$event = EEM_Event::instance()->get_one_by_ID($event_id);
1169
+		$this->_template_args['before_list_table'] = $event instanceof EE_Event
1170
+			? '<h2>' . sprintf(
1171
+				esc_html__('Viewing Registrations for Event: %s', 'event_espresso'),
1172
+				EEM_Event::instance()->get_one_by_ID($event_id)->get('EVT_name')
1173
+			) . '</h2>'
1174
+			: '';
1175
+		// need to get the number of datetimes on the event and set default datetime_id if there is only one datetime on
1176
+		// the event.
1177
+		$DTT_ID = ! empty($this->_req_data['DTT_ID']) ? absint($this->_req_data['DTT_ID']) : 0;
1178
+		$datetime = null;
1179
+		if ($event instanceof EE_Event) {
1180
+			$datetimes_on_event = $event->datetimes();
1181
+			if (count($datetimes_on_event) === 1) {
1182
+				$datetime = reset($datetimes_on_event);
1183
+			}
1184
+		}
1185
+		$datetime = $datetime instanceof EE_Datetime ? $datetime : EEM_Datetime::instance()->get_one_by_ID($DTT_ID);
1186
+		if ($datetime instanceof EE_Datetime && $this->_template_args['before_list_table'] !== '') {
1187
+			$this->_template_args['before_list_table'] = substr($this->_template_args['before_list_table'], 0, -5);
1188
+			$this->_template_args['before_list_table'] .= ' &nbsp;<span class="drk-grey-text">';
1189
+			$this->_template_args['before_list_table'] .= '<span class="dashicons dashicons-calendar"></span>';
1190
+			$this->_template_args['before_list_table'] .= $datetime->name();
1191
+			$this->_template_args['before_list_table'] .= ' ( ' . $datetime->date_and_time_range() . ' )';
1192
+			$this->_template_args['before_list_table'] .= '</span></h2>';
1193
+		}
1194
+		// if no datetime, then we're on the initial view, so let's give some helpful instructions on what the status
1195
+		// column represents
1196
+		if (! $datetime instanceof EE_Datetime) {
1197
+			$this->_template_args['before_list_table'] .= '<br><p class="description">'
1198
+														  . esc_html__(
1199
+															  'In this view, the check-in status represents the latest check-in record for the registration in that row.',
1200
+															  'event_espresso'
1201
+														  )
1202
+														  . '</p>';
1203
+		}
1204
+		$this->display_admin_list_table_page_with_no_sidebar();
1205
+	}
1206 1206
 
1207
-    /**
1208
-     * Download the registrations check-in report (same as the normal registration report, but with different where
1209
-     * conditions)
1210
-     *
1211
-     * @return void ends the request by a redirect or download
1212
-     */
1213
-    public function _registrations_checkin_report()
1214
-    {
1215
-        $this->_registrations_report_base('_get_checkin_query_params_from_request');
1216
-    }
1207
+	/**
1208
+	 * Download the registrations check-in report (same as the normal registration report, but with different where
1209
+	 * conditions)
1210
+	 *
1211
+	 * @return void ends the request by a redirect or download
1212
+	 */
1213
+	public function _registrations_checkin_report()
1214
+	{
1215
+		$this->_registrations_report_base('_get_checkin_query_params_from_request');
1216
+	}
1217 1217
 
1218
-    /**
1219
-     * Gets the query params from the request, plus adds a where condition for the registration status,
1220
-     * because on the checkin page we only ever want to see approved and pending-approval registrations
1221
-     *
1222
-     * @param array $request
1223
-     * @param int   $per_page
1224
-     * @param bool  $count
1225
-     * @return array
1226
-     * @throws EE_Error
1227
-     */
1228
-    protected function _get_checkin_query_params_from_request(
1229
-        $request,
1230
-        $per_page = 10,
1231
-        $count = false
1232
-    ) {
1233
-        $query_params = $this->_get_registration_query_parameters($request, $per_page, $count);
1234
-        // unlike the regular registrations list table,
1235
-        $status_ids_array = apply_filters(
1236
-            'FHEE__Extend_Registrations_Admin_Page__get_event_attendees__status_ids_array',
1237
-            array(EEM_Registration::status_id_pending_payment, EEM_Registration::status_id_approved)
1238
-        );
1239
-        $query_params[0]['STS_ID'] = array('IN', $status_ids_array);
1240
-        return $query_params;
1241
-    }
1218
+	/**
1219
+	 * Gets the query params from the request, plus adds a where condition for the registration status,
1220
+	 * because on the checkin page we only ever want to see approved and pending-approval registrations
1221
+	 *
1222
+	 * @param array $request
1223
+	 * @param int   $per_page
1224
+	 * @param bool  $count
1225
+	 * @return array
1226
+	 * @throws EE_Error
1227
+	 */
1228
+	protected function _get_checkin_query_params_from_request(
1229
+		$request,
1230
+		$per_page = 10,
1231
+		$count = false
1232
+	) {
1233
+		$query_params = $this->_get_registration_query_parameters($request, $per_page, $count);
1234
+		// unlike the regular registrations list table,
1235
+		$status_ids_array = apply_filters(
1236
+			'FHEE__Extend_Registrations_Admin_Page__get_event_attendees__status_ids_array',
1237
+			array(EEM_Registration::status_id_pending_payment, EEM_Registration::status_id_approved)
1238
+		);
1239
+		$query_params[0]['STS_ID'] = array('IN', $status_ids_array);
1240
+		return $query_params;
1241
+	}
1242 1242
 
1243 1243
 
1244
-    /**
1245
-     * Gets registrations for an event
1246
-     *
1247
-     * @param int    $per_page
1248
-     * @param bool   $count whether to return count or data.
1249
-     * @param bool   $trash
1250
-     * @param string $orderby
1251
-     * @return EE_Registration[]|int
1252
-     * @throws EE_Error
1253
-     * @throws InvalidArgumentException
1254
-     * @throws InvalidDataTypeException
1255
-     * @throws InvalidInterfaceException
1256
-     */
1257
-    public function get_event_attendees($per_page = 10, $count = false, $trash = false, $orderby = 'ATT_fname')
1258
-    {
1259
-        // normalize some request params that get setup by the parent `get_registrations` method.
1260
-        $request = $this->_req_data;
1261
-        $request['orderby'] = ! empty($this->_req_data['orderby']) ? $this->_req_data['orderby'] : $orderby;
1262
-        $request['order'] = ! empty($this->_req_data['order']) ? $this->_req_data['order'] : 'ASC';
1263
-        if ($trash) {
1264
-            $request['status'] = 'trash';
1265
-        }
1266
-        $query_params = $this->_get_checkin_query_params_from_request($request, $per_page, $count);
1267
-        /**
1268
-         * Override the default groupby added by EEM_Base so that sorts with multiple order bys work as expected
1269
-         *
1270
-         * @link https://events.codebasehq.com/projects/event-espresso/tickets/10093
1271
-         * @see https://github.com/eventespresso/event-espresso-core/tree/master/docs/G--Model-System/model-query-params.md
1272
-         *                             or if you have the development copy of EE you can view this at the path:
1273
-         *                             /docs/G--Model-System/model-query-params.md
1274
-         */
1275
-        $query_params['group_by'] = '';
1244
+	/**
1245
+	 * Gets registrations for an event
1246
+	 *
1247
+	 * @param int    $per_page
1248
+	 * @param bool   $count whether to return count or data.
1249
+	 * @param bool   $trash
1250
+	 * @param string $orderby
1251
+	 * @return EE_Registration[]|int
1252
+	 * @throws EE_Error
1253
+	 * @throws InvalidArgumentException
1254
+	 * @throws InvalidDataTypeException
1255
+	 * @throws InvalidInterfaceException
1256
+	 */
1257
+	public function get_event_attendees($per_page = 10, $count = false, $trash = false, $orderby = 'ATT_fname')
1258
+	{
1259
+		// normalize some request params that get setup by the parent `get_registrations` method.
1260
+		$request = $this->_req_data;
1261
+		$request['orderby'] = ! empty($this->_req_data['orderby']) ? $this->_req_data['orderby'] : $orderby;
1262
+		$request['order'] = ! empty($this->_req_data['order']) ? $this->_req_data['order'] : 'ASC';
1263
+		if ($trash) {
1264
+			$request['status'] = 'trash';
1265
+		}
1266
+		$query_params = $this->_get_checkin_query_params_from_request($request, $per_page, $count);
1267
+		/**
1268
+		 * Override the default groupby added by EEM_Base so that sorts with multiple order bys work as expected
1269
+		 *
1270
+		 * @link https://events.codebasehq.com/projects/event-espresso/tickets/10093
1271
+		 * @see https://github.com/eventespresso/event-espresso-core/tree/master/docs/G--Model-System/model-query-params.md
1272
+		 *                             or if you have the development copy of EE you can view this at the path:
1273
+		 *                             /docs/G--Model-System/model-query-params.md
1274
+		 */
1275
+		$query_params['group_by'] = '';
1276 1276
 
1277
-        return $count
1278
-            ? EEM_Registration::instance()->count($query_params)
1279
-            /** @type EE_Registration[] */
1280
-            : EEM_Registration::instance()->get_all($query_params);
1281
-    }
1277
+		return $count
1278
+			? EEM_Registration::instance()->count($query_params)
1279
+			/** @type EE_Registration[] */
1280
+			: EEM_Registration::instance()->get_all($query_params);
1281
+	}
1282 1282
 }
Please login to merge, or discard this patch.