Completed
Branch models-cleanup/more-ee-base-cl... (91a157)
by
unknown
53:04 queued 43:29
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   +766 added lines, -766 removed lines patch added patch discarded remove patch
@@ -24,771 +24,771 @@
 block discarded – undo
24 24
 class EE_Registration_Processor extends EE_Processor_Base
25 25
 {
26 26
 
27
-    /**
28
-     * @var EE_Registration_Processor $_instance
29
-     * @access    private
30
-     */
31
-    private static $_instance;
32
-
33
-    /**
34
-     * initial reg status at the beginning of this request.
35
-     * indexed by registration ID
36
-     *
37
-     * @var array
38
-     */
39
-    protected $_old_reg_status = array();
40
-
41
-    /**
42
-     * reg status at the end of the request after all processing.
43
-     * indexed by registration ID
44
-     *
45
-     * @var array
46
-     */
47
-    protected $_new_reg_status = array();
48
-
49
-    /**
50
-     * amounts paid at the end of the request after all processing.
51
-     * indexed by registration ID
52
-     *
53
-     * @var array
54
-     */
55
-    protected static $_amount_paid = array();
56
-
57
-    /**
58
-     * Cache of the reg final price for registrations corresponding to a ticket line item
59
-     *
60
-     * @deprecated
61
-     * @var array @see EEH_Line_Item::calculate_reg_final_prices_per_line_item()'s return value
62
-     */
63
-    protected $_reg_final_price_per_tkt_line_item;
64
-
65
-    /**
66
-     * @var EE_Request $request
67
-     */
68
-    protected $request;
69
-
70
-
71
-    /**
72
-     * @singleton method used to instantiate class object
73
-     * @param EE_Request|null $request
74
-     * @return EE_Registration_Processor instance
75
-     * @throws \InvalidArgumentException
76
-     * @throws \EventEspresso\core\exceptions\InvalidInterfaceException
77
-     * @throws \EventEspresso\core\exceptions\InvalidDataTypeException
78
-     */
79
-    public static function instance(EE_Request $request = null)
80
-    {
81
-        // check if class object is instantiated
82
-        if (! self::$_instance instanceof EE_Registration_Processor) {
83
-            if (! $request instanceof EE_Request) {
84
-                $request = LoaderFactory::getLoader()->getShared('EE_Request');
85
-            }
86
-            self::$_instance = new self($request);
87
-        }
88
-        return self::$_instance;
89
-    }
90
-
91
-
92
-    /**
93
-     * EE_Registration_Processor constructor.
94
-     *
95
-     * @param EE_Request $request
96
-     */
97
-    public function __construct(EE_Request $request)
98
-    {
99
-        $this->request = $request;
100
-    }
101
-
102
-
103
-    /**
104
-     * @param int $REG_ID
105
-     * @return string
106
-     */
107
-    public function old_reg_status($REG_ID)
108
-    {
109
-        return isset($this->_old_reg_status[ $REG_ID ]) ? $this->_old_reg_status[ $REG_ID ] : null;
110
-    }
111
-
112
-
113
-    /**
114
-     * @param int    $REG_ID
115
-     * @param string $old_reg_status
116
-     */
117
-    public function set_old_reg_status($REG_ID, $old_reg_status)
118
-    {
119
-        // only set the first time
120
-        if (! isset($this->_old_reg_status[ $REG_ID ])) {
121
-            $this->_old_reg_status[ $REG_ID ] = $old_reg_status;
122
-        }
123
-    }
124
-
125
-
126
-    /**
127
-     * @param int $REG_ID
128
-     * @return string
129
-     */
130
-    public function new_reg_status($REG_ID)
131
-    {
132
-        return isset($this->_new_reg_status[ $REG_ID ]) ? $this->_new_reg_status[ $REG_ID ] : null;
133
-    }
134
-
135
-
136
-    /**
137
-     * @param int    $REG_ID
138
-     * @param string $new_reg_status
139
-     */
140
-    public function set_new_reg_status($REG_ID, $new_reg_status)
141
-    {
142
-        $this->_new_reg_status[ $REG_ID ] = $new_reg_status;
143
-    }
144
-
145
-
146
-    /**
147
-     * reg_status_updated
148
-     *
149
-     * @param int $REG_ID
150
-     * @return bool
151
-     */
152
-    public function reg_status_updated($REG_ID)
153
-    {
154
-        return $this->new_reg_status($REG_ID) !== $this->old_reg_status($REG_ID);
155
-    }
156
-
157
-
158
-    /**
159
-     * @param EE_Registration $registration
160
-     * @throws EE_Error
161
-     * @throws EntityNotFoundException
162
-     * @throws InvalidArgumentException
163
-     * @throws InvalidDataTypeException
164
-     * @throws InvalidInterfaceException
165
-     * @throws ReflectionException
166
-     * @throws RuntimeException
167
-     */
168
-    public function update_registration_status_and_trigger_notifications(EE_Registration $registration)
169
-    {
170
-        $this->toggle_incomplete_registration_status_to_default($registration, false);
171
-        $this->toggle_registration_status_for_default_approved_events($registration, false);
172
-        $this->toggle_registration_status_if_no_monies_owing($registration, false);
173
-        $registration->save();
174
-        // trigger notifications
175
-        $this->trigger_registration_update_notifications($registration);
176
-    }
177
-
178
-
179
-    /**
180
-     *    manually_update_registration_status
181
-     *
182
-     * @access public
183
-     * @param EE_Registration $registration
184
-     * @param string          $new_reg_status
185
-     * @param bool            $save TRUE will save the registration if the status is updated, FALSE will leave that up
186
-     *                              to client code
187
-     * @return bool
188
-     * @throws EE_Error
189
-     * @throws EntityNotFoundException
190
-     * @throws InvalidArgumentException
191
-     * @throws InvalidDataTypeException
192
-     * @throws InvalidInterfaceException
193
-     * @throws ReflectionException
194
-     * @throws RuntimeException
195
-     */
196
-    public function manually_update_registration_status(
197
-        EE_Registration $registration,
198
-        $new_reg_status = '',
199
-        $save = true
200
-    ) {
201
-        // set initial REG_Status
202
-        $this->set_old_reg_status($registration->ID(), $registration->status_ID());
203
-        // set incoming REG_Status
204
-        $this->set_new_reg_status($registration->ID(), $new_reg_status);
205
-        // toggle reg status but only if it has changed and the user can do so
206
-        if (
207
-            $this->reg_status_updated($registration->ID())
208
-            && (
209
-                (! $this->request->isAdmin() || $this->request->isFrontAjax())
210
-                || EE_Registry::instance()->CAP->current_user_can(
211
-                    'ee_edit_registration',
212
-                    'toggle_registration_status',
213
-                    $registration->ID()
214
-                )
215
-            )
216
-        ) {
217
-            // change status to new value
218
-            $updated = $registration->set_status($this->new_reg_status($registration->ID()));
219
-            if ($updated && $save) {
220
-                $registration->save();
221
-            }
222
-            return true;
223
-        }
224
-        return false;
225
-    }
226
-
227
-
228
-    /**
229
-     *    toggle_incomplete_registration_status_to_default
230
-     *        changes any incomplete registrations to either the event or global default registration status
231
-     *
232
-     * @access public
233
-     * @param EE_Registration       $registration
234
-     * @param bool                  $save TRUE will save the registration if the status is updated, FALSE will leave
235
-     *                                    that up to client code
236
-     * @param ContextInterface|null $context
237
-     * @return void
238
-     * @throws EE_Error
239
-     * @throws InvalidArgumentException
240
-     * @throws ReflectionException
241
-     * @throws RuntimeException
242
-     * @throws EntityNotFoundException
243
-     * @throws InvalidDataTypeException
244
-     * @throws InvalidInterfaceException
245
-     */
246
-    public function toggle_incomplete_registration_status_to_default(
247
-        EE_Registration $registration,
248
-        $save = true,
249
-        ContextInterface $context = null
250
-    ) {
251
-        $existing_reg_status = $registration->status_ID();
252
-        // set initial REG_Status
253
-        $this->set_old_reg_status($registration->ID(), $existing_reg_status);
254
-        // is the registration currently incomplete ?
255
-        if ($registration->status_ID() === EEM_Registration::status_id_incomplete) {
256
-            // grab default reg status for the event, if set
257
-            $event_default_registration_status = $registration->event()->default_registration_status();
258
-            // if no default reg status is set for the event, then use the global value
259
-            $STS_ID = ! empty($event_default_registration_status)
260
-                ? $event_default_registration_status
261
-                : EE_Registry::instance()->CFG->registration->default_STS_ID;
262
-            // if the event default reg status is approved, then downgrade temporarily to payment pending to ensure that payments are triggered
263
-            $STS_ID = $STS_ID === EEM_Registration::status_id_approved ? EEM_Registration::status_id_pending_payment
264
-                : $STS_ID;
265
-            // set incoming REG_Status
266
-            $this->set_new_reg_status($registration->ID(), $STS_ID);
267
-            $registration->set_status($STS_ID, false, $context);
268
-            if ($save) {
269
-                $registration->save();
270
-            }
271
-            // don't trigger notifications during IPNs because they will get triggered by EE_Payment_Processor
272
-            if (! EE_Processor_Base::$IPN) {
273
-                // otherwise, send out notifications
274
-                add_filter('FHEE__EED_Messages___maybe_registration__deliver_notifications', '__return_true', 10);
275
-            }
276
-            // DEBUG LOG
277
-            // $this->log(
278
-            //     __CLASS__,
279
-            //     __FUNCTION__,
280
-            //     __LINE__,
281
-            //     $registration->transaction(),
282
-            //     array(
283
-            //         'IPN' => EE_Processor_Base::$IPN,
284
-            //         'deliver_notifications' => has_filter(
285
-            //             'FHEE__EED_Messages___maybe_registration__deliver_notifications'
286
-            //         ),
287
-            //     )
288
-            // );
289
-        }
290
-    }
291
-
292
-
293
-    /**
294
-     *    toggle_registration_status_for_default_approved_events
295
-     *
296
-     * @access public
297
-     * @param EE_Registration $registration
298
-     * @param bool            $save TRUE will save the registration if the status is updated, FALSE will leave that up
299
-     *                              to client code
300
-     * @return bool
301
-     * @throws EE_Error
302
-     * @throws EntityNotFoundException
303
-     * @throws InvalidArgumentException
304
-     * @throws InvalidDataTypeException
305
-     * @throws InvalidInterfaceException
306
-     * @throws ReflectionException
307
-     * @throws RuntimeException
308
-     */
309
-    public function toggle_registration_status_for_default_approved_events(EE_Registration $registration, $save = true)
310
-    {
311
-        $reg_status = $registration->status_ID();
312
-        // set initial REG_Status
313
-        $this->set_old_reg_status($registration->ID(), $reg_status);
314
-        // if not already, toggle reg status to approved IF the event default reg status is approved
315
-        // ( as long as the registration wasn't cancelled or declined at some point )
316
-        if (
317
-            $reg_status !== EEM_Registration::status_id_cancelled
318
-            && $reg_status
319
-               !== EEM_Registration::status_id_declined
320
-            && $reg_status !== EEM_Registration::status_id_approved
321
-            && $registration->event()->default_registration_status() === EEM_Registration::status_id_approved
322
-        ) {
323
-            // set incoming REG_Status
324
-            $this->set_new_reg_status($registration->ID(), EEM_Registration::status_id_approved);
325
-            // toggle status to approved
326
-            $registration->set_status(EEM_Registration::status_id_approved);
327
-            if ($save) {
328
-                $registration->save();
329
-            }
330
-            // don't trigger notifications during IPNs because they will get triggered by EE_Payment_Processor
331
-            if (! EE_Processor_Base::$IPN) {
332
-                // otherwise, send out notifications
333
-                add_filter('FHEE__EED_Messages___maybe_registration__deliver_notifications', '__return_true', 10);
334
-            }
335
-            // DEBUG LOG
336
-            // $this->log(
337
-            //     __CLASS__,
338
-            //     __FUNCTION__,
339
-            //     __LINE__,
340
-            //     $registration->transaction(),
341
-            //     array(
342
-            //         'IPN' => EE_Processor_Base::$IPN,
343
-            //         'deliver_notifications' => has_filter(
344
-            //             'FHEE__EED_Messages___maybe_registration__deliver_notifications'
345
-            //         ),
346
-            //     )
347
-            // );
348
-            return true;
349
-        }
350
-        return false;
351
-    }
352
-
353
-
354
-    /**
355
-     *    toggle_registration_statuses_if_no_monies_owing
356
-     *
357
-     * @access public
358
-     * @param EE_Registration $registration
359
-     * @param bool            $save TRUE will save the registration if the status is updated, FALSE will leave that up
360
-     *                              to client code
361
-     * @param array           $additional_details
362
-     * @return bool
363
-     * @throws EE_Error
364
-     * @throws EntityNotFoundException
365
-     * @throws InvalidArgumentException
366
-     * @throws InvalidDataTypeException
367
-     * @throws InvalidInterfaceException
368
-     * @throws ReflectionException
369
-     * @throws RuntimeException
370
-     */
371
-    public function toggle_registration_status_if_no_monies_owing(
372
-        EE_Registration $registration,
373
-        $save = true,
374
-        array $additional_details = array()
375
-    ) {
376
-        // set initial REG_Status
377
-        $this->set_old_reg_status($registration->ID(), $registration->status_ID());
378
-        // was a payment just made ?
379
-        $payment = isset($additional_details['payment_updates'], $additional_details['last_payment'])
380
-                   && $additional_details['payment_updates']
381
-                   && $additional_details['last_payment'] instanceof EE_Payment
382
-            ? $additional_details['last_payment']
383
-            : null;
384
-        $total_paid = array_sum(self::$_amount_paid);
385
-        // toggle reg status to approved IF
386
-        if (
27
+	/**
28
+	 * @var EE_Registration_Processor $_instance
29
+	 * @access    private
30
+	 */
31
+	private static $_instance;
32
+
33
+	/**
34
+	 * initial reg status at the beginning of this request.
35
+	 * indexed by registration ID
36
+	 *
37
+	 * @var array
38
+	 */
39
+	protected $_old_reg_status = array();
40
+
41
+	/**
42
+	 * reg status at the end of the request after all processing.
43
+	 * indexed by registration ID
44
+	 *
45
+	 * @var array
46
+	 */
47
+	protected $_new_reg_status = array();
48
+
49
+	/**
50
+	 * amounts paid at the end of the request after all processing.
51
+	 * indexed by registration ID
52
+	 *
53
+	 * @var array
54
+	 */
55
+	protected static $_amount_paid = array();
56
+
57
+	/**
58
+	 * Cache of the reg final price for registrations corresponding to a ticket line item
59
+	 *
60
+	 * @deprecated
61
+	 * @var array @see EEH_Line_Item::calculate_reg_final_prices_per_line_item()'s return value
62
+	 */
63
+	protected $_reg_final_price_per_tkt_line_item;
64
+
65
+	/**
66
+	 * @var EE_Request $request
67
+	 */
68
+	protected $request;
69
+
70
+
71
+	/**
72
+	 * @singleton method used to instantiate class object
73
+	 * @param EE_Request|null $request
74
+	 * @return EE_Registration_Processor instance
75
+	 * @throws \InvalidArgumentException
76
+	 * @throws \EventEspresso\core\exceptions\InvalidInterfaceException
77
+	 * @throws \EventEspresso\core\exceptions\InvalidDataTypeException
78
+	 */
79
+	public static function instance(EE_Request $request = null)
80
+	{
81
+		// check if class object is instantiated
82
+		if (! self::$_instance instanceof EE_Registration_Processor) {
83
+			if (! $request instanceof EE_Request) {
84
+				$request = LoaderFactory::getLoader()->getShared('EE_Request');
85
+			}
86
+			self::$_instance = new self($request);
87
+		}
88
+		return self::$_instance;
89
+	}
90
+
91
+
92
+	/**
93
+	 * EE_Registration_Processor constructor.
94
+	 *
95
+	 * @param EE_Request $request
96
+	 */
97
+	public function __construct(EE_Request $request)
98
+	{
99
+		$this->request = $request;
100
+	}
101
+
102
+
103
+	/**
104
+	 * @param int $REG_ID
105
+	 * @return string
106
+	 */
107
+	public function old_reg_status($REG_ID)
108
+	{
109
+		return isset($this->_old_reg_status[ $REG_ID ]) ? $this->_old_reg_status[ $REG_ID ] : null;
110
+	}
111
+
112
+
113
+	/**
114
+	 * @param int    $REG_ID
115
+	 * @param string $old_reg_status
116
+	 */
117
+	public function set_old_reg_status($REG_ID, $old_reg_status)
118
+	{
119
+		// only set the first time
120
+		if (! isset($this->_old_reg_status[ $REG_ID ])) {
121
+			$this->_old_reg_status[ $REG_ID ] = $old_reg_status;
122
+		}
123
+	}
124
+
125
+
126
+	/**
127
+	 * @param int $REG_ID
128
+	 * @return string
129
+	 */
130
+	public function new_reg_status($REG_ID)
131
+	{
132
+		return isset($this->_new_reg_status[ $REG_ID ]) ? $this->_new_reg_status[ $REG_ID ] : null;
133
+	}
134
+
135
+
136
+	/**
137
+	 * @param int    $REG_ID
138
+	 * @param string $new_reg_status
139
+	 */
140
+	public function set_new_reg_status($REG_ID, $new_reg_status)
141
+	{
142
+		$this->_new_reg_status[ $REG_ID ] = $new_reg_status;
143
+	}
144
+
145
+
146
+	/**
147
+	 * reg_status_updated
148
+	 *
149
+	 * @param int $REG_ID
150
+	 * @return bool
151
+	 */
152
+	public function reg_status_updated($REG_ID)
153
+	{
154
+		return $this->new_reg_status($REG_ID) !== $this->old_reg_status($REG_ID);
155
+	}
156
+
157
+
158
+	/**
159
+	 * @param EE_Registration $registration
160
+	 * @throws EE_Error
161
+	 * @throws EntityNotFoundException
162
+	 * @throws InvalidArgumentException
163
+	 * @throws InvalidDataTypeException
164
+	 * @throws InvalidInterfaceException
165
+	 * @throws ReflectionException
166
+	 * @throws RuntimeException
167
+	 */
168
+	public function update_registration_status_and_trigger_notifications(EE_Registration $registration)
169
+	{
170
+		$this->toggle_incomplete_registration_status_to_default($registration, false);
171
+		$this->toggle_registration_status_for_default_approved_events($registration, false);
172
+		$this->toggle_registration_status_if_no_monies_owing($registration, false);
173
+		$registration->save();
174
+		// trigger notifications
175
+		$this->trigger_registration_update_notifications($registration);
176
+	}
177
+
178
+
179
+	/**
180
+	 *    manually_update_registration_status
181
+	 *
182
+	 * @access public
183
+	 * @param EE_Registration $registration
184
+	 * @param string          $new_reg_status
185
+	 * @param bool            $save TRUE will save the registration if the status is updated, FALSE will leave that up
186
+	 *                              to client code
187
+	 * @return bool
188
+	 * @throws EE_Error
189
+	 * @throws EntityNotFoundException
190
+	 * @throws InvalidArgumentException
191
+	 * @throws InvalidDataTypeException
192
+	 * @throws InvalidInterfaceException
193
+	 * @throws ReflectionException
194
+	 * @throws RuntimeException
195
+	 */
196
+	public function manually_update_registration_status(
197
+		EE_Registration $registration,
198
+		$new_reg_status = '',
199
+		$save = true
200
+	) {
201
+		// set initial REG_Status
202
+		$this->set_old_reg_status($registration->ID(), $registration->status_ID());
203
+		// set incoming REG_Status
204
+		$this->set_new_reg_status($registration->ID(), $new_reg_status);
205
+		// toggle reg status but only if it has changed and the user can do so
206
+		if (
207
+			$this->reg_status_updated($registration->ID())
208
+			&& (
209
+				(! $this->request->isAdmin() || $this->request->isFrontAjax())
210
+				|| EE_Registry::instance()->CAP->current_user_can(
211
+					'ee_edit_registration',
212
+					'toggle_registration_status',
213
+					$registration->ID()
214
+				)
215
+			)
216
+		) {
217
+			// change status to new value
218
+			$updated = $registration->set_status($this->new_reg_status($registration->ID()));
219
+			if ($updated && $save) {
220
+				$registration->save();
221
+			}
222
+			return true;
223
+		}
224
+		return false;
225
+	}
226
+
227
+
228
+	/**
229
+	 *    toggle_incomplete_registration_status_to_default
230
+	 *        changes any incomplete registrations to either the event or global default registration status
231
+	 *
232
+	 * @access public
233
+	 * @param EE_Registration       $registration
234
+	 * @param bool                  $save TRUE will save the registration if the status is updated, FALSE will leave
235
+	 *                                    that up to client code
236
+	 * @param ContextInterface|null $context
237
+	 * @return void
238
+	 * @throws EE_Error
239
+	 * @throws InvalidArgumentException
240
+	 * @throws ReflectionException
241
+	 * @throws RuntimeException
242
+	 * @throws EntityNotFoundException
243
+	 * @throws InvalidDataTypeException
244
+	 * @throws InvalidInterfaceException
245
+	 */
246
+	public function toggle_incomplete_registration_status_to_default(
247
+		EE_Registration $registration,
248
+		$save = true,
249
+		ContextInterface $context = null
250
+	) {
251
+		$existing_reg_status = $registration->status_ID();
252
+		// set initial REG_Status
253
+		$this->set_old_reg_status($registration->ID(), $existing_reg_status);
254
+		// is the registration currently incomplete ?
255
+		if ($registration->status_ID() === EEM_Registration::status_id_incomplete) {
256
+			// grab default reg status for the event, if set
257
+			$event_default_registration_status = $registration->event()->default_registration_status();
258
+			// if no default reg status is set for the event, then use the global value
259
+			$STS_ID = ! empty($event_default_registration_status)
260
+				? $event_default_registration_status
261
+				: EE_Registry::instance()->CFG->registration->default_STS_ID;
262
+			// if the event default reg status is approved, then downgrade temporarily to payment pending to ensure that payments are triggered
263
+			$STS_ID = $STS_ID === EEM_Registration::status_id_approved ? EEM_Registration::status_id_pending_payment
264
+				: $STS_ID;
265
+			// set incoming REG_Status
266
+			$this->set_new_reg_status($registration->ID(), $STS_ID);
267
+			$registration->set_status($STS_ID, false, $context);
268
+			if ($save) {
269
+				$registration->save();
270
+			}
271
+			// don't trigger notifications during IPNs because they will get triggered by EE_Payment_Processor
272
+			if (! EE_Processor_Base::$IPN) {
273
+				// otherwise, send out notifications
274
+				add_filter('FHEE__EED_Messages___maybe_registration__deliver_notifications', '__return_true', 10);
275
+			}
276
+			// DEBUG LOG
277
+			// $this->log(
278
+			//     __CLASS__,
279
+			//     __FUNCTION__,
280
+			//     __LINE__,
281
+			//     $registration->transaction(),
282
+			//     array(
283
+			//         'IPN' => EE_Processor_Base::$IPN,
284
+			//         'deliver_notifications' => has_filter(
285
+			//             'FHEE__EED_Messages___maybe_registration__deliver_notifications'
286
+			//         ),
287
+			//     )
288
+			// );
289
+		}
290
+	}
291
+
292
+
293
+	/**
294
+	 *    toggle_registration_status_for_default_approved_events
295
+	 *
296
+	 * @access public
297
+	 * @param EE_Registration $registration
298
+	 * @param bool            $save TRUE will save the registration if the status is updated, FALSE will leave that up
299
+	 *                              to client code
300
+	 * @return bool
301
+	 * @throws EE_Error
302
+	 * @throws EntityNotFoundException
303
+	 * @throws InvalidArgumentException
304
+	 * @throws InvalidDataTypeException
305
+	 * @throws InvalidInterfaceException
306
+	 * @throws ReflectionException
307
+	 * @throws RuntimeException
308
+	 */
309
+	public function toggle_registration_status_for_default_approved_events(EE_Registration $registration, $save = true)
310
+	{
311
+		$reg_status = $registration->status_ID();
312
+		// set initial REG_Status
313
+		$this->set_old_reg_status($registration->ID(), $reg_status);
314
+		// if not already, toggle reg status to approved IF the event default reg status is approved
315
+		// ( as long as the registration wasn't cancelled or declined at some point )
316
+		if (
317
+			$reg_status !== EEM_Registration::status_id_cancelled
318
+			&& $reg_status
319
+			   !== EEM_Registration::status_id_declined
320
+			&& $reg_status !== EEM_Registration::status_id_approved
321
+			&& $registration->event()->default_registration_status() === EEM_Registration::status_id_approved
322
+		) {
323
+			// set incoming REG_Status
324
+			$this->set_new_reg_status($registration->ID(), EEM_Registration::status_id_approved);
325
+			// toggle status to approved
326
+			$registration->set_status(EEM_Registration::status_id_approved);
327
+			if ($save) {
328
+				$registration->save();
329
+			}
330
+			// don't trigger notifications during IPNs because they will get triggered by EE_Payment_Processor
331
+			if (! EE_Processor_Base::$IPN) {
332
+				// otherwise, send out notifications
333
+				add_filter('FHEE__EED_Messages___maybe_registration__deliver_notifications', '__return_true', 10);
334
+			}
335
+			// DEBUG LOG
336
+			// $this->log(
337
+			//     __CLASS__,
338
+			//     __FUNCTION__,
339
+			//     __LINE__,
340
+			//     $registration->transaction(),
341
+			//     array(
342
+			//         'IPN' => EE_Processor_Base::$IPN,
343
+			//         'deliver_notifications' => has_filter(
344
+			//             'FHEE__EED_Messages___maybe_registration__deliver_notifications'
345
+			//         ),
346
+			//     )
347
+			// );
348
+			return true;
349
+		}
350
+		return false;
351
+	}
352
+
353
+
354
+	/**
355
+	 *    toggle_registration_statuses_if_no_monies_owing
356
+	 *
357
+	 * @access public
358
+	 * @param EE_Registration $registration
359
+	 * @param bool            $save TRUE will save the registration if the status is updated, FALSE will leave that up
360
+	 *                              to client code
361
+	 * @param array           $additional_details
362
+	 * @return bool
363
+	 * @throws EE_Error
364
+	 * @throws EntityNotFoundException
365
+	 * @throws InvalidArgumentException
366
+	 * @throws InvalidDataTypeException
367
+	 * @throws InvalidInterfaceException
368
+	 * @throws ReflectionException
369
+	 * @throws RuntimeException
370
+	 */
371
+	public function toggle_registration_status_if_no_monies_owing(
372
+		EE_Registration $registration,
373
+		$save = true,
374
+		array $additional_details = array()
375
+	) {
376
+		// set initial REG_Status
377
+		$this->set_old_reg_status($registration->ID(), $registration->status_ID());
378
+		// was a payment just made ?
379
+		$payment = isset($additional_details['payment_updates'], $additional_details['last_payment'])
380
+				   && $additional_details['payment_updates']
381
+				   && $additional_details['last_payment'] instanceof EE_Payment
382
+			? $additional_details['last_payment']
383
+			: null;
384
+		$total_paid = array_sum(self::$_amount_paid);
385
+		// toggle reg status to approved IF
386
+		if (
387 387
 // REG status is pending payment
388
-            $registration->status_ID() === EEM_Registration::status_id_pending_payment
389
-            // AND no monies are owing
390
-            && (
391
-                (
392
-                    $registration->transaction()->is_completed()
393
-                    || $registration->transaction()->is_overpaid()
394
-                    || $registration->transaction()->is_free()
395
-                    || apply_filters(
396
-                        'FHEE__EE_Registration_Processor__toggle_registration_status_if_no_monies_owing',
397
-                        false,
398
-                        $registration
399
-                    )
400
-                )
401
-                || (
402
-                    $payment instanceof EE_Payment && $payment->is_approved()
403
-                    && // this specific registration has not yet been paid for
404
-                    ! isset(self::$_amount_paid[ $registration->ID() ])
405
-                    && // payment amount, less what we have already attributed to other registrations, is greater than this reg's final price
406
-                    $payment->amount() - $total_paid >= $registration->final_price()
407
-                )
408
-            )
409
-        ) {
410
-            // mark as paid
411
-            self::$_amount_paid[ $registration->ID() ] = $registration->final_price();
412
-            // track new REG_Status
413
-            $this->set_new_reg_status($registration->ID(), EEM_Registration::status_id_approved);
414
-            // toggle status to approved
415
-            $registration->set_status(EEM_Registration::status_id_approved);
416
-            if ($save) {
417
-                $registration->save();
418
-            }
419
-            // don't trigger notifications during IPNs because they will get triggered by EE_Payment_Processor
420
-            if (! EE_Processor_Base::$IPN) {
421
-                // otherwise, send out notifications
422
-                add_filter('FHEE__EED_Messages___maybe_registration__deliver_notifications', '__return_true', 10);
423
-            }
424
-            // DEBUG LOG
425
-            // $this->log(
426
-            //     __CLASS__,
427
-            //     __FUNCTION__,
428
-            //     __LINE__,
429
-            //     $registration->transaction(),
430
-            //     array(
431
-            //         'IPN' => EE_Processor_Base::$IPN,
432
-            //         'deliver_notifications' => has_filter(
433
-            //             'FHEE__EED_Messages___maybe_registration__deliver_notifications'
434
-            //         ),
435
-            //     )
436
-            // );
437
-            return true;
438
-        }
439
-        return false;
440
-    }
441
-
442
-
443
-    /**
444
-     *    registration_status_changed
445
-     *
446
-     * @access public
447
-     * @param EE_Registration $registration
448
-     * @param array           $additional_details
449
-     * @return void
450
-     */
451
-    public function trigger_registration_update_notifications($registration, array $additional_details = array())
452
-    {
453
-        try {
454
-            if (! $registration instanceof EE_Registration) {
455
-                throw new EE_Error(
456
-                    esc_html__('An invalid registration was received.', 'event_espresso')
457
-                );
458
-            }
459
-            // EE_Registry::instance()->load_helper('Debug_Tools');
460
-            // EEH_Debug_Tools::log(
461
-            //     __CLASS__,
462
-            //     __FUNCTION__,
463
-            //     __LINE__,
464
-            //     array($registration->transaction(), $additional_details),
465
-            //     false,
466
-            //     'EE_Transaction: ' . $registration->transaction()->ID()
467
-            // );
468
-            if (! $registration->is_primary_registrant()) {
469
-                return;
470
-            }
471
-            do_action(
472
-                'AHEE__EE_Registration_Processor__trigger_registration_update_notifications',
473
-                $registration,
474
-                $additional_details
475
-            );
476
-        } catch (Exception $e) {
477
-            EE_Error::add_error($e->getMessage(), $e->getFile(), 'unknown_function_from_exception', $e->getLine());
478
-        }
479
-    }
480
-
481
-
482
-    /**
483
-     * sets reg status based either on passed param or on transaction status and event pre-approval setting
484
-     *
485
-     * @param EE_Registration $registration
486
-     * @param array           $additional_details
487
-     * @return bool
488
-     * @throws EE_Error
489
-     * @throws EntityNotFoundException
490
-     * @throws InvalidArgumentException
491
-     * @throws InvalidDataTypeException
492
-     * @throws InvalidInterfaceException
493
-     * @throws ReflectionException
494
-     * @throws RuntimeException
495
-     */
496
-    public function update_registration_after_checkout_or_payment(
497
-        EE_Registration $registration,
498
-        array $additional_details = array()
499
-    ) {
500
-        // set initial REG_Status
501
-        $this->set_old_reg_status($registration->ID(), $registration->status_ID());
502
-        // if the registration status gets updated, then save the registration
503
-        if (
504
-            $this->toggle_registration_status_for_default_approved_events($registration, false)
505
-            || $this->toggle_registration_status_if_no_monies_owing(
506
-                $registration,
507
-                false,
508
-                $additional_details
509
-            )
510
-        ) {
511
-            $registration->save();
512
-        }
513
-        // set new  REG_Status
514
-        $this->set_new_reg_status($registration->ID(), $registration->status_ID());
515
-        return $this->reg_status_updated($registration->ID())
516
-               && $this->new_reg_status($registration->ID()) === EEM_Registration::status_id_approved;
517
-    }
518
-
519
-
520
-    /**
521
-     * Updates the registration' final prices based on the current line item tree (taking into account
522
-     * discounts, taxes, and other line items unrelated to tickets.)
523
-     *
524
-     * @param EE_Transaction $transaction
525
-     * @param boolean        $save_regs whether to immediately save registrations in this function or not
526
-     * @return void
527
-     * @throws EE_Error
528
-     * @throws InvalidArgumentException
529
-     * @throws InvalidDataTypeException
530
-     * @throws InvalidInterfaceException
531
-     * @throws RuntimeException
532
-     */
533
-    public function update_registration_final_prices($transaction, $save_regs = true)
534
-    {
535
-        $reg_final_price_per_ticket_line_item = EEH_Line_Item::calculate_reg_final_prices_per_line_item(
536
-            $transaction->total_line_item()
537
-        );
538
-        foreach ($transaction->registrations() as $registration) {
539
-            /** @var EE_Line_Item $line_item */
540
-            $line_item = EEM_Line_Item::instance()->get_line_item_for_registration($registration);
541
-            if (isset($reg_final_price_per_ticket_line_item[ $line_item->ID() ])) {
542
-                $registration->set_final_price($reg_final_price_per_ticket_line_item[ $line_item->ID() ]);
543
-                if ($save_regs) {
544
-                    $registration->save();
545
-                }
546
-            }
547
-        }
548
-        // and make sure there's no rounding problem
549
-        $this->fix_reg_final_price_rounding_issue($transaction);
550
-    }
551
-
552
-
553
-    /**
554
-     * Makes sure there is no rounding errors for the REG_final_prices.
555
-     * Eg, if we have 3 registrations for $1, and there is a $0.01 discount between the three of them,
556
-     * they will each be for $0.99333333, which gets rounded to $1 again.
557
-     * So the transaction total will be $2.99, but each registration will be for $1,
558
-     * so if each registrant paid individually they will have overpaid by $0.01.
559
-     * So in order to overcome this, we check for any difference, and if there is a difference
560
-     * we just grab one registrant at random and make them responsible for it.
561
-     * This should be used after setting REG_final_prices (it's done automatically as part of
562
-     * EE_Registration_Processor::update_registration_final_prices())
563
-     *
564
-     * @param EE_Transaction $transaction
565
-     * @return bool success verifying that there is NO difference after this method is done
566
-     * @throws EE_Error
567
-     * @throws InvalidArgumentException
568
-     * @throws InvalidDataTypeException
569
-     * @throws InvalidInterfaceException
570
-     */
571
-    public function fix_reg_final_price_rounding_issue($transaction)
572
-    {
573
-        $reg_final_price_sum = EEM_Registration::instance()->sum(
574
-            array(
575
-                array(
576
-                    'TXN_ID' => $transaction->ID(),
577
-                ),
578
-            ),
579
-            'REG_final_price'
580
-        );
581
-        $diff = $transaction->total() - $reg_final_price_sum;
582
-        // ok then, just grab one of the registrations
583
-        if ($diff !== 0) {
584
-            $a_reg = EEM_Registration::instance()->get_one(
585
-                array(
586
-                    array(
587
-                        'TXN_ID' => $transaction->ID(),
588
-                    ),
589
-                )
590
-            );
591
-            return $a_reg instanceof EE_Registration
592
-                ? (bool) $a_reg->save(array('REG_final_price' => $a_reg->final_price() + $diff))
593
-                : false;
594
-        }
595
-        return true;
596
-    }
597
-
598
-
599
-    /**
600
-     * update_registration_after_being_canceled_or_declined
601
-     *
602
-     * @param EE_Registration $registration
603
-     * @param array           $closed_reg_statuses
604
-     * @param bool            $update_reg
605
-     * @return bool
606
-     * @throws EE_Error
607
-     * @throws RuntimeException
608
-     */
609
-    public function update_registration_after_being_canceled_or_declined(
610
-        EE_Registration $registration,
611
-        array $closed_reg_statuses = array(),
612
-        $update_reg = true
613
-    ) {
614
-        // these reg statuses should not be considered in any calculations involving monies owing
615
-        $closed_reg_statuses = ! empty($closed_reg_statuses)
616
-            ? $closed_reg_statuses
617
-            : EEM_Registration::closed_reg_statuses();
618
-        if (! in_array($registration->status_ID(), $closed_reg_statuses, true)) {
619
-            return false;
620
-        }
621
-        // release a reserved ticket by decrementing ticket and datetime reserved values
622
-        $registration->release_reserved_ticket(true, 'RegProcessor:' . __LINE__);
623
-        $registration->set_final_price(0);
624
-        if ($update_reg) {
625
-            $registration->save();
626
-        }
627
-        return true;
628
-    }
629
-
630
-
631
-    /**
632
-     * update_canceled_or_declined_registration_after_being_reinstated
633
-     *
634
-     * @param EE_Registration $registration
635
-     * @param array           $closed_reg_statuses
636
-     * @param bool            $update_reg
637
-     * @return bool
638
-     * @throws EE_Error
639
-     * @throws RuntimeException
640
-     */
641
-    public function update_canceled_or_declined_registration_after_being_reinstated(
642
-        EE_Registration $registration,
643
-        array $closed_reg_statuses = array(),
644
-        $update_reg = true
645
-    ) {
646
-        // these reg statuses should not be considered in any calculations involving monies owing
647
-        $closed_reg_statuses = ! empty($closed_reg_statuses) ? $closed_reg_statuses
648
-            : EEM_Registration::closed_reg_statuses();
649
-        if (in_array($registration->status_ID(), $closed_reg_statuses, true)) {
650
-            return false;
651
-        }
652
-        $ticket = $registration->ticket();
653
-        if (! $ticket instanceof EE_Ticket) {
654
-            throw new EE_Error(
655
-                sprintf(
656
-                    esc_html__(
657
-                        'The Ticket for Registration %1$d was not found or is invalid.',
658
-                        'event_espresso'
659
-                    ),
660
-                    $registration->ticket_ID()
661
-                )
662
-            );
663
-        }
664
-        $registration->set_final_price($ticket->price());
665
-        if ($update_reg) {
666
-            $registration->save();
667
-        }
668
-        return true;
669
-    }
670
-
671
-
672
-    /**
673
-     * generate_ONE_registration_from_line_item
674
-     * Although a ticket line item may have a quantity greater than 1,
675
-     * this method will ONLY CREATE ONE REGISTRATION !!!
676
-     * Regardless of the ticket line item quantity.
677
-     * This means that any code calling this method is responsible for ensuring
678
-     * that the final registration count matches the ticket line item quantity.
679
-     * This was done to make it easier to match the number of registrations
680
-     * to the number of tickets in the cart, when the cart has been edited
681
-     * after SPCO has already been initialized. So if an additional ticket was added to the cart, you can simply pass
682
-     * the line item to this method to add a second ticket, and in this case, you would not want to add 2 tickets.
683
-     *
684
-     * @deprecated
685
-     * @since 4.9.1
686
-     * @param EE_Line_Item    $line_item
687
-     * @param \EE_Transaction $transaction
688
-     * @param int             $att_nmbr
689
-     * @param int             $total_ticket_count
690
-     * @return EE_Registration | null
691
-     * @throws \OutOfRangeException
692
-     * @throws \EventEspresso\core\exceptions\UnexpectedEntityException
693
-     * @throws \EE_Error
694
-     */
695
-    public function generate_ONE_registration_from_line_item(
696
-        EE_Line_Item $line_item,
697
-        EE_Transaction $transaction,
698
-        $att_nmbr = 1,
699
-        $total_ticket_count = 1
700
-    ) {
701
-        EE_Error::doing_it_wrong(
702
-            __CLASS__ . '::' . __FUNCTION__,
703
-            sprintf(
704
-                esc_html__('This method is deprecated. Please use "%s" instead', 'event_espresso'),
705
-                '\EventEspresso\core\domain\services\registration\CreateRegistrationService::create()'
706
-            ),
707
-            '4.9.1',
708
-            '5.0.0'
709
-        );
710
-        // grab the related ticket object for this line_item
711
-        $ticket = $line_item->ticket();
712
-        if (! $ticket instanceof EE_Ticket) {
713
-            EE_Error::add_error(
714
-                sprintf(
715
-                    esc_html__('Line item %s did not contain a valid ticket', 'event_espresso'),
716
-                    $line_item->ID()
717
-                ),
718
-                __FILE__,
719
-                __FUNCTION__,
720
-                __LINE__
721
-            );
722
-            return null;
723
-        }
724
-        $registration_service = new CreateRegistrationService();
725
-        // then generate a new registration from that
726
-        return $registration_service->create(
727
-            $ticket->get_related_event(),
728
-            $transaction,
729
-            $ticket,
730
-            $line_item,
731
-            $att_nmbr,
732
-            $total_ticket_count
733
-        );
734
-    }
735
-
736
-
737
-    /**
738
-     * generates reg_url_link
739
-     *
740
-     * @deprecated
741
-     * @since 4.9.1
742
-     * @param int                   $att_nmbr
743
-     * @param EE_Line_Item | string $item
744
-     * @return string
745
-     * @throws InvalidArgumentException
746
-     */
747
-    public function generate_reg_url_link($att_nmbr, $item)
748
-    {
749
-        EE_Error::doing_it_wrong(
750
-            __CLASS__ . '::' . __FUNCTION__,
751
-            sprintf(
752
-                esc_html__('This method is deprecated. Please use "%s" instead', 'event_espresso'),
753
-                'EventEspresso\core\domain\entities\RegUrlLink'
754
-            ),
755
-            '4.9.1',
756
-            '5.0.0'
757
-        );
758
-        return new RegUrlLink($att_nmbr, $item);
759
-    }
760
-
761
-
762
-    /**
763
-     * generates reg code
764
-     *
765
-     * @deprecated
766
-     * @since 4.9.1
767
-     * @param EE_Registration $registration
768
-     * @return string
769
-     * @throws EE_Error
770
-     * @throws EntityNotFoundException
771
-     * @throws InvalidArgumentException
772
-     */
773
-    public function generate_reg_code(EE_Registration $registration)
774
-    {
775
-        EE_Error::doing_it_wrong(
776
-            __CLASS__ . '::' . __FUNCTION__,
777
-            sprintf(
778
-                esc_html__('This method is deprecated. Please use "%s" instead', 'event_espresso'),
779
-                'EventEspresso\core\domain\entities\RegCode'
780
-            ),
781
-            '4.9.1',
782
-            '5.0.0'
783
-        );
784
-        return apply_filters(
785
-            'FHEE__EE_Registration_Processor___generate_reg_code__new_reg_code',
786
-            new RegCode(
787
-                RegUrlLink::fromRegistration($registration),
788
-                $registration->transaction(),
789
-                $registration->ticket()
790
-            ),
791
-            $registration
792
-        );
793
-    }
388
+			$registration->status_ID() === EEM_Registration::status_id_pending_payment
389
+			// AND no monies are owing
390
+			&& (
391
+				(
392
+					$registration->transaction()->is_completed()
393
+					|| $registration->transaction()->is_overpaid()
394
+					|| $registration->transaction()->is_free()
395
+					|| apply_filters(
396
+						'FHEE__EE_Registration_Processor__toggle_registration_status_if_no_monies_owing',
397
+						false,
398
+						$registration
399
+					)
400
+				)
401
+				|| (
402
+					$payment instanceof EE_Payment && $payment->is_approved()
403
+					&& // this specific registration has not yet been paid for
404
+					! isset(self::$_amount_paid[ $registration->ID() ])
405
+					&& // payment amount, less what we have already attributed to other registrations, is greater than this reg's final price
406
+					$payment->amount() - $total_paid >= $registration->final_price()
407
+				)
408
+			)
409
+		) {
410
+			// mark as paid
411
+			self::$_amount_paid[ $registration->ID() ] = $registration->final_price();
412
+			// track new REG_Status
413
+			$this->set_new_reg_status($registration->ID(), EEM_Registration::status_id_approved);
414
+			// toggle status to approved
415
+			$registration->set_status(EEM_Registration::status_id_approved);
416
+			if ($save) {
417
+				$registration->save();
418
+			}
419
+			// don't trigger notifications during IPNs because they will get triggered by EE_Payment_Processor
420
+			if (! EE_Processor_Base::$IPN) {
421
+				// otherwise, send out notifications
422
+				add_filter('FHEE__EED_Messages___maybe_registration__deliver_notifications', '__return_true', 10);
423
+			}
424
+			// DEBUG LOG
425
+			// $this->log(
426
+			//     __CLASS__,
427
+			//     __FUNCTION__,
428
+			//     __LINE__,
429
+			//     $registration->transaction(),
430
+			//     array(
431
+			//         'IPN' => EE_Processor_Base::$IPN,
432
+			//         'deliver_notifications' => has_filter(
433
+			//             'FHEE__EED_Messages___maybe_registration__deliver_notifications'
434
+			//         ),
435
+			//     )
436
+			// );
437
+			return true;
438
+		}
439
+		return false;
440
+	}
441
+
442
+
443
+	/**
444
+	 *    registration_status_changed
445
+	 *
446
+	 * @access public
447
+	 * @param EE_Registration $registration
448
+	 * @param array           $additional_details
449
+	 * @return void
450
+	 */
451
+	public function trigger_registration_update_notifications($registration, array $additional_details = array())
452
+	{
453
+		try {
454
+			if (! $registration instanceof EE_Registration) {
455
+				throw new EE_Error(
456
+					esc_html__('An invalid registration was received.', 'event_espresso')
457
+				);
458
+			}
459
+			// EE_Registry::instance()->load_helper('Debug_Tools');
460
+			// EEH_Debug_Tools::log(
461
+			//     __CLASS__,
462
+			//     __FUNCTION__,
463
+			//     __LINE__,
464
+			//     array($registration->transaction(), $additional_details),
465
+			//     false,
466
+			//     'EE_Transaction: ' . $registration->transaction()->ID()
467
+			// );
468
+			if (! $registration->is_primary_registrant()) {
469
+				return;
470
+			}
471
+			do_action(
472
+				'AHEE__EE_Registration_Processor__trigger_registration_update_notifications',
473
+				$registration,
474
+				$additional_details
475
+			);
476
+		} catch (Exception $e) {
477
+			EE_Error::add_error($e->getMessage(), $e->getFile(), 'unknown_function_from_exception', $e->getLine());
478
+		}
479
+	}
480
+
481
+
482
+	/**
483
+	 * sets reg status based either on passed param or on transaction status and event pre-approval setting
484
+	 *
485
+	 * @param EE_Registration $registration
486
+	 * @param array           $additional_details
487
+	 * @return bool
488
+	 * @throws EE_Error
489
+	 * @throws EntityNotFoundException
490
+	 * @throws InvalidArgumentException
491
+	 * @throws InvalidDataTypeException
492
+	 * @throws InvalidInterfaceException
493
+	 * @throws ReflectionException
494
+	 * @throws RuntimeException
495
+	 */
496
+	public function update_registration_after_checkout_or_payment(
497
+		EE_Registration $registration,
498
+		array $additional_details = array()
499
+	) {
500
+		// set initial REG_Status
501
+		$this->set_old_reg_status($registration->ID(), $registration->status_ID());
502
+		// if the registration status gets updated, then save the registration
503
+		if (
504
+			$this->toggle_registration_status_for_default_approved_events($registration, false)
505
+			|| $this->toggle_registration_status_if_no_monies_owing(
506
+				$registration,
507
+				false,
508
+				$additional_details
509
+			)
510
+		) {
511
+			$registration->save();
512
+		}
513
+		// set new  REG_Status
514
+		$this->set_new_reg_status($registration->ID(), $registration->status_ID());
515
+		return $this->reg_status_updated($registration->ID())
516
+			   && $this->new_reg_status($registration->ID()) === EEM_Registration::status_id_approved;
517
+	}
518
+
519
+
520
+	/**
521
+	 * Updates the registration' final prices based on the current line item tree (taking into account
522
+	 * discounts, taxes, and other line items unrelated to tickets.)
523
+	 *
524
+	 * @param EE_Transaction $transaction
525
+	 * @param boolean        $save_regs whether to immediately save registrations in this function or not
526
+	 * @return void
527
+	 * @throws EE_Error
528
+	 * @throws InvalidArgumentException
529
+	 * @throws InvalidDataTypeException
530
+	 * @throws InvalidInterfaceException
531
+	 * @throws RuntimeException
532
+	 */
533
+	public function update_registration_final_prices($transaction, $save_regs = true)
534
+	{
535
+		$reg_final_price_per_ticket_line_item = EEH_Line_Item::calculate_reg_final_prices_per_line_item(
536
+			$transaction->total_line_item()
537
+		);
538
+		foreach ($transaction->registrations() as $registration) {
539
+			/** @var EE_Line_Item $line_item */
540
+			$line_item = EEM_Line_Item::instance()->get_line_item_for_registration($registration);
541
+			if (isset($reg_final_price_per_ticket_line_item[ $line_item->ID() ])) {
542
+				$registration->set_final_price($reg_final_price_per_ticket_line_item[ $line_item->ID() ]);
543
+				if ($save_regs) {
544
+					$registration->save();
545
+				}
546
+			}
547
+		}
548
+		// and make sure there's no rounding problem
549
+		$this->fix_reg_final_price_rounding_issue($transaction);
550
+	}
551
+
552
+
553
+	/**
554
+	 * Makes sure there is no rounding errors for the REG_final_prices.
555
+	 * Eg, if we have 3 registrations for $1, and there is a $0.01 discount between the three of them,
556
+	 * they will each be for $0.99333333, which gets rounded to $1 again.
557
+	 * So the transaction total will be $2.99, but each registration will be for $1,
558
+	 * so if each registrant paid individually they will have overpaid by $0.01.
559
+	 * So in order to overcome this, we check for any difference, and if there is a difference
560
+	 * we just grab one registrant at random and make them responsible for it.
561
+	 * This should be used after setting REG_final_prices (it's done automatically as part of
562
+	 * EE_Registration_Processor::update_registration_final_prices())
563
+	 *
564
+	 * @param EE_Transaction $transaction
565
+	 * @return bool success verifying that there is NO difference after this method is done
566
+	 * @throws EE_Error
567
+	 * @throws InvalidArgumentException
568
+	 * @throws InvalidDataTypeException
569
+	 * @throws InvalidInterfaceException
570
+	 */
571
+	public function fix_reg_final_price_rounding_issue($transaction)
572
+	{
573
+		$reg_final_price_sum = EEM_Registration::instance()->sum(
574
+			array(
575
+				array(
576
+					'TXN_ID' => $transaction->ID(),
577
+				),
578
+			),
579
+			'REG_final_price'
580
+		);
581
+		$diff = $transaction->total() - $reg_final_price_sum;
582
+		// ok then, just grab one of the registrations
583
+		if ($diff !== 0) {
584
+			$a_reg = EEM_Registration::instance()->get_one(
585
+				array(
586
+					array(
587
+						'TXN_ID' => $transaction->ID(),
588
+					),
589
+				)
590
+			);
591
+			return $a_reg instanceof EE_Registration
592
+				? (bool) $a_reg->save(array('REG_final_price' => $a_reg->final_price() + $diff))
593
+				: false;
594
+		}
595
+		return true;
596
+	}
597
+
598
+
599
+	/**
600
+	 * update_registration_after_being_canceled_or_declined
601
+	 *
602
+	 * @param EE_Registration $registration
603
+	 * @param array           $closed_reg_statuses
604
+	 * @param bool            $update_reg
605
+	 * @return bool
606
+	 * @throws EE_Error
607
+	 * @throws RuntimeException
608
+	 */
609
+	public function update_registration_after_being_canceled_or_declined(
610
+		EE_Registration $registration,
611
+		array $closed_reg_statuses = array(),
612
+		$update_reg = true
613
+	) {
614
+		// these reg statuses should not be considered in any calculations involving monies owing
615
+		$closed_reg_statuses = ! empty($closed_reg_statuses)
616
+			? $closed_reg_statuses
617
+			: EEM_Registration::closed_reg_statuses();
618
+		if (! in_array($registration->status_ID(), $closed_reg_statuses, true)) {
619
+			return false;
620
+		}
621
+		// release a reserved ticket by decrementing ticket and datetime reserved values
622
+		$registration->release_reserved_ticket(true, 'RegProcessor:' . __LINE__);
623
+		$registration->set_final_price(0);
624
+		if ($update_reg) {
625
+			$registration->save();
626
+		}
627
+		return true;
628
+	}
629
+
630
+
631
+	/**
632
+	 * update_canceled_or_declined_registration_after_being_reinstated
633
+	 *
634
+	 * @param EE_Registration $registration
635
+	 * @param array           $closed_reg_statuses
636
+	 * @param bool            $update_reg
637
+	 * @return bool
638
+	 * @throws EE_Error
639
+	 * @throws RuntimeException
640
+	 */
641
+	public function update_canceled_or_declined_registration_after_being_reinstated(
642
+		EE_Registration $registration,
643
+		array $closed_reg_statuses = array(),
644
+		$update_reg = true
645
+	) {
646
+		// these reg statuses should not be considered in any calculations involving monies owing
647
+		$closed_reg_statuses = ! empty($closed_reg_statuses) ? $closed_reg_statuses
648
+			: EEM_Registration::closed_reg_statuses();
649
+		if (in_array($registration->status_ID(), $closed_reg_statuses, true)) {
650
+			return false;
651
+		}
652
+		$ticket = $registration->ticket();
653
+		if (! $ticket instanceof EE_Ticket) {
654
+			throw new EE_Error(
655
+				sprintf(
656
+					esc_html__(
657
+						'The Ticket for Registration %1$d was not found or is invalid.',
658
+						'event_espresso'
659
+					),
660
+					$registration->ticket_ID()
661
+				)
662
+			);
663
+		}
664
+		$registration->set_final_price($ticket->price());
665
+		if ($update_reg) {
666
+			$registration->save();
667
+		}
668
+		return true;
669
+	}
670
+
671
+
672
+	/**
673
+	 * generate_ONE_registration_from_line_item
674
+	 * Although a ticket line item may have a quantity greater than 1,
675
+	 * this method will ONLY CREATE ONE REGISTRATION !!!
676
+	 * Regardless of the ticket line item quantity.
677
+	 * This means that any code calling this method is responsible for ensuring
678
+	 * that the final registration count matches the ticket line item quantity.
679
+	 * This was done to make it easier to match the number of registrations
680
+	 * to the number of tickets in the cart, when the cart has been edited
681
+	 * after SPCO has already been initialized. So if an additional ticket was added to the cart, you can simply pass
682
+	 * the line item to this method to add a second ticket, and in this case, you would not want to add 2 tickets.
683
+	 *
684
+	 * @deprecated
685
+	 * @since 4.9.1
686
+	 * @param EE_Line_Item    $line_item
687
+	 * @param \EE_Transaction $transaction
688
+	 * @param int             $att_nmbr
689
+	 * @param int             $total_ticket_count
690
+	 * @return EE_Registration | null
691
+	 * @throws \OutOfRangeException
692
+	 * @throws \EventEspresso\core\exceptions\UnexpectedEntityException
693
+	 * @throws \EE_Error
694
+	 */
695
+	public function generate_ONE_registration_from_line_item(
696
+		EE_Line_Item $line_item,
697
+		EE_Transaction $transaction,
698
+		$att_nmbr = 1,
699
+		$total_ticket_count = 1
700
+	) {
701
+		EE_Error::doing_it_wrong(
702
+			__CLASS__ . '::' . __FUNCTION__,
703
+			sprintf(
704
+				esc_html__('This method is deprecated. Please use "%s" instead', 'event_espresso'),
705
+				'\EventEspresso\core\domain\services\registration\CreateRegistrationService::create()'
706
+			),
707
+			'4.9.1',
708
+			'5.0.0'
709
+		);
710
+		// grab the related ticket object for this line_item
711
+		$ticket = $line_item->ticket();
712
+		if (! $ticket instanceof EE_Ticket) {
713
+			EE_Error::add_error(
714
+				sprintf(
715
+					esc_html__('Line item %s did not contain a valid ticket', 'event_espresso'),
716
+					$line_item->ID()
717
+				),
718
+				__FILE__,
719
+				__FUNCTION__,
720
+				__LINE__
721
+			);
722
+			return null;
723
+		}
724
+		$registration_service = new CreateRegistrationService();
725
+		// then generate a new registration from that
726
+		return $registration_service->create(
727
+			$ticket->get_related_event(),
728
+			$transaction,
729
+			$ticket,
730
+			$line_item,
731
+			$att_nmbr,
732
+			$total_ticket_count
733
+		);
734
+	}
735
+
736
+
737
+	/**
738
+	 * generates reg_url_link
739
+	 *
740
+	 * @deprecated
741
+	 * @since 4.9.1
742
+	 * @param int                   $att_nmbr
743
+	 * @param EE_Line_Item | string $item
744
+	 * @return string
745
+	 * @throws InvalidArgumentException
746
+	 */
747
+	public function generate_reg_url_link($att_nmbr, $item)
748
+	{
749
+		EE_Error::doing_it_wrong(
750
+			__CLASS__ . '::' . __FUNCTION__,
751
+			sprintf(
752
+				esc_html__('This method is deprecated. Please use "%s" instead', 'event_espresso'),
753
+				'EventEspresso\core\domain\entities\RegUrlLink'
754
+			),
755
+			'4.9.1',
756
+			'5.0.0'
757
+		);
758
+		return new RegUrlLink($att_nmbr, $item);
759
+	}
760
+
761
+
762
+	/**
763
+	 * generates reg code
764
+	 *
765
+	 * @deprecated
766
+	 * @since 4.9.1
767
+	 * @param EE_Registration $registration
768
+	 * @return string
769
+	 * @throws EE_Error
770
+	 * @throws EntityNotFoundException
771
+	 * @throws InvalidArgumentException
772
+	 */
773
+	public function generate_reg_code(EE_Registration $registration)
774
+	{
775
+		EE_Error::doing_it_wrong(
776
+			__CLASS__ . '::' . __FUNCTION__,
777
+			sprintf(
778
+				esc_html__('This method is deprecated. Please use "%s" instead', 'event_espresso'),
779
+				'EventEspresso\core\domain\entities\RegCode'
780
+			),
781
+			'4.9.1',
782
+			'5.0.0'
783
+		);
784
+		return apply_filters(
785
+			'FHEE__EE_Registration_Processor___generate_reg_code__new_reg_code',
786
+			new RegCode(
787
+				RegUrlLink::fromRegistration($registration),
788
+				$registration->transaction(),
789
+				$registration->ticket()
790
+			),
791
+			$registration
792
+		);
793
+	}
794 794
 }
Please login to merge, or discard this patch.
Spacing   +24 added lines, -24 removed lines patch added patch discarded remove patch
@@ -79,8 +79,8 @@  discard block
 block discarded – undo
79 79
     public static function instance(EE_Request $request = null)
80 80
     {
81 81
         // check if class object is instantiated
82
-        if (! self::$_instance instanceof EE_Registration_Processor) {
83
-            if (! $request instanceof EE_Request) {
82
+        if ( ! self::$_instance instanceof EE_Registration_Processor) {
83
+            if ( ! $request instanceof EE_Request) {
84 84
                 $request = LoaderFactory::getLoader()->getShared('EE_Request');
85 85
             }
86 86
             self::$_instance = new self($request);
@@ -106,7 +106,7 @@  discard block
 block discarded – undo
106 106
      */
107 107
     public function old_reg_status($REG_ID)
108 108
     {
109
-        return isset($this->_old_reg_status[ $REG_ID ]) ? $this->_old_reg_status[ $REG_ID ] : null;
109
+        return isset($this->_old_reg_status[$REG_ID]) ? $this->_old_reg_status[$REG_ID] : null;
110 110
     }
111 111
 
112 112
 
@@ -117,8 +117,8 @@  discard block
 block discarded – undo
117 117
     public function set_old_reg_status($REG_ID, $old_reg_status)
118 118
     {
119 119
         // only set the first time
120
-        if (! isset($this->_old_reg_status[ $REG_ID ])) {
121
-            $this->_old_reg_status[ $REG_ID ] = $old_reg_status;
120
+        if ( ! isset($this->_old_reg_status[$REG_ID])) {
121
+            $this->_old_reg_status[$REG_ID] = $old_reg_status;
122 122
         }
123 123
     }
124 124
 
@@ -129,7 +129,7 @@  discard block
 block discarded – undo
129 129
      */
130 130
     public function new_reg_status($REG_ID)
131 131
     {
132
-        return isset($this->_new_reg_status[ $REG_ID ]) ? $this->_new_reg_status[ $REG_ID ] : null;
132
+        return isset($this->_new_reg_status[$REG_ID]) ? $this->_new_reg_status[$REG_ID] : null;
133 133
     }
134 134
 
135 135
 
@@ -139,7 +139,7 @@  discard block
 block discarded – undo
139 139
      */
140 140
     public function set_new_reg_status($REG_ID, $new_reg_status)
141 141
     {
142
-        $this->_new_reg_status[ $REG_ID ] = $new_reg_status;
142
+        $this->_new_reg_status[$REG_ID] = $new_reg_status;
143 143
     }
144 144
 
145 145
 
@@ -206,7 +206,7 @@  discard block
 block discarded – undo
206 206
         if (
207 207
             $this->reg_status_updated($registration->ID())
208 208
             && (
209
-                (! $this->request->isAdmin() || $this->request->isFrontAjax())
209
+                ( ! $this->request->isAdmin() || $this->request->isFrontAjax())
210 210
                 || EE_Registry::instance()->CAP->current_user_can(
211 211
                     'ee_edit_registration',
212 212
                     'toggle_registration_status',
@@ -269,7 +269,7 @@  discard block
 block discarded – undo
269 269
                 $registration->save();
270 270
             }
271 271
             // don't trigger notifications during IPNs because they will get triggered by EE_Payment_Processor
272
-            if (! EE_Processor_Base::$IPN) {
272
+            if ( ! EE_Processor_Base::$IPN) {
273 273
                 // otherwise, send out notifications
274 274
                 add_filter('FHEE__EED_Messages___maybe_registration__deliver_notifications', '__return_true', 10);
275 275
             }
@@ -328,7 +328,7 @@  discard block
 block discarded – undo
328 328
                 $registration->save();
329 329
             }
330 330
             // don't trigger notifications during IPNs because they will get triggered by EE_Payment_Processor
331
-            if (! EE_Processor_Base::$IPN) {
331
+            if ( ! EE_Processor_Base::$IPN) {
332 332
                 // otherwise, send out notifications
333 333
                 add_filter('FHEE__EED_Messages___maybe_registration__deliver_notifications', '__return_true', 10);
334 334
             }
@@ -401,14 +401,14 @@  discard block
 block discarded – undo
401 401
                 || (
402 402
                     $payment instanceof EE_Payment && $payment->is_approved()
403 403
                     && // this specific registration has not yet been paid for
404
-                    ! isset(self::$_amount_paid[ $registration->ID() ])
404
+                    ! isset(self::$_amount_paid[$registration->ID()])
405 405
                     && // payment amount, less what we have already attributed to other registrations, is greater than this reg's final price
406 406
                     $payment->amount() - $total_paid >= $registration->final_price()
407 407
                 )
408 408
             )
409 409
         ) {
410 410
             // mark as paid
411
-            self::$_amount_paid[ $registration->ID() ] = $registration->final_price();
411
+            self::$_amount_paid[$registration->ID()] = $registration->final_price();
412 412
             // track new REG_Status
413 413
             $this->set_new_reg_status($registration->ID(), EEM_Registration::status_id_approved);
414 414
             // toggle status to approved
@@ -417,7 +417,7 @@  discard block
 block discarded – undo
417 417
                 $registration->save();
418 418
             }
419 419
             // don't trigger notifications during IPNs because they will get triggered by EE_Payment_Processor
420
-            if (! EE_Processor_Base::$IPN) {
420
+            if ( ! EE_Processor_Base::$IPN) {
421 421
                 // otherwise, send out notifications
422 422
                 add_filter('FHEE__EED_Messages___maybe_registration__deliver_notifications', '__return_true', 10);
423 423
             }
@@ -451,7 +451,7 @@  discard block
 block discarded – undo
451 451
     public function trigger_registration_update_notifications($registration, array $additional_details = array())
452 452
     {
453 453
         try {
454
-            if (! $registration instanceof EE_Registration) {
454
+            if ( ! $registration instanceof EE_Registration) {
455 455
                 throw new EE_Error(
456 456
                     esc_html__('An invalid registration was received.', 'event_espresso')
457 457
                 );
@@ -465,7 +465,7 @@  discard block
 block discarded – undo
465 465
             //     false,
466 466
             //     'EE_Transaction: ' . $registration->transaction()->ID()
467 467
             // );
468
-            if (! $registration->is_primary_registrant()) {
468
+            if ( ! $registration->is_primary_registrant()) {
469 469
                 return;
470 470
             }
471 471
             do_action(
@@ -538,8 +538,8 @@  discard block
 block discarded – undo
538 538
         foreach ($transaction->registrations() as $registration) {
539 539
             /** @var EE_Line_Item $line_item */
540 540
             $line_item = EEM_Line_Item::instance()->get_line_item_for_registration($registration);
541
-            if (isset($reg_final_price_per_ticket_line_item[ $line_item->ID() ])) {
542
-                $registration->set_final_price($reg_final_price_per_ticket_line_item[ $line_item->ID() ]);
541
+            if (isset($reg_final_price_per_ticket_line_item[$line_item->ID()])) {
542
+                $registration->set_final_price($reg_final_price_per_ticket_line_item[$line_item->ID()]);
543 543
                 if ($save_regs) {
544 544
                     $registration->save();
545 545
                 }
@@ -615,11 +615,11 @@  discard block
 block discarded – undo
615 615
         $closed_reg_statuses = ! empty($closed_reg_statuses)
616 616
             ? $closed_reg_statuses
617 617
             : EEM_Registration::closed_reg_statuses();
618
-        if (! in_array($registration->status_ID(), $closed_reg_statuses, true)) {
618
+        if ( ! in_array($registration->status_ID(), $closed_reg_statuses, true)) {
619 619
             return false;
620 620
         }
621 621
         // release a reserved ticket by decrementing ticket and datetime reserved values
622
-        $registration->release_reserved_ticket(true, 'RegProcessor:' . __LINE__);
622
+        $registration->release_reserved_ticket(true, 'RegProcessor:'.__LINE__);
623 623
         $registration->set_final_price(0);
624 624
         if ($update_reg) {
625 625
             $registration->save();
@@ -650,7 +650,7 @@  discard block
 block discarded – undo
650 650
             return false;
651 651
         }
652 652
         $ticket = $registration->ticket();
653
-        if (! $ticket instanceof EE_Ticket) {
653
+        if ( ! $ticket instanceof EE_Ticket) {
654 654
             throw new EE_Error(
655 655
                 sprintf(
656 656
                     esc_html__(
@@ -699,7 +699,7 @@  discard block
 block discarded – undo
699 699
         $total_ticket_count = 1
700 700
     ) {
701 701
         EE_Error::doing_it_wrong(
702
-            __CLASS__ . '::' . __FUNCTION__,
702
+            __CLASS__.'::'.__FUNCTION__,
703 703
             sprintf(
704 704
                 esc_html__('This method is deprecated. Please use "%s" instead', 'event_espresso'),
705 705
                 '\EventEspresso\core\domain\services\registration\CreateRegistrationService::create()'
@@ -709,7 +709,7 @@  discard block
 block discarded – undo
709 709
         );
710 710
         // grab the related ticket object for this line_item
711 711
         $ticket = $line_item->ticket();
712
-        if (! $ticket instanceof EE_Ticket) {
712
+        if ( ! $ticket instanceof EE_Ticket) {
713 713
             EE_Error::add_error(
714 714
                 sprintf(
715 715
                     esc_html__('Line item %s did not contain a valid ticket', 'event_espresso'),
@@ -747,7 +747,7 @@  discard block
 block discarded – undo
747 747
     public function generate_reg_url_link($att_nmbr, $item)
748 748
     {
749 749
         EE_Error::doing_it_wrong(
750
-            __CLASS__ . '::' . __FUNCTION__,
750
+            __CLASS__.'::'.__FUNCTION__,
751 751
             sprintf(
752 752
                 esc_html__('This method is deprecated. Please use "%s" instead', 'event_espresso'),
753 753
                 'EventEspresso\core\domain\entities\RegUrlLink'
@@ -773,7 +773,7 @@  discard block
 block discarded – undo
773 773
     public function generate_reg_code(EE_Registration $registration)
774 774
     {
775 775
         EE_Error::doing_it_wrong(
776
-            __CLASS__ . '::' . __FUNCTION__,
776
+            __CLASS__.'::'.__FUNCTION__,
777 777
             sprintf(
778 778
                 esc_html__('This method is deprecated. Please use "%s" instead', 'event_espresso'),
779 779
                 'EventEspresso\core\domain\entities\RegCode'
Please login to merge, or discard this patch.
core/admin/EE_Admin_Hooks.core.php 3 patches
Doc Comments   +1 added lines, -1 removed lines patch added patch discarded remove patch
@@ -222,7 +222,7 @@
 block discarded – undo
222 222
     /**
223 223
      * constructor
224 224
      *
225
-     * @param EE_Admin_Page $admin_page the calling admin_page_object
225
+     * @param EE_Admin_Page $adminpage the calling admin_page_object
226 226
      */
227 227
     public function __construct(EE_Admin_Page $adminpage)
228 228
     {
Please login to merge, or discard this patch.
Indentation   +715 added lines, -715 removed lines patch added patch discarded remove patch
@@ -13,719 +13,719 @@
 block discarded – undo
13 13
 {
14 14
 
15 15
 
16
-    /**
17
-     * we're just going to use this to hold the name of the caller class (child class name)
18
-     *
19
-     * @var string
20
-     */
21
-    public $caller;
22
-
23
-
24
-    /**
25
-     * this is just a flag set automatically to indicate whether we've got an extended hook class running (i.e.
26
-     * espresso_events_Registration_Form_Hooks_Extend extends espresso_events_Registration_Form_Hooks).  This flag is
27
-     * used later to make sure we require the needed files.
28
-     *
29
-     * @var bool
30
-     */
31
-    protected $_extend;
32
-
33
-
34
-    /**
35
-     * child classes MUST set this property so that the page object can be loaded correctly
36
-     *
37
-     * @var string
38
-     */
39
-    protected $_name;
40
-
41
-
42
-    /**
43
-     * This is set by child classes and is an associative array of ajax hooks in the format:
44
-     * array(
45
-     *    'ajax_action_ref' => 'executing_method'; //must be public
46
-     * )
47
-     *
48
-     * @var array
49
-     */
50
-    protected $_ajax_func;
51
-
52
-
53
-    /**
54
-     * This is an array of methods that get executed on a page routes admin_init hook. Use the following format:
55
-     * array(
56
-     *    'page_route' => 'executing_method' //must be public
57
-     * )
58
-     *
59
-     * @var array
60
-     */
61
-    protected $_init_func;
62
-
63
-
64
-    /**
65
-     * This is an array of methods that output metabox content for the given page route.  Use the following format:
66
-     * array(
67
-     *    0 => array(
68
-     *        'page_route' => 'string_for_page_route', //must correspond to a page route in the class being connected
69
-     *        with (i.e. "edit_event") If this is in an array then the same params below will be used but the metabox
70
-     *        will be added to each route.
71
-     *        'func' =>  'executing_method',  //must be public (i.e. public function executing_method($post,
72
-     *        $callback_args){} ).  Note if you include callback args in the array then you need to declare them in the
73
-     *        method arguments.
74
-     *        'id' => 'identifier_for_metabox', //so it can be removed by addons (optional, class will set it
75
-     *        automatically)
76
-     *        'priority' => 'default', //default 'default' (optional)
77
-     *        'label' => __('Localized Title', 'event_espresso'),
78
-     *        'context' => 'advanced' //advanced is default (optional),
79
-     *    'callback_args' => array() //any callback args to include (optional)
80
-     * )
81
-     * Why are we indexing numerically?  Because it's possible there may be more than one metabox per page_route.
82
-     *
83
-     * @var array
84
-     */
85
-    protected $_metaboxes;
86
-
87
-
88
-    /**
89
-     * This is an array of values that indicate any metaboxes we want removed from a given page route.  Usually this is
90
-     * used when caffeinated functionality is replacing decaffeinated functionality.  Use the following format for the
91
-     * array: array(
92
-     *    0 => array(
93
-     *        'page_route' => 'string_for_page_route' //can be string or array of strings that match a page_route(s)
94
-     *        that are in the class being connected with (i.e. 'edit', or 'create_new').
95
-     *        'id' => 'identifier_for_metabox', //what the id is of the metabox being removed
96
-     *        'context' => 'normal', //the context for the metabox being removed (has to match)
97
-     *        'screen' => 'screen_id', //(optional), if not included then this class will attempt to remove the metabox
98
-     *        using the currently loaded screen object->id  however, there may be cases where you have to specify the
99
-     *        id for the screen the metabox is on.
100
-     *    )
101
-     * )
102
-     *
103
-     * @var array
104
-     */
105
-    protected $_remove_metaboxes;
106
-
107
-
108
-    /**
109
-     * This parent class takes care of loading the scripts and styles if the child class has set the properties for
110
-     * them in the following format.  Note, the first array index ('register') is for defining all the registers.  The
111
-     * second array index is for indicating what routes each script/style loads on. array(
112
-     * 'registers' => array(
113
-     *        'script_ref' => array( // if more than one script is to be loaded its best to use the 'dependency'
114
-     *        argument to link scripts together.
115
-     *            'type' => 'js' // 'js' or 'css' (defaults to js).  This tells us what type of wp_function to use
116
-     *            'url' => 'http://urltoscript.css.js',
117
-     *            'depends' => array('jquery'), //an array of dependencies for the scripts. REMEMBER, if a script has
118
-     *            already been registered elsewhere in the system.  You can just use the depends array to make sure it
119
-     *            gets loaded before the one you are setting here.
120
-     *            'footer' => TRUE //defaults to true (styles don't use this parameter)
121
-     *        ),
122
-     *    'enqueues' => array( //this time each key corresponds to the script ref followed by an array of page routes
123
-     *    the script gets enqueued on.
124
-     *        'script_ref' => array('route_one', 'route_two')
125
-     *    ),
126
-     *    'localize' => array( //this allows you to set a localize object.  Indicate which script the object is being
127
-     *    attached to and then include an array indexed by the name of the object and the array of key/value pairs for
128
-     *    the object.
129
-     *        'scrip_ref' => array(
130
-     *            'NAME_OF_JS_OBJECT' => array(
131
-     *                'translate_ref' => __('localized_string', 'event_espresso'),
132
-     *                'some_data' => 5
133
-     *            )
134
-     *        )
135
-     *    )
136
-     * )
137
-     *
138
-     * @var array
139
-     */
140
-    protected $_scripts_styles;
141
-
142
-
143
-    /**
144
-     * This is a property that will contain the current route.
145
-     *
146
-     * @var string;
147
-     */
148
-    protected $_current_route;
149
-
150
-
151
-    /**
152
-     * this optional property can be set by child classes to override the priority for the automatic action/filter hook
153
-     * loading in the `_load_routed_hooks()` method.  Please follow this format: array(
154
-     *    'wp_hook_reference' => 1
155
-     *    )
156
-     * )
157
-     *
158
-     * @var array
159
-     */
160
-    protected $_wp_action_filters_priority;
161
-
162
-
163
-    /**
164
-     * This just holds a merged array of the $_POST and $_GET vars in favor of $_POST
165
-     *
166
-     * @var array
167
-     */
168
-    protected $_req_data;
169
-
170
-
171
-    /**
172
-     * This just holds an instance of the page object for this hook
173
-     *
174
-     * @var EE_Admin_Page
175
-     */
176
-    protected $_page_object;
177
-
178
-
179
-    /**
180
-     * This holds the EE_Admin_Page object from the calling admin page that this object hooks into.
181
-     *
182
-     * @var EE_Admin_Page|EE_Admin_Page_CPT
183
-     */
184
-    protected $_adminpage_obj;
185
-
186
-
187
-    /**
188
-     * Holds EE_Registry object
189
-     *
190
-     * @var EE_Registry
191
-     */
192
-    protected $EE = null;
193
-
194
-
195
-    /**
196
-     * constructor
197
-     *
198
-     * @param EE_Admin_Page $admin_page the calling admin_page_object
199
-     */
200
-    public function __construct(EE_Admin_Page $adminpage)
201
-    {
202
-        $this->_adminpage_obj = $adminpage;
203
-        $this->_req_data = array_merge($_GET, $_POST);
204
-        $this->_set_defaults();
205
-        $this->_set_hooks_properties();
206
-        // first let's verify we're on the right page
207
-        if (
208
-            ! isset($this->_req_data['page'])
209
-            || (isset($this->_req_data['page'])
210
-                && $this->_adminpage_obj->page_slug
211
-                   != $this->_req_data['page'])
212
-        ) {
213
-            return;
214
-        } //get out nothing more to be done here.
215
-        // allow for extends to modify properties
216
-        if (method_exists($this, '_extend_properties')) {
217
-            $this->_extend_properties();
218
-        }
219
-        $this->_set_page_object();
220
-        $this->_init_hooks();
221
-        $this->_load_custom_methods();
222
-        $this->_load_routed_hooks();
223
-        add_action('admin_enqueue_scripts', array($this, 'enqueue_scripts_styles'));
224
-        add_action('admin_enqueue_scripts', array($this, 'add_metaboxes'), 20);
225
-        add_action('admin_enqueue_scripts', array($this, 'remove_metaboxes'), 15);
226
-        $this->_ajax_hooks();
227
-    }
228
-
229
-
230
-    /**
231
-     * used by child classes to set the following properties:
232
-     * $_ajax_func (optional)
233
-     * $_init_func (optional)
234
-     * $_metaboxes (optional)
235
-     * $_scripts (optional)
236
-     * $_styles (optional)
237
-     * $_name (required)
238
-     * Also in this method will be registered any scripts or styles loaded on the targeted page (as indicated in the
239
-     * _scripts/_styles properties) Also children should place in this method any filters/actions that have to happen
240
-     * really early on page load (just after admin_init) if they want to have them registered for handling early.
241
-     *
242
-     * @access protected
243
-     * @abstract
244
-     * @return void
245
-     */
246
-    abstract protected function _set_hooks_properties();
247
-
248
-
249
-    /**
250
-     * The hooks for enqueue_scripts and enqueue_styles will be run in here.  Child classes need to define their
251
-     * scripts and styles in the relevant $_scripts and $_styles properties.  Child classes must have also already
252
-     * registered the scripts and styles using wp_register_script and wp_register_style functions.
253
-     *
254
-     * @access public
255
-     * @return void
256
-     */
257
-    public function enqueue_scripts_styles()
258
-    {
259
-        if (! empty($this->_scripts_styles)) {
260
-            // first let's do all the registrations
261
-            if (! isset($this->_scripts_styles['registers'])) {
262
-                $msg[] = __(
263
-                    'There is no "registers" index in the <code>$this->_scripts_styles</code> property.',
264
-                    'event_espresso'
265
-                );
266
-                $msg[] = sprintf(
267
-                    __(
268
-                        'Make sure you read the phpdoc comments above the definition of the $_scripts_styles property in the <code>EE_Admin_Hooks</code> class and modify according in the %s child',
269
-                        'event_espresso'
270
-                    ),
271
-                    '<strong>' . $this->caller . '</strong>'
272
-                );
273
-                throw new EE_Error(implode('||', $msg));
274
-            }
275
-            foreach ($this->_scripts_styles['registers'] as $ref => $details) {
276
-                $defaults = array(
277
-                    'type'    => 'js',
278
-                    'url'     => '',
279
-                    'depends' => array(),
280
-                    'version' => EVENT_ESPRESSO_VERSION,
281
-                    'footer'  => true,
282
-                );
283
-                $details = wp_parse_args($details, $defaults);
284
-                extract($details);
285
-                // let's make sure that we set the 'registers' type if it's not set! We need it later to determine whhich enqueu we do
286
-                $this->_scripts_styles['registers'][ $ref ]['type'] = $type;
287
-                // let's make sure we're not missing any REQUIRED parameters
288
-                if (empty($url)) {
289
-                    $msg[] = sprintf(
290
-                        __('Missing the url for the requested %s', 'event_espresso'),
291
-                        $type == 'js' ? 'script' : 'stylesheet'
292
-                    );
293
-                    $msg[] = sprintf(
294
-                        __(
295
-                            'Doublecheck your <code>$this->_scripts_styles</code> array in %s and make sure that there is a "url" set for the %s ref',
296
-                            'event_espresso'
297
-                        ),
298
-                        '<strong>' . $this->caller . '</strong>',
299
-                        $ref
300
-                    );
301
-                    throw new EE_Error(implode('||', $msg));
302
-                }
303
-                // made it here so let's do the appropriate registration
304
-                $type == 'js'
305
-                    ? wp_register_script($ref, $url, $depends, $version, $footer)
306
-                    : wp_register_style(
307
-                        $ref,
308
-                        $url,
309
-                        $depends,
310
-                        $version
311
-                    );
312
-            }
313
-            // k now lets do the enqueues
314
-            if (! isset($this->_scripts_styles['enqueues'])) {
315
-                return;
316
-            }  //not sure if we should throw an error here or not.
317
-
318
-            foreach ($this->_scripts_styles['enqueues'] as $ref => $routes) {
319
-                // make sure $routes is an array
320
-                $routes = (array) $routes;
321
-                if (in_array($this->_current_route, $routes)) {
322
-                    $this->_scripts_styles['registers'][ $ref ]['type'] == 'js' ? wp_enqueue_script($ref)
323
-                        : wp_enqueue_style($ref);
324
-                    // if we have a localization for the script let's do that too.
325
-                    if (isset($this->_scripts_styles['localize'][ $ref ])) {
326
-                        foreach ($this->_scripts_styles['localize'][ $ref ] as $object_name => $indexes) {
327
-                            wp_localize_script(
328
-                                $ref,
329
-                                $object_name,
330
-                                $this->_scripts_styles['localize'][ $ref ][ $object_name ]
331
-                            );
332
-                        }
333
-                    }
334
-                }
335
-            }
336
-            // let's do the deregisters
337
-            if (! isset($this->_scripts_styles['deregisters'])) {
338
-                return;
339
-            }
340
-            foreach ($this->_scripts_styles['deregisters'] as $ref => $details) {
341
-                $defaults = array(
342
-                    'type' => 'js',
343
-                );
344
-                $details = wp_parse_args($details, $defaults);
345
-                extract($details);
346
-                $type == 'js' ? wp_deregister_script($ref) : wp_deregister_style($ref);
347
-            }
348
-        }
349
-    }
350
-
351
-
352
-    /**
353
-     * just set the defaults for the hooks properties.
354
-     *
355
-     * @access private
356
-     * @return void
357
-     */
358
-    private function _set_defaults()
359
-    {
360
-        $this->_ajax_func = $this->_init_func = $this->_metaboxes = $this->_scripts = $this->_styles = $this->_wp_action_filters_priority = array();
361
-        $this->_current_route = $this->getCurrentRoute();
362
-        $this->caller = get_class($this);
363
-        $this->_extend = stripos($this->caller, 'Extend') ? true : false;
364
-    }
365
-
366
-
367
-    /**
368
-     * A helper for determining the current route.
369
-     * @return string
370
-     */
371
-    private function getCurrentRoute()
372
-    {
373
-        // list tables do something else with 'action' for bulk actions.
374
-        $action = ! empty($_REQUEST['action']) && $_REQUEST['action'] !== '-1' ? $_REQUEST['action'] : 'default';
375
-        // we set a 'route' variable in some cases where action is being used by something else.
376
-        $action = $action === 'default' && isset($_REQUEST['route']) ? $_REQUEST['route'] : $action;
377
-        return sanitize_key($action);
378
-    }
379
-
380
-
381
-    /**
382
-     * this sets the _page_object property
383
-     *
384
-     * @access protected
385
-     * @return void
386
-     */
387
-    protected function _set_page_object()
388
-    {
389
-        // first make sure $this->_name is set
390
-        if (empty($this->_name)) {
391
-            $msg[] = __('We can\'t load the page object', 'event_espresso');
392
-            $msg[] = sprintf(
393
-                __("This is because the %s child class has not set the '_name' property", 'event_espresso'),
394
-                $this->caller
395
-            );
396
-            throw new EE_Error(implode('||', $msg));
397
-        }
398
-        $ref = str_replace('_', ' ', $this->_name); // take the_message -> the message
399
-        $ref = str_replace(' ', '_', ucwords($ref)) . '_Admin_Page'; // take the message -> The_Message
400
-        // first default file (if exists)
401
-        $decaf_file = EE_ADMIN_PAGES . $this->_name . '/' . $ref . '.core.php';
402
-        if (is_readable($decaf_file)) {
403
-            require_once($decaf_file);
404
-        }
405
-        // now we have to do require for extended file (if needed)
406
-        if ($this->_extend) {
407
-            require_once(EE_CORE_CAF_ADMIN_EXTEND . $this->_name . '/Extend_' . $ref . '.core.php');
408
-        }
409
-        // if we've got an extended class we use that!
410
-        $ref = $this->_extend ? 'Extend_' . $ref : $ref;
411
-        // let's make sure the class exists
412
-        if (! class_exists($ref)) {
413
-            $msg[] = __('We can\'t load the page object', 'event_espresso');
414
-            $msg[] = sprintf(
415
-                __(
416
-                    'The class name that was given is %s. Check the spelling and make sure its correct, also there needs to be an autoloader setup for the class',
417
-                    'event_espresso'
418
-                ),
419
-                $ref
420
-            );
421
-            throw new EE_Error(implode('||', $msg));
422
-        }
423
-        $a = new ReflectionClass($ref);
424
-        $this->_page_object = $a->newInstance(false);
425
-    }
426
-
427
-
428
-    /**
429
-     * Child "hook" classes can declare any methods that they want executed when a specific page route is loaded.  The
430
-     * advantage of this is when doing things like running our own db interactions on saves etc.  Remember that
431
-     * $this->_req_data (all the _POST and _GET data) is available to your methods.
432
-     *
433
-     * @access private
434
-     * @return void
435
-     */
436
-    private function _load_custom_methods()
437
-    {
438
-        /**
439
-         * method cannot be named 'default' (@see http://us3.php
440
-         * .net/manual/en/reserved.keywords.php) so need to
441
-         * handle routes that are "default"
442
-         *
443
-         * @since 4.3.0
444
-         */
445
-        $method_callback = $this->_current_route == 'default' ? 'default_callback' : $this->_current_route;
446
-        // these run before the Admin_Page route executes.
447
-        if (method_exists($this, $method_callback)) {
448
-            call_user_func(array($this, $method_callback));
449
-        }
450
-        // these run via the _redirect_after_action method in EE_Admin_Page which usually happens after non_UI methods in EE_Admin_Page classes.  There are two redirect actions, the first fires before $query_args might be manipulated by "save and close" actions and the seond fires right before the actual redirect happens.
451
-        // first the actions
452
-        // note that these action hooks will have the $query_args value available.
453
-        $admin_class_name = get_class($this->_adminpage_obj);
454
-        if (method_exists($this, '_redirect_action_early_' . $this->_current_route)) {
455
-            add_action(
456
-                'AHEE__'
457
-                . $admin_class_name
458
-                . '___redirect_after_action__before_redirect_modification_'
459
-                . $this->_current_route,
460
-                array($this, '_redirect_action_early_' . $this->_current_route),
461
-                10
462
-            );
463
-        }
464
-        if (method_exists($this, '_redirect_action_' . $this->_current_route)) {
465
-            add_action(
466
-                'AHEE_redirect_' . $admin_class_name . $this->_current_route,
467
-                array($this, '_redirect_action_' . $this->_current_route),
468
-                10
469
-            );
470
-        }
471
-        // let's hook into the _redirect itself and allow for changing where the user goes after redirect.  This will have $query_args and $redirect_url available.
472
-        if (method_exists($this, '_redirect_filter_' . $this->_current_route)) {
473
-            add_filter(
474
-                'FHEE_redirect_' . $admin_class_name . $this->_current_route,
475
-                array($this, '_redirect_filter_' . $this->_current_route),
476
-                10,
477
-                2
478
-            );
479
-        }
480
-    }
481
-
482
-
483
-    /**
484
-     * This method will search for a corresponding method with a name matching the route and the wp_hook to run.  This
485
-     * allows child hook classes to target hooking into a specific wp action or filter hook ONLY on a certain route.
486
-     * just remember, methods MUST be public Future hooks should be added in here to be access by child classes.
487
-     *
488
-     * @return void
489
-     */
490
-    private function _load_routed_hooks()
491
-    {
492
-
493
-        // this array provides the hook action names that will be referenced.  Key is the action. Value is an array with the type (action or filter) and the number of parameters for the hook.  We'll default all priorities for automatic hooks to 10.
494
-        $hook_filter_array = array(
495
-            'admin_footer'                                                                            => array(
496
-                'type'     => 'action',
497
-                'argnum'   => 1,
498
-                'priority' => 10,
499
-            ),
500
-            'FHEE_list_table_views_' . $this->_adminpage_obj->page_slug . '_' . $this->_current_route => array(
501
-                'type'     => 'filter',
502
-                'argnum'   => 1,
503
-                'priority' => 10,
504
-            ),
505
-            'FHEE_list_table_views_' . $this->_adminpage_obj->page_slug                               => array(
506
-                'type'     => 'filter',
507
-                'argnum'   => 1,
508
-                'priority' => 10,
509
-            ),
510
-            'FHEE_list_table_views'                                                                   => array(
511
-                'type'     => 'filter',
512
-                'argnum'   => 1,
513
-                'priority' => 10,
514
-            ),
515
-            'AHEE__EE_Admin_Page___display_admin_page__modify_metaboxes'                              => array(
516
-                'type'     => 'action',
517
-                'argnum'   => 1,
518
-                'priority' => 10,
519
-            ),
520
-        );
521
-        foreach ($hook_filter_array as $hook => $args) {
522
-            if (method_exists($this, $this->_current_route . '_' . $hook)) {
523
-                if (isset($this->_wp_action_filters_priority[ $hook ])) {
524
-                    $args['priority'] = $this->_wp_action_filters_priority[ $hook ];
525
-                }
526
-                if ($args['type'] == 'action') {
527
-                    add_action(
528
-                        $hook,
529
-                        array($this, $this->_current_route . '_' . $hook),
530
-                        $args['priority'],
531
-                        $args['argnum']
532
-                    );
533
-                } else {
534
-                    add_filter(
535
-                        $hook,
536
-                        array($this, $this->_current_route . '_' . $hook),
537
-                        $args['priority'],
538
-                        $args['argnum']
539
-                    );
540
-                }
541
-            }
542
-        }
543
-    }
544
-
545
-
546
-    /**
547
-     * Loop throught the $_ajax_func array and add_actions for the array.
548
-     *
549
-     * @return void
550
-     */
551
-    private function _ajax_hooks()
552
-    {
553
-        if (empty($this->_ajax_func)) {
554
-            return;
555
-        } //get out there's nothing to take care of.
556
-        foreach ($this->_ajax_func as $action => $method) {
557
-            // make sure method exists
558
-            if (! method_exists($this, $method)) {
559
-                $msg[] = __(
560
-                    'There is no corresponding method for the hook labeled in the _ajax_func array',
561
-                    'event_espresso'
562
-                ) . '<br />';
563
-                $msg[] = sprintf(
564
-                    __(
565
-                        'The method name given in the array is %s, check the spelling and make sure it exists in the %s class',
566
-                        'event_espresso'
567
-                    ),
568
-                    $method,
569
-                    $this->caller
570
-                );
571
-                throw new EE_Error(implode('||', $msg));
572
-            }
573
-            add_action('wp_ajax_' . $action, array($this, $method));
574
-        }
575
-    }
576
-
577
-
578
-    /**
579
-     * Loop throught the $_init_func array and add_actions for the array.
580
-     *
581
-     * @return void
582
-     */
583
-    protected function _init_hooks()
584
-    {
585
-        if (empty($this->_init_func)) {
586
-            return;
587
-        } //get out there's nothing to take care of.
588
-        // We need to determine what page_route we are on!
589
-        $current_route = isset($_REQUEST['action']) ? $_REQUEST['action'] : 'default';
590
-        foreach ($this->_init_func as $route => $method) {
591
-            // make sure method exists
592
-            if (! method_exists($this, $method)) {
593
-                $msg[] = __(
594
-                    'There is no corresponding method for the hook labeled in the _init_func array',
595
-                    'event_espresso'
596
-                ) . '<br />';
597
-                $msg[] = sprintf(
598
-                    __(
599
-                        'The method name given in the array is %s, check the spelling and make sure it exists in the %s class',
600
-                        'event_espresso'
601
-                    ),
602
-                    $method,
603
-                    $this->caller
604
-                );
605
-                throw new EE_Error(implode('||', $msg));
606
-            }
607
-            if ($route == $this->_current_route) {
608
-                add_action('admin_init', array($this, $method));
609
-            }
610
-        }
611
-    }
612
-
613
-
614
-    /**
615
-     * Loop through the _metaboxes property and add_metaboxes accordingly
616
-     * //todo we could eventually make this a config component class (i.e. new EE_Metabox);
617
-     *
618
-     * @access public
619
-     * @return void
620
-     */
621
-    public function add_metaboxes()
622
-    {
623
-        if (empty($this->_metaboxes)) {
624
-            return;
625
-        } //get out we don't have any metaboxes to set for this connection
626
-        $this->_handle_metabox_array($this->_metaboxes);
627
-    }
628
-
629
-
630
-    private function _handle_metabox_array($boxes, $add = true)
631
-    {
632
-        foreach ($boxes as $box) {
633
-            if (! isset($box['page_route'])) {
634
-                continue;
635
-            } //we dont' have a valid array
636
-            // let's make sure $box['page_route'] is an array so the "foreach" will work.
637
-            $box['page_route'] = (array) $box['page_route'];
638
-            foreach ($box['page_route'] as $route) {
639
-                if ($route != $this->_current_route) {
640
-                    continue;
641
-                } //get out we only add metaboxes for set route.
642
-                if ($add) {
643
-                    $this->_add_metabox($box);
644
-                } else {
645
-                    $this->_remove_metabox($box);
646
-                }
647
-            }
648
-        }
649
-    }
650
-
651
-
652
-    /**
653
-     * Loop through the _remove_metaboxes property and remove metaboxes accordingly.
654
-     *
655
-     * @access public
656
-     * @return void
657
-     */
658
-    public function remove_metaboxes()
659
-    {
660
-        if (empty($this->_remove_metaboxes)) {
661
-            return;
662
-        } //get out there are no metaboxes to remove
663
-        $this->_handle_metabox_array($this->_remove_metaboxes, false);
664
-    }
665
-
666
-
667
-    /**
668
-     * This just handles adding a metabox
669
-     *
670
-     * @access private
671
-     * @param array $args an array of args that have been set for this metabox by the child class
672
-     */
673
-    private function _add_metabox($args)
674
-    {
675
-        $current_screen = get_current_screen();
676
-        $screen_id = is_object($current_screen) ? $current_screen->id : null;
677
-        $func = isset($args['func']) ? $args['func'] : 'some_invalid_callback';
678
-        // set defaults
679
-        $defaults = array(
680
-            'func'          => $func,
681
-            'id'            => $this->caller . '_' . $func . '_metabox',
682
-            'priority'      => 'default',
683
-            'label'         => $this->caller,
684
-            'context'       => 'advanced',
685
-            'callback_args' => array(),
686
-            'page'          => isset($args['page']) ? $args['page'] : $screen_id,
687
-        );
688
-        $args = wp_parse_args($args, $defaults);
689
-        extract($args);
690
-        // make sure method exists
691
-        if (! method_exists($this, $func)) {
692
-            $msg[] = __('There is no corresponding method to display the metabox content', 'event_espresso') . '<br />';
693
-            $msg[] = sprintf(
694
-                __(
695
-                    'The method name given in the array is %s, check the spelling and make sure it exists in the %s class',
696
-                    'event_espresso'
697
-                ),
698
-                $func,
699
-                $this->caller
700
-            );
701
-            throw new EE_Error(implode('||', $msg));
702
-        }
703
-        // everything checks out so lets add the metabox
704
-        add_meta_box($id, $label, array($this, $func), $page, $context, $priority, $callback_args);
705
-    }
706
-
707
-
708
-    private function _remove_metabox($args)
709
-    {
710
-        $current_screen = get_current_screen();
711
-        $screen_id = is_object($current_screen) ? $current_screen->id : null;
712
-        $func = isset($args['func']) ? $args['func'] : 'some_invalid_callback';
713
-        // set defaults
714
-        $defaults = array(
715
-            'id'      => isset($args['id'])
716
-                ? $args['id']
717
-                : $this->_current_route
718
-                  . '_'
719
-                  . $this->caller
720
-                  . '_'
721
-                  . $func
722
-                  . '_metabox',
723
-            'context' => 'default',
724
-            'screen'  => isset($args['screen']) ? $args['screen'] : $screen_id,
725
-        );
726
-        $args = wp_parse_args($args, $defaults);
727
-        extract($args);
728
-        // everything checks out so lets remove the box!
729
-        remove_meta_box($id, $screen, $context);
730
-    }
16
+	/**
17
+	 * we're just going to use this to hold the name of the caller class (child class name)
18
+	 *
19
+	 * @var string
20
+	 */
21
+	public $caller;
22
+
23
+
24
+	/**
25
+	 * this is just a flag set automatically to indicate whether we've got an extended hook class running (i.e.
26
+	 * espresso_events_Registration_Form_Hooks_Extend extends espresso_events_Registration_Form_Hooks).  This flag is
27
+	 * used later to make sure we require the needed files.
28
+	 *
29
+	 * @var bool
30
+	 */
31
+	protected $_extend;
32
+
33
+
34
+	/**
35
+	 * child classes MUST set this property so that the page object can be loaded correctly
36
+	 *
37
+	 * @var string
38
+	 */
39
+	protected $_name;
40
+
41
+
42
+	/**
43
+	 * This is set by child classes and is an associative array of ajax hooks in the format:
44
+	 * array(
45
+	 *    'ajax_action_ref' => 'executing_method'; //must be public
46
+	 * )
47
+	 *
48
+	 * @var array
49
+	 */
50
+	protected $_ajax_func;
51
+
52
+
53
+	/**
54
+	 * This is an array of methods that get executed on a page routes admin_init hook. Use the following format:
55
+	 * array(
56
+	 *    'page_route' => 'executing_method' //must be public
57
+	 * )
58
+	 *
59
+	 * @var array
60
+	 */
61
+	protected $_init_func;
62
+
63
+
64
+	/**
65
+	 * This is an array of methods that output metabox content for the given page route.  Use the following format:
66
+	 * array(
67
+	 *    0 => array(
68
+	 *        'page_route' => 'string_for_page_route', //must correspond to a page route in the class being connected
69
+	 *        with (i.e. "edit_event") If this is in an array then the same params below will be used but the metabox
70
+	 *        will be added to each route.
71
+	 *        'func' =>  'executing_method',  //must be public (i.e. public function executing_method($post,
72
+	 *        $callback_args){} ).  Note if you include callback args in the array then you need to declare them in the
73
+	 *        method arguments.
74
+	 *        'id' => 'identifier_for_metabox', //so it can be removed by addons (optional, class will set it
75
+	 *        automatically)
76
+	 *        'priority' => 'default', //default 'default' (optional)
77
+	 *        'label' => __('Localized Title', 'event_espresso'),
78
+	 *        'context' => 'advanced' //advanced is default (optional),
79
+	 *    'callback_args' => array() //any callback args to include (optional)
80
+	 * )
81
+	 * Why are we indexing numerically?  Because it's possible there may be more than one metabox per page_route.
82
+	 *
83
+	 * @var array
84
+	 */
85
+	protected $_metaboxes;
86
+
87
+
88
+	/**
89
+	 * This is an array of values that indicate any metaboxes we want removed from a given page route.  Usually this is
90
+	 * used when caffeinated functionality is replacing decaffeinated functionality.  Use the following format for the
91
+	 * array: array(
92
+	 *    0 => array(
93
+	 *        'page_route' => 'string_for_page_route' //can be string or array of strings that match a page_route(s)
94
+	 *        that are in the class being connected with (i.e. 'edit', or 'create_new').
95
+	 *        'id' => 'identifier_for_metabox', //what the id is of the metabox being removed
96
+	 *        'context' => 'normal', //the context for the metabox being removed (has to match)
97
+	 *        'screen' => 'screen_id', //(optional), if not included then this class will attempt to remove the metabox
98
+	 *        using the currently loaded screen object->id  however, there may be cases where you have to specify the
99
+	 *        id for the screen the metabox is on.
100
+	 *    )
101
+	 * )
102
+	 *
103
+	 * @var array
104
+	 */
105
+	protected $_remove_metaboxes;
106
+
107
+
108
+	/**
109
+	 * This parent class takes care of loading the scripts and styles if the child class has set the properties for
110
+	 * them in the following format.  Note, the first array index ('register') is for defining all the registers.  The
111
+	 * second array index is for indicating what routes each script/style loads on. array(
112
+	 * 'registers' => array(
113
+	 *        'script_ref' => array( // if more than one script is to be loaded its best to use the 'dependency'
114
+	 *        argument to link scripts together.
115
+	 *            'type' => 'js' // 'js' or 'css' (defaults to js).  This tells us what type of wp_function to use
116
+	 *            'url' => 'http://urltoscript.css.js',
117
+	 *            'depends' => array('jquery'), //an array of dependencies for the scripts. REMEMBER, if a script has
118
+	 *            already been registered elsewhere in the system.  You can just use the depends array to make sure it
119
+	 *            gets loaded before the one you are setting here.
120
+	 *            'footer' => TRUE //defaults to true (styles don't use this parameter)
121
+	 *        ),
122
+	 *    'enqueues' => array( //this time each key corresponds to the script ref followed by an array of page routes
123
+	 *    the script gets enqueued on.
124
+	 *        'script_ref' => array('route_one', 'route_two')
125
+	 *    ),
126
+	 *    'localize' => array( //this allows you to set a localize object.  Indicate which script the object is being
127
+	 *    attached to and then include an array indexed by the name of the object and the array of key/value pairs for
128
+	 *    the object.
129
+	 *        'scrip_ref' => array(
130
+	 *            'NAME_OF_JS_OBJECT' => array(
131
+	 *                'translate_ref' => __('localized_string', 'event_espresso'),
132
+	 *                'some_data' => 5
133
+	 *            )
134
+	 *        )
135
+	 *    )
136
+	 * )
137
+	 *
138
+	 * @var array
139
+	 */
140
+	protected $_scripts_styles;
141
+
142
+
143
+	/**
144
+	 * This is a property that will contain the current route.
145
+	 *
146
+	 * @var string;
147
+	 */
148
+	protected $_current_route;
149
+
150
+
151
+	/**
152
+	 * this optional property can be set by child classes to override the priority for the automatic action/filter hook
153
+	 * loading in the `_load_routed_hooks()` method.  Please follow this format: array(
154
+	 *    'wp_hook_reference' => 1
155
+	 *    )
156
+	 * )
157
+	 *
158
+	 * @var array
159
+	 */
160
+	protected $_wp_action_filters_priority;
161
+
162
+
163
+	/**
164
+	 * This just holds a merged array of the $_POST and $_GET vars in favor of $_POST
165
+	 *
166
+	 * @var array
167
+	 */
168
+	protected $_req_data;
169
+
170
+
171
+	/**
172
+	 * This just holds an instance of the page object for this hook
173
+	 *
174
+	 * @var EE_Admin_Page
175
+	 */
176
+	protected $_page_object;
177
+
178
+
179
+	/**
180
+	 * This holds the EE_Admin_Page object from the calling admin page that this object hooks into.
181
+	 *
182
+	 * @var EE_Admin_Page|EE_Admin_Page_CPT
183
+	 */
184
+	protected $_adminpage_obj;
185
+
186
+
187
+	/**
188
+	 * Holds EE_Registry object
189
+	 *
190
+	 * @var EE_Registry
191
+	 */
192
+	protected $EE = null;
193
+
194
+
195
+	/**
196
+	 * constructor
197
+	 *
198
+	 * @param EE_Admin_Page $admin_page the calling admin_page_object
199
+	 */
200
+	public function __construct(EE_Admin_Page $adminpage)
201
+	{
202
+		$this->_adminpage_obj = $adminpage;
203
+		$this->_req_data = array_merge($_GET, $_POST);
204
+		$this->_set_defaults();
205
+		$this->_set_hooks_properties();
206
+		// first let's verify we're on the right page
207
+		if (
208
+			! isset($this->_req_data['page'])
209
+			|| (isset($this->_req_data['page'])
210
+				&& $this->_adminpage_obj->page_slug
211
+				   != $this->_req_data['page'])
212
+		) {
213
+			return;
214
+		} //get out nothing more to be done here.
215
+		// allow for extends to modify properties
216
+		if (method_exists($this, '_extend_properties')) {
217
+			$this->_extend_properties();
218
+		}
219
+		$this->_set_page_object();
220
+		$this->_init_hooks();
221
+		$this->_load_custom_methods();
222
+		$this->_load_routed_hooks();
223
+		add_action('admin_enqueue_scripts', array($this, 'enqueue_scripts_styles'));
224
+		add_action('admin_enqueue_scripts', array($this, 'add_metaboxes'), 20);
225
+		add_action('admin_enqueue_scripts', array($this, 'remove_metaboxes'), 15);
226
+		$this->_ajax_hooks();
227
+	}
228
+
229
+
230
+	/**
231
+	 * used by child classes to set the following properties:
232
+	 * $_ajax_func (optional)
233
+	 * $_init_func (optional)
234
+	 * $_metaboxes (optional)
235
+	 * $_scripts (optional)
236
+	 * $_styles (optional)
237
+	 * $_name (required)
238
+	 * Also in this method will be registered any scripts or styles loaded on the targeted page (as indicated in the
239
+	 * _scripts/_styles properties) Also children should place in this method any filters/actions that have to happen
240
+	 * really early on page load (just after admin_init) if they want to have them registered for handling early.
241
+	 *
242
+	 * @access protected
243
+	 * @abstract
244
+	 * @return void
245
+	 */
246
+	abstract protected function _set_hooks_properties();
247
+
248
+
249
+	/**
250
+	 * The hooks for enqueue_scripts and enqueue_styles will be run in here.  Child classes need to define their
251
+	 * scripts and styles in the relevant $_scripts and $_styles properties.  Child classes must have also already
252
+	 * registered the scripts and styles using wp_register_script and wp_register_style functions.
253
+	 *
254
+	 * @access public
255
+	 * @return void
256
+	 */
257
+	public function enqueue_scripts_styles()
258
+	{
259
+		if (! empty($this->_scripts_styles)) {
260
+			// first let's do all the registrations
261
+			if (! isset($this->_scripts_styles['registers'])) {
262
+				$msg[] = __(
263
+					'There is no "registers" index in the <code>$this->_scripts_styles</code> property.',
264
+					'event_espresso'
265
+				);
266
+				$msg[] = sprintf(
267
+					__(
268
+						'Make sure you read the phpdoc comments above the definition of the $_scripts_styles property in the <code>EE_Admin_Hooks</code> class and modify according in the %s child',
269
+						'event_espresso'
270
+					),
271
+					'<strong>' . $this->caller . '</strong>'
272
+				);
273
+				throw new EE_Error(implode('||', $msg));
274
+			}
275
+			foreach ($this->_scripts_styles['registers'] as $ref => $details) {
276
+				$defaults = array(
277
+					'type'    => 'js',
278
+					'url'     => '',
279
+					'depends' => array(),
280
+					'version' => EVENT_ESPRESSO_VERSION,
281
+					'footer'  => true,
282
+				);
283
+				$details = wp_parse_args($details, $defaults);
284
+				extract($details);
285
+				// let's make sure that we set the 'registers' type if it's not set! We need it later to determine whhich enqueu we do
286
+				$this->_scripts_styles['registers'][ $ref ]['type'] = $type;
287
+				// let's make sure we're not missing any REQUIRED parameters
288
+				if (empty($url)) {
289
+					$msg[] = sprintf(
290
+						__('Missing the url for the requested %s', 'event_espresso'),
291
+						$type == 'js' ? 'script' : 'stylesheet'
292
+					);
293
+					$msg[] = sprintf(
294
+						__(
295
+							'Doublecheck your <code>$this->_scripts_styles</code> array in %s and make sure that there is a "url" set for the %s ref',
296
+							'event_espresso'
297
+						),
298
+						'<strong>' . $this->caller . '</strong>',
299
+						$ref
300
+					);
301
+					throw new EE_Error(implode('||', $msg));
302
+				}
303
+				// made it here so let's do the appropriate registration
304
+				$type == 'js'
305
+					? wp_register_script($ref, $url, $depends, $version, $footer)
306
+					: wp_register_style(
307
+						$ref,
308
+						$url,
309
+						$depends,
310
+						$version
311
+					);
312
+			}
313
+			// k now lets do the enqueues
314
+			if (! isset($this->_scripts_styles['enqueues'])) {
315
+				return;
316
+			}  //not sure if we should throw an error here or not.
317
+
318
+			foreach ($this->_scripts_styles['enqueues'] as $ref => $routes) {
319
+				// make sure $routes is an array
320
+				$routes = (array) $routes;
321
+				if (in_array($this->_current_route, $routes)) {
322
+					$this->_scripts_styles['registers'][ $ref ]['type'] == 'js' ? wp_enqueue_script($ref)
323
+						: wp_enqueue_style($ref);
324
+					// if we have a localization for the script let's do that too.
325
+					if (isset($this->_scripts_styles['localize'][ $ref ])) {
326
+						foreach ($this->_scripts_styles['localize'][ $ref ] as $object_name => $indexes) {
327
+							wp_localize_script(
328
+								$ref,
329
+								$object_name,
330
+								$this->_scripts_styles['localize'][ $ref ][ $object_name ]
331
+							);
332
+						}
333
+					}
334
+				}
335
+			}
336
+			// let's do the deregisters
337
+			if (! isset($this->_scripts_styles['deregisters'])) {
338
+				return;
339
+			}
340
+			foreach ($this->_scripts_styles['deregisters'] as $ref => $details) {
341
+				$defaults = array(
342
+					'type' => 'js',
343
+				);
344
+				$details = wp_parse_args($details, $defaults);
345
+				extract($details);
346
+				$type == 'js' ? wp_deregister_script($ref) : wp_deregister_style($ref);
347
+			}
348
+		}
349
+	}
350
+
351
+
352
+	/**
353
+	 * just set the defaults for the hooks properties.
354
+	 *
355
+	 * @access private
356
+	 * @return void
357
+	 */
358
+	private function _set_defaults()
359
+	{
360
+		$this->_ajax_func = $this->_init_func = $this->_metaboxes = $this->_scripts = $this->_styles = $this->_wp_action_filters_priority = array();
361
+		$this->_current_route = $this->getCurrentRoute();
362
+		$this->caller = get_class($this);
363
+		$this->_extend = stripos($this->caller, 'Extend') ? true : false;
364
+	}
365
+
366
+
367
+	/**
368
+	 * A helper for determining the current route.
369
+	 * @return string
370
+	 */
371
+	private function getCurrentRoute()
372
+	{
373
+		// list tables do something else with 'action' for bulk actions.
374
+		$action = ! empty($_REQUEST['action']) && $_REQUEST['action'] !== '-1' ? $_REQUEST['action'] : 'default';
375
+		// we set a 'route' variable in some cases where action is being used by something else.
376
+		$action = $action === 'default' && isset($_REQUEST['route']) ? $_REQUEST['route'] : $action;
377
+		return sanitize_key($action);
378
+	}
379
+
380
+
381
+	/**
382
+	 * this sets the _page_object property
383
+	 *
384
+	 * @access protected
385
+	 * @return void
386
+	 */
387
+	protected function _set_page_object()
388
+	{
389
+		// first make sure $this->_name is set
390
+		if (empty($this->_name)) {
391
+			$msg[] = __('We can\'t load the page object', 'event_espresso');
392
+			$msg[] = sprintf(
393
+				__("This is because the %s child class has not set the '_name' property", 'event_espresso'),
394
+				$this->caller
395
+			);
396
+			throw new EE_Error(implode('||', $msg));
397
+		}
398
+		$ref = str_replace('_', ' ', $this->_name); // take the_message -> the message
399
+		$ref = str_replace(' ', '_', ucwords($ref)) . '_Admin_Page'; // take the message -> The_Message
400
+		// first default file (if exists)
401
+		$decaf_file = EE_ADMIN_PAGES . $this->_name . '/' . $ref . '.core.php';
402
+		if (is_readable($decaf_file)) {
403
+			require_once($decaf_file);
404
+		}
405
+		// now we have to do require for extended file (if needed)
406
+		if ($this->_extend) {
407
+			require_once(EE_CORE_CAF_ADMIN_EXTEND . $this->_name . '/Extend_' . $ref . '.core.php');
408
+		}
409
+		// if we've got an extended class we use that!
410
+		$ref = $this->_extend ? 'Extend_' . $ref : $ref;
411
+		// let's make sure the class exists
412
+		if (! class_exists($ref)) {
413
+			$msg[] = __('We can\'t load the page object', 'event_espresso');
414
+			$msg[] = sprintf(
415
+				__(
416
+					'The class name that was given is %s. Check the spelling and make sure its correct, also there needs to be an autoloader setup for the class',
417
+					'event_espresso'
418
+				),
419
+				$ref
420
+			);
421
+			throw new EE_Error(implode('||', $msg));
422
+		}
423
+		$a = new ReflectionClass($ref);
424
+		$this->_page_object = $a->newInstance(false);
425
+	}
426
+
427
+
428
+	/**
429
+	 * Child "hook" classes can declare any methods that they want executed when a specific page route is loaded.  The
430
+	 * advantage of this is when doing things like running our own db interactions on saves etc.  Remember that
431
+	 * $this->_req_data (all the _POST and _GET data) is available to your methods.
432
+	 *
433
+	 * @access private
434
+	 * @return void
435
+	 */
436
+	private function _load_custom_methods()
437
+	{
438
+		/**
439
+		 * method cannot be named 'default' (@see http://us3.php
440
+		 * .net/manual/en/reserved.keywords.php) so need to
441
+		 * handle routes that are "default"
442
+		 *
443
+		 * @since 4.3.0
444
+		 */
445
+		$method_callback = $this->_current_route == 'default' ? 'default_callback' : $this->_current_route;
446
+		// these run before the Admin_Page route executes.
447
+		if (method_exists($this, $method_callback)) {
448
+			call_user_func(array($this, $method_callback));
449
+		}
450
+		// these run via the _redirect_after_action method in EE_Admin_Page which usually happens after non_UI methods in EE_Admin_Page classes.  There are two redirect actions, the first fires before $query_args might be manipulated by "save and close" actions and the seond fires right before the actual redirect happens.
451
+		// first the actions
452
+		// note that these action hooks will have the $query_args value available.
453
+		$admin_class_name = get_class($this->_adminpage_obj);
454
+		if (method_exists($this, '_redirect_action_early_' . $this->_current_route)) {
455
+			add_action(
456
+				'AHEE__'
457
+				. $admin_class_name
458
+				. '___redirect_after_action__before_redirect_modification_'
459
+				. $this->_current_route,
460
+				array($this, '_redirect_action_early_' . $this->_current_route),
461
+				10
462
+			);
463
+		}
464
+		if (method_exists($this, '_redirect_action_' . $this->_current_route)) {
465
+			add_action(
466
+				'AHEE_redirect_' . $admin_class_name . $this->_current_route,
467
+				array($this, '_redirect_action_' . $this->_current_route),
468
+				10
469
+			);
470
+		}
471
+		// let's hook into the _redirect itself and allow for changing where the user goes after redirect.  This will have $query_args and $redirect_url available.
472
+		if (method_exists($this, '_redirect_filter_' . $this->_current_route)) {
473
+			add_filter(
474
+				'FHEE_redirect_' . $admin_class_name . $this->_current_route,
475
+				array($this, '_redirect_filter_' . $this->_current_route),
476
+				10,
477
+				2
478
+			);
479
+		}
480
+	}
481
+
482
+
483
+	/**
484
+	 * This method will search for a corresponding method with a name matching the route and the wp_hook to run.  This
485
+	 * allows child hook classes to target hooking into a specific wp action or filter hook ONLY on a certain route.
486
+	 * just remember, methods MUST be public Future hooks should be added in here to be access by child classes.
487
+	 *
488
+	 * @return void
489
+	 */
490
+	private function _load_routed_hooks()
491
+	{
492
+
493
+		// this array provides the hook action names that will be referenced.  Key is the action. Value is an array with the type (action or filter) and the number of parameters for the hook.  We'll default all priorities for automatic hooks to 10.
494
+		$hook_filter_array = array(
495
+			'admin_footer'                                                                            => array(
496
+				'type'     => 'action',
497
+				'argnum'   => 1,
498
+				'priority' => 10,
499
+			),
500
+			'FHEE_list_table_views_' . $this->_adminpage_obj->page_slug . '_' . $this->_current_route => array(
501
+				'type'     => 'filter',
502
+				'argnum'   => 1,
503
+				'priority' => 10,
504
+			),
505
+			'FHEE_list_table_views_' . $this->_adminpage_obj->page_slug                               => array(
506
+				'type'     => 'filter',
507
+				'argnum'   => 1,
508
+				'priority' => 10,
509
+			),
510
+			'FHEE_list_table_views'                                                                   => array(
511
+				'type'     => 'filter',
512
+				'argnum'   => 1,
513
+				'priority' => 10,
514
+			),
515
+			'AHEE__EE_Admin_Page___display_admin_page__modify_metaboxes'                              => array(
516
+				'type'     => 'action',
517
+				'argnum'   => 1,
518
+				'priority' => 10,
519
+			),
520
+		);
521
+		foreach ($hook_filter_array as $hook => $args) {
522
+			if (method_exists($this, $this->_current_route . '_' . $hook)) {
523
+				if (isset($this->_wp_action_filters_priority[ $hook ])) {
524
+					$args['priority'] = $this->_wp_action_filters_priority[ $hook ];
525
+				}
526
+				if ($args['type'] == 'action') {
527
+					add_action(
528
+						$hook,
529
+						array($this, $this->_current_route . '_' . $hook),
530
+						$args['priority'],
531
+						$args['argnum']
532
+					);
533
+				} else {
534
+					add_filter(
535
+						$hook,
536
+						array($this, $this->_current_route . '_' . $hook),
537
+						$args['priority'],
538
+						$args['argnum']
539
+					);
540
+				}
541
+			}
542
+		}
543
+	}
544
+
545
+
546
+	/**
547
+	 * Loop throught the $_ajax_func array and add_actions for the array.
548
+	 *
549
+	 * @return void
550
+	 */
551
+	private function _ajax_hooks()
552
+	{
553
+		if (empty($this->_ajax_func)) {
554
+			return;
555
+		} //get out there's nothing to take care of.
556
+		foreach ($this->_ajax_func as $action => $method) {
557
+			// make sure method exists
558
+			if (! method_exists($this, $method)) {
559
+				$msg[] = __(
560
+					'There is no corresponding method for the hook labeled in the _ajax_func array',
561
+					'event_espresso'
562
+				) . '<br />';
563
+				$msg[] = sprintf(
564
+					__(
565
+						'The method name given in the array is %s, check the spelling and make sure it exists in the %s class',
566
+						'event_espresso'
567
+					),
568
+					$method,
569
+					$this->caller
570
+				);
571
+				throw new EE_Error(implode('||', $msg));
572
+			}
573
+			add_action('wp_ajax_' . $action, array($this, $method));
574
+		}
575
+	}
576
+
577
+
578
+	/**
579
+	 * Loop throught the $_init_func array and add_actions for the array.
580
+	 *
581
+	 * @return void
582
+	 */
583
+	protected function _init_hooks()
584
+	{
585
+		if (empty($this->_init_func)) {
586
+			return;
587
+		} //get out there's nothing to take care of.
588
+		// We need to determine what page_route we are on!
589
+		$current_route = isset($_REQUEST['action']) ? $_REQUEST['action'] : 'default';
590
+		foreach ($this->_init_func as $route => $method) {
591
+			// make sure method exists
592
+			if (! method_exists($this, $method)) {
593
+				$msg[] = __(
594
+					'There is no corresponding method for the hook labeled in the _init_func array',
595
+					'event_espresso'
596
+				) . '<br />';
597
+				$msg[] = sprintf(
598
+					__(
599
+						'The method name given in the array is %s, check the spelling and make sure it exists in the %s class',
600
+						'event_espresso'
601
+					),
602
+					$method,
603
+					$this->caller
604
+				);
605
+				throw new EE_Error(implode('||', $msg));
606
+			}
607
+			if ($route == $this->_current_route) {
608
+				add_action('admin_init', array($this, $method));
609
+			}
610
+		}
611
+	}
612
+
613
+
614
+	/**
615
+	 * Loop through the _metaboxes property and add_metaboxes accordingly
616
+	 * //todo we could eventually make this a config component class (i.e. new EE_Metabox);
617
+	 *
618
+	 * @access public
619
+	 * @return void
620
+	 */
621
+	public function add_metaboxes()
622
+	{
623
+		if (empty($this->_metaboxes)) {
624
+			return;
625
+		} //get out we don't have any metaboxes to set for this connection
626
+		$this->_handle_metabox_array($this->_metaboxes);
627
+	}
628
+
629
+
630
+	private function _handle_metabox_array($boxes, $add = true)
631
+	{
632
+		foreach ($boxes as $box) {
633
+			if (! isset($box['page_route'])) {
634
+				continue;
635
+			} //we dont' have a valid array
636
+			// let's make sure $box['page_route'] is an array so the "foreach" will work.
637
+			$box['page_route'] = (array) $box['page_route'];
638
+			foreach ($box['page_route'] as $route) {
639
+				if ($route != $this->_current_route) {
640
+					continue;
641
+				} //get out we only add metaboxes for set route.
642
+				if ($add) {
643
+					$this->_add_metabox($box);
644
+				} else {
645
+					$this->_remove_metabox($box);
646
+				}
647
+			}
648
+		}
649
+	}
650
+
651
+
652
+	/**
653
+	 * Loop through the _remove_metaboxes property and remove metaboxes accordingly.
654
+	 *
655
+	 * @access public
656
+	 * @return void
657
+	 */
658
+	public function remove_metaboxes()
659
+	{
660
+		if (empty($this->_remove_metaboxes)) {
661
+			return;
662
+		} //get out there are no metaboxes to remove
663
+		$this->_handle_metabox_array($this->_remove_metaboxes, false);
664
+	}
665
+
666
+
667
+	/**
668
+	 * This just handles adding a metabox
669
+	 *
670
+	 * @access private
671
+	 * @param array $args an array of args that have been set for this metabox by the child class
672
+	 */
673
+	private function _add_metabox($args)
674
+	{
675
+		$current_screen = get_current_screen();
676
+		$screen_id = is_object($current_screen) ? $current_screen->id : null;
677
+		$func = isset($args['func']) ? $args['func'] : 'some_invalid_callback';
678
+		// set defaults
679
+		$defaults = array(
680
+			'func'          => $func,
681
+			'id'            => $this->caller . '_' . $func . '_metabox',
682
+			'priority'      => 'default',
683
+			'label'         => $this->caller,
684
+			'context'       => 'advanced',
685
+			'callback_args' => array(),
686
+			'page'          => isset($args['page']) ? $args['page'] : $screen_id,
687
+		);
688
+		$args = wp_parse_args($args, $defaults);
689
+		extract($args);
690
+		// make sure method exists
691
+		if (! method_exists($this, $func)) {
692
+			$msg[] = __('There is no corresponding method to display the metabox content', 'event_espresso') . '<br />';
693
+			$msg[] = sprintf(
694
+				__(
695
+					'The method name given in the array is %s, check the spelling and make sure it exists in the %s class',
696
+					'event_espresso'
697
+				),
698
+				$func,
699
+				$this->caller
700
+			);
701
+			throw new EE_Error(implode('||', $msg));
702
+		}
703
+		// everything checks out so lets add the metabox
704
+		add_meta_box($id, $label, array($this, $func), $page, $context, $priority, $callback_args);
705
+	}
706
+
707
+
708
+	private function _remove_metabox($args)
709
+	{
710
+		$current_screen = get_current_screen();
711
+		$screen_id = is_object($current_screen) ? $current_screen->id : null;
712
+		$func = isset($args['func']) ? $args['func'] : 'some_invalid_callback';
713
+		// set defaults
714
+		$defaults = array(
715
+			'id'      => isset($args['id'])
716
+				? $args['id']
717
+				: $this->_current_route
718
+				  . '_'
719
+				  . $this->caller
720
+				  . '_'
721
+				  . $func
722
+				  . '_metabox',
723
+			'context' => 'default',
724
+			'screen'  => isset($args['screen']) ? $args['screen'] : $screen_id,
725
+		);
726
+		$args = wp_parse_args($args, $defaults);
727
+		extract($args);
728
+		// everything checks out so lets remove the box!
729
+		remove_meta_box($id, $screen, $context);
730
+	}
731 731
 }
Please login to merge, or discard this patch.
Spacing   +40 added lines, -40 removed lines patch added patch discarded remove patch
@@ -256,9 +256,9 @@  discard block
 block discarded – undo
256 256
      */
257 257
     public function enqueue_scripts_styles()
258 258
     {
259
-        if (! empty($this->_scripts_styles)) {
259
+        if ( ! empty($this->_scripts_styles)) {
260 260
             // first let's do all the registrations
261
-            if (! isset($this->_scripts_styles['registers'])) {
261
+            if ( ! isset($this->_scripts_styles['registers'])) {
262 262
                 $msg[] = __(
263 263
                     'There is no "registers" index in the <code>$this->_scripts_styles</code> property.',
264 264
                     'event_espresso'
@@ -268,7 +268,7 @@  discard block
 block discarded – undo
268 268
                         'Make sure you read the phpdoc comments above the definition of the $_scripts_styles property in the <code>EE_Admin_Hooks</code> class and modify according in the %s child',
269 269
                         'event_espresso'
270 270
                     ),
271
-                    '<strong>' . $this->caller . '</strong>'
271
+                    '<strong>'.$this->caller.'</strong>'
272 272
                 );
273 273
                 throw new EE_Error(implode('||', $msg));
274 274
             }
@@ -283,7 +283,7 @@  discard block
 block discarded – undo
283 283
                 $details = wp_parse_args($details, $defaults);
284 284
                 extract($details);
285 285
                 // let's make sure that we set the 'registers' type if it's not set! We need it later to determine whhich enqueu we do
286
-                $this->_scripts_styles['registers'][ $ref ]['type'] = $type;
286
+                $this->_scripts_styles['registers'][$ref]['type'] = $type;
287 287
                 // let's make sure we're not missing any REQUIRED parameters
288 288
                 if (empty($url)) {
289 289
                     $msg[] = sprintf(
@@ -295,7 +295,7 @@  discard block
 block discarded – undo
295 295
                             'Doublecheck your <code>$this->_scripts_styles</code> array in %s and make sure that there is a "url" set for the %s ref',
296 296
                             'event_espresso'
297 297
                         ),
298
-                        '<strong>' . $this->caller . '</strong>',
298
+                        '<strong>'.$this->caller.'</strong>',
299 299
                         $ref
300 300
                     );
301 301
                     throw new EE_Error(implode('||', $msg));
@@ -311,7 +311,7 @@  discard block
 block discarded – undo
311 311
                     );
312 312
             }
313 313
             // k now lets do the enqueues
314
-            if (! isset($this->_scripts_styles['enqueues'])) {
314
+            if ( ! isset($this->_scripts_styles['enqueues'])) {
315 315
                 return;
316 316
             }  //not sure if we should throw an error here or not.
317 317
 
@@ -319,22 +319,22 @@  discard block
 block discarded – undo
319 319
                 // make sure $routes is an array
320 320
                 $routes = (array) $routes;
321 321
                 if (in_array($this->_current_route, $routes)) {
322
-                    $this->_scripts_styles['registers'][ $ref ]['type'] == 'js' ? wp_enqueue_script($ref)
322
+                    $this->_scripts_styles['registers'][$ref]['type'] == 'js' ? wp_enqueue_script($ref)
323 323
                         : wp_enqueue_style($ref);
324 324
                     // if we have a localization for the script let's do that too.
325
-                    if (isset($this->_scripts_styles['localize'][ $ref ])) {
326
-                        foreach ($this->_scripts_styles['localize'][ $ref ] as $object_name => $indexes) {
325
+                    if (isset($this->_scripts_styles['localize'][$ref])) {
326
+                        foreach ($this->_scripts_styles['localize'][$ref] as $object_name => $indexes) {
327 327
                             wp_localize_script(
328 328
                                 $ref,
329 329
                                 $object_name,
330
-                                $this->_scripts_styles['localize'][ $ref ][ $object_name ]
330
+                                $this->_scripts_styles['localize'][$ref][$object_name]
331 331
                             );
332 332
                         }
333 333
                     }
334 334
                 }
335 335
             }
336 336
             // let's do the deregisters
337
-            if (! isset($this->_scripts_styles['deregisters'])) {
337
+            if ( ! isset($this->_scripts_styles['deregisters'])) {
338 338
                 return;
339 339
             }
340 340
             foreach ($this->_scripts_styles['deregisters'] as $ref => $details) {
@@ -396,20 +396,20 @@  discard block
 block discarded – undo
396 396
             throw new EE_Error(implode('||', $msg));
397 397
         }
398 398
         $ref = str_replace('_', ' ', $this->_name); // take the_message -> the message
399
-        $ref = str_replace(' ', '_', ucwords($ref)) . '_Admin_Page'; // take the message -> The_Message
399
+        $ref = str_replace(' ', '_', ucwords($ref)).'_Admin_Page'; // take the message -> The_Message
400 400
         // first default file (if exists)
401
-        $decaf_file = EE_ADMIN_PAGES . $this->_name . '/' . $ref . '.core.php';
401
+        $decaf_file = EE_ADMIN_PAGES.$this->_name.'/'.$ref.'.core.php';
402 402
         if (is_readable($decaf_file)) {
403 403
             require_once($decaf_file);
404 404
         }
405 405
         // now we have to do require for extended file (if needed)
406 406
         if ($this->_extend) {
407
-            require_once(EE_CORE_CAF_ADMIN_EXTEND . $this->_name . '/Extend_' . $ref . '.core.php');
407
+            require_once(EE_CORE_CAF_ADMIN_EXTEND.$this->_name.'/Extend_'.$ref.'.core.php');
408 408
         }
409 409
         // if we've got an extended class we use that!
410
-        $ref = $this->_extend ? 'Extend_' . $ref : $ref;
410
+        $ref = $this->_extend ? 'Extend_'.$ref : $ref;
411 411
         // let's make sure the class exists
412
-        if (! class_exists($ref)) {
412
+        if ( ! class_exists($ref)) {
413 413
             $msg[] = __('We can\'t load the page object', 'event_espresso');
414 414
             $msg[] = sprintf(
415 415
                 __(
@@ -451,28 +451,28 @@  discard block
 block discarded – undo
451 451
         // first the actions
452 452
         // note that these action hooks will have the $query_args value available.
453 453
         $admin_class_name = get_class($this->_adminpage_obj);
454
-        if (method_exists($this, '_redirect_action_early_' . $this->_current_route)) {
454
+        if (method_exists($this, '_redirect_action_early_'.$this->_current_route)) {
455 455
             add_action(
456 456
                 'AHEE__'
457 457
                 . $admin_class_name
458 458
                 . '___redirect_after_action__before_redirect_modification_'
459 459
                 . $this->_current_route,
460
-                array($this, '_redirect_action_early_' . $this->_current_route),
460
+                array($this, '_redirect_action_early_'.$this->_current_route),
461 461
                 10
462 462
             );
463 463
         }
464
-        if (method_exists($this, '_redirect_action_' . $this->_current_route)) {
464
+        if (method_exists($this, '_redirect_action_'.$this->_current_route)) {
465 465
             add_action(
466
-                'AHEE_redirect_' . $admin_class_name . $this->_current_route,
467
-                array($this, '_redirect_action_' . $this->_current_route),
466
+                'AHEE_redirect_'.$admin_class_name.$this->_current_route,
467
+                array($this, '_redirect_action_'.$this->_current_route),
468 468
                 10
469 469
             );
470 470
         }
471 471
         // let's hook into the _redirect itself and allow for changing where the user goes after redirect.  This will have $query_args and $redirect_url available.
472
-        if (method_exists($this, '_redirect_filter_' . $this->_current_route)) {
472
+        if (method_exists($this, '_redirect_filter_'.$this->_current_route)) {
473 473
             add_filter(
474
-                'FHEE_redirect_' . $admin_class_name . $this->_current_route,
475
-                array($this, '_redirect_filter_' . $this->_current_route),
474
+                'FHEE_redirect_'.$admin_class_name.$this->_current_route,
475
+                array($this, '_redirect_filter_'.$this->_current_route),
476 476
                 10,
477 477
                 2
478 478
             );
@@ -497,12 +497,12 @@  discard block
 block discarded – undo
497 497
                 'argnum'   => 1,
498 498
                 'priority' => 10,
499 499
             ),
500
-            'FHEE_list_table_views_' . $this->_adminpage_obj->page_slug . '_' . $this->_current_route => array(
500
+            'FHEE_list_table_views_'.$this->_adminpage_obj->page_slug.'_'.$this->_current_route => array(
501 501
                 'type'     => 'filter',
502 502
                 'argnum'   => 1,
503 503
                 'priority' => 10,
504 504
             ),
505
-            'FHEE_list_table_views_' . $this->_adminpage_obj->page_slug                               => array(
505
+            'FHEE_list_table_views_'.$this->_adminpage_obj->page_slug                               => array(
506 506
                 'type'     => 'filter',
507 507
                 'argnum'   => 1,
508 508
                 'priority' => 10,
@@ -519,21 +519,21 @@  discard block
 block discarded – undo
519 519
             ),
520 520
         );
521 521
         foreach ($hook_filter_array as $hook => $args) {
522
-            if (method_exists($this, $this->_current_route . '_' . $hook)) {
523
-                if (isset($this->_wp_action_filters_priority[ $hook ])) {
524
-                    $args['priority'] = $this->_wp_action_filters_priority[ $hook ];
522
+            if (method_exists($this, $this->_current_route.'_'.$hook)) {
523
+                if (isset($this->_wp_action_filters_priority[$hook])) {
524
+                    $args['priority'] = $this->_wp_action_filters_priority[$hook];
525 525
                 }
526 526
                 if ($args['type'] == 'action') {
527 527
                     add_action(
528 528
                         $hook,
529
-                        array($this, $this->_current_route . '_' . $hook),
529
+                        array($this, $this->_current_route.'_'.$hook),
530 530
                         $args['priority'],
531 531
                         $args['argnum']
532 532
                     );
533 533
                 } else {
534 534
                     add_filter(
535 535
                         $hook,
536
-                        array($this, $this->_current_route . '_' . $hook),
536
+                        array($this, $this->_current_route.'_'.$hook),
537 537
                         $args['priority'],
538 538
                         $args['argnum']
539 539
                     );
@@ -555,11 +555,11 @@  discard block
 block discarded – undo
555 555
         } //get out there's nothing to take care of.
556 556
         foreach ($this->_ajax_func as $action => $method) {
557 557
             // make sure method exists
558
-            if (! method_exists($this, $method)) {
558
+            if ( ! method_exists($this, $method)) {
559 559
                 $msg[] = __(
560 560
                     'There is no corresponding method for the hook labeled in the _ajax_func array',
561 561
                     'event_espresso'
562
-                ) . '<br />';
562
+                ).'<br />';
563 563
                 $msg[] = sprintf(
564 564
                     __(
565 565
                         'The method name given in the array is %s, check the spelling and make sure it exists in the %s class',
@@ -570,7 +570,7 @@  discard block
 block discarded – undo
570 570
                 );
571 571
                 throw new EE_Error(implode('||', $msg));
572 572
             }
573
-            add_action('wp_ajax_' . $action, array($this, $method));
573
+            add_action('wp_ajax_'.$action, array($this, $method));
574 574
         }
575 575
     }
576 576
 
@@ -589,11 +589,11 @@  discard block
 block discarded – undo
589 589
         $current_route = isset($_REQUEST['action']) ? $_REQUEST['action'] : 'default';
590 590
         foreach ($this->_init_func as $route => $method) {
591 591
             // make sure method exists
592
-            if (! method_exists($this, $method)) {
592
+            if ( ! method_exists($this, $method)) {
593 593
                 $msg[] = __(
594 594
                     'There is no corresponding method for the hook labeled in the _init_func array',
595 595
                     'event_espresso'
596
-                ) . '<br />';
596
+                ).'<br />';
597 597
                 $msg[] = sprintf(
598 598
                     __(
599 599
                         'The method name given in the array is %s, check the spelling and make sure it exists in the %s class',
@@ -630,7 +630,7 @@  discard block
 block discarded – undo
630 630
     private function _handle_metabox_array($boxes, $add = true)
631 631
     {
632 632
         foreach ($boxes as $box) {
633
-            if (! isset($box['page_route'])) {
633
+            if ( ! isset($box['page_route'])) {
634 634
                 continue;
635 635
             } //we dont' have a valid array
636 636
             // let's make sure $box['page_route'] is an array so the "foreach" will work.
@@ -678,7 +678,7 @@  discard block
 block discarded – undo
678 678
         // set defaults
679 679
         $defaults = array(
680 680
             'func'          => $func,
681
-            'id'            => $this->caller . '_' . $func . '_metabox',
681
+            'id'            => $this->caller.'_'.$func.'_metabox',
682 682
             'priority'      => 'default',
683 683
             'label'         => $this->caller,
684 684
             'context'       => 'advanced',
@@ -688,8 +688,8 @@  discard block
 block discarded – undo
688 688
         $args = wp_parse_args($args, $defaults);
689 689
         extract($args);
690 690
         // make sure method exists
691
-        if (! method_exists($this, $func)) {
692
-            $msg[] = __('There is no corresponding method to display the metabox content', 'event_espresso') . '<br />';
691
+        if ( ! method_exists($this, $func)) {
692
+            $msg[] = __('There is no corresponding method to display the metabox content', 'event_espresso').'<br />';
693 693
             $msg[] = sprintf(
694 694
                 __(
695 695
                     'The method name given in the array is %s, check the spelling and make sure it exists in the %s class',
Please login to merge, or discard this patch.
core/libraries/messages/EE_message_type.lib.php 3 patches
Doc Comments   +1 added lines, -1 removed lines patch added patch discarded remove patch
@@ -832,7 +832,7 @@
 block discarded – undo
832 832
      * Takes care of setting up the addressee object(s) for the primary attendee.
833 833
      *
834 834
      * @access protected
835
-     * @return array of EE_Addressee objects
835
+     * @return EE_Messages_Addressee[] of EE_Addressee objects
836 836
      * @throws EE_Error
837 837
      */
838 838
     protected function _primary_attendee_addressees()
Please login to merge, or discard this patch.
Spacing   +29 added lines, -29 removed lines patch added patch discarded remove patch
@@ -408,7 +408,7 @@  discard block
 block discarded – undo
408 408
     {
409 409
         // validate context
410 410
         // valid context?
411
-        if (! isset($this->_contexts[ $context ])) {
411
+        if ( ! isset($this->_contexts[$context])) {
412 412
             throw new EE_Error(
413 413
                 sprintf(
414 414
                     __('The context %s is not a valid context for %s.', 'event_espresso'),
@@ -464,7 +464,7 @@  discard block
 block discarded – undo
464 464
     public function get_data_for_context($context, EE_Registration $registration, $id = 0)
465 465
     {
466 466
         // valid context?
467
-        if (! isset($this->_contexts[ $context ])) {
467
+        if ( ! isset($this->_contexts[$context])) {
468 468
             throw new EE_Error(
469 469
                 sprintf(
470 470
                     __('The context %s is not a valid context for %s.', 'event_espresso'),
@@ -479,7 +479,7 @@  discard block
 block discarded – undo
479 479
             $this->_get_data_for_context($context, $registration, $id),
480 480
             $this
481 481
         );
482
-        $data = apply_filters('FHEE__' . get_class($this) . '__get_data_for_context__data', $data, $this);
482
+        $data = apply_filters('FHEE__'.get_class($this).'__get_data_for_context__data', $data, $this);
483 483
         // if empty then something went wrong!
484 484
         if (empty($data)) {
485 485
             throw new EE_Error(
@@ -539,7 +539,7 @@  discard block
 block discarded – undo
539 539
     public function with_messengers()
540 540
     {
541 541
         return apply_filters(
542
-            'FHEE__EE_message_type__get_with_messengers__with_messengers__' . get_class($this),
542
+            'FHEE__EE_message_type__get_with_messengers__with_messengers__'.get_class($this),
543 543
             $this->_with_messengers
544 544
         );
545 545
     }
@@ -600,7 +600,7 @@  discard block
 block discarded – undo
600 600
     {
601 601
         // first class specific filter then filter that by the global filter.
602 602
         $master_templates = apply_filters(
603
-            'FHEE__' . get_class($this) . '__get_master_templates',
603
+            'FHEE__'.get_class($this).'__get_master_templates',
604 604
             $this->_master_templates
605 605
         );
606 606
         return apply_filters('FHEE__EE_message_type__get_master_templates', $master_templates, $this);
@@ -624,11 +624,11 @@  discard block
 block discarded – undo
624 624
         $addressees        = array();
625 625
         $original_contexts = $this->_contexts;
626 626
         // if incoming context then limit to that context
627
-        if (! empty($context)) {
628
-            $cntxt = ! empty($this->_contexts[ $context ]) ? $this->_contexts[ $context ] : '';
629
-            if (! empty($cntxt)) {
630
-                $this->_contexts           = array();
631
-                $this->_contexts[ $context ] = $cntxt;
627
+        if ( ! empty($context)) {
628
+            $cntxt = ! empty($this->_contexts[$context]) ? $this->_contexts[$context] : '';
629
+            if ( ! empty($cntxt)) {
630
+                $this->_contexts = array();
631
+                $this->_contexts[$context] = $cntxt;
632 632
             }
633 633
         }
634 634
         $this->_set_default_addressee_data();
@@ -653,13 +653,13 @@  discard block
 block discarded – undo
653 653
     {
654 654
         // at a minimum, we NEED EE_Attendee objects.
655 655
         if (empty($this->_data->attendees)) {
656
-            return false;  // there's no data to process!
656
+            return false; // there's no data to process!
657 657
         }
658 658
         // process addressees for each context.  Child classes will have to have methods for
659 659
         // each context defined to handle the processing of the data object within them
660 660
         foreach ($this->_contexts as $context => $details) {
661
-            $xpctd_method = '_' . $context . '_addressees';
662
-            if (! method_exists($this, $xpctd_method)) {
661
+            $xpctd_method = '_'.$context.'_addressees';
662
+            if ( ! method_exists($this, $xpctd_method)) {
663 663
                 throw new EE_Error(
664 664
                     sprintf(
665 665
                         __(
@@ -671,7 +671,7 @@  discard block
 block discarded – undo
671 671
                     )
672 672
                 );
673 673
             }
674
-            $this->_addressees[ $context ] = call_user_func(array($this, $xpctd_method));
674
+            $this->_addressees[$context] = call_user_func(array($this, $xpctd_method));
675 675
         }
676 676
         return true; // data was processed successfully.
677 677
     }
@@ -707,7 +707,7 @@  discard block
 block discarded – undo
707 707
             'total_ticket_count'       => $this->_data->total_ticket_count,
708 708
         );
709 709
         if (is_array($this->_data->primary_attendee_data)) {
710
-            $this->_default_addressee_data                    = array_merge(
710
+            $this->_default_addressee_data = array_merge(
711 711
                 $this->_default_addressee_data,
712 712
                 $this->_data->primary_attendee_data
713 713
             );
@@ -750,25 +750,25 @@  discard block
 block discarded – undo
750 750
             'email',
751 751
             'messenger',
752 752
         );
753
-        $contexts       = $this->get_contexts();
753
+        $contexts = $this->get_contexts();
754 754
         foreach ($contexts as $context => $details) {
755
-            $this->_valid_shortcodes[ $context ] = $all_shortcodes;
755
+            $this->_valid_shortcodes[$context] = $all_shortcodes;
756 756
             // make sure non admin context does not include the event_author shortcodes
757 757
             if ($context != 'admin') {
758
-                if (($key = array_search('event_author', $this->_valid_shortcodes[ $context ])) !== false) {
759
-                    unset($this->_valid_shortcodes[ $context ][ $key ]);
758
+                if (($key = array_search('event_author', $this->_valid_shortcodes[$context])) !== false) {
759
+                    unset($this->_valid_shortcodes[$context][$key]);
760 760
                 }
761 761
             }
762 762
         }
763 763
         // make sure admin context does not include the recipient_details shortcodes
764 764
         // IF we have admin context hooked in message types might not have that context.
765
-        if (! empty($this->_valid_shortcodes['admin'])) {
765
+        if ( ! empty($this->_valid_shortcodes['admin'])) {
766 766
             if (($key = array_search('recipient_details', $this->_valid_shortcodes['admin'])) !== false) {
767
-                unset($this->_valid_shortcodes['admin'][ $key ]);
767
+                unset($this->_valid_shortcodes['admin'][$key]);
768 768
             }
769 769
             // make sure admin context does not include the recipient_details shortcodes
770 770
             if (($key = array_search('recipient_list', $this->_valid_shortcodes['admin'])) !== false) {
771
-                unset($this->_valid_shortcodes['admin'][ $key ]);
771
+                unset($this->_valid_shortcodes['admin'][$key]);
772 772
             }
773 773
         }
774 774
     }
@@ -783,7 +783,7 @@  discard block
 block discarded – undo
783 783
     public function reset_valid_shortcodes_config($new_config)
784 784
     {
785 785
         foreach ($new_config as $context => $shortcodes) {
786
-            $this->_valid_shortcodes[ $context ] = $shortcodes;
786
+            $this->_valid_shortcodes[$context] = $shortcodes;
787 787
         }
788 788
     }
789 789
 
@@ -807,11 +807,11 @@  discard block
 block discarded – undo
807 807
         foreach ($this->_data->events as $line_ref => $event) {
808 808
             $admin_id = $this->_get_event_admin_id($event['ID']);
809 809
             // make sure we are just including the events that belong to this admin!
810
-            $admin_events[ $admin_id ][ $line_ref ] = $event;
810
+            $admin_events[$admin_id][$line_ref] = $event;
811 811
         }
812 812
         // k now we can loop through the event_admins and setup the addressee data.
813 813
         foreach ($admin_events as $admin_id => $event_details) {
814
-            $aee          = array(
814
+            $aee = array(
815 815
                 'user_id'        => $admin_id,
816 816
                 'events'         => $event_details,
817 817
                 'attendees'      => $this->_data->attendees,
@@ -868,7 +868,7 @@  discard block
 block discarded – undo
868 868
             }
869 869
             // is $this->_regs_for_sending present?
870 870
             // If so, let's make sure we ONLY generate addressee for registrations in that array.
871
-            if (! empty($this->_regs_for_sending) && is_array($this->_regs_for_sending)) {
871
+            if ( ! empty($this->_regs_for_sending) && is_array($this->_regs_for_sending)) {
872 872
                 $regs_allowed = array_intersect_key(array_flip($this->_regs_for_sending), $details['reg_objs']);
873 873
                 if (empty($regs_allowed)) {
874 874
                     continue;
@@ -886,10 +886,10 @@  discard block
 block discarded – undo
886 886
             }
887 887
             $already_processed[] = $att_id;
888 888
             foreach ($details as $item => $value) {
889
-                $aee[ $item ] = $value;
889
+                $aee[$item] = $value;
890 890
                 if ($item === 'line_ref') {
891 891
                     foreach ($value as $event_id) {
892
-                        $aee['events'][ $event_id ] = $this->_data->events[ $event_id ];
892
+                        $aee['events'][$event_id] = $this->_data->events[$event_id];
893 893
                     }
894 894
                 }
895 895
                 if ($item === 'attendee_email') {
@@ -901,7 +901,7 @@  discard block
 block discarded – undo
901 901
             }
902 902
             // note the FIRST reg object in this array is the one
903 903
             // we'll use for this attendee as the primary registration for this attendee.
904
-            $aee['reg_obj']        = reset($this->_data->attendees[ $att_id ]['reg_objs']);
904
+            $aee['reg_obj']        = reset($this->_data->attendees[$att_id]['reg_objs']);
905 905
             $aee['attendees']      = $this->_data->attendees;
906 906
             $aee['recipient_id']   = $att_id;
907 907
             $aee['recipient_type'] = 'Attendee';
Please login to merge, or discard this patch.
Indentation   +905 added lines, -905 removed lines patch added patch discarded remove patch
@@ -17,915 +17,915 @@
 block discarded – undo
17 17
 {
18 18
 
19 19
 
20
-    /**
21
-     * message type child classes will set what contexts are associated with the message type via this array.
22
-     * format:
23
-     * array(
24
-     * 'context' => array(
25
-     *        'label' => __('Context Label', 'event_espresso'),
26
-     *        'description' => __('Context description (for help popups)', 'event_espresso')
27
-     *    ));
28
-     *
29
-     * @var array
30
-     */
31
-    protected $_contexts = array();
32
-
33
-
34
-    /**
35
-     * This property is used to define what the display label will be for contexts (eg. "Recipients", "Themes" etc.)
36
-     * Format:
37
-     * array( 'label' => 'something', 'plural' => 'somethings', 'description' => 'something' );
38
-     *
39
-     * @var array
40
-     */
41
-    protected $_context_label;
42
-
43
-
44
-    /** MESSAGE ASSEMBLING PROPERTIES **/
45
-    /**
46
-     * This parameter simply holds all the message objects for retrieval by the controller and sending to the messenger.
47
-     *
48
-     * @var array of message objects.
49
-     */
50
-    public $messages = array();
51
-
52
-    /**
53
-     * The following holds the templates that will be used to assemble the message object for the messenger.
54
-     *
55
-     * @var array
56
-     */
57
-    protected $_templates;
58
-
59
-
60
-    /**
61
-     * If a specific template is being parsed, this will hold the message template group GRP_ID for that template.
62
-     *
63
-     * @var int.
64
-     */
65
-    protected $_GRP_ID;
66
-
67
-
68
-    /** OTHER INFO PROPERTIES **/
69
-    /**
70
-     * This will hold the count of the message objects in the messages array. This could be used for determining if
71
-     * batching/queueing is needed.
72
-     *
73
-     * @var int
74
-     */
75
-    public $count = 0;
76
-
77
-
78
-    /**
79
-     * This is set via the `do_messenger_hooks` method and contains the messenger being used to send the message of
80
-     * this message type at time of sending.
81
-     *
82
-     * @var EE_messenger
83
-     */
84
-    protected $_active_messenger;
85
-
86
-
87
-    /**
88
-     * This will hold the shortcode_replace instance for handling replacement of shortcodes in the various templates
89
-     *
90
-     * @var object
91
-     */
92
-    protected $_shortcode_replace;
93
-
94
-
95
-    /**
96
-     * The purpose for this property is to simply allow message types to indicate if the message generated is intended
97
-     * for only single context.  Child message types should redefine this variable (if necessary) in the
98
-     * _set_data_Handler() method.
99
-     *
100
-     * @var boolean
101
-     */
102
-    protected $_single_message = false;
103
-
104
-
105
-    /**
106
-     * This will hold an array of specific reg_ids that are receiving messages.
107
-     *
108
-     * @since 4.7.x
109
-     * @var array
110
-     */
111
-    protected $_regs_for_sending = array();
112
-
113
-
114
-    /**
115
-     * This holds the data passed to this class from the controller and also the final processed data.
116
-     *
117
-     * @var object
118
-     */
119
-    protected $_data;
120
-
121
-
122
-    /**
123
-     * this is just a flag indicating whether we're in preview mode or not.
124
-     *
125
-     * @var bool
126
-     */
127
-    protected $_preview = false;
128
-
129
-
130
-    /**
131
-     * This just holds defaults for addressee data that children merge with their data array setup
132
-     *
133
-     * @var array
134
-     */
135
-    protected $_default_addressee_data;
136
-
137
-
138
-    /**
139
-     * Child classes declare through this property what handler they want to use for the incoming data and this string
140
-     * is used to instantiate the EE_Messages_incoming_data child class for that handler.
141
-     *
142
-     * @var string
143
-     */
144
-    protected $_data_handler;
145
-
146
-
147
-    /**
148
-     * This holds any specific fields for holding any settings related to a message type (if any needed)
149
-     *
150
-     * @var array
151
-     */
152
-    protected $_admin_settings_fields = array();
153
-
154
-    /**
155
-     * this property will hold any existing setting that may have been set in the admin.
156
-     *
157
-     * @var array
158
-     */
159
-    protected $_existing_admin_settings = array();
160
-
161
-
162
-    /**
163
-     * This is used to designate the generating and alternative sending messengers for a message type.  It is set via
164
-     * set_with_messengers() on construct. Note, generating messenger also acts as a sending messenger for this message
165
-     * type.  However ONLY the generating messengers are used for creating templates for this message type. Should be
166
-     * in this format:
167
-     * {
168
-     *
169
-     * @type string $generating_messenger the name of the generating messenger.  Generating
170
-     *                                          messengers are used for generating templates,
171
-     *                                          doing validation and defining valid shortcodes.
172
-     *      {
173
-     * @type string $sending_messenger    values are the name(s) for the sending
174
-     *                                              messengers.  sending messengers are
175
-     *                                              just valid delivery vehicles that will utilize
176
-     *                                              the templates (and generated EE_message
177
-     *                                              objects from the generating messengers).
178
-     *      }
179
-     * }
180
-     * @since                             4.5.0
181
-     * @var array
182
-     */
183
-    protected $_with_messengers = array();
184
-
185
-
186
-    /**
187
-     * This holds the addressees in an array indexed by context for later retrieval when assembling the message objects.
188
-     *
189
-     * @access protected
190
-     * @var array
191
-     */
192
-    protected $_addressees = array();
193
-
194
-
195
-    /**
196
-     * This allows each message type to set what alternate messenger&message type combination can be used for fallback
197
-     * default templates if there are no specific ones defined for this messenger and message type.  Should be in the
198
-     * format:
199
-     * array(
200
-     *      'messenger' => 'message_type',
201
-     *      'another_messenger' => another_message_type
202
-     * );
203
-     * This is set in the message type constructor.
204
-     *
205
-     * @var array
206
-     */
207
-    protected $_master_templates = array();
208
-
209
-
210
-    /**
211
-     * This holds whatever the set template pack is for a message template group when generating messages.
212
-     *
213
-     * @since 4.5.0
214
-     * @var EE_Messages_Template_Pack
215
-     */
216
-    protected $_template_pack;
217
-
218
-
219
-    /**
220
-     * This holds whatever the set variation is for a message template group when generating messages.
221
-     *
222
-     * @since 4.5.0
223
-     * @var string
224
-     */
225
-    protected $_variation;
226
-
227
-
228
-    /**
229
-     * EE_message_type constructor.
230
-     */
231
-    public function __construct()
232
-    {
233
-        $this->_messages_item_type = 'message_type';
234
-        $this->_set_contexts();
235
-        $this->_set_with_messengers();
236
-        parent::__construct();
237
-    }
238
-
239
-
240
-    /**
241
-     * This sets the data handler for the message type.  It must be used to define the _data_handler property.  It is
242
-     * called when messages are setup.
243
-     *
244
-     * @abstract
245
-     * @access protected
246
-     * @return void
247
-     */
248
-    abstract protected function _set_data_handler();
249
-
250
-
251
-    /**
252
-     * This method should return a EE_Base_Class object (or array of EE_Base_Class objects) for the given context and
253
-     * ID (which should be the primary key id for the base class).  Client code doesn't have to know what a message
254
-     * type's data handler is.
255
-     *
256
-     * @since 4.5.0
257
-     * @param string          $context      This should be a string matching a valid context for the message type.
258
-     * @param EE_Registration $registration Need a registration to ensure that the data is valid (prevents people
259
-     *                                      guessing a url).
260
-     * @param int             $id           Optional. Integer corresponding to the value for the primary key of a
261
-     *                                      EE_Base_Class_Object
262
-     * @return mixed ( EE_Base_Class||EE_Base_Class[] )
263
-     */
264
-    abstract protected function _get_data_for_context($context, EE_Registration $registration, $id);
265
-
266
-
267
-    /**
268
-     * _set_contexts
269
-     * This sets up the contexts associated with the message_type
270
-     *
271
-     * @abstract
272
-     * @access  protected
273
-     * @return  void
274
-     */
275
-    abstract protected function _set_contexts();
276
-
277
-
278
-    /**
279
-     * This is used to get the "id" value fo the msg_trigger_url generated by get_url_trigger().
280
-     * In most cases, child classes don't need anything, (hence the default of 0), however if there is a specific
281
-     * EE_Base_Class that is required in generating a message for a message type recipient then the message
282
-     * type should override this method and use the given params to generate the correct ID.
283
-     *
284
-     * @param string          $context      The message type context.
285
-     * @param EE_Registration $registration Registration object
286
-     * @deprecated 4.9.0
287
-     * @return int
288
-     */
289
-    protected function _get_id_for_msg_url($context, EE_Registration $registration)
290
-    {
291
-        return 0;
292
-    }
293
-
294
-
295
-    /**
296
-     * This sets up any action/filter hooks this message type puts in place for a specific messenger.  Note that by
297
-     * default this does nothing.  Child classes will need to override if they want to add specific hooks for a
298
-     * messenger.
299
-     *
300
-     * @since 1.0.0
301
-     * @return void
302
-     */
303
-    protected function _do_messenger_hooks()
304
-    {
305
-        return;
306
-    }
307
-
308
-
309
-    /**
310
-     * This is a public wrapper for the protected _do_messenger_hooks() method.
311
-     * For backward compat reasons, this was done rather than making the protected method public.
312
-     *
313
-     * @param   EE_messenger $messenger This is used to set the $_active_messenger property, so message types are able
314
-     *                                  to know what messenger is being used to send the message at the time of
315
-     *                                  sending.
316
-     * @since 4.9.0
317
-     */
318
-    public function do_messenger_hooks($messenger = null)
319
-    {
320
-        $this->_active_messenger = $messenger;
321
-        $this->_do_messenger_hooks();
322
-    }
323
-
324
-
325
-    /**
326
-     * This method returns whether this message type should always generate a new copy
327
-     * when requested, or if links can be to the already generated copy.
328
-     * Note: this does NOT affect viewing/resending already generated messages in the EE_Message list table.
329
-     * Child classes should override this if different from the default of false.
330
-     *
331
-     * @return bool     false means can link to generated EE_Message.  true must regenerate.
332
-     */
333
-    public function always_generate()
334
-    {
335
-        return false;
336
-    }
337
-
338
-
339
-    /**
340
-     * Returns the priority for the message type.
341
-     * Priorities are defined as constants on EEM_Message.  Currently there are three priorities:
342
-     * - EEM_Message::priority_high
343
-     * - EEM_Message::priority_medium
344
-     * - EEM_Message::priority_low
345
-     * Priority is used to determine the weight the message type is given when queuing for generation and/or sending.
346
-     *
347
-     * @see    EEM_Message for more phpdocs on priority.
348
-     *         The default priority for all message_types is EEM_Message::priority_low.  Message Types wanting to give
349
-     *         a higher priority must override this method. Also note, messengers are able to override priorities
350
-     *         queuing instructions if their "send_now" flag is set to true. An example of this is the HTML messenger
351
-     *         which displays things in the browser.
352
-     * @since  4.9.0
353
-     * @return int
354
-     */
355
-    public function get_priority()
356
-    {
357
-        return EEM_Message::priority_low;
358
-    }
359
-
360
-
361
-    /**
362
-     * This runs the _set_data_handler() method for message types and then returns what got set.
363
-     *
364
-     * @param mixed $data This sets the data property for the message type with the incoming data used for generating.
365
-     * @return string (the reference for the data handler) (will be an empty string if could not be determined).
366
-     */
367
-    public function get_data_handler($data)
368
-    {
369
-        $this->_data = $data;
370
-        $this->_set_data_handler();
371
-        return apply_filters('FHEE__EE_message_type__get_data_handler', $this->_data_handler, $this);
372
-    }
373
-
374
-
375
-    /**
376
-     * This is called externally to reset the value of the $_data property for the message type.
377
-     * Please note the value of the _data is highly volatile.  It was added as an interim measure ensuring
378
-     * EE_Message_To_Generate objects have any changes to the _data property when `_set_data_handler` method is called
379
-     * (and for back compat reasons). This particular method is used in
380
-     * EE_Messages_Generator::_reset_current_properties to ensure that the internal _data on the message type is
381
-     * cleaned before subsequent EE_Message generation in the same request.
382
-     *
383
-     * @todo      This needs refactored along with the whole _set_data_handler() method in EE_message_types. Need to
384
-     *            ensure that there is no manipulation of the _data property during run time so there's a clear
385
-     *            expectation of what it is.  Likely we need to ensure that _data is not persisted IN the message type
386
-     *            at all.
387
-     * @internal  Plugin authors, do not implement this method, it is subject to change.
388
-     * @since     4.9
389
-     */
390
-    public function reset_data()
391
-    {
392
-        $this->_data = null;
393
-    }
394
-
395
-
396
-    /**
397
-     * This does some validation of incoming params gets the url trigger from the defined method in the specific child
398
-     * class and then filters the results.
399
-     *
400
-     * @param string          $context           The message type context
401
-     * @param string          $sending_messenger The sending messenger
402
-     * @param EE_Registration $registration      Registration object
403
-     * @throws EE_Error
404
-     * @deprecated  4.9.0  Likely 4.9.10 or 4.10.0 will remove this method completely
405
-     * @return string          generated url
406
-     */
407
-    public function get_url_trigger($context, $sending_messenger, EE_Registration $registration)
408
-    {
409
-        // validate context
410
-        // valid context?
411
-        if (! isset($this->_contexts[ $context ])) {
412
-            throw new EE_Error(
413
-                sprintf(
414
-                    __('The context %s is not a valid context for %s.', 'event_espresso'),
415
-                    $context,
416
-                    get_class($this)
417
-                )
418
-            );
419
-        }
420
-        // valid sending_messenger?
421
-        $not_valid_msgr = false;
422
-        foreach ($this->_with_messengers as $generating => $sendings) {
423
-            if (empty($sendings) || array_search($sending_messenger, $sendings) === false) {
424
-                $not_valid_msgr = true;
425
-            }
426
-        }
427
-        if ($not_valid_msgr) {
428
-            throw new EE_Error(
429
-                sprintf(
430
-                    __(
431
-                        'The given sending messenger string (%s) does not match a valid sending messenger with the %s.  If this is incorrect, make sure that the message type has defined this messenger as a sending messenger in its $_with_messengers array.',
432
-                        'event_espresso'
433
-                    ),
434
-                    $sending_messenger,
435
-                    get_class($this)
436
-                )
437
-            );
438
-        }
439
-        return EEH_MSG_Template::generate_url_trigger(
440
-            $sending_messenger,
441
-            $this->_active_messenger->name,
442
-            $context,
443
-            $this->name,
444
-            $registration,
445
-            $this->_GRP_ID,
446
-            $this->_get_id_for_msg_url($context, $registration)
447
-        );
448
-    }
449
-
450
-
451
-    /**
452
-     * Wrapper for _get_data_for_context() that handles some validation before calling the main class and also allows
453
-     * for filtering. This is (currently) called by the EED_Messages module.
454
-     *
455
-     * @since 4.5.0
456
-     * @throws EE_Error
457
-     * @param string          $context      This should be a string matching a valid context for the message type.
458
-     * @param EE_Registration $registration Need a registration to ensure that the data is valid (prevents people
459
-     *                                      guessing a url).
460
-     * @param int             $id           Optional. Integer corresponding to the value for the primary key of a
461
-     *                                      EE_Base_Class_Object
462
-     * @return mixed (EE_Base_Class||EE_Base_Class[])
463
-     */
464
-    public function get_data_for_context($context, EE_Registration $registration, $id = 0)
465
-    {
466
-        // valid context?
467
-        if (! isset($this->_contexts[ $context ])) {
468
-            throw new EE_Error(
469
-                sprintf(
470
-                    __('The context %s is not a valid context for %s.', 'event_espresso'),
471
-                    $context,
472
-                    get_class($this)
473
-                )
474
-            );
475
-        }
476
-        // get data and apply global and class specific filters on it.
477
-        $data = apply_filters(
478
-            'FHEE__EE_message_type__get_data_for_context__data',
479
-            $this->_get_data_for_context($context, $registration, $id),
480
-            $this
481
-        );
482
-        $data = apply_filters('FHEE__' . get_class($this) . '__get_data_for_context__data', $data, $this);
483
-        // if empty then something went wrong!
484
-        if (empty($data)) {
485
-            throw new EE_Error(
486
-                sprintf(
487
-                    __(
488
-                        'There is no data retrieved, it is possible that the id given (%d) does not match any value in the database for the corresponding EE_Base_Class used by the data handler for the %s message type.',
489
-                        'event_espresso'
490
-                    ),
491
-                    $id,
492
-                    $this->name
493
-                )
494
-            );
495
-        }
496
-        return $data;
497
-    }
498
-
499
-
500
-    /**
501
-     * This returns the contents of the _data property.
502
-     * Please note the value of the _data is highly volatile.  It was added as an interim measure ensuring
503
-     * EE_Message_To_Generate objects have any changes to the _data property when `_set_data_handler` method is called.
504
-     *
505
-     * @todo      This needs refactored along with the whole _set_data_handler() method in EE_message_types. Need to
506
-     *            ensure that there is no manipulation of the _data property during run time so there's a clear
507
-     *            expectation of what it is.
508
-     * @internal  Plugin authors, do not implement this method, it is subject to change.
509
-     * @return mixed
510
-     */
511
-    public function get_data()
512
-    {
513
-        return $this->_data;
514
-    }
515
-
516
-
517
-    /**
518
-     * used to set the $_with_messengers property. (this is a default, child classes SHOULD override)
519
-     *
520
-     * @see   property definition for description of setup.
521
-     * @since 4.5.0
522
-     * @abstract
523
-     * @return void
524
-     */
525
-    protected function _set_with_messengers()
526
-    {
527
-        $this->_with_messengers = array(
528
-            'email' => array('html'),
529
-        );
530
-    }
531
-
532
-
533
-    /**
534
-     * Return the value of the _with_messengers property
535
-     *
536
-     * @since 4.5.0
537
-     * @return array
538
-     */
539
-    public function with_messengers()
540
-    {
541
-        return apply_filters(
542
-            'FHEE__EE_message_type__get_with_messengers__with_messengers__' . get_class($this),
543
-            $this->_with_messengers
544
-        );
545
-    }
546
-
547
-
548
-    /**
549
-     * this public method accepts a page slug (for an EE_admin page) and will return the response from the child class
550
-     * callback function if that page is registered via the `_admin_registered_page` property set by the child class.
551
-     * *
552
-     *
553
-     * @param string $page       the slug of the EE admin page
554
-     * @param array  $messengers an array of active messenger objects
555
-     * @param string $action     the page action (to allow for more specific handling - i.e. edit vs. add pages)
556
-     * @param array  $extra      This is just an extra argument that can be used to pass additional data for setting up
557
-     *                           page content.
558
-     * @access public
559
-     * @return string
560
-     */
561
-    public function get_message_type_admin_page_content(
562
-        $page,
563
-        $action = null,
564
-        $extra = array(),
565
-        $messengers = array()
566
-    ) {
567
-        // we can also further refine the context by action (if present).
568
-        return $this->_get_admin_page_content($page, $action, $extra, $messengers);
569
-    }
570
-
571
-
572
-    /**
573
-     * @return array
574
-     */
575
-    public function get_contexts()
576
-    {
577
-        return $this->_contexts;
578
-    }
579
-
580
-
581
-    /**
582
-     * This just returns the context label for a given context (as set in $_context_label property)
583
-     *
584
-     * @access public
585
-     * @return array
586
-     */
587
-    public function get_context_label()
588
-    {
589
-        return $this->_context_label;
590
-    }
591
-
592
-
593
-    /**
594
-     * This just returns the (filtered) _master_templates property.
595
-     *
596
-     * @see property definition for documentation.
597
-     * @return array
598
-     */
599
-    public function get_master_templates()
600
-    {
601
-        // first class specific filter then filter that by the global filter.
602
-        $master_templates = apply_filters(
603
-            'FHEE__' . get_class($this) . '__get_master_templates',
604
-            $this->_master_templates
605
-        );
606
-        return apply_filters('FHEE__EE_message_type__get_master_templates', $master_templates, $this);
607
-    }
608
-
609
-
610
-    /**
611
-     * Accepts an incoming data handler which contains data for processing, and returns an array of
612
-     * EE_Messages_Addressee objects.
613
-     *
614
-     * @param EE_Messages_incoming_data $data
615
-     * @param string                    $context Limit addressees to specific context.
616
-     * @return array An array indexed by context where each context is an array of EE_Messages_Addressee objects for
617
-     *                                           that context
618
-     * @throws EE_Error
619
-     */
620
-    public function get_addressees(EE_Messages_incoming_data $data, $context = '')
621
-    {
622
-        // override _data
623
-        $this->_data       = $data;
624
-        $addressees        = array();
625
-        $original_contexts = $this->_contexts;
626
-        // if incoming context then limit to that context
627
-        if (! empty($context)) {
628
-            $cntxt = ! empty($this->_contexts[ $context ]) ? $this->_contexts[ $context ] : '';
629
-            if (! empty($cntxt)) {
630
-                $this->_contexts           = array();
631
-                $this->_contexts[ $context ] = $cntxt;
632
-            }
633
-        }
634
-        $this->_set_default_addressee_data();
635
-        if ($this->_process_data()) {
636
-            $addressees = $this->_addressees;
637
-        }
638
-
639
-        // reset contexts and addressees
640
-        $this->_contexts   = $original_contexts;
641
-        $this->_addressees = array();
642
-        return $addressees;
643
-    }
644
-
645
-
646
-    /**
647
-     * processes the data object so we get
648
-     *
649
-     * @throws EE_Error
650
-     * @return bool  true means data was processed successfully, false means not.
651
-     */
652
-    protected function _process_data()
653
-    {
654
-        // at a minimum, we NEED EE_Attendee objects.
655
-        if (empty($this->_data->attendees)) {
656
-            return false;  // there's no data to process!
657
-        }
658
-        // process addressees for each context.  Child classes will have to have methods for
659
-        // each context defined to handle the processing of the data object within them
660
-        foreach ($this->_contexts as $context => $details) {
661
-            $xpctd_method = '_' . $context . '_addressees';
662
-            if (! method_exists($this, $xpctd_method)) {
663
-                throw new EE_Error(
664
-                    sprintf(
665
-                        __(
666
-                            'The data for %1$s message type cannot be prepared because there is no set method for doing so.  The expected method name is "%2$s" please doublecheck the %1$s message type class and make sure that method is present',
667
-                            'event_espresso'
668
-                        ),
669
-                        $this->label['singular'],
670
-                        $xpctd_method
671
-                    )
672
-                );
673
-            }
674
-            $this->_addressees[ $context ] = call_user_func(array($this, $xpctd_method));
675
-        }
676
-        return true; // data was processed successfully.
677
-    }
678
-
679
-
680
-    /**
681
-     * sets the default_addressee_data property,
682
-     *
683
-     * @access private
684
-     * @return void
685
-     */
686
-    private function _set_default_addressee_data()
687
-    {
688
-        $this->_default_addressee_data = array(
689
-            'billing'                  => $this->_data->billing,
690
-            'taxes'                    => $this->_data->taxes,
691
-            'tax_line_items'           => $this->_data->tax_line_items,
692
-            'additional_line_items'    => $this->_data->additional_line_items,
693
-            'grand_total_line_item'    => $this->_data->grand_total_line_item,
694
-            'txn'                      => $this->_data->txn,
695
-            'payments'                 => $this->_data->payments,
696
-            'payment'                  => isset($this->_data->payment) && $this->_data->payment instanceof EE_Payment
697
-                ? $this->_data->payment
698
-                : null,
699
-            'reg_objs'                 => $this->_data->reg_objs,
700
-            'registrations'            => $this->_data->registrations,
701
-            'datetimes'                => $this->_data->datetimes,
702
-            'tickets'                  => $this->_data->tickets,
703
-            'line_items_with_children' => $this->_data->line_items_with_children,
704
-            'questions'                => $this->_data->questions,
705
-            'answers'                  => $this->_data->answers,
706
-            'txn_status'               => $this->_data->txn_status,
707
-            'total_ticket_count'       => $this->_data->total_ticket_count,
708
-        );
709
-        if (is_array($this->_data->primary_attendee_data)) {
710
-            $this->_default_addressee_data                    = array_merge(
711
-                $this->_default_addressee_data,
712
-                $this->_data->primary_attendee_data
713
-            );
714
-            $this->_default_addressee_data['primary_att_obj'] = $this->_data->primary_attendee_data['att_obj'];
715
-            $this->_default_addressee_data['primary_reg_obj'] = $this->_data->primary_attendee_data['reg_obj'];
716
-        }
717
-    }
718
-
719
-
720
-
721
-    /********************
20
+	/**
21
+	 * message type child classes will set what contexts are associated with the message type via this array.
22
+	 * format:
23
+	 * array(
24
+	 * 'context' => array(
25
+	 *        'label' => __('Context Label', 'event_espresso'),
26
+	 *        'description' => __('Context description (for help popups)', 'event_espresso')
27
+	 *    ));
28
+	 *
29
+	 * @var array
30
+	 */
31
+	protected $_contexts = array();
32
+
33
+
34
+	/**
35
+	 * This property is used to define what the display label will be for contexts (eg. "Recipients", "Themes" etc.)
36
+	 * Format:
37
+	 * array( 'label' => 'something', 'plural' => 'somethings', 'description' => 'something' );
38
+	 *
39
+	 * @var array
40
+	 */
41
+	protected $_context_label;
42
+
43
+
44
+	/** MESSAGE ASSEMBLING PROPERTIES **/
45
+	/**
46
+	 * This parameter simply holds all the message objects for retrieval by the controller and sending to the messenger.
47
+	 *
48
+	 * @var array of message objects.
49
+	 */
50
+	public $messages = array();
51
+
52
+	/**
53
+	 * The following holds the templates that will be used to assemble the message object for the messenger.
54
+	 *
55
+	 * @var array
56
+	 */
57
+	protected $_templates;
58
+
59
+
60
+	/**
61
+	 * If a specific template is being parsed, this will hold the message template group GRP_ID for that template.
62
+	 *
63
+	 * @var int.
64
+	 */
65
+	protected $_GRP_ID;
66
+
67
+
68
+	/** OTHER INFO PROPERTIES **/
69
+	/**
70
+	 * This will hold the count of the message objects in the messages array. This could be used for determining if
71
+	 * batching/queueing is needed.
72
+	 *
73
+	 * @var int
74
+	 */
75
+	public $count = 0;
76
+
77
+
78
+	/**
79
+	 * This is set via the `do_messenger_hooks` method and contains the messenger being used to send the message of
80
+	 * this message type at time of sending.
81
+	 *
82
+	 * @var EE_messenger
83
+	 */
84
+	protected $_active_messenger;
85
+
86
+
87
+	/**
88
+	 * This will hold the shortcode_replace instance for handling replacement of shortcodes in the various templates
89
+	 *
90
+	 * @var object
91
+	 */
92
+	protected $_shortcode_replace;
93
+
94
+
95
+	/**
96
+	 * The purpose for this property is to simply allow message types to indicate if the message generated is intended
97
+	 * for only single context.  Child message types should redefine this variable (if necessary) in the
98
+	 * _set_data_Handler() method.
99
+	 *
100
+	 * @var boolean
101
+	 */
102
+	protected $_single_message = false;
103
+
104
+
105
+	/**
106
+	 * This will hold an array of specific reg_ids that are receiving messages.
107
+	 *
108
+	 * @since 4.7.x
109
+	 * @var array
110
+	 */
111
+	protected $_regs_for_sending = array();
112
+
113
+
114
+	/**
115
+	 * This holds the data passed to this class from the controller and also the final processed data.
116
+	 *
117
+	 * @var object
118
+	 */
119
+	protected $_data;
120
+
121
+
122
+	/**
123
+	 * this is just a flag indicating whether we're in preview mode or not.
124
+	 *
125
+	 * @var bool
126
+	 */
127
+	protected $_preview = false;
128
+
129
+
130
+	/**
131
+	 * This just holds defaults for addressee data that children merge with their data array setup
132
+	 *
133
+	 * @var array
134
+	 */
135
+	protected $_default_addressee_data;
136
+
137
+
138
+	/**
139
+	 * Child classes declare through this property what handler they want to use for the incoming data and this string
140
+	 * is used to instantiate the EE_Messages_incoming_data child class for that handler.
141
+	 *
142
+	 * @var string
143
+	 */
144
+	protected $_data_handler;
145
+
146
+
147
+	/**
148
+	 * This holds any specific fields for holding any settings related to a message type (if any needed)
149
+	 *
150
+	 * @var array
151
+	 */
152
+	protected $_admin_settings_fields = array();
153
+
154
+	/**
155
+	 * this property will hold any existing setting that may have been set in the admin.
156
+	 *
157
+	 * @var array
158
+	 */
159
+	protected $_existing_admin_settings = array();
160
+
161
+
162
+	/**
163
+	 * This is used to designate the generating and alternative sending messengers for a message type.  It is set via
164
+	 * set_with_messengers() on construct. Note, generating messenger also acts as a sending messenger for this message
165
+	 * type.  However ONLY the generating messengers are used for creating templates for this message type. Should be
166
+	 * in this format:
167
+	 * {
168
+	 *
169
+	 * @type string $generating_messenger the name of the generating messenger.  Generating
170
+	 *                                          messengers are used for generating templates,
171
+	 *                                          doing validation and defining valid shortcodes.
172
+	 *      {
173
+	 * @type string $sending_messenger    values are the name(s) for the sending
174
+	 *                                              messengers.  sending messengers are
175
+	 *                                              just valid delivery vehicles that will utilize
176
+	 *                                              the templates (and generated EE_message
177
+	 *                                              objects from the generating messengers).
178
+	 *      }
179
+	 * }
180
+	 * @since                             4.5.0
181
+	 * @var array
182
+	 */
183
+	protected $_with_messengers = array();
184
+
185
+
186
+	/**
187
+	 * This holds the addressees in an array indexed by context for later retrieval when assembling the message objects.
188
+	 *
189
+	 * @access protected
190
+	 * @var array
191
+	 */
192
+	protected $_addressees = array();
193
+
194
+
195
+	/**
196
+	 * This allows each message type to set what alternate messenger&message type combination can be used for fallback
197
+	 * default templates if there are no specific ones defined for this messenger and message type.  Should be in the
198
+	 * format:
199
+	 * array(
200
+	 *      'messenger' => 'message_type',
201
+	 *      'another_messenger' => another_message_type
202
+	 * );
203
+	 * This is set in the message type constructor.
204
+	 *
205
+	 * @var array
206
+	 */
207
+	protected $_master_templates = array();
208
+
209
+
210
+	/**
211
+	 * This holds whatever the set template pack is for a message template group when generating messages.
212
+	 *
213
+	 * @since 4.5.0
214
+	 * @var EE_Messages_Template_Pack
215
+	 */
216
+	protected $_template_pack;
217
+
218
+
219
+	/**
220
+	 * This holds whatever the set variation is for a message template group when generating messages.
221
+	 *
222
+	 * @since 4.5.0
223
+	 * @var string
224
+	 */
225
+	protected $_variation;
226
+
227
+
228
+	/**
229
+	 * EE_message_type constructor.
230
+	 */
231
+	public function __construct()
232
+	{
233
+		$this->_messages_item_type = 'message_type';
234
+		$this->_set_contexts();
235
+		$this->_set_with_messengers();
236
+		parent::__construct();
237
+	}
238
+
239
+
240
+	/**
241
+	 * This sets the data handler for the message type.  It must be used to define the _data_handler property.  It is
242
+	 * called when messages are setup.
243
+	 *
244
+	 * @abstract
245
+	 * @access protected
246
+	 * @return void
247
+	 */
248
+	abstract protected function _set_data_handler();
249
+
250
+
251
+	/**
252
+	 * This method should return a EE_Base_Class object (or array of EE_Base_Class objects) for the given context and
253
+	 * ID (which should be the primary key id for the base class).  Client code doesn't have to know what a message
254
+	 * type's data handler is.
255
+	 *
256
+	 * @since 4.5.0
257
+	 * @param string          $context      This should be a string matching a valid context for the message type.
258
+	 * @param EE_Registration $registration Need a registration to ensure that the data is valid (prevents people
259
+	 *                                      guessing a url).
260
+	 * @param int             $id           Optional. Integer corresponding to the value for the primary key of a
261
+	 *                                      EE_Base_Class_Object
262
+	 * @return mixed ( EE_Base_Class||EE_Base_Class[] )
263
+	 */
264
+	abstract protected function _get_data_for_context($context, EE_Registration $registration, $id);
265
+
266
+
267
+	/**
268
+	 * _set_contexts
269
+	 * This sets up the contexts associated with the message_type
270
+	 *
271
+	 * @abstract
272
+	 * @access  protected
273
+	 * @return  void
274
+	 */
275
+	abstract protected function _set_contexts();
276
+
277
+
278
+	/**
279
+	 * This is used to get the "id" value fo the msg_trigger_url generated by get_url_trigger().
280
+	 * In most cases, child classes don't need anything, (hence the default of 0), however if there is a specific
281
+	 * EE_Base_Class that is required in generating a message for a message type recipient then the message
282
+	 * type should override this method and use the given params to generate the correct ID.
283
+	 *
284
+	 * @param string          $context      The message type context.
285
+	 * @param EE_Registration $registration Registration object
286
+	 * @deprecated 4.9.0
287
+	 * @return int
288
+	 */
289
+	protected function _get_id_for_msg_url($context, EE_Registration $registration)
290
+	{
291
+		return 0;
292
+	}
293
+
294
+
295
+	/**
296
+	 * This sets up any action/filter hooks this message type puts in place for a specific messenger.  Note that by
297
+	 * default this does nothing.  Child classes will need to override if they want to add specific hooks for a
298
+	 * messenger.
299
+	 *
300
+	 * @since 1.0.0
301
+	 * @return void
302
+	 */
303
+	protected function _do_messenger_hooks()
304
+	{
305
+		return;
306
+	}
307
+
308
+
309
+	/**
310
+	 * This is a public wrapper for the protected _do_messenger_hooks() method.
311
+	 * For backward compat reasons, this was done rather than making the protected method public.
312
+	 *
313
+	 * @param   EE_messenger $messenger This is used to set the $_active_messenger property, so message types are able
314
+	 *                                  to know what messenger is being used to send the message at the time of
315
+	 *                                  sending.
316
+	 * @since 4.9.0
317
+	 */
318
+	public function do_messenger_hooks($messenger = null)
319
+	{
320
+		$this->_active_messenger = $messenger;
321
+		$this->_do_messenger_hooks();
322
+	}
323
+
324
+
325
+	/**
326
+	 * This method returns whether this message type should always generate a new copy
327
+	 * when requested, or if links can be to the already generated copy.
328
+	 * Note: this does NOT affect viewing/resending already generated messages in the EE_Message list table.
329
+	 * Child classes should override this if different from the default of false.
330
+	 *
331
+	 * @return bool     false means can link to generated EE_Message.  true must regenerate.
332
+	 */
333
+	public function always_generate()
334
+	{
335
+		return false;
336
+	}
337
+
338
+
339
+	/**
340
+	 * Returns the priority for the message type.
341
+	 * Priorities are defined as constants on EEM_Message.  Currently there are three priorities:
342
+	 * - EEM_Message::priority_high
343
+	 * - EEM_Message::priority_medium
344
+	 * - EEM_Message::priority_low
345
+	 * Priority is used to determine the weight the message type is given when queuing for generation and/or sending.
346
+	 *
347
+	 * @see    EEM_Message for more phpdocs on priority.
348
+	 *         The default priority for all message_types is EEM_Message::priority_low.  Message Types wanting to give
349
+	 *         a higher priority must override this method. Also note, messengers are able to override priorities
350
+	 *         queuing instructions if their "send_now" flag is set to true. An example of this is the HTML messenger
351
+	 *         which displays things in the browser.
352
+	 * @since  4.9.0
353
+	 * @return int
354
+	 */
355
+	public function get_priority()
356
+	{
357
+		return EEM_Message::priority_low;
358
+	}
359
+
360
+
361
+	/**
362
+	 * This runs the _set_data_handler() method for message types and then returns what got set.
363
+	 *
364
+	 * @param mixed $data This sets the data property for the message type with the incoming data used for generating.
365
+	 * @return string (the reference for the data handler) (will be an empty string if could not be determined).
366
+	 */
367
+	public function get_data_handler($data)
368
+	{
369
+		$this->_data = $data;
370
+		$this->_set_data_handler();
371
+		return apply_filters('FHEE__EE_message_type__get_data_handler', $this->_data_handler, $this);
372
+	}
373
+
374
+
375
+	/**
376
+	 * This is called externally to reset the value of the $_data property for the message type.
377
+	 * Please note the value of the _data is highly volatile.  It was added as an interim measure ensuring
378
+	 * EE_Message_To_Generate objects have any changes to the _data property when `_set_data_handler` method is called
379
+	 * (and for back compat reasons). This particular method is used in
380
+	 * EE_Messages_Generator::_reset_current_properties to ensure that the internal _data on the message type is
381
+	 * cleaned before subsequent EE_Message generation in the same request.
382
+	 *
383
+	 * @todo      This needs refactored along with the whole _set_data_handler() method in EE_message_types. Need to
384
+	 *            ensure that there is no manipulation of the _data property during run time so there's a clear
385
+	 *            expectation of what it is.  Likely we need to ensure that _data is not persisted IN the message type
386
+	 *            at all.
387
+	 * @internal  Plugin authors, do not implement this method, it is subject to change.
388
+	 * @since     4.9
389
+	 */
390
+	public function reset_data()
391
+	{
392
+		$this->_data = null;
393
+	}
394
+
395
+
396
+	/**
397
+	 * This does some validation of incoming params gets the url trigger from the defined method in the specific child
398
+	 * class and then filters the results.
399
+	 *
400
+	 * @param string          $context           The message type context
401
+	 * @param string          $sending_messenger The sending messenger
402
+	 * @param EE_Registration $registration      Registration object
403
+	 * @throws EE_Error
404
+	 * @deprecated  4.9.0  Likely 4.9.10 or 4.10.0 will remove this method completely
405
+	 * @return string          generated url
406
+	 */
407
+	public function get_url_trigger($context, $sending_messenger, EE_Registration $registration)
408
+	{
409
+		// validate context
410
+		// valid context?
411
+		if (! isset($this->_contexts[ $context ])) {
412
+			throw new EE_Error(
413
+				sprintf(
414
+					__('The context %s is not a valid context for %s.', 'event_espresso'),
415
+					$context,
416
+					get_class($this)
417
+				)
418
+			);
419
+		}
420
+		// valid sending_messenger?
421
+		$not_valid_msgr = false;
422
+		foreach ($this->_with_messengers as $generating => $sendings) {
423
+			if (empty($sendings) || array_search($sending_messenger, $sendings) === false) {
424
+				$not_valid_msgr = true;
425
+			}
426
+		}
427
+		if ($not_valid_msgr) {
428
+			throw new EE_Error(
429
+				sprintf(
430
+					__(
431
+						'The given sending messenger string (%s) does not match a valid sending messenger with the %s.  If this is incorrect, make sure that the message type has defined this messenger as a sending messenger in its $_with_messengers array.',
432
+						'event_espresso'
433
+					),
434
+					$sending_messenger,
435
+					get_class($this)
436
+				)
437
+			);
438
+		}
439
+		return EEH_MSG_Template::generate_url_trigger(
440
+			$sending_messenger,
441
+			$this->_active_messenger->name,
442
+			$context,
443
+			$this->name,
444
+			$registration,
445
+			$this->_GRP_ID,
446
+			$this->_get_id_for_msg_url($context, $registration)
447
+		);
448
+	}
449
+
450
+
451
+	/**
452
+	 * Wrapper for _get_data_for_context() that handles some validation before calling the main class and also allows
453
+	 * for filtering. This is (currently) called by the EED_Messages module.
454
+	 *
455
+	 * @since 4.5.0
456
+	 * @throws EE_Error
457
+	 * @param string          $context      This should be a string matching a valid context for the message type.
458
+	 * @param EE_Registration $registration Need a registration to ensure that the data is valid (prevents people
459
+	 *                                      guessing a url).
460
+	 * @param int             $id           Optional. Integer corresponding to the value for the primary key of a
461
+	 *                                      EE_Base_Class_Object
462
+	 * @return mixed (EE_Base_Class||EE_Base_Class[])
463
+	 */
464
+	public function get_data_for_context($context, EE_Registration $registration, $id = 0)
465
+	{
466
+		// valid context?
467
+		if (! isset($this->_contexts[ $context ])) {
468
+			throw new EE_Error(
469
+				sprintf(
470
+					__('The context %s is not a valid context for %s.', 'event_espresso'),
471
+					$context,
472
+					get_class($this)
473
+				)
474
+			);
475
+		}
476
+		// get data and apply global and class specific filters on it.
477
+		$data = apply_filters(
478
+			'FHEE__EE_message_type__get_data_for_context__data',
479
+			$this->_get_data_for_context($context, $registration, $id),
480
+			$this
481
+		);
482
+		$data = apply_filters('FHEE__' . get_class($this) . '__get_data_for_context__data', $data, $this);
483
+		// if empty then something went wrong!
484
+		if (empty($data)) {
485
+			throw new EE_Error(
486
+				sprintf(
487
+					__(
488
+						'There is no data retrieved, it is possible that the id given (%d) does not match any value in the database for the corresponding EE_Base_Class used by the data handler for the %s message type.',
489
+						'event_espresso'
490
+					),
491
+					$id,
492
+					$this->name
493
+				)
494
+			);
495
+		}
496
+		return $data;
497
+	}
498
+
499
+
500
+	/**
501
+	 * This returns the contents of the _data property.
502
+	 * Please note the value of the _data is highly volatile.  It was added as an interim measure ensuring
503
+	 * EE_Message_To_Generate objects have any changes to the _data property when `_set_data_handler` method is called.
504
+	 *
505
+	 * @todo      This needs refactored along with the whole _set_data_handler() method in EE_message_types. Need to
506
+	 *            ensure that there is no manipulation of the _data property during run time so there's a clear
507
+	 *            expectation of what it is.
508
+	 * @internal  Plugin authors, do not implement this method, it is subject to change.
509
+	 * @return mixed
510
+	 */
511
+	public function get_data()
512
+	{
513
+		return $this->_data;
514
+	}
515
+
516
+
517
+	/**
518
+	 * used to set the $_with_messengers property. (this is a default, child classes SHOULD override)
519
+	 *
520
+	 * @see   property definition for description of setup.
521
+	 * @since 4.5.0
522
+	 * @abstract
523
+	 * @return void
524
+	 */
525
+	protected function _set_with_messengers()
526
+	{
527
+		$this->_with_messengers = array(
528
+			'email' => array('html'),
529
+		);
530
+	}
531
+
532
+
533
+	/**
534
+	 * Return the value of the _with_messengers property
535
+	 *
536
+	 * @since 4.5.0
537
+	 * @return array
538
+	 */
539
+	public function with_messengers()
540
+	{
541
+		return apply_filters(
542
+			'FHEE__EE_message_type__get_with_messengers__with_messengers__' . get_class($this),
543
+			$this->_with_messengers
544
+		);
545
+	}
546
+
547
+
548
+	/**
549
+	 * this public method accepts a page slug (for an EE_admin page) and will return the response from the child class
550
+	 * callback function if that page is registered via the `_admin_registered_page` property set by the child class.
551
+	 * *
552
+	 *
553
+	 * @param string $page       the slug of the EE admin page
554
+	 * @param array  $messengers an array of active messenger objects
555
+	 * @param string $action     the page action (to allow for more specific handling - i.e. edit vs. add pages)
556
+	 * @param array  $extra      This is just an extra argument that can be used to pass additional data for setting up
557
+	 *                           page content.
558
+	 * @access public
559
+	 * @return string
560
+	 */
561
+	public function get_message_type_admin_page_content(
562
+		$page,
563
+		$action = null,
564
+		$extra = array(),
565
+		$messengers = array()
566
+	) {
567
+		// we can also further refine the context by action (if present).
568
+		return $this->_get_admin_page_content($page, $action, $extra, $messengers);
569
+	}
570
+
571
+
572
+	/**
573
+	 * @return array
574
+	 */
575
+	public function get_contexts()
576
+	{
577
+		return $this->_contexts;
578
+	}
579
+
580
+
581
+	/**
582
+	 * This just returns the context label for a given context (as set in $_context_label property)
583
+	 *
584
+	 * @access public
585
+	 * @return array
586
+	 */
587
+	public function get_context_label()
588
+	{
589
+		return $this->_context_label;
590
+	}
591
+
592
+
593
+	/**
594
+	 * This just returns the (filtered) _master_templates property.
595
+	 *
596
+	 * @see property definition for documentation.
597
+	 * @return array
598
+	 */
599
+	public function get_master_templates()
600
+	{
601
+		// first class specific filter then filter that by the global filter.
602
+		$master_templates = apply_filters(
603
+			'FHEE__' . get_class($this) . '__get_master_templates',
604
+			$this->_master_templates
605
+		);
606
+		return apply_filters('FHEE__EE_message_type__get_master_templates', $master_templates, $this);
607
+	}
608
+
609
+
610
+	/**
611
+	 * Accepts an incoming data handler which contains data for processing, and returns an array of
612
+	 * EE_Messages_Addressee objects.
613
+	 *
614
+	 * @param EE_Messages_incoming_data $data
615
+	 * @param string                    $context Limit addressees to specific context.
616
+	 * @return array An array indexed by context where each context is an array of EE_Messages_Addressee objects for
617
+	 *                                           that context
618
+	 * @throws EE_Error
619
+	 */
620
+	public function get_addressees(EE_Messages_incoming_data $data, $context = '')
621
+	{
622
+		// override _data
623
+		$this->_data       = $data;
624
+		$addressees        = array();
625
+		$original_contexts = $this->_contexts;
626
+		// if incoming context then limit to that context
627
+		if (! empty($context)) {
628
+			$cntxt = ! empty($this->_contexts[ $context ]) ? $this->_contexts[ $context ] : '';
629
+			if (! empty($cntxt)) {
630
+				$this->_contexts           = array();
631
+				$this->_contexts[ $context ] = $cntxt;
632
+			}
633
+		}
634
+		$this->_set_default_addressee_data();
635
+		if ($this->_process_data()) {
636
+			$addressees = $this->_addressees;
637
+		}
638
+
639
+		// reset contexts and addressees
640
+		$this->_contexts   = $original_contexts;
641
+		$this->_addressees = array();
642
+		return $addressees;
643
+	}
644
+
645
+
646
+	/**
647
+	 * processes the data object so we get
648
+	 *
649
+	 * @throws EE_Error
650
+	 * @return bool  true means data was processed successfully, false means not.
651
+	 */
652
+	protected function _process_data()
653
+	{
654
+		// at a minimum, we NEED EE_Attendee objects.
655
+		if (empty($this->_data->attendees)) {
656
+			return false;  // there's no data to process!
657
+		}
658
+		// process addressees for each context.  Child classes will have to have methods for
659
+		// each context defined to handle the processing of the data object within them
660
+		foreach ($this->_contexts as $context => $details) {
661
+			$xpctd_method = '_' . $context . '_addressees';
662
+			if (! method_exists($this, $xpctd_method)) {
663
+				throw new EE_Error(
664
+					sprintf(
665
+						__(
666
+							'The data for %1$s message type cannot be prepared because there is no set method for doing so.  The expected method name is "%2$s" please doublecheck the %1$s message type class and make sure that method is present',
667
+							'event_espresso'
668
+						),
669
+						$this->label['singular'],
670
+						$xpctd_method
671
+					)
672
+				);
673
+			}
674
+			$this->_addressees[ $context ] = call_user_func(array($this, $xpctd_method));
675
+		}
676
+		return true; // data was processed successfully.
677
+	}
678
+
679
+
680
+	/**
681
+	 * sets the default_addressee_data property,
682
+	 *
683
+	 * @access private
684
+	 * @return void
685
+	 */
686
+	private function _set_default_addressee_data()
687
+	{
688
+		$this->_default_addressee_data = array(
689
+			'billing'                  => $this->_data->billing,
690
+			'taxes'                    => $this->_data->taxes,
691
+			'tax_line_items'           => $this->_data->tax_line_items,
692
+			'additional_line_items'    => $this->_data->additional_line_items,
693
+			'grand_total_line_item'    => $this->_data->grand_total_line_item,
694
+			'txn'                      => $this->_data->txn,
695
+			'payments'                 => $this->_data->payments,
696
+			'payment'                  => isset($this->_data->payment) && $this->_data->payment instanceof EE_Payment
697
+				? $this->_data->payment
698
+				: null,
699
+			'reg_objs'                 => $this->_data->reg_objs,
700
+			'registrations'            => $this->_data->registrations,
701
+			'datetimes'                => $this->_data->datetimes,
702
+			'tickets'                  => $this->_data->tickets,
703
+			'line_items_with_children' => $this->_data->line_items_with_children,
704
+			'questions'                => $this->_data->questions,
705
+			'answers'                  => $this->_data->answers,
706
+			'txn_status'               => $this->_data->txn_status,
707
+			'total_ticket_count'       => $this->_data->total_ticket_count,
708
+		);
709
+		if (is_array($this->_data->primary_attendee_data)) {
710
+			$this->_default_addressee_data                    = array_merge(
711
+				$this->_default_addressee_data,
712
+				$this->_data->primary_attendee_data
713
+			);
714
+			$this->_default_addressee_data['primary_att_obj'] = $this->_data->primary_attendee_data['att_obj'];
715
+			$this->_default_addressee_data['primary_reg_obj'] = $this->_data->primary_attendee_data['reg_obj'];
716
+		}
717
+	}
718
+
719
+
720
+
721
+	/********************
722 722
      * setup default shared addressee object/contexts
723 723
      * These can be utilized simply by defining the context in the child message type.
724 724
      * They can also be overridden if a specific message type needs to do something different for that context.
725 725
      ****************/
726
-    /**
727
-     * see abstract declaration in parent class for details, children message types can
728
-     * override these valid shortcodes if desired (we include all for all contexts by default).
729
-     */
730
-    protected function _set_valid_shortcodes()
731
-    {
732
-        $all_shortcodes = array(
733
-            'attendee_list',
734
-            'attendee',
735
-            'datetime_list',
736
-            'datetime',
737
-            'event_list',
738
-            'event_meta',
739
-            'event',
740
-            'organization',
741
-            'recipient_details',
742
-            'recipient_list',
743
-            'ticket_list',
744
-            'ticket',
745
-            'transaction',
746
-            'venue',
747
-            'primary_registration_details',
748
-            'primary_registration_list',
749
-            'event_author',
750
-            'email',
751
-            'messenger',
752
-        );
753
-        $contexts       = $this->get_contexts();
754
-        foreach ($contexts as $context => $details) {
755
-            $this->_valid_shortcodes[ $context ] = $all_shortcodes;
756
-            // make sure non admin context does not include the event_author shortcodes
757
-            if ($context != 'admin') {
758
-                if (($key = array_search('event_author', $this->_valid_shortcodes[ $context ])) !== false) {
759
-                    unset($this->_valid_shortcodes[ $context ][ $key ]);
760
-                }
761
-            }
762
-        }
763
-        // make sure admin context does not include the recipient_details shortcodes
764
-        // IF we have admin context hooked in message types might not have that context.
765
-        if (! empty($this->_valid_shortcodes['admin'])) {
766
-            if (($key = array_search('recipient_details', $this->_valid_shortcodes['admin'])) !== false) {
767
-                unset($this->_valid_shortcodes['admin'][ $key ]);
768
-            }
769
-            // make sure admin context does not include the recipient_details shortcodes
770
-            if (($key = array_search('recipient_list', $this->_valid_shortcodes['admin'])) !== false) {
771
-                unset($this->_valid_shortcodes['admin'][ $key ]);
772
-            }
773
-        }
774
-    }
775
-
776
-
777
-    /**
778
-     * Used by Validators to modify the valid shortcodes.
779
-     *
780
-     * @param  array $new_config array of valid shortcodes (by context)
781
-     * @return void               sets valid_shortcodes property
782
-     */
783
-    public function reset_valid_shortcodes_config($new_config)
784
-    {
785
-        foreach ($new_config as $context => $shortcodes) {
786
-            $this->_valid_shortcodes[ $context ] = $shortcodes;
787
-        }
788
-    }
789
-
790
-
791
-    /**
792
-     * returns an array of addressee objects for event_admins
793
-     *
794
-     * @access protected
795
-     * @return array array of EE_Messages_Addressee objects
796
-     * @throws EE_Error
797
-     * @throws InvalidArgumentException
798
-     * @throws InvalidDataTypeException
799
-     * @throws InvalidInterfaceException
800
-     */
801
-    protected function _admin_addressees()
802
-    {
803
-        $admin_events = array();
804
-        $addressees   = array();
805
-        // first we need to get the event admin user id for all the events
806
-        // and setup an addressee object for each unique admin user.
807
-        foreach ($this->_data->events as $line_ref => $event) {
808
-            $admin_id = $this->_get_event_admin_id($event['ID']);
809
-            // make sure we are just including the events that belong to this admin!
810
-            $admin_events[ $admin_id ][ $line_ref ] = $event;
811
-        }
812
-        // k now we can loop through the event_admins and setup the addressee data.
813
-        foreach ($admin_events as $admin_id => $event_details) {
814
-            $aee          = array(
815
-                'user_id'        => $admin_id,
816
-                'events'         => $event_details,
817
-                'attendees'      => $this->_data->attendees,
818
-                'recipient_id'   => $admin_id,
819
-                'recipient_type' => 'WP_User',
820
-            );
821
-            $aee          = array_merge($this->_default_addressee_data, $aee);
822
-            $addressees[] = new EE_Messages_Addressee($aee);
823
-        }
824
-        return $addressees;
825
-    }
826
-
827
-
828
-    /**
829
-     * Takes care of setting up the addressee object(s) for the primary attendee.
830
-     *
831
-     * @access protected
832
-     * @return array of EE_Addressee objects
833
-     * @throws EE_Error
834
-     */
835
-    protected function _primary_attendee_addressees()
836
-    {
837
-        $aee                   = $this->_default_addressee_data;
838
-        $aee['events']         = $this->_data->events;
839
-        $aee['attendees']      = $this->_data->attendees;
840
-        $aee['recipient_id']   = $aee['primary_att_obj'] instanceof EE_Attendee ? $aee['primary_att_obj']->ID() : 0;
841
-        $aee['recipient_type'] = 'Attendee';
842
-        // great now we can instantiate the $addressee object and return (as an array);
843
-        $add[] = new EE_Messages_Addressee($aee);
844
-        return $add;
845
-    }
846
-
847
-
848
-    /**
849
-     * Takes care of setting up the addressee object(s) for the registered attendees
850
-     *
851
-     * @access protected
852
-     * @return array of EE_Addressee objects
853
-     */
854
-    protected function _attendee_addressees()
855
-    {
856
-        $add = array();
857
-        // we just have to loop through the attendees.  We'll also set the attached events for each attendee.
858
-        // use to verify unique attendee emails... we don't want to sent multiple copies to the same attendee do we?
859
-        $already_processed = array();
860
-        foreach ($this->_data->attendees as $att_id => $details) {
861
-            // set the attendee array to blank on each loop;
862
-            $aee = array();
863
-            if (
864
-                isset($this->_data->reg_obj)
865
-                && ($this->_data->reg_obj->attendee_ID() != $att_id)
866
-                && $this->_single_message
867
-            ) {
868
-                continue;
869
-            }
870
-            // is $this->_regs_for_sending present?
871
-            // If so, let's make sure we ONLY generate addressee for registrations in that array.
872
-            if (! empty($this->_regs_for_sending) && is_array($this->_regs_for_sending)) {
873
-                $regs_allowed = array_intersect_key(array_flip($this->_regs_for_sending), $details['reg_objs']);
874
-                if (empty($regs_allowed)) {
875
-                    continue;
876
-                }
877
-            }
878
-            if (
879
-                apply_filters(
880
-                    'FHEE__EE_message_type___attendee_addressees__prevent_duplicate_email_sends',
881
-                    true,
882
-                    $this->_data,
883
-                    $this
884
-                )
885
-                && in_array($att_id, $already_processed, true)
886
-            ) {
887
-                continue;
888
-            }
889
-            $already_processed[] = $att_id;
890
-            foreach ($details as $item => $value) {
891
-                $aee[ $item ] = $value;
892
-                if ($item === 'line_ref') {
893
-                    foreach ($value as $event_id) {
894
-                        $aee['events'][ $event_id ] = $this->_data->events[ $event_id ];
895
-                    }
896
-                }
897
-                if ($item === 'attendee_email') {
898
-                    $aee['attendee_email'] = $value;
899
-                }
900
-                /*if ( $item == 'registration_id' ) {
726
+	/**
727
+	 * see abstract declaration in parent class for details, children message types can
728
+	 * override these valid shortcodes if desired (we include all for all contexts by default).
729
+	 */
730
+	protected function _set_valid_shortcodes()
731
+	{
732
+		$all_shortcodes = array(
733
+			'attendee_list',
734
+			'attendee',
735
+			'datetime_list',
736
+			'datetime',
737
+			'event_list',
738
+			'event_meta',
739
+			'event',
740
+			'organization',
741
+			'recipient_details',
742
+			'recipient_list',
743
+			'ticket_list',
744
+			'ticket',
745
+			'transaction',
746
+			'venue',
747
+			'primary_registration_details',
748
+			'primary_registration_list',
749
+			'event_author',
750
+			'email',
751
+			'messenger',
752
+		);
753
+		$contexts       = $this->get_contexts();
754
+		foreach ($contexts as $context => $details) {
755
+			$this->_valid_shortcodes[ $context ] = $all_shortcodes;
756
+			// make sure non admin context does not include the event_author shortcodes
757
+			if ($context != 'admin') {
758
+				if (($key = array_search('event_author', $this->_valid_shortcodes[ $context ])) !== false) {
759
+					unset($this->_valid_shortcodes[ $context ][ $key ]);
760
+				}
761
+			}
762
+		}
763
+		// make sure admin context does not include the recipient_details shortcodes
764
+		// IF we have admin context hooked in message types might not have that context.
765
+		if (! empty($this->_valid_shortcodes['admin'])) {
766
+			if (($key = array_search('recipient_details', $this->_valid_shortcodes['admin'])) !== false) {
767
+				unset($this->_valid_shortcodes['admin'][ $key ]);
768
+			}
769
+			// make sure admin context does not include the recipient_details shortcodes
770
+			if (($key = array_search('recipient_list', $this->_valid_shortcodes['admin'])) !== false) {
771
+				unset($this->_valid_shortcodes['admin'][ $key ]);
772
+			}
773
+		}
774
+	}
775
+
776
+
777
+	/**
778
+	 * Used by Validators to modify the valid shortcodes.
779
+	 *
780
+	 * @param  array $new_config array of valid shortcodes (by context)
781
+	 * @return void               sets valid_shortcodes property
782
+	 */
783
+	public function reset_valid_shortcodes_config($new_config)
784
+	{
785
+		foreach ($new_config as $context => $shortcodes) {
786
+			$this->_valid_shortcodes[ $context ] = $shortcodes;
787
+		}
788
+	}
789
+
790
+
791
+	/**
792
+	 * returns an array of addressee objects for event_admins
793
+	 *
794
+	 * @access protected
795
+	 * @return array array of EE_Messages_Addressee objects
796
+	 * @throws EE_Error
797
+	 * @throws InvalidArgumentException
798
+	 * @throws InvalidDataTypeException
799
+	 * @throws InvalidInterfaceException
800
+	 */
801
+	protected function _admin_addressees()
802
+	{
803
+		$admin_events = array();
804
+		$addressees   = array();
805
+		// first we need to get the event admin user id for all the events
806
+		// and setup an addressee object for each unique admin user.
807
+		foreach ($this->_data->events as $line_ref => $event) {
808
+			$admin_id = $this->_get_event_admin_id($event['ID']);
809
+			// make sure we are just including the events that belong to this admin!
810
+			$admin_events[ $admin_id ][ $line_ref ] = $event;
811
+		}
812
+		// k now we can loop through the event_admins and setup the addressee data.
813
+		foreach ($admin_events as $admin_id => $event_details) {
814
+			$aee          = array(
815
+				'user_id'        => $admin_id,
816
+				'events'         => $event_details,
817
+				'attendees'      => $this->_data->attendees,
818
+				'recipient_id'   => $admin_id,
819
+				'recipient_type' => 'WP_User',
820
+			);
821
+			$aee          = array_merge($this->_default_addressee_data, $aee);
822
+			$addressees[] = new EE_Messages_Addressee($aee);
823
+		}
824
+		return $addressees;
825
+	}
826
+
827
+
828
+	/**
829
+	 * Takes care of setting up the addressee object(s) for the primary attendee.
830
+	 *
831
+	 * @access protected
832
+	 * @return array of EE_Addressee objects
833
+	 * @throws EE_Error
834
+	 */
835
+	protected function _primary_attendee_addressees()
836
+	{
837
+		$aee                   = $this->_default_addressee_data;
838
+		$aee['events']         = $this->_data->events;
839
+		$aee['attendees']      = $this->_data->attendees;
840
+		$aee['recipient_id']   = $aee['primary_att_obj'] instanceof EE_Attendee ? $aee['primary_att_obj']->ID() : 0;
841
+		$aee['recipient_type'] = 'Attendee';
842
+		// great now we can instantiate the $addressee object and return (as an array);
843
+		$add[] = new EE_Messages_Addressee($aee);
844
+		return $add;
845
+	}
846
+
847
+
848
+	/**
849
+	 * Takes care of setting up the addressee object(s) for the registered attendees
850
+	 *
851
+	 * @access protected
852
+	 * @return array of EE_Addressee objects
853
+	 */
854
+	protected function _attendee_addressees()
855
+	{
856
+		$add = array();
857
+		// we just have to loop through the attendees.  We'll also set the attached events for each attendee.
858
+		// use to verify unique attendee emails... we don't want to sent multiple copies to the same attendee do we?
859
+		$already_processed = array();
860
+		foreach ($this->_data->attendees as $att_id => $details) {
861
+			// set the attendee array to blank on each loop;
862
+			$aee = array();
863
+			if (
864
+				isset($this->_data->reg_obj)
865
+				&& ($this->_data->reg_obj->attendee_ID() != $att_id)
866
+				&& $this->_single_message
867
+			) {
868
+				continue;
869
+			}
870
+			// is $this->_regs_for_sending present?
871
+			// If so, let's make sure we ONLY generate addressee for registrations in that array.
872
+			if (! empty($this->_regs_for_sending) && is_array($this->_regs_for_sending)) {
873
+				$regs_allowed = array_intersect_key(array_flip($this->_regs_for_sending), $details['reg_objs']);
874
+				if (empty($regs_allowed)) {
875
+					continue;
876
+				}
877
+			}
878
+			if (
879
+				apply_filters(
880
+					'FHEE__EE_message_type___attendee_addressees__prevent_duplicate_email_sends',
881
+					true,
882
+					$this->_data,
883
+					$this
884
+				)
885
+				&& in_array($att_id, $already_processed, true)
886
+			) {
887
+				continue;
888
+			}
889
+			$already_processed[] = $att_id;
890
+			foreach ($details as $item => $value) {
891
+				$aee[ $item ] = $value;
892
+				if ($item === 'line_ref') {
893
+					foreach ($value as $event_id) {
894
+						$aee['events'][ $event_id ] = $this->_data->events[ $event_id ];
895
+					}
896
+				}
897
+				if ($item === 'attendee_email') {
898
+					$aee['attendee_email'] = $value;
899
+				}
900
+				/*if ( $item == 'registration_id' ) {
901 901
                     $aee['attendee_registration_id'] = $value;
902 902
                 }/**/
903
-            }
904
-            // note the FIRST reg object in this array is the one
905
-            // we'll use for this attendee as the primary registration for this attendee.
906
-            $aee['reg_obj']        = reset($this->_data->attendees[ $att_id ]['reg_objs']);
907
-            $aee['attendees']      = $this->_data->attendees;
908
-            $aee['recipient_id']   = $att_id;
909
-            $aee['recipient_type'] = 'Attendee';
910
-            // merge in the primary attendee data
911
-            $aee   = array_merge($this->_default_addressee_data, $aee);
912
-            $add[] = new EE_Messages_Addressee($aee);
913
-        }
914
-        return $add;
915
-    }
916
-
917
-
918
-    /**
919
-     * @param $event_id
920
-     * @return int
921
-     * @throws EE_Error
922
-     * @throws InvalidArgumentException
923
-     * @throws InvalidDataTypeException
924
-     * @throws InvalidInterfaceException
925
-     */
926
-    protected function _get_event_admin_id($event_id)
927
-    {
928
-        $event = EEM_Event::instance()->get_one_by_ID($event_id);
929
-        return $event instanceof EE_Event ? $event->wp_user() : 0;
930
-    }
903
+			}
904
+			// note the FIRST reg object in this array is the one
905
+			// we'll use for this attendee as the primary registration for this attendee.
906
+			$aee['reg_obj']        = reset($this->_data->attendees[ $att_id ]['reg_objs']);
907
+			$aee['attendees']      = $this->_data->attendees;
908
+			$aee['recipient_id']   = $att_id;
909
+			$aee['recipient_type'] = 'Attendee';
910
+			// merge in the primary attendee data
911
+			$aee   = array_merge($this->_default_addressee_data, $aee);
912
+			$add[] = new EE_Messages_Addressee($aee);
913
+		}
914
+		return $add;
915
+	}
916
+
917
+
918
+	/**
919
+	 * @param $event_id
920
+	 * @return int
921
+	 * @throws EE_Error
922
+	 * @throws InvalidArgumentException
923
+	 * @throws InvalidDataTypeException
924
+	 * @throws InvalidInterfaceException
925
+	 */
926
+	protected function _get_event_admin_id($event_id)
927
+	{
928
+		$event = EEM_Event::instance()->get_one_by_ID($event_id);
929
+		return $event instanceof EE_Event ? $event->wp_user() : 0;
930
+	}
931 931
 }
Please login to merge, or discard this patch.
modules/messages/EED_Messages.module.php 3 patches
Doc Comments   +1 added lines, -1 removed lines patch added patch discarded remove patch
@@ -632,7 +632,7 @@
 block discarded – undo
632 632
      * @deprecated 4.9.0 Use EEH_MSG_Template::payment_status_to_message_type_array
633 633
      *                   or EEH_MSG_Template::convert_payment_status_to_message_type
634 634
      * @param string $payment_status The payment status being matched.
635
-     * @return bool|string The payment message type slug matching the status or false if no match.
635
+     * @return string|false The payment message type slug matching the status or false if no match.
636 636
      * @throws EE_Error
637 637
      * @throws InvalidArgumentException
638 638
      * @throws ReflectionException
Please login to merge, or discard this patch.
Indentation   +1328 added lines, -1328 removed lines patch added patch discarded remove patch
@@ -16,1341 +16,1341 @@
 block discarded – undo
16 16
 class EED_Messages extends EED_Module
17 17
 {
18 18
 
19
-    /**
20
-     * This holds the EE_messages controller
21
-     *
22
-     * @deprecated 4.9.0
23
-     * @var EE_messages $_EEMSG
24
-     */
25
-    protected static $_EEMSG;
26
-
27
-    /**
28
-     * @type EE_Message_Resource_Manager $_message_resource_manager
29
-     */
30
-    protected static $_message_resource_manager;
31
-
32
-    /**
33
-     * This holds the EE_Messages_Processor business class.
34
-     *
35
-     * @type EE_Messages_Processor
36
-     */
37
-    protected static $_MSG_PROCESSOR;
38
-
39
-    /**
40
-     * holds all the paths for various messages components.
41
-     * Utilized by autoloader registry
42
-     *
43
-     * @var array
44
-     */
45
-    protected static $_MSG_PATHS;
46
-
47
-
48
-    /**
49
-     * This will hold an array of messages template packs that are registered in the messages system.
50
-     * Format is:
51
-     * array(
52
-     *    'template_pack_dbref' => EE_Messages_Template_Pack (instance)
53
-     * )
54
-     *
55
-     * @var EE_Messages_Template_Pack[]
56
-     */
57
-    protected static $_TMP_PACKS = array();
58
-
59
-
60
-    /**
61
-     * @return EED_Messages
62
-     */
63
-    public static function instance()
64
-    {
65
-        return parent::get_instance(__CLASS__);
66
-    }
67
-
68
-
69
-    /**
70
-     *  set_hooks - for hooking into EE Core, other modules, etc
71
-     *
72
-     * @since 4.5.0
73
-     * @return    void
74
-     */
75
-    public static function set_hooks()
76
-    {
77
-        // actions
78
-        add_action('AHEE__EE_Payment_Processor__update_txn_based_on_payment', array('EED_Messages', 'payment'), 10, 2);
79
-        add_action(
80
-            'AHEE__EE_Registration_Processor__trigger_registration_update_notifications',
81
-            array('EED_Messages', 'maybe_registration'),
82
-            10,
83
-            2
84
-        );
85
-        // filters
86
-        add_filter(
87
-            'FHEE__EE_Registration__receipt_url__receipt_url',
88
-            array('EED_Messages', 'registration_message_trigger_url'),
89
-            10,
90
-            4
91
-        );
92
-        add_filter(
93
-            'FHEE__EE_Registration__invoice_url__invoice_url',
94
-            array('EED_Messages', 'registration_message_trigger_url'),
95
-            10,
96
-            4
97
-        );
98
-        // register routes
99
-        self::_register_routes();
100
-    }
101
-
102
-    /**
103
-     *    set_hooks_admin - for hooking into EE Admin Core, other modules, etc
104
-     *
105
-     * @access    public
106
-     * @return    void
107
-     */
108
-    public static function set_hooks_admin()
109
-    {
110
-        // actions
111
-        add_action('AHEE__EE_Payment_Processor__update_txn_based_on_payment', array('EED_Messages', 'payment'), 10, 2);
112
-        add_action(
113
-            'AHEE__Transactions_Admin_Page___send_payment_reminder__process_admin_payment_reminder',
114
-            array('EED_Messages', 'payment_reminder'),
115
-            10
116
-        );
117
-        add_action(
118
-            'AHEE__EE_Registration_Processor__trigger_registration_update_notifications',
119
-            array('EED_Messages', 'maybe_registration'),
120
-            10,
121
-            3
122
-        );
123
-        add_action(
124
-            'AHEE__Extend_Registrations_Admin_Page___newsletter_selected_send__with_registrations',
125
-            array('EED_Messages', 'send_newsletter_message'),
126
-            10,
127
-            2
128
-        );
129
-        add_action(
130
-            'AHEE__EES_Espresso_Cancelled__process_shortcode__transaction',
131
-            array('EED_Messages', 'cancelled_registration'),
132
-            10
133
-        );
134
-        add_action(
135
-            'AHEE__EE_Admin_Page___process_admin_payment_notification',
136
-            array('EED_Messages', 'process_admin_payment'),
137
-            10,
138
-            1
139
-        );
140
-        // filters
141
-        add_filter(
142
-            'FHEE__EE_Admin_Page___process_resend_registration__success',
143
-            array('EED_Messages', 'process_resend'),
144
-            10,
145
-            2
146
-        );
147
-        add_filter(
148
-            'FHEE__EE_Registration__receipt_url__receipt_url',
149
-            array('EED_Messages', 'registration_message_trigger_url'),
150
-            10,
151
-            4
152
-        );
153
-        add_filter(
154
-            'FHEE__EE_Registration__invoice_url__invoice_url',
155
-            array('EED_Messages', 'registration_message_trigger_url'),
156
-            10,
157
-            4
158
-        );
159
-    }
160
-
161
-
162
-    /**
163
-     * All the message triggers done by route go in here.
164
-     *
165
-     * @since 4.5.0
166
-     * @return void
167
-     */
168
-    protected static function _register_routes()
169
-    {
170
-        EE_Config::register_route('msg_url_trigger', 'Messages', 'run');
171
-        EE_Config::register_route('msg_cron_trigger', 'Messages', 'execute_batch_request');
172
-        EE_Config::register_route('msg_browser_trigger', 'Messages', 'browser_trigger');
173
-        EE_Config::register_route('msg_browser_error_trigger', 'Messages', 'browser_error_trigger');
174
-        do_action('AHEE__EED_Messages___register_routes');
175
-    }
176
-
177
-
178
-    /**
179
-     * This is called when a browser display trigger is executed.
180
-     * The browser display trigger is typically used when a already generated message is displayed directly in the
181
-     * browser.
182
-     *
183
-     * @since 4.9.0
184
-     * @param WP $WP
185
-     * @throws EE_Error
186
-     * @throws InvalidArgumentException
187
-     * @throws ReflectionException
188
-     * @throws InvalidDataTypeException
189
-     * @throws InvalidInterfaceException
190
-     */
191
-    public function browser_trigger($WP)
192
-    {
193
-        // ensure controller is loaded
194
-        self::_load_controller();
195
-        $token = EE_Registry::instance()->REQ->get('token');
196
-        try {
197
-            $mtg = new EE_Message_Generated_From_Token($token, 'html', self::$_message_resource_manager);
198
-            self::$_MSG_PROCESSOR->generate_and_send_now($mtg);
199
-        } catch (EE_Error $e) {
200
-            $error_msg = __(
201
-                'Please note that a system message failed to send due to a technical issue.',
202
-                'event_espresso'
203
-            );
204
-            // add specific message for developers if WP_DEBUG in on
205
-            $error_msg .= '||' . $e->getMessage();
206
-            EE_Error::add_error($error_msg, __FILE__, __FUNCTION__, __LINE__);
207
-        }
208
-    }
209
-
210
-
211
-    /**
212
-     * This is called when a browser error trigger is executed.
213
-     * When triggered this will grab the EE_Message matching the token in the request and use that to get the error
214
-     * message and display it.
215
-     *
216
-     * @since 4.9.0
217
-     * @param $WP
218
-     * @throws EE_Error
219
-     * @throws InvalidArgumentException
220
-     * @throws InvalidDataTypeException
221
-     * @throws InvalidInterfaceException
222
-     */
223
-    public function browser_error_trigger($WP)
224
-    {
225
-        $token = EE_Registry::instance()->REQ->get('token');
226
-        if ($token) {
227
-            $message = EEM_Message::instance()->get_one_by_token($token);
228
-            if ($message instanceof EE_Message) {
229
-                header('HTTP/1.1 200 OK');
230
-                $error_msg = nl2br($message->error_message());
231
-                ?>
19
+	/**
20
+	 * This holds the EE_messages controller
21
+	 *
22
+	 * @deprecated 4.9.0
23
+	 * @var EE_messages $_EEMSG
24
+	 */
25
+	protected static $_EEMSG;
26
+
27
+	/**
28
+	 * @type EE_Message_Resource_Manager $_message_resource_manager
29
+	 */
30
+	protected static $_message_resource_manager;
31
+
32
+	/**
33
+	 * This holds the EE_Messages_Processor business class.
34
+	 *
35
+	 * @type EE_Messages_Processor
36
+	 */
37
+	protected static $_MSG_PROCESSOR;
38
+
39
+	/**
40
+	 * holds all the paths for various messages components.
41
+	 * Utilized by autoloader registry
42
+	 *
43
+	 * @var array
44
+	 */
45
+	protected static $_MSG_PATHS;
46
+
47
+
48
+	/**
49
+	 * This will hold an array of messages template packs that are registered in the messages system.
50
+	 * Format is:
51
+	 * array(
52
+	 *    'template_pack_dbref' => EE_Messages_Template_Pack (instance)
53
+	 * )
54
+	 *
55
+	 * @var EE_Messages_Template_Pack[]
56
+	 */
57
+	protected static $_TMP_PACKS = array();
58
+
59
+
60
+	/**
61
+	 * @return EED_Messages
62
+	 */
63
+	public static function instance()
64
+	{
65
+		return parent::get_instance(__CLASS__);
66
+	}
67
+
68
+
69
+	/**
70
+	 *  set_hooks - for hooking into EE Core, other modules, etc
71
+	 *
72
+	 * @since 4.5.0
73
+	 * @return    void
74
+	 */
75
+	public static function set_hooks()
76
+	{
77
+		// actions
78
+		add_action('AHEE__EE_Payment_Processor__update_txn_based_on_payment', array('EED_Messages', 'payment'), 10, 2);
79
+		add_action(
80
+			'AHEE__EE_Registration_Processor__trigger_registration_update_notifications',
81
+			array('EED_Messages', 'maybe_registration'),
82
+			10,
83
+			2
84
+		);
85
+		// filters
86
+		add_filter(
87
+			'FHEE__EE_Registration__receipt_url__receipt_url',
88
+			array('EED_Messages', 'registration_message_trigger_url'),
89
+			10,
90
+			4
91
+		);
92
+		add_filter(
93
+			'FHEE__EE_Registration__invoice_url__invoice_url',
94
+			array('EED_Messages', 'registration_message_trigger_url'),
95
+			10,
96
+			4
97
+		);
98
+		// register routes
99
+		self::_register_routes();
100
+	}
101
+
102
+	/**
103
+	 *    set_hooks_admin - for hooking into EE Admin Core, other modules, etc
104
+	 *
105
+	 * @access    public
106
+	 * @return    void
107
+	 */
108
+	public static function set_hooks_admin()
109
+	{
110
+		// actions
111
+		add_action('AHEE__EE_Payment_Processor__update_txn_based_on_payment', array('EED_Messages', 'payment'), 10, 2);
112
+		add_action(
113
+			'AHEE__Transactions_Admin_Page___send_payment_reminder__process_admin_payment_reminder',
114
+			array('EED_Messages', 'payment_reminder'),
115
+			10
116
+		);
117
+		add_action(
118
+			'AHEE__EE_Registration_Processor__trigger_registration_update_notifications',
119
+			array('EED_Messages', 'maybe_registration'),
120
+			10,
121
+			3
122
+		);
123
+		add_action(
124
+			'AHEE__Extend_Registrations_Admin_Page___newsletter_selected_send__with_registrations',
125
+			array('EED_Messages', 'send_newsletter_message'),
126
+			10,
127
+			2
128
+		);
129
+		add_action(
130
+			'AHEE__EES_Espresso_Cancelled__process_shortcode__transaction',
131
+			array('EED_Messages', 'cancelled_registration'),
132
+			10
133
+		);
134
+		add_action(
135
+			'AHEE__EE_Admin_Page___process_admin_payment_notification',
136
+			array('EED_Messages', 'process_admin_payment'),
137
+			10,
138
+			1
139
+		);
140
+		// filters
141
+		add_filter(
142
+			'FHEE__EE_Admin_Page___process_resend_registration__success',
143
+			array('EED_Messages', 'process_resend'),
144
+			10,
145
+			2
146
+		);
147
+		add_filter(
148
+			'FHEE__EE_Registration__receipt_url__receipt_url',
149
+			array('EED_Messages', 'registration_message_trigger_url'),
150
+			10,
151
+			4
152
+		);
153
+		add_filter(
154
+			'FHEE__EE_Registration__invoice_url__invoice_url',
155
+			array('EED_Messages', 'registration_message_trigger_url'),
156
+			10,
157
+			4
158
+		);
159
+	}
160
+
161
+
162
+	/**
163
+	 * All the message triggers done by route go in here.
164
+	 *
165
+	 * @since 4.5.0
166
+	 * @return void
167
+	 */
168
+	protected static function _register_routes()
169
+	{
170
+		EE_Config::register_route('msg_url_trigger', 'Messages', 'run');
171
+		EE_Config::register_route('msg_cron_trigger', 'Messages', 'execute_batch_request');
172
+		EE_Config::register_route('msg_browser_trigger', 'Messages', 'browser_trigger');
173
+		EE_Config::register_route('msg_browser_error_trigger', 'Messages', 'browser_error_trigger');
174
+		do_action('AHEE__EED_Messages___register_routes');
175
+	}
176
+
177
+
178
+	/**
179
+	 * This is called when a browser display trigger is executed.
180
+	 * The browser display trigger is typically used when a already generated message is displayed directly in the
181
+	 * browser.
182
+	 *
183
+	 * @since 4.9.0
184
+	 * @param WP $WP
185
+	 * @throws EE_Error
186
+	 * @throws InvalidArgumentException
187
+	 * @throws ReflectionException
188
+	 * @throws InvalidDataTypeException
189
+	 * @throws InvalidInterfaceException
190
+	 */
191
+	public function browser_trigger($WP)
192
+	{
193
+		// ensure controller is loaded
194
+		self::_load_controller();
195
+		$token = EE_Registry::instance()->REQ->get('token');
196
+		try {
197
+			$mtg = new EE_Message_Generated_From_Token($token, 'html', self::$_message_resource_manager);
198
+			self::$_MSG_PROCESSOR->generate_and_send_now($mtg);
199
+		} catch (EE_Error $e) {
200
+			$error_msg = __(
201
+				'Please note that a system message failed to send due to a technical issue.',
202
+				'event_espresso'
203
+			);
204
+			// add specific message for developers if WP_DEBUG in on
205
+			$error_msg .= '||' . $e->getMessage();
206
+			EE_Error::add_error($error_msg, __FILE__, __FUNCTION__, __LINE__);
207
+		}
208
+	}
209
+
210
+
211
+	/**
212
+	 * This is called when a browser error trigger is executed.
213
+	 * When triggered this will grab the EE_Message matching the token in the request and use that to get the error
214
+	 * message and display it.
215
+	 *
216
+	 * @since 4.9.0
217
+	 * @param $WP
218
+	 * @throws EE_Error
219
+	 * @throws InvalidArgumentException
220
+	 * @throws InvalidDataTypeException
221
+	 * @throws InvalidInterfaceException
222
+	 */
223
+	public function browser_error_trigger($WP)
224
+	{
225
+		$token = EE_Registry::instance()->REQ->get('token');
226
+		if ($token) {
227
+			$message = EEM_Message::instance()->get_one_by_token($token);
228
+			if ($message instanceof EE_Message) {
229
+				header('HTTP/1.1 200 OK');
230
+				$error_msg = nl2br($message->error_message());
231
+				?>
232 232
                 <!DOCTYPE html>
233 233
                 <html>
234 234
                 <head></head>
235 235
                 <body>
236 236
                 <?php echo empty($error_msg)
237
-                    ? esc_html__(
238
-                        'Unfortunately, we were unable to capture the error message for this message.',
239
-                        'event_espresso'
240
-                    )
241
-                    : wp_kses(
242
-                        $error_msg,
243
-                        array(
244
-                            'a'      => array(
245
-                                'href'  => array(),
246
-                                'title' => array(),
247
-                            ),
248
-                            'span'   => array(),
249
-                            'div'    => array(),
250
-                            'p'      => array(),
251
-                            'strong' => array(),
252
-                            'em'     => array(),
253
-                            'br'     => array(),
254
-                        )
255
-                    ); ?>
237
+					? esc_html__(
238
+						'Unfortunately, we were unable to capture the error message for this message.',
239
+						'event_espresso'
240
+					)
241
+					: wp_kses(
242
+						$error_msg,
243
+						array(
244
+							'a'      => array(
245
+								'href'  => array(),
246
+								'title' => array(),
247
+							),
248
+							'span'   => array(),
249
+							'div'    => array(),
250
+							'p'      => array(),
251
+							'strong' => array(),
252
+							'em'     => array(),
253
+							'br'     => array(),
254
+						)
255
+					); ?>
256 256
                 </body>
257 257
                 </html>
258 258
                 <?php
259
-                exit;
260
-            }
261
-        }
262
-        return;
263
-    }
264
-
265
-
266
-    /**
267
-     *  This runs when the msg_url_trigger route has initiated.
268
-     *
269
-     * @since 4.5.0
270
-     * @param WP $WP
271
-     * @throws EE_Error
272
-     * @throws InvalidArgumentException
273
-     * @throws ReflectionException
274
-     * @throws InvalidDataTypeException
275
-     * @throws InvalidInterfaceException
276
-     */
277
-    public function run($WP)
278
-    {
279
-        // ensure controller is loaded
280
-        self::_load_controller();
281
-        // attempt to process message
282
-        try {
283
-            /** @type EE_Message_To_Generate_From_Request $message_to_generate */
284
-            $message_to_generate = EE_Registry::instance()->load_lib('Message_To_Generate_From_Request');
285
-            self::$_MSG_PROCESSOR->generate_and_send_now($message_to_generate);
286
-        } catch (EE_Error $e) {
287
-            $error_msg = __(
288
-                'Please note that a system message failed to send due to a technical issue.',
289
-                'event_espresso'
290
-            );
291
-            // add specific message for developers if WP_DEBUG in on
292
-            $error_msg .= '||' . $e->getMessage();
293
-            EE_Error::add_error($error_msg, __FILE__, __FUNCTION__, __LINE__);
294
-        }
295
-    }
296
-
297
-
298
-    /**
299
-     * This is triggered by the 'msg_cron_trigger' route.
300
-     *
301
-     * @param WP $WP
302
-     */
303
-    public function execute_batch_request($WP)
304
-    {
305
-        $this->run_cron();
306
-        header('HTTP/1.1 200 OK');
307
-        exit();
308
-    }
309
-
310
-
311
-    /**
312
-     * This gets executed on wp_cron jobs or when a batch request is initiated on its own separate non regular wp
313
-     * request.
314
-     */
315
-    public function run_cron()
316
-    {
317
-        self::_load_controller();
318
-        // get required vars
319
-        $cron_type = EE_Registry::instance()->REQ->get('type');
320
-        $transient_key = EE_Registry::instance()->REQ->get('key');
321
-
322
-        // now let's verify transient, if not valid exit immediately
323
-        if (! get_transient($transient_key)) {
324
-            /**
325
-             * trigger error so this gets in the error logs.  This is important because it happens on a non-user
326
-             * request.
327
-             */
328
-            trigger_error(esc_attr__('Invalid Request (Transient does not exist)', 'event_espresso'));
329
-        }
330
-
331
-        // if made it here, lets' delete the transient to keep the db clean
332
-        delete_transient($transient_key);
333
-
334
-        if (apply_filters('FHEE__EED_Messages__run_cron__use_wp_cron', true)) {
335
-            $method = 'batch_' . $cron_type . '_from_queue';
336
-            if (method_exists(self::$_MSG_PROCESSOR, $method)) {
337
-                self::$_MSG_PROCESSOR->$method();
338
-            } else {
339
-                // no matching task
340
-                /**
341
-                 * trigger error so this gets in the error logs.  This is important because it happens on a non user
342
-                 * request.
343
-                 */
344
-                trigger_error(
345
-                    esc_attr(
346
-                        sprintf(
347
-                            __('There is no task corresponding to this route %s', 'event_espresso'),
348
-                            $cron_type
349
-                        )
350
-                    )
351
-                );
352
-            }
353
-        }
354
-
355
-        do_action('FHEE__EED_Messages__run_cron__end');
356
-    }
357
-
358
-
359
-    /**
360
-     * This is used to retrieve the template pack for the given name.
361
-     * Retrieved packs are cached on the static $_TMP_PACKS array.  If there is no class matching the given name then
362
-     * the default template pack is returned.
363
-     *
364
-     * @deprecated 4.9.0  @see EEH_MSG_Template::get_template_pack()
365
-     * @param string $template_pack_name This should correspond to the dbref of the template pack (which is also used
366
-     *                                   in generating the Pack class name).
367
-     * @return EE_Messages_Template_Pack
368
-     * @throws EE_Error
369
-     * @throws InvalidArgumentException
370
-     * @throws ReflectionException
371
-     * @throws InvalidDataTypeException
372
-     * @throws InvalidInterfaceException
373
-     */
374
-    public static function get_template_pack($template_pack_name)
375
-    {
376
-        EE_Registry::instance()->load_helper('MSG_Template');
377
-        return EEH_MSG_Template::get_template_pack($template_pack_name);
378
-    }
379
-
380
-
381
-    /**
382
-     * Retrieves an array of all template packs.
383
-     * Array is in the format array( 'dbref' => EE_Messages_Template_Pack )
384
-     *
385
-     * @deprecated 4.9.0  @see EEH_MSG_Template_Pack::get_template_pack_collection
386
-     * @return EE_Messages_Template_Pack[]
387
-     * @throws EE_Error
388
-     * @throws InvalidArgumentException
389
-     * @throws ReflectionException
390
-     * @throws InvalidDataTypeException
391
-     * @throws InvalidInterfaceException
392
-     */
393
-    public static function get_template_packs()
394
-    {
395
-        EE_Registry::instance()->load_helper('MSG_Template');
396
-
397
-        // for backward compat, let's make sure this returns in the same format as originally.
398
-        $template_pack_collection = EEH_MSG_Template::get_template_pack_collection();
399
-        $template_pack_collection->rewind();
400
-        $template_packs = array();
401
-        while ($template_pack_collection->valid()) {
402
-            $template_packs[ $template_pack_collection->current()->dbref ] = $template_pack_collection->current();
403
-            $template_pack_collection->next();
404
-        }
405
-        return $template_packs;
406
-    }
407
-
408
-
409
-    /**
410
-     * This simply makes sure the autoloaders are registered for the EE_messages system.
411
-     *
412
-     * @since 4.5.0
413
-     * @return void
414
-     * @throws EE_Error
415
-     */
416
-    public static function set_autoloaders()
417
-    {
418
-        if (empty(self::$_MSG_PATHS)) {
419
-            self::_set_messages_paths();
420
-            foreach (self::$_MSG_PATHS as $path) {
421
-                EEH_Autoloader::register_autoloaders_for_each_file_in_folder($path);
422
-            }
423
-            // add aliases
424
-            EEH_Autoloader::add_alias('EE_messages', 'EE_messages');
425
-            EEH_Autoloader::add_alias('EE_messenger', 'EE_messenger');
426
-        }
427
-    }
428
-
429
-
430
-    /**
431
-     * Take care of adding all the paths for the messages components to the $_MSG_PATHS property
432
-     * for use by the Messages Autoloaders
433
-     *
434
-     * @since 4.5.0
435
-     * @return void.
436
-     */
437
-    protected static function _set_messages_paths()
438
-    {
439
-        self::$_MSG_PATHS = apply_filters(
440
-            'FHEE__EED_Messages___set_messages_paths___MSG_PATHS',
441
-            [
442
-                EE_LIBRARIES . 'messages/message_type',
443
-                EE_LIBRARIES . 'messages/messenger',
444
-                EE_LIBRARIES . 'messages/defaults',
445
-                EE_LIBRARIES . 'messages/defaults/email',
446
-                EE_LIBRARIES . 'messages/data_class',
447
-                EE_LIBRARIES . 'messages/validators',
448
-                EE_LIBRARIES . 'messages/validators/email',
449
-                EE_LIBRARIES . 'messages/validators/html',
450
-                EE_LIBRARIES . 'shortcodes',
451
-            ]
452
-        );
453
-    }
454
-
455
-
456
-    /**
457
-     * Takes care of loading dependencies
458
-     *
459
-     * @since 4.5.0
460
-     * @return void
461
-     * @throws EE_Error
462
-     * @throws InvalidArgumentException
463
-     * @throws ReflectionException
464
-     * @throws InvalidDataTypeException
465
-     * @throws InvalidInterfaceException
466
-     */
467
-    protected static function _load_controller()
468
-    {
469
-        if (! self::$_MSG_PROCESSOR instanceof EE_Messages_Processor) {
470
-            EE_Registry::instance()->load_core('Request_Handler');
471
-            self::set_autoloaders();
472
-            self::$_EEMSG = EE_Registry::instance()->load_lib('messages');
473
-            self::$_MSG_PROCESSOR = EE_Registry::instance()->load_lib('Messages_Processor');
474
-            self::$_message_resource_manager = EE_Registry::instance()->load_lib('Message_Resource_Manager');
475
-        }
476
-    }
477
-
478
-
479
-    /**
480
-     * @param EE_Transaction $transaction
481
-     * @throws EE_Error
482
-     * @throws InvalidArgumentException
483
-     * @throws InvalidDataTypeException
484
-     * @throws InvalidInterfaceException
485
-     * @throws ReflectionException
486
-     */
487
-    public static function payment_reminder(EE_Transaction $transaction)
488
-    {
489
-        self::_load_controller();
490
-        $data = array($transaction, null);
491
-        self::$_MSG_PROCESSOR->generate_for_all_active_messengers('payment_reminder', $data);
492
-    }
493
-
494
-
495
-    /**
496
-     * Any messages triggers for after successful gateway payments should go in here.
497
-     *
498
-     * @param EE_Transaction  $transaction object
499
-     * @param EE_Payment|null $payment     object
500
-     * @return void
501
-     * @throws EE_Error
502
-     * @throws InvalidArgumentException
503
-     * @throws ReflectionException
504
-     * @throws InvalidDataTypeException
505
-     * @throws InvalidInterfaceException
506
-     */
507
-    public static function payment(EE_Transaction $transaction, EE_Payment $payment = null)
508
-    {
509
-        // if there's no payment object, then we cannot do a payment type message!
510
-        if (! $payment instanceof EE_Payment) {
511
-            return;
512
-        }
513
-        self::_load_controller();
514
-        $data = array($transaction, $payment);
515
-        EE_Registry::instance()->load_helper('MSG_Template');
516
-        $message_type = EEH_MSG_Template::convert_payment_status_to_message_type($payment->STS_ID());
517
-        // if payment amount is less than 0 then switch to payment_refund message type.
518
-        $message_type = $payment->amount() < 0 ? 'payment_refund' : $message_type;
519
-        self::$_MSG_PROCESSOR->generate_for_all_active_messengers($message_type, $data);
520
-    }
521
-
522
-
523
-    /**
524
-     * @param EE_Transaction $transaction
525
-     * @throws EE_Error
526
-     * @throws InvalidArgumentException
527
-     * @throws InvalidDataTypeException
528
-     * @throws InvalidInterfaceException
529
-     * @throws ReflectionException
530
-     */
531
-    public static function cancelled_registration(EE_Transaction $transaction)
532
-    {
533
-        self::_load_controller();
534
-        $data = array($transaction, null);
535
-        self::$_MSG_PROCESSOR->generate_for_all_active_messengers('cancelled_registration', $data);
536
-    }
537
-
538
-
539
-    /**
540
-     * Trigger for Registration messages
541
-     * Note that what registration message type is sent depends on what the reg status is for the registrations on the
542
-     * incoming transaction.
543
-     *
544
-     * @param EE_Registration $registration
545
-     * @param array           $extra_details
546
-     * @return void
547
-     * @throws EE_Error
548
-     * @throws InvalidArgumentException
549
-     * @throws InvalidDataTypeException
550
-     * @throws InvalidInterfaceException
551
-     * @throws ReflectionException
552
-     * @throws EntityNotFoundException
553
-     */
554
-    public static function maybe_registration(EE_Registration $registration, $extra_details = array())
555
-    {
556
-
557
-        if (! self::_verify_registration_notification_send($registration, $extra_details)) {
558
-            // no messages please
559
-            return;
560
-        }
561
-
562
-        // get all non-trashed registrations so we make sure we send messages for the right status.
563
-        $all_registrations = $registration->transaction()->registrations(
564
-            array(
565
-                array('REG_deleted' => false),
566
-                'order_by' => array(
567
-                    'Event.EVT_name'     => 'ASC',
568
-                    'Attendee.ATT_lname' => 'ASC',
569
-                    'Attendee.ATT_fname' => 'ASC',
570
-                ),
571
-            )
572
-        );
573
-        // cached array of statuses so we only trigger messages once per status.
574
-        $statuses_sent = array();
575
-        self::_load_controller();
576
-        $mtgs = array();
577
-
578
-        // loop through registrations and trigger messages once per status.
579
-        foreach ($all_registrations as $reg) {
580
-            // already triggered?
581
-            if (in_array($reg->status_ID(), $statuses_sent)) {
582
-                continue;
583
-            }
584
-
585
-            $message_type = EEH_MSG_Template::convert_reg_status_to_message_type($reg->status_ID());
586
-            $mtgs = array_merge(
587
-                $mtgs,
588
-                self::$_MSG_PROCESSOR->setup_mtgs_for_all_active_messengers(
589
-                    $message_type,
590
-                    array($registration->transaction(), null, $reg->status_ID())
591
-                )
592
-            );
593
-            $statuses_sent[] = $reg->status_ID();
594
-        }
595
-
596
-        if (count($statuses_sent) > 1) {
597
-            $mtgs = array_merge(
598
-                $mtgs,
599
-                self::$_MSG_PROCESSOR->setup_mtgs_for_all_active_messengers(
600
-                    'registration_summary',
601
-                    array($registration->transaction(), null)
602
-                )
603
-            );
604
-        }
605
-
606
-        // batch queue and initiate request
607
-        self::$_MSG_PROCESSOR->batch_queue_for_generation_and_persist($mtgs);
608
-        self::$_MSG_PROCESSOR->get_queue()->initiate_request_by_priority();
609
-    }
610
-
611
-
612
-    /**
613
-     * This is a helper method used to very whether a registration notification should be sent or
614
-     * not.  Prevents duplicate notifications going out for registration context notifications.
615
-     *
616
-     * @param EE_Registration $registration  [description]
617
-     * @param array           $extra_details [description]
618
-     * @return bool          true = send away, false = nope halt the presses.
619
-     */
620
-    protected static function _verify_registration_notification_send(
621
-        EE_Registration $registration,
622
-        $extra_details = array()
623
-    ) {
624
-        if (! $registration->is_primary_registrant()) {
625
-            return false;
626
-        }
627
-        // first we check if we're in admin and not doing front ajax
628
-        if (is_admin() && ! EE_FRONT_AJAX) {
629
-            // make sure appropriate admin params are set for sending messages
630
-            if (
631
-                empty($_REQUEST['txn_reg_status_change']['send_notifications'])
632
-                || ! absint($_REQUEST['txn_reg_status_change']['send_notifications'])
633
-            ) {
634
-                // no messages sent please.
635
-                return false;
636
-            }
637
-        } else {
638
-            // frontend request (either regular or via AJAX)
639
-            // TXN is NOT finalized ?
640
-            if (! isset($extra_details['finalized']) || $extra_details['finalized'] === false) {
641
-                return false;
642
-            }
643
-            // return visit but nothing changed ???
644
-            if (
645
-                isset($extra_details['revisit'], $extra_details['status_updates']) &&
646
-                $extra_details['revisit'] && ! $extra_details['status_updates']
647
-            ) {
648
-                return false;
649
-            }
650
-            // NOT sending messages && reg status is something other than "Not-Approved"
651
-            if (
652
-                ! apply_filters('FHEE__EED_Messages___maybe_registration__deliver_notifications', false) &&
653
-                $registration->status_ID() !== EEM_Registration::status_id_not_approved
654
-            ) {
655
-                return false;
656
-            }
657
-        }
658
-        // release the kraken
659
-        return true;
660
-    }
661
-
662
-
663
-    /**
664
-     * Simply returns an array indexed by Registration Status ID and the related message_type name associated with that
665
-     * status id.
666
-     *
667
-     * @deprecated 4.9.0  Use EEH_MSG_Template::reg_status_to_message_type_array()
668
-     *                    or EEH_MSG_Template::convert_reg_status_to_message_type
669
-     * @param string $reg_status
670
-     * @return array
671
-     * @throws EE_Error
672
-     * @throws InvalidArgumentException
673
-     * @throws ReflectionException
674
-     * @throws InvalidDataTypeException
675
-     * @throws InvalidInterfaceException
676
-     */
677
-    protected static function _get_reg_status_array($reg_status = '')
678
-    {
679
-        EE_Registry::instance()->load_helper('MSG_Template');
680
-        return EEH_MSG_Template::convert_reg_status_to_message_type($reg_status)
681
-            ? EEH_MSG_Template::convert_reg_status_to_message_type($reg_status)
682
-            : EEH_MSG_Template::reg_status_to_message_type_array();
683
-    }
684
-
685
-
686
-    /**
687
-     * Simply returns the payment message type for the given payment status.
688
-     *
689
-     * @deprecated 4.9.0 Use EEH_MSG_Template::payment_status_to_message_type_array
690
-     *                   or EEH_MSG_Template::convert_payment_status_to_message_type
691
-     * @param string $payment_status The payment status being matched.
692
-     * @return bool|string The payment message type slug matching the status or false if no match.
693
-     * @throws EE_Error
694
-     * @throws InvalidArgumentException
695
-     * @throws ReflectionException
696
-     * @throws InvalidDataTypeException
697
-     * @throws InvalidInterfaceException
698
-     */
699
-    protected static function _get_payment_message_type($payment_status)
700
-    {
701
-        EE_Registry::instance()->load_helper('MSG_Template');
702
-        return EEH_MSG_Template::convert_payment_status_to_message_type($payment_status)
703
-            ? EEH_MSG_Template::convert_payment_status_to_message_type($payment_status)
704
-            : false;
705
-    }
706
-
707
-
708
-    /**
709
-     * Message triggers for a resending already sent message(s) (via EE_Message list table)
710
-     *
711
-     * @access public
712
-     * @param array $req_data This is the $_POST & $_GET data sent from EE_Admin Pages
713
-     * @return bool success/fail
714
-     * @throws EE_Error
715
-     * @throws InvalidArgumentException
716
-     * @throws InvalidDataTypeException
717
-     * @throws InvalidInterfaceException
718
-     * @throws ReflectionException
719
-     */
720
-    public static function process_resend($req_data)
721
-    {
722
-        self::_load_controller();
723
-
724
-        // if $msgID in this request then skip to the new resend_message
725
-        if (EE_Registry::instance()->REQ->get('MSG_ID')) {
726
-            return self::resend_message();
727
-        }
728
-
729
-        // make sure any incoming request data is set on the REQ so that it gets picked up later.
730
-        $req_data = (array) $req_data;
731
-        foreach ($req_data as $request_key => $request_value) {
732
-            EE_Registry::instance()->REQ->set($request_key, $request_value);
733
-        }
734
-
735
-        if (
736
-            ! $messages_to_send = self::$_MSG_PROCESSOR->setup_messages_to_generate_from_registration_ids_in_request(
737
-            )
738
-        ) {
739
-            return false;
740
-        }
741
-
742
-        try {
743
-            self::$_MSG_PROCESSOR->batch_queue_for_generation_and_persist($messages_to_send);
744
-            self::$_MSG_PROCESSOR->get_queue()->initiate_request_by_priority();
745
-        } catch (EE_Error $e) {
746
-            EE_Error::add_error($e->getMessage(), __FILE__, __FUNCTION__, __LINE__);
747
-            return false;
748
-        }
749
-        EE_Error::add_success(
750
-            __('Messages have been successfully queued for generation and sending.', 'event_espresso')
751
-        );
752
-        return true; // everything got queued.
753
-    }
754
-
755
-
756
-    /**
757
-     * Message triggers for a resending already sent message(s) (via EE_Message list table)
758
-     *
759
-     * @return bool
760
-     * @throws EE_Error
761
-     * @throws InvalidArgumentException
762
-     * @throws InvalidDataTypeException
763
-     * @throws InvalidInterfaceException
764
-     * @throws ReflectionException
765
-     */
766
-    public static function resend_message()
767
-    {
768
-        self::_load_controller();
769
-
770
-        $msgID = EE_Registry::instance()->REQ->get('MSG_ID');
771
-        if (! $msgID) {
772
-            EE_Error::add_error(
773
-                __(
774
-                    'Something went wrong because there is no "MSG_ID" value in the request',
775
-                    'event_espresso'
776
-                ),
777
-                __FILE__,
778
-                __FUNCTION__,
779
-                __LINE__
780
-            );
781
-            return false;
782
-        }
783
-
784
-        self::$_MSG_PROCESSOR->setup_messages_from_ids_and_send((array) $msgID);
785
-
786
-        // setup success message.
787
-        $count_ready_for_resend = self::$_MSG_PROCESSOR->get_queue()->count_STS_in_queue(EEM_Message::status_resend);
788
-        EE_Error::add_success(
789
-            sprintf(
790
-                _n(
791
-                    'There was %d message queued for resending.',
792
-                    'There were %d messages queued for resending.',
793
-                    $count_ready_for_resend,
794
-                    'event_espresso'
795
-                ),
796
-                $count_ready_for_resend
797
-            )
798
-        );
799
-        return true;
800
-    }
801
-
802
-
803
-    /**
804
-     * Message triggers for manual payment applied by admin
805
-     *
806
-     * @param  EE_Payment $payment EE_payment object
807
-     * @return bool success/fail
808
-     * @throws EE_Error
809
-     * @throws InvalidArgumentException
810
-     * @throws ReflectionException
811
-     * @throws InvalidDataTypeException
812
-     * @throws InvalidInterfaceException
813
-     */
814
-    public static function process_admin_payment(EE_Payment $payment)
815
-    {
816
-        EE_Registry::instance()->load_helper('MSG_Template');
817
-        // we need to get the transaction object
818
-        $transaction = $payment->transaction();
819
-        if ($transaction instanceof EE_Transaction) {
820
-            $data = array($transaction, $payment);
821
-            $message_type = EEH_MSG_Template::convert_payment_status_to_message_type($payment->STS_ID());
822
-
823
-            // if payment amount is less than 0 then switch to payment_refund message type.
824
-            $message_type = $payment->amount() < 0 ? 'payment_refund' : $message_type;
825
-
826
-            // if payment_refund is selected, but the status is NOT accepted.  Then change message type to false so NO message notification goes out.
827
-            $message_type = $message_type == 'payment_refund' && $payment->STS_ID() != EEM_Payment::status_id_approved
828
-                ? false : $message_type;
829
-
830
-            self::_load_controller();
831
-
832
-            self::$_MSG_PROCESSOR->generate_for_all_active_messengers($message_type, $data);
833
-
834
-            // get count of queued for generation
835
-            $count_to_generate = self::$_MSG_PROCESSOR->get_queue()->count_STS_in_queue(
836
-                array(
837
-                    EEM_Message::status_incomplete,
838
-                    EEM_Message::status_idle,
839
-                )
840
-            );
841
-
842
-            if ($count_to_generate > 0 && self::$_MSG_PROCESSOR->get_queue()->get_message_repository()->count() !== 0) {
843
-                add_filter('FHEE__EE_Admin_Page___process_admin_payment_notification__success', '__return_true');
844
-                return true;
845
-            } else {
846
-                $count_failed = self::$_MSG_PROCESSOR->get_queue()->count_STS_in_queue(
847
-                    EEM_Message::instance()->stati_indicating_failed_sending()
848
-                );
849
-                /**
850
-                 * Verify that there are actually errors.  If not then we return a success message because the queue might have been emptied due to successful
851
-                 * IMMEDIATE generation.
852
-                 */
853
-                if ($count_failed > 0) {
854
-                    EE_Error::add_error(
855
-                        sprintf(
856
-                            _n(
857
-                                'The payment notification generation failed.',
858
-                                '%d payment notifications failed being sent.',
859
-                                $count_failed,
860
-                                'event_espresso'
861
-                            ),
862
-                            $count_failed
863
-                        ),
864
-                        __FILE__,
865
-                        __FUNCTION__,
866
-                        __LINE__
867
-                    );
868
-
869
-                    return false;
870
-                } else {
871
-                    add_filter('FHEE__EE_Admin_Page___process_admin_payment_notification__success', '__return_true');
872
-                    return true;
873
-                }
874
-            }
875
-        } else {
876
-            EE_Error::add_error(
877
-                'Unable to generate the payment notification because the given value for the transaction is invalid.',
878
-                'event_espresso'
879
-            );
880
-            return false;
881
-        }
882
-    }
883
-
884
-
885
-    /**
886
-     * Callback for AHEE__Extend_Registrations_Admin_Page___newsletter_selected_send_with_registrations trigger
887
-     *
888
-     * @since   4.3.0
889
-     * @param  EE_Registration[] $registrations an array of EE_Registration objects
890
-     * @param  int               $grp_id        a specific message template group id.
891
-     * @return void
892
-     * @throws EE_Error
893
-     * @throws InvalidArgumentException
894
-     * @throws InvalidDataTypeException
895
-     * @throws InvalidInterfaceException
896
-     * @throws ReflectionException
897
-     */
898
-    public static function send_newsletter_message($registrations, $grp_id)
899
-    {
900
-        // make sure mtp is id and set it in the EE_Request Handler later messages setup.
901
-        EE_Registry::instance()->REQ->set('GRP_ID', (int) $grp_id);
902
-        self::_load_controller();
903
-        self::$_MSG_PROCESSOR->generate_for_all_active_messengers('newsletter', $registrations);
904
-    }
905
-
906
-
907
-    /**
908
-     * Callback for FHEE__EE_Registration__invoice_url__invoice_url or FHEE__EE_Registration__receipt_url__receipt_url
909
-     *
910
-     * @since   4.3.0
911
-     * @param    string          $registration_message_trigger_url
912
-     * @param    EE_Registration $registration
913
-     * @param string             $messenger
914
-     * @param string             $message_type
915
-     * @return string
916
-     * @throws EE_Error
917
-     * @throws InvalidArgumentException
918
-     * @throws InvalidDataTypeException
919
-     * @throws InvalidInterfaceException
920
-     */
921
-    public static function registration_message_trigger_url(
922
-        $registration_message_trigger_url,
923
-        EE_Registration $registration,
924
-        $messenger = 'html',
925
-        $message_type = 'invoice'
926
-    ) {
927
-        // whitelist $messenger
928
-        switch ($messenger) {
929
-            case 'pdf':
930
-                $sending_messenger = 'pdf';
931
-                $generating_messenger = 'html';
932
-                break;
933
-            case 'html':
934
-            default:
935
-                $sending_messenger = 'html';
936
-                $generating_messenger = 'html';
937
-                break;
938
-        }
939
-        // whitelist $message_type
940
-        switch ($message_type) {
941
-            case 'receipt':
942
-                $message_type = 'receipt';
943
-                break;
944
-            case 'invoice':
945
-            default:
946
-                $message_type = 'invoice';
947
-                break;
948
-        }
949
-        // verify that both the messenger AND the message type are active
950
-        if (
951
-            EEH_MSG_Template::is_messenger_active($sending_messenger)
952
-            && EEH_MSG_Template::is_mt_active($message_type)
953
-        ) {
954
-            // need to get the correct message template group for this (i.e. is there a custom invoice for the event this registration is registered for?)
955
-            $template_query_params = array(
956
-                'MTP_is_active'    => true,
957
-                'MTP_messenger'    => $generating_messenger,
958
-                'MTP_message_type' => $message_type,
959
-                'Event.EVT_ID'     => $registration->event_ID(),
960
-            );
961
-            // get the message template group.
962
-            $msg_template_group = EEM_Message_Template_Group::instance()->get_one(array($template_query_params));
963
-            // if we don't have an EE_Message_Template_Group then return
964
-            if (! $msg_template_group instanceof EE_Message_Template_Group) {
965
-                // remove EVT_ID from query params so that global templates get picked up
966
-                unset($template_query_params['Event.EVT_ID']);
967
-                // get global template as the fallback
968
-                $msg_template_group = EEM_Message_Template_Group::instance()->get_one(array($template_query_params));
969
-            }
970
-            // if we don't have an EE_Message_Template_Group then return
971
-            if (! $msg_template_group instanceof EE_Message_Template_Group) {
972
-                return '';
973
-            }
974
-            // generate the URL
975
-            $registration_message_trigger_url = EEH_MSG_Template::generate_url_trigger(
976
-                $sending_messenger,
977
-                $generating_messenger,
978
-                'purchaser',
979
-                $message_type,
980
-                $registration,
981
-                $msg_template_group->ID(),
982
-                $registration->transaction_ID()
983
-            );
984
-        }
985
-        return $registration_message_trigger_url;
986
-    }
987
-
988
-
989
-    /**
990
-     * Use to generate and return a message preview!
991
-     *
992
-     * @param  string $type      This should correspond with a valid message type
993
-     * @param  string $context   This should correspond with a valid context for the message type
994
-     * @param  string $messenger This should correspond with a valid messenger.
995
-     * @param bool    $send      true we will do a test send using the messenger delivery, false we just do a regular
996
-     *                           preview
997
-     * @return bool|string The body of the message or if send is requested, sends.
998
-     * @throws EE_Error
999
-     * @throws InvalidArgumentException
1000
-     * @throws InvalidDataTypeException
1001
-     * @throws InvalidInterfaceException
1002
-     * @throws ReflectionException
1003
-     */
1004
-    public static function preview_message($type, $context, $messenger, $send = false)
1005
-    {
1006
-        self::_load_controller();
1007
-        $mtg = new EE_Message_To_Generate(
1008
-            $messenger,
1009
-            $type,
1010
-            array(),
1011
-            $context,
1012
-            true
1013
-        );
1014
-        $generated_preview_queue = self::$_MSG_PROCESSOR->generate_for_preview($mtg, $send);
1015
-        if ($generated_preview_queue instanceof EE_Messages_Queue) {
1016
-            // loop through all content for the preview and remove any persisted records.
1017
-            $content = '';
1018
-            foreach ($generated_preview_queue->get_message_repository() as $message) {
1019
-                $content = $message->content();
1020
-                if ($message->ID() > 0 && $message->STS_ID() !== EEM_Message::status_failed) {
1021
-                    $message->delete();
1022
-                }
1023
-            }
1024
-            return $content;
1025
-        } else {
1026
-            return $generated_preview_queue;
1027
-        }
1028
-    }
1029
-
1030
-
1031
-    /**
1032
-     * This is a method that allows for sending a message using a messenger matching the string given and the provided
1033
-     * EE_Message_Queue object.  The EE_Message_Queue object is used to create a single aggregate EE_Message via the
1034
-     * content found in the EE_Message objects in the queue.
1035
-     *
1036
-     * @since 4.9.0
1037
-     * @param string            $messenger            a string matching a valid active messenger in the system
1038
-     * @param string            $message_type         Although it seems contrary to the name of the method, a message
1039
-     *                                                type name is still required to send along the message type to the
1040
-     *                                                messenger because this is used for determining what specific
1041
-     *                                                variations might be loaded for the generated message.
1042
-     * @param EE_Messages_Queue $queue
1043
-     * @param string            $custom_subject       Can be used to set what the custom subject string will be on the
1044
-     *                                                aggregate EE_Message object.
1045
-     * @return bool success or fail.
1046
-     * @throws EE_Error
1047
-     * @throws InvalidArgumentException
1048
-     * @throws ReflectionException
1049
-     * @throws InvalidDataTypeException
1050
-     * @throws InvalidInterfaceException
1051
-     */
1052
-    public static function send_message_with_messenger_only(
1053
-        $messenger,
1054
-        $message_type,
1055
-        EE_Messages_Queue $queue,
1056
-        $custom_subject = ''
1057
-    ) {
1058
-        self::_load_controller();
1059
-        /** @type EE_Message_To_Generate_From_Queue $message_to_generate */
1060
-        $message_to_generate = EE_Registry::instance()->load_lib(
1061
-            'Message_To_Generate_From_Queue',
1062
-            array(
1063
-                $messenger,
1064
-                $message_type,
1065
-                $queue,
1066
-                $custom_subject,
1067
-            )
1068
-        );
1069
-        return self::$_MSG_PROCESSOR->queue_for_sending($message_to_generate);
1070
-    }
1071
-
1072
-
1073
-    /**
1074
-     * Generates Messages immediately for EE_Message IDs (but only for the correct status for generation)
1075
-     *
1076
-     * @since 4.9.0
1077
-     * @param array $message_ids An array of message ids
1078
-     * @return bool|EE_Messages_Queue false if nothing was generated, EE_Messages_Queue containing generated
1079
-     *                           messages.
1080
-     * @throws EE_Error
1081
-     * @throws InvalidArgumentException
1082
-     * @throws InvalidDataTypeException
1083
-     * @throws InvalidInterfaceException
1084
-     * @throws ReflectionException
1085
-     */
1086
-    public static function generate_now($message_ids)
1087
-    {
1088
-        self::_load_controller();
1089
-        $messages = EEM_Message::instance()->get_all(
1090
-            array(
1091
-                0 => array(
1092
-                    'MSG_ID' => array('IN', $message_ids),
1093
-                    'STS_ID' => EEM_Message::status_incomplete,
1094
-                ),
1095
-            )
1096
-        );
1097
-        $generated_queue = false;
1098
-        if ($messages) {
1099
-            $generated_queue = self::$_MSG_PROCESSOR->batch_generate_from_queue($messages);
1100
-        }
1101
-
1102
-        if (! $generated_queue instanceof EE_Messages_Queue) {
1103
-            EE_Error::add_error(
1104
-                __(
1105
-                    'The messages were not generated. This could mean there is already a batch being generated on a separate request, or because the selected messages are not ready for generation. Please wait a minute or two and try again.',
1106
-                    'event_espresso'
1107
-                ),
1108
-                __FILE__,
1109
-                __FUNCTION__,
1110
-                __LINE__
1111
-            );
1112
-        }
1113
-        return $generated_queue;
1114
-    }
1115
-
1116
-
1117
-    /**
1118
-     * Sends messages immediately for the incoming message_ids that have the status of EEM_Message::status_resend or,
1119
-     * EEM_Message::status_idle
1120
-     *
1121
-     * @since 4.9.0
1122
-     * @param $message_ids
1123
-     * @return bool|EE_Messages_Queue false if no messages sent.
1124
-     * @throws EE_Error
1125
-     * @throws InvalidArgumentException
1126
-     * @throws InvalidDataTypeException
1127
-     * @throws InvalidInterfaceException
1128
-     * @throws ReflectionException
1129
-     */
1130
-    public static function send_now($message_ids)
1131
-    {
1132
-        self::_load_controller();
1133
-        $messages = EEM_Message::instance()->get_all(
1134
-            array(
1135
-                0 => array(
1136
-                    'MSG_ID' => array('IN', $message_ids),
1137
-                    'STS_ID' => array(
1138
-                        'IN',
1139
-                        array(EEM_Message::status_idle, EEM_Message::status_resend, EEM_Message::status_retry),
1140
-                    ),
1141
-                ),
1142
-            )
1143
-        );
1144
-        $sent_queue = false;
1145
-        if ($messages) {
1146
-            $sent_queue = self::$_MSG_PROCESSOR->batch_send_from_queue($messages);
1147
-        }
1148
-
1149
-        if (! $sent_queue instanceof EE_Messages_Queue) {
1150
-            EE_Error::add_error(
1151
-                __(
1152
-                    'The messages were not sent. This could mean there is already a batch being sent on a separate request, or because the selected messages are not sendable. Please wait a minute or two and try again.',
1153
-                    'event_espresso'
1154
-                ),
1155
-                __FILE__,
1156
-                __FUNCTION__,
1157
-                __LINE__
1158
-            );
1159
-        } else {
1160
-            // can count how many sent by using the messages in the queue
1161
-            $sent_count = $sent_queue->count_STS_in_queue(EEM_Message::instance()->stati_indicating_sent());
1162
-            if ($sent_count > 0) {
1163
-                EE_Error::add_success(
1164
-                    sprintf(
1165
-                        _n(
1166
-                            'There was %d message successfully sent.',
1167
-                            'There were %d messages successfully sent.',
1168
-                            $sent_count,
1169
-                            'event_espresso'
1170
-                        ),
1171
-                        $sent_count
1172
-                    )
1173
-                );
1174
-            } else {
1175
-                EE_Error::overwrite_errors();
1176
-                EE_Error::add_error(
1177
-                    __(
1178
-                        'No message was sent because of problems with sending. Either all the messages you selected were not a sendable message, they were ALREADY sent on a different scheduled task, or there was an error.
259
+				exit;
260
+			}
261
+		}
262
+		return;
263
+	}
264
+
265
+
266
+	/**
267
+	 *  This runs when the msg_url_trigger route has initiated.
268
+	 *
269
+	 * @since 4.5.0
270
+	 * @param WP $WP
271
+	 * @throws EE_Error
272
+	 * @throws InvalidArgumentException
273
+	 * @throws ReflectionException
274
+	 * @throws InvalidDataTypeException
275
+	 * @throws InvalidInterfaceException
276
+	 */
277
+	public function run($WP)
278
+	{
279
+		// ensure controller is loaded
280
+		self::_load_controller();
281
+		// attempt to process message
282
+		try {
283
+			/** @type EE_Message_To_Generate_From_Request $message_to_generate */
284
+			$message_to_generate = EE_Registry::instance()->load_lib('Message_To_Generate_From_Request');
285
+			self::$_MSG_PROCESSOR->generate_and_send_now($message_to_generate);
286
+		} catch (EE_Error $e) {
287
+			$error_msg = __(
288
+				'Please note that a system message failed to send due to a technical issue.',
289
+				'event_espresso'
290
+			);
291
+			// add specific message for developers if WP_DEBUG in on
292
+			$error_msg .= '||' . $e->getMessage();
293
+			EE_Error::add_error($error_msg, __FILE__, __FUNCTION__, __LINE__);
294
+		}
295
+	}
296
+
297
+
298
+	/**
299
+	 * This is triggered by the 'msg_cron_trigger' route.
300
+	 *
301
+	 * @param WP $WP
302
+	 */
303
+	public function execute_batch_request($WP)
304
+	{
305
+		$this->run_cron();
306
+		header('HTTP/1.1 200 OK');
307
+		exit();
308
+	}
309
+
310
+
311
+	/**
312
+	 * This gets executed on wp_cron jobs or when a batch request is initiated on its own separate non regular wp
313
+	 * request.
314
+	 */
315
+	public function run_cron()
316
+	{
317
+		self::_load_controller();
318
+		// get required vars
319
+		$cron_type = EE_Registry::instance()->REQ->get('type');
320
+		$transient_key = EE_Registry::instance()->REQ->get('key');
321
+
322
+		// now let's verify transient, if not valid exit immediately
323
+		if (! get_transient($transient_key)) {
324
+			/**
325
+			 * trigger error so this gets in the error logs.  This is important because it happens on a non-user
326
+			 * request.
327
+			 */
328
+			trigger_error(esc_attr__('Invalid Request (Transient does not exist)', 'event_espresso'));
329
+		}
330
+
331
+		// if made it here, lets' delete the transient to keep the db clean
332
+		delete_transient($transient_key);
333
+
334
+		if (apply_filters('FHEE__EED_Messages__run_cron__use_wp_cron', true)) {
335
+			$method = 'batch_' . $cron_type . '_from_queue';
336
+			if (method_exists(self::$_MSG_PROCESSOR, $method)) {
337
+				self::$_MSG_PROCESSOR->$method();
338
+			} else {
339
+				// no matching task
340
+				/**
341
+				 * trigger error so this gets in the error logs.  This is important because it happens on a non user
342
+				 * request.
343
+				 */
344
+				trigger_error(
345
+					esc_attr(
346
+						sprintf(
347
+							__('There is no task corresponding to this route %s', 'event_espresso'),
348
+							$cron_type
349
+						)
350
+					)
351
+				);
352
+			}
353
+		}
354
+
355
+		do_action('FHEE__EED_Messages__run_cron__end');
356
+	}
357
+
358
+
359
+	/**
360
+	 * This is used to retrieve the template pack for the given name.
361
+	 * Retrieved packs are cached on the static $_TMP_PACKS array.  If there is no class matching the given name then
362
+	 * the default template pack is returned.
363
+	 *
364
+	 * @deprecated 4.9.0  @see EEH_MSG_Template::get_template_pack()
365
+	 * @param string $template_pack_name This should correspond to the dbref of the template pack (which is also used
366
+	 *                                   in generating the Pack class name).
367
+	 * @return EE_Messages_Template_Pack
368
+	 * @throws EE_Error
369
+	 * @throws InvalidArgumentException
370
+	 * @throws ReflectionException
371
+	 * @throws InvalidDataTypeException
372
+	 * @throws InvalidInterfaceException
373
+	 */
374
+	public static function get_template_pack($template_pack_name)
375
+	{
376
+		EE_Registry::instance()->load_helper('MSG_Template');
377
+		return EEH_MSG_Template::get_template_pack($template_pack_name);
378
+	}
379
+
380
+
381
+	/**
382
+	 * Retrieves an array of all template packs.
383
+	 * Array is in the format array( 'dbref' => EE_Messages_Template_Pack )
384
+	 *
385
+	 * @deprecated 4.9.0  @see EEH_MSG_Template_Pack::get_template_pack_collection
386
+	 * @return EE_Messages_Template_Pack[]
387
+	 * @throws EE_Error
388
+	 * @throws InvalidArgumentException
389
+	 * @throws ReflectionException
390
+	 * @throws InvalidDataTypeException
391
+	 * @throws InvalidInterfaceException
392
+	 */
393
+	public static function get_template_packs()
394
+	{
395
+		EE_Registry::instance()->load_helper('MSG_Template');
396
+
397
+		// for backward compat, let's make sure this returns in the same format as originally.
398
+		$template_pack_collection = EEH_MSG_Template::get_template_pack_collection();
399
+		$template_pack_collection->rewind();
400
+		$template_packs = array();
401
+		while ($template_pack_collection->valid()) {
402
+			$template_packs[ $template_pack_collection->current()->dbref ] = $template_pack_collection->current();
403
+			$template_pack_collection->next();
404
+		}
405
+		return $template_packs;
406
+	}
407
+
408
+
409
+	/**
410
+	 * This simply makes sure the autoloaders are registered for the EE_messages system.
411
+	 *
412
+	 * @since 4.5.0
413
+	 * @return void
414
+	 * @throws EE_Error
415
+	 */
416
+	public static function set_autoloaders()
417
+	{
418
+		if (empty(self::$_MSG_PATHS)) {
419
+			self::_set_messages_paths();
420
+			foreach (self::$_MSG_PATHS as $path) {
421
+				EEH_Autoloader::register_autoloaders_for_each_file_in_folder($path);
422
+			}
423
+			// add aliases
424
+			EEH_Autoloader::add_alias('EE_messages', 'EE_messages');
425
+			EEH_Autoloader::add_alias('EE_messenger', 'EE_messenger');
426
+		}
427
+	}
428
+
429
+
430
+	/**
431
+	 * Take care of adding all the paths for the messages components to the $_MSG_PATHS property
432
+	 * for use by the Messages Autoloaders
433
+	 *
434
+	 * @since 4.5.0
435
+	 * @return void.
436
+	 */
437
+	protected static function _set_messages_paths()
438
+	{
439
+		self::$_MSG_PATHS = apply_filters(
440
+			'FHEE__EED_Messages___set_messages_paths___MSG_PATHS',
441
+			[
442
+				EE_LIBRARIES . 'messages/message_type',
443
+				EE_LIBRARIES . 'messages/messenger',
444
+				EE_LIBRARIES . 'messages/defaults',
445
+				EE_LIBRARIES . 'messages/defaults/email',
446
+				EE_LIBRARIES . 'messages/data_class',
447
+				EE_LIBRARIES . 'messages/validators',
448
+				EE_LIBRARIES . 'messages/validators/email',
449
+				EE_LIBRARIES . 'messages/validators/html',
450
+				EE_LIBRARIES . 'shortcodes',
451
+			]
452
+		);
453
+	}
454
+
455
+
456
+	/**
457
+	 * Takes care of loading dependencies
458
+	 *
459
+	 * @since 4.5.0
460
+	 * @return void
461
+	 * @throws EE_Error
462
+	 * @throws InvalidArgumentException
463
+	 * @throws ReflectionException
464
+	 * @throws InvalidDataTypeException
465
+	 * @throws InvalidInterfaceException
466
+	 */
467
+	protected static function _load_controller()
468
+	{
469
+		if (! self::$_MSG_PROCESSOR instanceof EE_Messages_Processor) {
470
+			EE_Registry::instance()->load_core('Request_Handler');
471
+			self::set_autoloaders();
472
+			self::$_EEMSG = EE_Registry::instance()->load_lib('messages');
473
+			self::$_MSG_PROCESSOR = EE_Registry::instance()->load_lib('Messages_Processor');
474
+			self::$_message_resource_manager = EE_Registry::instance()->load_lib('Message_Resource_Manager');
475
+		}
476
+	}
477
+
478
+
479
+	/**
480
+	 * @param EE_Transaction $transaction
481
+	 * @throws EE_Error
482
+	 * @throws InvalidArgumentException
483
+	 * @throws InvalidDataTypeException
484
+	 * @throws InvalidInterfaceException
485
+	 * @throws ReflectionException
486
+	 */
487
+	public static function payment_reminder(EE_Transaction $transaction)
488
+	{
489
+		self::_load_controller();
490
+		$data = array($transaction, null);
491
+		self::$_MSG_PROCESSOR->generate_for_all_active_messengers('payment_reminder', $data);
492
+	}
493
+
494
+
495
+	/**
496
+	 * Any messages triggers for after successful gateway payments should go in here.
497
+	 *
498
+	 * @param EE_Transaction  $transaction object
499
+	 * @param EE_Payment|null $payment     object
500
+	 * @return void
501
+	 * @throws EE_Error
502
+	 * @throws InvalidArgumentException
503
+	 * @throws ReflectionException
504
+	 * @throws InvalidDataTypeException
505
+	 * @throws InvalidInterfaceException
506
+	 */
507
+	public static function payment(EE_Transaction $transaction, EE_Payment $payment = null)
508
+	{
509
+		// if there's no payment object, then we cannot do a payment type message!
510
+		if (! $payment instanceof EE_Payment) {
511
+			return;
512
+		}
513
+		self::_load_controller();
514
+		$data = array($transaction, $payment);
515
+		EE_Registry::instance()->load_helper('MSG_Template');
516
+		$message_type = EEH_MSG_Template::convert_payment_status_to_message_type($payment->STS_ID());
517
+		// if payment amount is less than 0 then switch to payment_refund message type.
518
+		$message_type = $payment->amount() < 0 ? 'payment_refund' : $message_type;
519
+		self::$_MSG_PROCESSOR->generate_for_all_active_messengers($message_type, $data);
520
+	}
521
+
522
+
523
+	/**
524
+	 * @param EE_Transaction $transaction
525
+	 * @throws EE_Error
526
+	 * @throws InvalidArgumentException
527
+	 * @throws InvalidDataTypeException
528
+	 * @throws InvalidInterfaceException
529
+	 * @throws ReflectionException
530
+	 */
531
+	public static function cancelled_registration(EE_Transaction $transaction)
532
+	{
533
+		self::_load_controller();
534
+		$data = array($transaction, null);
535
+		self::$_MSG_PROCESSOR->generate_for_all_active_messengers('cancelled_registration', $data);
536
+	}
537
+
538
+
539
+	/**
540
+	 * Trigger for Registration messages
541
+	 * Note that what registration message type is sent depends on what the reg status is for the registrations on the
542
+	 * incoming transaction.
543
+	 *
544
+	 * @param EE_Registration $registration
545
+	 * @param array           $extra_details
546
+	 * @return void
547
+	 * @throws EE_Error
548
+	 * @throws InvalidArgumentException
549
+	 * @throws InvalidDataTypeException
550
+	 * @throws InvalidInterfaceException
551
+	 * @throws ReflectionException
552
+	 * @throws EntityNotFoundException
553
+	 */
554
+	public static function maybe_registration(EE_Registration $registration, $extra_details = array())
555
+	{
556
+
557
+		if (! self::_verify_registration_notification_send($registration, $extra_details)) {
558
+			// no messages please
559
+			return;
560
+		}
561
+
562
+		// get all non-trashed registrations so we make sure we send messages for the right status.
563
+		$all_registrations = $registration->transaction()->registrations(
564
+			array(
565
+				array('REG_deleted' => false),
566
+				'order_by' => array(
567
+					'Event.EVT_name'     => 'ASC',
568
+					'Attendee.ATT_lname' => 'ASC',
569
+					'Attendee.ATT_fname' => 'ASC',
570
+				),
571
+			)
572
+		);
573
+		// cached array of statuses so we only trigger messages once per status.
574
+		$statuses_sent = array();
575
+		self::_load_controller();
576
+		$mtgs = array();
577
+
578
+		// loop through registrations and trigger messages once per status.
579
+		foreach ($all_registrations as $reg) {
580
+			// already triggered?
581
+			if (in_array($reg->status_ID(), $statuses_sent)) {
582
+				continue;
583
+			}
584
+
585
+			$message_type = EEH_MSG_Template::convert_reg_status_to_message_type($reg->status_ID());
586
+			$mtgs = array_merge(
587
+				$mtgs,
588
+				self::$_MSG_PROCESSOR->setup_mtgs_for_all_active_messengers(
589
+					$message_type,
590
+					array($registration->transaction(), null, $reg->status_ID())
591
+				)
592
+			);
593
+			$statuses_sent[] = $reg->status_ID();
594
+		}
595
+
596
+		if (count($statuses_sent) > 1) {
597
+			$mtgs = array_merge(
598
+				$mtgs,
599
+				self::$_MSG_PROCESSOR->setup_mtgs_for_all_active_messengers(
600
+					'registration_summary',
601
+					array($registration->transaction(), null)
602
+				)
603
+			);
604
+		}
605
+
606
+		// batch queue and initiate request
607
+		self::$_MSG_PROCESSOR->batch_queue_for_generation_and_persist($mtgs);
608
+		self::$_MSG_PROCESSOR->get_queue()->initiate_request_by_priority();
609
+	}
610
+
611
+
612
+	/**
613
+	 * This is a helper method used to very whether a registration notification should be sent or
614
+	 * not.  Prevents duplicate notifications going out for registration context notifications.
615
+	 *
616
+	 * @param EE_Registration $registration  [description]
617
+	 * @param array           $extra_details [description]
618
+	 * @return bool          true = send away, false = nope halt the presses.
619
+	 */
620
+	protected static function _verify_registration_notification_send(
621
+		EE_Registration $registration,
622
+		$extra_details = array()
623
+	) {
624
+		if (! $registration->is_primary_registrant()) {
625
+			return false;
626
+		}
627
+		// first we check if we're in admin and not doing front ajax
628
+		if (is_admin() && ! EE_FRONT_AJAX) {
629
+			// make sure appropriate admin params are set for sending messages
630
+			if (
631
+				empty($_REQUEST['txn_reg_status_change']['send_notifications'])
632
+				|| ! absint($_REQUEST['txn_reg_status_change']['send_notifications'])
633
+			) {
634
+				// no messages sent please.
635
+				return false;
636
+			}
637
+		} else {
638
+			// frontend request (either regular or via AJAX)
639
+			// TXN is NOT finalized ?
640
+			if (! isset($extra_details['finalized']) || $extra_details['finalized'] === false) {
641
+				return false;
642
+			}
643
+			// return visit but nothing changed ???
644
+			if (
645
+				isset($extra_details['revisit'], $extra_details['status_updates']) &&
646
+				$extra_details['revisit'] && ! $extra_details['status_updates']
647
+			) {
648
+				return false;
649
+			}
650
+			// NOT sending messages && reg status is something other than "Not-Approved"
651
+			if (
652
+				! apply_filters('FHEE__EED_Messages___maybe_registration__deliver_notifications', false) &&
653
+				$registration->status_ID() !== EEM_Registration::status_id_not_approved
654
+			) {
655
+				return false;
656
+			}
657
+		}
658
+		// release the kraken
659
+		return true;
660
+	}
661
+
662
+
663
+	/**
664
+	 * Simply returns an array indexed by Registration Status ID and the related message_type name associated with that
665
+	 * status id.
666
+	 *
667
+	 * @deprecated 4.9.0  Use EEH_MSG_Template::reg_status_to_message_type_array()
668
+	 *                    or EEH_MSG_Template::convert_reg_status_to_message_type
669
+	 * @param string $reg_status
670
+	 * @return array
671
+	 * @throws EE_Error
672
+	 * @throws InvalidArgumentException
673
+	 * @throws ReflectionException
674
+	 * @throws InvalidDataTypeException
675
+	 * @throws InvalidInterfaceException
676
+	 */
677
+	protected static function _get_reg_status_array($reg_status = '')
678
+	{
679
+		EE_Registry::instance()->load_helper('MSG_Template');
680
+		return EEH_MSG_Template::convert_reg_status_to_message_type($reg_status)
681
+			? EEH_MSG_Template::convert_reg_status_to_message_type($reg_status)
682
+			: EEH_MSG_Template::reg_status_to_message_type_array();
683
+	}
684
+
685
+
686
+	/**
687
+	 * Simply returns the payment message type for the given payment status.
688
+	 *
689
+	 * @deprecated 4.9.0 Use EEH_MSG_Template::payment_status_to_message_type_array
690
+	 *                   or EEH_MSG_Template::convert_payment_status_to_message_type
691
+	 * @param string $payment_status The payment status being matched.
692
+	 * @return bool|string The payment message type slug matching the status or false if no match.
693
+	 * @throws EE_Error
694
+	 * @throws InvalidArgumentException
695
+	 * @throws ReflectionException
696
+	 * @throws InvalidDataTypeException
697
+	 * @throws InvalidInterfaceException
698
+	 */
699
+	protected static function _get_payment_message_type($payment_status)
700
+	{
701
+		EE_Registry::instance()->load_helper('MSG_Template');
702
+		return EEH_MSG_Template::convert_payment_status_to_message_type($payment_status)
703
+			? EEH_MSG_Template::convert_payment_status_to_message_type($payment_status)
704
+			: false;
705
+	}
706
+
707
+
708
+	/**
709
+	 * Message triggers for a resending already sent message(s) (via EE_Message list table)
710
+	 *
711
+	 * @access public
712
+	 * @param array $req_data This is the $_POST & $_GET data sent from EE_Admin Pages
713
+	 * @return bool success/fail
714
+	 * @throws EE_Error
715
+	 * @throws InvalidArgumentException
716
+	 * @throws InvalidDataTypeException
717
+	 * @throws InvalidInterfaceException
718
+	 * @throws ReflectionException
719
+	 */
720
+	public static function process_resend($req_data)
721
+	{
722
+		self::_load_controller();
723
+
724
+		// if $msgID in this request then skip to the new resend_message
725
+		if (EE_Registry::instance()->REQ->get('MSG_ID')) {
726
+			return self::resend_message();
727
+		}
728
+
729
+		// make sure any incoming request data is set on the REQ so that it gets picked up later.
730
+		$req_data = (array) $req_data;
731
+		foreach ($req_data as $request_key => $request_value) {
732
+			EE_Registry::instance()->REQ->set($request_key, $request_value);
733
+		}
734
+
735
+		if (
736
+			! $messages_to_send = self::$_MSG_PROCESSOR->setup_messages_to_generate_from_registration_ids_in_request(
737
+			)
738
+		) {
739
+			return false;
740
+		}
741
+
742
+		try {
743
+			self::$_MSG_PROCESSOR->batch_queue_for_generation_and_persist($messages_to_send);
744
+			self::$_MSG_PROCESSOR->get_queue()->initiate_request_by_priority();
745
+		} catch (EE_Error $e) {
746
+			EE_Error::add_error($e->getMessage(), __FILE__, __FUNCTION__, __LINE__);
747
+			return false;
748
+		}
749
+		EE_Error::add_success(
750
+			__('Messages have been successfully queued for generation and sending.', 'event_espresso')
751
+		);
752
+		return true; // everything got queued.
753
+	}
754
+
755
+
756
+	/**
757
+	 * Message triggers for a resending already sent message(s) (via EE_Message list table)
758
+	 *
759
+	 * @return bool
760
+	 * @throws EE_Error
761
+	 * @throws InvalidArgumentException
762
+	 * @throws InvalidDataTypeException
763
+	 * @throws InvalidInterfaceException
764
+	 * @throws ReflectionException
765
+	 */
766
+	public static function resend_message()
767
+	{
768
+		self::_load_controller();
769
+
770
+		$msgID = EE_Registry::instance()->REQ->get('MSG_ID');
771
+		if (! $msgID) {
772
+			EE_Error::add_error(
773
+				__(
774
+					'Something went wrong because there is no "MSG_ID" value in the request',
775
+					'event_espresso'
776
+				),
777
+				__FILE__,
778
+				__FUNCTION__,
779
+				__LINE__
780
+			);
781
+			return false;
782
+		}
783
+
784
+		self::$_MSG_PROCESSOR->setup_messages_from_ids_and_send((array) $msgID);
785
+
786
+		// setup success message.
787
+		$count_ready_for_resend = self::$_MSG_PROCESSOR->get_queue()->count_STS_in_queue(EEM_Message::status_resend);
788
+		EE_Error::add_success(
789
+			sprintf(
790
+				_n(
791
+					'There was %d message queued for resending.',
792
+					'There were %d messages queued for resending.',
793
+					$count_ready_for_resend,
794
+					'event_espresso'
795
+				),
796
+				$count_ready_for_resend
797
+			)
798
+		);
799
+		return true;
800
+	}
801
+
802
+
803
+	/**
804
+	 * Message triggers for manual payment applied by admin
805
+	 *
806
+	 * @param  EE_Payment $payment EE_payment object
807
+	 * @return bool success/fail
808
+	 * @throws EE_Error
809
+	 * @throws InvalidArgumentException
810
+	 * @throws ReflectionException
811
+	 * @throws InvalidDataTypeException
812
+	 * @throws InvalidInterfaceException
813
+	 */
814
+	public static function process_admin_payment(EE_Payment $payment)
815
+	{
816
+		EE_Registry::instance()->load_helper('MSG_Template');
817
+		// we need to get the transaction object
818
+		$transaction = $payment->transaction();
819
+		if ($transaction instanceof EE_Transaction) {
820
+			$data = array($transaction, $payment);
821
+			$message_type = EEH_MSG_Template::convert_payment_status_to_message_type($payment->STS_ID());
822
+
823
+			// if payment amount is less than 0 then switch to payment_refund message type.
824
+			$message_type = $payment->amount() < 0 ? 'payment_refund' : $message_type;
825
+
826
+			// if payment_refund is selected, but the status is NOT accepted.  Then change message type to false so NO message notification goes out.
827
+			$message_type = $message_type == 'payment_refund' && $payment->STS_ID() != EEM_Payment::status_id_approved
828
+				? false : $message_type;
829
+
830
+			self::_load_controller();
831
+
832
+			self::$_MSG_PROCESSOR->generate_for_all_active_messengers($message_type, $data);
833
+
834
+			// get count of queued for generation
835
+			$count_to_generate = self::$_MSG_PROCESSOR->get_queue()->count_STS_in_queue(
836
+				array(
837
+					EEM_Message::status_incomplete,
838
+					EEM_Message::status_idle,
839
+				)
840
+			);
841
+
842
+			if ($count_to_generate > 0 && self::$_MSG_PROCESSOR->get_queue()->get_message_repository()->count() !== 0) {
843
+				add_filter('FHEE__EE_Admin_Page___process_admin_payment_notification__success', '__return_true');
844
+				return true;
845
+			} else {
846
+				$count_failed = self::$_MSG_PROCESSOR->get_queue()->count_STS_in_queue(
847
+					EEM_Message::instance()->stati_indicating_failed_sending()
848
+				);
849
+				/**
850
+				 * Verify that there are actually errors.  If not then we return a success message because the queue might have been emptied due to successful
851
+				 * IMMEDIATE generation.
852
+				 */
853
+				if ($count_failed > 0) {
854
+					EE_Error::add_error(
855
+						sprintf(
856
+							_n(
857
+								'The payment notification generation failed.',
858
+								'%d payment notifications failed being sent.',
859
+								$count_failed,
860
+								'event_espresso'
861
+							),
862
+							$count_failed
863
+						),
864
+						__FILE__,
865
+						__FUNCTION__,
866
+						__LINE__
867
+					);
868
+
869
+					return false;
870
+				} else {
871
+					add_filter('FHEE__EE_Admin_Page___process_admin_payment_notification__success', '__return_true');
872
+					return true;
873
+				}
874
+			}
875
+		} else {
876
+			EE_Error::add_error(
877
+				'Unable to generate the payment notification because the given value for the transaction is invalid.',
878
+				'event_espresso'
879
+			);
880
+			return false;
881
+		}
882
+	}
883
+
884
+
885
+	/**
886
+	 * Callback for AHEE__Extend_Registrations_Admin_Page___newsletter_selected_send_with_registrations trigger
887
+	 *
888
+	 * @since   4.3.0
889
+	 * @param  EE_Registration[] $registrations an array of EE_Registration objects
890
+	 * @param  int               $grp_id        a specific message template group id.
891
+	 * @return void
892
+	 * @throws EE_Error
893
+	 * @throws InvalidArgumentException
894
+	 * @throws InvalidDataTypeException
895
+	 * @throws InvalidInterfaceException
896
+	 * @throws ReflectionException
897
+	 */
898
+	public static function send_newsletter_message($registrations, $grp_id)
899
+	{
900
+		// make sure mtp is id and set it in the EE_Request Handler later messages setup.
901
+		EE_Registry::instance()->REQ->set('GRP_ID', (int) $grp_id);
902
+		self::_load_controller();
903
+		self::$_MSG_PROCESSOR->generate_for_all_active_messengers('newsletter', $registrations);
904
+	}
905
+
906
+
907
+	/**
908
+	 * Callback for FHEE__EE_Registration__invoice_url__invoice_url or FHEE__EE_Registration__receipt_url__receipt_url
909
+	 *
910
+	 * @since   4.3.0
911
+	 * @param    string          $registration_message_trigger_url
912
+	 * @param    EE_Registration $registration
913
+	 * @param string             $messenger
914
+	 * @param string             $message_type
915
+	 * @return string
916
+	 * @throws EE_Error
917
+	 * @throws InvalidArgumentException
918
+	 * @throws InvalidDataTypeException
919
+	 * @throws InvalidInterfaceException
920
+	 */
921
+	public static function registration_message_trigger_url(
922
+		$registration_message_trigger_url,
923
+		EE_Registration $registration,
924
+		$messenger = 'html',
925
+		$message_type = 'invoice'
926
+	) {
927
+		// whitelist $messenger
928
+		switch ($messenger) {
929
+			case 'pdf':
930
+				$sending_messenger = 'pdf';
931
+				$generating_messenger = 'html';
932
+				break;
933
+			case 'html':
934
+			default:
935
+				$sending_messenger = 'html';
936
+				$generating_messenger = 'html';
937
+				break;
938
+		}
939
+		// whitelist $message_type
940
+		switch ($message_type) {
941
+			case 'receipt':
942
+				$message_type = 'receipt';
943
+				break;
944
+			case 'invoice':
945
+			default:
946
+				$message_type = 'invoice';
947
+				break;
948
+		}
949
+		// verify that both the messenger AND the message type are active
950
+		if (
951
+			EEH_MSG_Template::is_messenger_active($sending_messenger)
952
+			&& EEH_MSG_Template::is_mt_active($message_type)
953
+		) {
954
+			// need to get the correct message template group for this (i.e. is there a custom invoice for the event this registration is registered for?)
955
+			$template_query_params = array(
956
+				'MTP_is_active'    => true,
957
+				'MTP_messenger'    => $generating_messenger,
958
+				'MTP_message_type' => $message_type,
959
+				'Event.EVT_ID'     => $registration->event_ID(),
960
+			);
961
+			// get the message template group.
962
+			$msg_template_group = EEM_Message_Template_Group::instance()->get_one(array($template_query_params));
963
+			// if we don't have an EE_Message_Template_Group then return
964
+			if (! $msg_template_group instanceof EE_Message_Template_Group) {
965
+				// remove EVT_ID from query params so that global templates get picked up
966
+				unset($template_query_params['Event.EVT_ID']);
967
+				// get global template as the fallback
968
+				$msg_template_group = EEM_Message_Template_Group::instance()->get_one(array($template_query_params));
969
+			}
970
+			// if we don't have an EE_Message_Template_Group then return
971
+			if (! $msg_template_group instanceof EE_Message_Template_Group) {
972
+				return '';
973
+			}
974
+			// generate the URL
975
+			$registration_message_trigger_url = EEH_MSG_Template::generate_url_trigger(
976
+				$sending_messenger,
977
+				$generating_messenger,
978
+				'purchaser',
979
+				$message_type,
980
+				$registration,
981
+				$msg_template_group->ID(),
982
+				$registration->transaction_ID()
983
+			);
984
+		}
985
+		return $registration_message_trigger_url;
986
+	}
987
+
988
+
989
+	/**
990
+	 * Use to generate and return a message preview!
991
+	 *
992
+	 * @param  string $type      This should correspond with a valid message type
993
+	 * @param  string $context   This should correspond with a valid context for the message type
994
+	 * @param  string $messenger This should correspond with a valid messenger.
995
+	 * @param bool    $send      true we will do a test send using the messenger delivery, false we just do a regular
996
+	 *                           preview
997
+	 * @return bool|string The body of the message or if send is requested, sends.
998
+	 * @throws EE_Error
999
+	 * @throws InvalidArgumentException
1000
+	 * @throws InvalidDataTypeException
1001
+	 * @throws InvalidInterfaceException
1002
+	 * @throws ReflectionException
1003
+	 */
1004
+	public static function preview_message($type, $context, $messenger, $send = false)
1005
+	{
1006
+		self::_load_controller();
1007
+		$mtg = new EE_Message_To_Generate(
1008
+			$messenger,
1009
+			$type,
1010
+			array(),
1011
+			$context,
1012
+			true
1013
+		);
1014
+		$generated_preview_queue = self::$_MSG_PROCESSOR->generate_for_preview($mtg, $send);
1015
+		if ($generated_preview_queue instanceof EE_Messages_Queue) {
1016
+			// loop through all content for the preview and remove any persisted records.
1017
+			$content = '';
1018
+			foreach ($generated_preview_queue->get_message_repository() as $message) {
1019
+				$content = $message->content();
1020
+				if ($message->ID() > 0 && $message->STS_ID() !== EEM_Message::status_failed) {
1021
+					$message->delete();
1022
+				}
1023
+			}
1024
+			return $content;
1025
+		} else {
1026
+			return $generated_preview_queue;
1027
+		}
1028
+	}
1029
+
1030
+
1031
+	/**
1032
+	 * This is a method that allows for sending a message using a messenger matching the string given and the provided
1033
+	 * EE_Message_Queue object.  The EE_Message_Queue object is used to create a single aggregate EE_Message via the
1034
+	 * content found in the EE_Message objects in the queue.
1035
+	 *
1036
+	 * @since 4.9.0
1037
+	 * @param string            $messenger            a string matching a valid active messenger in the system
1038
+	 * @param string            $message_type         Although it seems contrary to the name of the method, a message
1039
+	 *                                                type name is still required to send along the message type to the
1040
+	 *                                                messenger because this is used for determining what specific
1041
+	 *                                                variations might be loaded for the generated message.
1042
+	 * @param EE_Messages_Queue $queue
1043
+	 * @param string            $custom_subject       Can be used to set what the custom subject string will be on the
1044
+	 *                                                aggregate EE_Message object.
1045
+	 * @return bool success or fail.
1046
+	 * @throws EE_Error
1047
+	 * @throws InvalidArgumentException
1048
+	 * @throws ReflectionException
1049
+	 * @throws InvalidDataTypeException
1050
+	 * @throws InvalidInterfaceException
1051
+	 */
1052
+	public static function send_message_with_messenger_only(
1053
+		$messenger,
1054
+		$message_type,
1055
+		EE_Messages_Queue $queue,
1056
+		$custom_subject = ''
1057
+	) {
1058
+		self::_load_controller();
1059
+		/** @type EE_Message_To_Generate_From_Queue $message_to_generate */
1060
+		$message_to_generate = EE_Registry::instance()->load_lib(
1061
+			'Message_To_Generate_From_Queue',
1062
+			array(
1063
+				$messenger,
1064
+				$message_type,
1065
+				$queue,
1066
+				$custom_subject,
1067
+			)
1068
+		);
1069
+		return self::$_MSG_PROCESSOR->queue_for_sending($message_to_generate);
1070
+	}
1071
+
1072
+
1073
+	/**
1074
+	 * Generates Messages immediately for EE_Message IDs (but only for the correct status for generation)
1075
+	 *
1076
+	 * @since 4.9.0
1077
+	 * @param array $message_ids An array of message ids
1078
+	 * @return bool|EE_Messages_Queue false if nothing was generated, EE_Messages_Queue containing generated
1079
+	 *                           messages.
1080
+	 * @throws EE_Error
1081
+	 * @throws InvalidArgumentException
1082
+	 * @throws InvalidDataTypeException
1083
+	 * @throws InvalidInterfaceException
1084
+	 * @throws ReflectionException
1085
+	 */
1086
+	public static function generate_now($message_ids)
1087
+	{
1088
+		self::_load_controller();
1089
+		$messages = EEM_Message::instance()->get_all(
1090
+			array(
1091
+				0 => array(
1092
+					'MSG_ID' => array('IN', $message_ids),
1093
+					'STS_ID' => EEM_Message::status_incomplete,
1094
+				),
1095
+			)
1096
+		);
1097
+		$generated_queue = false;
1098
+		if ($messages) {
1099
+			$generated_queue = self::$_MSG_PROCESSOR->batch_generate_from_queue($messages);
1100
+		}
1101
+
1102
+		if (! $generated_queue instanceof EE_Messages_Queue) {
1103
+			EE_Error::add_error(
1104
+				__(
1105
+					'The messages were not generated. This could mean there is already a batch being generated on a separate request, or because the selected messages are not ready for generation. Please wait a minute or two and try again.',
1106
+					'event_espresso'
1107
+				),
1108
+				__FILE__,
1109
+				__FUNCTION__,
1110
+				__LINE__
1111
+			);
1112
+		}
1113
+		return $generated_queue;
1114
+	}
1115
+
1116
+
1117
+	/**
1118
+	 * Sends messages immediately for the incoming message_ids that have the status of EEM_Message::status_resend or,
1119
+	 * EEM_Message::status_idle
1120
+	 *
1121
+	 * @since 4.9.0
1122
+	 * @param $message_ids
1123
+	 * @return bool|EE_Messages_Queue false if no messages sent.
1124
+	 * @throws EE_Error
1125
+	 * @throws InvalidArgumentException
1126
+	 * @throws InvalidDataTypeException
1127
+	 * @throws InvalidInterfaceException
1128
+	 * @throws ReflectionException
1129
+	 */
1130
+	public static function send_now($message_ids)
1131
+	{
1132
+		self::_load_controller();
1133
+		$messages = EEM_Message::instance()->get_all(
1134
+			array(
1135
+				0 => array(
1136
+					'MSG_ID' => array('IN', $message_ids),
1137
+					'STS_ID' => array(
1138
+						'IN',
1139
+						array(EEM_Message::status_idle, EEM_Message::status_resend, EEM_Message::status_retry),
1140
+					),
1141
+				),
1142
+			)
1143
+		);
1144
+		$sent_queue = false;
1145
+		if ($messages) {
1146
+			$sent_queue = self::$_MSG_PROCESSOR->batch_send_from_queue($messages);
1147
+		}
1148
+
1149
+		if (! $sent_queue instanceof EE_Messages_Queue) {
1150
+			EE_Error::add_error(
1151
+				__(
1152
+					'The messages were not sent. This could mean there is already a batch being sent on a separate request, or because the selected messages are not sendable. Please wait a minute or two and try again.',
1153
+					'event_espresso'
1154
+				),
1155
+				__FILE__,
1156
+				__FUNCTION__,
1157
+				__LINE__
1158
+			);
1159
+		} else {
1160
+			// can count how many sent by using the messages in the queue
1161
+			$sent_count = $sent_queue->count_STS_in_queue(EEM_Message::instance()->stati_indicating_sent());
1162
+			if ($sent_count > 0) {
1163
+				EE_Error::add_success(
1164
+					sprintf(
1165
+						_n(
1166
+							'There was %d message successfully sent.',
1167
+							'There were %d messages successfully sent.',
1168
+							$sent_count,
1169
+							'event_espresso'
1170
+						),
1171
+						$sent_count
1172
+					)
1173
+				);
1174
+			} else {
1175
+				EE_Error::overwrite_errors();
1176
+				EE_Error::add_error(
1177
+					__(
1178
+						'No message was sent because of problems with sending. Either all the messages you selected were not a sendable message, they were ALREADY sent on a different scheduled task, or there was an error.
1179 1179
 					If there was an error, you can look at the messages in the message activity list table for any error messages.',
1180
-                        'event_espresso'
1181
-                    ),
1182
-                    __FILE__,
1183
-                    __FUNCTION__,
1184
-                    __LINE__
1185
-                );
1186
-            }
1187
-        }
1188
-        return $sent_queue;
1189
-    }
1190
-
1191
-
1192
-    /**
1193
-     * Generate and send immediately from the given $message_ids
1194
-     *
1195
-     * @param array $message_ids EE_Message entity ids.
1196
-     * @throws EE_Error
1197
-     * @throws InvalidArgumentException
1198
-     * @throws InvalidDataTypeException
1199
-     * @throws InvalidInterfaceException
1200
-     * @throws ReflectionException
1201
-     */
1202
-    public static function generate_and_send_now(array $message_ids)
1203
-    {
1204
-        $generated_queue = self::generate_now($message_ids);
1205
-        // now let's just trigger sending immediately from this queue.
1206
-        $messages_sent = $generated_queue instanceof EE_Messages_Queue
1207
-            ? $generated_queue->execute()
1208
-            : 0;
1209
-        if ($messages_sent) {
1210
-            EE_Error::add_success(
1211
-                esc_html(
1212
-                    sprintf(
1213
-                        _n(
1214
-                            'There was %d message successfully generated and sent.',
1215
-                            'There were %d messages successfully generated and sent.',
1216
-                            $messages_sent,
1217
-                            'event_espresso'
1218
-                        ),
1219
-                        $messages_sent
1220
-                    )
1221
-                )
1222
-            );
1223
-            // errors would be added via the generate_now method.
1224
-        }
1225
-    }
1226
-
1227
-
1228
-    /**
1229
-     * This will queue the incoming message ids for resending.
1230
-     * Note, only message_ids corresponding to messages with the status of EEM_Message::sent will be queued.
1231
-     *
1232
-     * @since 4.9.0
1233
-     * @param array $message_ids An array of EE_Message IDs
1234
-     * @return bool true means messages were successfully queued for resending, false means none were queued for
1235
-     *                           resending.
1236
-     * @throws EE_Error
1237
-     * @throws InvalidArgumentException
1238
-     * @throws InvalidDataTypeException
1239
-     * @throws InvalidInterfaceException
1240
-     * @throws ReflectionException
1241
-     */
1242
-    public static function queue_for_resending($message_ids)
1243
-    {
1244
-        self::_load_controller();
1245
-        self::$_MSG_PROCESSOR->setup_messages_from_ids_and_send($message_ids);
1246
-
1247
-        // get queue and count
1248
-        $queue_count = self::$_MSG_PROCESSOR->get_queue()->count_STS_in_queue(EEM_Message::status_resend);
1249
-
1250
-        if (
1251
-            $queue_count > 0
1252
-        ) {
1253
-            EE_Error::add_success(
1254
-                sprintf(
1255
-                    _n(
1256
-                        '%d message successfully queued for resending.',
1257
-                        '%d messages successfully queued for resending.',
1258
-                        $queue_count,
1259
-                        'event_espresso'
1260
-                    ),
1261
-                    $queue_count
1262
-                )
1263
-            );
1264
-            /**
1265
-             * @see filter usage in EE_Messages_Queue::initiate_request_by_priority
1266
-             */
1267
-        } elseif (
1268
-            apply_filters('FHEE__EE_Messages_Processor__initiate_request_by_priority__do_immediate_processing', true)
1269
-            || EE_Registry::instance()->NET_CFG->core->do_messages_on_same_request
1270
-        ) {
1271
-            $queue_count = self::$_MSG_PROCESSOR->get_queue()->count_STS_in_queue(EEM_Message::status_sent);
1272
-            if ($queue_count > 0) {
1273
-                EE_Error::add_success(
1274
-                    sprintf(
1275
-                        _n(
1276
-                            '%d message successfully sent.',
1277
-                            '%d messages successfully sent.',
1278
-                            $queue_count,
1279
-                            'event_espresso'
1280
-                        ),
1281
-                        $queue_count
1282
-                    )
1283
-                );
1284
-            } else {
1285
-                EE_Error::add_error(
1286
-                    __(
1287
-                        'No messages were queued for resending. This usually only happens when all the messages flagged for resending are not a status that can be resent.',
1288
-                        'event_espresso'
1289
-                    ),
1290
-                    __FILE__,
1291
-                    __FUNCTION__,
1292
-                    __LINE__
1293
-                );
1294
-            }
1295
-        } else {
1296
-            EE_Error::add_error(
1297
-                __(
1298
-                    'No messages were queued for resending. This usually only happens when all the messages flagged for resending are not a status that can be resent.',
1299
-                    'event_espresso'
1300
-                ),
1301
-                __FILE__,
1302
-                __FUNCTION__,
1303
-                __LINE__
1304
-            );
1305
-        }
1306
-        return (bool) $queue_count;
1307
-    }
1308
-
1309
-
1310
-    /**
1311
-     * debug
1312
-     *
1313
-     * @param string          $class
1314
-     * @param string          $func
1315
-     * @param string          $line
1316
-     * @param \EE_Transaction $transaction
1317
-     * @param array           $info
1318
-     * @param bool            $display_request
1319
-     * @throws EE_Error
1320
-     * @throws \EventEspresso\core\exceptions\InvalidSessionDataException
1321
-     */
1322
-    protected static function log(
1323
-        $class = '',
1324
-        $func = '',
1325
-        $line = '',
1326
-        EE_Transaction $transaction,
1327
-        $info = array(),
1328
-        $display_request = false
1329
-    ) {
1330
-        if (defined('EE_DEBUG') && EE_DEBUG) {
1331
-            if ($transaction instanceof EE_Transaction) {
1332
-                // don't serialize objects
1333
-                $info = EEH_Debug_Tools::strip_objects($info);
1334
-                $info['TXN_status'] = $transaction->status_ID();
1335
-                $info['TXN_reg_steps'] = $transaction->reg_steps();
1336
-                if ($transaction->ID()) {
1337
-                    $index = 'EE_Transaction: ' . $transaction->ID();
1338
-                    EEH_Debug_Tools::log($class, $func, $line, $info, $display_request, $index);
1339
-                }
1340
-            }
1341
-        }
1342
-    }
1343
-
1344
-
1345
-    /**
1346
-     *  Resets all the static properties in this class when called.
1347
-     */
1348
-    public static function reset()
1349
-    {
1350
-        self::$_EEMSG = null;
1351
-        self::$_message_resource_manager = null;
1352
-        self::$_MSG_PROCESSOR = null;
1353
-        self::$_MSG_PATHS = null;
1354
-        self::$_TMP_PACKS = array();
1355
-    }
1180
+						'event_espresso'
1181
+					),
1182
+					__FILE__,
1183
+					__FUNCTION__,
1184
+					__LINE__
1185
+				);
1186
+			}
1187
+		}
1188
+		return $sent_queue;
1189
+	}
1190
+
1191
+
1192
+	/**
1193
+	 * Generate and send immediately from the given $message_ids
1194
+	 *
1195
+	 * @param array $message_ids EE_Message entity ids.
1196
+	 * @throws EE_Error
1197
+	 * @throws InvalidArgumentException
1198
+	 * @throws InvalidDataTypeException
1199
+	 * @throws InvalidInterfaceException
1200
+	 * @throws ReflectionException
1201
+	 */
1202
+	public static function generate_and_send_now(array $message_ids)
1203
+	{
1204
+		$generated_queue = self::generate_now($message_ids);
1205
+		// now let's just trigger sending immediately from this queue.
1206
+		$messages_sent = $generated_queue instanceof EE_Messages_Queue
1207
+			? $generated_queue->execute()
1208
+			: 0;
1209
+		if ($messages_sent) {
1210
+			EE_Error::add_success(
1211
+				esc_html(
1212
+					sprintf(
1213
+						_n(
1214
+							'There was %d message successfully generated and sent.',
1215
+							'There were %d messages successfully generated and sent.',
1216
+							$messages_sent,
1217
+							'event_espresso'
1218
+						),
1219
+						$messages_sent
1220
+					)
1221
+				)
1222
+			);
1223
+			// errors would be added via the generate_now method.
1224
+		}
1225
+	}
1226
+
1227
+
1228
+	/**
1229
+	 * This will queue the incoming message ids for resending.
1230
+	 * Note, only message_ids corresponding to messages with the status of EEM_Message::sent will be queued.
1231
+	 *
1232
+	 * @since 4.9.0
1233
+	 * @param array $message_ids An array of EE_Message IDs
1234
+	 * @return bool true means messages were successfully queued for resending, false means none were queued for
1235
+	 *                           resending.
1236
+	 * @throws EE_Error
1237
+	 * @throws InvalidArgumentException
1238
+	 * @throws InvalidDataTypeException
1239
+	 * @throws InvalidInterfaceException
1240
+	 * @throws ReflectionException
1241
+	 */
1242
+	public static function queue_for_resending($message_ids)
1243
+	{
1244
+		self::_load_controller();
1245
+		self::$_MSG_PROCESSOR->setup_messages_from_ids_and_send($message_ids);
1246
+
1247
+		// get queue and count
1248
+		$queue_count = self::$_MSG_PROCESSOR->get_queue()->count_STS_in_queue(EEM_Message::status_resend);
1249
+
1250
+		if (
1251
+			$queue_count > 0
1252
+		) {
1253
+			EE_Error::add_success(
1254
+				sprintf(
1255
+					_n(
1256
+						'%d message successfully queued for resending.',
1257
+						'%d messages successfully queued for resending.',
1258
+						$queue_count,
1259
+						'event_espresso'
1260
+					),
1261
+					$queue_count
1262
+				)
1263
+			);
1264
+			/**
1265
+			 * @see filter usage in EE_Messages_Queue::initiate_request_by_priority
1266
+			 */
1267
+		} elseif (
1268
+			apply_filters('FHEE__EE_Messages_Processor__initiate_request_by_priority__do_immediate_processing', true)
1269
+			|| EE_Registry::instance()->NET_CFG->core->do_messages_on_same_request
1270
+		) {
1271
+			$queue_count = self::$_MSG_PROCESSOR->get_queue()->count_STS_in_queue(EEM_Message::status_sent);
1272
+			if ($queue_count > 0) {
1273
+				EE_Error::add_success(
1274
+					sprintf(
1275
+						_n(
1276
+							'%d message successfully sent.',
1277
+							'%d messages successfully sent.',
1278
+							$queue_count,
1279
+							'event_espresso'
1280
+						),
1281
+						$queue_count
1282
+					)
1283
+				);
1284
+			} else {
1285
+				EE_Error::add_error(
1286
+					__(
1287
+						'No messages were queued for resending. This usually only happens when all the messages flagged for resending are not a status that can be resent.',
1288
+						'event_espresso'
1289
+					),
1290
+					__FILE__,
1291
+					__FUNCTION__,
1292
+					__LINE__
1293
+				);
1294
+			}
1295
+		} else {
1296
+			EE_Error::add_error(
1297
+				__(
1298
+					'No messages were queued for resending. This usually only happens when all the messages flagged for resending are not a status that can be resent.',
1299
+					'event_espresso'
1300
+				),
1301
+				__FILE__,
1302
+				__FUNCTION__,
1303
+				__LINE__
1304
+			);
1305
+		}
1306
+		return (bool) $queue_count;
1307
+	}
1308
+
1309
+
1310
+	/**
1311
+	 * debug
1312
+	 *
1313
+	 * @param string          $class
1314
+	 * @param string          $func
1315
+	 * @param string          $line
1316
+	 * @param \EE_Transaction $transaction
1317
+	 * @param array           $info
1318
+	 * @param bool            $display_request
1319
+	 * @throws EE_Error
1320
+	 * @throws \EventEspresso\core\exceptions\InvalidSessionDataException
1321
+	 */
1322
+	protected static function log(
1323
+		$class = '',
1324
+		$func = '',
1325
+		$line = '',
1326
+		EE_Transaction $transaction,
1327
+		$info = array(),
1328
+		$display_request = false
1329
+	) {
1330
+		if (defined('EE_DEBUG') && EE_DEBUG) {
1331
+			if ($transaction instanceof EE_Transaction) {
1332
+				// don't serialize objects
1333
+				$info = EEH_Debug_Tools::strip_objects($info);
1334
+				$info['TXN_status'] = $transaction->status_ID();
1335
+				$info['TXN_reg_steps'] = $transaction->reg_steps();
1336
+				if ($transaction->ID()) {
1337
+					$index = 'EE_Transaction: ' . $transaction->ID();
1338
+					EEH_Debug_Tools::log($class, $func, $line, $info, $display_request, $index);
1339
+				}
1340
+			}
1341
+		}
1342
+	}
1343
+
1344
+
1345
+	/**
1346
+	 *  Resets all the static properties in this class when called.
1347
+	 */
1348
+	public static function reset()
1349
+	{
1350
+		self::$_EEMSG = null;
1351
+		self::$_message_resource_manager = null;
1352
+		self::$_MSG_PROCESSOR = null;
1353
+		self::$_MSG_PATHS = null;
1354
+		self::$_TMP_PACKS = array();
1355
+	}
1356 1356
 }
Please login to merge, or discard this patch.
Spacing   +25 added lines, -25 removed lines patch added patch discarded remove patch
@@ -202,7 +202,7 @@  discard block
 block discarded – undo
202 202
                 'event_espresso'
203 203
             );
204 204
             // add specific message for developers if WP_DEBUG in on
205
-            $error_msg .= '||' . $e->getMessage();
205
+            $error_msg .= '||'.$e->getMessage();
206 206
             EE_Error::add_error($error_msg, __FILE__, __FUNCTION__, __LINE__);
207 207
         }
208 208
     }
@@ -289,7 +289,7 @@  discard block
 block discarded – undo
289 289
                 'event_espresso'
290 290
             );
291 291
             // add specific message for developers if WP_DEBUG in on
292
-            $error_msg .= '||' . $e->getMessage();
292
+            $error_msg .= '||'.$e->getMessage();
293 293
             EE_Error::add_error($error_msg, __FILE__, __FUNCTION__, __LINE__);
294 294
         }
295 295
     }
@@ -320,7 +320,7 @@  discard block
 block discarded – undo
320 320
         $transient_key = EE_Registry::instance()->REQ->get('key');
321 321
 
322 322
         // now let's verify transient, if not valid exit immediately
323
-        if (! get_transient($transient_key)) {
323
+        if ( ! get_transient($transient_key)) {
324 324
             /**
325 325
              * trigger error so this gets in the error logs.  This is important because it happens on a non-user
326 326
              * request.
@@ -332,7 +332,7 @@  discard block
 block discarded – undo
332 332
         delete_transient($transient_key);
333 333
 
334 334
         if (apply_filters('FHEE__EED_Messages__run_cron__use_wp_cron', true)) {
335
-            $method = 'batch_' . $cron_type . '_from_queue';
335
+            $method = 'batch_'.$cron_type.'_from_queue';
336 336
             if (method_exists(self::$_MSG_PROCESSOR, $method)) {
337 337
                 self::$_MSG_PROCESSOR->$method();
338 338
             } else {
@@ -399,7 +399,7 @@  discard block
 block discarded – undo
399 399
         $template_pack_collection->rewind();
400 400
         $template_packs = array();
401 401
         while ($template_pack_collection->valid()) {
402
-            $template_packs[ $template_pack_collection->current()->dbref ] = $template_pack_collection->current();
402
+            $template_packs[$template_pack_collection->current()->dbref] = $template_pack_collection->current();
403 403
             $template_pack_collection->next();
404 404
         }
405 405
         return $template_packs;
@@ -439,15 +439,15 @@  discard block
 block discarded – undo
439 439
         self::$_MSG_PATHS = apply_filters(
440 440
             'FHEE__EED_Messages___set_messages_paths___MSG_PATHS',
441 441
             [
442
-                EE_LIBRARIES . 'messages/message_type',
443
-                EE_LIBRARIES . 'messages/messenger',
444
-                EE_LIBRARIES . 'messages/defaults',
445
-                EE_LIBRARIES . 'messages/defaults/email',
446
-                EE_LIBRARIES . 'messages/data_class',
447
-                EE_LIBRARIES . 'messages/validators',
448
-                EE_LIBRARIES . 'messages/validators/email',
449
-                EE_LIBRARIES . 'messages/validators/html',
450
-                EE_LIBRARIES . 'shortcodes',
442
+                EE_LIBRARIES.'messages/message_type',
443
+                EE_LIBRARIES.'messages/messenger',
444
+                EE_LIBRARIES.'messages/defaults',
445
+                EE_LIBRARIES.'messages/defaults/email',
446
+                EE_LIBRARIES.'messages/data_class',
447
+                EE_LIBRARIES.'messages/validators',
448
+                EE_LIBRARIES.'messages/validators/email',
449
+                EE_LIBRARIES.'messages/validators/html',
450
+                EE_LIBRARIES.'shortcodes',
451 451
             ]
452 452
         );
453 453
     }
@@ -466,7 +466,7 @@  discard block
 block discarded – undo
466 466
      */
467 467
     protected static function _load_controller()
468 468
     {
469
-        if (! self::$_MSG_PROCESSOR instanceof EE_Messages_Processor) {
469
+        if ( ! self::$_MSG_PROCESSOR instanceof EE_Messages_Processor) {
470 470
             EE_Registry::instance()->load_core('Request_Handler');
471 471
             self::set_autoloaders();
472 472
             self::$_EEMSG = EE_Registry::instance()->load_lib('messages');
@@ -507,7 +507,7 @@  discard block
 block discarded – undo
507 507
     public static function payment(EE_Transaction $transaction, EE_Payment $payment = null)
508 508
     {
509 509
         // if there's no payment object, then we cannot do a payment type message!
510
-        if (! $payment instanceof EE_Payment) {
510
+        if ( ! $payment instanceof EE_Payment) {
511 511
             return;
512 512
         }
513 513
         self::_load_controller();
@@ -554,7 +554,7 @@  discard block
 block discarded – undo
554 554
     public static function maybe_registration(EE_Registration $registration, $extra_details = array())
555 555
     {
556 556
 
557
-        if (! self::_verify_registration_notification_send($registration, $extra_details)) {
557
+        if ( ! self::_verify_registration_notification_send($registration, $extra_details)) {
558 558
             // no messages please
559 559
             return;
560 560
         }
@@ -621,7 +621,7 @@  discard block
 block discarded – undo
621 621
         EE_Registration $registration,
622 622
         $extra_details = array()
623 623
     ) {
624
-        if (! $registration->is_primary_registrant()) {
624
+        if ( ! $registration->is_primary_registrant()) {
625 625
             return false;
626 626
         }
627 627
         // first we check if we're in admin and not doing front ajax
@@ -637,7 +637,7 @@  discard block
 block discarded – undo
637 637
         } else {
638 638
             // frontend request (either regular or via AJAX)
639 639
             // TXN is NOT finalized ?
640
-            if (! isset($extra_details['finalized']) || $extra_details['finalized'] === false) {
640
+            if ( ! isset($extra_details['finalized']) || $extra_details['finalized'] === false) {
641 641
                 return false;
642 642
             }
643 643
             // return visit but nothing changed ???
@@ -768,7 +768,7 @@  discard block
 block discarded – undo
768 768
         self::_load_controller();
769 769
 
770 770
         $msgID = EE_Registry::instance()->REQ->get('MSG_ID');
771
-        if (! $msgID) {
771
+        if ( ! $msgID) {
772 772
             EE_Error::add_error(
773 773
                 __(
774 774
                     'Something went wrong because there is no "MSG_ID" value in the request',
@@ -961,14 +961,14 @@  discard block
 block discarded – undo
961 961
             // get the message template group.
962 962
             $msg_template_group = EEM_Message_Template_Group::instance()->get_one(array($template_query_params));
963 963
             // if we don't have an EE_Message_Template_Group then return
964
-            if (! $msg_template_group instanceof EE_Message_Template_Group) {
964
+            if ( ! $msg_template_group instanceof EE_Message_Template_Group) {
965 965
                 // remove EVT_ID from query params so that global templates get picked up
966 966
                 unset($template_query_params['Event.EVT_ID']);
967 967
                 // get global template as the fallback
968 968
                 $msg_template_group = EEM_Message_Template_Group::instance()->get_one(array($template_query_params));
969 969
             }
970 970
             // if we don't have an EE_Message_Template_Group then return
971
-            if (! $msg_template_group instanceof EE_Message_Template_Group) {
971
+            if ( ! $msg_template_group instanceof EE_Message_Template_Group) {
972 972
                 return '';
973 973
             }
974 974
             // generate the URL
@@ -1099,7 +1099,7 @@  discard block
 block discarded – undo
1099 1099
             $generated_queue = self::$_MSG_PROCESSOR->batch_generate_from_queue($messages);
1100 1100
         }
1101 1101
 
1102
-        if (! $generated_queue instanceof EE_Messages_Queue) {
1102
+        if ( ! $generated_queue instanceof EE_Messages_Queue) {
1103 1103
             EE_Error::add_error(
1104 1104
                 __(
1105 1105
                     'The messages were not generated. This could mean there is already a batch being generated on a separate request, or because the selected messages are not ready for generation. Please wait a minute or two and try again.',
@@ -1146,7 +1146,7 @@  discard block
 block discarded – undo
1146 1146
             $sent_queue = self::$_MSG_PROCESSOR->batch_send_from_queue($messages);
1147 1147
         }
1148 1148
 
1149
-        if (! $sent_queue instanceof EE_Messages_Queue) {
1149
+        if ( ! $sent_queue instanceof EE_Messages_Queue) {
1150 1150
             EE_Error::add_error(
1151 1151
                 __(
1152 1152
                     'The messages were not sent. This could mean there is already a batch being sent on a separate request, or because the selected messages are not sendable. Please wait a minute or two and try again.',
@@ -1334,7 +1334,7 @@  discard block
 block discarded – undo
1334 1334
                 $info['TXN_status'] = $transaction->status_ID();
1335 1335
                 $info['TXN_reg_steps'] = $transaction->reg_steps();
1336 1336
                 if ($transaction->ID()) {
1337
-                    $index = 'EE_Transaction: ' . $transaction->ID();
1337
+                    $index = 'EE_Transaction: '.$transaction->ID();
1338 1338
                     EEH_Debug_Tools::log($class, $func, $line, $info, $display_request, $index);
1339 1339
                 }
1340 1340
             }
Please login to merge, or discard this patch.
core/services/notices/NoticesContainerInterface.php 1 patch
Indentation   +81 added lines, -81 removed lines patch added patch discarded remove patch
@@ -16,129 +16,129 @@
 block discarded – undo
16 16
 interface NoticesContainerInterface
17 17
 {
18 18
 
19
-    /**
20
-     * @param string $notice
21
-     * @param bool   $dismissible
22
-     * @param string $file
23
-     * @param string $func
24
-     * @param string $line
25
-     */
26
-    public function addInformation($notice, $dismissible = true, $file = '', $func = '', $line = '');
19
+	/**
20
+	 * @param string $notice
21
+	 * @param bool   $dismissible
22
+	 * @param string $file
23
+	 * @param string $func
24
+	 * @param string $line
25
+	 */
26
+	public function addInformation($notice, $dismissible = true, $file = '', $func = '', $line = '');
27 27
 
28 28
 
29
-    /**
30
-     * @param string $notice
31
-     * @param bool   $dismissible
32
-     * @param string $file
33
-     * @param string $func
34
-     * @param string $line
35
-     * @return
36
-     */
37
-    public function addAttention($notice, $dismissible = true, $file = '', $func = '', $line = '');
29
+	/**
30
+	 * @param string $notice
31
+	 * @param bool   $dismissible
32
+	 * @param string $file
33
+	 * @param string $func
34
+	 * @param string $line
35
+	 * @return
36
+	 */
37
+	public function addAttention($notice, $dismissible = true, $file = '', $func = '', $line = '');
38 38
 
39 39
 
40 40
 
41
-    /**
42
-     * @param string $notice
43
-     * @param bool   $dismissible
44
-     * @param string $file
45
-     * @param string $func
46
-     * @param string $line
47
-     */
48
-    public function addError($notice, $dismissible = true, $file, $func, $line);
41
+	/**
42
+	 * @param string $notice
43
+	 * @param bool   $dismissible
44
+	 * @param string $file
45
+	 * @param string $func
46
+	 * @param string $line
47
+	 */
48
+	public function addError($notice, $dismissible = true, $file, $func, $line);
49 49
 
50 50
 
51 51
 
52
-    /**
53
-     * @param string $notice
54
-     * @param bool   $dismissible
55
-     * @param string $file
56
-     * @param string $func
57
-     * @param string $line
58
-     */
59
-    public function addSuccess($notice, $dismissible = true, $file = '', $func = '', $line = '');
52
+	/**
53
+	 * @param string $notice
54
+	 * @param bool   $dismissible
55
+	 * @param string $file
56
+	 * @param string $func
57
+	 * @param string $line
58
+	 */
59
+	public function addSuccess($notice, $dismissible = true, $file = '', $func = '', $line = '');
60 60
 
61 61
 
62 62
 
63
-    /**
64
-     * @return boolean
65
-     */
66
-    public function hasInformation();
63
+	/**
64
+	 * @return boolean
65
+	 */
66
+	public function hasInformation();
67 67
 
68 68
 
69 69
 
70
-    /**
71
-     * @return boolean
72
-     */
73
-    public function hasAttention();
70
+	/**
71
+	 * @return boolean
72
+	 */
73
+	public function hasAttention();
74 74
 
75 75
 
76 76
 
77
-    /**
78
-     * @return boolean
79
-     */
80
-    public function hasError();
77
+	/**
78
+	 * @return boolean
79
+	 */
80
+	public function hasError();
81 81
 
82 82
 
83 83
 
84
-    /**
85
-     * @return boolean
86
-     */
87
-    public function hasSuccess();
84
+	/**
85
+	 * @return boolean
86
+	 */
87
+	public function hasSuccess();
88 88
 
89 89
 
90 90
 
91
-    /**
92
-     * @return int
93
-     */
94
-    public function countInformation();
91
+	/**
92
+	 * @return int
93
+	 */
94
+	public function countInformation();
95 95
 
96 96
 
97 97
 
98
-    /**
99
-     * @return int
100
-     */
101
-    public function countAttention();
98
+	/**
99
+	 * @return int
100
+	 */
101
+	public function countAttention();
102 102
 
103 103
 
104 104
 
105
-    /**
106
-     * @return int
107
-     */
108
-    public function countError();
105
+	/**
106
+	 * @return int
107
+	 */
108
+	public function countError();
109 109
 
110 110
 
111 111
 
112
-    /**
113
-     * @return int
114
-     */
115
-    public function countSuccess();
112
+	/**
113
+	 * @return int
114
+	 */
115
+	public function countSuccess();
116 116
 
117 117
 
118 118
 
119
-    /**
120
-     * @return NoticeInterface[]
121
-     */
122
-    public function getInformation();
119
+	/**
120
+	 * @return NoticeInterface[]
121
+	 */
122
+	public function getInformation();
123 123
 
124 124
 
125 125
 
126
-    /**
127
-     * @return NoticeInterface[]
128
-     */
129
-    public function getAttention();
126
+	/**
127
+	 * @return NoticeInterface[]
128
+	 */
129
+	public function getAttention();
130 130
 
131 131
 
132 132
 
133
-    /**
134
-     * @return NoticeInterface[]
135
-     */
136
-    public function getError();
133
+	/**
134
+	 * @return NoticeInterface[]
135
+	 */
136
+	public function getError();
137 137
 
138 138
 
139 139
 
140
-    /**
141
-     * @return NoticeInterface[]
142
-     */
143
-    public function getSuccess();
140
+	/**
141
+	 * @return NoticeInterface[]
142
+	 */
143
+	public function getSuccess();
144 144
 }
Please login to merge, or discard this patch.
core/services/notices/ConvertNoticesToAdminNotices.php 2 patches
Spacing   +1 added lines, -1 removed lines patch added patch discarded remove patch
@@ -36,7 +36,7 @@
 block discarded – undo
36 36
             $error_string = esc_html__('The following errors occurred:', 'event_espresso');
37 37
             foreach ($notices->getError() as $notice) {
38 38
                 if ($this->getThrowExceptions()) {
39
-                    $error_string .= '<br />' . $notice->message();
39
+                    $error_string .= '<br />'.$notice->message();
40 40
                 } else {
41 41
                     new AdminNotice($notice);
42 42
                 }
Please login to merge, or discard this patch.
Indentation   +38 added lines, -38 removed lines patch added patch discarded remove patch
@@ -14,42 +14,42 @@
 block discarded – undo
14 14
 class ConvertNoticesToAdminNotices extends NoticeConverter
15 15
 {
16 16
 
17
-    /**
18
-     * Converts Notice objects into AdminNotice notifications
19
-     *
20
-     * @param NoticesContainerInterface $notices
21
-     * @throws DomainException
22
-     */
23
-    public function process(NoticesContainerInterface $notices)
24
-    {
25
-        if ($notices->hasAttention()) {
26
-            foreach ($notices->getAttention() as $notice) {
27
-                new AdminNotice($notice);
28
-            }
29
-        }
30
-        if ($notices->hasError()) {
31
-            $error_string = esc_html__('The following errors occurred:', 'event_espresso');
32
-            foreach ($notices->getError() as $notice) {
33
-                if ($this->getThrowExceptions()) {
34
-                    $error_string .= '<br />' . $notice->message();
35
-                } else {
36
-                    new AdminNotice($notice);
37
-                }
38
-            }
39
-            if ($this->getThrowExceptions()) {
40
-                throw new DomainException($error_string);
41
-            }
42
-        }
43
-        if ($notices->hasSuccess()) {
44
-            foreach ($notices->getSuccess() as $notice) {
45
-                new AdminNotice($notice);
46
-            }
47
-        }
48
-        if ($notices->hasInformation()) {
49
-            foreach ($notices->getInformation() as $notice) {
50
-                new AdminNotice($notice);
51
-            }
52
-        }
53
-        $this->clearNotices();
54
-    }
17
+	/**
18
+	 * Converts Notice objects into AdminNotice notifications
19
+	 *
20
+	 * @param NoticesContainerInterface $notices
21
+	 * @throws DomainException
22
+	 */
23
+	public function process(NoticesContainerInterface $notices)
24
+	{
25
+		if ($notices->hasAttention()) {
26
+			foreach ($notices->getAttention() as $notice) {
27
+				new AdminNotice($notice);
28
+			}
29
+		}
30
+		if ($notices->hasError()) {
31
+			$error_string = esc_html__('The following errors occurred:', 'event_espresso');
32
+			foreach ($notices->getError() as $notice) {
33
+				if ($this->getThrowExceptions()) {
34
+					$error_string .= '<br />' . $notice->message();
35
+				} else {
36
+					new AdminNotice($notice);
37
+				}
38
+			}
39
+			if ($this->getThrowExceptions()) {
40
+				throw new DomainException($error_string);
41
+			}
42
+		}
43
+		if ($notices->hasSuccess()) {
44
+			foreach ($notices->getSuccess() as $notice) {
45
+				new AdminNotice($notice);
46
+			}
47
+		}
48
+		if ($notices->hasInformation()) {
49
+			foreach ($notices->getInformation() as $notice) {
50
+				new AdminNotice($notice);
51
+			}
52
+		}
53
+		$this->clearNotices();
54
+	}
55 55
 }
Please login to merge, or discard this patch.
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.
Indentation   +1113 added lines, -1113 removed lines patch added patch discarded remove patch
@@ -16,1108 +16,1108 @@  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 (
309
-                apply_filters('FHEE__EED_Event_Archive__template_include__allow_custom_selected_template', false)
310
-                || EE_Registry::instance()
311
-                              ->load_core('Front_Controller')
312
-                              ->get_selected_template() !== 'archive-espresso_events.php'
313
-            ) {
314
-                // don't display entry meta because the existing theme will take care of that
315
-                add_filter('FHEE__EED_Events_Archive__template_include__events_list_active', '__return_true');
316
-                // load functions.php file for the theme (loaded by WP if using child theme)
317
-                EEH_Template::load_espresso_theme_functions();
318
-                // because we don't know if the theme is using the_excerpt()
319
-                add_filter(
320
-                    'the_excerpt',
321
-                    array('EED_Events_Archive', 'event_details'),
322
-                    EED_Events_Archive::EVENT_DETAILS_PRIORITY
323
-                );
324
-                // or the_content
325
-                add_filter(
326
-                    'the_content',
327
-                    array('EED_Events_Archive', 'event_details'),
328
-                    EED_Events_Archive::EVENT_DETAILS_PRIORITY
329
-                );
330
-                // and just in case they are running get_the_excerpt() which DESTROYS things
331
-                add_filter('get_the_excerpt', array('EED_Events_Archive', 'get_the_excerpt'), 1, 1);
332
-                // don't display entry meta because the existing theme will take care of that
333
-                add_filter('FHEE__content_espresso_events_details_template__display_entry_meta', '__return_false');
334
-            }
335
-        }
336
-        return $template;
337
-    }
338
-
339
-
340
-    /**
341
-     *    get_the_excerpt - kinda hacky, but if a theme is using get_the_excerpt(), then we need to remove our filters
342
-     *    on the_content()
343
-     *
344
-     * @access    public
345
-     * @param        string $excerpt
346
-     * @return        string
347
-     */
348
-    public static function get_the_excerpt($excerpt = '')
349
-    {
350
-        if (post_password_required()) {
351
-            return $excerpt;
352
-        }
353
-        if (apply_filters('FHEE__EED_Events_Archive__get_the_excerpt__theme_uses_get_the_excerpt', false)) {
354
-            remove_filter(
355
-                'the_excerpt',
356
-                array('EED_Events_Archive', 'event_details'),
357
-                EED_Events_Archive::EVENT_DETAILS_PRIORITY
358
-            );
359
-            remove_filter(
360
-                'the_content',
361
-                array('EED_Events_Archive', 'event_details'),
362
-                EED_Events_Archive::EVENT_DETAILS_PRIORITY
363
-            );
364
-            $excerpt = EED_Events_Archive::event_details($excerpt);
365
-        } else {
366
-            EED_Events_Archive::$using_get_the_excerpt = true;
367
-            add_filter('wp_trim_excerpt', array('EED_Events_Archive', 'end_get_the_excerpt'), 999, 1);
368
-        }
369
-        return $excerpt;
370
-    }
371
-
372
-
373
-    /**
374
-     * end_get_the_excerpt
375
-     *
376
-     * @access public
377
-     * @param  string $text
378
-     * @return string
379
-     */
380
-    public static function end_get_the_excerpt($text = '')
381
-    {
382
-        EED_Events_Archive::$using_get_the_excerpt = false;
383
-        return $text;
384
-    }
385
-
386
-
387
-    /**
388
-     *    the_title
389
-     *
390
-     * @access        public
391
-     * @param        string $title
392
-     * @param        string $id
393
-     * @return        string
394
-     */
395
-    public static function the_title($title = '', $id = '')
396
-    {
397
-        global $post;
398
-        if ($post instanceof WP_Post) {
399
-            return in_the_loop() && $post->ID == $id ? espresso_event_status_banner($post->ID) . $title : $title;
400
-        }
401
-        return $title;
402
-    }
403
-
404
-
405
-    /**
406
-     *    event_details
407
-     *
408
-     * @access    public
409
-     * @param        string $content
410
-     * @return        string
411
-     */
412
-    public static function event_details($content)
413
-    {
414
-        global $post;
415
-        static $current_post_ID = 0;
416
-        if (
417
-            $current_post_ID !== $post->ID
418
-            && $post->post_type === 'espresso_events'
419
-            && ! EED_Events_Archive::$using_get_the_excerpt
420
-            && ! post_password_required()
421
-            && (
422
-                apply_filters('FHEE__EES_Espresso_Events__process_shortcode__true', false)
423
-                || ! apply_filters('FHEE__content_espresso_events__template_loaded', false)
424
-            )
425
-        ) {
426
-            // Set current post ID to prevent showing content twice, but only if headers have definitely been sent.
427
-            // Reason being is that some plugins, like Yoast, need to run through a copy of the loop early
428
-            // BEFORE headers are sent in order to examine the post content and generate content for the HTML header.
429
-            // We want to allow those plugins to still do their thing and have access to our content, but depending on
430
-            // how your event content is being displayed (shortcode, CPT route, etc), this filter can get applied twice,
431
-            // so the following allows this filter to be applied multiple times, but only once for real
432
-            $current_post_ID = did_action('loop_start') ? $post->ID : 0;
433
-            if (EE_Registry::instance()->CFG->template_settings->EED_Events_Archive->use_sortable_display_order) {
434
-                $content = EED_Events_Archive::use_sortable_display_order();
435
-            } else {
436
-                $content = EED_Events_Archive::use_filterable_display_order();
437
-            }
438
-        }
439
-        return $content;
440
-    }
441
-
442
-
443
-    /**
444
-     *    use_sortable_display_order
445
-     *
446
-     * @access    protected
447
-     * @return string
448
-     */
449
-    protected static function use_sortable_display_order()
450
-    {
451
-        // no further password checks required atm
452
-        add_filter('FHEE__EED_Events_Archive__event_details__no_post_password_required', '__return_true');
453
-        // we need to first remove this callback from being applied to the_content() or the_excerpt()
454
-        // (otherwise it will recurse and blow up the interweb)
455
-        remove_filter(
456
-            'the_excerpt',
457
-            array('EED_Events_Archive', 'event_details'),
458
-            EED_Events_Archive::EVENT_DETAILS_PRIORITY
459
-        );
460
-        remove_filter(
461
-            'the_content',
462
-            array('EED_Events_Archive', 'event_details'),
463
-            EED_Events_Archive::EVENT_DETAILS_PRIORITY
464
-        );
465
-        remove_filter('get_the_excerpt', array('EED_Events_Archive', 'get_the_excerpt'), 1);
466
-        // now add additional content depending on whether event is using the_excerpt() or the_content()
467
-        EED_Events_Archive::instance()->template_parts = EED_Events_Archive::instance()->initialize_template_parts();
468
-        $content = EEH_Template::locate_template('content-espresso_events-details.php');
469
-        $content = EED_Events_Archive::instance()->template_parts->apply_template_part_filters($content);
470
-        // re-add our main filters (or else the next event won't have them)
471
-        add_filter(
472
-            'the_excerpt',
473
-            array('EED_Events_Archive', 'event_details'),
474
-            EED_Events_Archive::EVENT_DETAILS_PRIORITY
475
-        );
476
-        add_filter(
477
-            'the_content',
478
-            array('EED_Events_Archive', 'event_details'),
479
-            EED_Events_Archive::EVENT_DETAILS_PRIORITY
480
-        );
481
-        add_filter('get_the_excerpt', array('EED_Events_Archive', 'get_the_excerpt'), 1, 1);
482
-        remove_filter(
483
-            'FHEE__EED_Events_Archive__event_details__no_post_password_required',
484
-            '__return_true'
485
-        );
486
-        return $content;
487
-    }
488
-
489
-
490
-    /**
491
-     *    use_filterable_display_order
492
-     *
493
-     * @access    protected
494
-     * @return    string
495
-     */
496
-    protected static function use_filterable_display_order()
497
-    {
498
-        // we need to first remove this callback from being applied to the_content()
499
-        // (otherwise it will recurse and blow up the interweb)
500
-        remove_filter(
501
-            'the_excerpt',
502
-            array('EED_Events_Archive', 'event_details'),
503
-            EED_Events_Archive::EVENT_DETAILS_PRIORITY
504
-        );
505
-        remove_filter(
506
-            'the_content',
507
-            array('EED_Events_Archive', 'event_details'),
508
-            EED_Events_Archive::EVENT_DETAILS_PRIORITY
509
-        );
510
-        remove_filter('get_the_excerpt', array('EED_Events_Archive', 'get_the_excerpt'), 1);
511
-        // now add additional content depending on whether event is using the_excerpt() or the_content()
512
-        EED_Events_Archive::_add_additional_excerpt_filters();
513
-        EED_Events_Archive::_add_additional_content_filters();
514
-        do_action('AHEE__EED_Events_Archive__use_filterable_display_order__after_add_filters');
515
-        // now load our template
516
-        $content = EEH_Template::locate_template('content-espresso_events-details.php');
517
-        // re-add our main filters (or else the next event won't have them)
518
-        add_filter(
519
-            'the_excerpt',
520
-            array('EED_Events_Archive', 'event_details'),
521
-            EED_Events_Archive::EVENT_DETAILS_PRIORITY
522
-        );
523
-        add_filter(
524
-            'the_content',
525
-            array('EED_Events_Archive', 'event_details'),
526
-            EED_Events_Archive::EVENT_DETAILS_PRIORITY
527
-        );
528
-        add_filter('get_the_excerpt', array('EED_Events_Archive', 'get_the_excerpt'), 1, 1);
529
-        // but remove the other filters so that they don't get applied to the next post
530
-        EED_Events_Archive::_remove_additional_events_archive_filters();
531
-        do_action('AHEE__EED_Events_Archive__use_filterable_display_order__after_remove_filters');
532
-        // we're not returning the $content directly because the template we are loading uses the_content (or the_excerpt)
533
-        // return ! empty( $template ) ? $template : $content;
534
-        return $content;
535
-    }
536
-
537
-
538
-    /**
539
-     *    event_datetimes - adds datetimes ABOVE content
540
-     *
541
-     * @access    public
542
-     * @param        string $content
543
-     * @return        string
544
-     */
545
-    public static function event_datetimes($content)
546
-    {
547
-        if (post_password_required()) {
548
-            return $content;
549
-        }
550
-        return EEH_Template::locate_template('content-espresso_events-datetimes.php') . $content;
551
-    }
552
-
553
-
554
-    /**
555
-     *    event_tickets - adds tickets ABOVE content (which includes datetimes)
556
-     *
557
-     * @access    public
558
-     * @param        string $content
559
-     * @return        string
560
-     */
561
-    public static function event_tickets($content)
562
-    {
563
-        if (post_password_required()) {
564
-            return $content;
565
-        }
566
-        return EEH_Template::locate_template('content-espresso_events-tickets.php') . $content;
567
-    }
568
-
569
-
570
-    /**
571
-     *    event_venues - adds venues BELOW content
572
-     *
573
-     * @access    public
574
-     * @param    string $content
575
-     * @return    string
576
-     */
577
-    public static function event_venue($content)
578
-    {
579
-        return EED_Events_Archive::event_venues($content);
580
-    }
581
-
582
-
583
-    /**
584
-     *    event_venues - adds venues BELOW content
585
-     *
586
-     * @access    public
587
-     * @param        string $content
588
-     * @return        string
589
-     */
590
-    public static function event_venues($content)
591
-    {
592
-        if (post_password_required()) {
593
-            return $content;
594
-        }
595
-        return $content . EEH_Template::locate_template('content-espresso_events-venues.php');
596
-    }
597
-
598
-
599
-    /**
600
-     *    _add_additional_content_filters
601
-     *
602
-     * @access    private
603
-     * @return        void
604
-     */
605
-    private static function _add_additional_excerpt_filters()
606
-    {
607
-        add_filter(
608
-            'the_excerpt',
609
-            array('EED_Events_Archive', 'event_datetimes'),
610
-            EED_Events_Archive::EVENT_DATETIMES_PRIORITY
611
-        );
612
-        add_filter(
613
-            'the_excerpt',
614
-            array('EED_Events_Archive', 'event_tickets'),
615
-            EED_Events_Archive::EVENT_TICKETS_PRIORITY
616
-        );
617
-        add_filter(
618
-            'the_excerpt',
619
-            array('EED_Events_Archive', 'event_venues'),
620
-            EED_Events_Archive::EVENT_VENUES_PRIORITY
621
-        );
622
-    }
623
-
624
-
625
-    /**
626
-     *    _add_additional_content_filters
627
-     *
628
-     * @access    private
629
-     * @return        void
630
-     */
631
-    private static function _add_additional_content_filters()
632
-    {
633
-        add_filter(
634
-            'the_content',
635
-            array('EED_Events_Archive', 'event_datetimes'),
636
-            EED_Events_Archive::EVENT_DATETIMES_PRIORITY
637
-        );
638
-        add_filter(
639
-            'the_content',
640
-            array('EED_Events_Archive', 'event_tickets'),
641
-            EED_Events_Archive::EVENT_TICKETS_PRIORITY
642
-        );
643
-        add_filter(
644
-            'the_content',
645
-            array('EED_Events_Archive', 'event_venues'),
646
-            EED_Events_Archive::EVENT_VENUES_PRIORITY
647
-        );
648
-    }
649
-
650
-
651
-    /**
652
-     *    _remove_additional_events_archive_filters
653
-     *
654
-     * @access    private
655
-     * @return        void
656
-     */
657
-    private static function _remove_additional_events_archive_filters()
658
-    {
659
-        remove_filter(
660
-            'the_excerpt',
661
-            array('EED_Events_Archive', 'event_datetimes'),
662
-            EED_Events_Archive::EVENT_DATETIMES_PRIORITY
663
-        );
664
-        remove_filter(
665
-            'the_excerpt',
666
-            array('EED_Events_Archive', 'event_tickets'),
667
-            EED_Events_Archive::EVENT_TICKETS_PRIORITY
668
-        );
669
-        remove_filter(
670
-            'the_excerpt',
671
-            array('EED_Events_Archive', 'event_venues'),
672
-            EED_Events_Archive::EVENT_VENUES_PRIORITY
673
-        );
674
-        remove_filter(
675
-            'the_content',
676
-            array('EED_Events_Archive', 'event_datetimes'),
677
-            EED_Events_Archive::EVENT_DATETIMES_PRIORITY
678
-        );
679
-        remove_filter(
680
-            'the_content',
681
-            array('EED_Events_Archive', 'event_tickets'),
682
-            EED_Events_Archive::EVENT_TICKETS_PRIORITY
683
-        );
684
-        remove_filter(
685
-            'the_content',
686
-            array('EED_Events_Archive', 'event_venues'),
687
-            EED_Events_Archive::EVENT_VENUES_PRIORITY
688
-        );
689
-    }
690
-
691
-
692
-    /**
693
-     *    remove_all_events_archive_filters
694
-     *
695
-     * @access    public
696
-     * @return        void
697
-     */
698
-    public static function remove_all_events_archive_filters()
699
-    {
700
-        // remove_filter( 'get_the_excerpt', array( 'EED_Events_Archive', 'get_the_excerpt' ), 1 );
701
-        remove_filter('the_title', array('EED_Events_Archive', 'the_title'), 1);
702
-        remove_filter(
703
-            'the_excerpt',
704
-            array('EED_Events_Archive', 'event_details'),
705
-            EED_Events_Archive::EVENT_DETAILS_PRIORITY
706
-        );
707
-        remove_filter(
708
-            'the_excerpt',
709
-            array('EED_Events_Archive', 'event_datetimes'),
710
-            EED_Events_Archive::EVENT_DATETIMES_PRIORITY
711
-        );
712
-        remove_filter(
713
-            'the_excerpt',
714
-            array('EED_Events_Archive', 'event_tickets'),
715
-            EED_Events_Archive::EVENT_TICKETS_PRIORITY
716
-        );
717
-        remove_filter(
718
-            'the_excerpt',
719
-            array('EED_Events_Archive', 'event_venues'),
720
-            EED_Events_Archive::EVENT_VENUES_PRIORITY
721
-        );
722
-        remove_filter(
723
-            'the_content',
724
-            array('EED_Events_Archive', 'event_details'),
725
-            EED_Events_Archive::EVENT_DETAILS_PRIORITY
726
-        );
727
-        remove_filter(
728
-            'the_content',
729
-            array('EED_Events_Archive', 'event_datetimes'),
730
-            EED_Events_Archive::EVENT_DATETIMES_PRIORITY
731
-        );
732
-        remove_filter(
733
-            'the_content',
734
-            array('EED_Events_Archive', 'event_tickets'),
735
-            EED_Events_Archive::EVENT_TICKETS_PRIORITY
736
-        );
737
-        remove_filter(
738
-            'the_content',
739
-            array('EED_Events_Archive', 'event_venues'),
740
-            EED_Events_Archive::EVENT_VENUES_PRIORITY
741
-        );
742
-        // don't display entry meta because the existing theme will take care of that
743
-        remove_filter(
744
-            'FHEE__content_espresso_events_details_template__display_entry_meta',
745
-            '__return_false'
746
-        );
747
-    }
748
-
749
-
750
-    /**
751
-     *    load_event_list_assets
752
-     *
753
-     * @access    public
754
-     * @return    void
755
-     */
756
-    public function load_event_list_assets()
757
-    {
758
-        do_action('AHEE__EED_Events_Archive__before_load_assets');
759
-        add_filter('FHEE_load_EE_Session', '__return_true');
760
-        add_filter('FHEE__EED_Ticket_Selector__load_tckt_slctr_assets', '__return_true');
761
-        add_action('wp_enqueue_scripts', array($this, 'wp_enqueue_scripts'), 10);
762
-        if (EE_Registry::instance()->CFG->map_settings->use_google_maps) {
763
-            add_action('wp_enqueue_scripts', array('EEH_Maps', 'espresso_google_map_js'), 11);
764
-        }
765
-    }
766
-
767
-
768
-    /**
769
-     *    wp_enqueue_scripts
770
-     *
771
-     * @access    public
772
-     * @return    void
773
-     * @throws EE_Error
774
-     */
775
-    public function wp_enqueue_scripts()
776
-    {
777
-        // get some style
778
-        if (apply_filters('FHEE_enable_default_espresso_css', false)) {
779
-            // first check uploads folder
780
-            if (EEH_File::is_readable(get_stylesheet_directory() . $this->theme . '/style.css')) {
781
-                wp_register_style(
782
-                    $this->theme,
783
-                    get_stylesheet_directory_uri() . $this->theme . '/style.css',
784
-                    array('dashicons', 'espresso_default')
785
-                );
786
-            } else {
787
-            }
788
-            wp_enqueue_style($this->theme);
789
-        }
790
-    }
791
-
792
-
793
-    /**
794
-     *    template_settings_form
795
-     *
796
-     * @access    public
797
-     * @static
798
-     * @return    string
799
-     */
800
-    public static function template_settings_form()
801
-    {
802
-        $template_settings = EE_Registry::instance()->CFG->template_settings;
803
-        $template_settings->EED_Events_Archive = isset($template_settings->EED_Events_Archive)
804
-            ? $template_settings->EED_Events_Archive : new EE_Events_Archive_Config();
805
-        $template_settings->EED_Events_Archive = apply_filters(
806
-            'FHEE__EED_Events_Archive__template_settings_form__event_list_config',
807
-            $template_settings->EED_Events_Archive
808
-        );
809
-        $events_archive_settings = array(
810
-            'display_status_banner' => 0,
811
-            'display_description' => 1,
812
-            'display_ticket_selector' => 0,
813
-            'display_datetimes' => 1,
814
-            'display_venue' => 0,
815
-            'display_expired_events' => 0,
816
-        );
817
-        $events_archive_settings = array_merge(
818
-            $events_archive_settings,
819
-            (array) $template_settings->EED_Events_Archive
820
-        );
821
-        EEH_Template::display_template(
822
-            EVENTS_ARCHIVE_TEMPLATES_PATH . 'admin-event-list-settings.template.php',
823
-            $events_archive_settings
824
-        );
825
-    }
826
-
827
-
828
-    /**
829
-     *    update_template_settings
830
-     *
831
-     * @access    public
832
-     * @param    EE_Template_Config $CFG
833
-     * @param    EE_Request_Handler $REQ
834
-     * @return    EE_Template_Config
835
-     */
836
-    public static function update_template_settings($CFG, $REQ)
837
-    {
838
-        $CFG->EED_Events_Archive = new EE_Events_Archive_Config();
839
-        // unless we are resetting the config...
840
-        if (
841
-            ! isset($REQ['EED_Events_Archive_reset_event_list_settings'])
842
-            || absint($REQ['EED_Events_Archive_reset_event_list_settings']) !== 1
843
-        ) {
844
-            $CFG->EED_Events_Archive->display_status_banner = isset($REQ['EED_Events_Archive_display_status_banner'])
845
-                ? absint($REQ['EED_Events_Archive_display_status_banner']) : 0;
846
-            $CFG->EED_Events_Archive->display_description = isset($REQ['EED_Events_Archive_display_description'])
847
-                ? absint($REQ['EED_Events_Archive_display_description']) : 1;
848
-            $CFG->EED_Events_Archive->display_ticket_selector = isset($REQ['EED_Events_Archive_display_ticket_selector'])
849
-                ? absint($REQ['EED_Events_Archive_display_ticket_selector']) : 0;
850
-            $CFG->EED_Events_Archive->display_datetimes = isset($REQ['EED_Events_Archive_display_datetimes']) ? absint(
851
-                $REQ['EED_Events_Archive_display_datetimes']
852
-            ) : 1;
853
-            $CFG->EED_Events_Archive->display_venue = isset($REQ['EED_Events_Archive_display_venue']) ? absint(
854
-                $REQ['EED_Events_Archive_display_venue']
855
-            ) : 0;
856
-            $CFG->EED_Events_Archive->display_expired_events = isset($REQ['EED_Events_Archive_display_expired_events'])
857
-                ? absint($REQ['EED_Events_Archive_display_expired_events']) : 0;
858
-        }
859
-        return $CFG;
860
-    }
861
-
862
-
863
-    /**
864
-     *    event_list_css
865
-     *
866
-     * @access    public
867
-     * @param string $extra_class
868
-     * @return    string
869
-     */
870
-    public static function event_list_css($extra_class = '')
871
-    {
872
-        $event_list_css = ! empty($extra_class) ? array($extra_class) : array();
873
-        $event_list_css[] = 'espresso-event-list-event';
874
-        return implode(' ', $event_list_css);
875
-    }
876
-
877
-
878
-    /**
879
-     *    event_categories
880
-     *
881
-     * @access    public
882
-     * @return    array
883
-     */
884
-    public static function event_categories()
885
-    {
886
-        return EE_Registry::instance()->load_model('Term')->get_all_ee_categories();
887
-    }
888
-
889
-
890
-    /**
891
-     *    display_description
892
-     *
893
-     * @access    public
894
-     * @param $value
895
-     * @return    bool
896
-     */
897
-    public static function display_description($value)
898
-    {
899
-        $config = EE_Registry::instance()->CFG->template_settings->EED_Events_Archive;
900
-        $display_description = isset($config->display_description) ? $config->display_description : 1;
901
-        return $display_description === $value ? true : false;
902
-    }
903
-
904
-
905
-    /**
906
-     *    display_ticket_selector
907
-     *
908
-     * @access    public
909
-     * @return    bool
910
-     */
911
-    public static function display_ticket_selector()
912
-    {
913
-        $config = EE_Registry::instance()->CFG->template_settings->EED_Events_Archive;
914
-        return isset($config->display_ticket_selector) && $config->display_ticket_selector ? true : false;
915
-    }
916
-
917
-
918
-    /**
919
-     *    display_venue
920
-     *
921
-     * @access    public
922
-     * @return    bool
923
-     */
924
-    public static function display_venue()
925
-    {
926
-        $config = EE_Registry::instance()->CFG->template_settings->EED_Events_Archive;
927
-        return isset($config->display_venue) && $config->display_venue && EEH_Venue_View::venue_name() ? true : false;
928
-    }
929
-
930
-
931
-    /**
932
-     *    display_datetimes
933
-     *
934
-     * @access    public
935
-     * @return    bool
936
-     */
937
-    public static function display_datetimes()
938
-    {
939
-        $config = EE_Registry::instance()->CFG->template_settings->EED_Events_Archive;
940
-        return isset($config->display_datetimes) && $config->display_datetimes ? true : false;
941
-    }
942
-
943
-
944
-    /**
945
-     *    event_list_title
946
-     *
947
-     * @access    public
948
-     * @return    string
949
-     */
950
-    public static function event_list_title()
951
-    {
952
-        return apply_filters(
953
-            'FHEE__archive_espresso_events_template__upcoming_events_h1',
954
-            __('Upcoming Events', 'event_espresso')
955
-        );
956
-    }
957
-
958
-
959
-    // GRAVEYARD
960
-
961
-
962
-    /**
963
-     * @since 4.4.0
964
-     */
965
-    public static function _doing_it_wrong_notice($function = '')
966
-    {
967
-        EE_Error::doing_it_wrong(
968
-            __FUNCTION__,
969
-            sprintf(
970
-                __(
971
-                    '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',
972
-                    'event_espresso'
973
-                ),
974
-                $function,
975
-                '<br />',
976
-                '4.6.0'
977
-            ),
978
-            '4.4.0'
979
-        );
980
-    }
981
-
982
-
983
-    /**
984
-     * @deprecated
985
-     * @since 4.4.0
986
-     */
987
-    public function get_post_data()
988
-    {
989
-        EEH_Event_Query::set_query_params();
990
-    }
991
-
992
-
993
-    /**
994
-     * @throws EE_Error
995
-     * @since 4.4.0
996
-     * @deprecated
997
-     */
998
-    public function posts_fields($SQL, WP_Query $wp_query)
999
-    {
1000
-        EED_Events_Archive::_doing_it_wrong_notice(__FUNCTION__);
1001
-        return EEH_Event_Query::posts_fields($SQL, $wp_query);
1002
-    }
1003
-
1004
-
1005
-    /**
1006
-     * @throws EE_Error
1007
-     * @since 4.4.0
1008
-     * @deprecated
1009
-     */
1010
-    public static function posts_fields_sql_for_orderby($orderby_params = array())
1011
-    {
1012
-        EED_Events_Archive::_doing_it_wrong_notice(__FUNCTION__);
1013
-        return EEH_Event_Query::posts_fields_sql_for_orderby($orderby_params);
1014
-    }
1015
-
1016
-
1017
-    /**
1018
-     * @throws EE_Error
1019
-     * @since 4.4.0
1020
-     * @deprecated
1021
-     */
1022
-    public function posts_join($SQL, WP_Query $wp_query)
1023
-    {
1024
-        EED_Events_Archive::_doing_it_wrong_notice(__FUNCTION__);
1025
-        return EEH_Event_Query::posts_join($SQL, $wp_query);
1026
-    }
1027
-
1028
-
1029
-    /**
1030
-     * @deprecated
1031
-     * @since 4.4.0
1032
-     */
1033
-    public static function posts_join_sql_for_terms($join_terms = null)
1034
-    {
1035
-        EED_Events_Archive::_doing_it_wrong_notice(__FUNCTION__);
1036
-        return EEH_Event_Query::posts_join_sql_for_terms($join_terms);
1037
-    }
1038
-
1039
-
1040
-    /**
1041
-     * @throws EE_Error
1042
-     * @since 4.4.0
1043
-     * @deprecated
1044
-     */
1045
-    public static function posts_join_for_orderby($orderby_params = array())
1046
-    {
1047
-        EED_Events_Archive::_doing_it_wrong_notice(__FUNCTION__);
1048
-        return EEH_Event_Query::posts_join_for_orderby($orderby_params);
1049
-    }
1050
-
1051
-
1052
-    /**
1053
-     * @throws EE_Error
1054
-     * @since 4.4.0
1055
-     * @deprecated
1056
-     */
1057
-    public function posts_where($SQL, WP_Query $wp_query)
1058
-    {
1059
-        EED_Events_Archive::_doing_it_wrong_notice(__FUNCTION__);
1060
-        return EEH_Event_Query::posts_where($SQL, $wp_query);
1061
-    }
1062
-
1063
-
1064
-    /**
1065
-     * @throws EE_Error
1066
-     * @since 4.4.0
1067
-     * @deprecated
1068
-     */
1069
-    public static function posts_where_sql_for_show_expired($show_expired = false)
1070
-    {
1071
-        EED_Events_Archive::_doing_it_wrong_notice(__FUNCTION__);
1072
-        return EEH_Event_Query::posts_where_sql_for_show_expired($show_expired);
1073
-    }
1074
-
1075
-
1076
-    /**
1077
-     * @deprecated
1078
-     * @since 4.4.0
1079
-     */
1080
-    public static function posts_where_sql_for_event_category_slug($event_category_slug = null)
1081
-    {
1082
-        EED_Events_Archive::_doing_it_wrong_notice(__FUNCTION__);
1083
-        return EEH_Event_Query::posts_where_sql_for_event_category_slug($event_category_slug);
1084
-    }
1085
-
1086
-
1087
-    /**
1088
-     * @throws EE_Error
1089
-     * @since 4.4.0
1090
-     * @deprecated
1091
-     */
1092
-    public static function posts_where_sql_for_event_list_month($month = null)
1093
-    {
1094
-        EED_Events_Archive::_doing_it_wrong_notice(__FUNCTION__);
1095
-        return EEH_Event_Query::posts_where_sql_for_event_list_month($month);
1096
-    }
1097
-
1098
-
1099
-    /**
1100
-     * @throws EE_Error
1101
-     * @since 4.4.0
1102
-     * @deprecated
1103
-     */
1104
-    public function posts_orderby($SQL, WP_Query $wp_query)
1105
-    {
1106
-        EED_Events_Archive::_doing_it_wrong_notice(__FUNCTION__);
1107
-        return EEH_Event_Query::posts_orderby($SQL, $wp_query);
1108
-    }
1109
-
1110
-
1111
-    /**
1112
-     * @throws EE_Error
1113
-     * @since 4.4.0
1114
-     * @deprecated
1115
-     */
1116
-    public static function posts_orderby_sql($orderby_params = array(), $sort = 'ASC')
1117
-    {
1118
-        EED_Events_Archive::_doing_it_wrong_notice(__FUNCTION__);
1119
-        return EEH_Event_Query::posts_orderby_sql($orderby_params, $sort);
1120
-    }
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 (
309
+				apply_filters('FHEE__EED_Event_Archive__template_include__allow_custom_selected_template', false)
310
+				|| EE_Registry::instance()
311
+							  ->load_core('Front_Controller')
312
+							  ->get_selected_template() !== 'archive-espresso_events.php'
313
+			) {
314
+				// don't display entry meta because the existing theme will take care of that
315
+				add_filter('FHEE__EED_Events_Archive__template_include__events_list_active', '__return_true');
316
+				// load functions.php file for the theme (loaded by WP if using child theme)
317
+				EEH_Template::load_espresso_theme_functions();
318
+				// because we don't know if the theme is using the_excerpt()
319
+				add_filter(
320
+					'the_excerpt',
321
+					array('EED_Events_Archive', 'event_details'),
322
+					EED_Events_Archive::EVENT_DETAILS_PRIORITY
323
+				);
324
+				// or the_content
325
+				add_filter(
326
+					'the_content',
327
+					array('EED_Events_Archive', 'event_details'),
328
+					EED_Events_Archive::EVENT_DETAILS_PRIORITY
329
+				);
330
+				// and just in case they are running get_the_excerpt() which DESTROYS things
331
+				add_filter('get_the_excerpt', array('EED_Events_Archive', 'get_the_excerpt'), 1, 1);
332
+				// don't display entry meta because the existing theme will take care of that
333
+				add_filter('FHEE__content_espresso_events_details_template__display_entry_meta', '__return_false');
334
+			}
335
+		}
336
+		return $template;
337
+	}
338
+
339
+
340
+	/**
341
+	 *    get_the_excerpt - kinda hacky, but if a theme is using get_the_excerpt(), then we need to remove our filters
342
+	 *    on the_content()
343
+	 *
344
+	 * @access    public
345
+	 * @param        string $excerpt
346
+	 * @return        string
347
+	 */
348
+	public static function get_the_excerpt($excerpt = '')
349
+	{
350
+		if (post_password_required()) {
351
+			return $excerpt;
352
+		}
353
+		if (apply_filters('FHEE__EED_Events_Archive__get_the_excerpt__theme_uses_get_the_excerpt', false)) {
354
+			remove_filter(
355
+				'the_excerpt',
356
+				array('EED_Events_Archive', 'event_details'),
357
+				EED_Events_Archive::EVENT_DETAILS_PRIORITY
358
+			);
359
+			remove_filter(
360
+				'the_content',
361
+				array('EED_Events_Archive', 'event_details'),
362
+				EED_Events_Archive::EVENT_DETAILS_PRIORITY
363
+			);
364
+			$excerpt = EED_Events_Archive::event_details($excerpt);
365
+		} else {
366
+			EED_Events_Archive::$using_get_the_excerpt = true;
367
+			add_filter('wp_trim_excerpt', array('EED_Events_Archive', 'end_get_the_excerpt'), 999, 1);
368
+		}
369
+		return $excerpt;
370
+	}
371
+
372
+
373
+	/**
374
+	 * end_get_the_excerpt
375
+	 *
376
+	 * @access public
377
+	 * @param  string $text
378
+	 * @return string
379
+	 */
380
+	public static function end_get_the_excerpt($text = '')
381
+	{
382
+		EED_Events_Archive::$using_get_the_excerpt = false;
383
+		return $text;
384
+	}
385
+
386
+
387
+	/**
388
+	 *    the_title
389
+	 *
390
+	 * @access        public
391
+	 * @param        string $title
392
+	 * @param        string $id
393
+	 * @return        string
394
+	 */
395
+	public static function the_title($title = '', $id = '')
396
+	{
397
+		global $post;
398
+		if ($post instanceof WP_Post) {
399
+			return in_the_loop() && $post->ID == $id ? espresso_event_status_banner($post->ID) . $title : $title;
400
+		}
401
+		return $title;
402
+	}
403
+
404
+
405
+	/**
406
+	 *    event_details
407
+	 *
408
+	 * @access    public
409
+	 * @param        string $content
410
+	 * @return        string
411
+	 */
412
+	public static function event_details($content)
413
+	{
414
+		global $post;
415
+		static $current_post_ID = 0;
416
+		if (
417
+			$current_post_ID !== $post->ID
418
+			&& $post->post_type === 'espresso_events'
419
+			&& ! EED_Events_Archive::$using_get_the_excerpt
420
+			&& ! post_password_required()
421
+			&& (
422
+				apply_filters('FHEE__EES_Espresso_Events__process_shortcode__true', false)
423
+				|| ! apply_filters('FHEE__content_espresso_events__template_loaded', false)
424
+			)
425
+		) {
426
+			// Set current post ID to prevent showing content twice, but only if headers have definitely been sent.
427
+			// Reason being is that some plugins, like Yoast, need to run through a copy of the loop early
428
+			// BEFORE headers are sent in order to examine the post content and generate content for the HTML header.
429
+			// We want to allow those plugins to still do their thing and have access to our content, but depending on
430
+			// how your event content is being displayed (shortcode, CPT route, etc), this filter can get applied twice,
431
+			// so the following allows this filter to be applied multiple times, but only once for real
432
+			$current_post_ID = did_action('loop_start') ? $post->ID : 0;
433
+			if (EE_Registry::instance()->CFG->template_settings->EED_Events_Archive->use_sortable_display_order) {
434
+				$content = EED_Events_Archive::use_sortable_display_order();
435
+			} else {
436
+				$content = EED_Events_Archive::use_filterable_display_order();
437
+			}
438
+		}
439
+		return $content;
440
+	}
441
+
442
+
443
+	/**
444
+	 *    use_sortable_display_order
445
+	 *
446
+	 * @access    protected
447
+	 * @return string
448
+	 */
449
+	protected static function use_sortable_display_order()
450
+	{
451
+		// no further password checks required atm
452
+		add_filter('FHEE__EED_Events_Archive__event_details__no_post_password_required', '__return_true');
453
+		// we need to first remove this callback from being applied to the_content() or the_excerpt()
454
+		// (otherwise it will recurse and blow up the interweb)
455
+		remove_filter(
456
+			'the_excerpt',
457
+			array('EED_Events_Archive', 'event_details'),
458
+			EED_Events_Archive::EVENT_DETAILS_PRIORITY
459
+		);
460
+		remove_filter(
461
+			'the_content',
462
+			array('EED_Events_Archive', 'event_details'),
463
+			EED_Events_Archive::EVENT_DETAILS_PRIORITY
464
+		);
465
+		remove_filter('get_the_excerpt', array('EED_Events_Archive', 'get_the_excerpt'), 1);
466
+		// now add additional content depending on whether event is using the_excerpt() or the_content()
467
+		EED_Events_Archive::instance()->template_parts = EED_Events_Archive::instance()->initialize_template_parts();
468
+		$content = EEH_Template::locate_template('content-espresso_events-details.php');
469
+		$content = EED_Events_Archive::instance()->template_parts->apply_template_part_filters($content);
470
+		// re-add our main filters (or else the next event won't have them)
471
+		add_filter(
472
+			'the_excerpt',
473
+			array('EED_Events_Archive', 'event_details'),
474
+			EED_Events_Archive::EVENT_DETAILS_PRIORITY
475
+		);
476
+		add_filter(
477
+			'the_content',
478
+			array('EED_Events_Archive', 'event_details'),
479
+			EED_Events_Archive::EVENT_DETAILS_PRIORITY
480
+		);
481
+		add_filter('get_the_excerpt', array('EED_Events_Archive', 'get_the_excerpt'), 1, 1);
482
+		remove_filter(
483
+			'FHEE__EED_Events_Archive__event_details__no_post_password_required',
484
+			'__return_true'
485
+		);
486
+		return $content;
487
+	}
488
+
489
+
490
+	/**
491
+	 *    use_filterable_display_order
492
+	 *
493
+	 * @access    protected
494
+	 * @return    string
495
+	 */
496
+	protected static function use_filterable_display_order()
497
+	{
498
+		// we need to first remove this callback from being applied to the_content()
499
+		// (otherwise it will recurse and blow up the interweb)
500
+		remove_filter(
501
+			'the_excerpt',
502
+			array('EED_Events_Archive', 'event_details'),
503
+			EED_Events_Archive::EVENT_DETAILS_PRIORITY
504
+		);
505
+		remove_filter(
506
+			'the_content',
507
+			array('EED_Events_Archive', 'event_details'),
508
+			EED_Events_Archive::EVENT_DETAILS_PRIORITY
509
+		);
510
+		remove_filter('get_the_excerpt', array('EED_Events_Archive', 'get_the_excerpt'), 1);
511
+		// now add additional content depending on whether event is using the_excerpt() or the_content()
512
+		EED_Events_Archive::_add_additional_excerpt_filters();
513
+		EED_Events_Archive::_add_additional_content_filters();
514
+		do_action('AHEE__EED_Events_Archive__use_filterable_display_order__after_add_filters');
515
+		// now load our template
516
+		$content = EEH_Template::locate_template('content-espresso_events-details.php');
517
+		// re-add our main filters (or else the next event won't have them)
518
+		add_filter(
519
+			'the_excerpt',
520
+			array('EED_Events_Archive', 'event_details'),
521
+			EED_Events_Archive::EVENT_DETAILS_PRIORITY
522
+		);
523
+		add_filter(
524
+			'the_content',
525
+			array('EED_Events_Archive', 'event_details'),
526
+			EED_Events_Archive::EVENT_DETAILS_PRIORITY
527
+		);
528
+		add_filter('get_the_excerpt', array('EED_Events_Archive', 'get_the_excerpt'), 1, 1);
529
+		// but remove the other filters so that they don't get applied to the next post
530
+		EED_Events_Archive::_remove_additional_events_archive_filters();
531
+		do_action('AHEE__EED_Events_Archive__use_filterable_display_order__after_remove_filters');
532
+		// we're not returning the $content directly because the template we are loading uses the_content (or the_excerpt)
533
+		// return ! empty( $template ) ? $template : $content;
534
+		return $content;
535
+	}
536
+
537
+
538
+	/**
539
+	 *    event_datetimes - adds datetimes ABOVE content
540
+	 *
541
+	 * @access    public
542
+	 * @param        string $content
543
+	 * @return        string
544
+	 */
545
+	public static function event_datetimes($content)
546
+	{
547
+		if (post_password_required()) {
548
+			return $content;
549
+		}
550
+		return EEH_Template::locate_template('content-espresso_events-datetimes.php') . $content;
551
+	}
552
+
553
+
554
+	/**
555
+	 *    event_tickets - adds tickets ABOVE content (which includes datetimes)
556
+	 *
557
+	 * @access    public
558
+	 * @param        string $content
559
+	 * @return        string
560
+	 */
561
+	public static function event_tickets($content)
562
+	{
563
+		if (post_password_required()) {
564
+			return $content;
565
+		}
566
+		return EEH_Template::locate_template('content-espresso_events-tickets.php') . $content;
567
+	}
568
+
569
+
570
+	/**
571
+	 *    event_venues - adds venues BELOW content
572
+	 *
573
+	 * @access    public
574
+	 * @param    string $content
575
+	 * @return    string
576
+	 */
577
+	public static function event_venue($content)
578
+	{
579
+		return EED_Events_Archive::event_venues($content);
580
+	}
581
+
582
+
583
+	/**
584
+	 *    event_venues - adds venues BELOW content
585
+	 *
586
+	 * @access    public
587
+	 * @param        string $content
588
+	 * @return        string
589
+	 */
590
+	public static function event_venues($content)
591
+	{
592
+		if (post_password_required()) {
593
+			return $content;
594
+		}
595
+		return $content . EEH_Template::locate_template('content-espresso_events-venues.php');
596
+	}
597
+
598
+
599
+	/**
600
+	 *    _add_additional_content_filters
601
+	 *
602
+	 * @access    private
603
+	 * @return        void
604
+	 */
605
+	private static function _add_additional_excerpt_filters()
606
+	{
607
+		add_filter(
608
+			'the_excerpt',
609
+			array('EED_Events_Archive', 'event_datetimes'),
610
+			EED_Events_Archive::EVENT_DATETIMES_PRIORITY
611
+		);
612
+		add_filter(
613
+			'the_excerpt',
614
+			array('EED_Events_Archive', 'event_tickets'),
615
+			EED_Events_Archive::EVENT_TICKETS_PRIORITY
616
+		);
617
+		add_filter(
618
+			'the_excerpt',
619
+			array('EED_Events_Archive', 'event_venues'),
620
+			EED_Events_Archive::EVENT_VENUES_PRIORITY
621
+		);
622
+	}
623
+
624
+
625
+	/**
626
+	 *    _add_additional_content_filters
627
+	 *
628
+	 * @access    private
629
+	 * @return        void
630
+	 */
631
+	private static function _add_additional_content_filters()
632
+	{
633
+		add_filter(
634
+			'the_content',
635
+			array('EED_Events_Archive', 'event_datetimes'),
636
+			EED_Events_Archive::EVENT_DATETIMES_PRIORITY
637
+		);
638
+		add_filter(
639
+			'the_content',
640
+			array('EED_Events_Archive', 'event_tickets'),
641
+			EED_Events_Archive::EVENT_TICKETS_PRIORITY
642
+		);
643
+		add_filter(
644
+			'the_content',
645
+			array('EED_Events_Archive', 'event_venues'),
646
+			EED_Events_Archive::EVENT_VENUES_PRIORITY
647
+		);
648
+	}
649
+
650
+
651
+	/**
652
+	 *    _remove_additional_events_archive_filters
653
+	 *
654
+	 * @access    private
655
+	 * @return        void
656
+	 */
657
+	private static function _remove_additional_events_archive_filters()
658
+	{
659
+		remove_filter(
660
+			'the_excerpt',
661
+			array('EED_Events_Archive', 'event_datetimes'),
662
+			EED_Events_Archive::EVENT_DATETIMES_PRIORITY
663
+		);
664
+		remove_filter(
665
+			'the_excerpt',
666
+			array('EED_Events_Archive', 'event_tickets'),
667
+			EED_Events_Archive::EVENT_TICKETS_PRIORITY
668
+		);
669
+		remove_filter(
670
+			'the_excerpt',
671
+			array('EED_Events_Archive', 'event_venues'),
672
+			EED_Events_Archive::EVENT_VENUES_PRIORITY
673
+		);
674
+		remove_filter(
675
+			'the_content',
676
+			array('EED_Events_Archive', 'event_datetimes'),
677
+			EED_Events_Archive::EVENT_DATETIMES_PRIORITY
678
+		);
679
+		remove_filter(
680
+			'the_content',
681
+			array('EED_Events_Archive', 'event_tickets'),
682
+			EED_Events_Archive::EVENT_TICKETS_PRIORITY
683
+		);
684
+		remove_filter(
685
+			'the_content',
686
+			array('EED_Events_Archive', 'event_venues'),
687
+			EED_Events_Archive::EVENT_VENUES_PRIORITY
688
+		);
689
+	}
690
+
691
+
692
+	/**
693
+	 *    remove_all_events_archive_filters
694
+	 *
695
+	 * @access    public
696
+	 * @return        void
697
+	 */
698
+	public static function remove_all_events_archive_filters()
699
+	{
700
+		// remove_filter( 'get_the_excerpt', array( 'EED_Events_Archive', 'get_the_excerpt' ), 1 );
701
+		remove_filter('the_title', array('EED_Events_Archive', 'the_title'), 1);
702
+		remove_filter(
703
+			'the_excerpt',
704
+			array('EED_Events_Archive', 'event_details'),
705
+			EED_Events_Archive::EVENT_DETAILS_PRIORITY
706
+		);
707
+		remove_filter(
708
+			'the_excerpt',
709
+			array('EED_Events_Archive', 'event_datetimes'),
710
+			EED_Events_Archive::EVENT_DATETIMES_PRIORITY
711
+		);
712
+		remove_filter(
713
+			'the_excerpt',
714
+			array('EED_Events_Archive', 'event_tickets'),
715
+			EED_Events_Archive::EVENT_TICKETS_PRIORITY
716
+		);
717
+		remove_filter(
718
+			'the_excerpt',
719
+			array('EED_Events_Archive', 'event_venues'),
720
+			EED_Events_Archive::EVENT_VENUES_PRIORITY
721
+		);
722
+		remove_filter(
723
+			'the_content',
724
+			array('EED_Events_Archive', 'event_details'),
725
+			EED_Events_Archive::EVENT_DETAILS_PRIORITY
726
+		);
727
+		remove_filter(
728
+			'the_content',
729
+			array('EED_Events_Archive', 'event_datetimes'),
730
+			EED_Events_Archive::EVENT_DATETIMES_PRIORITY
731
+		);
732
+		remove_filter(
733
+			'the_content',
734
+			array('EED_Events_Archive', 'event_tickets'),
735
+			EED_Events_Archive::EVENT_TICKETS_PRIORITY
736
+		);
737
+		remove_filter(
738
+			'the_content',
739
+			array('EED_Events_Archive', 'event_venues'),
740
+			EED_Events_Archive::EVENT_VENUES_PRIORITY
741
+		);
742
+		// don't display entry meta because the existing theme will take care of that
743
+		remove_filter(
744
+			'FHEE__content_espresso_events_details_template__display_entry_meta',
745
+			'__return_false'
746
+		);
747
+	}
748
+
749
+
750
+	/**
751
+	 *    load_event_list_assets
752
+	 *
753
+	 * @access    public
754
+	 * @return    void
755
+	 */
756
+	public function load_event_list_assets()
757
+	{
758
+		do_action('AHEE__EED_Events_Archive__before_load_assets');
759
+		add_filter('FHEE_load_EE_Session', '__return_true');
760
+		add_filter('FHEE__EED_Ticket_Selector__load_tckt_slctr_assets', '__return_true');
761
+		add_action('wp_enqueue_scripts', array($this, 'wp_enqueue_scripts'), 10);
762
+		if (EE_Registry::instance()->CFG->map_settings->use_google_maps) {
763
+			add_action('wp_enqueue_scripts', array('EEH_Maps', 'espresso_google_map_js'), 11);
764
+		}
765
+	}
766
+
767
+
768
+	/**
769
+	 *    wp_enqueue_scripts
770
+	 *
771
+	 * @access    public
772
+	 * @return    void
773
+	 * @throws EE_Error
774
+	 */
775
+	public function wp_enqueue_scripts()
776
+	{
777
+		// get some style
778
+		if (apply_filters('FHEE_enable_default_espresso_css', false)) {
779
+			// first check uploads folder
780
+			if (EEH_File::is_readable(get_stylesheet_directory() . $this->theme . '/style.css')) {
781
+				wp_register_style(
782
+					$this->theme,
783
+					get_stylesheet_directory_uri() . $this->theme . '/style.css',
784
+					array('dashicons', 'espresso_default')
785
+				);
786
+			} else {
787
+			}
788
+			wp_enqueue_style($this->theme);
789
+		}
790
+	}
791
+
792
+
793
+	/**
794
+	 *    template_settings_form
795
+	 *
796
+	 * @access    public
797
+	 * @static
798
+	 * @return    string
799
+	 */
800
+	public static function template_settings_form()
801
+	{
802
+		$template_settings = EE_Registry::instance()->CFG->template_settings;
803
+		$template_settings->EED_Events_Archive = isset($template_settings->EED_Events_Archive)
804
+			? $template_settings->EED_Events_Archive : new EE_Events_Archive_Config();
805
+		$template_settings->EED_Events_Archive = apply_filters(
806
+			'FHEE__EED_Events_Archive__template_settings_form__event_list_config',
807
+			$template_settings->EED_Events_Archive
808
+		);
809
+		$events_archive_settings = array(
810
+			'display_status_banner' => 0,
811
+			'display_description' => 1,
812
+			'display_ticket_selector' => 0,
813
+			'display_datetimes' => 1,
814
+			'display_venue' => 0,
815
+			'display_expired_events' => 0,
816
+		);
817
+		$events_archive_settings = array_merge(
818
+			$events_archive_settings,
819
+			(array) $template_settings->EED_Events_Archive
820
+		);
821
+		EEH_Template::display_template(
822
+			EVENTS_ARCHIVE_TEMPLATES_PATH . 'admin-event-list-settings.template.php',
823
+			$events_archive_settings
824
+		);
825
+	}
826
+
827
+
828
+	/**
829
+	 *    update_template_settings
830
+	 *
831
+	 * @access    public
832
+	 * @param    EE_Template_Config $CFG
833
+	 * @param    EE_Request_Handler $REQ
834
+	 * @return    EE_Template_Config
835
+	 */
836
+	public static function update_template_settings($CFG, $REQ)
837
+	{
838
+		$CFG->EED_Events_Archive = new EE_Events_Archive_Config();
839
+		// unless we are resetting the config...
840
+		if (
841
+			! isset($REQ['EED_Events_Archive_reset_event_list_settings'])
842
+			|| absint($REQ['EED_Events_Archive_reset_event_list_settings']) !== 1
843
+		) {
844
+			$CFG->EED_Events_Archive->display_status_banner = isset($REQ['EED_Events_Archive_display_status_banner'])
845
+				? absint($REQ['EED_Events_Archive_display_status_banner']) : 0;
846
+			$CFG->EED_Events_Archive->display_description = isset($REQ['EED_Events_Archive_display_description'])
847
+				? absint($REQ['EED_Events_Archive_display_description']) : 1;
848
+			$CFG->EED_Events_Archive->display_ticket_selector = isset($REQ['EED_Events_Archive_display_ticket_selector'])
849
+				? absint($REQ['EED_Events_Archive_display_ticket_selector']) : 0;
850
+			$CFG->EED_Events_Archive->display_datetimes = isset($REQ['EED_Events_Archive_display_datetimes']) ? absint(
851
+				$REQ['EED_Events_Archive_display_datetimes']
852
+			) : 1;
853
+			$CFG->EED_Events_Archive->display_venue = isset($REQ['EED_Events_Archive_display_venue']) ? absint(
854
+				$REQ['EED_Events_Archive_display_venue']
855
+			) : 0;
856
+			$CFG->EED_Events_Archive->display_expired_events = isset($REQ['EED_Events_Archive_display_expired_events'])
857
+				? absint($REQ['EED_Events_Archive_display_expired_events']) : 0;
858
+		}
859
+		return $CFG;
860
+	}
861
+
862
+
863
+	/**
864
+	 *    event_list_css
865
+	 *
866
+	 * @access    public
867
+	 * @param string $extra_class
868
+	 * @return    string
869
+	 */
870
+	public static function event_list_css($extra_class = '')
871
+	{
872
+		$event_list_css = ! empty($extra_class) ? array($extra_class) : array();
873
+		$event_list_css[] = 'espresso-event-list-event';
874
+		return implode(' ', $event_list_css);
875
+	}
876
+
877
+
878
+	/**
879
+	 *    event_categories
880
+	 *
881
+	 * @access    public
882
+	 * @return    array
883
+	 */
884
+	public static function event_categories()
885
+	{
886
+		return EE_Registry::instance()->load_model('Term')->get_all_ee_categories();
887
+	}
888
+
889
+
890
+	/**
891
+	 *    display_description
892
+	 *
893
+	 * @access    public
894
+	 * @param $value
895
+	 * @return    bool
896
+	 */
897
+	public static function display_description($value)
898
+	{
899
+		$config = EE_Registry::instance()->CFG->template_settings->EED_Events_Archive;
900
+		$display_description = isset($config->display_description) ? $config->display_description : 1;
901
+		return $display_description === $value ? true : false;
902
+	}
903
+
904
+
905
+	/**
906
+	 *    display_ticket_selector
907
+	 *
908
+	 * @access    public
909
+	 * @return    bool
910
+	 */
911
+	public static function display_ticket_selector()
912
+	{
913
+		$config = EE_Registry::instance()->CFG->template_settings->EED_Events_Archive;
914
+		return isset($config->display_ticket_selector) && $config->display_ticket_selector ? true : false;
915
+	}
916
+
917
+
918
+	/**
919
+	 *    display_venue
920
+	 *
921
+	 * @access    public
922
+	 * @return    bool
923
+	 */
924
+	public static function display_venue()
925
+	{
926
+		$config = EE_Registry::instance()->CFG->template_settings->EED_Events_Archive;
927
+		return isset($config->display_venue) && $config->display_venue && EEH_Venue_View::venue_name() ? true : false;
928
+	}
929
+
930
+
931
+	/**
932
+	 *    display_datetimes
933
+	 *
934
+	 * @access    public
935
+	 * @return    bool
936
+	 */
937
+	public static function display_datetimes()
938
+	{
939
+		$config = EE_Registry::instance()->CFG->template_settings->EED_Events_Archive;
940
+		return isset($config->display_datetimes) && $config->display_datetimes ? true : false;
941
+	}
942
+
943
+
944
+	/**
945
+	 *    event_list_title
946
+	 *
947
+	 * @access    public
948
+	 * @return    string
949
+	 */
950
+	public static function event_list_title()
951
+	{
952
+		return apply_filters(
953
+			'FHEE__archive_espresso_events_template__upcoming_events_h1',
954
+			__('Upcoming Events', 'event_espresso')
955
+		);
956
+	}
957
+
958
+
959
+	// GRAVEYARD
960
+
961
+
962
+	/**
963
+	 * @since 4.4.0
964
+	 */
965
+	public static function _doing_it_wrong_notice($function = '')
966
+	{
967
+		EE_Error::doing_it_wrong(
968
+			__FUNCTION__,
969
+			sprintf(
970
+				__(
971
+					'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',
972
+					'event_espresso'
973
+				),
974
+				$function,
975
+				'<br />',
976
+				'4.6.0'
977
+			),
978
+			'4.4.0'
979
+		);
980
+	}
981
+
982
+
983
+	/**
984
+	 * @deprecated
985
+	 * @since 4.4.0
986
+	 */
987
+	public function get_post_data()
988
+	{
989
+		EEH_Event_Query::set_query_params();
990
+	}
991
+
992
+
993
+	/**
994
+	 * @throws EE_Error
995
+	 * @since 4.4.0
996
+	 * @deprecated
997
+	 */
998
+	public function posts_fields($SQL, WP_Query $wp_query)
999
+	{
1000
+		EED_Events_Archive::_doing_it_wrong_notice(__FUNCTION__);
1001
+		return EEH_Event_Query::posts_fields($SQL, $wp_query);
1002
+	}
1003
+
1004
+
1005
+	/**
1006
+	 * @throws EE_Error
1007
+	 * @since 4.4.0
1008
+	 * @deprecated
1009
+	 */
1010
+	public static function posts_fields_sql_for_orderby($orderby_params = array())
1011
+	{
1012
+		EED_Events_Archive::_doing_it_wrong_notice(__FUNCTION__);
1013
+		return EEH_Event_Query::posts_fields_sql_for_orderby($orderby_params);
1014
+	}
1015
+
1016
+
1017
+	/**
1018
+	 * @throws EE_Error
1019
+	 * @since 4.4.0
1020
+	 * @deprecated
1021
+	 */
1022
+	public function posts_join($SQL, WP_Query $wp_query)
1023
+	{
1024
+		EED_Events_Archive::_doing_it_wrong_notice(__FUNCTION__);
1025
+		return EEH_Event_Query::posts_join($SQL, $wp_query);
1026
+	}
1027
+
1028
+
1029
+	/**
1030
+	 * @deprecated
1031
+	 * @since 4.4.0
1032
+	 */
1033
+	public static function posts_join_sql_for_terms($join_terms = null)
1034
+	{
1035
+		EED_Events_Archive::_doing_it_wrong_notice(__FUNCTION__);
1036
+		return EEH_Event_Query::posts_join_sql_for_terms($join_terms);
1037
+	}
1038
+
1039
+
1040
+	/**
1041
+	 * @throws EE_Error
1042
+	 * @since 4.4.0
1043
+	 * @deprecated
1044
+	 */
1045
+	public static function posts_join_for_orderby($orderby_params = array())
1046
+	{
1047
+		EED_Events_Archive::_doing_it_wrong_notice(__FUNCTION__);
1048
+		return EEH_Event_Query::posts_join_for_orderby($orderby_params);
1049
+	}
1050
+
1051
+
1052
+	/**
1053
+	 * @throws EE_Error
1054
+	 * @since 4.4.0
1055
+	 * @deprecated
1056
+	 */
1057
+	public function posts_where($SQL, WP_Query $wp_query)
1058
+	{
1059
+		EED_Events_Archive::_doing_it_wrong_notice(__FUNCTION__);
1060
+		return EEH_Event_Query::posts_where($SQL, $wp_query);
1061
+	}
1062
+
1063
+
1064
+	/**
1065
+	 * @throws EE_Error
1066
+	 * @since 4.4.0
1067
+	 * @deprecated
1068
+	 */
1069
+	public static function posts_where_sql_for_show_expired($show_expired = false)
1070
+	{
1071
+		EED_Events_Archive::_doing_it_wrong_notice(__FUNCTION__);
1072
+		return EEH_Event_Query::posts_where_sql_for_show_expired($show_expired);
1073
+	}
1074
+
1075
+
1076
+	/**
1077
+	 * @deprecated
1078
+	 * @since 4.4.0
1079
+	 */
1080
+	public static function posts_where_sql_for_event_category_slug($event_category_slug = null)
1081
+	{
1082
+		EED_Events_Archive::_doing_it_wrong_notice(__FUNCTION__);
1083
+		return EEH_Event_Query::posts_where_sql_for_event_category_slug($event_category_slug);
1084
+	}
1085
+
1086
+
1087
+	/**
1088
+	 * @throws EE_Error
1089
+	 * @since 4.4.0
1090
+	 * @deprecated
1091
+	 */
1092
+	public static function posts_where_sql_for_event_list_month($month = null)
1093
+	{
1094
+		EED_Events_Archive::_doing_it_wrong_notice(__FUNCTION__);
1095
+		return EEH_Event_Query::posts_where_sql_for_event_list_month($month);
1096
+	}
1097
+
1098
+
1099
+	/**
1100
+	 * @throws EE_Error
1101
+	 * @since 4.4.0
1102
+	 * @deprecated
1103
+	 */
1104
+	public function posts_orderby($SQL, WP_Query $wp_query)
1105
+	{
1106
+		EED_Events_Archive::_doing_it_wrong_notice(__FUNCTION__);
1107
+		return EEH_Event_Query::posts_orderby($SQL, $wp_query);
1108
+	}
1109
+
1110
+
1111
+	/**
1112
+	 * @throws EE_Error
1113
+	 * @since 4.4.0
1114
+	 * @deprecated
1115
+	 */
1116
+	public static function posts_orderby_sql($orderby_params = array(), $sort = 'ASC')
1117
+	{
1118
+		EED_Events_Archive::_doing_it_wrong_notice(__FUNCTION__);
1119
+		return EEH_Event_Query::posts_orderby_sql($orderby_params, $sort);
1120
+	}
1121 1121
 }
1122 1122
 
1123 1123
 
@@ -1126,9 +1126,9 @@  discard block
 block discarded – undo
1126 1126
  */
1127 1127
 function espresso_get_event_list_ID()
1128 1128
 {
1129
-    EED_Events_Archive::$espresso_event_list_ID++;
1130
-    EED_Events_Archive::$espresso_grid_event_lists[] = EED_Events_Archive::$espresso_event_list_ID;
1131
-    return EED_Events_Archive::$espresso_event_list_ID;
1129
+	EED_Events_Archive::$espresso_event_list_ID++;
1130
+	EED_Events_Archive::$espresso_grid_event_lists[] = EED_Events_Archive::$espresso_event_list_ID;
1131
+	return EED_Events_Archive::$espresso_event_list_ID;
1132 1132
 }
1133 1133
 
1134 1134
 /**
@@ -1136,7 +1136,7 @@  discard block
 block discarded – undo
1136 1136
  */
1137 1137
 function espresso_event_list_title()
1138 1138
 {
1139
-    return EED_Events_Archive::event_list_title();
1139
+	return EED_Events_Archive::event_list_title();
1140 1140
 }
1141 1141
 
1142 1142
 /**
@@ -1145,7 +1145,7 @@  discard block
 block discarded – undo
1145 1145
  */
1146 1146
 function espresso_event_list_css($extra_class = '')
1147 1147
 {
1148
-    return EED_Events_Archive::event_list_css($extra_class);
1148
+	return EED_Events_Archive::event_list_css($extra_class);
1149 1149
 }
1150 1150
 
1151 1151
 /**
@@ -1153,7 +1153,7 @@  discard block
 block discarded – undo
1153 1153
  */
1154 1154
 function espresso_get_event_categories()
1155 1155
 {
1156
-    return EED_Events_Archive::event_categories();
1156
+	return EED_Events_Archive::event_categories();
1157 1157
 }
1158 1158
 
1159 1159
 /**
@@ -1161,7 +1161,7 @@  discard block
 block discarded – undo
1161 1161
  */
1162 1162
 function espresso_display_full_description_in_event_list()
1163 1163
 {
1164
-    return EED_Events_Archive::display_description(2);
1164
+	return EED_Events_Archive::display_description(2);
1165 1165
 }
1166 1166
 
1167 1167
 /**
@@ -1169,7 +1169,7 @@  discard block
 block discarded – undo
1169 1169
  */
1170 1170
 function espresso_display_excerpt_in_event_list()
1171 1171
 {
1172
-    return EED_Events_Archive::display_description(1);
1172
+	return EED_Events_Archive::display_description(1);
1173 1173
 }
1174 1174
 
1175 1175
 /**
@@ -1177,7 +1177,7 @@  discard block
 block discarded – undo
1177 1177
  */
1178 1178
 function espresso_display_ticket_selector_in_event_list()
1179 1179
 {
1180
-    return EED_Events_Archive::display_ticket_selector();
1180
+	return EED_Events_Archive::display_ticket_selector();
1181 1181
 }
1182 1182
 
1183 1183
 /**
@@ -1185,7 +1185,7 @@  discard block
 block discarded – undo
1185 1185
  */
1186 1186
 function espresso_display_venue_in_event_list()
1187 1187
 {
1188
-    return EED_Events_Archive::display_venue();
1188
+	return EED_Events_Archive::display_venue();
1189 1189
 }
1190 1190
 
1191 1191
 /**
@@ -1193,5 +1193,5 @@  discard block
 block discarded – undo
1193 1193
  */
1194 1194
 function espresso_display_datetimes_in_event_list()
1195 1195
 {
1196
-    return EED_Events_Archive::display_datetimes();
1196
+	return EED_Events_Archive::display_datetimes();
1197 1197
 }
Please login to merge, or discard this patch.
Spacing   +15 added lines, -15 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;
@@ -228,10 +228,10 @@  discard block
 block discarded – undo
228 228
         EEH_Event_Query::add_query_filters();
229 229
         // set params that will get used by the filters
230 230
         EEH_Event_Query::set_query_params(
231
-            '',    // month
232
-            '',    // category
233
-            $config->display_expired_events,    // show_expired
234
-            'start_date',    // orderby
231
+            '', // month
232
+            '', // category
233
+            $config->display_expired_events, // show_expired
234
+            'start_date', // orderby
235 235
             'ASC'    // sort
236 236
         );
237 237
         // check what template is loaded
@@ -297,7 +297,7 @@  discard block
 block discarded – undo
297 297
     public function template_include($template = '')
298 298
     {
299 299
         // don't add content filter for dedicated EE child themes or private posts
300
-        if (! EEH_Template::is_espresso_theme()) {
300
+        if ( ! EEH_Template::is_espresso_theme()) {
301 301
             /** @type EE_Events_Archive_Config $config */
302 302
             $config = $this->config();
303 303
             // add status banner ?
@@ -396,7 +396,7 @@  discard block
 block discarded – undo
396 396
     {
397 397
         global $post;
398 398
         if ($post instanceof WP_Post) {
399
-            return in_the_loop() && $post->ID == $id ? espresso_event_status_banner($post->ID) . $title : $title;
399
+            return in_the_loop() && $post->ID == $id ? espresso_event_status_banner($post->ID).$title : $title;
400 400
         }
401 401
         return $title;
402 402
     }
@@ -547,7 +547,7 @@  discard block
 block discarded – undo
547 547
         if (post_password_required()) {
548 548
             return $content;
549 549
         }
550
-        return EEH_Template::locate_template('content-espresso_events-datetimes.php') . $content;
550
+        return EEH_Template::locate_template('content-espresso_events-datetimes.php').$content;
551 551
     }
552 552
 
553 553
 
@@ -563,7 +563,7 @@  discard block
 block discarded – undo
563 563
         if (post_password_required()) {
564 564
             return $content;
565 565
         }
566
-        return EEH_Template::locate_template('content-espresso_events-tickets.php') . $content;
566
+        return EEH_Template::locate_template('content-espresso_events-tickets.php').$content;
567 567
     }
568 568
 
569 569
 
@@ -592,7 +592,7 @@  discard block
 block discarded – undo
592 592
         if (post_password_required()) {
593 593
             return $content;
594 594
         }
595
-        return $content . EEH_Template::locate_template('content-espresso_events-venues.php');
595
+        return $content.EEH_Template::locate_template('content-espresso_events-venues.php');
596 596
     }
597 597
 
598 598
 
@@ -777,10 +777,10 @@  discard block
 block discarded – undo
777 777
         // get some style
778 778
         if (apply_filters('FHEE_enable_default_espresso_css', false)) {
779 779
             // first check uploads folder
780
-            if (EEH_File::is_readable(get_stylesheet_directory() . $this->theme . '/style.css')) {
780
+            if (EEH_File::is_readable(get_stylesheet_directory().$this->theme.'/style.css')) {
781 781
                 wp_register_style(
782 782
                     $this->theme,
783
-                    get_stylesheet_directory_uri() . $this->theme . '/style.css',
783
+                    get_stylesheet_directory_uri().$this->theme.'/style.css',
784 784
                     array('dashicons', 'espresso_default')
785 785
                 );
786 786
             } else {
@@ -819,7 +819,7 @@  discard block
 block discarded – undo
819 819
             (array) $template_settings->EED_Events_Archive
820 820
         );
821 821
         EEH_Template::display_template(
822
-            EVENTS_ARCHIVE_TEMPLATES_PATH . 'admin-event-list-settings.template.php',
822
+            EVENTS_ARCHIVE_TEMPLATES_PATH.'admin-event-list-settings.template.php',
823 823
             $events_archive_settings
824 824
         );
825 825
     }
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.
Indentation   +669 added lines, -669 removed lines patch added patch discarded remove patch
@@ -13,677 +13,677 @@
 block discarded – undo
13 13
 
14 14
 // Quickfix to address https://events.codebasehq.com/projects/event-espresso/tickets/11089 ASAP
15 15
 if (! function_exists('mb_strcut')) {
16
-    /**
17
-     * Very simple mimic of mb_substr (which WP ensures exists in wp-includes/compat.php). Still has all the problems of mb_substr
18
-     * (namely, that we might send too many characters to PayPal; however in this case they just issue a warning but nothing breaks)
19
-     * @param $string
20
-     * @param $start
21
-     * @param $length
22
-     * @return bool|string
23
-     */
24
-    function mb_strcut($string, $start, $length = null)
25
-    {
26
-        return mb_substr($string, $start, $length);
27
-    }
16
+	/**
17
+	 * Very simple mimic of mb_substr (which WP ensures exists in wp-includes/compat.php). Still has all the problems of mb_substr
18
+	 * (namely, that we might send too many characters to PayPal; however in this case they just issue a warning but nothing breaks)
19
+	 * @param $string
20
+	 * @param $start
21
+	 * @param $length
22
+	 * @return bool|string
23
+	 */
24
+	function mb_strcut($string, $start, $length = null)
25
+	{
26
+		return mb_substr($string, $start, $length);
27
+	}
28 28
 }
29 29
 class EEG_Paypal_Express extends EE_Offsite_Gateway
30 30
 {
31 31
 
32
-    /**
33
-     * Merchant API Username.
34
-     *
35
-     * @var string
36
-     */
37
-    protected $_api_username;
38
-
39
-    /**
40
-     * Merchant API Password.
41
-     *
42
-     * @var string
43
-     */
44
-    protected $_api_password;
45
-
46
-    /**
47
-     * API Signature.
48
-     *
49
-     * @var string
50
-     */
51
-    protected $_api_signature;
52
-
53
-    /**
54
-     * Request Shipping address on PP checkout page.
55
-     *
56
-     * @var string
57
-     */
58
-    protected $_request_shipping_addr;
59
-
60
-    /**
61
-     * Business/personal logo.
62
-     *
63
-     * @var string
64
-     */
65
-    protected $_image_url;
66
-
67
-    /**
68
-     * gateway URL variable
69
-     *
70
-     * @var string
71
-     */
72
-    protected $_base_gateway_url = '';
73
-
74
-
75
-
76
-    /**
77
-     * EEG_Paypal_Express constructor.
78
-     */
79
-    public function __construct()
80
-    {
81
-        $this->_currencies_supported = array(
82
-            'USD',
83
-            'AUD',
84
-            'BRL',
85
-            'CAD',
86
-            'CZK',
87
-            'DKK',
88
-            'EUR',
89
-            'HKD',
90
-            'HUF',
91
-            'ILS',
92
-            'JPY',
93
-            'MYR',
94
-            'MXN',
95
-            'NOK',
96
-            'NZD',
97
-            'PHP',
98
-            'PLN',
99
-            'GBP',
100
-            'RUB',
101
-            'SGD',
102
-            'SEK',
103
-            'CHF',
104
-            'TWD',
105
-            'THB',
106
-            'TRY',
107
-            'INR',
108
-        );
109
-        parent::__construct();
110
-    }
111
-
112
-
113
-
114
-    /**
115
-     * Sets the gateway URL variable based on whether debug mode is enabled or not.
116
-     *
117
-     * @param array $settings_array
118
-     */
119
-    public function set_settings($settings_array)
120
-    {
121
-        parent::set_settings($settings_array);
122
-        // Redirect URL.
123
-        $this->_base_gateway_url = $this->_debug_mode
124
-            ? 'https://api-3t.sandbox.paypal.com/nvp'
125
-            : 'https://api-3t.paypal.com/nvp';
126
-    }
127
-
128
-
129
-
130
-    /**
131
-     * @param EEI_Payment $payment
132
-     * @param array       $billing_info
133
-     * @param string      $return_url
134
-     * @param string      $notify_url
135
-     * @param string      $cancel_url
136
-     * @return \EE_Payment|\EEI_Payment
137
-     * @throws \EE_Error
138
-     */
139
-    public function set_redirection_info(
140
-        $payment,
141
-        $billing_info = array(),
142
-        $return_url = null,
143
-        $notify_url = null,
144
-        $cancel_url = null
145
-    ) {
146
-        if (! $payment instanceof EEI_Payment) {
147
-            $payment->set_gateway_response(
148
-                esc_html__(
149
-                    'Error. No associated payment was found.',
150
-                    'event_espresso'
151
-                )
152
-            );
153
-            $payment->set_status($this->_pay_model->failed_status());
154
-            return $payment;
155
-        }
156
-        $transaction = $payment->transaction();
157
-        if (! $transaction instanceof EEI_Transaction) {
158
-            $payment->set_gateway_response(
159
-                esc_html__(
160
-                    'Could not process this payment because it has no associated transaction.',
161
-                    'event_espresso'
162
-                )
163
-            );
164
-            $payment->set_status($this->_pay_model->failed_status());
165
-            return $payment;
166
-        }
167
-        $gateway_formatter = $this->_get_gateway_formatter();
168
-        $order_description = mb_strcut($gateway_formatter->formatOrderDescription($payment), 0, 127);
169
-        $primary_registration = $transaction->primary_registration();
170
-        $primary_attendee = $primary_registration instanceof EE_Registration
171
-            ? $primary_registration->attendee()
172
-            : false;
173
-        $locale = explode('-', get_bloginfo('language'));
174
-        // Gather request parameters.
175
-        $token_request_dtls = array(
176
-            'METHOD'                         => 'SetExpressCheckout',
177
-            'PAYMENTREQUEST_0_AMT'           => $payment->amount(),
178
-            'PAYMENTREQUEST_0_CURRENCYCODE'  => $payment->currency_code(),
179
-            'PAYMENTREQUEST_0_DESC'          => $order_description,
180
-            'RETURNURL'                      => $return_url,
181
-            'CANCELURL'                      => $cancel_url,
182
-            'PAYMENTREQUEST_0_PAYMENTACTION' => 'Sale',
183
-            // Buyer does not need to create a PayPal account to check out.
184
-            // This is referred to as PayPal Account Optional.
185
-            'SOLUTIONTYPE'                   => 'Sole',
186
-            // Locale of the pages displayed by PayPal during Express Checkout.
187
-            'LOCALECODE'                     => $locale[1]
188
-        );
189
-        // Show itemized list.
190
-        $itemized_list = $this->itemize_list($payment, $transaction);
191
-        $token_request_dtls = array_merge($token_request_dtls, $itemized_list);
192
-        // Automatically filling out shipping and contact information.
193
-        if ($this->_request_shipping_addr && $primary_attendee instanceof EEI_Attendee) {
194
-            // If you do not pass the shipping address, PayPal obtains it from the buyer's account profile.
195
-            $token_request_dtls['NOSHIPPING'] = '2';
196
-            $token_request_dtls['PAYMENTREQUEST_0_SHIPTOSTREET'] = $primary_attendee->address();
197
-            $token_request_dtls['PAYMENTREQUEST_0_SHIPTOSTREET2'] = $primary_attendee->address2();
198
-            $token_request_dtls['PAYMENTREQUEST_0_SHIPTOCITY'] = $primary_attendee->city();
199
-            $token_request_dtls['PAYMENTREQUEST_0_SHIPTOSTATE'] = $primary_attendee->state_abbrev();
200
-            $token_request_dtls['PAYMENTREQUEST_0_SHIPTOCOUNTRYCODE'] = $primary_attendee->country_ID();
201
-            $token_request_dtls['PAYMENTREQUEST_0_SHIPTOZIP'] = $primary_attendee->zip();
202
-            $token_request_dtls['PAYMENTREQUEST_0_EMAIL'] = $primary_attendee->email();
203
-            $token_request_dtls['PAYMENTREQUEST_0_SHIPTOPHONENUM'] = $primary_attendee->phone();
204
-        } elseif (! $this->_request_shipping_addr) {
205
-            // Do not request shipping details on the PP Checkout page.
206
-            $token_request_dtls['NOSHIPPING'] = '1';
207
-            $token_request_dtls['REQCONFIRMSHIPPING'] = '0';
208
-        }
209
-        // Used a business/personal logo on the PayPal page.
210
-        if (! empty($this->_image_url)) {
211
-            $token_request_dtls['LOGOIMG'] = $this->_image_url;
212
-        }
213
-        $token_request_dtls = apply_filters(
214
-            'FHEE__EEG_Paypal_Express__set_redirection_info__arguments',
215
-            $token_request_dtls,
216
-            $this
217
-        );
218
-        // Request PayPal token.
219
-        $token_request_response = $this->_ppExpress_request($token_request_dtls, 'Payment Token', $payment);
220
-        $token_rstatus = $this->_ppExpress_check_response($token_request_response);
221
-        $response_args = (isset($token_rstatus['args']) && is_array($token_rstatus['args']))
222
-            ? $token_rstatus['args']
223
-            : array();
224
-        if ($token_rstatus['status']) {
225
-            // We got the Token so we may continue with the payment and redirect the client.
226
-            $payment->set_details($response_args);
227
-            $gateway_url = $this->_debug_mode ? 'https://www.sandbox.paypal.com' : 'https://www.paypal.com';
228
-            $payment->set_redirect_url(
229
-                $gateway_url
230
-                . '/checkoutnow?useraction=commit&cmd=_express-checkout&token='
231
-                . $response_args['TOKEN']
232
-            );
233
-        } else {
234
-            if (isset($response_args['L_ERRORCODE'])) {
235
-                $payment->set_gateway_response($response_args['L_ERRORCODE'] . '; ' . $response_args['L_SHORTMESSAGE']);
236
-            } else {
237
-                $payment->set_gateway_response(
238
-                    esc_html__(
239
-                        'Error occurred while trying to setup the Express Checkout.',
240
-                        'event_espresso'
241
-                    )
242
-                );
243
-            }
244
-            $payment->set_details($response_args);
245
-            $payment->set_status($this->_pay_model->failed_status());
246
-        }
247
-        return $payment;
248
-    }
249
-
250
-
251
-
252
-    /**
253
-     * @param array           $update_info {
254
-     * @type string           $gateway_txn_id
255
-     * @type string status an EEMI_Payment status
256
-     *                                     }
257
-     * @param EEI_Transaction $transaction
258
-     * @return EEI_Payment
259
-     */
260
-    public function handle_payment_update($update_info, $transaction)
261
-    {
262
-        $payment = $transaction instanceof EEI_Transaction ? $transaction->last_payment() : null;
263
-        if ($payment instanceof EEI_Payment) {
264
-            $this->log(array('Return from Authorization' => $update_info), $payment);
265
-            $transaction = $payment->transaction();
266
-            if (! $transaction instanceof EEI_Transaction) {
267
-                $payment->set_gateway_response(
268
-                    esc_html__(
269
-                        'Could not process this payment because it has no associated transaction.',
270
-                        'event_espresso'
271
-                    )
272
-                );
273
-                $payment->set_status($this->_pay_model->failed_status());
274
-                return $payment;
275
-            }
276
-            $primary_registrant = $transaction->primary_registration();
277
-            $payment_details = $payment->details();
278
-            // Check if we still have the token.
279
-            if (! isset($payment_details['TOKEN']) || empty($payment_details['TOKEN'])) {
280
-                $payment->set_status($this->_pay_model->failed_status());
281
-                return $payment;
282
-            }
283
-            $cdetails_request_dtls = array(
284
-                'METHOD' => 'GetExpressCheckoutDetails',
285
-                'TOKEN'  => $payment_details['TOKEN'],
286
-            );
287
-            // Request Customer Details.
288
-            $cdetails_request_response = $this->_ppExpress_request(
289
-                $cdetails_request_dtls,
290
-                'Customer Details',
291
-                $payment
292
-            );
293
-            $cdetails_rstatus = $this->_ppExpress_check_response($cdetails_request_response);
294
-            $cdata_response_args = (isset($cdetails_rstatus['args']) && is_array($cdetails_rstatus['args']))
295
-                ? $cdetails_rstatus['args']
296
-                : array();
297
-            if ($cdetails_rstatus['status']) {
298
-                // We got the PayerID so now we can Complete the transaction.
299
-                $docheckout_request_dtls = array(
300
-                    'METHOD'                         => 'DoExpressCheckoutPayment',
301
-                    'PAYERID'                        => $cdata_response_args['PAYERID'],
302
-                    'TOKEN'                          => $payment_details['TOKEN'],
303
-                    'PAYMENTREQUEST_0_PAYMENTACTION' => 'Sale',
304
-                    'PAYMENTREQUEST_0_AMT'           => $payment->amount(),
305
-                    'PAYMENTREQUEST_0_CURRENCYCODE'  => $payment->currency_code(),
306
-                );
307
-                 // Include itemized list.
308
-                $itemized_list = $this->itemize_list(
309
-                    $payment,
310
-                    $transaction,
311
-                    $cdata_response_args
312
-                );
313
-                $docheckout_request_dtls = array_merge($docheckout_request_dtls, $itemized_list);
314
-                // Payment Checkout/Capture.
315
-                $docheckout_request_response = $this->_ppExpress_request(
316
-                    $docheckout_request_dtls,
317
-                    'Do Payment',
318
-                    $payment
319
-                );
320
-                $docheckout_rstatus = $this->_ppExpress_check_response($docheckout_request_response);
321
-                $docheckout_response_args = (isset($docheckout_rstatus['args']) && is_array($docheckout_rstatus['args']))
322
-                    ? $docheckout_rstatus['args']
323
-                    : array();
324
-                if ($docheckout_rstatus['status']) {
325
-                    // All is well, payment approved.
326
-                    $primary_registration_code = $primary_registrant instanceof EE_Registration ?
327
-                        $primary_registrant->reg_code()
328
-                        : '';
329
-                    $payment->set_extra_accntng($primary_registration_code);
330
-                    $payment->set_amount(isset($docheckout_response_args['PAYMENTINFO_0_AMT'])
331
-                        ? (float) $docheckout_response_args['PAYMENTINFO_0_AMT']
332
-                        : 0);
333
-                    $payment->set_txn_id_chq_nmbr(isset($docheckout_response_args['PAYMENTINFO_0_TRANSACTIONID'])
334
-                        ? $docheckout_response_args['PAYMENTINFO_0_TRANSACTIONID']
335
-                        : null);
336
-                    $payment->set_details($cdata_response_args);
337
-                    $payment->set_gateway_response(isset($docheckout_response_args['PAYMENTINFO_0_ACK'])
338
-                        ? $docheckout_response_args['PAYMENTINFO_0_ACK']
339
-                        : '');
340
-                    $payment->set_status($this->_pay_model->approved_status());
341
-                } else {
342
-                    if (isset($docheckout_response_args['L_ERRORCODE'])) {
343
-                        $payment->set_gateway_response(
344
-                            $docheckout_response_args['L_ERRORCODE']
345
-                            . '; '
346
-                            . $docheckout_response_args['L_SHORTMESSAGE']
347
-                        );
348
-                    } else {
349
-                        $payment->set_gateway_response(
350
-                            esc_html__(
351
-                                'Error occurred while trying to Capture the funds.',
352
-                                'event_espresso'
353
-                            )
354
-                        );
355
-                    }
356
-                    $payment->set_details($docheckout_response_args);
357
-                    $payment->set_status($this->_pay_model->declined_status());
358
-                }
359
-            } else {
360
-                if (isset($cdata_response_args['L_ERRORCODE'])) {
361
-                    $payment->set_gateway_response(
362
-                        $cdata_response_args['L_ERRORCODE']
363
-                        . '; '
364
-                        . $cdata_response_args['L_SHORTMESSAGE']
365
-                    );
366
-                } else {
367
-                    $payment->set_gateway_response(
368
-                        esc_html__(
369
-                            'Error occurred while trying to get payment Details from PayPal.',
370
-                            'event_espresso'
371
-                        )
372
-                    );
373
-                }
374
-                $payment->set_details($cdata_response_args);
375
-                $payment->set_status($this->_pay_model->failed_status());
376
-            }
377
-        } else {
378
-            $payment->set_gateway_response(
379
-                esc_html__(
380
-                    'Error occurred while trying to process the payment.',
381
-                    'event_espresso'
382
-                )
383
-            );
384
-            $payment->set_status($this->_pay_model->failed_status());
385
-        }
386
-        return $payment;
387
-    }
388
-
389
-
390
-
391
-    /**
392
-     *  Make a list of items that are in the giver transaction.
393
-     *
394
-     * @param EEI_Payment     $payment
395
-     * @param EEI_Transaction $transaction
396
-     * @param array           $request_response_args Data from a previous communication with PP.
397
-     * @return array
398
-     */
399
-    public function itemize_list(EEI_Payment $payment, EEI_Transaction $transaction, $request_response_args = array())
400
-    {
401
-        $itemized_list = array();
402
-        $gateway_formatter = $this->_get_gateway_formatter();
403
-        // If we have data from a previous communication with PP (on this transaction) we may use that for our list...
404
-        if (
405
-            ! empty($request_response_args)
406
-            && array_key_exists('L_PAYMENTREQUEST_0_AMT0', $request_response_args)
407
-            && array_key_exists('PAYMENTREQUEST_0_ITEMAMT', $request_response_args)
408
-        ) {
409
-            foreach ($request_response_args as $arg_key => $arg_val) {
410
-                if (
411
-                    strpos($arg_key, 'PAYMENTREQUEST_') !== false
412
-                    && strpos($arg_key, 'NOTIFYURL') === false
413
-                ) {
414
-                    $itemized_list[ $arg_key ] = $arg_val;
415
-                }
416
-            }
417
-            // If we got only a few Items then something is not right.
418
-            if (count($itemized_list) > 2) {
419
-                return $itemized_list;
420
-            } else {
421
-                if (WP_DEBUG) {
422
-                    throw new EE_Error(
423
-                        sprintf(
424
-                            esc_html__(
425
-                                // @codingStandardsIgnoreStart
426
-                                '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',
427
-                                // @codingStandardsIgnoreEnd
428
-                                'event_espresso'
429
-                            ),
430
-                            wp_json_encode($itemized_list)
431
-                        )
432
-                    );
433
-                }
434
-                // Reset the list and log an error, maybe allow to try and generate a new list (below).
435
-                $itemized_list = array();
436
-                $this->log(
437
-                    array(
438
-                        (string) esc_html__(
439
-                            'Could not generate a proper item list with:',
440
-                            'event_espresso'
441
-                        ) => $request_response_args
442
-                    ),
443
-                    $payment
444
-                );
445
-            }
446
-        }
447
-        // ...otherwise we generate a new list for this transaction.
448
-        if ($this->_money->compare_floats($payment->amount(), $transaction->total(), '==')) {
449
-            $item_num = 0;
450
-            $itemized_sum = 0;
451
-            $total_line_items = $transaction->total_line_item();
452
-            // Go through each item in the list.
453
-            foreach ($total_line_items->get_items() as $line_item) {
454
-                if ($line_item instanceof EE_Line_Item) {
455
-                    // PayPal doesn't like line items with 0.00 amount, so we may skip those.
456
-                    if (EEH_Money::compare_floats($line_item->total(), '0.00', '==')) {
457
-                        continue;
458
-                    }
459
-                    $unit_price = $line_item->unit_price();
460
-                    $line_item_quantity = $line_item->quantity();
461
-                    // This is a discount.
462
-                    if ($line_item->is_percent()) {
463
-                        $unit_price = $line_item->total();
464
-                        $line_item_quantity = 1;
465
-                    }
466
-                    // Item Name.
467
-                    $itemized_list[ 'L_PAYMENTREQUEST_0_NAME' . $item_num ] = mb_strcut(
468
-                        $gateway_formatter->formatLineItemName($line_item, $payment),
469
-                        0,
470
-                        127
471
-                    );
472
-                    // Item description.
473
-                    $itemized_list[ 'L_PAYMENTREQUEST_0_DESC' . $item_num ] = mb_strcut(
474
-                        $gateway_formatter->formatLineItemDesc($line_item, $payment),
475
-                        0,
476
-                        127
477
-                    );
478
-                    // Cost of individual item.
479
-                    $itemized_list[ 'L_PAYMENTREQUEST_0_AMT' . $item_num ] = $gateway_formatter->formatCurrency($unit_price);
480
-                    // Item Number.
481
-                    $itemized_list[ 'L_PAYMENTREQUEST_0_NUMBER' . $item_num ] = $item_num + 1;
482
-                    // Item quantity.
483
-                    $itemized_list[ 'L_PAYMENTREQUEST_0_QTY' . $item_num ] = $line_item_quantity;
484
-                    // Digital item is sold.
485
-                    $itemized_list[ 'L_PAYMENTREQUEST_0_ITEMCATEGORY' . $item_num ] = 'Physical';
486
-                    $itemized_sum += $line_item->total();
487
-                    ++$item_num;
488
-                }
489
-            }
490
-            // Item's sales S/H and tax amount.
491
-            $itemized_list['PAYMENTREQUEST_0_ITEMAMT'] = $total_line_items->get_items_total();
492
-            $itemized_list['PAYMENTREQUEST_0_TAXAMT'] = $total_line_items->get_total_tax();
493
-            $itemized_list['PAYMENTREQUEST_0_SHIPPINGAMT'] = '0';
494
-            $itemized_list['PAYMENTREQUEST_0_HANDLINGAMT'] = '0';
495
-            $itemized_sum_diff_from_txn_total = round(
496
-                $transaction->total() - $itemized_sum - $total_line_items->get_total_tax(),
497
-                2
498
-            );
499
-            // If we were not able to recognize some item like promotion, surcharge or cancellation,
500
-            // add the difference as an extra line item.
501
-            if ($this->_money->compare_floats($itemized_sum_diff_from_txn_total, 0, '!=')) {
502
-                // Item Name.
503
-                $itemized_list[ 'L_PAYMENTREQUEST_0_NAME' . $item_num ] = mb_strcut(
504
-                    esc_html__(
505
-                        'Other (promotion/surcharge/cancellation)',
506
-                        'event_espresso'
507
-                    ),
508
-                    0,
509
-                    127
510
-                );
511
-                // Item description.
512
-                $itemized_list[ 'L_PAYMENTREQUEST_0_DESC' . $item_num ] = '';
513
-                // Cost of individual item.
514
-                $itemized_list[ 'L_PAYMENTREQUEST_0_AMT' . $item_num ] = $gateway_formatter->formatCurrency(
515
-                    $itemized_sum_diff_from_txn_total
516
-                );
517
-                // Item Number.
518
-                $itemized_list[ 'L_PAYMENTREQUEST_0_NUMBER' . $item_num ] = $item_num + 1;
519
-                // Item quantity.
520
-                $itemized_list[ 'L_PAYMENTREQUEST_0_QTY' . $item_num ] = 1;
521
-                // Digital item is sold.
522
-                $itemized_list[ 'L_PAYMENTREQUEST_0_ITEMCATEGORY' . $item_num ] = 'Physical';
523
-                $item_num++;
524
-            }
525
-        } else {
526
-            // Just one Item.
527
-            // Item Name.
528
-            $itemized_list['L_PAYMENTREQUEST_0_NAME0'] = mb_strcut(
529
-                $gateway_formatter->formatPartialPaymentLineItemName($payment),
530
-                0,
531
-                127
532
-            );
533
-            // Item description.
534
-            $itemized_list['L_PAYMENTREQUEST_0_DESC0'] = mb_strcut(
535
-                $gateway_formatter->formatPartialPaymentLineItemDesc($payment),
536
-                0,
537
-                127
538
-            );
539
-            // Cost of individual item.
540
-            $itemized_list['L_PAYMENTREQUEST_0_AMT0'] = $gateway_formatter->formatCurrency($payment->amount());
541
-            // Item Number.
542
-            $itemized_list['L_PAYMENTREQUEST_0_NUMBER0'] = 1;
543
-            // Item quantity.
544
-            $itemized_list['L_PAYMENTREQUEST_0_QTY0'] = 1;
545
-            // Digital item is sold.
546
-            $itemized_list['L_PAYMENTREQUEST_0_ITEMCATEGORY0'] = 'Physical';
547
-            // Item's sales S/H and tax amount.
548
-            $itemized_list['PAYMENTREQUEST_0_ITEMAMT'] = $gateway_formatter->formatCurrency($payment->amount());
549
-            $itemized_list['PAYMENTREQUEST_0_TAXAMT'] = '0';
550
-            $itemized_list['PAYMENTREQUEST_0_SHIPPINGAMT'] = '0';
551
-            $itemized_list['PAYMENTREQUEST_0_HANDLINGAMT'] = '0';
552
-        }
553
-        return $itemized_list;
554
-    }
555
-
556
-
557
-
558
-    /**
559
-     *  Make the Express checkout request.
560
-     *
561
-     * @param array       $request_params
562
-     * @param string      $request_text
563
-     * @param EEI_Payment $payment
564
-     * @return mixed
565
-     */
566
-    public function _ppExpress_request($request_params, $request_text, $payment)
567
-    {
568
-        $request_dtls = array(
569
-            'VERSION' => '204.0',
570
-            'USER' => $this->_api_username,
571
-            'PWD' => $this->_api_password,
572
-            'SIGNATURE' => $this->_api_signature,
573
-            // EE will blow up if you change this
574
-            'BUTTONSOURCE' => 'EventEspresso_SP',
575
-        );
576
-        $dtls = array_merge($request_dtls, $request_params);
577
-        $this->_log_clean_request($dtls, $payment, $request_text . ' Request');
578
-        // Request Customer Details.
579
-        $request_response = wp_remote_post(
580
-            $this->_base_gateway_url,
581
-            array(
582
-                'method'      => 'POST',
583
-                'timeout'     => 45,
584
-                'httpversion' => '1.1',
585
-                'cookies'     => array(),
586
-                'headers'     => array(),
587
-                'body'        => http_build_query($dtls, '', '&'),
588
-            )
589
-        );
590
-        // Log the response.
591
-        $this->log(array($request_text . ' Response' => $request_response), $payment);
592
-        return $request_response;
593
-    }
594
-
595
-
596
-
597
-    /**
598
-     *  Check the response status.
599
-     *
600
-     * @param mixed $request_response
601
-     * @return array
602
-     */
603
-    public function _ppExpress_check_response($request_response)
604
-    {
605
-        if (is_wp_error($request_response) || empty($request_response['body'])) {
606
-            // If we got here then there was an error in this request.
607
-            return array('status' => false, 'args' => $request_response);
608
-        }
609
-        $response_args = array();
610
-        parse_str(urldecode($request_response['body']), $response_args);
611
-        if (! isset($response_args['ACK'])) {
612
-            return array('status' => false, 'args' => $request_response);
613
-        }
614
-        if (
615
-            (
616
-                isset($response_args['PAYERID'])
617
-                || isset($response_args['TOKEN'])
618
-                || isset($response_args['PAYMENTINFO_0_TRANSACTIONID'])
619
-                || (isset($response_args['PAYMENTSTATUS']) && $response_args['PAYMENTSTATUS'] === 'Completed')
620
-            )
621
-            && in_array($response_args['ACK'], array('Success', 'SuccessWithWarning'), true)
622
-        ) {
623
-            // Response status OK, return response parameters for further processing.
624
-            return array('status' => true, 'args' => $response_args);
625
-        }
626
-        $errors = $this->_get_errors($response_args);
627
-        return array('status' => false, 'args' => $errors);
628
-    }
629
-
630
-
631
-
632
-    /**
633
-     *  Log a "Cleared" request.
634
-     *
635
-     * @param array       $request
636
-     * @param EEI_Payment $payment
637
-     * @param string      $info
638
-     * @return void
639
-     */
640
-    private function _log_clean_request($request, $payment, $info)
641
-    {
642
-        $cleaned_request_data = $request;
643
-        unset($cleaned_request_data['PWD'], $cleaned_request_data['USER'], $cleaned_request_data['SIGNATURE']);
644
-        $this->log(array($info => $cleaned_request_data), $payment);
645
-    }
646
-
647
-
648
-
649
-    /**
650
-     *  Get error from the response data.
651
-     *
652
-     * @param array $data_array
653
-     * @return array
654
-     */
655
-    private function _get_errors($data_array)
656
-    {
657
-        $errors = array();
658
-        $n = 0;
659
-        while (isset($data_array[ "L_ERRORCODE{$n}" ])) {
660
-            $l_error_code = isset($data_array[ "L_ERRORCODE{$n}" ])
661
-                ? $data_array[ "L_ERRORCODE{$n}" ]
662
-                : '';
663
-            $l_severity_code = isset($data_array[ "L_SEVERITYCODE{$n}" ])
664
-                ? $data_array[ "L_SEVERITYCODE{$n}" ]
665
-                : '';
666
-            $l_short_message = isset($data_array[ "L_SHORTMESSAGE{$n}" ])
667
-                ? $data_array[ "L_SHORTMESSAGE{$n}" ]
668
-                : '';
669
-            $l_long_message = isset($data_array[ "L_LONGMESSAGE{$n}" ])
670
-                ? $data_array[ "L_LONGMESSAGE{$n}" ]
671
-                : '';
672
-            if ($n === 0) {
673
-                $errors = array(
674
-                    'L_ERRORCODE'    => $l_error_code,
675
-                    'L_SHORTMESSAGE' => $l_short_message,
676
-                    'L_LONGMESSAGE'  => $l_long_message,
677
-                    'L_SEVERITYCODE' => $l_severity_code,
678
-                );
679
-            } else {
680
-                $errors['L_ERRORCODE'] .= ', ' . $l_error_code;
681
-                $errors['L_SHORTMESSAGE'] .= ', ' . $l_short_message;
682
-                $errors['L_LONGMESSAGE'] .= ', ' . $l_long_message;
683
-                $errors['L_SEVERITYCODE'] .= ', ' . $l_severity_code;
684
-            }
685
-            $n++;
686
-        }
687
-        return $errors;
688
-    }
32
+	/**
33
+	 * Merchant API Username.
34
+	 *
35
+	 * @var string
36
+	 */
37
+	protected $_api_username;
38
+
39
+	/**
40
+	 * Merchant API Password.
41
+	 *
42
+	 * @var string
43
+	 */
44
+	protected $_api_password;
45
+
46
+	/**
47
+	 * API Signature.
48
+	 *
49
+	 * @var string
50
+	 */
51
+	protected $_api_signature;
52
+
53
+	/**
54
+	 * Request Shipping address on PP checkout page.
55
+	 *
56
+	 * @var string
57
+	 */
58
+	protected $_request_shipping_addr;
59
+
60
+	/**
61
+	 * Business/personal logo.
62
+	 *
63
+	 * @var string
64
+	 */
65
+	protected $_image_url;
66
+
67
+	/**
68
+	 * gateway URL variable
69
+	 *
70
+	 * @var string
71
+	 */
72
+	protected $_base_gateway_url = '';
73
+
74
+
75
+
76
+	/**
77
+	 * EEG_Paypal_Express constructor.
78
+	 */
79
+	public function __construct()
80
+	{
81
+		$this->_currencies_supported = array(
82
+			'USD',
83
+			'AUD',
84
+			'BRL',
85
+			'CAD',
86
+			'CZK',
87
+			'DKK',
88
+			'EUR',
89
+			'HKD',
90
+			'HUF',
91
+			'ILS',
92
+			'JPY',
93
+			'MYR',
94
+			'MXN',
95
+			'NOK',
96
+			'NZD',
97
+			'PHP',
98
+			'PLN',
99
+			'GBP',
100
+			'RUB',
101
+			'SGD',
102
+			'SEK',
103
+			'CHF',
104
+			'TWD',
105
+			'THB',
106
+			'TRY',
107
+			'INR',
108
+		);
109
+		parent::__construct();
110
+	}
111
+
112
+
113
+
114
+	/**
115
+	 * Sets the gateway URL variable based on whether debug mode is enabled or not.
116
+	 *
117
+	 * @param array $settings_array
118
+	 */
119
+	public function set_settings($settings_array)
120
+	{
121
+		parent::set_settings($settings_array);
122
+		// Redirect URL.
123
+		$this->_base_gateway_url = $this->_debug_mode
124
+			? 'https://api-3t.sandbox.paypal.com/nvp'
125
+			: 'https://api-3t.paypal.com/nvp';
126
+	}
127
+
128
+
129
+
130
+	/**
131
+	 * @param EEI_Payment $payment
132
+	 * @param array       $billing_info
133
+	 * @param string      $return_url
134
+	 * @param string      $notify_url
135
+	 * @param string      $cancel_url
136
+	 * @return \EE_Payment|\EEI_Payment
137
+	 * @throws \EE_Error
138
+	 */
139
+	public function set_redirection_info(
140
+		$payment,
141
+		$billing_info = array(),
142
+		$return_url = null,
143
+		$notify_url = null,
144
+		$cancel_url = null
145
+	) {
146
+		if (! $payment instanceof EEI_Payment) {
147
+			$payment->set_gateway_response(
148
+				esc_html__(
149
+					'Error. No associated payment was found.',
150
+					'event_espresso'
151
+				)
152
+			);
153
+			$payment->set_status($this->_pay_model->failed_status());
154
+			return $payment;
155
+		}
156
+		$transaction = $payment->transaction();
157
+		if (! $transaction instanceof EEI_Transaction) {
158
+			$payment->set_gateway_response(
159
+				esc_html__(
160
+					'Could not process this payment because it has no associated transaction.',
161
+					'event_espresso'
162
+				)
163
+			);
164
+			$payment->set_status($this->_pay_model->failed_status());
165
+			return $payment;
166
+		}
167
+		$gateway_formatter = $this->_get_gateway_formatter();
168
+		$order_description = mb_strcut($gateway_formatter->formatOrderDescription($payment), 0, 127);
169
+		$primary_registration = $transaction->primary_registration();
170
+		$primary_attendee = $primary_registration instanceof EE_Registration
171
+			? $primary_registration->attendee()
172
+			: false;
173
+		$locale = explode('-', get_bloginfo('language'));
174
+		// Gather request parameters.
175
+		$token_request_dtls = array(
176
+			'METHOD'                         => 'SetExpressCheckout',
177
+			'PAYMENTREQUEST_0_AMT'           => $payment->amount(),
178
+			'PAYMENTREQUEST_0_CURRENCYCODE'  => $payment->currency_code(),
179
+			'PAYMENTREQUEST_0_DESC'          => $order_description,
180
+			'RETURNURL'                      => $return_url,
181
+			'CANCELURL'                      => $cancel_url,
182
+			'PAYMENTREQUEST_0_PAYMENTACTION' => 'Sale',
183
+			// Buyer does not need to create a PayPal account to check out.
184
+			// This is referred to as PayPal Account Optional.
185
+			'SOLUTIONTYPE'                   => 'Sole',
186
+			// Locale of the pages displayed by PayPal during Express Checkout.
187
+			'LOCALECODE'                     => $locale[1]
188
+		);
189
+		// Show itemized list.
190
+		$itemized_list = $this->itemize_list($payment, $transaction);
191
+		$token_request_dtls = array_merge($token_request_dtls, $itemized_list);
192
+		// Automatically filling out shipping and contact information.
193
+		if ($this->_request_shipping_addr && $primary_attendee instanceof EEI_Attendee) {
194
+			// If you do not pass the shipping address, PayPal obtains it from the buyer's account profile.
195
+			$token_request_dtls['NOSHIPPING'] = '2';
196
+			$token_request_dtls['PAYMENTREQUEST_0_SHIPTOSTREET'] = $primary_attendee->address();
197
+			$token_request_dtls['PAYMENTREQUEST_0_SHIPTOSTREET2'] = $primary_attendee->address2();
198
+			$token_request_dtls['PAYMENTREQUEST_0_SHIPTOCITY'] = $primary_attendee->city();
199
+			$token_request_dtls['PAYMENTREQUEST_0_SHIPTOSTATE'] = $primary_attendee->state_abbrev();
200
+			$token_request_dtls['PAYMENTREQUEST_0_SHIPTOCOUNTRYCODE'] = $primary_attendee->country_ID();
201
+			$token_request_dtls['PAYMENTREQUEST_0_SHIPTOZIP'] = $primary_attendee->zip();
202
+			$token_request_dtls['PAYMENTREQUEST_0_EMAIL'] = $primary_attendee->email();
203
+			$token_request_dtls['PAYMENTREQUEST_0_SHIPTOPHONENUM'] = $primary_attendee->phone();
204
+		} elseif (! $this->_request_shipping_addr) {
205
+			// Do not request shipping details on the PP Checkout page.
206
+			$token_request_dtls['NOSHIPPING'] = '1';
207
+			$token_request_dtls['REQCONFIRMSHIPPING'] = '0';
208
+		}
209
+		// Used a business/personal logo on the PayPal page.
210
+		if (! empty($this->_image_url)) {
211
+			$token_request_dtls['LOGOIMG'] = $this->_image_url;
212
+		}
213
+		$token_request_dtls = apply_filters(
214
+			'FHEE__EEG_Paypal_Express__set_redirection_info__arguments',
215
+			$token_request_dtls,
216
+			$this
217
+		);
218
+		// Request PayPal token.
219
+		$token_request_response = $this->_ppExpress_request($token_request_dtls, 'Payment Token', $payment);
220
+		$token_rstatus = $this->_ppExpress_check_response($token_request_response);
221
+		$response_args = (isset($token_rstatus['args']) && is_array($token_rstatus['args']))
222
+			? $token_rstatus['args']
223
+			: array();
224
+		if ($token_rstatus['status']) {
225
+			// We got the Token so we may continue with the payment and redirect the client.
226
+			$payment->set_details($response_args);
227
+			$gateway_url = $this->_debug_mode ? 'https://www.sandbox.paypal.com' : 'https://www.paypal.com';
228
+			$payment->set_redirect_url(
229
+				$gateway_url
230
+				. '/checkoutnow?useraction=commit&cmd=_express-checkout&token='
231
+				. $response_args['TOKEN']
232
+			);
233
+		} else {
234
+			if (isset($response_args['L_ERRORCODE'])) {
235
+				$payment->set_gateway_response($response_args['L_ERRORCODE'] . '; ' . $response_args['L_SHORTMESSAGE']);
236
+			} else {
237
+				$payment->set_gateway_response(
238
+					esc_html__(
239
+						'Error occurred while trying to setup the Express Checkout.',
240
+						'event_espresso'
241
+					)
242
+				);
243
+			}
244
+			$payment->set_details($response_args);
245
+			$payment->set_status($this->_pay_model->failed_status());
246
+		}
247
+		return $payment;
248
+	}
249
+
250
+
251
+
252
+	/**
253
+	 * @param array           $update_info {
254
+	 * @type string           $gateway_txn_id
255
+	 * @type string status an EEMI_Payment status
256
+	 *                                     }
257
+	 * @param EEI_Transaction $transaction
258
+	 * @return EEI_Payment
259
+	 */
260
+	public function handle_payment_update($update_info, $transaction)
261
+	{
262
+		$payment = $transaction instanceof EEI_Transaction ? $transaction->last_payment() : null;
263
+		if ($payment instanceof EEI_Payment) {
264
+			$this->log(array('Return from Authorization' => $update_info), $payment);
265
+			$transaction = $payment->transaction();
266
+			if (! $transaction instanceof EEI_Transaction) {
267
+				$payment->set_gateway_response(
268
+					esc_html__(
269
+						'Could not process this payment because it has no associated transaction.',
270
+						'event_espresso'
271
+					)
272
+				);
273
+				$payment->set_status($this->_pay_model->failed_status());
274
+				return $payment;
275
+			}
276
+			$primary_registrant = $transaction->primary_registration();
277
+			$payment_details = $payment->details();
278
+			// Check if we still have the token.
279
+			if (! isset($payment_details['TOKEN']) || empty($payment_details['TOKEN'])) {
280
+				$payment->set_status($this->_pay_model->failed_status());
281
+				return $payment;
282
+			}
283
+			$cdetails_request_dtls = array(
284
+				'METHOD' => 'GetExpressCheckoutDetails',
285
+				'TOKEN'  => $payment_details['TOKEN'],
286
+			);
287
+			// Request Customer Details.
288
+			$cdetails_request_response = $this->_ppExpress_request(
289
+				$cdetails_request_dtls,
290
+				'Customer Details',
291
+				$payment
292
+			);
293
+			$cdetails_rstatus = $this->_ppExpress_check_response($cdetails_request_response);
294
+			$cdata_response_args = (isset($cdetails_rstatus['args']) && is_array($cdetails_rstatus['args']))
295
+				? $cdetails_rstatus['args']
296
+				: array();
297
+			if ($cdetails_rstatus['status']) {
298
+				// We got the PayerID so now we can Complete the transaction.
299
+				$docheckout_request_dtls = array(
300
+					'METHOD'                         => 'DoExpressCheckoutPayment',
301
+					'PAYERID'                        => $cdata_response_args['PAYERID'],
302
+					'TOKEN'                          => $payment_details['TOKEN'],
303
+					'PAYMENTREQUEST_0_PAYMENTACTION' => 'Sale',
304
+					'PAYMENTREQUEST_0_AMT'           => $payment->amount(),
305
+					'PAYMENTREQUEST_0_CURRENCYCODE'  => $payment->currency_code(),
306
+				);
307
+				 // Include itemized list.
308
+				$itemized_list = $this->itemize_list(
309
+					$payment,
310
+					$transaction,
311
+					$cdata_response_args
312
+				);
313
+				$docheckout_request_dtls = array_merge($docheckout_request_dtls, $itemized_list);
314
+				// Payment Checkout/Capture.
315
+				$docheckout_request_response = $this->_ppExpress_request(
316
+					$docheckout_request_dtls,
317
+					'Do Payment',
318
+					$payment
319
+				);
320
+				$docheckout_rstatus = $this->_ppExpress_check_response($docheckout_request_response);
321
+				$docheckout_response_args = (isset($docheckout_rstatus['args']) && is_array($docheckout_rstatus['args']))
322
+					? $docheckout_rstatus['args']
323
+					: array();
324
+				if ($docheckout_rstatus['status']) {
325
+					// All is well, payment approved.
326
+					$primary_registration_code = $primary_registrant instanceof EE_Registration ?
327
+						$primary_registrant->reg_code()
328
+						: '';
329
+					$payment->set_extra_accntng($primary_registration_code);
330
+					$payment->set_amount(isset($docheckout_response_args['PAYMENTINFO_0_AMT'])
331
+						? (float) $docheckout_response_args['PAYMENTINFO_0_AMT']
332
+						: 0);
333
+					$payment->set_txn_id_chq_nmbr(isset($docheckout_response_args['PAYMENTINFO_0_TRANSACTIONID'])
334
+						? $docheckout_response_args['PAYMENTINFO_0_TRANSACTIONID']
335
+						: null);
336
+					$payment->set_details($cdata_response_args);
337
+					$payment->set_gateway_response(isset($docheckout_response_args['PAYMENTINFO_0_ACK'])
338
+						? $docheckout_response_args['PAYMENTINFO_0_ACK']
339
+						: '');
340
+					$payment->set_status($this->_pay_model->approved_status());
341
+				} else {
342
+					if (isset($docheckout_response_args['L_ERRORCODE'])) {
343
+						$payment->set_gateway_response(
344
+							$docheckout_response_args['L_ERRORCODE']
345
+							. '; '
346
+							. $docheckout_response_args['L_SHORTMESSAGE']
347
+						);
348
+					} else {
349
+						$payment->set_gateway_response(
350
+							esc_html__(
351
+								'Error occurred while trying to Capture the funds.',
352
+								'event_espresso'
353
+							)
354
+						);
355
+					}
356
+					$payment->set_details($docheckout_response_args);
357
+					$payment->set_status($this->_pay_model->declined_status());
358
+				}
359
+			} else {
360
+				if (isset($cdata_response_args['L_ERRORCODE'])) {
361
+					$payment->set_gateway_response(
362
+						$cdata_response_args['L_ERRORCODE']
363
+						. '; '
364
+						. $cdata_response_args['L_SHORTMESSAGE']
365
+					);
366
+				} else {
367
+					$payment->set_gateway_response(
368
+						esc_html__(
369
+							'Error occurred while trying to get payment Details from PayPal.',
370
+							'event_espresso'
371
+						)
372
+					);
373
+				}
374
+				$payment->set_details($cdata_response_args);
375
+				$payment->set_status($this->_pay_model->failed_status());
376
+			}
377
+		} else {
378
+			$payment->set_gateway_response(
379
+				esc_html__(
380
+					'Error occurred while trying to process the payment.',
381
+					'event_espresso'
382
+				)
383
+			);
384
+			$payment->set_status($this->_pay_model->failed_status());
385
+		}
386
+		return $payment;
387
+	}
388
+
389
+
390
+
391
+	/**
392
+	 *  Make a list of items that are in the giver transaction.
393
+	 *
394
+	 * @param EEI_Payment     $payment
395
+	 * @param EEI_Transaction $transaction
396
+	 * @param array           $request_response_args Data from a previous communication with PP.
397
+	 * @return array
398
+	 */
399
+	public function itemize_list(EEI_Payment $payment, EEI_Transaction $transaction, $request_response_args = array())
400
+	{
401
+		$itemized_list = array();
402
+		$gateway_formatter = $this->_get_gateway_formatter();
403
+		// If we have data from a previous communication with PP (on this transaction) we may use that for our list...
404
+		if (
405
+			! empty($request_response_args)
406
+			&& array_key_exists('L_PAYMENTREQUEST_0_AMT0', $request_response_args)
407
+			&& array_key_exists('PAYMENTREQUEST_0_ITEMAMT', $request_response_args)
408
+		) {
409
+			foreach ($request_response_args as $arg_key => $arg_val) {
410
+				if (
411
+					strpos($arg_key, 'PAYMENTREQUEST_') !== false
412
+					&& strpos($arg_key, 'NOTIFYURL') === false
413
+				) {
414
+					$itemized_list[ $arg_key ] = $arg_val;
415
+				}
416
+			}
417
+			// If we got only a few Items then something is not right.
418
+			if (count($itemized_list) > 2) {
419
+				return $itemized_list;
420
+			} else {
421
+				if (WP_DEBUG) {
422
+					throw new EE_Error(
423
+						sprintf(
424
+							esc_html__(
425
+								// @codingStandardsIgnoreStart
426
+								'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',
427
+								// @codingStandardsIgnoreEnd
428
+								'event_espresso'
429
+							),
430
+							wp_json_encode($itemized_list)
431
+						)
432
+					);
433
+				}
434
+				// Reset the list and log an error, maybe allow to try and generate a new list (below).
435
+				$itemized_list = array();
436
+				$this->log(
437
+					array(
438
+						(string) esc_html__(
439
+							'Could not generate a proper item list with:',
440
+							'event_espresso'
441
+						) => $request_response_args
442
+					),
443
+					$payment
444
+				);
445
+			}
446
+		}
447
+		// ...otherwise we generate a new list for this transaction.
448
+		if ($this->_money->compare_floats($payment->amount(), $transaction->total(), '==')) {
449
+			$item_num = 0;
450
+			$itemized_sum = 0;
451
+			$total_line_items = $transaction->total_line_item();
452
+			// Go through each item in the list.
453
+			foreach ($total_line_items->get_items() as $line_item) {
454
+				if ($line_item instanceof EE_Line_Item) {
455
+					// PayPal doesn't like line items with 0.00 amount, so we may skip those.
456
+					if (EEH_Money::compare_floats($line_item->total(), '0.00', '==')) {
457
+						continue;
458
+					}
459
+					$unit_price = $line_item->unit_price();
460
+					$line_item_quantity = $line_item->quantity();
461
+					// This is a discount.
462
+					if ($line_item->is_percent()) {
463
+						$unit_price = $line_item->total();
464
+						$line_item_quantity = 1;
465
+					}
466
+					// Item Name.
467
+					$itemized_list[ 'L_PAYMENTREQUEST_0_NAME' . $item_num ] = mb_strcut(
468
+						$gateway_formatter->formatLineItemName($line_item, $payment),
469
+						0,
470
+						127
471
+					);
472
+					// Item description.
473
+					$itemized_list[ 'L_PAYMENTREQUEST_0_DESC' . $item_num ] = mb_strcut(
474
+						$gateway_formatter->formatLineItemDesc($line_item, $payment),
475
+						0,
476
+						127
477
+					);
478
+					// Cost of individual item.
479
+					$itemized_list[ 'L_PAYMENTREQUEST_0_AMT' . $item_num ] = $gateway_formatter->formatCurrency($unit_price);
480
+					// Item Number.
481
+					$itemized_list[ 'L_PAYMENTREQUEST_0_NUMBER' . $item_num ] = $item_num + 1;
482
+					// Item quantity.
483
+					$itemized_list[ 'L_PAYMENTREQUEST_0_QTY' . $item_num ] = $line_item_quantity;
484
+					// Digital item is sold.
485
+					$itemized_list[ 'L_PAYMENTREQUEST_0_ITEMCATEGORY' . $item_num ] = 'Physical';
486
+					$itemized_sum += $line_item->total();
487
+					++$item_num;
488
+				}
489
+			}
490
+			// Item's sales S/H and tax amount.
491
+			$itemized_list['PAYMENTREQUEST_0_ITEMAMT'] = $total_line_items->get_items_total();
492
+			$itemized_list['PAYMENTREQUEST_0_TAXAMT'] = $total_line_items->get_total_tax();
493
+			$itemized_list['PAYMENTREQUEST_0_SHIPPINGAMT'] = '0';
494
+			$itemized_list['PAYMENTREQUEST_0_HANDLINGAMT'] = '0';
495
+			$itemized_sum_diff_from_txn_total = round(
496
+				$transaction->total() - $itemized_sum - $total_line_items->get_total_tax(),
497
+				2
498
+			);
499
+			// If we were not able to recognize some item like promotion, surcharge or cancellation,
500
+			// add the difference as an extra line item.
501
+			if ($this->_money->compare_floats($itemized_sum_diff_from_txn_total, 0, '!=')) {
502
+				// Item Name.
503
+				$itemized_list[ 'L_PAYMENTREQUEST_0_NAME' . $item_num ] = mb_strcut(
504
+					esc_html__(
505
+						'Other (promotion/surcharge/cancellation)',
506
+						'event_espresso'
507
+					),
508
+					0,
509
+					127
510
+				);
511
+				// Item description.
512
+				$itemized_list[ 'L_PAYMENTREQUEST_0_DESC' . $item_num ] = '';
513
+				// Cost of individual item.
514
+				$itemized_list[ 'L_PAYMENTREQUEST_0_AMT' . $item_num ] = $gateway_formatter->formatCurrency(
515
+					$itemized_sum_diff_from_txn_total
516
+				);
517
+				// Item Number.
518
+				$itemized_list[ 'L_PAYMENTREQUEST_0_NUMBER' . $item_num ] = $item_num + 1;
519
+				// Item quantity.
520
+				$itemized_list[ 'L_PAYMENTREQUEST_0_QTY' . $item_num ] = 1;
521
+				// Digital item is sold.
522
+				$itemized_list[ 'L_PAYMENTREQUEST_0_ITEMCATEGORY' . $item_num ] = 'Physical';
523
+				$item_num++;
524
+			}
525
+		} else {
526
+			// Just one Item.
527
+			// Item Name.
528
+			$itemized_list['L_PAYMENTREQUEST_0_NAME0'] = mb_strcut(
529
+				$gateway_formatter->formatPartialPaymentLineItemName($payment),
530
+				0,
531
+				127
532
+			);
533
+			// Item description.
534
+			$itemized_list['L_PAYMENTREQUEST_0_DESC0'] = mb_strcut(
535
+				$gateway_formatter->formatPartialPaymentLineItemDesc($payment),
536
+				0,
537
+				127
538
+			);
539
+			// Cost of individual item.
540
+			$itemized_list['L_PAYMENTREQUEST_0_AMT0'] = $gateway_formatter->formatCurrency($payment->amount());
541
+			// Item Number.
542
+			$itemized_list['L_PAYMENTREQUEST_0_NUMBER0'] = 1;
543
+			// Item quantity.
544
+			$itemized_list['L_PAYMENTREQUEST_0_QTY0'] = 1;
545
+			// Digital item is sold.
546
+			$itemized_list['L_PAYMENTREQUEST_0_ITEMCATEGORY0'] = 'Physical';
547
+			// Item's sales S/H and tax amount.
548
+			$itemized_list['PAYMENTREQUEST_0_ITEMAMT'] = $gateway_formatter->formatCurrency($payment->amount());
549
+			$itemized_list['PAYMENTREQUEST_0_TAXAMT'] = '0';
550
+			$itemized_list['PAYMENTREQUEST_0_SHIPPINGAMT'] = '0';
551
+			$itemized_list['PAYMENTREQUEST_0_HANDLINGAMT'] = '0';
552
+		}
553
+		return $itemized_list;
554
+	}
555
+
556
+
557
+
558
+	/**
559
+	 *  Make the Express checkout request.
560
+	 *
561
+	 * @param array       $request_params
562
+	 * @param string      $request_text
563
+	 * @param EEI_Payment $payment
564
+	 * @return mixed
565
+	 */
566
+	public function _ppExpress_request($request_params, $request_text, $payment)
567
+	{
568
+		$request_dtls = array(
569
+			'VERSION' => '204.0',
570
+			'USER' => $this->_api_username,
571
+			'PWD' => $this->_api_password,
572
+			'SIGNATURE' => $this->_api_signature,
573
+			// EE will blow up if you change this
574
+			'BUTTONSOURCE' => 'EventEspresso_SP',
575
+		);
576
+		$dtls = array_merge($request_dtls, $request_params);
577
+		$this->_log_clean_request($dtls, $payment, $request_text . ' Request');
578
+		// Request Customer Details.
579
+		$request_response = wp_remote_post(
580
+			$this->_base_gateway_url,
581
+			array(
582
+				'method'      => 'POST',
583
+				'timeout'     => 45,
584
+				'httpversion' => '1.1',
585
+				'cookies'     => array(),
586
+				'headers'     => array(),
587
+				'body'        => http_build_query($dtls, '', '&'),
588
+			)
589
+		);
590
+		// Log the response.
591
+		$this->log(array($request_text . ' Response' => $request_response), $payment);
592
+		return $request_response;
593
+	}
594
+
595
+
596
+
597
+	/**
598
+	 *  Check the response status.
599
+	 *
600
+	 * @param mixed $request_response
601
+	 * @return array
602
+	 */
603
+	public function _ppExpress_check_response($request_response)
604
+	{
605
+		if (is_wp_error($request_response) || empty($request_response['body'])) {
606
+			// If we got here then there was an error in this request.
607
+			return array('status' => false, 'args' => $request_response);
608
+		}
609
+		$response_args = array();
610
+		parse_str(urldecode($request_response['body']), $response_args);
611
+		if (! isset($response_args['ACK'])) {
612
+			return array('status' => false, 'args' => $request_response);
613
+		}
614
+		if (
615
+			(
616
+				isset($response_args['PAYERID'])
617
+				|| isset($response_args['TOKEN'])
618
+				|| isset($response_args['PAYMENTINFO_0_TRANSACTIONID'])
619
+				|| (isset($response_args['PAYMENTSTATUS']) && $response_args['PAYMENTSTATUS'] === 'Completed')
620
+			)
621
+			&& in_array($response_args['ACK'], array('Success', 'SuccessWithWarning'), true)
622
+		) {
623
+			// Response status OK, return response parameters for further processing.
624
+			return array('status' => true, 'args' => $response_args);
625
+		}
626
+		$errors = $this->_get_errors($response_args);
627
+		return array('status' => false, 'args' => $errors);
628
+	}
629
+
630
+
631
+
632
+	/**
633
+	 *  Log a "Cleared" request.
634
+	 *
635
+	 * @param array       $request
636
+	 * @param EEI_Payment $payment
637
+	 * @param string      $info
638
+	 * @return void
639
+	 */
640
+	private function _log_clean_request($request, $payment, $info)
641
+	{
642
+		$cleaned_request_data = $request;
643
+		unset($cleaned_request_data['PWD'], $cleaned_request_data['USER'], $cleaned_request_data['SIGNATURE']);
644
+		$this->log(array($info => $cleaned_request_data), $payment);
645
+	}
646
+
647
+
648
+
649
+	/**
650
+	 *  Get error from the response data.
651
+	 *
652
+	 * @param array $data_array
653
+	 * @return array
654
+	 */
655
+	private function _get_errors($data_array)
656
+	{
657
+		$errors = array();
658
+		$n = 0;
659
+		while (isset($data_array[ "L_ERRORCODE{$n}" ])) {
660
+			$l_error_code = isset($data_array[ "L_ERRORCODE{$n}" ])
661
+				? $data_array[ "L_ERRORCODE{$n}" ]
662
+				: '';
663
+			$l_severity_code = isset($data_array[ "L_SEVERITYCODE{$n}" ])
664
+				? $data_array[ "L_SEVERITYCODE{$n}" ]
665
+				: '';
666
+			$l_short_message = isset($data_array[ "L_SHORTMESSAGE{$n}" ])
667
+				? $data_array[ "L_SHORTMESSAGE{$n}" ]
668
+				: '';
669
+			$l_long_message = isset($data_array[ "L_LONGMESSAGE{$n}" ])
670
+				? $data_array[ "L_LONGMESSAGE{$n}" ]
671
+				: '';
672
+			if ($n === 0) {
673
+				$errors = array(
674
+					'L_ERRORCODE'    => $l_error_code,
675
+					'L_SHORTMESSAGE' => $l_short_message,
676
+					'L_LONGMESSAGE'  => $l_long_message,
677
+					'L_SEVERITYCODE' => $l_severity_code,
678
+				);
679
+			} else {
680
+				$errors['L_ERRORCODE'] .= ', ' . $l_error_code;
681
+				$errors['L_SHORTMESSAGE'] .= ', ' . $l_short_message;
682
+				$errors['L_LONGMESSAGE'] .= ', ' . $l_long_message;
683
+				$errors['L_SEVERITYCODE'] .= ', ' . $l_severity_code;
684
+			}
685
+			$n++;
686
+		}
687
+		return $errors;
688
+	}
689 689
 }
Please login to merge, or discard this patch.
Spacing   +37 added lines, -37 removed lines patch added patch discarded remove patch
@@ -12,7 +12,7 @@  discard block
 block discarded – undo
12 12
  */
13 13
 
14 14
 // Quickfix to address https://events.codebasehq.com/projects/event-espresso/tickets/11089 ASAP
15
-if (! function_exists('mb_strcut')) {
15
+if ( ! function_exists('mb_strcut')) {
16 16
     /**
17 17
      * Very simple mimic of mb_substr (which WP ensures exists in wp-includes/compat.php). Still has all the problems of mb_substr
18 18
      * (namely, that we might send too many characters to PayPal; however in this case they just issue a warning but nothing breaks)
@@ -143,7 +143,7 @@  discard block
 block discarded – undo
143 143
         $notify_url = null,
144 144
         $cancel_url = null
145 145
     ) {
146
-        if (! $payment instanceof EEI_Payment) {
146
+        if ( ! $payment instanceof EEI_Payment) {
147 147
             $payment->set_gateway_response(
148 148
                 esc_html__(
149 149
                     'Error. No associated payment was found.',
@@ -154,7 +154,7 @@  discard block
 block discarded – undo
154 154
             return $payment;
155 155
         }
156 156
         $transaction = $payment->transaction();
157
-        if (! $transaction instanceof EEI_Transaction) {
157
+        if ( ! $transaction instanceof EEI_Transaction) {
158 158
             $payment->set_gateway_response(
159 159
                 esc_html__(
160 160
                     'Could not process this payment because it has no associated transaction.',
@@ -201,13 +201,13 @@  discard block
 block discarded – undo
201 201
             $token_request_dtls['PAYMENTREQUEST_0_SHIPTOZIP'] = $primary_attendee->zip();
202 202
             $token_request_dtls['PAYMENTREQUEST_0_EMAIL'] = $primary_attendee->email();
203 203
             $token_request_dtls['PAYMENTREQUEST_0_SHIPTOPHONENUM'] = $primary_attendee->phone();
204
-        } elseif (! $this->_request_shipping_addr) {
204
+        } elseif ( ! $this->_request_shipping_addr) {
205 205
             // Do not request shipping details on the PP Checkout page.
206 206
             $token_request_dtls['NOSHIPPING'] = '1';
207 207
             $token_request_dtls['REQCONFIRMSHIPPING'] = '0';
208 208
         }
209 209
         // Used a business/personal logo on the PayPal page.
210
-        if (! empty($this->_image_url)) {
210
+        if ( ! empty($this->_image_url)) {
211 211
             $token_request_dtls['LOGOIMG'] = $this->_image_url;
212 212
         }
213 213
         $token_request_dtls = apply_filters(
@@ -232,7 +232,7 @@  discard block
 block discarded – undo
232 232
             );
233 233
         } else {
234 234
             if (isset($response_args['L_ERRORCODE'])) {
235
-                $payment->set_gateway_response($response_args['L_ERRORCODE'] . '; ' . $response_args['L_SHORTMESSAGE']);
235
+                $payment->set_gateway_response($response_args['L_ERRORCODE'].'; '.$response_args['L_SHORTMESSAGE']);
236 236
             } else {
237 237
                 $payment->set_gateway_response(
238 238
                     esc_html__(
@@ -263,7 +263,7 @@  discard block
 block discarded – undo
263 263
         if ($payment instanceof EEI_Payment) {
264 264
             $this->log(array('Return from Authorization' => $update_info), $payment);
265 265
             $transaction = $payment->transaction();
266
-            if (! $transaction instanceof EEI_Transaction) {
266
+            if ( ! $transaction instanceof EEI_Transaction) {
267 267
                 $payment->set_gateway_response(
268 268
                     esc_html__(
269 269
                         'Could not process this payment because it has no associated transaction.',
@@ -276,7 +276,7 @@  discard block
 block discarded – undo
276 276
             $primary_registrant = $transaction->primary_registration();
277 277
             $payment_details = $payment->details();
278 278
             // Check if we still have the token.
279
-            if (! isset($payment_details['TOKEN']) || empty($payment_details['TOKEN'])) {
279
+            if ( ! isset($payment_details['TOKEN']) || empty($payment_details['TOKEN'])) {
280 280
                 $payment->set_status($this->_pay_model->failed_status());
281 281
                 return $payment;
282 282
             }
@@ -411,7 +411,7 @@  discard block
 block discarded – undo
411 411
                     strpos($arg_key, 'PAYMENTREQUEST_') !== false
412 412
                     && strpos($arg_key, 'NOTIFYURL') === false
413 413
                 ) {
414
-                    $itemized_list[ $arg_key ] = $arg_val;
414
+                    $itemized_list[$arg_key] = $arg_val;
415 415
                 }
416 416
             }
417 417
             // If we got only a few Items then something is not right.
@@ -464,25 +464,25 @@  discard block
 block discarded – undo
464 464
                         $line_item_quantity = 1;
465 465
                     }
466 466
                     // Item Name.
467
-                    $itemized_list[ 'L_PAYMENTREQUEST_0_NAME' . $item_num ] = mb_strcut(
467
+                    $itemized_list['L_PAYMENTREQUEST_0_NAME'.$item_num] = mb_strcut(
468 468
                         $gateway_formatter->formatLineItemName($line_item, $payment),
469 469
                         0,
470 470
                         127
471 471
                     );
472 472
                     // Item description.
473
-                    $itemized_list[ 'L_PAYMENTREQUEST_0_DESC' . $item_num ] = mb_strcut(
473
+                    $itemized_list['L_PAYMENTREQUEST_0_DESC'.$item_num] = mb_strcut(
474 474
                         $gateway_formatter->formatLineItemDesc($line_item, $payment),
475 475
                         0,
476 476
                         127
477 477
                     );
478 478
                     // Cost of individual item.
479
-                    $itemized_list[ 'L_PAYMENTREQUEST_0_AMT' . $item_num ] = $gateway_formatter->formatCurrency($unit_price);
479
+                    $itemized_list['L_PAYMENTREQUEST_0_AMT'.$item_num] = $gateway_formatter->formatCurrency($unit_price);
480 480
                     // Item Number.
481
-                    $itemized_list[ 'L_PAYMENTREQUEST_0_NUMBER' . $item_num ] = $item_num + 1;
481
+                    $itemized_list['L_PAYMENTREQUEST_0_NUMBER'.$item_num] = $item_num + 1;
482 482
                     // Item quantity.
483
-                    $itemized_list[ 'L_PAYMENTREQUEST_0_QTY' . $item_num ] = $line_item_quantity;
483
+                    $itemized_list['L_PAYMENTREQUEST_0_QTY'.$item_num] = $line_item_quantity;
484 484
                     // Digital item is sold.
485
-                    $itemized_list[ 'L_PAYMENTREQUEST_0_ITEMCATEGORY' . $item_num ] = 'Physical';
485
+                    $itemized_list['L_PAYMENTREQUEST_0_ITEMCATEGORY'.$item_num] = 'Physical';
486 486
                     $itemized_sum += $line_item->total();
487 487
                     ++$item_num;
488 488
                 }
@@ -500,7 +500,7 @@  discard block
 block discarded – undo
500 500
             // add the difference as an extra line item.
501 501
             if ($this->_money->compare_floats($itemized_sum_diff_from_txn_total, 0, '!=')) {
502 502
                 // Item Name.
503
-                $itemized_list[ 'L_PAYMENTREQUEST_0_NAME' . $item_num ] = mb_strcut(
503
+                $itemized_list['L_PAYMENTREQUEST_0_NAME'.$item_num] = mb_strcut(
504 504
                     esc_html__(
505 505
                         'Other (promotion/surcharge/cancellation)',
506 506
                         'event_espresso'
@@ -509,17 +509,17 @@  discard block
 block discarded – undo
509 509
                     127
510 510
                 );
511 511
                 // Item description.
512
-                $itemized_list[ 'L_PAYMENTREQUEST_0_DESC' . $item_num ] = '';
512
+                $itemized_list['L_PAYMENTREQUEST_0_DESC'.$item_num] = '';
513 513
                 // Cost of individual item.
514
-                $itemized_list[ 'L_PAYMENTREQUEST_0_AMT' . $item_num ] = $gateway_formatter->formatCurrency(
514
+                $itemized_list['L_PAYMENTREQUEST_0_AMT'.$item_num] = $gateway_formatter->formatCurrency(
515 515
                     $itemized_sum_diff_from_txn_total
516 516
                 );
517 517
                 // Item Number.
518
-                $itemized_list[ 'L_PAYMENTREQUEST_0_NUMBER' . $item_num ] = $item_num + 1;
518
+                $itemized_list['L_PAYMENTREQUEST_0_NUMBER'.$item_num] = $item_num + 1;
519 519
                 // Item quantity.
520
-                $itemized_list[ 'L_PAYMENTREQUEST_0_QTY' . $item_num ] = 1;
520
+                $itemized_list['L_PAYMENTREQUEST_0_QTY'.$item_num] = 1;
521 521
                 // Digital item is sold.
522
-                $itemized_list[ 'L_PAYMENTREQUEST_0_ITEMCATEGORY' . $item_num ] = 'Physical';
522
+                $itemized_list['L_PAYMENTREQUEST_0_ITEMCATEGORY'.$item_num] = 'Physical';
523 523
                 $item_num++;
524 524
             }
525 525
         } else {
@@ -574,7 +574,7 @@  discard block
 block discarded – undo
574 574
             'BUTTONSOURCE' => 'EventEspresso_SP',
575 575
         );
576 576
         $dtls = array_merge($request_dtls, $request_params);
577
-        $this->_log_clean_request($dtls, $payment, $request_text . ' Request');
577
+        $this->_log_clean_request($dtls, $payment, $request_text.' Request');
578 578
         // Request Customer Details.
579 579
         $request_response = wp_remote_post(
580 580
             $this->_base_gateway_url,
@@ -588,7 +588,7 @@  discard block
 block discarded – undo
588 588
             )
589 589
         );
590 590
         // Log the response.
591
-        $this->log(array($request_text . ' Response' => $request_response), $payment);
591
+        $this->log(array($request_text.' Response' => $request_response), $payment);
592 592
         return $request_response;
593 593
     }
594 594
 
@@ -608,7 +608,7 @@  discard block
 block discarded – undo
608 608
         }
609 609
         $response_args = array();
610 610
         parse_str(urldecode($request_response['body']), $response_args);
611
-        if (! isset($response_args['ACK'])) {
611
+        if ( ! isset($response_args['ACK'])) {
612 612
             return array('status' => false, 'args' => $request_response);
613 613
         }
614 614
         if (
@@ -656,18 +656,18 @@  discard block
 block discarded – undo
656 656
     {
657 657
         $errors = array();
658 658
         $n = 0;
659
-        while (isset($data_array[ "L_ERRORCODE{$n}" ])) {
660
-            $l_error_code = isset($data_array[ "L_ERRORCODE{$n}" ])
661
-                ? $data_array[ "L_ERRORCODE{$n}" ]
659
+        while (isset($data_array["L_ERRORCODE{$n}"])) {
660
+            $l_error_code = isset($data_array["L_ERRORCODE{$n}"])
661
+                ? $data_array["L_ERRORCODE{$n}"]
662 662
                 : '';
663
-            $l_severity_code = isset($data_array[ "L_SEVERITYCODE{$n}" ])
664
-                ? $data_array[ "L_SEVERITYCODE{$n}" ]
663
+            $l_severity_code = isset($data_array["L_SEVERITYCODE{$n}"])
664
+                ? $data_array["L_SEVERITYCODE{$n}"]
665 665
                 : '';
666
-            $l_short_message = isset($data_array[ "L_SHORTMESSAGE{$n}" ])
667
-                ? $data_array[ "L_SHORTMESSAGE{$n}" ]
666
+            $l_short_message = isset($data_array["L_SHORTMESSAGE{$n}"])
667
+                ? $data_array["L_SHORTMESSAGE{$n}"]
668 668
                 : '';
669
-            $l_long_message = isset($data_array[ "L_LONGMESSAGE{$n}" ])
670
-                ? $data_array[ "L_LONGMESSAGE{$n}" ]
669
+            $l_long_message = isset($data_array["L_LONGMESSAGE{$n}"])
670
+                ? $data_array["L_LONGMESSAGE{$n}"]
671 671
                 : '';
672 672
             if ($n === 0) {
673 673
                 $errors = array(
@@ -677,10 +677,10 @@  discard block
 block discarded – undo
677 677
                     'L_SEVERITYCODE' => $l_severity_code,
678 678
                 );
679 679
             } else {
680
-                $errors['L_ERRORCODE'] .= ', ' . $l_error_code;
681
-                $errors['L_SHORTMESSAGE'] .= ', ' . $l_short_message;
682
-                $errors['L_LONGMESSAGE'] .= ', ' . $l_long_message;
683
-                $errors['L_SEVERITYCODE'] .= ', ' . $l_severity_code;
680
+                $errors['L_ERRORCODE'] .= ', '.$l_error_code;
681
+                $errors['L_SHORTMESSAGE'] .= ', '.$l_short_message;
682
+                $errors['L_LONGMESSAGE'] .= ', '.$l_long_message;
683
+                $errors['L_SEVERITYCODE'] .= ', '.$l_severity_code;
684 684
             }
685 685
             $n++;
686 686
         }
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.
Indentation   +1212 added lines, -1212 removed lines patch added patch discarded remove patch
@@ -16,1269 +16,1269 @@
 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 (
379
-            ! EE_Registry::instance()->CAP->current_user_can(
380
-                'ee_send_message',
381
-                'espresso_registrations_newsletter_selected_send'
382
-            )
383
-        ) {
384
-            return;
385
-        }
386
-        $routes_to_add_to = array(
387
-            'contact_list',
388
-            'event_registrations',
389
-            'default',
390
-        );
391
-        if ($this->_current_page === 'espresso_registrations' && in_array($this->_req_action, $routes_to_add_to)) {
392
-            if (
393
-                ($this->_req_action === 'event_registrations' && empty($this->_req_data['event_id']))
394
-                || (isset($this->_req_data['status']) && $this->_req_data['status'] === 'trash')
395
-            ) {
396
-                echo '';
397
-            } else {
398
-                $button_text = sprintf(
399
-                    esc_html__('Send Batch Message (%s selected)', 'event_espresso'),
400
-                    '<span class="send-selected-newsletter-count">0</span>'
401
-                );
402
-                echo '<button id="selected-batch-send-trigger" class="button secondary-button">'
403
-                     . '<span class="dashicons dashicons-email "></span>'
404
-                     . $button_text
405
-                     . '</button>';
406
-                add_action('admin_footer', array($this, 'newsletter_send_form_skeleton'));
407
-            }
408
-        }
409
-    }
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 (
379
+			! EE_Registry::instance()->CAP->current_user_can(
380
+				'ee_send_message',
381
+				'espresso_registrations_newsletter_selected_send'
382
+			)
383
+		) {
384
+			return;
385
+		}
386
+		$routes_to_add_to = array(
387
+			'contact_list',
388
+			'event_registrations',
389
+			'default',
390
+		);
391
+		if ($this->_current_page === 'espresso_registrations' && in_array($this->_req_action, $routes_to_add_to)) {
392
+			if (
393
+				($this->_req_action === 'event_registrations' && empty($this->_req_data['event_id']))
394
+				|| (isset($this->_req_data['status']) && $this->_req_data['status'] === 'trash')
395
+			) {
396
+				echo '';
397
+			} else {
398
+				$button_text = sprintf(
399
+					esc_html__('Send Batch Message (%s selected)', 'event_espresso'),
400
+					'<span class="send-selected-newsletter-count">0</span>'
401
+				);
402
+				echo '<button id="selected-batch-send-trigger" class="button secondary-button">'
403
+					 . '<span class="dashicons dashicons-email "></span>'
404
+					 . $button_text
405
+					 . '</button>';
406
+				add_action('admin_footer', array($this, 'newsletter_send_form_skeleton'));
407
+			}
408
+		}
409
+	}
410 410
 
411 411
 
412
-    /**
413
-     * @throws DomainException
414
-     * @throws EE_Error
415
-     * @throws InvalidArgumentException
416
-     * @throws InvalidDataTypeException
417
-     * @throws InvalidInterfaceException
418
-     */
419
-    public function newsletter_send_form_skeleton()
420
-    {
421
-        $list_table = $this->_list_table_object;
422
-        $codes = array();
423
-        // need to templates for the newsletter message type for the template selector.
424
-        $values[] = array('text' => esc_html__('Select Template to Use', 'event_espresso'), 'id' => 0);
425
-        $mtps = EEM_Message_Template_Group::instance()->get_all(
426
-            array(array('MTP_message_type' => 'newsletter', 'MTP_messenger' => 'email'))
427
-        );
428
-        foreach ($mtps as $mtp) {
429
-            $name = $mtp->name();
430
-            $values[] = array(
431
-                'text' => empty($name) ? esc_html__('Global', 'event_espresso') : $name,
432
-                'id'   => $mtp->ID(),
433
-            );
434
-        }
435
-        // need to get a list of shortcodes that are available for the newsletter message type.
436
-        $shortcodes = EEH_MSG_Template::get_shortcodes(
437
-            'newsletter',
438
-            'email',
439
-            array(),
440
-            'attendee',
441
-            false
442
-        );
443
-        foreach ($shortcodes as $field => $shortcode_array) {
444
-            $available_shortcodes = array();
445
-            foreach ($shortcode_array as $shortcode => $shortcode_details) {
446
-                $field_id = $field === '[NEWSLETTER_CONTENT]'
447
-                    ? 'content'
448
-                    : $field;
449
-                $field_id = 'batch-message-' . strtolower($field_id);
450
-                $available_shortcodes[] = '<span class="js-shortcode-selection" data-value="'
451
-                                          . $shortcode
452
-                                          . '" data-linked-input-id="' . $field_id . '">'
453
-                                          . $shortcode
454
-                                          . '</span>';
455
-            }
456
-            $codes[ $field ] = implode(', ', $available_shortcodes);
457
-        }
458
-        $shortcodes = $codes;
459
-        $form_template = REG_CAF_TEMPLATE_PATH . 'newsletter-send-form.template.php';
460
-        $form_template_args = array(
461
-            'form_action'       => admin_url('admin.php?page=espresso_registrations'),
462
-            'form_route'        => 'newsletter_selected_send',
463
-            'form_nonce_name'   => 'newsletter_selected_send_nonce',
464
-            'form_nonce'        => wp_create_nonce('newsletter_selected_send_nonce'),
465
-            'redirect_back_to'  => $this->_req_action,
466
-            'ajax_nonce'        => wp_create_nonce('get_newsletter_form_content_nonce'),
467
-            'template_selector' => EEH_Form_Fields::select_input('newsletter_mtp_selected', $values),
468
-            'shortcodes'        => $shortcodes,
469
-            'id_type'           => $list_table instanceof EE_Attendee_Contact_List_Table ? 'contact' : 'registration',
470
-        );
471
-        EEH_Template::display_template($form_template, $form_template_args);
472
-    }
412
+	/**
413
+	 * @throws DomainException
414
+	 * @throws EE_Error
415
+	 * @throws InvalidArgumentException
416
+	 * @throws InvalidDataTypeException
417
+	 * @throws InvalidInterfaceException
418
+	 */
419
+	public function newsletter_send_form_skeleton()
420
+	{
421
+		$list_table = $this->_list_table_object;
422
+		$codes = array();
423
+		// need to templates for the newsletter message type for the template selector.
424
+		$values[] = array('text' => esc_html__('Select Template to Use', 'event_espresso'), 'id' => 0);
425
+		$mtps = EEM_Message_Template_Group::instance()->get_all(
426
+			array(array('MTP_message_type' => 'newsletter', 'MTP_messenger' => 'email'))
427
+		);
428
+		foreach ($mtps as $mtp) {
429
+			$name = $mtp->name();
430
+			$values[] = array(
431
+				'text' => empty($name) ? esc_html__('Global', 'event_espresso') : $name,
432
+				'id'   => $mtp->ID(),
433
+			);
434
+		}
435
+		// need to get a list of shortcodes that are available for the newsletter message type.
436
+		$shortcodes = EEH_MSG_Template::get_shortcodes(
437
+			'newsletter',
438
+			'email',
439
+			array(),
440
+			'attendee',
441
+			false
442
+		);
443
+		foreach ($shortcodes as $field => $shortcode_array) {
444
+			$available_shortcodes = array();
445
+			foreach ($shortcode_array as $shortcode => $shortcode_details) {
446
+				$field_id = $field === '[NEWSLETTER_CONTENT]'
447
+					? 'content'
448
+					: $field;
449
+				$field_id = 'batch-message-' . strtolower($field_id);
450
+				$available_shortcodes[] = '<span class="js-shortcode-selection" data-value="'
451
+										  . $shortcode
452
+										  . '" data-linked-input-id="' . $field_id . '">'
453
+										  . $shortcode
454
+										  . '</span>';
455
+			}
456
+			$codes[ $field ] = implode(', ', $available_shortcodes);
457
+		}
458
+		$shortcodes = $codes;
459
+		$form_template = REG_CAF_TEMPLATE_PATH . 'newsletter-send-form.template.php';
460
+		$form_template_args = array(
461
+			'form_action'       => admin_url('admin.php?page=espresso_registrations'),
462
+			'form_route'        => 'newsletter_selected_send',
463
+			'form_nonce_name'   => 'newsletter_selected_send_nonce',
464
+			'form_nonce'        => wp_create_nonce('newsletter_selected_send_nonce'),
465
+			'redirect_back_to'  => $this->_req_action,
466
+			'ajax_nonce'        => wp_create_nonce('get_newsletter_form_content_nonce'),
467
+			'template_selector' => EEH_Form_Fields::select_input('newsletter_mtp_selected', $values),
468
+			'shortcodes'        => $shortcodes,
469
+			'id_type'           => $list_table instanceof EE_Attendee_Contact_List_Table ? 'contact' : 'registration',
470
+		);
471
+		EEH_Template::display_template($form_template, $form_template_args);
472
+	}
473 473
 
474 474
 
475
-    /**
476
-     * Handles sending selected registrations/contacts a newsletter.
477
-     *
478
-     * @since  4.3.0
479
-     * @return void
480
-     * @throws EE_Error
481
-     * @throws InvalidArgumentException
482
-     * @throws InvalidDataTypeException
483
-     * @throws InvalidInterfaceException
484
-     */
485
-    protected function _newsletter_selected_send()
486
-    {
487
-        $success = true;
488
-        // first we need to make sure we have a GRP_ID so we know what template we're sending and updating!
489
-        if (empty($this->_req_data['newsletter_mtp_selected'])) {
490
-            EE_Error::add_error(
491
-                esc_html__(
492
-                    'In order to send a message, a Message Template GRP_ID is needed. It was not provided so messages were not sent.',
493
-                    'event_espresso'
494
-                ),
495
-                __FILE__,
496
-                __FUNCTION__,
497
-                __LINE__
498
-            );
499
-            $success = false;
500
-        }
501
-        if ($success) {
502
-            // update Message template in case there are any changes
503
-            $Message_Template_Group = EEM_Message_Template_Group::instance()->get_one_by_ID(
504
-                $this->_req_data['newsletter_mtp_selected']
505
-            );
506
-            $Message_Templates = $Message_Template_Group instanceof EE_Message_Template_Group
507
-                ? $Message_Template_Group->context_templates()
508
-                : array();
509
-            if (empty($Message_Templates)) {
510
-                EE_Error::add_error(
511
-                    esc_html__(
512
-                        'Unable to retrieve message template fields from the db. Messages not sent.',
513
-                        'event_espresso'
514
-                    ),
515
-                    __FILE__,
516
-                    __FUNCTION__,
517
-                    __LINE__
518
-                );
519
-            }
520
-            // let's just update the specific fields
521
-            foreach ($Message_Templates['attendee'] as $Message_Template) {
522
-                if ($Message_Template instanceof EE_Message_Template) {
523
-                    $field = $Message_Template->get('MTP_template_field');
524
-                    $content = $Message_Template->get('MTP_content');
525
-                    $new_content = $content;
526
-                    switch ($field) {
527
-                        case 'from':
528
-                            $new_content = ! empty($this->_req_data['batch_message']['from'])
529
-                                ? $this->_req_data['batch_message']['from']
530
-                                : $content;
531
-                            break;
532
-                        case 'subject':
533
-                            $new_content = ! empty($this->_req_data['batch_message']['subject'])
534
-                                ? $this->_req_data['batch_message']['subject']
535
-                                : $content;
536
-                            break;
537
-                        case 'content':
538
-                            $new_content = $content;
539
-                            $new_content['newsletter_content'] = ! empty($this->_req_data['batch_message']['content'])
540
-                                ? $this->_req_data['batch_message']['content']
541
-                                : $content['newsletter_content'];
542
-                            break;
543
-                        default:
544
-                            // continue the foreach loop, we don't want to set $new_content nor save.
545
-                            continue 2;
546
-                    }
547
-                    $Message_Template->set('MTP_content', $new_content);
548
-                    $Message_Template->save();
549
-                }
550
-            }
551
-            // great fields are updated!  now let's make sure we just have contact objects (EE_Attendee).
552
-            $id_type = ! empty($this->_req_data['batch_message']['id_type'])
553
-                ? $this->_req_data['batch_message']['id_type']
554
-                : 'registration';
555
-            // id_type will affect how we assemble the ids.
556
-            $ids = ! empty($this->_req_data['batch_message']['ids'])
557
-                ? json_decode(stripslashes($this->_req_data['batch_message']['ids']))
558
-                : array();
559
-            $registrations_used_for_contact_data = array();
560
-            // using switch because eventually we'll have other contexts that will be used for generating messages.
561
-            switch ($id_type) {
562
-                case 'registration':
563
-                    $registrations_used_for_contact_data = EEM_Registration::instance()->get_all(
564
-                        array(
565
-                            array(
566
-                                'REG_ID' => array('IN', $ids),
567
-                            ),
568
-                        )
569
-                    );
570
-                    break;
571
-                case 'contact':
572
-                    $registrations_used_for_contact_data = EEM_Registration::instance()
573
-                                                                           ->get_latest_registration_for_each_of_given_contacts(
574
-                                                                               $ids
575
-                                                                           );
576
-                    break;
577
-            }
578
-            do_action_ref_array(
579
-                'AHEE__Extend_Registrations_Admin_Page___newsletter_selected_send__with_registrations',
580
-                array(
581
-                    $registrations_used_for_contact_data,
582
-                    $Message_Template_Group->ID(),
583
-                )
584
-            );
585
-            // kept for backward compat, internally we no longer use this action.
586
-            // @deprecated 4.8.36.rc.002
587
-            $contacts = $id_type === 'registration'
588
-                ? EEM_Attendee::instance()->get_array_of_contacts_from_reg_ids($ids)
589
-                : EEM_Attendee::instance()->get_all(array(array('ATT_ID' => array('in', $ids))));
590
-            do_action_ref_array(
591
-                'AHEE__Extend_Registrations_Admin_Page___newsletter_selected_send',
592
-                array(
593
-                    $contacts,
594
-                    $Message_Template_Group->ID(),
595
-                )
596
-            );
597
-        }
598
-        $query_args = array(
599
-            'action' => ! empty($this->_req_data['redirect_back_to'])
600
-                ? $this->_req_data['redirect_back_to']
601
-                : 'default',
602
-        );
603
-        $this->_redirect_after_action(false, '', '', $query_args, true);
604
-    }
475
+	/**
476
+	 * Handles sending selected registrations/contacts a newsletter.
477
+	 *
478
+	 * @since  4.3.0
479
+	 * @return void
480
+	 * @throws EE_Error
481
+	 * @throws InvalidArgumentException
482
+	 * @throws InvalidDataTypeException
483
+	 * @throws InvalidInterfaceException
484
+	 */
485
+	protected function _newsletter_selected_send()
486
+	{
487
+		$success = true;
488
+		// first we need to make sure we have a GRP_ID so we know what template we're sending and updating!
489
+		if (empty($this->_req_data['newsletter_mtp_selected'])) {
490
+			EE_Error::add_error(
491
+				esc_html__(
492
+					'In order to send a message, a Message Template GRP_ID is needed. It was not provided so messages were not sent.',
493
+					'event_espresso'
494
+				),
495
+				__FILE__,
496
+				__FUNCTION__,
497
+				__LINE__
498
+			);
499
+			$success = false;
500
+		}
501
+		if ($success) {
502
+			// update Message template in case there are any changes
503
+			$Message_Template_Group = EEM_Message_Template_Group::instance()->get_one_by_ID(
504
+				$this->_req_data['newsletter_mtp_selected']
505
+			);
506
+			$Message_Templates = $Message_Template_Group instanceof EE_Message_Template_Group
507
+				? $Message_Template_Group->context_templates()
508
+				: array();
509
+			if (empty($Message_Templates)) {
510
+				EE_Error::add_error(
511
+					esc_html__(
512
+						'Unable to retrieve message template fields from the db. Messages not sent.',
513
+						'event_espresso'
514
+					),
515
+					__FILE__,
516
+					__FUNCTION__,
517
+					__LINE__
518
+				);
519
+			}
520
+			// let's just update the specific fields
521
+			foreach ($Message_Templates['attendee'] as $Message_Template) {
522
+				if ($Message_Template instanceof EE_Message_Template) {
523
+					$field = $Message_Template->get('MTP_template_field');
524
+					$content = $Message_Template->get('MTP_content');
525
+					$new_content = $content;
526
+					switch ($field) {
527
+						case 'from':
528
+							$new_content = ! empty($this->_req_data['batch_message']['from'])
529
+								? $this->_req_data['batch_message']['from']
530
+								: $content;
531
+							break;
532
+						case 'subject':
533
+							$new_content = ! empty($this->_req_data['batch_message']['subject'])
534
+								? $this->_req_data['batch_message']['subject']
535
+								: $content;
536
+							break;
537
+						case 'content':
538
+							$new_content = $content;
539
+							$new_content['newsletter_content'] = ! empty($this->_req_data['batch_message']['content'])
540
+								? $this->_req_data['batch_message']['content']
541
+								: $content['newsletter_content'];
542
+							break;
543
+						default:
544
+							// continue the foreach loop, we don't want to set $new_content nor save.
545
+							continue 2;
546
+					}
547
+					$Message_Template->set('MTP_content', $new_content);
548
+					$Message_Template->save();
549
+				}
550
+			}
551
+			// great fields are updated!  now let's make sure we just have contact objects (EE_Attendee).
552
+			$id_type = ! empty($this->_req_data['batch_message']['id_type'])
553
+				? $this->_req_data['batch_message']['id_type']
554
+				: 'registration';
555
+			// id_type will affect how we assemble the ids.
556
+			$ids = ! empty($this->_req_data['batch_message']['ids'])
557
+				? json_decode(stripslashes($this->_req_data['batch_message']['ids']))
558
+				: array();
559
+			$registrations_used_for_contact_data = array();
560
+			// using switch because eventually we'll have other contexts that will be used for generating messages.
561
+			switch ($id_type) {
562
+				case 'registration':
563
+					$registrations_used_for_contact_data = EEM_Registration::instance()->get_all(
564
+						array(
565
+							array(
566
+								'REG_ID' => array('IN', $ids),
567
+							),
568
+						)
569
+					);
570
+					break;
571
+				case 'contact':
572
+					$registrations_used_for_contact_data = EEM_Registration::instance()
573
+																		   ->get_latest_registration_for_each_of_given_contacts(
574
+																			   $ids
575
+																		   );
576
+					break;
577
+			}
578
+			do_action_ref_array(
579
+				'AHEE__Extend_Registrations_Admin_Page___newsletter_selected_send__with_registrations',
580
+				array(
581
+					$registrations_used_for_contact_data,
582
+					$Message_Template_Group->ID(),
583
+				)
584
+			);
585
+			// kept for backward compat, internally we no longer use this action.
586
+			// @deprecated 4.8.36.rc.002
587
+			$contacts = $id_type === 'registration'
588
+				? EEM_Attendee::instance()->get_array_of_contacts_from_reg_ids($ids)
589
+				: EEM_Attendee::instance()->get_all(array(array('ATT_ID' => array('in', $ids))));
590
+			do_action_ref_array(
591
+				'AHEE__Extend_Registrations_Admin_Page___newsletter_selected_send',
592
+				array(
593
+					$contacts,
594
+					$Message_Template_Group->ID(),
595
+				)
596
+			);
597
+		}
598
+		$query_args = array(
599
+			'action' => ! empty($this->_req_data['redirect_back_to'])
600
+				? $this->_req_data['redirect_back_to']
601
+				: 'default',
602
+		);
603
+		$this->_redirect_after_action(false, '', '', $query_args, true);
604
+	}
605 605
 
606 606
 
607
-    /**
608
-     * This is called when javascript is being enqueued to setup the various data needed for the reports js.
609
-     * Also $this->{$_reports_template_data} property is set for later usage by the _registration_reports method.
610
-     */
611
-    protected function _registration_reports_js_setup()
612
-    {
613
-        $this->_reports_template_data['admin_reports'][] = $this->_registrations_per_day_report();
614
-        $this->_reports_template_data['admin_reports'][] = $this->_registrations_per_event_report();
615
-    }
607
+	/**
608
+	 * This is called when javascript is being enqueued to setup the various data needed for the reports js.
609
+	 * Also $this->{$_reports_template_data} property is set for later usage by the _registration_reports method.
610
+	 */
611
+	protected function _registration_reports_js_setup()
612
+	{
613
+		$this->_reports_template_data['admin_reports'][] = $this->_registrations_per_day_report();
614
+		$this->_reports_template_data['admin_reports'][] = $this->_registrations_per_event_report();
615
+	}
616 616
 
617 617
 
618
-    /**
619
-     *        generates Business Reports regarding Registrations
620
-     *
621
-     * @access protected
622
-     * @return void
623
-     * @throws DomainException
624
-     */
625
-    protected function _registration_reports()
626
-    {
627
-        $template_path = EE_ADMIN_TEMPLATE . 'admin_reports.template.php';
628
-        $this->_template_args['admin_page_content'] = EEH_Template::display_template(
629
-            $template_path,
630
-            $this->_reports_template_data,
631
-            true
632
-        );
633
-        // the final template wrapper
634
-        $this->display_admin_page_with_no_sidebar();
635
-    }
618
+	/**
619
+	 *        generates Business Reports regarding Registrations
620
+	 *
621
+	 * @access protected
622
+	 * @return void
623
+	 * @throws DomainException
624
+	 */
625
+	protected function _registration_reports()
626
+	{
627
+		$template_path = EE_ADMIN_TEMPLATE . 'admin_reports.template.php';
628
+		$this->_template_args['admin_page_content'] = EEH_Template::display_template(
629
+			$template_path,
630
+			$this->_reports_template_data,
631
+			true
632
+		);
633
+		// the final template wrapper
634
+		$this->display_admin_page_with_no_sidebar();
635
+	}
636 636
 
637 637
 
638
-    /**
639
-     * Generates Business Report showing total registrations per day.
640
-     *
641
-     * @param string $period The period (acceptable by PHP Datetime constructor) for which the report is generated.
642
-     * @return string
643
-     * @throws EE_Error
644
-     * @throws InvalidArgumentException
645
-     * @throws InvalidDataTypeException
646
-     * @throws InvalidInterfaceException
647
-     */
648
-    private function _registrations_per_day_report($period = '-1 month')
649
-    {
650
-        $report_ID = 'reg-admin-registrations-per-day-report-dv';
651
-        $results = EEM_Registration::instance()->get_registrations_per_day_and_per_status_report($period);
652
-        $results = (array) $results;
653
-        $regs = array();
654
-        $subtitle = '';
655
-        if ($results) {
656
-            $column_titles = array();
657
-            $tracker = 0;
658
-            foreach ($results as $result) {
659
-                $report_column_values = array();
660
-                foreach ($result as $property_name => $property_value) {
661
-                    $property_value = $property_name === 'Registration_REG_date' ? $property_value
662
-                        : (int) $property_value;
663
-                    $report_column_values[] = $property_value;
664
-                    if ($tracker === 0) {
665
-                        if ($property_name === 'Registration_REG_date') {
666
-                            $column_titles[] = esc_html__(
667
-                                'Date (only days with registrations are shown)',
668
-                                'event_espresso'
669
-                            );
670
-                        } else {
671
-                            $column_titles[] = EEH_Template::pretty_status($property_name, false, 'sentence');
672
-                        }
673
-                    }
674
-                }
675
-                $tracker++;
676
-                $regs[] = $report_column_values;
677
-            }
678
-            // make sure the column_titles is pushed to the beginning of the array
679
-            array_unshift($regs, $column_titles);
680
-            // setup the date range.
681
-            $DateTimeZone = new DateTimeZone(EEH_DTT_Helper::get_timezone());
682
-            $beginning_date = new DateTime("now " . $period, $DateTimeZone);
683
-            $ending_date = new DateTime("now", $DateTimeZone);
684
-            $subtitle = sprintf(
685
-                _x('For the period: %1$s to %2$s', 'Used to give date range', 'event_espresso'),
686
-                $beginning_date->format('Y-m-d'),
687
-                $ending_date->format('Y-m-d')
688
-            );
689
-        }
690
-        $report_title = esc_html__('Total Registrations per Day', 'event_espresso');
691
-        $report_params = array(
692
-            'title'     => $report_title,
693
-            'subtitle'  => $subtitle,
694
-            'id'        => $report_ID,
695
-            'regs'      => $regs,
696
-            'noResults' => empty($regs),
697
-            'noRegsMsg' => sprintf(
698
-                esc_html__(
699
-                    '%sThere are currently no registration records in the last month for this report.%s',
700
-                    'event_espresso'
701
-                ),
702
-                '<h2>' . $report_title . '</h2><p>',
703
-                '</p>'
704
-            ),
705
-        );
706
-        wp_localize_script('ee-reg-reports-js', 'regPerDay', $report_params);
707
-        return $report_ID;
708
-    }
638
+	/**
639
+	 * Generates Business Report showing total registrations per day.
640
+	 *
641
+	 * @param string $period The period (acceptable by PHP Datetime constructor) for which the report is generated.
642
+	 * @return string
643
+	 * @throws EE_Error
644
+	 * @throws InvalidArgumentException
645
+	 * @throws InvalidDataTypeException
646
+	 * @throws InvalidInterfaceException
647
+	 */
648
+	private function _registrations_per_day_report($period = '-1 month')
649
+	{
650
+		$report_ID = 'reg-admin-registrations-per-day-report-dv';
651
+		$results = EEM_Registration::instance()->get_registrations_per_day_and_per_status_report($period);
652
+		$results = (array) $results;
653
+		$regs = array();
654
+		$subtitle = '';
655
+		if ($results) {
656
+			$column_titles = array();
657
+			$tracker = 0;
658
+			foreach ($results as $result) {
659
+				$report_column_values = array();
660
+				foreach ($result as $property_name => $property_value) {
661
+					$property_value = $property_name === 'Registration_REG_date' ? $property_value
662
+						: (int) $property_value;
663
+					$report_column_values[] = $property_value;
664
+					if ($tracker === 0) {
665
+						if ($property_name === 'Registration_REG_date') {
666
+							$column_titles[] = esc_html__(
667
+								'Date (only days with registrations are shown)',
668
+								'event_espresso'
669
+							);
670
+						} else {
671
+							$column_titles[] = EEH_Template::pretty_status($property_name, false, 'sentence');
672
+						}
673
+					}
674
+				}
675
+				$tracker++;
676
+				$regs[] = $report_column_values;
677
+			}
678
+			// make sure the column_titles is pushed to the beginning of the array
679
+			array_unshift($regs, $column_titles);
680
+			// setup the date range.
681
+			$DateTimeZone = new DateTimeZone(EEH_DTT_Helper::get_timezone());
682
+			$beginning_date = new DateTime("now " . $period, $DateTimeZone);
683
+			$ending_date = new DateTime("now", $DateTimeZone);
684
+			$subtitle = sprintf(
685
+				_x('For the period: %1$s to %2$s', 'Used to give date range', 'event_espresso'),
686
+				$beginning_date->format('Y-m-d'),
687
+				$ending_date->format('Y-m-d')
688
+			);
689
+		}
690
+		$report_title = esc_html__('Total Registrations per Day', 'event_espresso');
691
+		$report_params = array(
692
+			'title'     => $report_title,
693
+			'subtitle'  => $subtitle,
694
+			'id'        => $report_ID,
695
+			'regs'      => $regs,
696
+			'noResults' => empty($regs),
697
+			'noRegsMsg' => sprintf(
698
+				esc_html__(
699
+					'%sThere are currently no registration records in the last month for this report.%s',
700
+					'event_espresso'
701
+				),
702
+				'<h2>' . $report_title . '</h2><p>',
703
+				'</p>'
704
+			),
705
+		);
706
+		wp_localize_script('ee-reg-reports-js', 'regPerDay', $report_params);
707
+		return $report_ID;
708
+	}
709 709
 
710 710
 
711
-    /**
712
-     * Generates Business Report showing total registrations per event.
713
-     *
714
-     * @param string $period The period (acceptable by PHP Datetime constructor) for which the report is generated.
715
-     * @return string
716
-     * @throws EE_Error
717
-     * @throws InvalidArgumentException
718
-     * @throws InvalidDataTypeException
719
-     * @throws InvalidInterfaceException
720
-     */
721
-    private function _registrations_per_event_report($period = '-1 month')
722
-    {
723
-        $report_ID = 'reg-admin-registrations-per-event-report-dv';
724
-        $results = EEM_Registration::instance()->get_registrations_per_event_and_per_status_report($period);
725
-        $results = (array) $results;
726
-        $regs = array();
727
-        $subtitle = '';
728
-        if ($results) {
729
-            $column_titles = array();
730
-            $tracker = 0;
731
-            foreach ($results as $result) {
732
-                $report_column_values = array();
733
-                foreach ($result as $property_name => $property_value) {
734
-                    $property_value = $property_name === 'Registration_Event' ? wp_trim_words(
735
-                        $property_value,
736
-                        4,
737
-                        '...'
738
-                    ) : (int) $property_value;
739
-                    $report_column_values[] = $property_value;
740
-                    if ($tracker === 0) {
741
-                        if ($property_name === 'Registration_Event') {
742
-                            $column_titles[] = esc_html__('Event', 'event_espresso');
743
-                        } else {
744
-                            $column_titles[] = EEH_Template::pretty_status($property_name, false, 'sentence');
745
-                        }
746
-                    }
747
-                }
748
-                $tracker++;
749
-                $regs[] = $report_column_values;
750
-            }
751
-            // make sure the column_titles is pushed to the beginning of the array
752
-            array_unshift($regs, $column_titles);
753
-            // setup the date range.
754
-            $DateTimeZone = new DateTimeZone(EEH_DTT_Helper::get_timezone());
755
-            $beginning_date = new DateTime("now " . $period, $DateTimeZone);
756
-            $ending_date = new DateTime("now", $DateTimeZone);
757
-            $subtitle = sprintf(
758
-                _x('For the period: %1$s to %2$s', 'Used to give date range', 'event_espresso'),
759
-                $beginning_date->format('Y-m-d'),
760
-                $ending_date->format('Y-m-d')
761
-            );
762
-        }
763
-        $report_title = esc_html__('Total Registrations per Event', 'event_espresso');
764
-        $report_params = array(
765
-            'title'     => $report_title,
766
-            'subtitle'  => $subtitle,
767
-            'id'        => $report_ID,
768
-            'regs'      => $regs,
769
-            'noResults' => empty($regs),
770
-            'noRegsMsg' => sprintf(
771
-                esc_html__(
772
-                    '%sThere are currently no registration records in the last month for this report.%s',
773
-                    'event_espresso'
774
-                ),
775
-                '<h2>' . $report_title . '</h2><p>',
776
-                '</p>'
777
-            ),
778
-        );
779
-        wp_localize_script('ee-reg-reports-js', 'regPerEvent', $report_params);
780
-        return $report_ID;
781
-    }
711
+	/**
712
+	 * Generates Business Report showing total registrations per event.
713
+	 *
714
+	 * @param string $period The period (acceptable by PHP Datetime constructor) for which the report is generated.
715
+	 * @return string
716
+	 * @throws EE_Error
717
+	 * @throws InvalidArgumentException
718
+	 * @throws InvalidDataTypeException
719
+	 * @throws InvalidInterfaceException
720
+	 */
721
+	private function _registrations_per_event_report($period = '-1 month')
722
+	{
723
+		$report_ID = 'reg-admin-registrations-per-event-report-dv';
724
+		$results = EEM_Registration::instance()->get_registrations_per_event_and_per_status_report($period);
725
+		$results = (array) $results;
726
+		$regs = array();
727
+		$subtitle = '';
728
+		if ($results) {
729
+			$column_titles = array();
730
+			$tracker = 0;
731
+			foreach ($results as $result) {
732
+				$report_column_values = array();
733
+				foreach ($result as $property_name => $property_value) {
734
+					$property_value = $property_name === 'Registration_Event' ? wp_trim_words(
735
+						$property_value,
736
+						4,
737
+						'...'
738
+					) : (int) $property_value;
739
+					$report_column_values[] = $property_value;
740
+					if ($tracker === 0) {
741
+						if ($property_name === 'Registration_Event') {
742
+							$column_titles[] = esc_html__('Event', 'event_espresso');
743
+						} else {
744
+							$column_titles[] = EEH_Template::pretty_status($property_name, false, 'sentence');
745
+						}
746
+					}
747
+				}
748
+				$tracker++;
749
+				$regs[] = $report_column_values;
750
+			}
751
+			// make sure the column_titles is pushed to the beginning of the array
752
+			array_unshift($regs, $column_titles);
753
+			// setup the date range.
754
+			$DateTimeZone = new DateTimeZone(EEH_DTT_Helper::get_timezone());
755
+			$beginning_date = new DateTime("now " . $period, $DateTimeZone);
756
+			$ending_date = new DateTime("now", $DateTimeZone);
757
+			$subtitle = sprintf(
758
+				_x('For the period: %1$s to %2$s', 'Used to give date range', 'event_espresso'),
759
+				$beginning_date->format('Y-m-d'),
760
+				$ending_date->format('Y-m-d')
761
+			);
762
+		}
763
+		$report_title = esc_html__('Total Registrations per Event', 'event_espresso');
764
+		$report_params = array(
765
+			'title'     => $report_title,
766
+			'subtitle'  => $subtitle,
767
+			'id'        => $report_ID,
768
+			'regs'      => $regs,
769
+			'noResults' => empty($regs),
770
+			'noRegsMsg' => sprintf(
771
+				esc_html__(
772
+					'%sThere are currently no registration records in the last month for this report.%s',
773
+					'event_espresso'
774
+				),
775
+				'<h2>' . $report_title . '</h2><p>',
776
+				'</p>'
777
+			),
778
+		);
779
+		wp_localize_script('ee-reg-reports-js', 'regPerEvent', $report_params);
780
+		return $report_ID;
781
+	}
782 782
 
783 783
 
784
-    /**
785
-     * generates HTML for the Registration Check-in list table (showing all Check-ins for a specific registration)
786
-     *
787
-     * @access protected
788
-     * @return void
789
-     * @throws EE_Error
790
-     * @throws InvalidArgumentException
791
-     * @throws InvalidDataTypeException
792
-     * @throws InvalidInterfaceException
793
-     * @throws \EventEspresso\core\exceptions\EntityNotFoundException
794
-     */
795
-    protected function _registration_checkin_list_table()
796
-    {
797
-        do_action('AHEE_log', __FILE__, __FUNCTION__, '');
798
-        $reg_id = isset($this->_req_data['_REG_ID']) ? $this->_req_data['_REG_ID'] : null;
799
-        /** @var EE_Registration $registration */
800
-        $registration = EEM_Registration::instance()->get_one_by_ID($reg_id);
801
-        if (! $registration instanceof EE_Registration) {
802
-            throw new EE_Error(
803
-                sprintf(
804
-                    esc_html__('An error occurred. There is no registration with ID (%d)', 'event_espresso'),
805
-                    $reg_id
806
-                )
807
-            );
808
-        }
809
-        $attendee = $registration->attendee();
810
-        $this->_admin_page_title .= $this->get_action_link_or_button(
811
-            'new_registration',
812
-            'add-registrant',
813
-            array('event_id' => $registration->event_ID()),
814
-            'add-new-h2'
815
-        );
816
-        $checked_in = new CheckinStatusDashicon(EE_Checkin::status_checked_in);
817
-        $checked_out = new CheckinStatusDashicon(EE_Checkin::status_checked_out);
818
-        $legend_items = array(
819
-            'checkin'  => array(
820
-                'class' => $checked_in->cssClasses(),
821
-                'desc'  => $checked_in->legendLabel(),
822
-            ),
823
-            'checkout' => array(
824
-                'class' => $checked_out->cssClasses(),
825
-                'desc'  => $checked_out->legendLabel(),
826
-            ),
827
-        );
828
-        $this->_template_args['after_list_table'] = $this->_display_legend($legend_items);
829
-        $dtt_id = isset($this->_req_data['DTT_ID']) ? $this->_req_data['DTT_ID'] : null;
830
-        /** @var EE_Datetime $datetime */
831
-        $datetime = EEM_Datetime::instance()->get_one_by_ID($dtt_id);
832
-        $datetime_label = '';
833
-        if ($datetime instanceof EE_Datetime) {
834
-            $datetime_label = $datetime->get_dtt_display_name(true);
835
-            $datetime_label .= ! empty($datetime_label)
836
-                ? ' (' . $datetime->get_dtt_display_name() . ')'
837
-                : $datetime->get_dtt_display_name();
838
-        }
839
-        $datetime_link = ! empty($dtt_id) && $registration instanceof EE_Registration
840
-            ? EE_Admin_Page::add_query_args_and_nonce(
841
-                array(
842
-                    'action'   => 'event_registrations',
843
-                    'event_id' => $registration->event_ID(),
844
-                    'DTT_ID'   => $dtt_id,
845
-                ),
846
-                $this->_admin_base_url
847
-            )
848
-            : '';
849
-        $datetime_link = ! empty($datetime_link)
850
-            ? '<a href="' . $datetime_link . '">'
851
-              . '<span id="checkin-dtt">'
852
-              . $datetime_label
853
-              . '</span></a>'
854
-            : $datetime_label;
855
-        $attendee_name = $attendee instanceof EE_Attendee
856
-            ? $attendee->full_name()
857
-            : '';
858
-        $attendee_link = $attendee instanceof EE_Attendee
859
-            ? $attendee->get_admin_details_link()
860
-            : '';
861
-        $attendee_link = ! empty($attendee_link)
862
-            ? '<a href="' . $attendee->get_admin_details_link() . '"'
863
-              . ' title="' . esc_html__('Click for attendee details', 'event_espresso') . '">'
864
-              . '<span id="checkin-attendee-name">'
865
-              . $attendee_name
866
-              . '</span></a>'
867
-            : '';
868
-        $event_link = $registration->event() instanceof EE_Event
869
-            ? $registration->event()->get_admin_details_link()
870
-            : '';
871
-        $event_link = ! empty($event_link)
872
-            ? '<a href="' . $event_link . '"'
873
-              . ' title="' . esc_html__('Click here to edit event.', 'event_espresso') . '">'
874
-              . '<span id="checkin-event-name">'
875
-              . $registration->event_name()
876
-              . '</span>'
877
-              . '</a>'
878
-            : '';
879
-        $this->_template_args['before_list_table'] = ! empty($reg_id) && ! empty($dtt_id)
880
-            ? '<h2>' . sprintf(
881
-                esc_html__('Displaying check in records for %1$s for %2$s at the event, %3$s', 'event_espresso'),
882
-                $attendee_link,
883
-                $datetime_link,
884
-                $event_link
885
-            ) . '</h2>'
886
-            : '';
887
-        $this->_template_args['list_table_hidden_fields'] = ! empty($reg_id)
888
-            ? '<input type="hidden" name="_REG_ID" value="' . $reg_id . '">' : '';
889
-        $this->_template_args['list_table_hidden_fields'] .= ! empty($dtt_id)
890
-            ? '<input type="hidden" name="DTT_ID" value="' . $dtt_id . '">' : '';
891
-        $this->display_admin_list_table_page_with_no_sidebar();
892
-    }
784
+	/**
785
+	 * generates HTML for the Registration Check-in list table (showing all Check-ins for a specific registration)
786
+	 *
787
+	 * @access protected
788
+	 * @return void
789
+	 * @throws EE_Error
790
+	 * @throws InvalidArgumentException
791
+	 * @throws InvalidDataTypeException
792
+	 * @throws InvalidInterfaceException
793
+	 * @throws \EventEspresso\core\exceptions\EntityNotFoundException
794
+	 */
795
+	protected function _registration_checkin_list_table()
796
+	{
797
+		do_action('AHEE_log', __FILE__, __FUNCTION__, '');
798
+		$reg_id = isset($this->_req_data['_REG_ID']) ? $this->_req_data['_REG_ID'] : null;
799
+		/** @var EE_Registration $registration */
800
+		$registration = EEM_Registration::instance()->get_one_by_ID($reg_id);
801
+		if (! $registration instanceof EE_Registration) {
802
+			throw new EE_Error(
803
+				sprintf(
804
+					esc_html__('An error occurred. There is no registration with ID (%d)', 'event_espresso'),
805
+					$reg_id
806
+				)
807
+			);
808
+		}
809
+		$attendee = $registration->attendee();
810
+		$this->_admin_page_title .= $this->get_action_link_or_button(
811
+			'new_registration',
812
+			'add-registrant',
813
+			array('event_id' => $registration->event_ID()),
814
+			'add-new-h2'
815
+		);
816
+		$checked_in = new CheckinStatusDashicon(EE_Checkin::status_checked_in);
817
+		$checked_out = new CheckinStatusDashicon(EE_Checkin::status_checked_out);
818
+		$legend_items = array(
819
+			'checkin'  => array(
820
+				'class' => $checked_in->cssClasses(),
821
+				'desc'  => $checked_in->legendLabel(),
822
+			),
823
+			'checkout' => array(
824
+				'class' => $checked_out->cssClasses(),
825
+				'desc'  => $checked_out->legendLabel(),
826
+			),
827
+		);
828
+		$this->_template_args['after_list_table'] = $this->_display_legend($legend_items);
829
+		$dtt_id = isset($this->_req_data['DTT_ID']) ? $this->_req_data['DTT_ID'] : null;
830
+		/** @var EE_Datetime $datetime */
831
+		$datetime = EEM_Datetime::instance()->get_one_by_ID($dtt_id);
832
+		$datetime_label = '';
833
+		if ($datetime instanceof EE_Datetime) {
834
+			$datetime_label = $datetime->get_dtt_display_name(true);
835
+			$datetime_label .= ! empty($datetime_label)
836
+				? ' (' . $datetime->get_dtt_display_name() . ')'
837
+				: $datetime->get_dtt_display_name();
838
+		}
839
+		$datetime_link = ! empty($dtt_id) && $registration instanceof EE_Registration
840
+			? EE_Admin_Page::add_query_args_and_nonce(
841
+				array(
842
+					'action'   => 'event_registrations',
843
+					'event_id' => $registration->event_ID(),
844
+					'DTT_ID'   => $dtt_id,
845
+				),
846
+				$this->_admin_base_url
847
+			)
848
+			: '';
849
+		$datetime_link = ! empty($datetime_link)
850
+			? '<a href="' . $datetime_link . '">'
851
+			  . '<span id="checkin-dtt">'
852
+			  . $datetime_label
853
+			  . '</span></a>'
854
+			: $datetime_label;
855
+		$attendee_name = $attendee instanceof EE_Attendee
856
+			? $attendee->full_name()
857
+			: '';
858
+		$attendee_link = $attendee instanceof EE_Attendee
859
+			? $attendee->get_admin_details_link()
860
+			: '';
861
+		$attendee_link = ! empty($attendee_link)
862
+			? '<a href="' . $attendee->get_admin_details_link() . '"'
863
+			  . ' title="' . esc_html__('Click for attendee details', 'event_espresso') . '">'
864
+			  . '<span id="checkin-attendee-name">'
865
+			  . $attendee_name
866
+			  . '</span></a>'
867
+			: '';
868
+		$event_link = $registration->event() instanceof EE_Event
869
+			? $registration->event()->get_admin_details_link()
870
+			: '';
871
+		$event_link = ! empty($event_link)
872
+			? '<a href="' . $event_link . '"'
873
+			  . ' title="' . esc_html__('Click here to edit event.', 'event_espresso') . '">'
874
+			  . '<span id="checkin-event-name">'
875
+			  . $registration->event_name()
876
+			  . '</span>'
877
+			  . '</a>'
878
+			: '';
879
+		$this->_template_args['before_list_table'] = ! empty($reg_id) && ! empty($dtt_id)
880
+			? '<h2>' . sprintf(
881
+				esc_html__('Displaying check in records for %1$s for %2$s at the event, %3$s', 'event_espresso'),
882
+				$attendee_link,
883
+				$datetime_link,
884
+				$event_link
885
+			) . '</h2>'
886
+			: '';
887
+		$this->_template_args['list_table_hidden_fields'] = ! empty($reg_id)
888
+			? '<input type="hidden" name="_REG_ID" value="' . $reg_id . '">' : '';
889
+		$this->_template_args['list_table_hidden_fields'] .= ! empty($dtt_id)
890
+			? '<input type="hidden" name="DTT_ID" value="' . $dtt_id . '">' : '';
891
+		$this->display_admin_list_table_page_with_no_sidebar();
892
+	}
893 893
 
894 894
 
895
-    /**
896
-     * toggle the Check-in status for the given registration (coming from ajax)
897
-     *
898
-     * @return void (JSON)
899
-     * @throws EE_Error
900
-     * @throws InvalidArgumentException
901
-     * @throws InvalidDataTypeException
902
-     * @throws InvalidInterfaceException
903
-     */
904
-    public function toggle_checkin_status()
905
-    {
906
-        // first make sure we have the necessary data
907
-        if (! isset($this->_req_data['_regid'])) {
908
-            EE_Error::add_error(
909
-                esc_html__(
910
-                    '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',
911
-                    'event_espresso'
912
-                ),
913
-                __FILE__,
914
-                __FUNCTION__,
915
-                __LINE__
916
-            );
917
-            $this->_template_args['success'] = false;
918
-            $this->_template_args['error'] = true;
919
-            $this->_return_json();
920
-        };
921
-        // do a nonce check cause we're not coming in from an normal route here.
922
-        $nonce = isset($this->_req_data['checkinnonce']) ? sanitize_text_field($this->_req_data['checkinnonce'])
923
-            : '';
924
-        $nonce_ref = 'checkin_nonce';
925
-        $this->_verify_nonce($nonce, $nonce_ref);
926
-        // beautiful! Made it this far so let's get the status.
927
-        $new_status = new CheckinStatusDashicon($this->_toggle_checkin_status());
928
-        // setup new class to return via ajax
929
-        $this->_template_args['admin_page_content'] = 'clickable trigger-checkin ' . $new_status->cssClasses();
930
-        $this->_template_args['success'] = true;
931
-        $this->_return_json();
932
-    }
895
+	/**
896
+	 * toggle the Check-in status for the given registration (coming from ajax)
897
+	 *
898
+	 * @return void (JSON)
899
+	 * @throws EE_Error
900
+	 * @throws InvalidArgumentException
901
+	 * @throws InvalidDataTypeException
902
+	 * @throws InvalidInterfaceException
903
+	 */
904
+	public function toggle_checkin_status()
905
+	{
906
+		// first make sure we have the necessary data
907
+		if (! isset($this->_req_data['_regid'])) {
908
+			EE_Error::add_error(
909
+				esc_html__(
910
+					'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',
911
+					'event_espresso'
912
+				),
913
+				__FILE__,
914
+				__FUNCTION__,
915
+				__LINE__
916
+			);
917
+			$this->_template_args['success'] = false;
918
+			$this->_template_args['error'] = true;
919
+			$this->_return_json();
920
+		};
921
+		// do a nonce check cause we're not coming in from an normal route here.
922
+		$nonce = isset($this->_req_data['checkinnonce']) ? sanitize_text_field($this->_req_data['checkinnonce'])
923
+			: '';
924
+		$nonce_ref = 'checkin_nonce';
925
+		$this->_verify_nonce($nonce, $nonce_ref);
926
+		// beautiful! Made it this far so let's get the status.
927
+		$new_status = new CheckinStatusDashicon($this->_toggle_checkin_status());
928
+		// setup new class to return via ajax
929
+		$this->_template_args['admin_page_content'] = 'clickable trigger-checkin ' . $new_status->cssClasses();
930
+		$this->_template_args['success'] = true;
931
+		$this->_return_json();
932
+	}
933 933
 
934 934
 
935
-    /**
936
-     * handles toggling the checkin status for the registration,
937
-     *
938
-     * @access protected
939
-     * @return int|void
940
-     * @throws EE_Error
941
-     * @throws InvalidArgumentException
942
-     * @throws InvalidDataTypeException
943
-     * @throws InvalidInterfaceException
944
-     */
945
-    protected function _toggle_checkin_status()
946
-    {
947
-        // first let's get the query args out of the way for the redirect
948
-        $query_args = array(
949
-            'action'   => 'event_registrations',
950
-            'event_id' => isset($this->_req_data['event_id']) ? $this->_req_data['event_id'] : null,
951
-            'DTT_ID'   => isset($this->_req_data['DTT_ID']) ? $this->_req_data['DTT_ID'] : null,
952
-        );
953
-        $new_status = false;
954
-        // bulk action check in toggle
955
-        if (! empty($this->_req_data['checkbox']) && is_array($this->_req_data['checkbox'])) {
956
-            // cycle thru checkboxes
957
-            while (list($REG_ID, $value) = each($this->_req_data['checkbox'])) {
958
-                $DTT_ID = isset($this->_req_data['DTT_ID']) ? $this->_req_data['DTT_ID'] : null;
959
-                $new_status = $this->_toggle_checkin($REG_ID, $DTT_ID);
960
-            }
961
-        } elseif (isset($this->_req_data['_regid'])) {
962
-            // coming from ajax request
963
-            $DTT_ID = isset($this->_req_data['dttid']) ? $this->_req_data['dttid'] : null;
964
-            $query_args['DTT_ID'] = $DTT_ID;
965
-            $new_status = $this->_toggle_checkin($this->_req_data['_regid'], $DTT_ID);
966
-        } else {
967
-            EE_Error::add_error(
968
-                esc_html__('Missing some required data to toggle the Check-in', 'event_espresso'),
969
-                __FILE__,
970
-                __FUNCTION__,
971
-                __LINE__
972
-            );
973
-        }
974
-        if (defined('DOING_AJAX')) {
975
-            return $new_status;
976
-        }
977
-        $this->_redirect_after_action(false, '', '', $query_args, true);
978
-    }
935
+	/**
936
+	 * handles toggling the checkin status for the registration,
937
+	 *
938
+	 * @access protected
939
+	 * @return int|void
940
+	 * @throws EE_Error
941
+	 * @throws InvalidArgumentException
942
+	 * @throws InvalidDataTypeException
943
+	 * @throws InvalidInterfaceException
944
+	 */
945
+	protected function _toggle_checkin_status()
946
+	{
947
+		// first let's get the query args out of the way for the redirect
948
+		$query_args = array(
949
+			'action'   => 'event_registrations',
950
+			'event_id' => isset($this->_req_data['event_id']) ? $this->_req_data['event_id'] : null,
951
+			'DTT_ID'   => isset($this->_req_data['DTT_ID']) ? $this->_req_data['DTT_ID'] : null,
952
+		);
953
+		$new_status = false;
954
+		// bulk action check in toggle
955
+		if (! empty($this->_req_data['checkbox']) && is_array($this->_req_data['checkbox'])) {
956
+			// cycle thru checkboxes
957
+			while (list($REG_ID, $value) = each($this->_req_data['checkbox'])) {
958
+				$DTT_ID = isset($this->_req_data['DTT_ID']) ? $this->_req_data['DTT_ID'] : null;
959
+				$new_status = $this->_toggle_checkin($REG_ID, $DTT_ID);
960
+			}
961
+		} elseif (isset($this->_req_data['_regid'])) {
962
+			// coming from ajax request
963
+			$DTT_ID = isset($this->_req_data['dttid']) ? $this->_req_data['dttid'] : null;
964
+			$query_args['DTT_ID'] = $DTT_ID;
965
+			$new_status = $this->_toggle_checkin($this->_req_data['_regid'], $DTT_ID);
966
+		} else {
967
+			EE_Error::add_error(
968
+				esc_html__('Missing some required data to toggle the Check-in', 'event_espresso'),
969
+				__FILE__,
970
+				__FUNCTION__,
971
+				__LINE__
972
+			);
973
+		}
974
+		if (defined('DOING_AJAX')) {
975
+			return $new_status;
976
+		}
977
+		$this->_redirect_after_action(false, '', '', $query_args, true);
978
+	}
979 979
 
980 980
 
981
-    /**
982
-     * This is toggles a single Check-in for the given registration and datetime.
983
-     *
984
-     * @param  int $REG_ID The registration we're toggling
985
-     * @param  int $DTT_ID The datetime we're toggling
986
-     * @return int The new status toggled to.
987
-     * @throws EE_Error
988
-     * @throws InvalidArgumentException
989
-     * @throws InvalidDataTypeException
990
-     * @throws InvalidInterfaceException
991
-     */
992
-    private function _toggle_checkin($REG_ID, $DTT_ID)
993
-    {
994
-        /** @var EE_Registration $REG */
995
-        $REG = EEM_Registration::instance()->get_one_by_ID($REG_ID);
996
-        $new_status = $REG->toggle_checkin_status($DTT_ID);
997
-        if ($new_status !== false) {
998
-            EE_Error::add_success($REG->get_checkin_msg($DTT_ID));
999
-        } else {
1000
-            EE_Error::add_error($REG->get_checkin_msg($DTT_ID, true), __FILE__, __FUNCTION__, __LINE__);
1001
-            $new_status = false;
1002
-        }
1003
-        return $new_status;
1004
-    }
981
+	/**
982
+	 * This is toggles a single Check-in for the given registration and datetime.
983
+	 *
984
+	 * @param  int $REG_ID The registration we're toggling
985
+	 * @param  int $DTT_ID The datetime we're toggling
986
+	 * @return int The new status toggled to.
987
+	 * @throws EE_Error
988
+	 * @throws InvalidArgumentException
989
+	 * @throws InvalidDataTypeException
990
+	 * @throws InvalidInterfaceException
991
+	 */
992
+	private function _toggle_checkin($REG_ID, $DTT_ID)
993
+	{
994
+		/** @var EE_Registration $REG */
995
+		$REG = EEM_Registration::instance()->get_one_by_ID($REG_ID);
996
+		$new_status = $REG->toggle_checkin_status($DTT_ID);
997
+		if ($new_status !== false) {
998
+			EE_Error::add_success($REG->get_checkin_msg($DTT_ID));
999
+		} else {
1000
+			EE_Error::add_error($REG->get_checkin_msg($DTT_ID, true), __FILE__, __FUNCTION__, __LINE__);
1001
+			$new_status = false;
1002
+		}
1003
+		return $new_status;
1004
+	}
1005 1005
 
1006 1006
 
1007
-    /**
1008
-     * Takes care of deleting multiple EE_Checkin table rows
1009
-     *
1010
-     * @access protected
1011
-     * @return void
1012
-     * @throws EE_Error
1013
-     * @throws InvalidArgumentException
1014
-     * @throws InvalidDataTypeException
1015
-     * @throws InvalidInterfaceException
1016
-     */
1017
-    protected function _delete_checkin_rows()
1018
-    {
1019
-        $query_args = array(
1020
-            'action'  => 'registration_checkins',
1021
-            'DTT_ID'  => isset($this->_req_data['DTT_ID']) ? $this->_req_data['DTT_ID'] : 0,
1022
-            '_REG_ID' => isset($this->_req_data['_REG_ID']) ? $this->_req_data['_REG_ID'] : 0,
1023
-        );
1024
-        $errors = 0;
1025
-        if (! empty($this->_req_data['checkbox']) && is_array($this->_req_data['checkbox'])) {
1026
-            while (list($CHK_ID, $value) = each($this->_req_data['checkbox'])) {
1027
-                if (! EEM_Checkin::instance()->delete_by_ID($CHK_ID)) {
1028
-                    $errors++;
1029
-                }
1030
-            }
1031
-        } else {
1032
-            EE_Error::add_error(
1033
-                esc_html__(
1034
-                    'So, something went wrong with the bulk delete because there was no data received for instructions on WHAT to delete!',
1035
-                    'event_espresso'
1036
-                ),
1037
-                __FILE__,
1038
-                __FUNCTION__,
1039
-                __LINE__
1040
-            );
1041
-            $this->_redirect_after_action(false, '', '', $query_args, true);
1042
-        }
1043
-        if ($errors > 0) {
1044
-            EE_Error::add_error(
1045
-                sprintf(__('There were %d records that did not delete successfully', 'event_espresso'), $errors),
1046
-                __FILE__,
1047
-                __FUNCTION__,
1048
-                __LINE__
1049
-            );
1050
-        } else {
1051
-            EE_Error::add_success(__('Records were successfully deleted', 'event_espresso'));
1052
-        }
1053
-        $this->_redirect_after_action(false, '', '', $query_args, true);
1054
-    }
1007
+	/**
1008
+	 * Takes care of deleting multiple EE_Checkin table rows
1009
+	 *
1010
+	 * @access protected
1011
+	 * @return void
1012
+	 * @throws EE_Error
1013
+	 * @throws InvalidArgumentException
1014
+	 * @throws InvalidDataTypeException
1015
+	 * @throws InvalidInterfaceException
1016
+	 */
1017
+	protected function _delete_checkin_rows()
1018
+	{
1019
+		$query_args = array(
1020
+			'action'  => 'registration_checkins',
1021
+			'DTT_ID'  => isset($this->_req_data['DTT_ID']) ? $this->_req_data['DTT_ID'] : 0,
1022
+			'_REG_ID' => isset($this->_req_data['_REG_ID']) ? $this->_req_data['_REG_ID'] : 0,
1023
+		);
1024
+		$errors = 0;
1025
+		if (! empty($this->_req_data['checkbox']) && is_array($this->_req_data['checkbox'])) {
1026
+			while (list($CHK_ID, $value) = each($this->_req_data['checkbox'])) {
1027
+				if (! EEM_Checkin::instance()->delete_by_ID($CHK_ID)) {
1028
+					$errors++;
1029
+				}
1030
+			}
1031
+		} else {
1032
+			EE_Error::add_error(
1033
+				esc_html__(
1034
+					'So, something went wrong with the bulk delete because there was no data received for instructions on WHAT to delete!',
1035
+					'event_espresso'
1036
+				),
1037
+				__FILE__,
1038
+				__FUNCTION__,
1039
+				__LINE__
1040
+			);
1041
+			$this->_redirect_after_action(false, '', '', $query_args, true);
1042
+		}
1043
+		if ($errors > 0) {
1044
+			EE_Error::add_error(
1045
+				sprintf(__('There were %d records that did not delete successfully', 'event_espresso'), $errors),
1046
+				__FILE__,
1047
+				__FUNCTION__,
1048
+				__LINE__
1049
+			);
1050
+		} else {
1051
+			EE_Error::add_success(__('Records were successfully deleted', 'event_espresso'));
1052
+		}
1053
+		$this->_redirect_after_action(false, '', '', $query_args, true);
1054
+	}
1055 1055
 
1056 1056
 
1057
-    /**
1058
-     * Deletes a single EE_Checkin row
1059
-     *
1060
-     * @return void
1061
-     * @throws EE_Error
1062
-     * @throws InvalidArgumentException
1063
-     * @throws InvalidDataTypeException
1064
-     * @throws InvalidInterfaceException
1065
-     */
1066
-    protected function _delete_checkin_row()
1067
-    {
1068
-        $query_args = array(
1069
-            'action'  => 'registration_checkins',
1070
-            'DTT_ID'  => isset($this->_req_data['DTT_ID']) ? $this->_req_data['DTT_ID'] : 0,
1071
-            '_REG_ID' => isset($this->_req_data['_REG_ID']) ? $this->_req_data['_REG_ID'] : 0,
1072
-        );
1073
-        if (! empty($this->_req_data['CHK_ID'])) {
1074
-            if (! EEM_Checkin::instance()->delete_by_ID($this->_req_data['CHK_ID'])) {
1075
-                EE_Error::add_error(
1076
-                    esc_html__('Something went wrong and this check-in record was not deleted', 'event_espresso'),
1077
-                    __FILE__,
1078
-                    __FUNCTION__,
1079
-                    __LINE__
1080
-                );
1081
-            } else {
1082
-                EE_Error::add_success(__('Check-In record successfully deleted', 'event_espresso'));
1083
-            }
1084
-        } else {
1085
-            EE_Error::add_error(
1086
-                esc_html__(
1087
-                    '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',
1088
-                    'event_espresso'
1089
-                ),
1090
-                __FILE__,
1091
-                __FUNCTION__,
1092
-                __LINE__
1093
-            );
1094
-        }
1095
-        $this->_redirect_after_action(false, '', '', $query_args, true);
1096
-    }
1057
+	/**
1058
+	 * Deletes a single EE_Checkin row
1059
+	 *
1060
+	 * @return void
1061
+	 * @throws EE_Error
1062
+	 * @throws InvalidArgumentException
1063
+	 * @throws InvalidDataTypeException
1064
+	 * @throws InvalidInterfaceException
1065
+	 */
1066
+	protected function _delete_checkin_row()
1067
+	{
1068
+		$query_args = array(
1069
+			'action'  => 'registration_checkins',
1070
+			'DTT_ID'  => isset($this->_req_data['DTT_ID']) ? $this->_req_data['DTT_ID'] : 0,
1071
+			'_REG_ID' => isset($this->_req_data['_REG_ID']) ? $this->_req_data['_REG_ID'] : 0,
1072
+		);
1073
+		if (! empty($this->_req_data['CHK_ID'])) {
1074
+			if (! EEM_Checkin::instance()->delete_by_ID($this->_req_data['CHK_ID'])) {
1075
+				EE_Error::add_error(
1076
+					esc_html__('Something went wrong and this check-in record was not deleted', 'event_espresso'),
1077
+					__FILE__,
1078
+					__FUNCTION__,
1079
+					__LINE__
1080
+				);
1081
+			} else {
1082
+				EE_Error::add_success(__('Check-In record successfully deleted', 'event_espresso'));
1083
+			}
1084
+		} else {
1085
+			EE_Error::add_error(
1086
+				esc_html__(
1087
+					'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',
1088
+					'event_espresso'
1089
+				),
1090
+				__FILE__,
1091
+				__FUNCTION__,
1092
+				__LINE__
1093
+			);
1094
+		}
1095
+		$this->_redirect_after_action(false, '', '', $query_args, true);
1096
+	}
1097 1097
 
1098 1098
 
1099
-    /**
1100
-     *        generates HTML for the Event Registrations List Table
1101
-     *
1102
-     * @access protected
1103
-     * @return void
1104
-     * @throws EE_Error
1105
-     * @throws InvalidArgumentException
1106
-     * @throws InvalidDataTypeException
1107
-     * @throws InvalidInterfaceException
1108
-     */
1109
-    protected function _event_registrations_list_table()
1110
-    {
1111
-        do_action('AHEE_log', __FILE__, __FUNCTION__, '');
1112
-        $this->_admin_page_title .= isset($this->_req_data['event_id'])
1113
-            ? $this->get_action_link_or_button(
1114
-                'new_registration',
1115
-                'add-registrant',
1116
-                array('event_id' => $this->_req_data['event_id']),
1117
-                'add-new-h2',
1118
-                '',
1119
-                false
1120
-            )
1121
-            : '';
1122
-        $checked_in = new CheckinStatusDashicon(EE_Checkin::status_checked_in);
1123
-        $checked_out = new CheckinStatusDashicon(EE_Checkin::status_checked_out);
1124
-        $checked_never = new CheckinStatusDashicon(EE_Checkin::status_checked_never);
1125
-        $legend_items = array(
1126
-            'star-icon'        => array(
1127
-                'class' => 'dashicons dashicons-star-filled yellow-icon ee-icon-size-8',
1128
-                'desc'  => esc_html__('This Registrant is the Primary Registrant', 'event_espresso'),
1129
-            ),
1130
-            'checkin'          => array(
1131
-                'class' => $checked_in->cssClasses(),
1132
-                'desc'  => $checked_in->legendLabel(),
1133
-            ),
1134
-            'checkout'         => array(
1135
-                'class' => $checked_out->cssClasses(),
1136
-                'desc'  => $checked_out->legendLabel(),
1137
-            ),
1138
-            'nocheckinrecord'  => array(
1139
-                'class' => $checked_never->cssClasses(),
1140
-                'desc'  => $checked_never->legendLabel(),
1141
-            ),
1142
-            'approved_status'  => array(
1143
-                'class' => 'ee-status-legend ee-status-legend-' . EEM_Registration::status_id_approved,
1144
-                'desc'  => EEH_Template::pretty_status(EEM_Registration::status_id_approved, false, 'sentence'),
1145
-            ),
1146
-            'cancelled_status' => array(
1147
-                'class' => 'ee-status-legend ee-status-legend-' . EEM_Registration::status_id_cancelled,
1148
-                'desc'  => EEH_Template::pretty_status(EEM_Registration::status_id_cancelled, false, 'sentence'),
1149
-            ),
1150
-            'declined_status'  => array(
1151
-                'class' => 'ee-status-legend ee-status-legend-' . EEM_Registration::status_id_declined,
1152
-                'desc'  => EEH_Template::pretty_status(EEM_Registration::status_id_declined, false, 'sentence'),
1153
-            ),
1154
-            'not_approved'     => array(
1155
-                'class' => 'ee-status-legend ee-status-legend-' . EEM_Registration::status_id_not_approved,
1156
-                'desc'  => EEH_Template::pretty_status(EEM_Registration::status_id_not_approved, false, 'sentence'),
1157
-            ),
1158
-            'pending_status'   => array(
1159
-                'class' => 'ee-status-legend ee-status-legend-' . EEM_Registration::status_id_pending_payment,
1160
-                'desc'  => EEH_Template::pretty_status(EEM_Registration::status_id_pending_payment, false, 'sentence'),
1161
-            ),
1162
-            'wait_list'        => array(
1163
-                'class' => 'ee-status-legend ee-status-legend-' . EEM_Registration::status_id_wait_list,
1164
-                'desc'  => EEH_Template::pretty_status(EEM_Registration::status_id_wait_list, false, 'sentence'),
1165
-            ),
1166
-        );
1167
-        $this->_template_args['after_list_table'] = $this->_display_legend($legend_items);
1168
-        $event_id = isset($this->_req_data['event_id']) ? $this->_req_data['event_id'] : null;
1169
-        /** @var EE_Event $event */
1170
-        $event = EEM_Event::instance()->get_one_by_ID($event_id);
1171
-        $this->_template_args['before_list_table'] = $event instanceof EE_Event
1172
-            ? '<h2>' . sprintf(
1173
-                esc_html__('Viewing Registrations for Event: %s', 'event_espresso'),
1174
-                EEM_Event::instance()->get_one_by_ID($event_id)->get('EVT_name')
1175
-            ) . '</h2>'
1176
-            : '';
1177
-        // need to get the number of datetimes on the event and set default datetime_id if there is only one datetime on
1178
-        // the event.
1179
-        $DTT_ID = ! empty($this->_req_data['DTT_ID']) ? absint($this->_req_data['DTT_ID']) : 0;
1180
-        $datetime = null;
1181
-        if ($event instanceof EE_Event) {
1182
-            $datetimes_on_event = $event->datetimes();
1183
-            if (count($datetimes_on_event) === 1) {
1184
-                $datetime = reset($datetimes_on_event);
1185
-            }
1186
-        }
1187
-        $datetime = $datetime instanceof EE_Datetime ? $datetime : EEM_Datetime::instance()->get_one_by_ID($DTT_ID);
1188
-        if ($datetime instanceof EE_Datetime && $this->_template_args['before_list_table'] !== '') {
1189
-            $this->_template_args['before_list_table'] = substr($this->_template_args['before_list_table'], 0, -5);
1190
-            $this->_template_args['before_list_table'] .= ' &nbsp;<span class="drk-grey-text">';
1191
-            $this->_template_args['before_list_table'] .= '<span class="dashicons dashicons-calendar"></span>';
1192
-            $this->_template_args['before_list_table'] .= $datetime->name();
1193
-            $this->_template_args['before_list_table'] .= ' ( ' . $datetime->date_and_time_range() . ' )';
1194
-            $this->_template_args['before_list_table'] .= '</span></h2>';
1195
-        }
1196
-        // if no datetime, then we're on the initial view, so let's give some helpful instructions on what the status
1197
-        // column represents
1198
-        if (! $datetime instanceof EE_Datetime) {
1199
-            $this->_template_args['before_list_table'] .= '<br><p class="description">'
1200
-                                                          . esc_html__(
1201
-                                                              'In this view, the check-in status represents the latest check-in record for the registration in that row.',
1202
-                                                              'event_espresso'
1203
-                                                          )
1204
-                                                          . '</p>';
1205
-        }
1206
-        $this->display_admin_list_table_page_with_no_sidebar();
1207
-    }
1099
+	/**
1100
+	 *        generates HTML for the Event Registrations List Table
1101
+	 *
1102
+	 * @access protected
1103
+	 * @return void
1104
+	 * @throws EE_Error
1105
+	 * @throws InvalidArgumentException
1106
+	 * @throws InvalidDataTypeException
1107
+	 * @throws InvalidInterfaceException
1108
+	 */
1109
+	protected function _event_registrations_list_table()
1110
+	{
1111
+		do_action('AHEE_log', __FILE__, __FUNCTION__, '');
1112
+		$this->_admin_page_title .= isset($this->_req_data['event_id'])
1113
+			? $this->get_action_link_or_button(
1114
+				'new_registration',
1115
+				'add-registrant',
1116
+				array('event_id' => $this->_req_data['event_id']),
1117
+				'add-new-h2',
1118
+				'',
1119
+				false
1120
+			)
1121
+			: '';
1122
+		$checked_in = new CheckinStatusDashicon(EE_Checkin::status_checked_in);
1123
+		$checked_out = new CheckinStatusDashicon(EE_Checkin::status_checked_out);
1124
+		$checked_never = new CheckinStatusDashicon(EE_Checkin::status_checked_never);
1125
+		$legend_items = array(
1126
+			'star-icon'        => array(
1127
+				'class' => 'dashicons dashicons-star-filled yellow-icon ee-icon-size-8',
1128
+				'desc'  => esc_html__('This Registrant is the Primary Registrant', 'event_espresso'),
1129
+			),
1130
+			'checkin'          => array(
1131
+				'class' => $checked_in->cssClasses(),
1132
+				'desc'  => $checked_in->legendLabel(),
1133
+			),
1134
+			'checkout'         => array(
1135
+				'class' => $checked_out->cssClasses(),
1136
+				'desc'  => $checked_out->legendLabel(),
1137
+			),
1138
+			'nocheckinrecord'  => array(
1139
+				'class' => $checked_never->cssClasses(),
1140
+				'desc'  => $checked_never->legendLabel(),
1141
+			),
1142
+			'approved_status'  => array(
1143
+				'class' => 'ee-status-legend ee-status-legend-' . EEM_Registration::status_id_approved,
1144
+				'desc'  => EEH_Template::pretty_status(EEM_Registration::status_id_approved, false, 'sentence'),
1145
+			),
1146
+			'cancelled_status' => array(
1147
+				'class' => 'ee-status-legend ee-status-legend-' . EEM_Registration::status_id_cancelled,
1148
+				'desc'  => EEH_Template::pretty_status(EEM_Registration::status_id_cancelled, false, 'sentence'),
1149
+			),
1150
+			'declined_status'  => array(
1151
+				'class' => 'ee-status-legend ee-status-legend-' . EEM_Registration::status_id_declined,
1152
+				'desc'  => EEH_Template::pretty_status(EEM_Registration::status_id_declined, false, 'sentence'),
1153
+			),
1154
+			'not_approved'     => array(
1155
+				'class' => 'ee-status-legend ee-status-legend-' . EEM_Registration::status_id_not_approved,
1156
+				'desc'  => EEH_Template::pretty_status(EEM_Registration::status_id_not_approved, false, 'sentence'),
1157
+			),
1158
+			'pending_status'   => array(
1159
+				'class' => 'ee-status-legend ee-status-legend-' . EEM_Registration::status_id_pending_payment,
1160
+				'desc'  => EEH_Template::pretty_status(EEM_Registration::status_id_pending_payment, false, 'sentence'),
1161
+			),
1162
+			'wait_list'        => array(
1163
+				'class' => 'ee-status-legend ee-status-legend-' . EEM_Registration::status_id_wait_list,
1164
+				'desc'  => EEH_Template::pretty_status(EEM_Registration::status_id_wait_list, false, 'sentence'),
1165
+			),
1166
+		);
1167
+		$this->_template_args['after_list_table'] = $this->_display_legend($legend_items);
1168
+		$event_id = isset($this->_req_data['event_id']) ? $this->_req_data['event_id'] : null;
1169
+		/** @var EE_Event $event */
1170
+		$event = EEM_Event::instance()->get_one_by_ID($event_id);
1171
+		$this->_template_args['before_list_table'] = $event instanceof EE_Event
1172
+			? '<h2>' . sprintf(
1173
+				esc_html__('Viewing Registrations for Event: %s', 'event_espresso'),
1174
+				EEM_Event::instance()->get_one_by_ID($event_id)->get('EVT_name')
1175
+			) . '</h2>'
1176
+			: '';
1177
+		// need to get the number of datetimes on the event and set default datetime_id if there is only one datetime on
1178
+		// the event.
1179
+		$DTT_ID = ! empty($this->_req_data['DTT_ID']) ? absint($this->_req_data['DTT_ID']) : 0;
1180
+		$datetime = null;
1181
+		if ($event instanceof EE_Event) {
1182
+			$datetimes_on_event = $event->datetimes();
1183
+			if (count($datetimes_on_event) === 1) {
1184
+				$datetime = reset($datetimes_on_event);
1185
+			}
1186
+		}
1187
+		$datetime = $datetime instanceof EE_Datetime ? $datetime : EEM_Datetime::instance()->get_one_by_ID($DTT_ID);
1188
+		if ($datetime instanceof EE_Datetime && $this->_template_args['before_list_table'] !== '') {
1189
+			$this->_template_args['before_list_table'] = substr($this->_template_args['before_list_table'], 0, -5);
1190
+			$this->_template_args['before_list_table'] .= ' &nbsp;<span class="drk-grey-text">';
1191
+			$this->_template_args['before_list_table'] .= '<span class="dashicons dashicons-calendar"></span>';
1192
+			$this->_template_args['before_list_table'] .= $datetime->name();
1193
+			$this->_template_args['before_list_table'] .= ' ( ' . $datetime->date_and_time_range() . ' )';
1194
+			$this->_template_args['before_list_table'] .= '</span></h2>';
1195
+		}
1196
+		// if no datetime, then we're on the initial view, so let's give some helpful instructions on what the status
1197
+		// column represents
1198
+		if (! $datetime instanceof EE_Datetime) {
1199
+			$this->_template_args['before_list_table'] .= '<br><p class="description">'
1200
+														  . esc_html__(
1201
+															  'In this view, the check-in status represents the latest check-in record for the registration in that row.',
1202
+															  'event_espresso'
1203
+														  )
1204
+														  . '</p>';
1205
+		}
1206
+		$this->display_admin_list_table_page_with_no_sidebar();
1207
+	}
1208 1208
 
1209
-    /**
1210
-     * Download the registrations check-in report (same as the normal registration report, but with different where
1211
-     * conditions)
1212
-     *
1213
-     * @return void ends the request by a redirect or download
1214
-     */
1215
-    public function _registrations_checkin_report()
1216
-    {
1217
-        $this->_registrations_report_base('_get_checkin_query_params_from_request');
1218
-    }
1209
+	/**
1210
+	 * Download the registrations check-in report (same as the normal registration report, but with different where
1211
+	 * conditions)
1212
+	 *
1213
+	 * @return void ends the request by a redirect or download
1214
+	 */
1215
+	public function _registrations_checkin_report()
1216
+	{
1217
+		$this->_registrations_report_base('_get_checkin_query_params_from_request');
1218
+	}
1219 1219
 
1220
-    /**
1221
-     * Gets the query params from the request, plus adds a where condition for the registration status,
1222
-     * because on the checkin page we only ever want to see approved and pending-approval registrations
1223
-     *
1224
-     * @param array $request
1225
-     * @param int   $per_page
1226
-     * @param bool  $count
1227
-     * @return array
1228
-     * @throws EE_Error
1229
-     */
1230
-    protected function _get_checkin_query_params_from_request(
1231
-        $request,
1232
-        $per_page = 10,
1233
-        $count = false
1234
-    ) {
1235
-        $query_params = $this->_get_registration_query_parameters($request, $per_page, $count);
1236
-        // unlike the regular registrations list table,
1237
-        $status_ids_array = apply_filters(
1238
-            'FHEE__Extend_Registrations_Admin_Page__get_event_attendees__status_ids_array',
1239
-            array(EEM_Registration::status_id_pending_payment, EEM_Registration::status_id_approved)
1240
-        );
1241
-        $query_params[0]['STS_ID'] = array('IN', $status_ids_array);
1242
-        return $query_params;
1243
-    }
1220
+	/**
1221
+	 * Gets the query params from the request, plus adds a where condition for the registration status,
1222
+	 * because on the checkin page we only ever want to see approved and pending-approval registrations
1223
+	 *
1224
+	 * @param array $request
1225
+	 * @param int   $per_page
1226
+	 * @param bool  $count
1227
+	 * @return array
1228
+	 * @throws EE_Error
1229
+	 */
1230
+	protected function _get_checkin_query_params_from_request(
1231
+		$request,
1232
+		$per_page = 10,
1233
+		$count = false
1234
+	) {
1235
+		$query_params = $this->_get_registration_query_parameters($request, $per_page, $count);
1236
+		// unlike the regular registrations list table,
1237
+		$status_ids_array = apply_filters(
1238
+			'FHEE__Extend_Registrations_Admin_Page__get_event_attendees__status_ids_array',
1239
+			array(EEM_Registration::status_id_pending_payment, EEM_Registration::status_id_approved)
1240
+		);
1241
+		$query_params[0]['STS_ID'] = array('IN', $status_ids_array);
1242
+		return $query_params;
1243
+	}
1244 1244
 
1245 1245
 
1246
-    /**
1247
-     * Gets registrations for an event
1248
-     *
1249
-     * @param int    $per_page
1250
-     * @param bool   $count whether to return count or data.
1251
-     * @param bool   $trash
1252
-     * @param string $orderby
1253
-     * @return EE_Registration[]|int
1254
-     * @throws EE_Error
1255
-     * @throws InvalidArgumentException
1256
-     * @throws InvalidDataTypeException
1257
-     * @throws InvalidInterfaceException
1258
-     */
1259
-    public function get_event_attendees($per_page = 10, $count = false, $trash = false, $orderby = 'ATT_fname')
1260
-    {
1261
-        // normalize some request params that get setup by the parent `get_registrations` method.
1262
-        $request = $this->_req_data;
1263
-        $request['orderby'] = ! empty($this->_req_data['orderby']) ? $this->_req_data['orderby'] : $orderby;
1264
-        $request['order'] = ! empty($this->_req_data['order']) ? $this->_req_data['order'] : 'ASC';
1265
-        if ($trash) {
1266
-            $request['status'] = 'trash';
1267
-        }
1268
-        $query_params = $this->_get_checkin_query_params_from_request($request, $per_page, $count);
1269
-        /**
1270
-         * Override the default groupby added by EEM_Base so that sorts with multiple order bys work as expected
1271
-         *
1272
-         * @link https://events.codebasehq.com/projects/event-espresso/tickets/10093
1273
-         * @see https://github.com/eventespresso/event-espresso-core/tree/master/docs/G--Model-System/model-query-params.md
1274
-         *                             or if you have the development copy of EE you can view this at the path:
1275
-         *                             /docs/G--Model-System/model-query-params.md
1276
-         */
1277
-        $query_params['group_by'] = '';
1246
+	/**
1247
+	 * Gets registrations for an event
1248
+	 *
1249
+	 * @param int    $per_page
1250
+	 * @param bool   $count whether to return count or data.
1251
+	 * @param bool   $trash
1252
+	 * @param string $orderby
1253
+	 * @return EE_Registration[]|int
1254
+	 * @throws EE_Error
1255
+	 * @throws InvalidArgumentException
1256
+	 * @throws InvalidDataTypeException
1257
+	 * @throws InvalidInterfaceException
1258
+	 */
1259
+	public function get_event_attendees($per_page = 10, $count = false, $trash = false, $orderby = 'ATT_fname')
1260
+	{
1261
+		// normalize some request params that get setup by the parent `get_registrations` method.
1262
+		$request = $this->_req_data;
1263
+		$request['orderby'] = ! empty($this->_req_data['orderby']) ? $this->_req_data['orderby'] : $orderby;
1264
+		$request['order'] = ! empty($this->_req_data['order']) ? $this->_req_data['order'] : 'ASC';
1265
+		if ($trash) {
1266
+			$request['status'] = 'trash';
1267
+		}
1268
+		$query_params = $this->_get_checkin_query_params_from_request($request, $per_page, $count);
1269
+		/**
1270
+		 * Override the default groupby added by EEM_Base so that sorts with multiple order bys work as expected
1271
+		 *
1272
+		 * @link https://events.codebasehq.com/projects/event-espresso/tickets/10093
1273
+		 * @see https://github.com/eventespresso/event-espresso-core/tree/master/docs/G--Model-System/model-query-params.md
1274
+		 *                             or if you have the development copy of EE you can view this at the path:
1275
+		 *                             /docs/G--Model-System/model-query-params.md
1276
+		 */
1277
+		$query_params['group_by'] = '';
1278 1278
 
1279
-        return $count
1280
-            ? EEM_Registration::instance()->count($query_params)
1281
-            /** @type EE_Registration[] */
1282
-            : EEM_Registration::instance()->get_all($query_params);
1283
-    }
1279
+		return $count
1280
+			? EEM_Registration::instance()->count($query_params)
1281
+			/** @type EE_Registration[] */
1282
+			: EEM_Registration::instance()->get_all($query_params);
1283
+	}
1284 1284
 }
Please login to merge, or discard this patch.
Spacing   +49 added lines, -49 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;
@@ -446,17 +446,17 @@  discard block
 block discarded – undo
446 446
                 $field_id = $field === '[NEWSLETTER_CONTENT]'
447 447
                     ? 'content'
448 448
                     : $field;
449
-                $field_id = 'batch-message-' . strtolower($field_id);
449
+                $field_id = 'batch-message-'.strtolower($field_id);
450 450
                 $available_shortcodes[] = '<span class="js-shortcode-selection" data-value="'
451 451
                                           . $shortcode
452
-                                          . '" data-linked-input-id="' . $field_id . '">'
452
+                                          . '" data-linked-input-id="'.$field_id.'">'
453 453
                                           . $shortcode
454 454
                                           . '</span>';
455 455
             }
456
-            $codes[ $field ] = implode(', ', $available_shortcodes);
456
+            $codes[$field] = implode(', ', $available_shortcodes);
457 457
         }
458 458
         $shortcodes = $codes;
459
-        $form_template = REG_CAF_TEMPLATE_PATH . 'newsletter-send-form.template.php';
459
+        $form_template = REG_CAF_TEMPLATE_PATH.'newsletter-send-form.template.php';
460 460
         $form_template_args = array(
461 461
             'form_action'       => admin_url('admin.php?page=espresso_registrations'),
462 462
             'form_route'        => 'newsletter_selected_send',
@@ -624,7 +624,7 @@  discard block
 block discarded – undo
624 624
      */
625 625
     protected function _registration_reports()
626 626
     {
627
-        $template_path = EE_ADMIN_TEMPLATE . 'admin_reports.template.php';
627
+        $template_path = EE_ADMIN_TEMPLATE.'admin_reports.template.php';
628 628
         $this->_template_args['admin_page_content'] = EEH_Template::display_template(
629 629
             $template_path,
630 630
             $this->_reports_template_data,
@@ -679,7 +679,7 @@  discard block
 block discarded – undo
679 679
             array_unshift($regs, $column_titles);
680 680
             // setup the date range.
681 681
             $DateTimeZone = new DateTimeZone(EEH_DTT_Helper::get_timezone());
682
-            $beginning_date = new DateTime("now " . $period, $DateTimeZone);
682
+            $beginning_date = new DateTime("now ".$period, $DateTimeZone);
683 683
             $ending_date = new DateTime("now", $DateTimeZone);
684 684
             $subtitle = sprintf(
685 685
                 _x('For the period: %1$s to %2$s', 'Used to give date range', 'event_espresso'),
@@ -699,7 +699,7 @@  discard block
 block discarded – undo
699 699
                     '%sThere are currently no registration records in the last month for this report.%s',
700 700
                     'event_espresso'
701 701
                 ),
702
-                '<h2>' . $report_title . '</h2><p>',
702
+                '<h2>'.$report_title.'</h2><p>',
703 703
                 '</p>'
704 704
             ),
705 705
         );
@@ -752,7 +752,7 @@  discard block
 block discarded – undo
752 752
             array_unshift($regs, $column_titles);
753 753
             // setup the date range.
754 754
             $DateTimeZone = new DateTimeZone(EEH_DTT_Helper::get_timezone());
755
-            $beginning_date = new DateTime("now " . $period, $DateTimeZone);
755
+            $beginning_date = new DateTime("now ".$period, $DateTimeZone);
756 756
             $ending_date = new DateTime("now", $DateTimeZone);
757 757
             $subtitle = sprintf(
758 758
                 _x('For the period: %1$s to %2$s', 'Used to give date range', 'event_espresso'),
@@ -772,7 +772,7 @@  discard block
 block discarded – undo
772 772
                     '%sThere are currently no registration records in the last month for this report.%s',
773 773
                     'event_espresso'
774 774
                 ),
775
-                '<h2>' . $report_title . '</h2><p>',
775
+                '<h2>'.$report_title.'</h2><p>',
776 776
                 '</p>'
777 777
             ),
778 778
         );
@@ -798,7 +798,7 @@  discard block
 block discarded – undo
798 798
         $reg_id = isset($this->_req_data['_REG_ID']) ? $this->_req_data['_REG_ID'] : null;
799 799
         /** @var EE_Registration $registration */
800 800
         $registration = EEM_Registration::instance()->get_one_by_ID($reg_id);
801
-        if (! $registration instanceof EE_Registration) {
801
+        if ( ! $registration instanceof EE_Registration) {
802 802
             throw new EE_Error(
803 803
                 sprintf(
804 804
                     esc_html__('An error occurred. There is no registration with ID (%d)', 'event_espresso'),
@@ -833,7 +833,7 @@  discard block
 block discarded – undo
833 833
         if ($datetime instanceof EE_Datetime) {
834 834
             $datetime_label = $datetime->get_dtt_display_name(true);
835 835
             $datetime_label .= ! empty($datetime_label)
836
-                ? ' (' . $datetime->get_dtt_display_name() . ')'
836
+                ? ' ('.$datetime->get_dtt_display_name().')'
837 837
                 : $datetime->get_dtt_display_name();
838 838
         }
839 839
         $datetime_link = ! empty($dtt_id) && $registration instanceof EE_Registration
@@ -847,7 +847,7 @@  discard block
 block discarded – undo
847 847
             )
848 848
             : '';
849 849
         $datetime_link = ! empty($datetime_link)
850
-            ? '<a href="' . $datetime_link . '">'
850
+            ? '<a href="'.$datetime_link.'">'
851 851
               . '<span id="checkin-dtt">'
852 852
               . $datetime_label
853 853
               . '</span></a>'
@@ -859,8 +859,8 @@  discard block
 block discarded – undo
859 859
             ? $attendee->get_admin_details_link()
860 860
             : '';
861 861
         $attendee_link = ! empty($attendee_link)
862
-            ? '<a href="' . $attendee->get_admin_details_link() . '"'
863
-              . ' title="' . esc_html__('Click for attendee details', 'event_espresso') . '">'
862
+            ? '<a href="'.$attendee->get_admin_details_link().'"'
863
+              . ' title="'.esc_html__('Click for attendee details', 'event_espresso').'">'
864 864
               . '<span id="checkin-attendee-name">'
865 865
               . $attendee_name
866 866
               . '</span></a>'
@@ -869,25 +869,25 @@  discard block
 block discarded – undo
869 869
             ? $registration->event()->get_admin_details_link()
870 870
             : '';
871 871
         $event_link = ! empty($event_link)
872
-            ? '<a href="' . $event_link . '"'
873
-              . ' title="' . esc_html__('Click here to edit event.', 'event_espresso') . '">'
872
+            ? '<a href="'.$event_link.'"'
873
+              . ' title="'.esc_html__('Click here to edit event.', 'event_espresso').'">'
874 874
               . '<span id="checkin-event-name">'
875 875
               . $registration->event_name()
876 876
               . '</span>'
877 877
               . '</a>'
878 878
             : '';
879 879
         $this->_template_args['before_list_table'] = ! empty($reg_id) && ! empty($dtt_id)
880
-            ? '<h2>' . sprintf(
880
+            ? '<h2>'.sprintf(
881 881
                 esc_html__('Displaying check in records for %1$s for %2$s at the event, %3$s', 'event_espresso'),
882 882
                 $attendee_link,
883 883
                 $datetime_link,
884 884
                 $event_link
885
-            ) . '</h2>'
885
+            ).'</h2>'
886 886
             : '';
887 887
         $this->_template_args['list_table_hidden_fields'] = ! empty($reg_id)
888
-            ? '<input type="hidden" name="_REG_ID" value="' . $reg_id . '">' : '';
888
+            ? '<input type="hidden" name="_REG_ID" value="'.$reg_id.'">' : '';
889 889
         $this->_template_args['list_table_hidden_fields'] .= ! empty($dtt_id)
890
-            ? '<input type="hidden" name="DTT_ID" value="' . $dtt_id . '">' : '';
890
+            ? '<input type="hidden" name="DTT_ID" value="'.$dtt_id.'">' : '';
891 891
         $this->display_admin_list_table_page_with_no_sidebar();
892 892
     }
893 893
 
@@ -904,7 +904,7 @@  discard block
 block discarded – undo
904 904
     public function toggle_checkin_status()
905 905
     {
906 906
         // first make sure we have the necessary data
907
-        if (! isset($this->_req_data['_regid'])) {
907
+        if ( ! isset($this->_req_data['_regid'])) {
908 908
             EE_Error::add_error(
909 909
                 esc_html__(
910 910
                     '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',
@@ -926,7 +926,7 @@  discard block
 block discarded – undo
926 926
         // beautiful! Made it this far so let's get the status.
927 927
         $new_status = new CheckinStatusDashicon($this->_toggle_checkin_status());
928 928
         // setup new class to return via ajax
929
-        $this->_template_args['admin_page_content'] = 'clickable trigger-checkin ' . $new_status->cssClasses();
929
+        $this->_template_args['admin_page_content'] = 'clickable trigger-checkin '.$new_status->cssClasses();
930 930
         $this->_template_args['success'] = true;
931 931
         $this->_return_json();
932 932
     }
@@ -952,7 +952,7 @@  discard block
 block discarded – undo
952 952
         );
953 953
         $new_status = false;
954 954
         // bulk action check in toggle
955
-        if (! empty($this->_req_data['checkbox']) && is_array($this->_req_data['checkbox'])) {
955
+        if ( ! empty($this->_req_data['checkbox']) && is_array($this->_req_data['checkbox'])) {
956 956
             // cycle thru checkboxes
957 957
             while (list($REG_ID, $value) = each($this->_req_data['checkbox'])) {
958 958
                 $DTT_ID = isset($this->_req_data['DTT_ID']) ? $this->_req_data['DTT_ID'] : null;
@@ -1022,9 +1022,9 @@  discard block
 block discarded – undo
1022 1022
             '_REG_ID' => isset($this->_req_data['_REG_ID']) ? $this->_req_data['_REG_ID'] : 0,
1023 1023
         );
1024 1024
         $errors = 0;
1025
-        if (! empty($this->_req_data['checkbox']) && is_array($this->_req_data['checkbox'])) {
1025
+        if ( ! empty($this->_req_data['checkbox']) && is_array($this->_req_data['checkbox'])) {
1026 1026
             while (list($CHK_ID, $value) = each($this->_req_data['checkbox'])) {
1027
-                if (! EEM_Checkin::instance()->delete_by_ID($CHK_ID)) {
1027
+                if ( ! EEM_Checkin::instance()->delete_by_ID($CHK_ID)) {
1028 1028
                     $errors++;
1029 1029
                 }
1030 1030
             }
@@ -1070,8 +1070,8 @@  discard block
 block discarded – undo
1070 1070
             'DTT_ID'  => isset($this->_req_data['DTT_ID']) ? $this->_req_data['DTT_ID'] : 0,
1071 1071
             '_REG_ID' => isset($this->_req_data['_REG_ID']) ? $this->_req_data['_REG_ID'] : 0,
1072 1072
         );
1073
-        if (! empty($this->_req_data['CHK_ID'])) {
1074
-            if (! EEM_Checkin::instance()->delete_by_ID($this->_req_data['CHK_ID'])) {
1073
+        if ( ! empty($this->_req_data['CHK_ID'])) {
1074
+            if ( ! EEM_Checkin::instance()->delete_by_ID($this->_req_data['CHK_ID'])) {
1075 1075
                 EE_Error::add_error(
1076 1076
                     esc_html__('Something went wrong and this check-in record was not deleted', 'event_espresso'),
1077 1077
                     __FILE__,
@@ -1140,27 +1140,27 @@  discard block
 block discarded – undo
1140 1140
                 'desc'  => $checked_never->legendLabel(),
1141 1141
             ),
1142 1142
             'approved_status'  => array(
1143
-                'class' => 'ee-status-legend ee-status-legend-' . EEM_Registration::status_id_approved,
1143
+                'class' => 'ee-status-legend ee-status-legend-'.EEM_Registration::status_id_approved,
1144 1144
                 'desc'  => EEH_Template::pretty_status(EEM_Registration::status_id_approved, false, 'sentence'),
1145 1145
             ),
1146 1146
             'cancelled_status' => array(
1147
-                'class' => 'ee-status-legend ee-status-legend-' . EEM_Registration::status_id_cancelled,
1147
+                'class' => 'ee-status-legend ee-status-legend-'.EEM_Registration::status_id_cancelled,
1148 1148
                 'desc'  => EEH_Template::pretty_status(EEM_Registration::status_id_cancelled, false, 'sentence'),
1149 1149
             ),
1150 1150
             'declined_status'  => array(
1151
-                'class' => 'ee-status-legend ee-status-legend-' . EEM_Registration::status_id_declined,
1151
+                'class' => 'ee-status-legend ee-status-legend-'.EEM_Registration::status_id_declined,
1152 1152
                 'desc'  => EEH_Template::pretty_status(EEM_Registration::status_id_declined, false, 'sentence'),
1153 1153
             ),
1154 1154
             'not_approved'     => array(
1155
-                'class' => 'ee-status-legend ee-status-legend-' . EEM_Registration::status_id_not_approved,
1155
+                'class' => 'ee-status-legend ee-status-legend-'.EEM_Registration::status_id_not_approved,
1156 1156
                 'desc'  => EEH_Template::pretty_status(EEM_Registration::status_id_not_approved, false, 'sentence'),
1157 1157
             ),
1158 1158
             'pending_status'   => array(
1159
-                'class' => 'ee-status-legend ee-status-legend-' . EEM_Registration::status_id_pending_payment,
1159
+                'class' => 'ee-status-legend ee-status-legend-'.EEM_Registration::status_id_pending_payment,
1160 1160
                 'desc'  => EEH_Template::pretty_status(EEM_Registration::status_id_pending_payment, false, 'sentence'),
1161 1161
             ),
1162 1162
             'wait_list'        => array(
1163
-                'class' => 'ee-status-legend ee-status-legend-' . EEM_Registration::status_id_wait_list,
1163
+                'class' => 'ee-status-legend ee-status-legend-'.EEM_Registration::status_id_wait_list,
1164 1164
                 'desc'  => EEH_Template::pretty_status(EEM_Registration::status_id_wait_list, false, 'sentence'),
1165 1165
             ),
1166 1166
         );
@@ -1169,10 +1169,10 @@  discard block
 block discarded – undo
1169 1169
         /** @var EE_Event $event */
1170 1170
         $event = EEM_Event::instance()->get_one_by_ID($event_id);
1171 1171
         $this->_template_args['before_list_table'] = $event instanceof EE_Event
1172
-            ? '<h2>' . sprintf(
1172
+            ? '<h2>'.sprintf(
1173 1173
                 esc_html__('Viewing Registrations for Event: %s', 'event_espresso'),
1174 1174
                 EEM_Event::instance()->get_one_by_ID($event_id)->get('EVT_name')
1175
-            ) . '</h2>'
1175
+            ).'</h2>'
1176 1176
             : '';
1177 1177
         // need to get the number of datetimes on the event and set default datetime_id if there is only one datetime on
1178 1178
         // the event.
@@ -1190,12 +1190,12 @@  discard block
 block discarded – undo
1190 1190
             $this->_template_args['before_list_table'] .= ' &nbsp;<span class="drk-grey-text">';
1191 1191
             $this->_template_args['before_list_table'] .= '<span class="dashicons dashicons-calendar"></span>';
1192 1192
             $this->_template_args['before_list_table'] .= $datetime->name();
1193
-            $this->_template_args['before_list_table'] .= ' ( ' . $datetime->date_and_time_range() . ' )';
1193
+            $this->_template_args['before_list_table'] .= ' ( '.$datetime->date_and_time_range().' )';
1194 1194
             $this->_template_args['before_list_table'] .= '</span></h2>';
1195 1195
         }
1196 1196
         // if no datetime, then we're on the initial view, so let's give some helpful instructions on what the status
1197 1197
         // column represents
1198
-        if (! $datetime instanceof EE_Datetime) {
1198
+        if ( ! $datetime instanceof EE_Datetime) {
1199 1199
             $this->_template_args['before_list_table'] .= '<br><p class="description">'
1200 1200
                                                           . esc_html__(
1201 1201
                                                               '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.