Completed
Branch dependabot/npm_and_yarn/core-j... (d3ae1d)
by
unknown
71:09 queued 62:23
created
admin_pages/messages/help_tabs/messages_settings_messengers.help_tab.php 2 patches
Indentation   +50 added lines, -50 removed lines patch added patch discarded remove patch
@@ -3,79 +3,79 @@
 block discarded – undo
3 3
 </p>
4 4
 <p>
5 5
     <?php esc_html_e(
6
-        'You can select Messengers via the tabs across the top of the settings page. The available messengers you see depends on what version of Event Espresso you have and what addons are installed. Every install include an "Email" messenger tab.  When you click one of those tabs it will display that messenger.',
7
-        'event_espresso'
8
-    ); ?>
6
+		'You can select Messengers via the tabs across the top of the settings page. The available messengers you see depends on what version of Event Espresso you have and what addons are installed. Every install include an "Email" messenger tab.  When you click one of those tabs it will display that messenger.',
7
+		'event_espresso'
8
+	); ?>
9 9
 </p>
10 10
 <p>
11 11
     <?php esc_html_e(
12
-        'There are two ways to determine whether a messenger is active or not.  The first way is via the messenger tab itself.',
13
-        'event_espresso'
14
-    ); ?>
12
+		'There are two ways to determine whether a messenger is active or not.  The first way is via the messenger tab itself.',
13
+		'event_espresso'
14
+	); ?>
15 15
 </p>
16 16
 <p>
17 17
     <?php printf(
18
-        esc_html__(
19
-            'The green colored gear %s indicates that this messenger is currently active.',
20
-            'event_espresso'
21
-        ),
22
-        '<img class="inline-text" src="' . EE_MSG_ASSETS_URL . 'images/email-tab-active.png' . '"'
23
-        . ' alt="' . esc_attr__('Active Email Tab', 'event_espresso') . '" />'
24
-    );
25
-    printf(
26
-        esc_html__(
27
-            ' The white colored gear %s indicates the messenger is inactive. This is very helpful for seeing at a glance all the messengers that are active when you first view the page.',
28
-            'event_espresso'
29
-        ),
30
-        '<img class="inline-text" src="' . EE_MSG_ASSETS_URL . 'images/email-tab-inactive.png'
31
-        . '" alt="' . esc_attr__('Inactive Email Tab', 'event_espresso') . '" />'
32
-    ); ?>
18
+		esc_html__(
19
+			'The green colored gear %s indicates that this messenger is currently active.',
20
+			'event_espresso'
21
+		),
22
+		'<img class="inline-text" src="' . EE_MSG_ASSETS_URL . 'images/email-tab-active.png' . '"'
23
+		. ' alt="' . esc_attr__('Active Email Tab', 'event_espresso') . '" />'
24
+	);
25
+	printf(
26
+		esc_html__(
27
+			' The white colored gear %s indicates the messenger is inactive. This is very helpful for seeing at a glance all the messengers that are active when you first view the page.',
28
+			'event_espresso'
29
+		),
30
+		'<img class="inline-text" src="' . EE_MSG_ASSETS_URL . 'images/email-tab-inactive.png'
31
+		. '" alt="' . esc_attr__('Inactive Email Tab', 'event_espresso') . '" />'
32
+	); ?>
33 33
 </p>
34 34
 <p>
35 35
     <?php esc_html_e(
36
-        'The second way to determine whether a messenger is active or not is via the "on/off" button in the top right corner of the active messenger displayed content:',
37
-        'event_espresso'
38
-    ); ?>
36
+		'The second way to determine whether a messenger is active or not is via the "on/off" button in the top right corner of the active messenger displayed content:',
37
+		'event_espresso'
38
+	); ?>
39 39
 </p>
40 40
 <p>
41 41
     <?php printf(
42
-        esc_html__(
43
-            '%1$s means of course that the messenger is active and %2$s means the messenger is inactive.',
44
-            'event_espresso'
45
-        ),
46
-        '<div class="switch">'
47
-            . '<input class="ee-on-off-toggle ee-toggle-round-flat" type="checkbox" checked="checked" disabled>'
48
-            . '<label for="ee-on-off-toggle-on"></label>'
49
-        . '</div>',
50
-        '<div class="switch">'
51
-            . '<input class="ee-on-off-toggle ee-toggle-round-flat" type="checkbox" disabled>'
52
-            . '<label for="ee-on-off-toggle-on"></label>'
53
-        . '</div>'
54
-    ); ?>
42
+		esc_html__(
43
+			'%1$s means of course that the messenger is active and %2$s means the messenger is inactive.',
44
+			'event_espresso'
45
+		),
46
+		'<div class="switch">'
47
+			. '<input class="ee-on-off-toggle ee-toggle-round-flat" type="checkbox" checked="checked" disabled>'
48
+			. '<label for="ee-on-off-toggle-on"></label>'
49
+		. '</div>',
50
+		'<div class="switch">'
51
+			. '<input class="ee-on-off-toggle ee-toggle-round-flat" type="checkbox" disabled>'
52
+			. '<label for="ee-on-off-toggle-on"></label>'
53
+		. '</div>'
54
+	); ?>
55 55
 </p>
56 56
 <p>
57 57
     <?php
58
-        esc_html_e(
59
-            'The on/off toggle is also what you use to activate or deactivate a messenger.',
60
-            'event_espresso'
61
-        ); ?>
58
+		esc_html_e(
59
+			'The on/off toggle is also what you use to activate or deactivate a messenger.',
60
+			'event_espresso'
61
+		); ?>
62 62
 </p>
63 63
 <p>
64 64
     <?php esc_html_e(
65
-        'What happens when you click the toggle to activate is the messenger is activated and the system determines what default message types are activated with the messenger.  Then, if there are any default settings for either the messenger or message types those settings are saved.  Next, the system will generate any default templates (if none have been generated before, if there are previously generated templates then they are reactivated).  Finally, you will see the display change to reflect that the messenger is active. If the messenger has settings you can modify them then. Any message types that have settings will also automatically expand so you can see the default settings and make any changes as necessary to fit your needs. Usually the defaults are sufficient however.',
66
-        'event_espresso'
67
-    ); ?>
65
+		'What happens when you click the toggle to activate is the messenger is activated and the system determines what default message types are activated with the messenger.  Then, if there are any default settings for either the messenger or message types those settings are saved.  Next, the system will generate any default templates (if none have been generated before, if there are previously generated templates then they are reactivated).  Finally, you will see the display change to reflect that the messenger is active. If the messenger has settings you can modify them then. Any message types that have settings will also automatically expand so you can see the default settings and make any changes as necessary to fit your needs. Usually the defaults are sufficient however.',
66
+		'event_espresso'
67
+	); ?>
68 68
 </p>
69 69
 <p>
70 70
     <?php esc_html_e(
71
-        'When you deactivate a messenger, the system will first check if there are any custom event templates for that messenger. If there are you will be unable to deactivate the messenger. This is a fail safe to make sure you know that no messages will go out for those specific events so you don\'t accidentally deactivate.  If this check passes, then the system will deactivate any global templates for that messenger (note the templates are not erased, they just become inactive, so if you decide to reactivate the messenger later all your customizations are preserved). Then the display will change to reflect the deactivation.',
72
-        'event_espresso'
73
-    ); ?>
71
+		'When you deactivate a messenger, the system will first check if there are any custom event templates for that messenger. If there are you will be unable to deactivate the messenger. This is a fail safe to make sure you know that no messages will go out for those specific events so you don\'t accidentally deactivate.  If this check passes, then the system will deactivate any global templates for that messenger (note the templates are not erased, they just become inactive, so if you decide to reactivate the messenger later all your customizations are preserved). Then the display will change to reflect the deactivation.',
72
+		'event_espresso'
73
+	); ?>
74 74
 </p>
75 75
 <p>
76 76
     <strong><?php esc_html_e('Important', 'event_espresso'); ?></strong><br/>
77 77
     <?php esc_html_e(
78
-        'Although customizations made to global templates are preserved when a messenger is deactivated, any settings for that messenger (or the message types that were attached to it) are lost on deactivation.  Also, once you deactivate a messenger, no more messages will be delivered using that messenger for any of your events.',
79
-        'event_espresso'
80
-    ); ?>
78
+		'Although customizations made to global templates are preserved when a messenger is deactivated, any settings for that messenger (or the message types that were attached to it) are lost on deactivation.  Also, once you deactivate a messenger, no more messages will be delivered using that messenger for any of your events.',
79
+		'event_espresso'
80
+	); ?>
81 81
 </p>
Please login to merge, or discard this patch.
Spacing   +4 added lines, -4 removed lines patch added patch discarded remove patch
@@ -19,16 +19,16 @@
 block discarded – undo
19 19
             'The green colored gear %s indicates that this messenger is currently active.',
20 20
             'event_espresso'
21 21
         ),
22
-        '<img class="inline-text" src="' . EE_MSG_ASSETS_URL . 'images/email-tab-active.png' . '"'
23
-        . ' alt="' . esc_attr__('Active Email Tab', 'event_espresso') . '" />'
22
+        '<img class="inline-text" src="'.EE_MSG_ASSETS_URL.'images/email-tab-active.png'.'"'
23
+        . ' alt="'.esc_attr__('Active Email Tab', 'event_espresso').'" />'
24 24
     );
25 25
     printf(
26 26
         esc_html__(
27 27
             ' The white colored gear %s indicates the messenger is inactive. This is very helpful for seeing at a glance all the messengers that are active when you first view the page.',
28 28
             'event_espresso'
29 29
         ),
30
-        '<img class="inline-text" src="' . EE_MSG_ASSETS_URL . 'images/email-tab-inactive.png'
31
-        . '" alt="' . esc_attr__('Inactive Email Tab', 'event_espresso') . '" />'
30
+        '<img class="inline-text" src="'.EE_MSG_ASSETS_URL.'images/email-tab-inactive.png'
31
+        . '" alt="'.esc_attr__('Inactive Email Tab', 'event_espresso').'" />'
32 32
     ); ?>
33 33
 </p>
34 34
 <p>
Please login to merge, or discard this patch.
core/libraries/shortcodes/EE_Venue_Shortcodes.lib.php 3 patches
Doc Comments   +1 added lines, -1 removed lines patch added patch discarded remove patch
@@ -176,7 +176,7 @@
 block discarded – undo
176 176
     /**
177 177
      * This retrieves the EE_Venue from the available data object.
178 178
      *
179
-     * @return EE_Venue|null
179
+     * @return EE_Base_Class|null
180 180
      * @throws EE_Error
181 181
      * @throws EntityNotFoundException
182 182
      */
Please login to merge, or discard this patch.
Indentation   +311 added lines, -311 removed lines patch added patch discarded remove patch
@@ -17,315 +17,315 @@
 block discarded – undo
17 17
 {
18 18
 
19 19
 
20
-    /**
21
-     * Will hold the EE_Event if available
22
-     *
23
-     * @var EE_Event
24
-     */
25
-    protected $_event;
26
-
27
-    /**
28
-     * Will hold the EE_Venue if available
29
-     *
30
-     * @var EE_Venue
31
-     */
32
-    protected $_venue;
33
-
34
-
35
-    /**
36
-     * Initialize properties
37
-     */
38
-    protected function _init_props()
39
-    {
40
-        $this->label = esc_html__('Venue Shortcodes', 'event_espresso');
41
-        $this->description = esc_html__('All shortcodes specific to venue related data', 'event_espresso');
42
-        $this->_shortcodes = array(
43
-            '[VENUE_TITLE]'             => esc_html__('The title for the event venue', 'event_espresso'),
44
-            '[VENUE_DESCRIPTION]'       => esc_html__('The description for the event venue', 'event_espresso'),
45
-            '[VENUE_URL]'               => esc_html__('A url to a webpage for the venue', 'event_espresso'),
46
-            '[VENUE_DETAILS_URL]'       => sprintf(
47
-                esc_html__(
48
-                    'This shortcode outputs the url or website address to the venue details page on this website. This differs from %s which outputs what is entered in the "url" field in the venue details page.',
49
-                    'event_espresso'
50
-                ),
51
-                '[VENUE_URL]'
52
-            ),
53
-            '[VENUE_IMAGE]'             => esc_html__('An image representing the event venue', 'event_espresso'),
54
-            '[VENUE_PHONE]'             => esc_html__('The phone number for the venue', 'event_espresso'),
55
-            '[VENUE_ADDRESS]'           => esc_html__('The address for the venue', 'event_espresso'),
56
-            '[VENUE_ADDRESS2]'          => esc_html__('Address 2 for the venue', 'event_espresso'),
57
-            '[VENUE_CITY]'              => esc_html__('The city the venue is in', 'event_espresso'),
58
-            '[VENUE_STATE]'             => esc_html__('The state the venue is located in', 'event_espresso'),
59
-            '[VENUE_COUNTRY]'           => esc_html__('The country the venue is located in', 'event_espresso'),
60
-            '[VENUE_FORMATTED_ADDRESS]' => esc_html__(
61
-                'This just outputs the venue address in a semantic address format.',
62
-                'event_espresso'
63
-            ),
64
-            '[VENUE_ZIP]'               => esc_html__('The zip code for the venue address', 'event_espresso'),
65
-            '[VENUE_META_*]'            => esc_html__(
66
-                'This is a special dynamic shortcode. After the "*", add the exact name for your custom field, if there is a value set for that custom field within the venue then it will be output in place of this shortcode.',
67
-                'event_espresso'
68
-            ),
69
-            '[GOOGLE_MAP_URL]'          => esc_html__(
70
-                'URL for the google map associated with the venue.',
71
-                'event_espresso'
72
-            ),
73
-            '[GOOGLE_MAP_LINK]'         => esc_html__('Link to a google map for the venue', 'event_espresso'),
74
-            '[GOOGLE_MAP_IMAGE]'        => esc_html__('Google map for venue wrapped in image tags', 'event_espresso'),
75
-        );
76
-    }
77
-
78
-
79
-    /**
80
-     * Parse incoming shortcode
81
-     *
82
-     * @param string $shortcode
83
-     * @return string
84
-     * @throws EE_Error
85
-     * @throws EntityNotFoundException
86
-     */
87
-    protected function _parser($shortcode)
88
-    {
89
-        $this->_venue = $this->_get_venue();
90
-        // If there is no venue object by now then get out.
91
-        if (! $this->_venue instanceof EE_Venue) {
92
-            return '';
93
-        }
94
-
95
-        switch ($shortcode) {
96
-            case '[VENUE_TITLE]':
97
-                return $this->_venue('title');
98
-                break;
99
-
100
-            case '[VENUE_DESCRIPTION]':
101
-                return $this->_venue('description');
102
-                break;
103
-
104
-            case '[VENUE_URL]':
105
-                return $this->_venue('url');
106
-                break;
107
-
108
-            case '[VENUE_IMAGE]':
109
-                return $this->_venue('image');
110
-                break;
111
-
112
-            case '[VENUE_PHONE]':
113
-                return $this->_venue('phone');
114
-                break;
115
-
116
-            case '[VENUE_ADDRESS]':
117
-                return $this->_venue('address');
118
-                break;
119
-
120
-            case '[VENUE_ADDRESS2]':
121
-                return $this->_venue('address2');
122
-                break;
123
-
124
-            case '[VENUE_CITY]':
125
-                return $this->_venue('city');
126
-                break;
127
-
128
-            case '[VENUE_COUNTRY]':
129
-                return $this->_venue('country');
130
-                break;
131
-
132
-            case '[VENUE_STATE]':
133
-                return $this->_venue('state');
134
-                break;
135
-
136
-            case '[VENUE_ZIP]':
137
-                return $this->_venue('zip');
138
-                break;
139
-
140
-            case '[VENUE_FORMATTED_ADDRESS]':
141
-                return $this->_venue('formatted_address');
142
-                break;
143
-
144
-            case '[GOOGLE_MAP_URL]':
145
-                return $this->_venue('gmap_url');
146
-                break;
147
-
148
-            case '[GOOGLE_MAP_LINK]':
149
-                return $this->_venue('gmap_link');
150
-                break;
151
-
152
-            case '[GOOGLE_MAP_IMAGE]':
153
-                return $this->_venue('gmap_link_img');
154
-                break;
155
-
156
-            case '[VENUE_DETAILS_URL]':
157
-                return $this->_venue('permalink');
158
-                break;
159
-        }
160
-
161
-        if (strpos($shortcode, '[VENUE_META_*') !== false) {
162
-            $shortcode = str_replace('[VENUE_META_*', '', $shortcode);
163
-            $shortcode = trim(str_replace(']', '', $shortcode));
164
-
165
-            // pull the meta value from the venue post
166
-            $venue_meta = $this->_venue->get_post_meta($shortcode, true);
167
-
168
-            return ! empty($venue_meta) ? $venue_meta : '';
169
-        }
170
-    }
171
-
172
-    /**
173
-     * This retrieves the EE_Venue from the available data object.
174
-     *
175
-     * @return EE_Venue|null
176
-     * @throws EE_Error
177
-     * @throws EntityNotFoundException
178
-     */
179
-    private function _get_venue()
180
-    {
181
-
182
-        // we need the EE_Event object to get the venue.
183
-        $this->_event = $this->_data instanceof EE_Event ? $this->_data : null;
184
-
185
-        // if no event, then let's see if there is a reg_obj.  If there IS, then we'll try and grab the event from the
186
-        // reg_obj instead.
187
-        if (! $this->_event instanceof EE_Event) {
188
-            $aee = $this->_data instanceof EE_Messages_Addressee ? $this->_data : null;
189
-            $aee = $this->_extra_data instanceof EE_Messages_Addressee ? $this->_extra_data : $aee;
190
-
191
-            $this->_event = $aee instanceof EE_Messages_Addressee && $aee->reg_obj instanceof EE_Registration
192
-                ? $aee->reg_obj->event()
193
-                : null;
194
-
195
-            // if still empty do we have a ticket data item?
196
-            $this->_event = ! $this->_event instanceof EE_Event
197
-                            && $this->_data instanceof EE_Ticket
198
-                            && $this->_extra_data['data'] instanceof EE_Messages_Addressee
199
-                ? $this->_extra_data['data']->tickets[ $this->_data->ID() ]['EE_Event']
200
-                : $this->_event;
201
-
202
-            // if STILL empty event, let's try to get the first event in the list of events via EE_Messages_Addressee
203
-            // and use that.
204
-            $this->_event = ! $this->_event instanceof EE_Event && $aee instanceof EE_Messages_Addressee
205
-                ? reset($aee->events)
206
-                : $this->_event;
207
-        }
208
-
209
-        // If we have an event object use it to pull the venue.
210
-        if ($this->_event instanceof EE_Event) {
211
-            return $this->_event->get_first_related('Venue');
212
-        }
213
-
214
-        return null;
215
-    }
216
-
217
-    /**
218
-     * This retrieves the specified venue information
219
-     *
220
-     * @param string $field What Venue field to retrieve
221
-     * @return string What was retrieved!
222
-     * @throws EE_Error
223
-     * @throws EntityNotFoundException
224
-     */
225
-    private function _venue($field)
226
-    {
227
-
228
-        if (! $this->_venue instanceof EE_Venue) {
229
-            return '';
230
-        } //no venue so get out.
231
-
232
-        switch ($field) {
233
-            case 'title':
234
-                return $this->_venue->get('VNU_name');
235
-                break;
236
-
237
-            case 'description':
238
-                return $this->_venue->get('VNU_desc');
239
-                break;
240
-
241
-            case 'url':
242
-                $url = $this->_venue->get('VNU_url');
243
-                return empty($url) ? $this->_venue->get_permalink() : $url;
244
-                break;
245
-
246
-            case 'permalink':
247
-                return $this->_venue->get_permalink();
248
-                break;
249
-
250
-            case 'image':
251
-                return '<img src="' . $this->_venue->feature_image_url(array(200, 200,))
252
-                       . '" alt="' . sprintf(
253
-                           esc_attr__('%s Feature Image', 'event_espresso'),
254
-                           $this->_venue->get('VNU_name')
255
-                       ) . '" />';
256
-                break;
257
-
258
-            case 'phone':
259
-                return $this->_venue->get('VNU_phone');
260
-                break;
261
-
262
-            case 'address':
263
-                return $this->_venue->get('VNU_address');
264
-                break;
265
-
266
-            case 'address2':
267
-                return $this->_venue->get('VNU_address2');
268
-                break;
269
-
270
-            case 'city':
271
-                return $this->_venue->get('VNU_city');
272
-                break;
273
-
274
-            case 'state':
275
-                $state = $this->_venue->state_obj();
276
-                return is_object($state) ? $state->get('STA_name') : '';
277
-                break;
278
-
279
-            case 'country':
280
-                $country = $this->_venue->country_obj();
281
-                return is_object($country) ? $country->get('CNT_name') : '';
282
-                break;
283
-
284
-            case 'zip':
285
-                return $this->_venue->get('VNU_zip');
286
-                break;
287
-
288
-            case 'formatted_address':
289
-                return EEH_Address::format($this->_venue);
290
-                break;
291
-
292
-            case 'gmap_link':
293
-            case 'gmap_url':
294
-            case 'gmap_link_img':
295
-                $atts = $this->get_map_attributes($this->_venue, $field);
296
-                return EEH_Maps::google_map_link($atts);
297
-                break;
298
-        }
299
-        return '';
300
-    }
301
-
302
-
303
-    /**
304
-     * Generates the attributes for retrieving a google_map artifact.
305
-     *
306
-     * @param EE_Venue $venue
307
-     * @param string   $field
308
-     * @return array
309
-     * @throws EE_Error
310
-     */
311
-    protected function get_map_attributes(EE_Venue $venue, $field = 'gmap_link')
312
-    {
313
-        $state = $venue->state_obj();
314
-        $country = $venue->country_obj();
315
-        $atts = array(
316
-            'id'      => $venue->ID(),
317
-            'address' => $venue->get('VNU_address'),
318
-            'city'    => $venue->get('VNU_city'),
319
-            'state'   => is_object($state) ? $state->get('STA_name') : '',
320
-            'zip'     => $venue->get('VNU_zip'),
321
-            'country' => is_object($country) ? $country->get('CNT_name') : '',
322
-            'type'    => $field === 'gmap_link' ? 'url' : 'map',
323
-            'map_w'   => 200,
324
-            'map_h'   => 200,
325
-        );
326
-        if ($field === 'gmap_url') {
327
-            $atts['type'] = 'url_only';
328
-        }
329
-        return $atts;
330
-    }
20
+	/**
21
+	 * Will hold the EE_Event if available
22
+	 *
23
+	 * @var EE_Event
24
+	 */
25
+	protected $_event;
26
+
27
+	/**
28
+	 * Will hold the EE_Venue if available
29
+	 *
30
+	 * @var EE_Venue
31
+	 */
32
+	protected $_venue;
33
+
34
+
35
+	/**
36
+	 * Initialize properties
37
+	 */
38
+	protected function _init_props()
39
+	{
40
+		$this->label = esc_html__('Venue Shortcodes', 'event_espresso');
41
+		$this->description = esc_html__('All shortcodes specific to venue related data', 'event_espresso');
42
+		$this->_shortcodes = array(
43
+			'[VENUE_TITLE]'             => esc_html__('The title for the event venue', 'event_espresso'),
44
+			'[VENUE_DESCRIPTION]'       => esc_html__('The description for the event venue', 'event_espresso'),
45
+			'[VENUE_URL]'               => esc_html__('A url to a webpage for the venue', 'event_espresso'),
46
+			'[VENUE_DETAILS_URL]'       => sprintf(
47
+				esc_html__(
48
+					'This shortcode outputs the url or website address to the venue details page on this website. This differs from %s which outputs what is entered in the "url" field in the venue details page.',
49
+					'event_espresso'
50
+				),
51
+				'[VENUE_URL]'
52
+			),
53
+			'[VENUE_IMAGE]'             => esc_html__('An image representing the event venue', 'event_espresso'),
54
+			'[VENUE_PHONE]'             => esc_html__('The phone number for the venue', 'event_espresso'),
55
+			'[VENUE_ADDRESS]'           => esc_html__('The address for the venue', 'event_espresso'),
56
+			'[VENUE_ADDRESS2]'          => esc_html__('Address 2 for the venue', 'event_espresso'),
57
+			'[VENUE_CITY]'              => esc_html__('The city the venue is in', 'event_espresso'),
58
+			'[VENUE_STATE]'             => esc_html__('The state the venue is located in', 'event_espresso'),
59
+			'[VENUE_COUNTRY]'           => esc_html__('The country the venue is located in', 'event_espresso'),
60
+			'[VENUE_FORMATTED_ADDRESS]' => esc_html__(
61
+				'This just outputs the venue address in a semantic address format.',
62
+				'event_espresso'
63
+			),
64
+			'[VENUE_ZIP]'               => esc_html__('The zip code for the venue address', 'event_espresso'),
65
+			'[VENUE_META_*]'            => esc_html__(
66
+				'This is a special dynamic shortcode. After the "*", add the exact name for your custom field, if there is a value set for that custom field within the venue then it will be output in place of this shortcode.',
67
+				'event_espresso'
68
+			),
69
+			'[GOOGLE_MAP_URL]'          => esc_html__(
70
+				'URL for the google map associated with the venue.',
71
+				'event_espresso'
72
+			),
73
+			'[GOOGLE_MAP_LINK]'         => esc_html__('Link to a google map for the venue', 'event_espresso'),
74
+			'[GOOGLE_MAP_IMAGE]'        => esc_html__('Google map for venue wrapped in image tags', 'event_espresso'),
75
+		);
76
+	}
77
+
78
+
79
+	/**
80
+	 * Parse incoming shortcode
81
+	 *
82
+	 * @param string $shortcode
83
+	 * @return string
84
+	 * @throws EE_Error
85
+	 * @throws EntityNotFoundException
86
+	 */
87
+	protected function _parser($shortcode)
88
+	{
89
+		$this->_venue = $this->_get_venue();
90
+		// If there is no venue object by now then get out.
91
+		if (! $this->_venue instanceof EE_Venue) {
92
+			return '';
93
+		}
94
+
95
+		switch ($shortcode) {
96
+			case '[VENUE_TITLE]':
97
+				return $this->_venue('title');
98
+				break;
99
+
100
+			case '[VENUE_DESCRIPTION]':
101
+				return $this->_venue('description');
102
+				break;
103
+
104
+			case '[VENUE_URL]':
105
+				return $this->_venue('url');
106
+				break;
107
+
108
+			case '[VENUE_IMAGE]':
109
+				return $this->_venue('image');
110
+				break;
111
+
112
+			case '[VENUE_PHONE]':
113
+				return $this->_venue('phone');
114
+				break;
115
+
116
+			case '[VENUE_ADDRESS]':
117
+				return $this->_venue('address');
118
+				break;
119
+
120
+			case '[VENUE_ADDRESS2]':
121
+				return $this->_venue('address2');
122
+				break;
123
+
124
+			case '[VENUE_CITY]':
125
+				return $this->_venue('city');
126
+				break;
127
+
128
+			case '[VENUE_COUNTRY]':
129
+				return $this->_venue('country');
130
+				break;
131
+
132
+			case '[VENUE_STATE]':
133
+				return $this->_venue('state');
134
+				break;
135
+
136
+			case '[VENUE_ZIP]':
137
+				return $this->_venue('zip');
138
+				break;
139
+
140
+			case '[VENUE_FORMATTED_ADDRESS]':
141
+				return $this->_venue('formatted_address');
142
+				break;
143
+
144
+			case '[GOOGLE_MAP_URL]':
145
+				return $this->_venue('gmap_url');
146
+				break;
147
+
148
+			case '[GOOGLE_MAP_LINK]':
149
+				return $this->_venue('gmap_link');
150
+				break;
151
+
152
+			case '[GOOGLE_MAP_IMAGE]':
153
+				return $this->_venue('gmap_link_img');
154
+				break;
155
+
156
+			case '[VENUE_DETAILS_URL]':
157
+				return $this->_venue('permalink');
158
+				break;
159
+		}
160
+
161
+		if (strpos($shortcode, '[VENUE_META_*') !== false) {
162
+			$shortcode = str_replace('[VENUE_META_*', '', $shortcode);
163
+			$shortcode = trim(str_replace(']', '', $shortcode));
164
+
165
+			// pull the meta value from the venue post
166
+			$venue_meta = $this->_venue->get_post_meta($shortcode, true);
167
+
168
+			return ! empty($venue_meta) ? $venue_meta : '';
169
+		}
170
+	}
171
+
172
+	/**
173
+	 * This retrieves the EE_Venue from the available data object.
174
+	 *
175
+	 * @return EE_Venue|null
176
+	 * @throws EE_Error
177
+	 * @throws EntityNotFoundException
178
+	 */
179
+	private function _get_venue()
180
+	{
181
+
182
+		// we need the EE_Event object to get the venue.
183
+		$this->_event = $this->_data instanceof EE_Event ? $this->_data : null;
184
+
185
+		// if no event, then let's see if there is a reg_obj.  If there IS, then we'll try and grab the event from the
186
+		// reg_obj instead.
187
+		if (! $this->_event instanceof EE_Event) {
188
+			$aee = $this->_data instanceof EE_Messages_Addressee ? $this->_data : null;
189
+			$aee = $this->_extra_data instanceof EE_Messages_Addressee ? $this->_extra_data : $aee;
190
+
191
+			$this->_event = $aee instanceof EE_Messages_Addressee && $aee->reg_obj instanceof EE_Registration
192
+				? $aee->reg_obj->event()
193
+				: null;
194
+
195
+			// if still empty do we have a ticket data item?
196
+			$this->_event = ! $this->_event instanceof EE_Event
197
+							&& $this->_data instanceof EE_Ticket
198
+							&& $this->_extra_data['data'] instanceof EE_Messages_Addressee
199
+				? $this->_extra_data['data']->tickets[ $this->_data->ID() ]['EE_Event']
200
+				: $this->_event;
201
+
202
+			// if STILL empty event, let's try to get the first event in the list of events via EE_Messages_Addressee
203
+			// and use that.
204
+			$this->_event = ! $this->_event instanceof EE_Event && $aee instanceof EE_Messages_Addressee
205
+				? reset($aee->events)
206
+				: $this->_event;
207
+		}
208
+
209
+		// If we have an event object use it to pull the venue.
210
+		if ($this->_event instanceof EE_Event) {
211
+			return $this->_event->get_first_related('Venue');
212
+		}
213
+
214
+		return null;
215
+	}
216
+
217
+	/**
218
+	 * This retrieves the specified venue information
219
+	 *
220
+	 * @param string $field What Venue field to retrieve
221
+	 * @return string What was retrieved!
222
+	 * @throws EE_Error
223
+	 * @throws EntityNotFoundException
224
+	 */
225
+	private function _venue($field)
226
+	{
227
+
228
+		if (! $this->_venue instanceof EE_Venue) {
229
+			return '';
230
+		} //no venue so get out.
231
+
232
+		switch ($field) {
233
+			case 'title':
234
+				return $this->_venue->get('VNU_name');
235
+				break;
236
+
237
+			case 'description':
238
+				return $this->_venue->get('VNU_desc');
239
+				break;
240
+
241
+			case 'url':
242
+				$url = $this->_venue->get('VNU_url');
243
+				return empty($url) ? $this->_venue->get_permalink() : $url;
244
+				break;
245
+
246
+			case 'permalink':
247
+				return $this->_venue->get_permalink();
248
+				break;
249
+
250
+			case 'image':
251
+				return '<img src="' . $this->_venue->feature_image_url(array(200, 200,))
252
+					   . '" alt="' . sprintf(
253
+						   esc_attr__('%s Feature Image', 'event_espresso'),
254
+						   $this->_venue->get('VNU_name')
255
+					   ) . '" />';
256
+				break;
257
+
258
+			case 'phone':
259
+				return $this->_venue->get('VNU_phone');
260
+				break;
261
+
262
+			case 'address':
263
+				return $this->_venue->get('VNU_address');
264
+				break;
265
+
266
+			case 'address2':
267
+				return $this->_venue->get('VNU_address2');
268
+				break;
269
+
270
+			case 'city':
271
+				return $this->_venue->get('VNU_city');
272
+				break;
273
+
274
+			case 'state':
275
+				$state = $this->_venue->state_obj();
276
+				return is_object($state) ? $state->get('STA_name') : '';
277
+				break;
278
+
279
+			case 'country':
280
+				$country = $this->_venue->country_obj();
281
+				return is_object($country) ? $country->get('CNT_name') : '';
282
+				break;
283
+
284
+			case 'zip':
285
+				return $this->_venue->get('VNU_zip');
286
+				break;
287
+
288
+			case 'formatted_address':
289
+				return EEH_Address::format($this->_venue);
290
+				break;
291
+
292
+			case 'gmap_link':
293
+			case 'gmap_url':
294
+			case 'gmap_link_img':
295
+				$atts = $this->get_map_attributes($this->_venue, $field);
296
+				return EEH_Maps::google_map_link($atts);
297
+				break;
298
+		}
299
+		return '';
300
+	}
301
+
302
+
303
+	/**
304
+	 * Generates the attributes for retrieving a google_map artifact.
305
+	 *
306
+	 * @param EE_Venue $venue
307
+	 * @param string   $field
308
+	 * @return array
309
+	 * @throws EE_Error
310
+	 */
311
+	protected function get_map_attributes(EE_Venue $venue, $field = 'gmap_link')
312
+	{
313
+		$state = $venue->state_obj();
314
+		$country = $venue->country_obj();
315
+		$atts = array(
316
+			'id'      => $venue->ID(),
317
+			'address' => $venue->get('VNU_address'),
318
+			'city'    => $venue->get('VNU_city'),
319
+			'state'   => is_object($state) ? $state->get('STA_name') : '',
320
+			'zip'     => $venue->get('VNU_zip'),
321
+			'country' => is_object($country) ? $country->get('CNT_name') : '',
322
+			'type'    => $field === 'gmap_link' ? 'url' : 'map',
323
+			'map_w'   => 200,
324
+			'map_h'   => 200,
325
+		);
326
+		if ($field === 'gmap_url') {
327
+			$atts['type'] = 'url_only';
328
+		}
329
+		return $atts;
330
+	}
331 331
 }
Please login to merge, or discard this patch.
Spacing   +7 added lines, -7 removed lines patch added patch discarded remove patch
@@ -88,7 +88,7 @@  discard block
 block discarded – undo
88 88
     {
89 89
         $this->_venue = $this->_get_venue();
90 90
         // If there is no venue object by now then get out.
91
-        if (! $this->_venue instanceof EE_Venue) {
91
+        if ( ! $this->_venue instanceof EE_Venue) {
92 92
             return '';
93 93
         }
94 94
 
@@ -184,7 +184,7 @@  discard block
 block discarded – undo
184 184
 
185 185
         // if no event, then let's see if there is a reg_obj.  If there IS, then we'll try and grab the event from the
186 186
         // reg_obj instead.
187
-        if (! $this->_event instanceof EE_Event) {
187
+        if ( ! $this->_event instanceof EE_Event) {
188 188
             $aee = $this->_data instanceof EE_Messages_Addressee ? $this->_data : null;
189 189
             $aee = $this->_extra_data instanceof EE_Messages_Addressee ? $this->_extra_data : $aee;
190 190
 
@@ -196,7 +196,7 @@  discard block
 block discarded – undo
196 196
             $this->_event = ! $this->_event instanceof EE_Event
197 197
                             && $this->_data instanceof EE_Ticket
198 198
                             && $this->_extra_data['data'] instanceof EE_Messages_Addressee
199
-                ? $this->_extra_data['data']->tickets[ $this->_data->ID() ]['EE_Event']
199
+                ? $this->_extra_data['data']->tickets[$this->_data->ID()]['EE_Event']
200 200
                 : $this->_event;
201 201
 
202 202
             // if STILL empty event, let's try to get the first event in the list of events via EE_Messages_Addressee
@@ -225,7 +225,7 @@  discard block
 block discarded – undo
225 225
     private function _venue($field)
226 226
     {
227 227
 
228
-        if (! $this->_venue instanceof EE_Venue) {
228
+        if ( ! $this->_venue instanceof EE_Venue) {
229 229
             return '';
230 230
         } //no venue so get out.
231 231
 
@@ -248,11 +248,11 @@  discard block
 block discarded – undo
248 248
                 break;
249 249
 
250 250
             case 'image':
251
-                return '<img src="' . $this->_venue->feature_image_url(array(200, 200,))
252
-                       . '" alt="' . sprintf(
251
+                return '<img src="'.$this->_venue->feature_image_url(array(200, 200,))
252
+                       . '" alt="'.sprintf(
253 253
                            esc_attr__('%s Feature Image', 'event_espresso'),
254 254
                            $this->_venue->get('VNU_name')
255
-                       ) . '" />';
255
+                       ).'" />';
256 256
                 break;
257 257
 
258 258
             case 'phone':
Please login to merge, or discard this patch.
core/libraries/form_sections/inputs/EE_Radio_Button_Input.input.php 1 patch
Indentation   +17 added lines, -17 removed lines patch added patch discarded remove patch
@@ -15,22 +15,22 @@
 block discarded – undo
15 15
 class EE_Radio_Button_Input extends EE_Form_Input_With_Options_Base
16 16
 {
17 17
 
18
-    /**
19
-     * @param array $answer_options
20
-     * @param array $input_settings
21
-     */
22
-    public function __construct($answer_options, $input_settings = array())
23
-    {
24
-        $this->_set_display_strategy(new EE_Radio_Button_Display_Strategy());
25
-        $this->_add_validation_strategy(
26
-            new EE_Enum_Validation_Strategy(
27
-                isset($input_settings['validation_error_message'])
28
-                    ? $input_settings['validation_error_message']
29
-                    : null
30
-            )
31
-        );
32
-        $this->_multiple_selections = false;
33
-        parent::__construct($answer_options, $input_settings);
34
-    }
18
+	/**
19
+	 * @param array $answer_options
20
+	 * @param array $input_settings
21
+	 */
22
+	public function __construct($answer_options, $input_settings = array())
23
+	{
24
+		$this->_set_display_strategy(new EE_Radio_Button_Display_Strategy());
25
+		$this->_add_validation_strategy(
26
+			new EE_Enum_Validation_Strategy(
27
+				isset($input_settings['validation_error_message'])
28
+					? $input_settings['validation_error_message']
29
+					: null
30
+			)
31
+		);
32
+		$this->_multiple_selections = false;
33
+		parent::__construct($answer_options, $input_settings);
34
+	}
35 35
 
36 36
 }
Please login to merge, or discard this patch.
core/libraries/form_sections/inputs/EE_Datepicker_Input.php 2 patches
Spacing   +2 added lines, -2 removed lines patch added patch discarded remove patch
@@ -29,7 +29,7 @@  discard block
 block discarded – undo
29 29
             )
30 30
         );
31 31
         parent::__construct($input_settings);
32
-        $this->set_html_class($this->html_class() . ' datepicker');
32
+        $this->set_html_class($this->html_class().' datepicker');
33 33
         // add some style and make it dance
34 34
         add_action('wp_enqueue_scripts', array('EE_Datepicker_Input', 'enqueue_styles_and_scripts'));
35 35
         add_action('admin_enqueue_scripts', array('EE_Datepicker_Input', 'enqueue_styles_and_scripts'));
@@ -48,7 +48,7 @@  discard block
 block discarded – undo
48 48
         // load css
49 49
         wp_register_style(
50 50
             'espresso-ui-theme',
51
-            EE_GLOBAL_ASSETS_URL . 'css/espresso-ui-theme/jquery-ui-1.10.3.custom.min.css',
51
+            EE_GLOBAL_ASSETS_URL.'css/espresso-ui-theme/jquery-ui-1.10.3.custom.min.css',
52 52
             array(),
53 53
             EVENT_ESPRESSO_VERSION
54 54
         );
Please login to merge, or discard this patch.
Indentation   +38 added lines, -38 removed lines patch added patch discarded remove patch
@@ -10,45 +10,45 @@
 block discarded – undo
10 10
 class EE_Datepicker_Input extends EE_Form_Input_Base
11 11
 {
12 12
 
13
-    /**
14
-     * @param array $input_settings
15
-     */
16
-    public function __construct($input_settings = array())
17
-    {
18
-        $this->_set_display_strategy(new EE_Text_Input_Display_Strategy('datepicker'));
19
-        $this->_set_normalization_strategy(new EE_Text_Normalization());
20
-        // we could do better for validation, but at least verify its plaintext
21
-        $this->_add_validation_strategy(
22
-            new EE_Plaintext_Validation_Strategy(
23
-                isset($input_settings['validation_error_message'])
24
-                    ? $input_settings['validation_error_message']
25
-                    : null
26
-            )
27
-        );
28
-        parent::__construct($input_settings);
29
-        $this->set_html_class($this->html_class() . ' datepicker');
30
-        // add some style and make it dance
31
-        add_action('wp_enqueue_scripts', array('EE_Datepicker_Input', 'enqueue_styles_and_scripts'));
32
-        add_action('admin_enqueue_scripts', array('EE_Datepicker_Input', 'enqueue_styles_and_scripts'));
33
-    }
13
+	/**
14
+	 * @param array $input_settings
15
+	 */
16
+	public function __construct($input_settings = array())
17
+	{
18
+		$this->_set_display_strategy(new EE_Text_Input_Display_Strategy('datepicker'));
19
+		$this->_set_normalization_strategy(new EE_Text_Normalization());
20
+		// we could do better for validation, but at least verify its plaintext
21
+		$this->_add_validation_strategy(
22
+			new EE_Plaintext_Validation_Strategy(
23
+				isset($input_settings['validation_error_message'])
24
+					? $input_settings['validation_error_message']
25
+					: null
26
+			)
27
+		);
28
+		parent::__construct($input_settings);
29
+		$this->set_html_class($this->html_class() . ' datepicker');
30
+		// add some style and make it dance
31
+		add_action('wp_enqueue_scripts', array('EE_Datepicker_Input', 'enqueue_styles_and_scripts'));
32
+		add_action('admin_enqueue_scripts', array('EE_Datepicker_Input', 'enqueue_styles_and_scripts'));
33
+	}
34 34
 
35 35
 
36 36
 
37
-    /**
38
-     *    enqueue_styles_and_scripts
39
-     *
40
-     * @access        public
41
-     * @return        void
42
-     */
43
-    public static function enqueue_styles_and_scripts()
44
-    {
45
-        // load css
46
-        wp_register_style(
47
-            'espresso-ui-theme',
48
-            EE_GLOBAL_ASSETS_URL . 'css/espresso-ui-theme/jquery-ui-1.10.3.custom.min.css',
49
-            array(),
50
-            EVENT_ESPRESSO_VERSION
51
-        );
52
-        wp_enqueue_style('espresso-ui-theme');
53
-    }
37
+	/**
38
+	 *    enqueue_styles_and_scripts
39
+	 *
40
+	 * @access        public
41
+	 * @return        void
42
+	 */
43
+	public static function enqueue_styles_and_scripts()
44
+	{
45
+		// load css
46
+		wp_register_style(
47
+			'espresso-ui-theme',
48
+			EE_GLOBAL_ASSETS_URL . 'css/espresso-ui-theme/jquery-ui-1.10.3.custom.min.css',
49
+			array(),
50
+			EVENT_ESPRESSO_VERSION
51
+		);
52
+		wp_enqueue_style('espresso-ui-theme');
53
+	}
54 54
 }
Please login to merge, or discard this patch.
public/Espresso_Arabica_2014/loop-espresso_event_attendees.php 3 patches
Indentation   +18 added lines, -18 removed lines patch added patch discarded remove patch
@@ -22,15 +22,15 @@  discard block
 block discarded – undo
22 22
 
23 23
 <div class="event-attendees">
24 24
     <?php do_action_ref_array(
25
-        'AHEE__loop-espresso_event_attendees__before',
26
-        array(
27
-            $contacts,
28
-            $event,
29
-            $datetime,
30
-            $ticket,
31
-            $show_gravatar,
32
-        )
33
-    ); ?>
25
+		'AHEE__loop-espresso_event_attendees__before',
26
+		array(
27
+			$contacts,
28
+			$event,
29
+			$datetime,
30
+			$ticket,
31
+			$show_gravatar,
32
+		)
33
+	); ?>
34 34
 	<?php if ( $contacts ) : ?>
35 35
 		<ul class="event-attendees-list">
36 36
 			<?php foreach( $contacts as $contact ) :
@@ -47,13 +47,13 @@  discard block
 block discarded – undo
47 47
 		<p><?php echo $no_attendees_message; ?></p>
48 48
 	<?php endif; ?>
49 49
     <?php do_action_ref_array(
50
-        'AHEE__loop-espresso_event_attendees__after',
51
-        array(
52
-            $contacts,
53
-            $event,
54
-            $datetime,
55
-            $ticket,
56
-            $show_gravatar,
57
-        )
58
-    ); ?>
50
+		'AHEE__loop-espresso_event_attendees__after',
51
+		array(
52
+			$contacts,
53
+			$event,
54
+			$datetime,
55
+			$ticket,
56
+			$show_gravatar,
57
+		)
58
+	); ?>
59 59
 </div>
60 60
\ No newline at end of file
Please login to merge, or discard this patch.
Spacing   +5 added lines, -5 removed lines patch added patch discarded remove patch
@@ -15,7 +15,7 @@  discard block
 block discarded – undo
15 15
  * @type bool       $show_gravatar  whether to show gravatar or not.
16 16
  */
17 17
 
18
-$no_attendees_message =  apply_filters( 'FHEE__loop-espresso_attendees-shortcode__template__no_attendees_message', __('No Attendees Yet', 'event_espresso' ) );
18
+$no_attendees_message = apply_filters('FHEE__loop-espresso_attendees-shortcode__template__no_attendees_message', __('No Attendees Yet', 'event_espresso'));
19 19
 
20 20
 
21 21
 ?>
@@ -31,16 +31,16 @@  discard block
 block discarded – undo
31 31
             $show_gravatar,
32 32
         )
33 33
     ); ?>
34
-	<?php if ( $contacts ) : ?>
34
+	<?php if ($contacts) : ?>
35 35
 		<ul class="event-attendees-list">
36
-			<?php foreach( $contacts as $contact ) :
37
-				EEH_Template::get_template_part( 'content', 'espresso_event_attendees', array( 
36
+			<?php foreach ($contacts as $contact) :
37
+				EEH_Template::get_template_part('content', 'espresso_event_attendees', array( 
38 38
 					'contact'       => $contact, 
39 39
 					'event'         => $event,
40 40
 					'datetime'      => $datetime,
41 41
 					'ticket'        => $ticket,
42 42
 					'show_gravatar' => $show_gravatar 
43
-				) );
43
+				));
44 44
 				endforeach; ?>
45 45
 		</ul>
46 46
 	<?php else : ?>
Please login to merge, or discard this patch.
Braces   +5 added lines, -2 removed lines patch added patch discarded remove patch
@@ -43,8 +43,11 @@
 block discarded – undo
43 43
 				) );
44 44
 				endforeach; ?>
45 45
 		</ul>
46
-	<?php else : ?>
47
-		<p><?php echo $no_attendees_message; ?></p>
46
+	<?php else {
47
+	: ?>
48
+		<p><?php echo $no_attendees_message;
49
+}
50
+?></p>
48 51
 	<?php endif; ?>
49 52
     <?php do_action_ref_array(
50 53
         'AHEE__loop-espresso_event_attendees__after',
Please login to merge, or discard this patch.
core/business/EE_Registration_Processor.class.php 3 patches
Doc Comments   +1 added lines, -1 removed lines patch added patch discarded remove patch
@@ -734,7 +734,7 @@
 block discarded – undo
734 734
      * @since 4.9.1
735 735
      * @param int                   $att_nmbr
736 736
      * @param EE_Line_Item | string $item
737
-     * @return string
737
+     * @return RegUrlLink
738 738
      * @throws InvalidArgumentException
739 739
      */
740 740
     public function generate_reg_url_link($att_nmbr, $item)
Please login to merge, or discard this patch.
Indentation   +763 added lines, -763 removed lines patch added patch discarded remove patch
@@ -24,767 +24,767 @@
 block discarded – undo
24 24
 class EE_Registration_Processor extends EE_Processor_Base
25 25
 {
26 26
 
27
-    /**
28
-     * @var EE_Registration_Processor $_instance
29
-     * @access    private
30
-     */
31
-    private static $_instance;
32
-
33
-    /**
34
-     * initial reg status at the beginning of this request.
35
-     * indexed by registration ID
36
-     *
37
-     * @var array
38
-     */
39
-    protected $_old_reg_status = array();
40
-
41
-    /**
42
-     * reg status at the end of the request after all processing.
43
-     * indexed by registration ID
44
-     *
45
-     * @var array
46
-     */
47
-    protected $_new_reg_status = array();
48
-
49
-    /**
50
-     * amounts paid at the end of the request after all processing.
51
-     * indexed by registration ID
52
-     *
53
-     * @var array
54
-     */
55
-    protected static $_amount_paid = array();
56
-
57
-    /**
58
-     * Cache of the reg final price for registrations corresponding to a ticket line item
59
-     *
60
-     * @deprecated
61
-     * @var array @see EEH_Line_Item::calculate_reg_final_prices_per_line_item()'s return value
62
-     */
63
-    protected $_reg_final_price_per_tkt_line_item;
64
-
65
-    /**
66
-     * @var EE_Request $request
67
-     */
68
-    protected $request;
69
-
70
-
71
-    /**
72
-     * @singleton method used to instantiate class object
73
-     * @param EE_Request|null $request
74
-     * @return EE_Registration_Processor instance
75
-     * @throws \InvalidArgumentException
76
-     * @throws \EventEspresso\core\exceptions\InvalidInterfaceException
77
-     * @throws \EventEspresso\core\exceptions\InvalidDataTypeException
78
-     */
79
-    public static function instance(EE_Request $request = null)
80
-    {
81
-        // check if class object is instantiated
82
-        if (! self::$_instance instanceof EE_Registration_Processor) {
83
-            if (! $request instanceof EE_Request) {
84
-                $request = LoaderFactory::getLoader()->getShared('EE_Request');
85
-            }
86
-            self::$_instance = new self($request);
87
-        }
88
-        return self::$_instance;
89
-    }
90
-
91
-
92
-    /**
93
-     * EE_Registration_Processor constructor.
94
-     *
95
-     * @param EE_Request $request
96
-     */
97
-    public function __construct(EE_Request $request)
98
-    {
99
-        $this->request = $request;
100
-    }
101
-
102
-
103
-    /**
104
-     * @param int $REG_ID
105
-     * @return string
106
-     */
107
-    public function old_reg_status($REG_ID)
108
-    {
109
-        return isset($this->_old_reg_status[ $REG_ID ]) ? $this->_old_reg_status[ $REG_ID ] : null;
110
-    }
111
-
112
-
113
-    /**
114
-     * @param int    $REG_ID
115
-     * @param string $old_reg_status
116
-     */
117
-    public function set_old_reg_status($REG_ID, $old_reg_status)
118
-    {
119
-        // only set the first time
120
-        if (! isset($this->_old_reg_status[ $REG_ID ])) {
121
-            $this->_old_reg_status[ $REG_ID ] = $old_reg_status;
122
-        }
123
-    }
124
-
125
-
126
-    /**
127
-     * @param int $REG_ID
128
-     * @return string
129
-     */
130
-    public function new_reg_status($REG_ID)
131
-    {
132
-        return isset($this->_new_reg_status[ $REG_ID ]) ? $this->_new_reg_status[ $REG_ID ] : null;
133
-    }
134
-
135
-
136
-    /**
137
-     * @param int    $REG_ID
138
-     * @param string $new_reg_status
139
-     */
140
-    public function set_new_reg_status($REG_ID, $new_reg_status)
141
-    {
142
-        $this->_new_reg_status[ $REG_ID ] = $new_reg_status;
143
-    }
144
-
145
-
146
-    /**
147
-     * reg_status_updated
148
-     *
149
-     * @param int $REG_ID
150
-     * @return bool
151
-     */
152
-    public function reg_status_updated($REG_ID)
153
-    {
154
-        return $this->new_reg_status($REG_ID) !== $this->old_reg_status($REG_ID);
155
-    }
156
-
157
-
158
-    /**
159
-     * @param EE_Registration $registration
160
-     * @throws EE_Error
161
-     * @throws EntityNotFoundException
162
-     * @throws InvalidArgumentException
163
-     * @throws InvalidDataTypeException
164
-     * @throws InvalidInterfaceException
165
-     * @throws ReflectionException
166
-     * @throws RuntimeException
167
-     */
168
-    public function update_registration_status_and_trigger_notifications(EE_Registration $registration)
169
-    {
170
-        $this->toggle_incomplete_registration_status_to_default($registration, false);
171
-        $this->toggle_registration_status_for_default_approved_events($registration, false);
172
-        $this->toggle_registration_status_if_no_monies_owing($registration, false);
173
-        $registration->save();
174
-        // trigger notifications
175
-        $this->trigger_registration_update_notifications($registration);
176
-    }
177
-
178
-
179
-    /**
180
-     *    manually_update_registration_status
181
-     *
182
-     * @access public
183
-     * @param EE_Registration $registration
184
-     * @param string          $new_reg_status
185
-     * @param bool            $save TRUE will save the registration if the status is updated, FALSE will leave that up
186
-     *                              to client code
187
-     * @return bool
188
-     * @throws EE_Error
189
-     * @throws EntityNotFoundException
190
-     * @throws InvalidArgumentException
191
-     * @throws InvalidDataTypeException
192
-     * @throws InvalidInterfaceException
193
-     * @throws ReflectionException
194
-     * @throws RuntimeException
195
-     */
196
-    public function manually_update_registration_status(
197
-        EE_Registration $registration,
198
-        $new_reg_status = '',
199
-        $save = true
200
-    ) {
201
-        // set initial REG_Status
202
-        $this->set_old_reg_status($registration->ID(), $registration->status_ID());
203
-        // set incoming REG_Status
204
-        $this->set_new_reg_status($registration->ID(), $new_reg_status);
205
-        // toggle reg status but only if it has changed and the user can do so
206
-        if ($this->reg_status_updated($registration->ID())
207
-            && (
208
-                (! $this->request->isAdmin() || $this->request->isFrontAjax())
209
-                || EE_Registry::instance()->CAP->current_user_can(
210
-                    'ee_edit_registration',
211
-                    'toggle_registration_status',
212
-                    $registration->ID()
213
-                )
214
-            )
215
-        ) {
216
-            // change status to new value
217
-            $updated = $registration->set_status($this->new_reg_status($registration->ID()));
218
-            if ($updated && $save) {
219
-                $registration->save();
220
-            }
221
-            return true;
222
-        }
223
-        return false;
224
-    }
225
-
226
-
227
-    /**
228
-     *    toggle_incomplete_registration_status_to_default
229
-     *        changes any incomplete registrations to either the event or global default registration status
230
-     *
231
-     * @access public
232
-     * @param EE_Registration       $registration
233
-     * @param bool                  $save TRUE will save the registration if the status is updated, FALSE will leave
234
-     *                                    that up to client code
235
-     * @param ContextInterface|null $context
236
-     * @return void
237
-     * @throws EE_Error
238
-     * @throws InvalidArgumentException
239
-     * @throws ReflectionException
240
-     * @throws RuntimeException
241
-     * @throws EntityNotFoundException
242
-     * @throws InvalidDataTypeException
243
-     * @throws InvalidInterfaceException
244
-     */
245
-    public function toggle_incomplete_registration_status_to_default(
246
-        EE_Registration $registration,
247
-        $save = true,
248
-        ContextInterface $context = null
249
-    ) {
250
-        $existing_reg_status = $registration->status_ID();
251
-        // set initial REG_Status
252
-        $this->set_old_reg_status($registration->ID(), $existing_reg_status);
253
-        // is the registration currently incomplete ?
254
-        if ($registration->status_ID() === EEM_Registration::status_id_incomplete) {
255
-            // grab default reg status for the event, if set
256
-            $event_default_registration_status = $registration->event()->default_registration_status();
257
-            // if no default reg status is set for the event, then use the global value
258
-            $STS_ID = ! empty($event_default_registration_status)
259
-                ? $event_default_registration_status
260
-                : EE_Registry::instance()->CFG->registration->default_STS_ID;
261
-            // if the event default reg status is approved, then downgrade temporarily to payment pending to ensure that payments are triggered
262
-            $STS_ID = $STS_ID === EEM_Registration::status_id_approved ? EEM_Registration::status_id_pending_payment
263
-                : $STS_ID;
264
-            // set incoming REG_Status
265
-            $this->set_new_reg_status($registration->ID(), $STS_ID);
266
-            $registration->set_status($STS_ID, false, $context);
267
-            if ($save) {
268
-                $registration->save();
269
-            }
270
-            // don't trigger notifications during IPNs because they will get triggered by EE_Payment_Processor
271
-            if (! EE_Processor_Base::$IPN) {
272
-                // otherwise, send out notifications
273
-                add_filter('FHEE__EED_Messages___maybe_registration__deliver_notifications', '__return_true', 10);
274
-            }
275
-            // DEBUG LOG
276
-            // $this->log(
277
-            //     __CLASS__,
278
-            //     __FUNCTION__,
279
-            //     __LINE__,
280
-            //     $registration->transaction(),
281
-            //     array(
282
-            //         'IPN' => EE_Processor_Base::$IPN,
283
-            //         'deliver_notifications' => has_filter(
284
-            //             'FHEE__EED_Messages___maybe_registration__deliver_notifications'
285
-            //         ),
286
-            //     )
287
-            // );
288
-        }
289
-    }
290
-
291
-
292
-    /**
293
-     *    toggle_registration_status_for_default_approved_events
294
-     *
295
-     * @access public
296
-     * @param EE_Registration $registration
297
-     * @param bool            $save TRUE will save the registration if the status is updated, FALSE will leave that up
298
-     *                              to client code
299
-     * @return bool
300
-     * @throws EE_Error
301
-     * @throws EntityNotFoundException
302
-     * @throws InvalidArgumentException
303
-     * @throws InvalidDataTypeException
304
-     * @throws InvalidInterfaceException
305
-     * @throws ReflectionException
306
-     * @throws RuntimeException
307
-     */
308
-    public function toggle_registration_status_for_default_approved_events(EE_Registration $registration, $save = true)
309
-    {
310
-        $reg_status = $registration->status_ID();
311
-        // set initial REG_Status
312
-        $this->set_old_reg_status($registration->ID(), $reg_status);
313
-        // if not already, toggle reg status to approved IF the event default reg status is approved
314
-        // ( as long as the registration wasn't cancelled or declined at some point )
315
-        if ($reg_status !== EEM_Registration::status_id_cancelled
316
-            && $reg_status
317
-               !== EEM_Registration::status_id_declined
318
-            && $reg_status !== EEM_Registration::status_id_approved
319
-            && $registration->event()->default_registration_status() === EEM_Registration::status_id_approved
320
-        ) {
321
-            // set incoming REG_Status
322
-            $this->set_new_reg_status($registration->ID(), EEM_Registration::status_id_approved);
323
-            // toggle status to approved
324
-            $registration->set_status(EEM_Registration::status_id_approved);
325
-            if ($save) {
326
-                $registration->save();
327
-            }
328
-            // don't trigger notifications during IPNs because they will get triggered by EE_Payment_Processor
329
-            if (! EE_Processor_Base::$IPN) {
330
-                // otherwise, send out notifications
331
-                add_filter('FHEE__EED_Messages___maybe_registration__deliver_notifications', '__return_true', 10);
332
-            }
333
-            // DEBUG LOG
334
-            // $this->log(
335
-            //     __CLASS__,
336
-            //     __FUNCTION__,
337
-            //     __LINE__,
338
-            //     $registration->transaction(),
339
-            //     array(
340
-            //         'IPN' => EE_Processor_Base::$IPN,
341
-            //         'deliver_notifications' => has_filter(
342
-            //             'FHEE__EED_Messages___maybe_registration__deliver_notifications'
343
-            //         ),
344
-            //     )
345
-            // );
346
-            return true;
347
-        }
348
-        return false;
349
-    }
350
-
351
-
352
-    /**
353
-     *    toggle_registration_statuses_if_no_monies_owing
354
-     *
355
-     * @access public
356
-     * @param EE_Registration $registration
357
-     * @param bool            $save TRUE will save the registration if the status is updated, FALSE will leave that up
358
-     *                              to client code
359
-     * @param array           $additional_details
360
-     * @return bool
361
-     * @throws EE_Error
362
-     * @throws EntityNotFoundException
363
-     * @throws InvalidArgumentException
364
-     * @throws InvalidDataTypeException
365
-     * @throws InvalidInterfaceException
366
-     * @throws ReflectionException
367
-     * @throws RuntimeException
368
-     */
369
-    public function toggle_registration_status_if_no_monies_owing(
370
-        EE_Registration $registration,
371
-        $save = true,
372
-        array $additional_details = array()
373
-    ) {
374
-        // set initial REG_Status
375
-        $this->set_old_reg_status($registration->ID(), $registration->status_ID());
376
-        // was a payment just made ?
377
-        $payment = isset($additional_details['payment_updates'], $additional_details['last_payment'])
378
-                   && $additional_details['payment_updates']
379
-                   && $additional_details['last_payment'] instanceof EE_Payment
380
-            ? $additional_details['last_payment']
381
-            : null;
382
-        $total_paid = array_sum(self::$_amount_paid);
383
-        // toggle reg status to approved IF
384
-        if (// REG status is pending payment
385
-            $registration->status_ID() === EEM_Registration::status_id_pending_payment
386
-            // AND no monies are owing
387
-            && (
388
-                (
389
-                    $registration->transaction()->is_completed()
390
-                    || $registration->transaction()->is_overpaid()
391
-                    || $registration->transaction()->is_free()
392
-                    || apply_filters(
393
-                        'FHEE__EE_Registration_Processor__toggle_registration_status_if_no_monies_owing',
394
-                        false,
395
-                        $registration
396
-                    )
397
-                )
398
-                || (
399
-                    $payment instanceof EE_Payment && $payment->is_approved()
400
-                    && // this specific registration has not yet been paid for
401
-                    ! isset(self::$_amount_paid[ $registration->ID() ])
402
-                    && // payment amount, less what we have already attributed to other registrations, is greater than this reg's final price
403
-                    $payment->amount() - $total_paid >= $registration->final_price()
404
-                )
405
-            )
406
-        ) {
407
-            // mark as paid
408
-            self::$_amount_paid[ $registration->ID() ] = $registration->final_price();
409
-            // track new REG_Status
410
-            $this->set_new_reg_status($registration->ID(), EEM_Registration::status_id_approved);
411
-            // toggle status to approved
412
-            $registration->set_status(EEM_Registration::status_id_approved);
413
-            if ($save) {
414
-                $registration->save();
415
-            }
416
-            // don't trigger notifications during IPNs because they will get triggered by EE_Payment_Processor
417
-            if (! EE_Processor_Base::$IPN) {
418
-                // otherwise, send out notifications
419
-                add_filter('FHEE__EED_Messages___maybe_registration__deliver_notifications', '__return_true', 10);
420
-            }
421
-            // DEBUG LOG
422
-            // $this->log(
423
-            //     __CLASS__,
424
-            //     __FUNCTION__,
425
-            //     __LINE__,
426
-            //     $registration->transaction(),
427
-            //     array(
428
-            //         'IPN' => EE_Processor_Base::$IPN,
429
-            //         'deliver_notifications' => has_filter(
430
-            //             'FHEE__EED_Messages___maybe_registration__deliver_notifications'
431
-            //         ),
432
-            //     )
433
-            // );
434
-            return true;
435
-        }
436
-        return false;
437
-    }
438
-
439
-
440
-    /**
441
-     *    registration_status_changed
442
-     *
443
-     * @access public
444
-     * @param EE_Registration $registration
445
-     * @param array           $additional_details
446
-     * @return void
447
-     */
448
-    public function trigger_registration_update_notifications($registration, array $additional_details = array())
449
-    {
450
-        try {
451
-            if (! $registration instanceof EE_Registration) {
452
-                throw new EE_Error(
453
-                    esc_html__('An invalid registration was received.', 'event_espresso')
454
-                );
455
-            }
456
-            // EE_Registry::instance()->load_helper('Debug_Tools');
457
-            // EEH_Debug_Tools::log(
458
-            //     __CLASS__,
459
-            //     __FUNCTION__,
460
-            //     __LINE__,
461
-            //     array($registration->transaction(), $additional_details),
462
-            //     false,
463
-            //     'EE_Transaction: ' . $registration->transaction()->ID()
464
-            // );
465
-            if (! $registration->is_primary_registrant()) {
466
-                return;
467
-            }
468
-            do_action(
469
-                'AHEE__EE_Registration_Processor__trigger_registration_update_notifications',
470
-                $registration,
471
-                $additional_details
472
-            );
473
-        } catch (Exception $e) {
474
-            EE_Error::add_error($e->getMessage(), $e->getFile(), 'unknown_function_from_exception', $e->getLine());
475
-        }
476
-    }
477
-
478
-
479
-    /**
480
-     * sets reg status based either on passed param or on transaction status and event pre-approval setting
481
-     *
482
-     * @param EE_Registration $registration
483
-     * @param array           $additional_details
484
-     * @return bool
485
-     * @throws EE_Error
486
-     * @throws EntityNotFoundException
487
-     * @throws InvalidArgumentException
488
-     * @throws InvalidDataTypeException
489
-     * @throws InvalidInterfaceException
490
-     * @throws ReflectionException
491
-     * @throws RuntimeException
492
-     */
493
-    public function update_registration_after_checkout_or_payment(
494
-        EE_Registration $registration,
495
-        array $additional_details = array()
496
-    ) {
497
-        // set initial REG_Status
498
-        $this->set_old_reg_status($registration->ID(), $registration->status_ID());
499
-        // if the registration status gets updated, then save the registration
500
-        if ($this->toggle_registration_status_for_default_approved_events($registration, false)
501
-            || $this->toggle_registration_status_if_no_monies_owing(
502
-                $registration,
503
-                false,
504
-                $additional_details
505
-            )
506
-        ) {
507
-            $registration->save();
508
-        }
509
-        // set new  REG_Status
510
-        $this->set_new_reg_status($registration->ID(), $registration->status_ID());
511
-        return $this->reg_status_updated($registration->ID())
512
-               && $this->new_reg_status($registration->ID()) === EEM_Registration::status_id_approved;
513
-    }
514
-
515
-
516
-    /**
517
-     * Updates the registration' final prices based on the current line item tree (taking into account
518
-     * discounts, taxes, and other line items unrelated to tickets.)
519
-     *
520
-     * @param EE_Transaction $transaction
521
-     * @param boolean        $save_regs whether to immediately save registrations in this function or not
522
-     * @return void
523
-     * @throws EE_Error
524
-     * @throws InvalidArgumentException
525
-     * @throws InvalidDataTypeException
526
-     * @throws InvalidInterfaceException
527
-     * @throws RuntimeException
528
-     */
529
-    public function update_registration_final_prices($transaction, $save_regs = true)
530
-    {
531
-        $reg_final_price_per_ticket_line_item = EEH_Line_Item::calculate_reg_final_prices_per_line_item(
532
-            $transaction->total_line_item()
533
-        );
534
-        foreach ($transaction->registrations() as $registration) {
535
-            /** @var EE_Line_Item $line_item */
536
-            $line_item = EEM_Line_Item::instance()->get_line_item_for_registration($registration);
537
-            if (isset($reg_final_price_per_ticket_line_item[ $line_item->ID() ])) {
538
-                $registration->set_final_price($reg_final_price_per_ticket_line_item[ $line_item->ID() ]);
539
-                if ($save_regs) {
540
-                    $registration->save();
541
-                }
542
-            }
543
-        }
544
-        // and make sure there's no rounding problem
545
-        $this->fix_reg_final_price_rounding_issue($transaction);
546
-    }
547
-
548
-
549
-    /**
550
-     * Makes sure there is no rounding errors for the REG_final_prices.
551
-     * Eg, if we have 3 registrations for $1, and there is a $0.01 discount between the three of them,
552
-     * they will each be for $0.99333333, which gets rounded to $1 again.
553
-     * So the transaction total will be $2.99, but each registration will be for $1,
554
-     * so if each registrant paid individually they will have overpaid by $0.01.
555
-     * So in order to overcome this, we check for any difference, and if there is a difference
556
-     * we just grab one registrant at random and make them responsible for it.
557
-     * This should be used after setting REG_final_prices (it's done automatically as part of
558
-     * EE_Registration_Processor::update_registration_final_prices())
559
-     *
560
-     * @param EE_Transaction $transaction
561
-     * @return bool success verifying that there is NO difference after this method is done
562
-     * @throws EE_Error
563
-     * @throws InvalidArgumentException
564
-     * @throws InvalidDataTypeException
565
-     * @throws InvalidInterfaceException
566
-     */
567
-    public function fix_reg_final_price_rounding_issue($transaction)
568
-    {
569
-        $reg_final_price_sum = EEM_Registration::instance()->sum(
570
-            array(
571
-                array(
572
-                    'TXN_ID' => $transaction->ID(),
573
-                ),
574
-            ),
575
-            'REG_final_price'
576
-        );
577
-        $diff = $transaction->total() - $reg_final_price_sum;
578
-        // ok then, just grab one of the registrations
579
-        if ($diff !== 0) {
580
-            $a_reg = EEM_Registration::instance()->get_one(
581
-                array(
582
-                    array(
583
-                        'TXN_ID' => $transaction->ID(),
584
-                    ),
585
-                )
586
-            );
587
-            return $a_reg instanceof EE_Registration
588
-                ? (bool) $a_reg->save(array('REG_final_price' => $a_reg->final_price() + $diff))
589
-                : false;
590
-        }
591
-        return true;
592
-    }
593
-
594
-
595
-    /**
596
-     * update_registration_after_being_canceled_or_declined
597
-     *
598
-     * @param EE_Registration $registration
599
-     * @param array           $closed_reg_statuses
600
-     * @param bool            $update_reg
601
-     * @return bool
602
-     * @throws EE_Error
603
-     * @throws RuntimeException
604
-     */
605
-    public function update_registration_after_being_canceled_or_declined(
606
-        EE_Registration $registration,
607
-        array $closed_reg_statuses = array(),
608
-        $update_reg = true
609
-    ) {
610
-        // these reg statuses should not be considered in any calculations involving monies owing
611
-        $closed_reg_statuses = ! empty($closed_reg_statuses)
612
-            ? $closed_reg_statuses
613
-            : EEM_Registration::closed_reg_statuses();
614
-        if (! in_array($registration->status_ID(), $closed_reg_statuses, true)) {
615
-            return false;
616
-        }
617
-        // release a reserved ticket by decrementing ticket and datetime reserved values
618
-        $registration->release_reserved_ticket(true, 'RegProcessor:' . __LINE__);
619
-        $registration->set_final_price(0);
620
-        if ($update_reg) {
621
-            $registration->save();
622
-        }
623
-        return true;
624
-    }
625
-
626
-
627
-    /**
628
-     * update_canceled_or_declined_registration_after_being_reinstated
629
-     *
630
-     * @param EE_Registration $registration
631
-     * @param array           $closed_reg_statuses
632
-     * @param bool            $update_reg
633
-     * @return bool
634
-     * @throws EE_Error
635
-     * @throws RuntimeException
636
-     */
637
-    public function update_canceled_or_declined_registration_after_being_reinstated(
638
-        EE_Registration $registration,
639
-        array $closed_reg_statuses = array(),
640
-        $update_reg = true
641
-    ) {
642
-        // these reg statuses should not be considered in any calculations involving monies owing
643
-        $closed_reg_statuses = ! empty($closed_reg_statuses) ? $closed_reg_statuses
644
-            : EEM_Registration::closed_reg_statuses();
645
-        if (in_array($registration->status_ID(), $closed_reg_statuses, true)) {
646
-            return false;
647
-        }
648
-        $ticket = $registration->ticket();
649
-        if (! $ticket instanceof EE_Ticket) {
650
-            throw new EE_Error(
651
-                sprintf(
652
-                    esc_html__(
653
-                        'The Ticket for Registration %1$d was not found or is invalid.',
654
-                        'event_espresso'
655
-                    ),
656
-                    $registration->ticket_ID()
657
-                )
658
-            );
659
-        }
660
-        $registration->set_final_price($ticket->price());
661
-        if ($update_reg) {
662
-            $registration->save();
663
-        }
664
-        return true;
665
-    }
666
-
667
-
668
-    /**
669
-     * generate_ONE_registration_from_line_item
670
-     * Although a ticket line item may have a quantity greater than 1,
671
-     * this method will ONLY CREATE ONE REGISTRATION !!!
672
-     * Regardless of the ticket line item quantity.
673
-     * This means that any code calling this method is responsible for ensuring
674
-     * that the final registration count matches the ticket line item quantity.
675
-     * This was done to make it easier to match the number of registrations
676
-     * to the number of tickets in the cart, when the cart has been edited
677
-     * after SPCO has already been initialized. So if an additional ticket was added to the cart, you can simply pass
678
-     * the line item to this method to add a second ticket, and in this case, you would not want to add 2 tickets.
679
-     *
680
-     * @deprecated
681
-     * @since 4.9.1
682
-     * @param EE_Line_Item    $line_item
683
-     * @param \EE_Transaction $transaction
684
-     * @param int             $att_nmbr
685
-     * @param int             $total_ticket_count
686
-     * @return EE_Registration | null
687
-     * @throws \OutOfRangeException
688
-     * @throws \EventEspresso\core\exceptions\UnexpectedEntityException
689
-     * @throws \EE_Error
690
-     */
691
-    public function generate_ONE_registration_from_line_item(
692
-        EE_Line_Item $line_item,
693
-        EE_Transaction $transaction,
694
-        $att_nmbr = 1,
695
-        $total_ticket_count = 1
696
-    ) {
697
-        EE_Error::doing_it_wrong(
698
-            __CLASS__ . '::' . __FUNCTION__,
699
-            sprintf(
700
-                esc_html__('This method is deprecated. Please use "%s" instead', 'event_espresso'),
701
-                '\EventEspresso\core\domain\services\registration\CreateRegistrationService::create()'
702
-            ),
703
-            '4.9.1',
704
-            '5.0.0'
705
-        );
706
-        // grab the related ticket object for this line_item
707
-        $ticket = $line_item->ticket();
708
-        if (! $ticket instanceof EE_Ticket) {
709
-            EE_Error::add_error(
710
-                sprintf(
711
-                    esc_html__('Line item %s did not contain a valid ticket', 'event_espresso'),
712
-                    $line_item->ID()
713
-                ),
714
-                __FILE__,
715
-                __FUNCTION__,
716
-                __LINE__
717
-            );
718
-            return null;
719
-        }
720
-        $registration_service = new CreateRegistrationService();
721
-        // then generate a new registration from that
722
-        return $registration_service->create(
723
-            $ticket->get_related_event(),
724
-            $transaction,
725
-            $ticket,
726
-            $line_item,
727
-            $att_nmbr,
728
-            $total_ticket_count
729
-        );
730
-    }
731
-
732
-
733
-    /**
734
-     * generates reg_url_link
735
-     *
736
-     * @deprecated
737
-     * @since 4.9.1
738
-     * @param int                   $att_nmbr
739
-     * @param EE_Line_Item | string $item
740
-     * @return string
741
-     * @throws InvalidArgumentException
742
-     */
743
-    public function generate_reg_url_link($att_nmbr, $item)
744
-    {
745
-        EE_Error::doing_it_wrong(
746
-            __CLASS__ . '::' . __FUNCTION__,
747
-            sprintf(
748
-                esc_html__('This method is deprecated. Please use "%s" instead', 'event_espresso'),
749
-                'EventEspresso\core\domain\entities\RegUrlLink'
750
-            ),
751
-            '4.9.1',
752
-            '5.0.0'
753
-        );
754
-        return new RegUrlLink($att_nmbr, $item);
755
-    }
756
-
757
-
758
-    /**
759
-     * generates reg code
760
-     *
761
-     * @deprecated
762
-     * @since 4.9.1
763
-     * @param EE_Registration $registration
764
-     * @return string
765
-     * @throws EE_Error
766
-     * @throws EntityNotFoundException
767
-     * @throws InvalidArgumentException
768
-     */
769
-    public function generate_reg_code(EE_Registration $registration)
770
-    {
771
-        EE_Error::doing_it_wrong(
772
-            __CLASS__ . '::' . __FUNCTION__,
773
-            sprintf(
774
-                esc_html__('This method is deprecated. Please use "%s" instead', 'event_espresso'),
775
-                'EventEspresso\core\domain\entities\RegCode'
776
-            ),
777
-            '4.9.1',
778
-            '5.0.0'
779
-        );
780
-        return apply_filters(
781
-            'FHEE__EE_Registration_Processor___generate_reg_code__new_reg_code',
782
-            new RegCode(
783
-                RegUrlLink::fromRegistration($registration),
784
-                $registration->transaction(),
785
-                $registration->ticket()
786
-            ),
787
-            $registration
788
-        );
789
-    }
27
+	/**
28
+	 * @var EE_Registration_Processor $_instance
29
+	 * @access    private
30
+	 */
31
+	private static $_instance;
32
+
33
+	/**
34
+	 * initial reg status at the beginning of this request.
35
+	 * indexed by registration ID
36
+	 *
37
+	 * @var array
38
+	 */
39
+	protected $_old_reg_status = array();
40
+
41
+	/**
42
+	 * reg status at the end of the request after all processing.
43
+	 * indexed by registration ID
44
+	 *
45
+	 * @var array
46
+	 */
47
+	protected $_new_reg_status = array();
48
+
49
+	/**
50
+	 * amounts paid at the end of the request after all processing.
51
+	 * indexed by registration ID
52
+	 *
53
+	 * @var array
54
+	 */
55
+	protected static $_amount_paid = array();
56
+
57
+	/**
58
+	 * Cache of the reg final price for registrations corresponding to a ticket line item
59
+	 *
60
+	 * @deprecated
61
+	 * @var array @see EEH_Line_Item::calculate_reg_final_prices_per_line_item()'s return value
62
+	 */
63
+	protected $_reg_final_price_per_tkt_line_item;
64
+
65
+	/**
66
+	 * @var EE_Request $request
67
+	 */
68
+	protected $request;
69
+
70
+
71
+	/**
72
+	 * @singleton method used to instantiate class object
73
+	 * @param EE_Request|null $request
74
+	 * @return EE_Registration_Processor instance
75
+	 * @throws \InvalidArgumentException
76
+	 * @throws \EventEspresso\core\exceptions\InvalidInterfaceException
77
+	 * @throws \EventEspresso\core\exceptions\InvalidDataTypeException
78
+	 */
79
+	public static function instance(EE_Request $request = null)
80
+	{
81
+		// check if class object is instantiated
82
+		if (! self::$_instance instanceof EE_Registration_Processor) {
83
+			if (! $request instanceof EE_Request) {
84
+				$request = LoaderFactory::getLoader()->getShared('EE_Request');
85
+			}
86
+			self::$_instance = new self($request);
87
+		}
88
+		return self::$_instance;
89
+	}
90
+
91
+
92
+	/**
93
+	 * EE_Registration_Processor constructor.
94
+	 *
95
+	 * @param EE_Request $request
96
+	 */
97
+	public function __construct(EE_Request $request)
98
+	{
99
+		$this->request = $request;
100
+	}
101
+
102
+
103
+	/**
104
+	 * @param int $REG_ID
105
+	 * @return string
106
+	 */
107
+	public function old_reg_status($REG_ID)
108
+	{
109
+		return isset($this->_old_reg_status[ $REG_ID ]) ? $this->_old_reg_status[ $REG_ID ] : null;
110
+	}
111
+
112
+
113
+	/**
114
+	 * @param int    $REG_ID
115
+	 * @param string $old_reg_status
116
+	 */
117
+	public function set_old_reg_status($REG_ID, $old_reg_status)
118
+	{
119
+		// only set the first time
120
+		if (! isset($this->_old_reg_status[ $REG_ID ])) {
121
+			$this->_old_reg_status[ $REG_ID ] = $old_reg_status;
122
+		}
123
+	}
124
+
125
+
126
+	/**
127
+	 * @param int $REG_ID
128
+	 * @return string
129
+	 */
130
+	public function new_reg_status($REG_ID)
131
+	{
132
+		return isset($this->_new_reg_status[ $REG_ID ]) ? $this->_new_reg_status[ $REG_ID ] : null;
133
+	}
134
+
135
+
136
+	/**
137
+	 * @param int    $REG_ID
138
+	 * @param string $new_reg_status
139
+	 */
140
+	public function set_new_reg_status($REG_ID, $new_reg_status)
141
+	{
142
+		$this->_new_reg_status[ $REG_ID ] = $new_reg_status;
143
+	}
144
+
145
+
146
+	/**
147
+	 * reg_status_updated
148
+	 *
149
+	 * @param int $REG_ID
150
+	 * @return bool
151
+	 */
152
+	public function reg_status_updated($REG_ID)
153
+	{
154
+		return $this->new_reg_status($REG_ID) !== $this->old_reg_status($REG_ID);
155
+	}
156
+
157
+
158
+	/**
159
+	 * @param EE_Registration $registration
160
+	 * @throws EE_Error
161
+	 * @throws EntityNotFoundException
162
+	 * @throws InvalidArgumentException
163
+	 * @throws InvalidDataTypeException
164
+	 * @throws InvalidInterfaceException
165
+	 * @throws ReflectionException
166
+	 * @throws RuntimeException
167
+	 */
168
+	public function update_registration_status_and_trigger_notifications(EE_Registration $registration)
169
+	{
170
+		$this->toggle_incomplete_registration_status_to_default($registration, false);
171
+		$this->toggle_registration_status_for_default_approved_events($registration, false);
172
+		$this->toggle_registration_status_if_no_monies_owing($registration, false);
173
+		$registration->save();
174
+		// trigger notifications
175
+		$this->trigger_registration_update_notifications($registration);
176
+	}
177
+
178
+
179
+	/**
180
+	 *    manually_update_registration_status
181
+	 *
182
+	 * @access public
183
+	 * @param EE_Registration $registration
184
+	 * @param string          $new_reg_status
185
+	 * @param bool            $save TRUE will save the registration if the status is updated, FALSE will leave that up
186
+	 *                              to client code
187
+	 * @return bool
188
+	 * @throws EE_Error
189
+	 * @throws EntityNotFoundException
190
+	 * @throws InvalidArgumentException
191
+	 * @throws InvalidDataTypeException
192
+	 * @throws InvalidInterfaceException
193
+	 * @throws ReflectionException
194
+	 * @throws RuntimeException
195
+	 */
196
+	public function manually_update_registration_status(
197
+		EE_Registration $registration,
198
+		$new_reg_status = '',
199
+		$save = true
200
+	) {
201
+		// set initial REG_Status
202
+		$this->set_old_reg_status($registration->ID(), $registration->status_ID());
203
+		// set incoming REG_Status
204
+		$this->set_new_reg_status($registration->ID(), $new_reg_status);
205
+		// toggle reg status but only if it has changed and the user can do so
206
+		if ($this->reg_status_updated($registration->ID())
207
+			&& (
208
+				(! $this->request->isAdmin() || $this->request->isFrontAjax())
209
+				|| EE_Registry::instance()->CAP->current_user_can(
210
+					'ee_edit_registration',
211
+					'toggle_registration_status',
212
+					$registration->ID()
213
+				)
214
+			)
215
+		) {
216
+			// change status to new value
217
+			$updated = $registration->set_status($this->new_reg_status($registration->ID()));
218
+			if ($updated && $save) {
219
+				$registration->save();
220
+			}
221
+			return true;
222
+		}
223
+		return false;
224
+	}
225
+
226
+
227
+	/**
228
+	 *    toggle_incomplete_registration_status_to_default
229
+	 *        changes any incomplete registrations to either the event or global default registration status
230
+	 *
231
+	 * @access public
232
+	 * @param EE_Registration       $registration
233
+	 * @param bool                  $save TRUE will save the registration if the status is updated, FALSE will leave
234
+	 *                                    that up to client code
235
+	 * @param ContextInterface|null $context
236
+	 * @return void
237
+	 * @throws EE_Error
238
+	 * @throws InvalidArgumentException
239
+	 * @throws ReflectionException
240
+	 * @throws RuntimeException
241
+	 * @throws EntityNotFoundException
242
+	 * @throws InvalidDataTypeException
243
+	 * @throws InvalidInterfaceException
244
+	 */
245
+	public function toggle_incomplete_registration_status_to_default(
246
+		EE_Registration $registration,
247
+		$save = true,
248
+		ContextInterface $context = null
249
+	) {
250
+		$existing_reg_status = $registration->status_ID();
251
+		// set initial REG_Status
252
+		$this->set_old_reg_status($registration->ID(), $existing_reg_status);
253
+		// is the registration currently incomplete ?
254
+		if ($registration->status_ID() === EEM_Registration::status_id_incomplete) {
255
+			// grab default reg status for the event, if set
256
+			$event_default_registration_status = $registration->event()->default_registration_status();
257
+			// if no default reg status is set for the event, then use the global value
258
+			$STS_ID = ! empty($event_default_registration_status)
259
+				? $event_default_registration_status
260
+				: EE_Registry::instance()->CFG->registration->default_STS_ID;
261
+			// if the event default reg status is approved, then downgrade temporarily to payment pending to ensure that payments are triggered
262
+			$STS_ID = $STS_ID === EEM_Registration::status_id_approved ? EEM_Registration::status_id_pending_payment
263
+				: $STS_ID;
264
+			// set incoming REG_Status
265
+			$this->set_new_reg_status($registration->ID(), $STS_ID);
266
+			$registration->set_status($STS_ID, false, $context);
267
+			if ($save) {
268
+				$registration->save();
269
+			}
270
+			// don't trigger notifications during IPNs because they will get triggered by EE_Payment_Processor
271
+			if (! EE_Processor_Base::$IPN) {
272
+				// otherwise, send out notifications
273
+				add_filter('FHEE__EED_Messages___maybe_registration__deliver_notifications', '__return_true', 10);
274
+			}
275
+			// DEBUG LOG
276
+			// $this->log(
277
+			//     __CLASS__,
278
+			//     __FUNCTION__,
279
+			//     __LINE__,
280
+			//     $registration->transaction(),
281
+			//     array(
282
+			//         'IPN' => EE_Processor_Base::$IPN,
283
+			//         'deliver_notifications' => has_filter(
284
+			//             'FHEE__EED_Messages___maybe_registration__deliver_notifications'
285
+			//         ),
286
+			//     )
287
+			// );
288
+		}
289
+	}
290
+
291
+
292
+	/**
293
+	 *    toggle_registration_status_for_default_approved_events
294
+	 *
295
+	 * @access public
296
+	 * @param EE_Registration $registration
297
+	 * @param bool            $save TRUE will save the registration if the status is updated, FALSE will leave that up
298
+	 *                              to client code
299
+	 * @return bool
300
+	 * @throws EE_Error
301
+	 * @throws EntityNotFoundException
302
+	 * @throws InvalidArgumentException
303
+	 * @throws InvalidDataTypeException
304
+	 * @throws InvalidInterfaceException
305
+	 * @throws ReflectionException
306
+	 * @throws RuntimeException
307
+	 */
308
+	public function toggle_registration_status_for_default_approved_events(EE_Registration $registration, $save = true)
309
+	{
310
+		$reg_status = $registration->status_ID();
311
+		// set initial REG_Status
312
+		$this->set_old_reg_status($registration->ID(), $reg_status);
313
+		// if not already, toggle reg status to approved IF the event default reg status is approved
314
+		// ( as long as the registration wasn't cancelled or declined at some point )
315
+		if ($reg_status !== EEM_Registration::status_id_cancelled
316
+			&& $reg_status
317
+			   !== EEM_Registration::status_id_declined
318
+			&& $reg_status !== EEM_Registration::status_id_approved
319
+			&& $registration->event()->default_registration_status() === EEM_Registration::status_id_approved
320
+		) {
321
+			// set incoming REG_Status
322
+			$this->set_new_reg_status($registration->ID(), EEM_Registration::status_id_approved);
323
+			// toggle status to approved
324
+			$registration->set_status(EEM_Registration::status_id_approved);
325
+			if ($save) {
326
+				$registration->save();
327
+			}
328
+			// don't trigger notifications during IPNs because they will get triggered by EE_Payment_Processor
329
+			if (! EE_Processor_Base::$IPN) {
330
+				// otherwise, send out notifications
331
+				add_filter('FHEE__EED_Messages___maybe_registration__deliver_notifications', '__return_true', 10);
332
+			}
333
+			// DEBUG LOG
334
+			// $this->log(
335
+			//     __CLASS__,
336
+			//     __FUNCTION__,
337
+			//     __LINE__,
338
+			//     $registration->transaction(),
339
+			//     array(
340
+			//         'IPN' => EE_Processor_Base::$IPN,
341
+			//         'deliver_notifications' => has_filter(
342
+			//             'FHEE__EED_Messages___maybe_registration__deliver_notifications'
343
+			//         ),
344
+			//     )
345
+			// );
346
+			return true;
347
+		}
348
+		return false;
349
+	}
350
+
351
+
352
+	/**
353
+	 *    toggle_registration_statuses_if_no_monies_owing
354
+	 *
355
+	 * @access public
356
+	 * @param EE_Registration $registration
357
+	 * @param bool            $save TRUE will save the registration if the status is updated, FALSE will leave that up
358
+	 *                              to client code
359
+	 * @param array           $additional_details
360
+	 * @return bool
361
+	 * @throws EE_Error
362
+	 * @throws EntityNotFoundException
363
+	 * @throws InvalidArgumentException
364
+	 * @throws InvalidDataTypeException
365
+	 * @throws InvalidInterfaceException
366
+	 * @throws ReflectionException
367
+	 * @throws RuntimeException
368
+	 */
369
+	public function toggle_registration_status_if_no_monies_owing(
370
+		EE_Registration $registration,
371
+		$save = true,
372
+		array $additional_details = array()
373
+	) {
374
+		// set initial REG_Status
375
+		$this->set_old_reg_status($registration->ID(), $registration->status_ID());
376
+		// was a payment just made ?
377
+		$payment = isset($additional_details['payment_updates'], $additional_details['last_payment'])
378
+				   && $additional_details['payment_updates']
379
+				   && $additional_details['last_payment'] instanceof EE_Payment
380
+			? $additional_details['last_payment']
381
+			: null;
382
+		$total_paid = array_sum(self::$_amount_paid);
383
+		// toggle reg status to approved IF
384
+		if (// REG status is pending payment
385
+			$registration->status_ID() === EEM_Registration::status_id_pending_payment
386
+			// AND no monies are owing
387
+			&& (
388
+				(
389
+					$registration->transaction()->is_completed()
390
+					|| $registration->transaction()->is_overpaid()
391
+					|| $registration->transaction()->is_free()
392
+					|| apply_filters(
393
+						'FHEE__EE_Registration_Processor__toggle_registration_status_if_no_monies_owing',
394
+						false,
395
+						$registration
396
+					)
397
+				)
398
+				|| (
399
+					$payment instanceof EE_Payment && $payment->is_approved()
400
+					&& // this specific registration has not yet been paid for
401
+					! isset(self::$_amount_paid[ $registration->ID() ])
402
+					&& // payment amount, less what we have already attributed to other registrations, is greater than this reg's final price
403
+					$payment->amount() - $total_paid >= $registration->final_price()
404
+				)
405
+			)
406
+		) {
407
+			// mark as paid
408
+			self::$_amount_paid[ $registration->ID() ] = $registration->final_price();
409
+			// track new REG_Status
410
+			$this->set_new_reg_status($registration->ID(), EEM_Registration::status_id_approved);
411
+			// toggle status to approved
412
+			$registration->set_status(EEM_Registration::status_id_approved);
413
+			if ($save) {
414
+				$registration->save();
415
+			}
416
+			// don't trigger notifications during IPNs because they will get triggered by EE_Payment_Processor
417
+			if (! EE_Processor_Base::$IPN) {
418
+				// otherwise, send out notifications
419
+				add_filter('FHEE__EED_Messages___maybe_registration__deliver_notifications', '__return_true', 10);
420
+			}
421
+			// DEBUG LOG
422
+			// $this->log(
423
+			//     __CLASS__,
424
+			//     __FUNCTION__,
425
+			//     __LINE__,
426
+			//     $registration->transaction(),
427
+			//     array(
428
+			//         'IPN' => EE_Processor_Base::$IPN,
429
+			//         'deliver_notifications' => has_filter(
430
+			//             'FHEE__EED_Messages___maybe_registration__deliver_notifications'
431
+			//         ),
432
+			//     )
433
+			// );
434
+			return true;
435
+		}
436
+		return false;
437
+	}
438
+
439
+
440
+	/**
441
+	 *    registration_status_changed
442
+	 *
443
+	 * @access public
444
+	 * @param EE_Registration $registration
445
+	 * @param array           $additional_details
446
+	 * @return void
447
+	 */
448
+	public function trigger_registration_update_notifications($registration, array $additional_details = array())
449
+	{
450
+		try {
451
+			if (! $registration instanceof EE_Registration) {
452
+				throw new EE_Error(
453
+					esc_html__('An invalid registration was received.', 'event_espresso')
454
+				);
455
+			}
456
+			// EE_Registry::instance()->load_helper('Debug_Tools');
457
+			// EEH_Debug_Tools::log(
458
+			//     __CLASS__,
459
+			//     __FUNCTION__,
460
+			//     __LINE__,
461
+			//     array($registration->transaction(), $additional_details),
462
+			//     false,
463
+			//     'EE_Transaction: ' . $registration->transaction()->ID()
464
+			// );
465
+			if (! $registration->is_primary_registrant()) {
466
+				return;
467
+			}
468
+			do_action(
469
+				'AHEE__EE_Registration_Processor__trigger_registration_update_notifications',
470
+				$registration,
471
+				$additional_details
472
+			);
473
+		} catch (Exception $e) {
474
+			EE_Error::add_error($e->getMessage(), $e->getFile(), 'unknown_function_from_exception', $e->getLine());
475
+		}
476
+	}
477
+
478
+
479
+	/**
480
+	 * sets reg status based either on passed param or on transaction status and event pre-approval setting
481
+	 *
482
+	 * @param EE_Registration $registration
483
+	 * @param array           $additional_details
484
+	 * @return bool
485
+	 * @throws EE_Error
486
+	 * @throws EntityNotFoundException
487
+	 * @throws InvalidArgumentException
488
+	 * @throws InvalidDataTypeException
489
+	 * @throws InvalidInterfaceException
490
+	 * @throws ReflectionException
491
+	 * @throws RuntimeException
492
+	 */
493
+	public function update_registration_after_checkout_or_payment(
494
+		EE_Registration $registration,
495
+		array $additional_details = array()
496
+	) {
497
+		// set initial REG_Status
498
+		$this->set_old_reg_status($registration->ID(), $registration->status_ID());
499
+		// if the registration status gets updated, then save the registration
500
+		if ($this->toggle_registration_status_for_default_approved_events($registration, false)
501
+			|| $this->toggle_registration_status_if_no_monies_owing(
502
+				$registration,
503
+				false,
504
+				$additional_details
505
+			)
506
+		) {
507
+			$registration->save();
508
+		}
509
+		// set new  REG_Status
510
+		$this->set_new_reg_status($registration->ID(), $registration->status_ID());
511
+		return $this->reg_status_updated($registration->ID())
512
+			   && $this->new_reg_status($registration->ID()) === EEM_Registration::status_id_approved;
513
+	}
514
+
515
+
516
+	/**
517
+	 * Updates the registration' final prices based on the current line item tree (taking into account
518
+	 * discounts, taxes, and other line items unrelated to tickets.)
519
+	 *
520
+	 * @param EE_Transaction $transaction
521
+	 * @param boolean        $save_regs whether to immediately save registrations in this function or not
522
+	 * @return void
523
+	 * @throws EE_Error
524
+	 * @throws InvalidArgumentException
525
+	 * @throws InvalidDataTypeException
526
+	 * @throws InvalidInterfaceException
527
+	 * @throws RuntimeException
528
+	 */
529
+	public function update_registration_final_prices($transaction, $save_regs = true)
530
+	{
531
+		$reg_final_price_per_ticket_line_item = EEH_Line_Item::calculate_reg_final_prices_per_line_item(
532
+			$transaction->total_line_item()
533
+		);
534
+		foreach ($transaction->registrations() as $registration) {
535
+			/** @var EE_Line_Item $line_item */
536
+			$line_item = EEM_Line_Item::instance()->get_line_item_for_registration($registration);
537
+			if (isset($reg_final_price_per_ticket_line_item[ $line_item->ID() ])) {
538
+				$registration->set_final_price($reg_final_price_per_ticket_line_item[ $line_item->ID() ]);
539
+				if ($save_regs) {
540
+					$registration->save();
541
+				}
542
+			}
543
+		}
544
+		// and make sure there's no rounding problem
545
+		$this->fix_reg_final_price_rounding_issue($transaction);
546
+	}
547
+
548
+
549
+	/**
550
+	 * Makes sure there is no rounding errors for the REG_final_prices.
551
+	 * Eg, if we have 3 registrations for $1, and there is a $0.01 discount between the three of them,
552
+	 * they will each be for $0.99333333, which gets rounded to $1 again.
553
+	 * So the transaction total will be $2.99, but each registration will be for $1,
554
+	 * so if each registrant paid individually they will have overpaid by $0.01.
555
+	 * So in order to overcome this, we check for any difference, and if there is a difference
556
+	 * we just grab one registrant at random and make them responsible for it.
557
+	 * This should be used after setting REG_final_prices (it's done automatically as part of
558
+	 * EE_Registration_Processor::update_registration_final_prices())
559
+	 *
560
+	 * @param EE_Transaction $transaction
561
+	 * @return bool success verifying that there is NO difference after this method is done
562
+	 * @throws EE_Error
563
+	 * @throws InvalidArgumentException
564
+	 * @throws InvalidDataTypeException
565
+	 * @throws InvalidInterfaceException
566
+	 */
567
+	public function fix_reg_final_price_rounding_issue($transaction)
568
+	{
569
+		$reg_final_price_sum = EEM_Registration::instance()->sum(
570
+			array(
571
+				array(
572
+					'TXN_ID' => $transaction->ID(),
573
+				),
574
+			),
575
+			'REG_final_price'
576
+		);
577
+		$diff = $transaction->total() - $reg_final_price_sum;
578
+		// ok then, just grab one of the registrations
579
+		if ($diff !== 0) {
580
+			$a_reg = EEM_Registration::instance()->get_one(
581
+				array(
582
+					array(
583
+						'TXN_ID' => $transaction->ID(),
584
+					),
585
+				)
586
+			);
587
+			return $a_reg instanceof EE_Registration
588
+				? (bool) $a_reg->save(array('REG_final_price' => $a_reg->final_price() + $diff))
589
+				: false;
590
+		}
591
+		return true;
592
+	}
593
+
594
+
595
+	/**
596
+	 * update_registration_after_being_canceled_or_declined
597
+	 *
598
+	 * @param EE_Registration $registration
599
+	 * @param array           $closed_reg_statuses
600
+	 * @param bool            $update_reg
601
+	 * @return bool
602
+	 * @throws EE_Error
603
+	 * @throws RuntimeException
604
+	 */
605
+	public function update_registration_after_being_canceled_or_declined(
606
+		EE_Registration $registration,
607
+		array $closed_reg_statuses = array(),
608
+		$update_reg = true
609
+	) {
610
+		// these reg statuses should not be considered in any calculations involving monies owing
611
+		$closed_reg_statuses = ! empty($closed_reg_statuses)
612
+			? $closed_reg_statuses
613
+			: EEM_Registration::closed_reg_statuses();
614
+		if (! in_array($registration->status_ID(), $closed_reg_statuses, true)) {
615
+			return false;
616
+		}
617
+		// release a reserved ticket by decrementing ticket and datetime reserved values
618
+		$registration->release_reserved_ticket(true, 'RegProcessor:' . __LINE__);
619
+		$registration->set_final_price(0);
620
+		if ($update_reg) {
621
+			$registration->save();
622
+		}
623
+		return true;
624
+	}
625
+
626
+
627
+	/**
628
+	 * update_canceled_or_declined_registration_after_being_reinstated
629
+	 *
630
+	 * @param EE_Registration $registration
631
+	 * @param array           $closed_reg_statuses
632
+	 * @param bool            $update_reg
633
+	 * @return bool
634
+	 * @throws EE_Error
635
+	 * @throws RuntimeException
636
+	 */
637
+	public function update_canceled_or_declined_registration_after_being_reinstated(
638
+		EE_Registration $registration,
639
+		array $closed_reg_statuses = array(),
640
+		$update_reg = true
641
+	) {
642
+		// these reg statuses should not be considered in any calculations involving monies owing
643
+		$closed_reg_statuses = ! empty($closed_reg_statuses) ? $closed_reg_statuses
644
+			: EEM_Registration::closed_reg_statuses();
645
+		if (in_array($registration->status_ID(), $closed_reg_statuses, true)) {
646
+			return false;
647
+		}
648
+		$ticket = $registration->ticket();
649
+		if (! $ticket instanceof EE_Ticket) {
650
+			throw new EE_Error(
651
+				sprintf(
652
+					esc_html__(
653
+						'The Ticket for Registration %1$d was not found or is invalid.',
654
+						'event_espresso'
655
+					),
656
+					$registration->ticket_ID()
657
+				)
658
+			);
659
+		}
660
+		$registration->set_final_price($ticket->price());
661
+		if ($update_reg) {
662
+			$registration->save();
663
+		}
664
+		return true;
665
+	}
666
+
667
+
668
+	/**
669
+	 * generate_ONE_registration_from_line_item
670
+	 * Although a ticket line item may have a quantity greater than 1,
671
+	 * this method will ONLY CREATE ONE REGISTRATION !!!
672
+	 * Regardless of the ticket line item quantity.
673
+	 * This means that any code calling this method is responsible for ensuring
674
+	 * that the final registration count matches the ticket line item quantity.
675
+	 * This was done to make it easier to match the number of registrations
676
+	 * to the number of tickets in the cart, when the cart has been edited
677
+	 * after SPCO has already been initialized. So if an additional ticket was added to the cart, you can simply pass
678
+	 * the line item to this method to add a second ticket, and in this case, you would not want to add 2 tickets.
679
+	 *
680
+	 * @deprecated
681
+	 * @since 4.9.1
682
+	 * @param EE_Line_Item    $line_item
683
+	 * @param \EE_Transaction $transaction
684
+	 * @param int             $att_nmbr
685
+	 * @param int             $total_ticket_count
686
+	 * @return EE_Registration | null
687
+	 * @throws \OutOfRangeException
688
+	 * @throws \EventEspresso\core\exceptions\UnexpectedEntityException
689
+	 * @throws \EE_Error
690
+	 */
691
+	public function generate_ONE_registration_from_line_item(
692
+		EE_Line_Item $line_item,
693
+		EE_Transaction $transaction,
694
+		$att_nmbr = 1,
695
+		$total_ticket_count = 1
696
+	) {
697
+		EE_Error::doing_it_wrong(
698
+			__CLASS__ . '::' . __FUNCTION__,
699
+			sprintf(
700
+				esc_html__('This method is deprecated. Please use "%s" instead', 'event_espresso'),
701
+				'\EventEspresso\core\domain\services\registration\CreateRegistrationService::create()'
702
+			),
703
+			'4.9.1',
704
+			'5.0.0'
705
+		);
706
+		// grab the related ticket object for this line_item
707
+		$ticket = $line_item->ticket();
708
+		if (! $ticket instanceof EE_Ticket) {
709
+			EE_Error::add_error(
710
+				sprintf(
711
+					esc_html__('Line item %s did not contain a valid ticket', 'event_espresso'),
712
+					$line_item->ID()
713
+				),
714
+				__FILE__,
715
+				__FUNCTION__,
716
+				__LINE__
717
+			);
718
+			return null;
719
+		}
720
+		$registration_service = new CreateRegistrationService();
721
+		// then generate a new registration from that
722
+		return $registration_service->create(
723
+			$ticket->get_related_event(),
724
+			$transaction,
725
+			$ticket,
726
+			$line_item,
727
+			$att_nmbr,
728
+			$total_ticket_count
729
+		);
730
+	}
731
+
732
+
733
+	/**
734
+	 * generates reg_url_link
735
+	 *
736
+	 * @deprecated
737
+	 * @since 4.9.1
738
+	 * @param int                   $att_nmbr
739
+	 * @param EE_Line_Item | string $item
740
+	 * @return string
741
+	 * @throws InvalidArgumentException
742
+	 */
743
+	public function generate_reg_url_link($att_nmbr, $item)
744
+	{
745
+		EE_Error::doing_it_wrong(
746
+			__CLASS__ . '::' . __FUNCTION__,
747
+			sprintf(
748
+				esc_html__('This method is deprecated. Please use "%s" instead', 'event_espresso'),
749
+				'EventEspresso\core\domain\entities\RegUrlLink'
750
+			),
751
+			'4.9.1',
752
+			'5.0.0'
753
+		);
754
+		return new RegUrlLink($att_nmbr, $item);
755
+	}
756
+
757
+
758
+	/**
759
+	 * generates reg code
760
+	 *
761
+	 * @deprecated
762
+	 * @since 4.9.1
763
+	 * @param EE_Registration $registration
764
+	 * @return string
765
+	 * @throws EE_Error
766
+	 * @throws EntityNotFoundException
767
+	 * @throws InvalidArgumentException
768
+	 */
769
+	public function generate_reg_code(EE_Registration $registration)
770
+	{
771
+		EE_Error::doing_it_wrong(
772
+			__CLASS__ . '::' . __FUNCTION__,
773
+			sprintf(
774
+				esc_html__('This method is deprecated. Please use "%s" instead', 'event_espresso'),
775
+				'EventEspresso\core\domain\entities\RegCode'
776
+			),
777
+			'4.9.1',
778
+			'5.0.0'
779
+		);
780
+		return apply_filters(
781
+			'FHEE__EE_Registration_Processor___generate_reg_code__new_reg_code',
782
+			new RegCode(
783
+				RegUrlLink::fromRegistration($registration),
784
+				$registration->transaction(),
785
+				$registration->ticket()
786
+			),
787
+			$registration
788
+		);
789
+	}
790 790
 }
Please login to merge, or discard this patch.
Spacing   +24 added lines, -24 removed lines patch added patch discarded remove patch
@@ -79,8 +79,8 @@  discard block
 block discarded – undo
79 79
     public static function instance(EE_Request $request = null)
80 80
     {
81 81
         // check if class object is instantiated
82
-        if (! self::$_instance instanceof EE_Registration_Processor) {
83
-            if (! $request instanceof EE_Request) {
82
+        if ( ! self::$_instance instanceof EE_Registration_Processor) {
83
+            if ( ! $request instanceof EE_Request) {
84 84
                 $request = LoaderFactory::getLoader()->getShared('EE_Request');
85 85
             }
86 86
             self::$_instance = new self($request);
@@ -106,7 +106,7 @@  discard block
 block discarded – undo
106 106
      */
107 107
     public function old_reg_status($REG_ID)
108 108
     {
109
-        return isset($this->_old_reg_status[ $REG_ID ]) ? $this->_old_reg_status[ $REG_ID ] : null;
109
+        return isset($this->_old_reg_status[$REG_ID]) ? $this->_old_reg_status[$REG_ID] : null;
110 110
     }
111 111
 
112 112
 
@@ -117,8 +117,8 @@  discard block
 block discarded – undo
117 117
     public function set_old_reg_status($REG_ID, $old_reg_status)
118 118
     {
119 119
         // only set the first time
120
-        if (! isset($this->_old_reg_status[ $REG_ID ])) {
121
-            $this->_old_reg_status[ $REG_ID ] = $old_reg_status;
120
+        if ( ! isset($this->_old_reg_status[$REG_ID])) {
121
+            $this->_old_reg_status[$REG_ID] = $old_reg_status;
122 122
         }
123 123
     }
124 124
 
@@ -129,7 +129,7 @@  discard block
 block discarded – undo
129 129
      */
130 130
     public function new_reg_status($REG_ID)
131 131
     {
132
-        return isset($this->_new_reg_status[ $REG_ID ]) ? $this->_new_reg_status[ $REG_ID ] : null;
132
+        return isset($this->_new_reg_status[$REG_ID]) ? $this->_new_reg_status[$REG_ID] : null;
133 133
     }
134 134
 
135 135
 
@@ -139,7 +139,7 @@  discard block
 block discarded – undo
139 139
      */
140 140
     public function set_new_reg_status($REG_ID, $new_reg_status)
141 141
     {
142
-        $this->_new_reg_status[ $REG_ID ] = $new_reg_status;
142
+        $this->_new_reg_status[$REG_ID] = $new_reg_status;
143 143
     }
144 144
 
145 145
 
@@ -205,7 +205,7 @@  discard block
 block discarded – undo
205 205
         // toggle reg status but only if it has changed and the user can do so
206 206
         if ($this->reg_status_updated($registration->ID())
207 207
             && (
208
-                (! $this->request->isAdmin() || $this->request->isFrontAjax())
208
+                ( ! $this->request->isAdmin() || $this->request->isFrontAjax())
209 209
                 || EE_Registry::instance()->CAP->current_user_can(
210 210
                     'ee_edit_registration',
211 211
                     'toggle_registration_status',
@@ -268,7 +268,7 @@  discard block
 block discarded – undo
268 268
                 $registration->save();
269 269
             }
270 270
             // don't trigger notifications during IPNs because they will get triggered by EE_Payment_Processor
271
-            if (! EE_Processor_Base::$IPN) {
271
+            if ( ! EE_Processor_Base::$IPN) {
272 272
                 // otherwise, send out notifications
273 273
                 add_filter('FHEE__EED_Messages___maybe_registration__deliver_notifications', '__return_true', 10);
274 274
             }
@@ -326,7 +326,7 @@  discard block
 block discarded – undo
326 326
                 $registration->save();
327 327
             }
328 328
             // don't trigger notifications during IPNs because they will get triggered by EE_Payment_Processor
329
-            if (! EE_Processor_Base::$IPN) {
329
+            if ( ! EE_Processor_Base::$IPN) {
330 330
                 // otherwise, send out notifications
331 331
                 add_filter('FHEE__EED_Messages___maybe_registration__deliver_notifications', '__return_true', 10);
332 332
             }
@@ -398,14 +398,14 @@  discard block
 block discarded – undo
398 398
                 || (
399 399
                     $payment instanceof EE_Payment && $payment->is_approved()
400 400
                     && // this specific registration has not yet been paid for
401
-                    ! isset(self::$_amount_paid[ $registration->ID() ])
401
+                    ! isset(self::$_amount_paid[$registration->ID()])
402 402
                     && // payment amount, less what we have already attributed to other registrations, is greater than this reg's final price
403 403
                     $payment->amount() - $total_paid >= $registration->final_price()
404 404
                 )
405 405
             )
406 406
         ) {
407 407
             // mark as paid
408
-            self::$_amount_paid[ $registration->ID() ] = $registration->final_price();
408
+            self::$_amount_paid[$registration->ID()] = $registration->final_price();
409 409
             // track new REG_Status
410 410
             $this->set_new_reg_status($registration->ID(), EEM_Registration::status_id_approved);
411 411
             // toggle status to approved
@@ -414,7 +414,7 @@  discard block
 block discarded – undo
414 414
                 $registration->save();
415 415
             }
416 416
             // don't trigger notifications during IPNs because they will get triggered by EE_Payment_Processor
417
-            if (! EE_Processor_Base::$IPN) {
417
+            if ( ! EE_Processor_Base::$IPN) {
418 418
                 // otherwise, send out notifications
419 419
                 add_filter('FHEE__EED_Messages___maybe_registration__deliver_notifications', '__return_true', 10);
420 420
             }
@@ -448,7 +448,7 @@  discard block
 block discarded – undo
448 448
     public function trigger_registration_update_notifications($registration, array $additional_details = array())
449 449
     {
450 450
         try {
451
-            if (! $registration instanceof EE_Registration) {
451
+            if ( ! $registration instanceof EE_Registration) {
452 452
                 throw new EE_Error(
453 453
                     esc_html__('An invalid registration was received.', 'event_espresso')
454 454
                 );
@@ -462,7 +462,7 @@  discard block
 block discarded – undo
462 462
             //     false,
463 463
             //     'EE_Transaction: ' . $registration->transaction()->ID()
464 464
             // );
465
-            if (! $registration->is_primary_registrant()) {
465
+            if ( ! $registration->is_primary_registrant()) {
466 466
                 return;
467 467
             }
468 468
             do_action(
@@ -534,8 +534,8 @@  discard block
 block discarded – undo
534 534
         foreach ($transaction->registrations() as $registration) {
535 535
             /** @var EE_Line_Item $line_item */
536 536
             $line_item = EEM_Line_Item::instance()->get_line_item_for_registration($registration);
537
-            if (isset($reg_final_price_per_ticket_line_item[ $line_item->ID() ])) {
538
-                $registration->set_final_price($reg_final_price_per_ticket_line_item[ $line_item->ID() ]);
537
+            if (isset($reg_final_price_per_ticket_line_item[$line_item->ID()])) {
538
+                $registration->set_final_price($reg_final_price_per_ticket_line_item[$line_item->ID()]);
539 539
                 if ($save_regs) {
540 540
                     $registration->save();
541 541
                 }
@@ -611,11 +611,11 @@  discard block
 block discarded – undo
611 611
         $closed_reg_statuses = ! empty($closed_reg_statuses)
612 612
             ? $closed_reg_statuses
613 613
             : EEM_Registration::closed_reg_statuses();
614
-        if (! in_array($registration->status_ID(), $closed_reg_statuses, true)) {
614
+        if ( ! in_array($registration->status_ID(), $closed_reg_statuses, true)) {
615 615
             return false;
616 616
         }
617 617
         // release a reserved ticket by decrementing ticket and datetime reserved values
618
-        $registration->release_reserved_ticket(true, 'RegProcessor:' . __LINE__);
618
+        $registration->release_reserved_ticket(true, 'RegProcessor:'.__LINE__);
619 619
         $registration->set_final_price(0);
620 620
         if ($update_reg) {
621 621
             $registration->save();
@@ -646,7 +646,7 @@  discard block
 block discarded – undo
646 646
             return false;
647 647
         }
648 648
         $ticket = $registration->ticket();
649
-        if (! $ticket instanceof EE_Ticket) {
649
+        if ( ! $ticket instanceof EE_Ticket) {
650 650
             throw new EE_Error(
651 651
                 sprintf(
652 652
                     esc_html__(
@@ -695,7 +695,7 @@  discard block
 block discarded – undo
695 695
         $total_ticket_count = 1
696 696
     ) {
697 697
         EE_Error::doing_it_wrong(
698
-            __CLASS__ . '::' . __FUNCTION__,
698
+            __CLASS__.'::'.__FUNCTION__,
699 699
             sprintf(
700 700
                 esc_html__('This method is deprecated. Please use "%s" instead', 'event_espresso'),
701 701
                 '\EventEspresso\core\domain\services\registration\CreateRegistrationService::create()'
@@ -705,7 +705,7 @@  discard block
 block discarded – undo
705 705
         );
706 706
         // grab the related ticket object for this line_item
707 707
         $ticket = $line_item->ticket();
708
-        if (! $ticket instanceof EE_Ticket) {
708
+        if ( ! $ticket instanceof EE_Ticket) {
709 709
             EE_Error::add_error(
710 710
                 sprintf(
711 711
                     esc_html__('Line item %s did not contain a valid ticket', 'event_espresso'),
@@ -743,7 +743,7 @@  discard block
 block discarded – undo
743 743
     public function generate_reg_url_link($att_nmbr, $item)
744 744
     {
745 745
         EE_Error::doing_it_wrong(
746
-            __CLASS__ . '::' . __FUNCTION__,
746
+            __CLASS__.'::'.__FUNCTION__,
747 747
             sprintf(
748 748
                 esc_html__('This method is deprecated. Please use "%s" instead', 'event_espresso'),
749 749
                 'EventEspresso\core\domain\entities\RegUrlLink'
@@ -769,7 +769,7 @@  discard block
 block discarded – undo
769 769
     public function generate_reg_code(EE_Registration $registration)
770 770
     {
771 771
         EE_Error::doing_it_wrong(
772
-            __CLASS__ . '::' . __FUNCTION__,
772
+            __CLASS__.'::'.__FUNCTION__,
773 773
             sprintf(
774 774
                 esc_html__('This method is deprecated. Please use "%s" instead', 'event_espresso'),
775 775
                 'EventEspresso\core\domain\entities\RegCode'
Please login to merge, or discard this patch.
core/admin/EE_Admin_Hooks.core.php 3 patches
Doc Comments   +1 added lines, -1 removed lines patch added patch discarded remove patch
@@ -222,7 +222,7 @@
 block discarded – undo
222 222
     /**
223 223
      * constructor
224 224
      *
225
-     * @param EE_Admin_Page $admin_page the calling admin_page_object
225
+     * @param EE_Admin_Page $adminpage the calling admin_page_object
226 226
      */
227 227
     public function __construct(EE_Admin_Page $adminpage)
228 228
     {
Please login to merge, or discard this patch.
Indentation   +703 added lines, -703 removed lines patch added patch discarded remove patch
@@ -13,707 +13,707 @@
 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
-
203
-        $this->_adminpage_obj = $adminpage;
204
-        $this->_req_data = array_merge($_GET, $_POST);
205
-        $this->_set_defaults();
206
-        $this->_set_hooks_properties();
207
-        // first let's verify we're on the right page
208
-        if (! isset($this->_req_data['page'])
209
-            || (isset($this->_req_data['page'])
210
-                && $this->_adminpage_obj->page_slug
211
-                   != $this->_req_data['page'])) {
212
-            return;
213
-        } //get out nothing more to be done here.
214
-        // allow for extends to modify properties
215
-        if (method_exists($this, '_extend_properties')) {
216
-            $this->_extend_properties();
217
-        }
218
-        $this->_set_page_object();
219
-        $this->_init_hooks();
220
-        $this->_load_custom_methods();
221
-        $this->_load_routed_hooks();
222
-        add_action('admin_enqueue_scripts', array($this, 'enqueue_scripts_styles'));
223
-        add_action('admin_enqueue_scripts', array($this, 'add_metaboxes'), 20);
224
-        add_action('admin_enqueue_scripts', array($this, 'remove_metaboxes'), 15);
225
-        $this->_ajax_hooks();
226
-    }
227
-
228
-
229
-    /**
230
-     * used by child classes to set the following properties:
231
-     * $_ajax_func (optional)
232
-     * $_init_func (optional)
233
-     * $_metaboxes (optional)
234
-     * $_scripts (optional)
235
-     * $_styles (optional)
236
-     * $_name (required)
237
-     * Also in this method will be registered any scripts or styles loaded on the targeted page (as indicated in the
238
-     * _scripts/_styles properties) Also children should place in this method any filters/actions that have to happen
239
-     * really early on page load (just after admin_init) if they want to have them registered for handling early.
240
-     *
241
-     * @access protected
242
-     * @abstract
243
-     * @return void
244
-     */
245
-    abstract protected function _set_hooks_properties();
246
-
247
-
248
-    /**
249
-     * The hooks for enqueue_scripts and enqueue_styles will be run in here.  Child classes need to define their
250
-     * scripts and styles in the relevant $_scripts and $_styles properties.  Child classes must have also already
251
-     * registered the scripts and styles using wp_register_script and wp_register_style functions.
252
-     *
253
-     * @access public
254
-     * @return void
255
-     */
256
-    public function enqueue_scripts_styles()
257
-    {
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
-            foreach ($this->_scripts_styles['enqueues'] as $ref => $routes) {
318
-                // make sure $routes is an array
319
-                $routes = (array) $routes;
320
-                if (in_array($this->_current_route, $routes)) {
321
-                    $this->_scripts_styles['registers'][ $ref ]['type'] == 'js' ? wp_enqueue_script($ref)
322
-                        : wp_enqueue_style($ref);
323
-                    // if we have a localization for the script let's do that too.
324
-                    if (isset($this->_scripts_styles['localize'][ $ref ])) {
325
-                        foreach ($this->_scripts_styles['localize'][ $ref ] as $object_name => $indexes) {
326
-                            wp_localize_script(
327
-                                $ref,
328
-                                $object_name,
329
-                                $this->_scripts_styles['localize'][ $ref ][ $object_name ]
330
-                            );
331
-                        }
332
-                    }
333
-                }
334
-            }
335
-            // let's do the deregisters
336
-            if (! isset($this->_scripts_styles['deregisters'])) {
337
-                return;
338
-            }
339
-            foreach ($this->_scripts_styles['deregisters'] as $ref => $details) {
340
-                $defaults = array(
341
-                    'type' => 'js',
342
-                );
343
-                $details = wp_parse_args($details, $defaults);
344
-                extract($details);
345
-                $type == 'js' ? wp_deregister_script($ref) : wp_deregister_style($ref);
346
-            }
347
-        }
348
-    }
349
-
350
-
351
-    /**
352
-     * just set the defaults for the hooks properties.
353
-     *
354
-     * @access private
355
-     * @return void
356
-     */
357
-    private function _set_defaults()
358
-    {
359
-        $this->_ajax_func = $this->_init_func = $this->_metaboxes = $this->_scripts = $this->_styles = $this->_wp_action_filters_priority = array();
360
-        $this->_current_route = isset($_REQUEST['action']) ? $_REQUEST['action'] : 'default';
361
-        $this->caller = get_class($this);
362
-        $this->_extend = stripos($this->caller, 'Extend') ? true : false;
363
-    }
364
-
365
-
366
-    /**
367
-     * this sets the _page_object property
368
-     *
369
-     * @access protected
370
-     * @return void
371
-     */
372
-    protected function _set_page_object()
373
-    {
374
-        // first make sure $this->_name is set
375
-        if (empty($this->_name)) {
376
-            $msg[] = __('We can\'t load the page object', 'event_espresso');
377
-            $msg[] = sprintf(
378
-                __("This is because the %s child class has not set the '_name' property", 'event_espresso'),
379
-                $this->caller
380
-            );
381
-            throw new EE_Error(implode('||', $msg));
382
-        }
383
-        $ref = str_replace('_', ' ', $this->_name); // take the_message -> the message
384
-        $ref = str_replace(' ', '_', ucwords($ref)) . '_Admin_Page'; // take the message -> The_Message
385
-        // first default file (if exists)
386
-        $decaf_file = EE_ADMIN_PAGES . $this->_name . DS . $ref . '.core.php';
387
-        if (is_readable($decaf_file)) {
388
-            require_once($decaf_file);
389
-        }
390
-        // now we have to do require for extended file (if needed)
391
-        if ($this->_extend) {
392
-            require_once(EE_CORE_CAF_ADMIN_EXTEND . $this->_name . DS . 'Extend_' . $ref . '.core.php');
393
-        }
394
-        // if we've got an extended class we use that!
395
-        $ref = $this->_extend ? 'Extend_' . $ref : $ref;
396
-        // let's make sure the class exists
397
-        if (! class_exists($ref)) {
398
-            $msg[] = __('We can\'t load the page object', 'event_espresso');
399
-            $msg[] = sprintf(
400
-                __(
401
-                    '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',
402
-                    'event_espresso'
403
-                ),
404
-                $ref
405
-            );
406
-            throw new EE_Error(implode('||', $msg));
407
-        }
408
-        $a = new ReflectionClass($ref);
409
-        $this->_page_object = $a->newInstance(false);
410
-    }
411
-
412
-
413
-    /**
414
-     * Child "hook" classes can declare any methods that they want executed when a specific page route is loaded.  The
415
-     * advantage of this is when doing things like running our own db interactions on saves etc.  Remember that
416
-     * $this->_req_data (all the _POST and _GET data) is available to your methods.
417
-     *
418
-     * @access private
419
-     * @return void
420
-     */
421
-    private function _load_custom_methods()
422
-    {
423
-        /**
424
-         * method cannot be named 'default' (@see http://us3.php
425
-         * .net/manual/en/reserved.keywords.php) so need to
426
-         * handle routes that are "default"
427
-         *
428
-         * @since 4.3.0
429
-         */
430
-        $method_callback = $this->_current_route == 'default' ? 'default_callback' : $this->_current_route;
431
-        // these run before the Admin_Page route executes.
432
-        if (method_exists($this, $method_callback)) {
433
-            call_user_func(array($this, $method_callback));
434
-        }
435
-        // 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.
436
-        // first the actions
437
-        // note that these action hooks will have the $query_args value available.
438
-        $admin_class_name = get_class($this->_adminpage_obj);
439
-        if (method_exists($this, '_redirect_action_early_' . $this->_current_route)) {
440
-            add_action(
441
-                'AHEE__'
442
-                . $admin_class_name
443
-                . '___redirect_after_action__before_redirect_modification_'
444
-                . $this->_current_route,
445
-                array($this, '_redirect_action_early_' . $this->_current_route),
446
-                10
447
-            );
448
-        }
449
-        if (method_exists($this, '_redirect_action_' . $this->_current_route)) {
450
-            add_action(
451
-                'AHEE_redirect_' . $admin_class_name . $this->_current_route,
452
-                array($this, '_redirect_action_' . $this->_current_route),
453
-                10
454
-            );
455
-        }
456
-        // 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.
457
-        if (method_exists($this, '_redirect_filter_' . $this->_current_route)) {
458
-            add_filter(
459
-                'FHEE_redirect_' . $admin_class_name . $this->_current_route,
460
-                array($this, '_redirect_filter_' . $this->_current_route),
461
-                10,
462
-                2
463
-            );
464
-        }
465
-    }
466
-
467
-
468
-    /**
469
-     * This method will search for a corresponding method with a name matching the route and the wp_hook to run.  This
470
-     * allows child hook classes to target hooking into a specific wp action or filter hook ONLY on a certain route.
471
-     * just remember, methods MUST be public Future hooks should be added in here to be access by child classes.
472
-     *
473
-     * @return void
474
-     */
475
-    private function _load_routed_hooks()
476
-    {
477
-
478
-        // 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.
479
-        $hook_filter_array = array(
480
-            'admin_footer'                                                                            => array(
481
-                'type'     => 'action',
482
-                'argnum'   => 1,
483
-                'priority' => 10,
484
-            ),
485
-            'FHEE_list_table_views_' . $this->_adminpage_obj->page_slug . '_' . $this->_current_route => array(
486
-                'type'     => 'filter',
487
-                'argnum'   => 1,
488
-                'priority' => 10,
489
-            ),
490
-            'FHEE_list_table_views_' . $this->_adminpage_obj->page_slug                               => array(
491
-                'type'     => 'filter',
492
-                'argnum'   => 1,
493
-                'priority' => 10,
494
-            ),
495
-            'FHEE_list_table_views'                                                                   => array(
496
-                'type'     => 'filter',
497
-                'argnum'   => 1,
498
-                'priority' => 10,
499
-            ),
500
-            'AHEE__EE_Admin_Page___display_admin_page__modify_metaboxes'                              => array(
501
-                'type'     => 'action',
502
-                'argnum'   => 1,
503
-                'priority' => 10,
504
-            ),
505
-        );
506
-        foreach ($hook_filter_array as $hook => $args) {
507
-            if (method_exists($this, $this->_current_route . '_' . $hook)) {
508
-                if (isset($this->_wp_action_filters_priority[ $hook ])) {
509
-                    $args['priority'] = $this->_wp_action_filters_priority[ $hook ];
510
-                }
511
-                if ($args['type'] == 'action') {
512
-                    add_action(
513
-                        $hook,
514
-                        array($this, $this->_current_route . '_' . $hook),
515
-                        $args['priority'],
516
-                        $args['argnum']
517
-                    );
518
-                } else {
519
-                    add_filter(
520
-                        $hook,
521
-                        array($this, $this->_current_route . '_' . $hook),
522
-                        $args['priority'],
523
-                        $args['argnum']
524
-                    );
525
-                }
526
-            }
527
-        }
528
-    }
529
-
530
-
531
-    /**
532
-     * Loop throught the $_ajax_func array and add_actions for the array.
533
-     *
534
-     * @return void
535
-     */
536
-    private function _ajax_hooks()
537
-    {
538
-
539
-        if (empty($this->_ajax_func)) {
540
-            return;
541
-        } //get out there's nothing to take care of.
542
-        foreach ($this->_ajax_func as $action => $method) {
543
-            // make sure method exists
544
-            if (! method_exists($this, $method)) {
545
-                $msg[] = __(
546
-                    'There is no corresponding method for the hook labeled in the _ajax_func array',
547
-                    'event_espresso'
548
-                ) . '<br />';
549
-                $msg[] = sprintf(
550
-                    __(
551
-                        'The method name given in the array is %s, check the spelling and make sure it exists in the %s class',
552
-                        'event_espresso'
553
-                    ),
554
-                    $method,
555
-                    $this->caller
556
-                );
557
-                throw new EE_Error(implode('||', $msg));
558
-            }
559
-            add_action('wp_ajax_' . $action, array($this, $method));
560
-        }
561
-    }
562
-
563
-
564
-    /**
565
-     * Loop throught the $_init_func array and add_actions for the array.
566
-     *
567
-     * @return void
568
-     */
569
-    protected function _init_hooks()
570
-    {
571
-        if (empty($this->_init_func)) {
572
-            return;
573
-        } //get out there's nothing to take care of.
574
-        // We need to determine what page_route we are on!
575
-        $current_route = isset($_REQUEST['action']) ? $_REQUEST['action'] : 'default';
576
-        foreach ($this->_init_func as $route => $method) {
577
-            // make sure method exists
578
-            if (! method_exists($this, $method)) {
579
-                $msg[] = __(
580
-                    'There is no corresponding method for the hook labeled in the _init_func array',
581
-                    'event_espresso'
582
-                ) . '<br />';
583
-                $msg[] = sprintf(
584
-                    __(
585
-                        'The method name given in the array is %s, check the spelling and make sure it exists in the %s class',
586
-                        'event_espresso'
587
-                    ),
588
-                    $method,
589
-                    $this->caller
590
-                );
591
-                throw new EE_Error(implode('||', $msg));
592
-            }
593
-            if ($route == $this->_current_route) {
594
-                add_action('admin_init', array($this, $method));
595
-            }
596
-        }
597
-    }
598
-
599
-
600
-    /**
601
-     * Loop through the _metaboxes property and add_metaboxes accordingly
602
-     * //todo we could eventually make this a config component class (i.e. new EE_Metabox);
603
-     *
604
-     * @access public
605
-     * @return void
606
-     */
607
-    public function add_metaboxes()
608
-    {
609
-        if (empty($this->_metaboxes)) {
610
-            return;
611
-        } //get out we don't have any metaboxes to set for this connection
612
-        $this->_handle_metabox_array($this->_metaboxes);
613
-    }
614
-
615
-
616
-    private function _handle_metabox_array($boxes, $add = true)
617
-    {
618
-
619
-        foreach ($boxes as $box) {
620
-            if (! isset($box['page_route'])) {
621
-                continue;
622
-            } //we dont' have a valid array
623
-            // let's make sure $box['page_route'] is an array so the "foreach" will work.
624
-            $box['page_route'] = (array) $box['page_route'];
625
-            foreach ($box['page_route'] as $route) {
626
-                if ($route != $this->_current_route) {
627
-                    continue;
628
-                } //get out we only add metaboxes for set route.
629
-                if ($add) {
630
-                    $this->_add_metabox($box);
631
-                } else {
632
-                    $this->_remove_metabox($box);
633
-                }
634
-            }
635
-        }
636
-    }
637
-
638
-
639
-    /**
640
-     * Loop through the _remove_metaboxes property and remove metaboxes accordingly.
641
-     *
642
-     * @access public
643
-     * @return void
644
-     */
645
-    public function remove_metaboxes()
646
-    {
647
-
648
-        if (empty($this->_remove_metaboxes)) {
649
-            return;
650
-        } //get out there are no metaboxes to remove
651
-        $this->_handle_metabox_array($this->_remove_metaboxes, false);
652
-    }
653
-
654
-
655
-    /**
656
-     * This just handles adding a metabox
657
-     *
658
-     * @access private
659
-     * @param array $args an array of args that have been set for this metabox by the child class
660
-     */
661
-    private function _add_metabox($args)
662
-    {
663
-        $current_screen = get_current_screen();
664
-        $screen_id = is_object($current_screen) ? $current_screen->id : null;
665
-        $func = isset($args['func']) ? $args['func'] : 'some_invalid_callback';
666
-        // set defaults
667
-        $defaults = array(
668
-            'func'          => $func,
669
-            'id'            => $this->caller . '_' . $func . '_metabox',
670
-            'priority'      => 'default',
671
-            'label'         => $this->caller,
672
-            'context'       => 'advanced',
673
-            'callback_args' => array(),
674
-            'page'          => isset($args['page']) ? $args['page'] : $screen_id,
675
-        );
676
-        $args = wp_parse_args($args, $defaults);
677
-        extract($args);
678
-        // make sure method exists
679
-        if (! method_exists($this, $func)) {
680
-            $msg[] = __('There is no corresponding method to display the metabox content', 'event_espresso') . '<br />';
681
-            $msg[] = sprintf(
682
-                __(
683
-                    'The method name given in the array is %s, check the spelling and make sure it exists in the %s class',
684
-                    'event_espresso'
685
-                ),
686
-                $func,
687
-                $this->caller
688
-            );
689
-            throw new EE_Error(implode('||', $msg));
690
-        }
691
-        // everything checks out so lets add the metabox
692
-        add_meta_box($id, $label, array($this, $func), $page, $context, $priority, $callback_args);
693
-    }
694
-
695
-
696
-    private function _remove_metabox($args)
697
-    {
698
-        $current_screen = get_current_screen();
699
-        $screen_id = is_object($current_screen) ? $current_screen->id : null;
700
-        $func = isset($args['func']) ? $args['func'] : 'some_invalid_callback';
701
-        // set defaults
702
-        $defaults = array(
703
-            'id'      => isset($args['id'])
704
-                ? $args['id']
705
-                : $this->_current_route
706
-                  . '_'
707
-                  . $this->caller
708
-                  . '_'
709
-                  . $func
710
-                  . '_metabox',
711
-            'context' => 'default',
712
-            'screen'  => isset($args['screen']) ? $args['screen'] : $screen_id,
713
-        );
714
-        $args = wp_parse_args($args, $defaults);
715
-        extract($args);
716
-        // everything checks out so lets remove the box!
717
-        remove_meta_box($id, $screen, $context);
718
-    }
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
+
203
+		$this->_adminpage_obj = $adminpage;
204
+		$this->_req_data = array_merge($_GET, $_POST);
205
+		$this->_set_defaults();
206
+		$this->_set_hooks_properties();
207
+		// first let's verify we're on the right page
208
+		if (! isset($this->_req_data['page'])
209
+			|| (isset($this->_req_data['page'])
210
+				&& $this->_adminpage_obj->page_slug
211
+				   != $this->_req_data['page'])) {
212
+			return;
213
+		} //get out nothing more to be done here.
214
+		// allow for extends to modify properties
215
+		if (method_exists($this, '_extend_properties')) {
216
+			$this->_extend_properties();
217
+		}
218
+		$this->_set_page_object();
219
+		$this->_init_hooks();
220
+		$this->_load_custom_methods();
221
+		$this->_load_routed_hooks();
222
+		add_action('admin_enqueue_scripts', array($this, 'enqueue_scripts_styles'));
223
+		add_action('admin_enqueue_scripts', array($this, 'add_metaboxes'), 20);
224
+		add_action('admin_enqueue_scripts', array($this, 'remove_metaboxes'), 15);
225
+		$this->_ajax_hooks();
226
+	}
227
+
228
+
229
+	/**
230
+	 * used by child classes to set the following properties:
231
+	 * $_ajax_func (optional)
232
+	 * $_init_func (optional)
233
+	 * $_metaboxes (optional)
234
+	 * $_scripts (optional)
235
+	 * $_styles (optional)
236
+	 * $_name (required)
237
+	 * Also in this method will be registered any scripts or styles loaded on the targeted page (as indicated in the
238
+	 * _scripts/_styles properties) Also children should place in this method any filters/actions that have to happen
239
+	 * really early on page load (just after admin_init) if they want to have them registered for handling early.
240
+	 *
241
+	 * @access protected
242
+	 * @abstract
243
+	 * @return void
244
+	 */
245
+	abstract protected function _set_hooks_properties();
246
+
247
+
248
+	/**
249
+	 * The hooks for enqueue_scripts and enqueue_styles will be run in here.  Child classes need to define their
250
+	 * scripts and styles in the relevant $_scripts and $_styles properties.  Child classes must have also already
251
+	 * registered the scripts and styles using wp_register_script and wp_register_style functions.
252
+	 *
253
+	 * @access public
254
+	 * @return void
255
+	 */
256
+	public function enqueue_scripts_styles()
257
+	{
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
+			foreach ($this->_scripts_styles['enqueues'] as $ref => $routes) {
318
+				// make sure $routes is an array
319
+				$routes = (array) $routes;
320
+				if (in_array($this->_current_route, $routes)) {
321
+					$this->_scripts_styles['registers'][ $ref ]['type'] == 'js' ? wp_enqueue_script($ref)
322
+						: wp_enqueue_style($ref);
323
+					// if we have a localization for the script let's do that too.
324
+					if (isset($this->_scripts_styles['localize'][ $ref ])) {
325
+						foreach ($this->_scripts_styles['localize'][ $ref ] as $object_name => $indexes) {
326
+							wp_localize_script(
327
+								$ref,
328
+								$object_name,
329
+								$this->_scripts_styles['localize'][ $ref ][ $object_name ]
330
+							);
331
+						}
332
+					}
333
+				}
334
+			}
335
+			// let's do the deregisters
336
+			if (! isset($this->_scripts_styles['deregisters'])) {
337
+				return;
338
+			}
339
+			foreach ($this->_scripts_styles['deregisters'] as $ref => $details) {
340
+				$defaults = array(
341
+					'type' => 'js',
342
+				);
343
+				$details = wp_parse_args($details, $defaults);
344
+				extract($details);
345
+				$type == 'js' ? wp_deregister_script($ref) : wp_deregister_style($ref);
346
+			}
347
+		}
348
+	}
349
+
350
+
351
+	/**
352
+	 * just set the defaults for the hooks properties.
353
+	 *
354
+	 * @access private
355
+	 * @return void
356
+	 */
357
+	private function _set_defaults()
358
+	{
359
+		$this->_ajax_func = $this->_init_func = $this->_metaboxes = $this->_scripts = $this->_styles = $this->_wp_action_filters_priority = array();
360
+		$this->_current_route = isset($_REQUEST['action']) ? $_REQUEST['action'] : 'default';
361
+		$this->caller = get_class($this);
362
+		$this->_extend = stripos($this->caller, 'Extend') ? true : false;
363
+	}
364
+
365
+
366
+	/**
367
+	 * this sets the _page_object property
368
+	 *
369
+	 * @access protected
370
+	 * @return void
371
+	 */
372
+	protected function _set_page_object()
373
+	{
374
+		// first make sure $this->_name is set
375
+		if (empty($this->_name)) {
376
+			$msg[] = __('We can\'t load the page object', 'event_espresso');
377
+			$msg[] = sprintf(
378
+				__("This is because the %s child class has not set the '_name' property", 'event_espresso'),
379
+				$this->caller
380
+			);
381
+			throw new EE_Error(implode('||', $msg));
382
+		}
383
+		$ref = str_replace('_', ' ', $this->_name); // take the_message -> the message
384
+		$ref = str_replace(' ', '_', ucwords($ref)) . '_Admin_Page'; // take the message -> The_Message
385
+		// first default file (if exists)
386
+		$decaf_file = EE_ADMIN_PAGES . $this->_name . DS . $ref . '.core.php';
387
+		if (is_readable($decaf_file)) {
388
+			require_once($decaf_file);
389
+		}
390
+		// now we have to do require for extended file (if needed)
391
+		if ($this->_extend) {
392
+			require_once(EE_CORE_CAF_ADMIN_EXTEND . $this->_name . DS . 'Extend_' . $ref . '.core.php');
393
+		}
394
+		// if we've got an extended class we use that!
395
+		$ref = $this->_extend ? 'Extend_' . $ref : $ref;
396
+		// let's make sure the class exists
397
+		if (! class_exists($ref)) {
398
+			$msg[] = __('We can\'t load the page object', 'event_espresso');
399
+			$msg[] = sprintf(
400
+				__(
401
+					'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',
402
+					'event_espresso'
403
+				),
404
+				$ref
405
+			);
406
+			throw new EE_Error(implode('||', $msg));
407
+		}
408
+		$a = new ReflectionClass($ref);
409
+		$this->_page_object = $a->newInstance(false);
410
+	}
411
+
412
+
413
+	/**
414
+	 * Child "hook" classes can declare any methods that they want executed when a specific page route is loaded.  The
415
+	 * advantage of this is when doing things like running our own db interactions on saves etc.  Remember that
416
+	 * $this->_req_data (all the _POST and _GET data) is available to your methods.
417
+	 *
418
+	 * @access private
419
+	 * @return void
420
+	 */
421
+	private function _load_custom_methods()
422
+	{
423
+		/**
424
+		 * method cannot be named 'default' (@see http://us3.php
425
+		 * .net/manual/en/reserved.keywords.php) so need to
426
+		 * handle routes that are "default"
427
+		 *
428
+		 * @since 4.3.0
429
+		 */
430
+		$method_callback = $this->_current_route == 'default' ? 'default_callback' : $this->_current_route;
431
+		// these run before the Admin_Page route executes.
432
+		if (method_exists($this, $method_callback)) {
433
+			call_user_func(array($this, $method_callback));
434
+		}
435
+		// 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.
436
+		// first the actions
437
+		// note that these action hooks will have the $query_args value available.
438
+		$admin_class_name = get_class($this->_adminpage_obj);
439
+		if (method_exists($this, '_redirect_action_early_' . $this->_current_route)) {
440
+			add_action(
441
+				'AHEE__'
442
+				. $admin_class_name
443
+				. '___redirect_after_action__before_redirect_modification_'
444
+				. $this->_current_route,
445
+				array($this, '_redirect_action_early_' . $this->_current_route),
446
+				10
447
+			);
448
+		}
449
+		if (method_exists($this, '_redirect_action_' . $this->_current_route)) {
450
+			add_action(
451
+				'AHEE_redirect_' . $admin_class_name . $this->_current_route,
452
+				array($this, '_redirect_action_' . $this->_current_route),
453
+				10
454
+			);
455
+		}
456
+		// 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.
457
+		if (method_exists($this, '_redirect_filter_' . $this->_current_route)) {
458
+			add_filter(
459
+				'FHEE_redirect_' . $admin_class_name . $this->_current_route,
460
+				array($this, '_redirect_filter_' . $this->_current_route),
461
+				10,
462
+				2
463
+			);
464
+		}
465
+	}
466
+
467
+
468
+	/**
469
+	 * This method will search for a corresponding method with a name matching the route and the wp_hook to run.  This
470
+	 * allows child hook classes to target hooking into a specific wp action or filter hook ONLY on a certain route.
471
+	 * just remember, methods MUST be public Future hooks should be added in here to be access by child classes.
472
+	 *
473
+	 * @return void
474
+	 */
475
+	private function _load_routed_hooks()
476
+	{
477
+
478
+		// 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.
479
+		$hook_filter_array = array(
480
+			'admin_footer'                                                                            => array(
481
+				'type'     => 'action',
482
+				'argnum'   => 1,
483
+				'priority' => 10,
484
+			),
485
+			'FHEE_list_table_views_' . $this->_adminpage_obj->page_slug . '_' . $this->_current_route => array(
486
+				'type'     => 'filter',
487
+				'argnum'   => 1,
488
+				'priority' => 10,
489
+			),
490
+			'FHEE_list_table_views_' . $this->_adminpage_obj->page_slug                               => array(
491
+				'type'     => 'filter',
492
+				'argnum'   => 1,
493
+				'priority' => 10,
494
+			),
495
+			'FHEE_list_table_views'                                                                   => array(
496
+				'type'     => 'filter',
497
+				'argnum'   => 1,
498
+				'priority' => 10,
499
+			),
500
+			'AHEE__EE_Admin_Page___display_admin_page__modify_metaboxes'                              => array(
501
+				'type'     => 'action',
502
+				'argnum'   => 1,
503
+				'priority' => 10,
504
+			),
505
+		);
506
+		foreach ($hook_filter_array as $hook => $args) {
507
+			if (method_exists($this, $this->_current_route . '_' . $hook)) {
508
+				if (isset($this->_wp_action_filters_priority[ $hook ])) {
509
+					$args['priority'] = $this->_wp_action_filters_priority[ $hook ];
510
+				}
511
+				if ($args['type'] == 'action') {
512
+					add_action(
513
+						$hook,
514
+						array($this, $this->_current_route . '_' . $hook),
515
+						$args['priority'],
516
+						$args['argnum']
517
+					);
518
+				} else {
519
+					add_filter(
520
+						$hook,
521
+						array($this, $this->_current_route . '_' . $hook),
522
+						$args['priority'],
523
+						$args['argnum']
524
+					);
525
+				}
526
+			}
527
+		}
528
+	}
529
+
530
+
531
+	/**
532
+	 * Loop throught the $_ajax_func array and add_actions for the array.
533
+	 *
534
+	 * @return void
535
+	 */
536
+	private function _ajax_hooks()
537
+	{
538
+
539
+		if (empty($this->_ajax_func)) {
540
+			return;
541
+		} //get out there's nothing to take care of.
542
+		foreach ($this->_ajax_func as $action => $method) {
543
+			// make sure method exists
544
+			if (! method_exists($this, $method)) {
545
+				$msg[] = __(
546
+					'There is no corresponding method for the hook labeled in the _ajax_func array',
547
+					'event_espresso'
548
+				) . '<br />';
549
+				$msg[] = sprintf(
550
+					__(
551
+						'The method name given in the array is %s, check the spelling and make sure it exists in the %s class',
552
+						'event_espresso'
553
+					),
554
+					$method,
555
+					$this->caller
556
+				);
557
+				throw new EE_Error(implode('||', $msg));
558
+			}
559
+			add_action('wp_ajax_' . $action, array($this, $method));
560
+		}
561
+	}
562
+
563
+
564
+	/**
565
+	 * Loop throught the $_init_func array and add_actions for the array.
566
+	 *
567
+	 * @return void
568
+	 */
569
+	protected function _init_hooks()
570
+	{
571
+		if (empty($this->_init_func)) {
572
+			return;
573
+		} //get out there's nothing to take care of.
574
+		// We need to determine what page_route we are on!
575
+		$current_route = isset($_REQUEST['action']) ? $_REQUEST['action'] : 'default';
576
+		foreach ($this->_init_func as $route => $method) {
577
+			// make sure method exists
578
+			if (! method_exists($this, $method)) {
579
+				$msg[] = __(
580
+					'There is no corresponding method for the hook labeled in the _init_func array',
581
+					'event_espresso'
582
+				) . '<br />';
583
+				$msg[] = sprintf(
584
+					__(
585
+						'The method name given in the array is %s, check the spelling and make sure it exists in the %s class',
586
+						'event_espresso'
587
+					),
588
+					$method,
589
+					$this->caller
590
+				);
591
+				throw new EE_Error(implode('||', $msg));
592
+			}
593
+			if ($route == $this->_current_route) {
594
+				add_action('admin_init', array($this, $method));
595
+			}
596
+		}
597
+	}
598
+
599
+
600
+	/**
601
+	 * Loop through the _metaboxes property and add_metaboxes accordingly
602
+	 * //todo we could eventually make this a config component class (i.e. new EE_Metabox);
603
+	 *
604
+	 * @access public
605
+	 * @return void
606
+	 */
607
+	public function add_metaboxes()
608
+	{
609
+		if (empty($this->_metaboxes)) {
610
+			return;
611
+		} //get out we don't have any metaboxes to set for this connection
612
+		$this->_handle_metabox_array($this->_metaboxes);
613
+	}
614
+
615
+
616
+	private function _handle_metabox_array($boxes, $add = true)
617
+	{
618
+
619
+		foreach ($boxes as $box) {
620
+			if (! isset($box['page_route'])) {
621
+				continue;
622
+			} //we dont' have a valid array
623
+			// let's make sure $box['page_route'] is an array so the "foreach" will work.
624
+			$box['page_route'] = (array) $box['page_route'];
625
+			foreach ($box['page_route'] as $route) {
626
+				if ($route != $this->_current_route) {
627
+					continue;
628
+				} //get out we only add metaboxes for set route.
629
+				if ($add) {
630
+					$this->_add_metabox($box);
631
+				} else {
632
+					$this->_remove_metabox($box);
633
+				}
634
+			}
635
+		}
636
+	}
637
+
638
+
639
+	/**
640
+	 * Loop through the _remove_metaboxes property and remove metaboxes accordingly.
641
+	 *
642
+	 * @access public
643
+	 * @return void
644
+	 */
645
+	public function remove_metaboxes()
646
+	{
647
+
648
+		if (empty($this->_remove_metaboxes)) {
649
+			return;
650
+		} //get out there are no metaboxes to remove
651
+		$this->_handle_metabox_array($this->_remove_metaboxes, false);
652
+	}
653
+
654
+
655
+	/**
656
+	 * This just handles adding a metabox
657
+	 *
658
+	 * @access private
659
+	 * @param array $args an array of args that have been set for this metabox by the child class
660
+	 */
661
+	private function _add_metabox($args)
662
+	{
663
+		$current_screen = get_current_screen();
664
+		$screen_id = is_object($current_screen) ? $current_screen->id : null;
665
+		$func = isset($args['func']) ? $args['func'] : 'some_invalid_callback';
666
+		// set defaults
667
+		$defaults = array(
668
+			'func'          => $func,
669
+			'id'            => $this->caller . '_' . $func . '_metabox',
670
+			'priority'      => 'default',
671
+			'label'         => $this->caller,
672
+			'context'       => 'advanced',
673
+			'callback_args' => array(),
674
+			'page'          => isset($args['page']) ? $args['page'] : $screen_id,
675
+		);
676
+		$args = wp_parse_args($args, $defaults);
677
+		extract($args);
678
+		// make sure method exists
679
+		if (! method_exists($this, $func)) {
680
+			$msg[] = __('There is no corresponding method to display the metabox content', 'event_espresso') . '<br />';
681
+			$msg[] = sprintf(
682
+				__(
683
+					'The method name given in the array is %s, check the spelling and make sure it exists in the %s class',
684
+					'event_espresso'
685
+				),
686
+				$func,
687
+				$this->caller
688
+			);
689
+			throw new EE_Error(implode('||', $msg));
690
+		}
691
+		// everything checks out so lets add the metabox
692
+		add_meta_box($id, $label, array($this, $func), $page, $context, $priority, $callback_args);
693
+	}
694
+
695
+
696
+	private function _remove_metabox($args)
697
+	{
698
+		$current_screen = get_current_screen();
699
+		$screen_id = is_object($current_screen) ? $current_screen->id : null;
700
+		$func = isset($args['func']) ? $args['func'] : 'some_invalid_callback';
701
+		// set defaults
702
+		$defaults = array(
703
+			'id'      => isset($args['id'])
704
+				? $args['id']
705
+				: $this->_current_route
706
+				  . '_'
707
+				  . $this->caller
708
+				  . '_'
709
+				  . $func
710
+				  . '_metabox',
711
+			'context' => 'default',
712
+			'screen'  => isset($args['screen']) ? $args['screen'] : $screen_id,
713
+		);
714
+		$args = wp_parse_args($args, $defaults);
715
+		extract($args);
716
+		// everything checks out so lets remove the box!
717
+		remove_meta_box($id, $screen, $context);
718
+	}
719 719
 }
Please login to merge, or discard this patch.
Spacing   +41 added lines, -41 removed lines patch added patch discarded remove patch
@@ -205,7 +205,7 @@  discard block
 block discarded – undo
205 205
         $this->_set_defaults();
206 206
         $this->_set_hooks_properties();
207 207
         // first let's verify we're on the right page
208
-        if (! isset($this->_req_data['page'])
208
+        if ( ! isset($this->_req_data['page'])
209 209
             || (isset($this->_req_data['page'])
210 210
                 && $this->_adminpage_obj->page_slug
211 211
                    != $this->_req_data['page'])) {
@@ -256,9 +256,9 @@  discard block
 block discarded – undo
256 256
     public function enqueue_scripts_styles()
257 257
     {
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,29 +311,29 @@  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
             foreach ($this->_scripts_styles['enqueues'] as $ref => $routes) {
318 318
                 // make sure $routes is an array
319 319
                 $routes = (array) $routes;
320 320
                 if (in_array($this->_current_route, $routes)) {
321
-                    $this->_scripts_styles['registers'][ $ref ]['type'] == 'js' ? wp_enqueue_script($ref)
321
+                    $this->_scripts_styles['registers'][$ref]['type'] == 'js' ? wp_enqueue_script($ref)
322 322
                         : wp_enqueue_style($ref);
323 323
                     // if we have a localization for the script let's do that too.
324
-                    if (isset($this->_scripts_styles['localize'][ $ref ])) {
325
-                        foreach ($this->_scripts_styles['localize'][ $ref ] as $object_name => $indexes) {
324
+                    if (isset($this->_scripts_styles['localize'][$ref])) {
325
+                        foreach ($this->_scripts_styles['localize'][$ref] as $object_name => $indexes) {
326 326
                             wp_localize_script(
327 327
                                 $ref,
328 328
                                 $object_name,
329
-                                $this->_scripts_styles['localize'][ $ref ][ $object_name ]
329
+                                $this->_scripts_styles['localize'][$ref][$object_name]
330 330
                             );
331 331
                         }
332 332
                     }
333 333
                 }
334 334
             }
335 335
             // let's do the deregisters
336
-            if (! isset($this->_scripts_styles['deregisters'])) {
336
+            if ( ! isset($this->_scripts_styles['deregisters'])) {
337 337
                 return;
338 338
             }
339 339
             foreach ($this->_scripts_styles['deregisters'] as $ref => $details) {
@@ -381,20 +381,20 @@  discard block
 block discarded – undo
381 381
             throw new EE_Error(implode('||', $msg));
382 382
         }
383 383
         $ref = str_replace('_', ' ', $this->_name); // take the_message -> the message
384
-        $ref = str_replace(' ', '_', ucwords($ref)) . '_Admin_Page'; // take the message -> The_Message
384
+        $ref = str_replace(' ', '_', ucwords($ref)).'_Admin_Page'; // take the message -> The_Message
385 385
         // first default file (if exists)
386
-        $decaf_file = EE_ADMIN_PAGES . $this->_name . DS . $ref . '.core.php';
386
+        $decaf_file = EE_ADMIN_PAGES.$this->_name.DS.$ref.'.core.php';
387 387
         if (is_readable($decaf_file)) {
388 388
             require_once($decaf_file);
389 389
         }
390 390
         // now we have to do require for extended file (if needed)
391 391
         if ($this->_extend) {
392
-            require_once(EE_CORE_CAF_ADMIN_EXTEND . $this->_name . DS . 'Extend_' . $ref . '.core.php');
392
+            require_once(EE_CORE_CAF_ADMIN_EXTEND.$this->_name.DS.'Extend_'.$ref.'.core.php');
393 393
         }
394 394
         // if we've got an extended class we use that!
395
-        $ref = $this->_extend ? 'Extend_' . $ref : $ref;
395
+        $ref = $this->_extend ? 'Extend_'.$ref : $ref;
396 396
         // let's make sure the class exists
397
-        if (! class_exists($ref)) {
397
+        if ( ! class_exists($ref)) {
398 398
             $msg[] = __('We can\'t load the page object', 'event_espresso');
399 399
             $msg[] = sprintf(
400 400
                 __(
@@ -436,28 +436,28 @@  discard block
 block discarded – undo
436 436
         // first the actions
437 437
         // note that these action hooks will have the $query_args value available.
438 438
         $admin_class_name = get_class($this->_adminpage_obj);
439
-        if (method_exists($this, '_redirect_action_early_' . $this->_current_route)) {
439
+        if (method_exists($this, '_redirect_action_early_'.$this->_current_route)) {
440 440
             add_action(
441 441
                 'AHEE__'
442 442
                 . $admin_class_name
443 443
                 . '___redirect_after_action__before_redirect_modification_'
444 444
                 . $this->_current_route,
445
-                array($this, '_redirect_action_early_' . $this->_current_route),
445
+                array($this, '_redirect_action_early_'.$this->_current_route),
446 446
                 10
447 447
             );
448 448
         }
449
-        if (method_exists($this, '_redirect_action_' . $this->_current_route)) {
449
+        if (method_exists($this, '_redirect_action_'.$this->_current_route)) {
450 450
             add_action(
451
-                'AHEE_redirect_' . $admin_class_name . $this->_current_route,
452
-                array($this, '_redirect_action_' . $this->_current_route),
451
+                'AHEE_redirect_'.$admin_class_name.$this->_current_route,
452
+                array($this, '_redirect_action_'.$this->_current_route),
453 453
                 10
454 454
             );
455 455
         }
456 456
         // 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.
457
-        if (method_exists($this, '_redirect_filter_' . $this->_current_route)) {
457
+        if (method_exists($this, '_redirect_filter_'.$this->_current_route)) {
458 458
             add_filter(
459
-                'FHEE_redirect_' . $admin_class_name . $this->_current_route,
460
-                array($this, '_redirect_filter_' . $this->_current_route),
459
+                'FHEE_redirect_'.$admin_class_name.$this->_current_route,
460
+                array($this, '_redirect_filter_'.$this->_current_route),
461 461
                 10,
462 462
                 2
463 463
             );
@@ -482,12 +482,12 @@  discard block
 block discarded – undo
482 482
                 'argnum'   => 1,
483 483
                 'priority' => 10,
484 484
             ),
485
-            'FHEE_list_table_views_' . $this->_adminpage_obj->page_slug . '_' . $this->_current_route => array(
485
+            'FHEE_list_table_views_'.$this->_adminpage_obj->page_slug.'_'.$this->_current_route => array(
486 486
                 'type'     => 'filter',
487 487
                 'argnum'   => 1,
488 488
                 'priority' => 10,
489 489
             ),
490
-            'FHEE_list_table_views_' . $this->_adminpage_obj->page_slug                               => array(
490
+            'FHEE_list_table_views_'.$this->_adminpage_obj->page_slug                               => array(
491 491
                 'type'     => 'filter',
492 492
                 'argnum'   => 1,
493 493
                 'priority' => 10,
@@ -504,21 +504,21 @@  discard block
 block discarded – undo
504 504
             ),
505 505
         );
506 506
         foreach ($hook_filter_array as $hook => $args) {
507
-            if (method_exists($this, $this->_current_route . '_' . $hook)) {
508
-                if (isset($this->_wp_action_filters_priority[ $hook ])) {
509
-                    $args['priority'] = $this->_wp_action_filters_priority[ $hook ];
507
+            if (method_exists($this, $this->_current_route.'_'.$hook)) {
508
+                if (isset($this->_wp_action_filters_priority[$hook])) {
509
+                    $args['priority'] = $this->_wp_action_filters_priority[$hook];
510 510
                 }
511 511
                 if ($args['type'] == 'action') {
512 512
                     add_action(
513 513
                         $hook,
514
-                        array($this, $this->_current_route . '_' . $hook),
514
+                        array($this, $this->_current_route.'_'.$hook),
515 515
                         $args['priority'],
516 516
                         $args['argnum']
517 517
                     );
518 518
                 } else {
519 519
                     add_filter(
520 520
                         $hook,
521
-                        array($this, $this->_current_route . '_' . $hook),
521
+                        array($this, $this->_current_route.'_'.$hook),
522 522
                         $args['priority'],
523 523
                         $args['argnum']
524 524
                     );
@@ -541,11 +541,11 @@  discard block
 block discarded – undo
541 541
         } //get out there's nothing to take care of.
542 542
         foreach ($this->_ajax_func as $action => $method) {
543 543
             // make sure method exists
544
-            if (! method_exists($this, $method)) {
544
+            if ( ! method_exists($this, $method)) {
545 545
                 $msg[] = __(
546 546
                     'There is no corresponding method for the hook labeled in the _ajax_func array',
547 547
                     'event_espresso'
548
-                ) . '<br />';
548
+                ).'<br />';
549 549
                 $msg[] = sprintf(
550 550
                     __(
551 551
                         'The method name given in the array is %s, check the spelling and make sure it exists in the %s class',
@@ -556,7 +556,7 @@  discard block
 block discarded – undo
556 556
                 );
557 557
                 throw new EE_Error(implode('||', $msg));
558 558
             }
559
-            add_action('wp_ajax_' . $action, array($this, $method));
559
+            add_action('wp_ajax_'.$action, array($this, $method));
560 560
         }
561 561
     }
562 562
 
@@ -575,11 +575,11 @@  discard block
 block discarded – undo
575 575
         $current_route = isset($_REQUEST['action']) ? $_REQUEST['action'] : 'default';
576 576
         foreach ($this->_init_func as $route => $method) {
577 577
             // make sure method exists
578
-            if (! method_exists($this, $method)) {
578
+            if ( ! method_exists($this, $method)) {
579 579
                 $msg[] = __(
580 580
                     'There is no corresponding method for the hook labeled in the _init_func array',
581 581
                     'event_espresso'
582
-                ) . '<br />';
582
+                ).'<br />';
583 583
                 $msg[] = sprintf(
584 584
                     __(
585 585
                         'The method name given in the array is %s, check the spelling and make sure it exists in the %s class',
@@ -617,7 +617,7 @@  discard block
 block discarded – undo
617 617
     {
618 618
 
619 619
         foreach ($boxes as $box) {
620
-            if (! isset($box['page_route'])) {
620
+            if ( ! isset($box['page_route'])) {
621 621
                 continue;
622 622
             } //we dont' have a valid array
623 623
             // let's make sure $box['page_route'] is an array so the "foreach" will work.
@@ -666,7 +666,7 @@  discard block
 block discarded – undo
666 666
         // set defaults
667 667
         $defaults = array(
668 668
             'func'          => $func,
669
-            'id'            => $this->caller . '_' . $func . '_metabox',
669
+            'id'            => $this->caller.'_'.$func.'_metabox',
670 670
             'priority'      => 'default',
671 671
             'label'         => $this->caller,
672 672
             'context'       => 'advanced',
@@ -676,8 +676,8 @@  discard block
 block discarded – undo
676 676
         $args = wp_parse_args($args, $defaults);
677 677
         extract($args);
678 678
         // make sure method exists
679
-        if (! method_exists($this, $func)) {
680
-            $msg[] = __('There is no corresponding method to display the metabox content', 'event_espresso') . '<br />';
679
+        if ( ! method_exists($this, $func)) {
680
+            $msg[] = __('There is no corresponding method to display the metabox content', 'event_espresso').'<br />';
681 681
             $msg[] = sprintf(
682 682
                 __(
683 683
                     '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.
acceptance_tests/Helpers/BaseCoreAdmin.php 1 patch
Indentation   +59 added lines, -59 removed lines patch added patch discarded remove patch
@@ -13,72 +13,72 @@
 block discarded – undo
13 13
 trait BaseCoreAdmin
14 14
 {
15 15
 
16
-    /**
17
-     * Core method for going to an Event Espresso Admin page.
18
-     * @param string $page
19
-     * @param string $action
20
-     * @param string $additional_params
21
-     */
22
-    public function amOnEventEspressoAdminPage($page = '', $action = '', $additional_params = '')
23
-    {
24
-        $this->actor()->amOnAdminPage(CoreAdmin::adminUrl($page, $action, $additional_params));
25
-    }
16
+	/**
17
+	 * Core method for going to an Event Espresso Admin page.
18
+	 * @param string $page
19
+	 * @param string $action
20
+	 * @param string $additional_params
21
+	 */
22
+	public function amOnEventEspressoAdminPage($page = '', $action = '', $additional_params = '')
23
+	{
24
+		$this->actor()->amOnAdminPage(CoreAdmin::adminUrl($page, $action, $additional_params));
25
+	}
26 26
 
27 27
 
28
-    /**
29
-     * Helper method for returning an instance of the Actor.  Intended to help with IDE fill out of methods.
30
-     * @return \EventEspressoAcceptanceTester;
31
-     */
32
-    protected function actor()
33
-    {
34
-        /** @var \EventEspressoAcceptanceTester $this */
35
-        return $this;
36
-    }
28
+	/**
29
+	 * Helper method for returning an instance of the Actor.  Intended to help with IDE fill out of methods.
30
+	 * @return \EventEspressoAcceptanceTester;
31
+	 */
32
+	protected function actor()
33
+	{
34
+		/** @var \EventEspressoAcceptanceTester $this */
35
+		return $this;
36
+	}
37 37
 
38 38
 
39
-    /**
40
-     * Use this to set the per page option for a list table page.
41
-     * Assumes you are on a page that has this field exposed.
42
-     *
43
-     * @param int|string $per_page_value
44
-     * @throws \Codeception\Exception\TestRuntimeException
45
-     */
46
-    public function setPerPageOptionForScreen($per_page_value)
47
-    {
48
-        $this->actor()->click(CoreAdmin::WP_SCREEN_SETTINGS_LINK_SELECTOR);
49
-        $this->actor()->fillField(CoreAdmin::WP_SCREEN_SETTINGS_PER_PAGE_FIELD_SELECTOR, $per_page_value);
50
-        $this->actor()->click(CoreAdmin::WP_SCREEN_OPTIONS_APPLY_SETTINGS_BUTTON_SELECTOR);
51
-        $this->actor()->wait(8);
52
-    }
39
+	/**
40
+	 * Use this to set the per page option for a list table page.
41
+	 * Assumes you are on a page that has this field exposed.
42
+	 *
43
+	 * @param int|string $per_page_value
44
+	 * @throws \Codeception\Exception\TestRuntimeException
45
+	 */
46
+	public function setPerPageOptionForScreen($per_page_value)
47
+	{
48
+		$this->actor()->click(CoreAdmin::WP_SCREEN_SETTINGS_LINK_SELECTOR);
49
+		$this->actor()->fillField(CoreAdmin::WP_SCREEN_SETTINGS_PER_PAGE_FIELD_SELECTOR, $per_page_value);
50
+		$this->actor()->click(CoreAdmin::WP_SCREEN_OPTIONS_APPLY_SETTINGS_BUTTON_SELECTOR);
51
+		$this->actor()->wait(8);
52
+	}
53 53
 
54 54
 
55 55
 
56
-    /**
57
-     * Use this to append a given value to a wpEditor instance.
58
-     * How it works is it first switched the instance to the text (or html) view so that the textarea is exposed and
59
-     * the value is added to the text area.
60
-     *
61
-     * @param $field_reference
62
-     * @param $value
63
-     * @throws \Codeception\Exception\ElementNotFound
64
-     */
65
-    public function appendToWPEditorField($field_reference, $value)
66
-    {
67
-        $this->actor()->click(CoreAdmin::wpEditorTextTabSelector($field_reference));
68
-        $this->actor()->appendField(CoreAdmin::wpEditorTextAreaSelector($field_reference), $value);
69
-    }
56
+	/**
57
+	 * Use this to append a given value to a wpEditor instance.
58
+	 * How it works is it first switched the instance to the text (or html) view so that the textarea is exposed and
59
+	 * the value is added to the text area.
60
+	 *
61
+	 * @param $field_reference
62
+	 * @param $value
63
+	 * @throws \Codeception\Exception\ElementNotFound
64
+	 */
65
+	public function appendToWPEditorField($field_reference, $value)
66
+	{
67
+		$this->actor()->click(CoreAdmin::wpEditorTextTabSelector($field_reference));
68
+		$this->actor()->appendField(CoreAdmin::wpEditorTextAreaSelector($field_reference), $value);
69
+	}
70 70
 
71 71
 
72
-    /**
73
-     * Use to select and submit the given bulk action.
74
-     * @param string $bulk_action_option
75
-     */
76
-    public function submitBulkActionOnListTable($bulk_action_option)
77
-    {
78
-        $this->actor()->selectOption(
79
-            CoreAdmin::SELECTOR_LIST_TABLE_BULK_ACTION_FIELD,
80
-            $bulk_action_option
81
-        );
82
-        $this->actor()->click(CoreAdmin::SELECTOR_LIST_TABLE_BULK_ACTTION_APPLY);
83
-    }
72
+	/**
73
+	 * Use to select and submit the given bulk action.
74
+	 * @param string $bulk_action_option
75
+	 */
76
+	public function submitBulkActionOnListTable($bulk_action_option)
77
+	{
78
+		$this->actor()->selectOption(
79
+			CoreAdmin::SELECTOR_LIST_TABLE_BULK_ACTION_FIELD,
80
+			$bulk_action_option
81
+		);
82
+		$this->actor()->click(CoreAdmin::SELECTOR_LIST_TABLE_BULK_ACTTION_APPLY);
83
+	}
84 84
 }
Please login to merge, or discard this patch.
core/libraries/messages/EE_message_type.lib.php 3 patches
Doc Comments   +1 added lines, -1 removed lines patch added patch discarded remove patch
@@ -832,7 +832,7 @@
 block discarded – undo
832 832
      * Takes care of setting up the addressee object(s) for the primary attendee.
833 833
      *
834 834
      * @access protected
835
-     * @return array of EE_Addressee objects
835
+     * @return EE_Messages_Addressee[] of EE_Addressee objects
836 836
      * @throws EE_Error
837 837
      */
838 838
     protected function _primary_attendee_addressees()
Please login to merge, or discard this patch.
Indentation   +903 added lines, -903 removed lines patch added patch discarded remove patch
@@ -17,913 +17,913 @@
 block discarded – undo
17 17
 {
18 18
 
19 19
 
20
-    /**
21
-     * message type child classes will set what contexts are associated with the message type via this array.
22
-     * format:
23
-     * array(
24
-     * 'context' => array(
25
-     *        'label' => __('Context Label', 'event_espresso'),
26
-     *        'description' => __('Context description (for help popups)', 'event_espresso')
27
-     *    ));
28
-     *
29
-     * @var array
30
-     */
31
-    protected $_contexts = array();
32
-
33
-
34
-    /**
35
-     * This property is used to define what the display label will be for contexts (eg. "Recipients", "Themes" etc.)
36
-     * Format:
37
-     * array( 'label' => 'something', 'plural' => 'somethings', 'description' => 'something' );
38
-     *
39
-     * @var array
40
-     */
41
-    protected $_context_label;
42
-
43
-
44
-    /** MESSAGE ASSEMBLING PROPERTIES **/
45
-    /**
46
-     * This parameter simply holds all the message objects for retrieval by the controller and sending to the messenger.
47
-     *
48
-     * @var array of message objects.
49
-     */
50
-    public $messages = array();
51
-
52
-    /**
53
-     * The following holds the templates that will be used to assemble the message object for the messenger.
54
-     *
55
-     * @var array
56
-     */
57
-    protected $_templates;
58
-
59
-
60
-    /**
61
-     * If a specific template is being parsed, this will hold the message template group GRP_ID for that template.
62
-     *
63
-     * @var int.
64
-     */
65
-    protected $_GRP_ID;
66
-
67
-
68
-    /** OTHER INFO PROPERTIES **/
69
-    /**
70
-     * This will hold the count of the message objects in the messages array. This could be used for determining if
71
-     * batching/queueing is needed.
72
-     *
73
-     * @var int
74
-     */
75
-    public $count = 0;
76
-
77
-
78
-    /**
79
-     * This is set via the `do_messenger_hooks` method and contains the messenger being used to send the message of
80
-     * this message type at time of sending.
81
-     *
82
-     * @var EE_messenger
83
-     */
84
-    protected $_active_messenger;
85
-
86
-
87
-    /**
88
-     * This will hold the shortcode_replace instance for handling replacement of shortcodes in the various templates
89
-     *
90
-     * @var object
91
-     */
92
-    protected $_shortcode_replace;
93
-
94
-
95
-    /**
96
-     * The purpose for this property is to simply allow message types to indicate if the message generated is intended
97
-     * for only single context.  Child message types should redefine this variable (if necessary) in the
98
-     * _set_data_Handler() method.
99
-     *
100
-     * @var boolean
101
-     */
102
-    protected $_single_message = false;
103
-
104
-
105
-    /**
106
-     * This will hold an array of specific reg_ids that are receiving messages.
107
-     *
108
-     * @since 4.7.x
109
-     * @var array
110
-     */
111
-    protected $_regs_for_sending = array();
112
-
113
-
114
-    /**
115
-     * This holds the data passed to this class from the controller and also the final processed data.
116
-     *
117
-     * @var object
118
-     */
119
-    protected $_data;
120
-
121
-
122
-    /**
123
-     * this is just a flag indicating whether we're in preview mode or not.
124
-     *
125
-     * @var bool
126
-     */
127
-    protected $_preview = false;
128
-
129
-
130
-    /**
131
-     * This just holds defaults for addressee data that children merge with their data array setup
132
-     *
133
-     * @var array
134
-     */
135
-    protected $_default_addressee_data;
136
-
137
-
138
-    /**
139
-     * Child classes declare through this property what handler they want to use for the incoming data and this string
140
-     * is used to instantiate the EE_Messages_incoming_data child class for that handler.
141
-     *
142
-     * @var string
143
-     */
144
-    protected $_data_handler;
145
-
146
-
147
-    /**
148
-     * This holds any specific fields for holding any settings related to a message type (if any needed)
149
-     *
150
-     * @var array
151
-     */
152
-    protected $_admin_settings_fields = array();
153
-
154
-    /**
155
-     * this property will hold any existing setting that may have been set in the admin.
156
-     *
157
-     * @var array
158
-     */
159
-    protected $_existing_admin_settings = array();
160
-
161
-
162
-    /**
163
-     * This is used to designate the generating and alternative sending messengers for a message type.  It is set via
164
-     * set_with_messengers() on construct. Note, generating messenger also acts as a sending messenger for this message
165
-     * type.  However ONLY the generating messengers are used for creating templates for this message type. Should be
166
-     * in this format:
167
-     * {
168
-     *
169
-     * @type string $generating_messenger the name of the generating messenger.  Generating
170
-     *                                          messengers are used for generating templates,
171
-     *                                          doing validation and defining valid shortcodes.
172
-     *      {
173
-     * @type string $sending_messenger    values are the name(s) for the sending
174
-     *                                              messengers.  sending messengers are
175
-     *                                              just valid delivery vehicles that will utilize
176
-     *                                              the templates (and generated EE_message
177
-     *                                              objects from the generating messengers).
178
-     *      }
179
-     * }
180
-     * @since                             4.5.0
181
-     * @var array
182
-     */
183
-    protected $_with_messengers = array();
184
-
185
-
186
-    /**
187
-     * This holds the addressees in an array indexed by context for later retrieval when assembling the message objects.
188
-     *
189
-     * @access protected
190
-     * @var array
191
-     */
192
-    protected $_addressees = array();
193
-
194
-
195
-    /**
196
-     * This allows each message type to set what alternate messenger&message type combination can be used for fallback
197
-     * default templates if there are no specific ones defined for this messenger and message type.  Should be in the
198
-     * format:
199
-     * array(
200
-     *      'messenger' => 'message_type',
201
-     *      'another_messenger' => another_message_type
202
-     * );
203
-     * This is set in the message type constructor.
204
-     *
205
-     * @var array
206
-     */
207
-    protected $_master_templates = array();
208
-
209
-
210
-    /**
211
-     * This holds whatever the set template pack is for a message template group when generating messages.
212
-     *
213
-     * @since 4.5.0
214
-     * @var EE_Messages_Template_Pack
215
-     */
216
-    protected $_template_pack;
217
-
218
-
219
-    /**
220
-     * This holds whatever the set variation is for a message template group when generating messages.
221
-     *
222
-     * @since 4.5.0
223
-     * @var string
224
-     */
225
-    protected $_variation;
226
-
227
-
228
-    /**
229
-     * EE_message_type constructor.
230
-     */
231
-    public function __construct()
232
-    {
233
-        $this->_messages_item_type = 'message_type';
234
-        $this->_set_contexts();
235
-        $this->_set_with_messengers();
236
-        parent::__construct();
237
-    }
238
-
239
-
240
-    /**
241
-     * This sets the data handler for the message type.  It must be used to define the _data_handler property.  It is
242
-     * called when messages are setup.
243
-     *
244
-     * @abstract
245
-     * @access protected
246
-     * @return void
247
-     */
248
-    abstract protected function _set_data_handler();
249
-
250
-
251
-    /**
252
-     * This method should return a EE_Base_Class object (or array of EE_Base_Class objects) for the given context and
253
-     * ID (which should be the primary key id for the base class).  Client code doesn't have to know what a message
254
-     * type's data handler is.
255
-     *
256
-     * @since 4.5.0
257
-     * @param string          $context      This should be a string matching a valid context for the message type.
258
-     * @param EE_Registration $registration Need a registration to ensure that the data is valid (prevents people
259
-     *                                      guessing a url).
260
-     * @param int             $id           Optional. Integer corresponding to the value for the primary key of a
261
-     *                                      EE_Base_Class_Object
262
-     * @return mixed ( EE_Base_Class||EE_Base_Class[] )
263
-     */
264
-    abstract protected function _get_data_for_context($context, EE_Registration $registration, $id);
265
-
266
-
267
-    /**
268
-     * _set_contexts
269
-     * This sets up the contexts associated with the message_type
270
-     *
271
-     * @abstract
272
-     * @access  protected
273
-     * @return  void
274
-     */
275
-    abstract protected function _set_contexts();
276
-
277
-
278
-    /**
279
-     * This is used to get the "id" value fo the msg_trigger_url generated by get_url_trigger().
280
-     * In most cases, child classes don't need anything, (hence the default of 0), however if there is a specific
281
-     * EE_Base_Class that is required in generating a message for a message type recipient then the message
282
-     * type should override this method and use the given params to generate the correct ID.
283
-     *
284
-     * @param string          $context      The message type context.
285
-     * @param EE_Registration $registration Registration object
286
-     * @deprecated 4.9.0
287
-     * @return int
288
-     */
289
-    protected function _get_id_for_msg_url($context, EE_Registration $registration)
290
-    {
291
-        return 0;
292
-    }
293
-
294
-
295
-    /**
296
-     * This sets up any action/filter hooks this message type puts in place for a specific messenger.  Note that by
297
-     * default this does nothing.  Child classes will need to override if they want to add specific hooks for a
298
-     * messenger.
299
-     *
300
-     * @since 1.0.0
301
-     * @return void
302
-     */
303
-    protected function _do_messenger_hooks()
304
-    {
305
-        return;
306
-    }
307
-
308
-
309
-    /**
310
-     * This is a public wrapper for the protected _do_messenger_hooks() method.
311
-     * For backward compat reasons, this was done rather than making the protected method public.
312
-     *
313
-     * @param   EE_messenger $messenger This is used to set the $_active_messenger property, so message types are able
314
-     *                                  to know what messenger is being used to send the message at the time of
315
-     *                                  sending.
316
-     * @since 4.9.0
317
-     */
318
-    public function do_messenger_hooks($messenger = null)
319
-    {
320
-        $this->_active_messenger = $messenger;
321
-        $this->_do_messenger_hooks();
322
-    }
323
-
324
-
325
-    /**
326
-     * This method returns whether this message type should always generate a new copy
327
-     * when requested, or if links can be to the already generated copy.
328
-     * Note: this does NOT affect viewing/resending already generated messages in the EE_Message list table.
329
-     * Child classes should override this if different from the default of false.
330
-     *
331
-     * @return bool     false means can link to generated EE_Message.  true must regenerate.
332
-     */
333
-    public function always_generate()
334
-    {
335
-        return false;
336
-    }
337
-
338
-
339
-    /**
340
-     * Returns the priority for the message type.
341
-     * Priorities are defined as constants on EEM_Message.  Currently there are three priorities:
342
-     * - EEM_Message::priority_high
343
-     * - EEM_Message::priority_medium
344
-     * - EEM_Message::priority_low
345
-     * Priority is used to determine the weight the message type is given when queuing for generation and/or sending.
346
-     *
347
-     * @see    EEM_Message for more phpdocs on priority.
348
-     *         The default priority for all message_types is EEM_Message::priority_low.  Message Types wanting to give
349
-     *         a higher priority must override this method. Also note, messengers are able to override priorities
350
-     *         queuing instructions if their "send_now" flag is set to true. An example of this is the HTML messenger
351
-     *         which displays things in the browser.
352
-     * @since  4.9.0
353
-     * @return int
354
-     */
355
-    public function get_priority()
356
-    {
357
-        return EEM_Message::priority_low;
358
-    }
359
-
360
-
361
-    /**
362
-     * This runs the _set_data_handler() method for message types and then returns what got set.
363
-     *
364
-     * @param mixed $data This sets the data property for the message type with the incoming data used for generating.
365
-     * @return string (the reference for the data handler) (will be an empty string if could not be determined).
366
-     */
367
-    public function get_data_handler($data)
368
-    {
369
-        $this->_data = $data;
370
-        $this->_set_data_handler();
371
-        return apply_filters('FHEE__EE_message_type__get_data_handler', $this->_data_handler, $this);
372
-    }
373
-
374
-
375
-    /**
376
-     * This is called externally to reset the value of the $_data property for the message type.
377
-     * Please note the value of the _data is highly volatile.  It was added as an interim measure ensuring
378
-     * EE_Message_To_Generate objects have any changes to the _data property when `_set_data_handler` method is called
379
-     * (and for back compat reasons). This particular method is used in
380
-     * EE_Messages_Generator::_reset_current_properties to ensure that the internal _data on the message type is
381
-     * cleaned before subsequent EE_Message generation in the same request.
382
-     *
383
-     * @todo      This needs refactored along with the whole _set_data_handler() method in EE_message_types. Need to
384
-     *            ensure that there is no manipulation of the _data property during run time so there's a clear
385
-     *            expectation of what it is.  Likely we need to ensure that _data is not persisted IN the message type
386
-     *            at all.
387
-     * @internal  Plugin authors, do not implement this method, it is subject to change.
388
-     * @since     4.9
389
-     */
390
-    public function reset_data()
391
-    {
392
-        $this->_data = null;
393
-    }
394
-
395
-
396
-    /**
397
-     * This does some validation of incoming params gets the url trigger from the defined method in the specific child
398
-     * class and then filters the results.
399
-     *
400
-     * @param string          $context           The message type context
401
-     * @param string          $sending_messenger The sending messenger
402
-     * @param EE_Registration $registration      Registration object
403
-     * @throws EE_Error
404
-     * @deprecated  4.9.0  Likely 4.9.10 or 4.10.0 will remove this method completely
405
-     * @return string          generated url
406
-     */
407
-    public function get_url_trigger($context, $sending_messenger, EE_Registration $registration)
408
-    {
409
-        // validate context
410
-        // valid context?
411
-        if (! isset($this->_contexts[ $context ])) {
412
-            throw new EE_Error(
413
-                sprintf(
414
-                    __('The context %s is not a valid context for %s.', 'event_espresso'),
415
-                    $context,
416
-                    get_class($this)
417
-                )
418
-            );
419
-        }
420
-        // valid sending_messenger?
421
-        $not_valid_msgr = false;
422
-        foreach ($this->_with_messengers as $generating => $sendings) {
423
-            if (empty($sendings) || array_search($sending_messenger, $sendings) === false) {
424
-                $not_valid_msgr = true;
425
-            }
426
-        }
427
-        if ($not_valid_msgr) {
428
-            throw new EE_Error(
429
-                sprintf(
430
-                    __(
431
-                        'The given sending messenger string (%s) does not match a valid sending messenger with the %s.  If this is incorrect, make sure that the message type has defined this messenger as a sending messenger in its $_with_messengers array.',
432
-                        'event_espresso'
433
-                    ),
434
-                    $sending_messenger,
435
-                    get_class($this)
436
-                )
437
-            );
438
-        }
439
-        return EEH_MSG_Template::generate_url_trigger(
440
-            $sending_messenger,
441
-            $this->_active_messenger->name,
442
-            $context,
443
-            $this->name,
444
-            $registration,
445
-            $this->_GRP_ID,
446
-            $this->_get_id_for_msg_url($context, $registration)
447
-        );
448
-    }
449
-
450
-
451
-    /**
452
-     * Wrapper for _get_data_for_context() that handles some validation before calling the main class and also allows
453
-     * for filtering. This is (currently) called by the EED_Messages module.
454
-     *
455
-     * @since 4.5.0
456
-     * @throws EE_Error
457
-     * @param string          $context      This should be a string matching a valid context for the message type.
458
-     * @param EE_Registration $registration Need a registration to ensure that the data is valid (prevents people
459
-     *                                      guessing a url).
460
-     * @param int             $id           Optional. Integer corresponding to the value for the primary key of a
461
-     *                                      EE_Base_Class_Object
462
-     * @return mixed (EE_Base_Class||EE_Base_Class[])
463
-     */
464
-    public function get_data_for_context($context, EE_Registration $registration, $id = 0)
465
-    {
466
-        // valid context?
467
-        if (! isset($this->_contexts[ $context ])) {
468
-            throw new EE_Error(
469
-                sprintf(
470
-                    __('The context %s is not a valid context for %s.', 'event_espresso'),
471
-                    $context,
472
-                    get_class($this)
473
-                )
474
-            );
475
-        }
476
-        // get data and apply global and class specific filters on it.
477
-        $data = apply_filters(
478
-            'FHEE__EE_message_type__get_data_for_context__data',
479
-            $this->_get_data_for_context($context, $registration, $id),
480
-            $this
481
-        );
482
-        $data = apply_filters('FHEE__' . get_class($this) . '__get_data_for_context__data', $data, $this);
483
-        // if empty then something went wrong!
484
-        if (empty($data)) {
485
-            throw new EE_Error(
486
-                sprintf(
487
-                    __(
488
-                        'There is no data retrieved, it is possible that the id given (%d) does not match any value in the database for the corresponding EE_Base_Class used by the data handler for the %s message type.',
489
-                        'event_espresso'
490
-                    ),
491
-                    $id,
492
-                    $this->name
493
-                )
494
-            );
495
-        }
496
-        return $data;
497
-    }
498
-
499
-
500
-    /**
501
-     * This returns the contents of the _data property.
502
-     * Please note the value of the _data is highly volatile.  It was added as an interim measure ensuring
503
-     * EE_Message_To_Generate objects have any changes to the _data property when `_set_data_handler` method is called.
504
-     *
505
-     * @todo      This needs refactored along with the whole _set_data_handler() method in EE_message_types. Need to
506
-     *            ensure that there is no manipulation of the _data property during run time so there's a clear
507
-     *            expectation of what it is.
508
-     * @internal  Plugin authors, do not implement this method, it is subject to change.
509
-     * @return mixed
510
-     */
511
-    public function get_data()
512
-    {
513
-        return $this->_data;
514
-    }
515
-
516
-
517
-    /**
518
-     * used to set the $_with_messengers property. (this is a default, child classes SHOULD override)
519
-     *
520
-     * @see   property definition for description of setup.
521
-     * @since 4.5.0
522
-     * @abstract
523
-     * @return void
524
-     */
525
-    protected function _set_with_messengers()
526
-    {
527
-        $this->_with_messengers = array(
528
-            'email' => array('html'),
529
-        );
530
-    }
531
-
532
-
533
-    /**
534
-     * Return the value of the _with_messengers property
535
-     *
536
-     * @since 4.5.0
537
-     * @return array
538
-     */
539
-    public function with_messengers()
540
-    {
541
-        return apply_filters(
542
-            'FHEE__EE_message_type__get_with_messengers__with_messengers__' . get_class($this),
543
-            $this->_with_messengers
544
-        );
545
-    }
546
-
547
-
548
-    /**
549
-     * this public method accepts a page slug (for an EE_admin page) and will return the response from the child class
550
-     * callback function if that page is registered via the `_admin_registered_page` property set by the child class.
551
-     * *
552
-     *
553
-     * @param string $page       the slug of the EE admin page
554
-     * @param array  $messengers an array of active messenger objects
555
-     * @param string $action     the page action (to allow for more specific handling - i.e. edit vs. add pages)
556
-     * @param array  $extra      This is just an extra argument that can be used to pass additional data for setting up
557
-     *                           page content.
558
-     * @access public
559
-     * @return string
560
-     */
561
-    public function get_message_type_admin_page_content(
562
-        $page,
563
-        $action = null,
564
-        $extra = array(),
565
-        $messengers = array()
566
-    ) {
567
-        // we can also further refine the context by action (if present).
568
-        return $this->_get_admin_page_content($page, $action, $extra, $messengers);
569
-    }
570
-
571
-
572
-    /**
573
-     * @return array
574
-     */
575
-    public function get_contexts()
576
-    {
577
-        return $this->_contexts;
578
-    }
579
-
580
-
581
-    /**
582
-     * This just returns the context label for a given context (as set in $_context_label property)
583
-     *
584
-     * @access public
585
-     * @return array
586
-     */
587
-    public function get_context_label()
588
-    {
589
-        return $this->_context_label;
590
-    }
591
-
592
-
593
-    /**
594
-     * This just returns the (filtered) _master_templates property.
595
-     *
596
-     * @see property definition for documentation.
597
-     * @return array
598
-     */
599
-    public function get_master_templates()
600
-    {
601
-        // first class specific filter then filter that by the global filter.
602
-        $master_templates = apply_filters(
603
-            'FHEE__' . get_class($this) . '__get_master_templates',
604
-            $this->_master_templates
605
-        );
606
-        return apply_filters('FHEE__EE_message_type__get_master_templates', $master_templates, $this);
607
-    }
608
-
609
-
610
-    /**
611
-     * Accepts an incoming data handler which contains data for processing, and returns an array of
612
-     * EE_Messages_Addressee objects.
613
-     *
614
-     * @param EE_Messages_incoming_data $data
615
-     * @param string                    $context Limit addressees to specific context.
616
-     * @return array An array indexed by context where each context is an array of EE_Messages_Addressee objects for
617
-     *                                           that context
618
-     * @throws EE_Error
619
-     */
620
-    public function get_addressees(EE_Messages_incoming_data $data, $context = '')
621
-    {
622
-        // override _data
623
-        $this->_data       = $data;
624
-        $addressees        = array();
625
-        $original_contexts = $this->_contexts;
626
-        // if incoming context then limit to that context
627
-        if (! empty($context)) {
628
-            $cntxt = ! empty($this->_contexts[ $context ]) ? $this->_contexts[ $context ] : '';
629
-            if (! empty($cntxt)) {
630
-                $this->_contexts           = array();
631
-                $this->_contexts[ $context ] = $cntxt;
632
-            }
633
-        }
634
-        $this->_set_default_addressee_data();
635
-        if ($this->_process_data()) {
636
-            $addressees = $this->_addressees;
637
-        }
638
-
639
-        // reset contexts and addressees
640
-        $this->_contexts   = $original_contexts;
641
-        $this->_addressees = array();
642
-        return $addressees;
643
-    }
644
-
645
-
646
-    /**
647
-     * processes the data object so we get
648
-     *
649
-     * @throws EE_Error
650
-     * @return bool  true means data was processed successfully, false means not.
651
-     */
652
-    protected function _process_data()
653
-    {
654
-        // at a minimum, we NEED EE_Attendee objects.
655
-        if (empty($this->_data->attendees)) {
656
-            return false;  // there's no data to process!
657
-        }
658
-        // process addressees for each context.  Child classes will have to have methods for
659
-        // each context defined to handle the processing of the data object within them
660
-        foreach ($this->_contexts as $context => $details) {
661
-            $xpctd_method = '_' . $context . '_addressees';
662
-            if (! method_exists($this, $xpctd_method)) {
663
-                throw new EE_Error(
664
-                    sprintf(
665
-                        __(
666
-                            'The data for %1$s message type cannot be prepared because there is no set method for doing so.  The expected method name is "%2$s" please doublecheck the %1$s message type class and make sure that method is present',
667
-                            'event_espresso'
668
-                        ),
669
-                        $this->label['singular'],
670
-                        $xpctd_method
671
-                    )
672
-                );
673
-            }
674
-            $this->_addressees[ $context ] = call_user_func(array($this, $xpctd_method));
675
-        }
676
-        return true; // data was processed successfully.
677
-    }
678
-
679
-
680
-    /**
681
-     * sets the default_addressee_data property,
682
-     *
683
-     * @access private
684
-     * @return void
685
-     */
686
-    private function _set_default_addressee_data()
687
-    {
688
-        $this->_default_addressee_data = array(
689
-            'billing'                  => $this->_data->billing,
690
-            'taxes'                    => $this->_data->taxes,
691
-            'tax_line_items'           => $this->_data->tax_line_items,
692
-            'additional_line_items'    => $this->_data->additional_line_items,
693
-            'grand_total_line_item'    => $this->_data->grand_total_line_item,
694
-            'txn'                      => $this->_data->txn,
695
-            'payments'                 => $this->_data->payments,
696
-            'payment'                  => isset($this->_data->payment) && $this->_data->payment instanceof EE_Payment
697
-                ? $this->_data->payment
698
-                : null,
699
-            'reg_objs'                 => $this->_data->reg_objs,
700
-            'registrations'            => $this->_data->registrations,
701
-            'datetimes'                => $this->_data->datetimes,
702
-            'tickets'                  => $this->_data->tickets,
703
-            'line_items_with_children' => $this->_data->line_items_with_children,
704
-            'questions'                => $this->_data->questions,
705
-            'answers'                  => $this->_data->answers,
706
-            'txn_status'               => $this->_data->txn_status,
707
-            'total_ticket_count'       => $this->_data->total_ticket_count,
708
-        );
709
-        if (is_array($this->_data->primary_attendee_data)) {
710
-            $this->_default_addressee_data                    = array_merge(
711
-                $this->_default_addressee_data,
712
-                $this->_data->primary_attendee_data
713
-            );
714
-            $this->_default_addressee_data['primary_att_obj'] = $this->_data->primary_attendee_data['att_obj'];
715
-            $this->_default_addressee_data['primary_reg_obj'] = $this->_data->primary_attendee_data['reg_obj'];
716
-        }
717
-    }
718
-
719
-
720
-
721
-    /********************
20
+	/**
21
+	 * message type child classes will set what contexts are associated with the message type via this array.
22
+	 * format:
23
+	 * array(
24
+	 * 'context' => array(
25
+	 *        'label' => __('Context Label', 'event_espresso'),
26
+	 *        'description' => __('Context description (for help popups)', 'event_espresso')
27
+	 *    ));
28
+	 *
29
+	 * @var array
30
+	 */
31
+	protected $_contexts = array();
32
+
33
+
34
+	/**
35
+	 * This property is used to define what the display label will be for contexts (eg. "Recipients", "Themes" etc.)
36
+	 * Format:
37
+	 * array( 'label' => 'something', 'plural' => 'somethings', 'description' => 'something' );
38
+	 *
39
+	 * @var array
40
+	 */
41
+	protected $_context_label;
42
+
43
+
44
+	/** MESSAGE ASSEMBLING PROPERTIES **/
45
+	/**
46
+	 * This parameter simply holds all the message objects for retrieval by the controller and sending to the messenger.
47
+	 *
48
+	 * @var array of message objects.
49
+	 */
50
+	public $messages = array();
51
+
52
+	/**
53
+	 * The following holds the templates that will be used to assemble the message object for the messenger.
54
+	 *
55
+	 * @var array
56
+	 */
57
+	protected $_templates;
58
+
59
+
60
+	/**
61
+	 * If a specific template is being parsed, this will hold the message template group GRP_ID for that template.
62
+	 *
63
+	 * @var int.
64
+	 */
65
+	protected $_GRP_ID;
66
+
67
+
68
+	/** OTHER INFO PROPERTIES **/
69
+	/**
70
+	 * This will hold the count of the message objects in the messages array. This could be used for determining if
71
+	 * batching/queueing is needed.
72
+	 *
73
+	 * @var int
74
+	 */
75
+	public $count = 0;
76
+
77
+
78
+	/**
79
+	 * This is set via the `do_messenger_hooks` method and contains the messenger being used to send the message of
80
+	 * this message type at time of sending.
81
+	 *
82
+	 * @var EE_messenger
83
+	 */
84
+	protected $_active_messenger;
85
+
86
+
87
+	/**
88
+	 * This will hold the shortcode_replace instance for handling replacement of shortcodes in the various templates
89
+	 *
90
+	 * @var object
91
+	 */
92
+	protected $_shortcode_replace;
93
+
94
+
95
+	/**
96
+	 * The purpose for this property is to simply allow message types to indicate if the message generated is intended
97
+	 * for only single context.  Child message types should redefine this variable (if necessary) in the
98
+	 * _set_data_Handler() method.
99
+	 *
100
+	 * @var boolean
101
+	 */
102
+	protected $_single_message = false;
103
+
104
+
105
+	/**
106
+	 * This will hold an array of specific reg_ids that are receiving messages.
107
+	 *
108
+	 * @since 4.7.x
109
+	 * @var array
110
+	 */
111
+	protected $_regs_for_sending = array();
112
+
113
+
114
+	/**
115
+	 * This holds the data passed to this class from the controller and also the final processed data.
116
+	 *
117
+	 * @var object
118
+	 */
119
+	protected $_data;
120
+
121
+
122
+	/**
123
+	 * this is just a flag indicating whether we're in preview mode or not.
124
+	 *
125
+	 * @var bool
126
+	 */
127
+	protected $_preview = false;
128
+
129
+
130
+	/**
131
+	 * This just holds defaults for addressee data that children merge with their data array setup
132
+	 *
133
+	 * @var array
134
+	 */
135
+	protected $_default_addressee_data;
136
+
137
+
138
+	/**
139
+	 * Child classes declare through this property what handler they want to use for the incoming data and this string
140
+	 * is used to instantiate the EE_Messages_incoming_data child class for that handler.
141
+	 *
142
+	 * @var string
143
+	 */
144
+	protected $_data_handler;
145
+
146
+
147
+	/**
148
+	 * This holds any specific fields for holding any settings related to a message type (if any needed)
149
+	 *
150
+	 * @var array
151
+	 */
152
+	protected $_admin_settings_fields = array();
153
+
154
+	/**
155
+	 * this property will hold any existing setting that may have been set in the admin.
156
+	 *
157
+	 * @var array
158
+	 */
159
+	protected $_existing_admin_settings = array();
160
+
161
+
162
+	/**
163
+	 * This is used to designate the generating and alternative sending messengers for a message type.  It is set via
164
+	 * set_with_messengers() on construct. Note, generating messenger also acts as a sending messenger for this message
165
+	 * type.  However ONLY the generating messengers are used for creating templates for this message type. Should be
166
+	 * in this format:
167
+	 * {
168
+	 *
169
+	 * @type string $generating_messenger the name of the generating messenger.  Generating
170
+	 *                                          messengers are used for generating templates,
171
+	 *                                          doing validation and defining valid shortcodes.
172
+	 *      {
173
+	 * @type string $sending_messenger    values are the name(s) for the sending
174
+	 *                                              messengers.  sending messengers are
175
+	 *                                              just valid delivery vehicles that will utilize
176
+	 *                                              the templates (and generated EE_message
177
+	 *                                              objects from the generating messengers).
178
+	 *      }
179
+	 * }
180
+	 * @since                             4.5.0
181
+	 * @var array
182
+	 */
183
+	protected $_with_messengers = array();
184
+
185
+
186
+	/**
187
+	 * This holds the addressees in an array indexed by context for later retrieval when assembling the message objects.
188
+	 *
189
+	 * @access protected
190
+	 * @var array
191
+	 */
192
+	protected $_addressees = array();
193
+
194
+
195
+	/**
196
+	 * This allows each message type to set what alternate messenger&message type combination can be used for fallback
197
+	 * default templates if there are no specific ones defined for this messenger and message type.  Should be in the
198
+	 * format:
199
+	 * array(
200
+	 *      'messenger' => 'message_type',
201
+	 *      'another_messenger' => another_message_type
202
+	 * );
203
+	 * This is set in the message type constructor.
204
+	 *
205
+	 * @var array
206
+	 */
207
+	protected $_master_templates = array();
208
+
209
+
210
+	/**
211
+	 * This holds whatever the set template pack is for a message template group when generating messages.
212
+	 *
213
+	 * @since 4.5.0
214
+	 * @var EE_Messages_Template_Pack
215
+	 */
216
+	protected $_template_pack;
217
+
218
+
219
+	/**
220
+	 * This holds whatever the set variation is for a message template group when generating messages.
221
+	 *
222
+	 * @since 4.5.0
223
+	 * @var string
224
+	 */
225
+	protected $_variation;
226
+
227
+
228
+	/**
229
+	 * EE_message_type constructor.
230
+	 */
231
+	public function __construct()
232
+	{
233
+		$this->_messages_item_type = 'message_type';
234
+		$this->_set_contexts();
235
+		$this->_set_with_messengers();
236
+		parent::__construct();
237
+	}
238
+
239
+
240
+	/**
241
+	 * This sets the data handler for the message type.  It must be used to define the _data_handler property.  It is
242
+	 * called when messages are setup.
243
+	 *
244
+	 * @abstract
245
+	 * @access protected
246
+	 * @return void
247
+	 */
248
+	abstract protected function _set_data_handler();
249
+
250
+
251
+	/**
252
+	 * This method should return a EE_Base_Class object (or array of EE_Base_Class objects) for the given context and
253
+	 * ID (which should be the primary key id for the base class).  Client code doesn't have to know what a message
254
+	 * type's data handler is.
255
+	 *
256
+	 * @since 4.5.0
257
+	 * @param string          $context      This should be a string matching a valid context for the message type.
258
+	 * @param EE_Registration $registration Need a registration to ensure that the data is valid (prevents people
259
+	 *                                      guessing a url).
260
+	 * @param int             $id           Optional. Integer corresponding to the value for the primary key of a
261
+	 *                                      EE_Base_Class_Object
262
+	 * @return mixed ( EE_Base_Class||EE_Base_Class[] )
263
+	 */
264
+	abstract protected function _get_data_for_context($context, EE_Registration $registration, $id);
265
+
266
+
267
+	/**
268
+	 * _set_contexts
269
+	 * This sets up the contexts associated with the message_type
270
+	 *
271
+	 * @abstract
272
+	 * @access  protected
273
+	 * @return  void
274
+	 */
275
+	abstract protected function _set_contexts();
276
+
277
+
278
+	/**
279
+	 * This is used to get the "id" value fo the msg_trigger_url generated by get_url_trigger().
280
+	 * In most cases, child classes don't need anything, (hence the default of 0), however if there is a specific
281
+	 * EE_Base_Class that is required in generating a message for a message type recipient then the message
282
+	 * type should override this method and use the given params to generate the correct ID.
283
+	 *
284
+	 * @param string          $context      The message type context.
285
+	 * @param EE_Registration $registration Registration object
286
+	 * @deprecated 4.9.0
287
+	 * @return int
288
+	 */
289
+	protected function _get_id_for_msg_url($context, EE_Registration $registration)
290
+	{
291
+		return 0;
292
+	}
293
+
294
+
295
+	/**
296
+	 * This sets up any action/filter hooks this message type puts in place for a specific messenger.  Note that by
297
+	 * default this does nothing.  Child classes will need to override if they want to add specific hooks for a
298
+	 * messenger.
299
+	 *
300
+	 * @since 1.0.0
301
+	 * @return void
302
+	 */
303
+	protected function _do_messenger_hooks()
304
+	{
305
+		return;
306
+	}
307
+
308
+
309
+	/**
310
+	 * This is a public wrapper for the protected _do_messenger_hooks() method.
311
+	 * For backward compat reasons, this was done rather than making the protected method public.
312
+	 *
313
+	 * @param   EE_messenger $messenger This is used to set the $_active_messenger property, so message types are able
314
+	 *                                  to know what messenger is being used to send the message at the time of
315
+	 *                                  sending.
316
+	 * @since 4.9.0
317
+	 */
318
+	public function do_messenger_hooks($messenger = null)
319
+	{
320
+		$this->_active_messenger = $messenger;
321
+		$this->_do_messenger_hooks();
322
+	}
323
+
324
+
325
+	/**
326
+	 * This method returns whether this message type should always generate a new copy
327
+	 * when requested, or if links can be to the already generated copy.
328
+	 * Note: this does NOT affect viewing/resending already generated messages in the EE_Message list table.
329
+	 * Child classes should override this if different from the default of false.
330
+	 *
331
+	 * @return bool     false means can link to generated EE_Message.  true must regenerate.
332
+	 */
333
+	public function always_generate()
334
+	{
335
+		return false;
336
+	}
337
+
338
+
339
+	/**
340
+	 * Returns the priority for the message type.
341
+	 * Priorities are defined as constants on EEM_Message.  Currently there are three priorities:
342
+	 * - EEM_Message::priority_high
343
+	 * - EEM_Message::priority_medium
344
+	 * - EEM_Message::priority_low
345
+	 * Priority is used to determine the weight the message type is given when queuing for generation and/or sending.
346
+	 *
347
+	 * @see    EEM_Message for more phpdocs on priority.
348
+	 *         The default priority for all message_types is EEM_Message::priority_low.  Message Types wanting to give
349
+	 *         a higher priority must override this method. Also note, messengers are able to override priorities
350
+	 *         queuing instructions if their "send_now" flag is set to true. An example of this is the HTML messenger
351
+	 *         which displays things in the browser.
352
+	 * @since  4.9.0
353
+	 * @return int
354
+	 */
355
+	public function get_priority()
356
+	{
357
+		return EEM_Message::priority_low;
358
+	}
359
+
360
+
361
+	/**
362
+	 * This runs the _set_data_handler() method for message types and then returns what got set.
363
+	 *
364
+	 * @param mixed $data This sets the data property for the message type with the incoming data used for generating.
365
+	 * @return string (the reference for the data handler) (will be an empty string if could not be determined).
366
+	 */
367
+	public function get_data_handler($data)
368
+	{
369
+		$this->_data = $data;
370
+		$this->_set_data_handler();
371
+		return apply_filters('FHEE__EE_message_type__get_data_handler', $this->_data_handler, $this);
372
+	}
373
+
374
+
375
+	/**
376
+	 * This is called externally to reset the value of the $_data property for the message type.
377
+	 * Please note the value of the _data is highly volatile.  It was added as an interim measure ensuring
378
+	 * EE_Message_To_Generate objects have any changes to the _data property when `_set_data_handler` method is called
379
+	 * (and for back compat reasons). This particular method is used in
380
+	 * EE_Messages_Generator::_reset_current_properties to ensure that the internal _data on the message type is
381
+	 * cleaned before subsequent EE_Message generation in the same request.
382
+	 *
383
+	 * @todo      This needs refactored along with the whole _set_data_handler() method in EE_message_types. Need to
384
+	 *            ensure that there is no manipulation of the _data property during run time so there's a clear
385
+	 *            expectation of what it is.  Likely we need to ensure that _data is not persisted IN the message type
386
+	 *            at all.
387
+	 * @internal  Plugin authors, do not implement this method, it is subject to change.
388
+	 * @since     4.9
389
+	 */
390
+	public function reset_data()
391
+	{
392
+		$this->_data = null;
393
+	}
394
+
395
+
396
+	/**
397
+	 * This does some validation of incoming params gets the url trigger from the defined method in the specific child
398
+	 * class and then filters the results.
399
+	 *
400
+	 * @param string          $context           The message type context
401
+	 * @param string          $sending_messenger The sending messenger
402
+	 * @param EE_Registration $registration      Registration object
403
+	 * @throws EE_Error
404
+	 * @deprecated  4.9.0  Likely 4.9.10 or 4.10.0 will remove this method completely
405
+	 * @return string          generated url
406
+	 */
407
+	public function get_url_trigger($context, $sending_messenger, EE_Registration $registration)
408
+	{
409
+		// validate context
410
+		// valid context?
411
+		if (! isset($this->_contexts[ $context ])) {
412
+			throw new EE_Error(
413
+				sprintf(
414
+					__('The context %s is not a valid context for %s.', 'event_espresso'),
415
+					$context,
416
+					get_class($this)
417
+				)
418
+			);
419
+		}
420
+		// valid sending_messenger?
421
+		$not_valid_msgr = false;
422
+		foreach ($this->_with_messengers as $generating => $sendings) {
423
+			if (empty($sendings) || array_search($sending_messenger, $sendings) === false) {
424
+				$not_valid_msgr = true;
425
+			}
426
+		}
427
+		if ($not_valid_msgr) {
428
+			throw new EE_Error(
429
+				sprintf(
430
+					__(
431
+						'The given sending messenger string (%s) does not match a valid sending messenger with the %s.  If this is incorrect, make sure that the message type has defined this messenger as a sending messenger in its $_with_messengers array.',
432
+						'event_espresso'
433
+					),
434
+					$sending_messenger,
435
+					get_class($this)
436
+				)
437
+			);
438
+		}
439
+		return EEH_MSG_Template::generate_url_trigger(
440
+			$sending_messenger,
441
+			$this->_active_messenger->name,
442
+			$context,
443
+			$this->name,
444
+			$registration,
445
+			$this->_GRP_ID,
446
+			$this->_get_id_for_msg_url($context, $registration)
447
+		);
448
+	}
449
+
450
+
451
+	/**
452
+	 * Wrapper for _get_data_for_context() that handles some validation before calling the main class and also allows
453
+	 * for filtering. This is (currently) called by the EED_Messages module.
454
+	 *
455
+	 * @since 4.5.0
456
+	 * @throws EE_Error
457
+	 * @param string          $context      This should be a string matching a valid context for the message type.
458
+	 * @param EE_Registration $registration Need a registration to ensure that the data is valid (prevents people
459
+	 *                                      guessing a url).
460
+	 * @param int             $id           Optional. Integer corresponding to the value for the primary key of a
461
+	 *                                      EE_Base_Class_Object
462
+	 * @return mixed (EE_Base_Class||EE_Base_Class[])
463
+	 */
464
+	public function get_data_for_context($context, EE_Registration $registration, $id = 0)
465
+	{
466
+		// valid context?
467
+		if (! isset($this->_contexts[ $context ])) {
468
+			throw new EE_Error(
469
+				sprintf(
470
+					__('The context %s is not a valid context for %s.', 'event_espresso'),
471
+					$context,
472
+					get_class($this)
473
+				)
474
+			);
475
+		}
476
+		// get data and apply global and class specific filters on it.
477
+		$data = apply_filters(
478
+			'FHEE__EE_message_type__get_data_for_context__data',
479
+			$this->_get_data_for_context($context, $registration, $id),
480
+			$this
481
+		);
482
+		$data = apply_filters('FHEE__' . get_class($this) . '__get_data_for_context__data', $data, $this);
483
+		// if empty then something went wrong!
484
+		if (empty($data)) {
485
+			throw new EE_Error(
486
+				sprintf(
487
+					__(
488
+						'There is no data retrieved, it is possible that the id given (%d) does not match any value in the database for the corresponding EE_Base_Class used by the data handler for the %s message type.',
489
+						'event_espresso'
490
+					),
491
+					$id,
492
+					$this->name
493
+				)
494
+			);
495
+		}
496
+		return $data;
497
+	}
498
+
499
+
500
+	/**
501
+	 * This returns the contents of the _data property.
502
+	 * Please note the value of the _data is highly volatile.  It was added as an interim measure ensuring
503
+	 * EE_Message_To_Generate objects have any changes to the _data property when `_set_data_handler` method is called.
504
+	 *
505
+	 * @todo      This needs refactored along with the whole _set_data_handler() method in EE_message_types. Need to
506
+	 *            ensure that there is no manipulation of the _data property during run time so there's a clear
507
+	 *            expectation of what it is.
508
+	 * @internal  Plugin authors, do not implement this method, it is subject to change.
509
+	 * @return mixed
510
+	 */
511
+	public function get_data()
512
+	{
513
+		return $this->_data;
514
+	}
515
+
516
+
517
+	/**
518
+	 * used to set the $_with_messengers property. (this is a default, child classes SHOULD override)
519
+	 *
520
+	 * @see   property definition for description of setup.
521
+	 * @since 4.5.0
522
+	 * @abstract
523
+	 * @return void
524
+	 */
525
+	protected function _set_with_messengers()
526
+	{
527
+		$this->_with_messengers = array(
528
+			'email' => array('html'),
529
+		);
530
+	}
531
+
532
+
533
+	/**
534
+	 * Return the value of the _with_messengers property
535
+	 *
536
+	 * @since 4.5.0
537
+	 * @return array
538
+	 */
539
+	public function with_messengers()
540
+	{
541
+		return apply_filters(
542
+			'FHEE__EE_message_type__get_with_messengers__with_messengers__' . get_class($this),
543
+			$this->_with_messengers
544
+		);
545
+	}
546
+
547
+
548
+	/**
549
+	 * this public method accepts a page slug (for an EE_admin page) and will return the response from the child class
550
+	 * callback function if that page is registered via the `_admin_registered_page` property set by the child class.
551
+	 * *
552
+	 *
553
+	 * @param string $page       the slug of the EE admin page
554
+	 * @param array  $messengers an array of active messenger objects
555
+	 * @param string $action     the page action (to allow for more specific handling - i.e. edit vs. add pages)
556
+	 * @param array  $extra      This is just an extra argument that can be used to pass additional data for setting up
557
+	 *                           page content.
558
+	 * @access public
559
+	 * @return string
560
+	 */
561
+	public function get_message_type_admin_page_content(
562
+		$page,
563
+		$action = null,
564
+		$extra = array(),
565
+		$messengers = array()
566
+	) {
567
+		// we can also further refine the context by action (if present).
568
+		return $this->_get_admin_page_content($page, $action, $extra, $messengers);
569
+	}
570
+
571
+
572
+	/**
573
+	 * @return array
574
+	 */
575
+	public function get_contexts()
576
+	{
577
+		return $this->_contexts;
578
+	}
579
+
580
+
581
+	/**
582
+	 * This just returns the context label for a given context (as set in $_context_label property)
583
+	 *
584
+	 * @access public
585
+	 * @return array
586
+	 */
587
+	public function get_context_label()
588
+	{
589
+		return $this->_context_label;
590
+	}
591
+
592
+
593
+	/**
594
+	 * This just returns the (filtered) _master_templates property.
595
+	 *
596
+	 * @see property definition for documentation.
597
+	 * @return array
598
+	 */
599
+	public function get_master_templates()
600
+	{
601
+		// first class specific filter then filter that by the global filter.
602
+		$master_templates = apply_filters(
603
+			'FHEE__' . get_class($this) . '__get_master_templates',
604
+			$this->_master_templates
605
+		);
606
+		return apply_filters('FHEE__EE_message_type__get_master_templates', $master_templates, $this);
607
+	}
608
+
609
+
610
+	/**
611
+	 * Accepts an incoming data handler which contains data for processing, and returns an array of
612
+	 * EE_Messages_Addressee objects.
613
+	 *
614
+	 * @param EE_Messages_incoming_data $data
615
+	 * @param string                    $context Limit addressees to specific context.
616
+	 * @return array An array indexed by context where each context is an array of EE_Messages_Addressee objects for
617
+	 *                                           that context
618
+	 * @throws EE_Error
619
+	 */
620
+	public function get_addressees(EE_Messages_incoming_data $data, $context = '')
621
+	{
622
+		// override _data
623
+		$this->_data       = $data;
624
+		$addressees        = array();
625
+		$original_contexts = $this->_contexts;
626
+		// if incoming context then limit to that context
627
+		if (! empty($context)) {
628
+			$cntxt = ! empty($this->_contexts[ $context ]) ? $this->_contexts[ $context ] : '';
629
+			if (! empty($cntxt)) {
630
+				$this->_contexts           = array();
631
+				$this->_contexts[ $context ] = $cntxt;
632
+			}
633
+		}
634
+		$this->_set_default_addressee_data();
635
+		if ($this->_process_data()) {
636
+			$addressees = $this->_addressees;
637
+		}
638
+
639
+		// reset contexts and addressees
640
+		$this->_contexts   = $original_contexts;
641
+		$this->_addressees = array();
642
+		return $addressees;
643
+	}
644
+
645
+
646
+	/**
647
+	 * processes the data object so we get
648
+	 *
649
+	 * @throws EE_Error
650
+	 * @return bool  true means data was processed successfully, false means not.
651
+	 */
652
+	protected function _process_data()
653
+	{
654
+		// at a minimum, we NEED EE_Attendee objects.
655
+		if (empty($this->_data->attendees)) {
656
+			return false;  // there's no data to process!
657
+		}
658
+		// process addressees for each context.  Child classes will have to have methods for
659
+		// each context defined to handle the processing of the data object within them
660
+		foreach ($this->_contexts as $context => $details) {
661
+			$xpctd_method = '_' . $context . '_addressees';
662
+			if (! method_exists($this, $xpctd_method)) {
663
+				throw new EE_Error(
664
+					sprintf(
665
+						__(
666
+							'The data for %1$s message type cannot be prepared because there is no set method for doing so.  The expected method name is "%2$s" please doublecheck the %1$s message type class and make sure that method is present',
667
+							'event_espresso'
668
+						),
669
+						$this->label['singular'],
670
+						$xpctd_method
671
+					)
672
+				);
673
+			}
674
+			$this->_addressees[ $context ] = call_user_func(array($this, $xpctd_method));
675
+		}
676
+		return true; // data was processed successfully.
677
+	}
678
+
679
+
680
+	/**
681
+	 * sets the default_addressee_data property,
682
+	 *
683
+	 * @access private
684
+	 * @return void
685
+	 */
686
+	private function _set_default_addressee_data()
687
+	{
688
+		$this->_default_addressee_data = array(
689
+			'billing'                  => $this->_data->billing,
690
+			'taxes'                    => $this->_data->taxes,
691
+			'tax_line_items'           => $this->_data->tax_line_items,
692
+			'additional_line_items'    => $this->_data->additional_line_items,
693
+			'grand_total_line_item'    => $this->_data->grand_total_line_item,
694
+			'txn'                      => $this->_data->txn,
695
+			'payments'                 => $this->_data->payments,
696
+			'payment'                  => isset($this->_data->payment) && $this->_data->payment instanceof EE_Payment
697
+				? $this->_data->payment
698
+				: null,
699
+			'reg_objs'                 => $this->_data->reg_objs,
700
+			'registrations'            => $this->_data->registrations,
701
+			'datetimes'                => $this->_data->datetimes,
702
+			'tickets'                  => $this->_data->tickets,
703
+			'line_items_with_children' => $this->_data->line_items_with_children,
704
+			'questions'                => $this->_data->questions,
705
+			'answers'                  => $this->_data->answers,
706
+			'txn_status'               => $this->_data->txn_status,
707
+			'total_ticket_count'       => $this->_data->total_ticket_count,
708
+		);
709
+		if (is_array($this->_data->primary_attendee_data)) {
710
+			$this->_default_addressee_data                    = array_merge(
711
+				$this->_default_addressee_data,
712
+				$this->_data->primary_attendee_data
713
+			);
714
+			$this->_default_addressee_data['primary_att_obj'] = $this->_data->primary_attendee_data['att_obj'];
715
+			$this->_default_addressee_data['primary_reg_obj'] = $this->_data->primary_attendee_data['reg_obj'];
716
+		}
717
+	}
718
+
719
+
720
+
721
+	/********************
722 722
      * setup default shared addressee object/contexts
723 723
      * These can be utilized simply by defining the context in the child message type.
724 724
      * They can also be overridden if a specific message type needs to do something different for that context.
725 725
      ****************/
726
-    /**
727
-     * see abstract declaration in parent class for details, children message types can
728
-     * override these valid shortcodes if desired (we include all for all contexts by default).
729
-     */
730
-    protected function _set_valid_shortcodes()
731
-    {
732
-        $all_shortcodes = array(
733
-            'attendee_list',
734
-            'attendee',
735
-            'datetime_list',
736
-            'datetime',
737
-            'event_list',
738
-            'event_meta',
739
-            'event',
740
-            'organization',
741
-            'recipient_details',
742
-            'recipient_list',
743
-            'ticket_list',
744
-            'ticket',
745
-            'transaction',
746
-            'venue',
747
-            'primary_registration_details',
748
-            'primary_registration_list',
749
-            'event_author',
750
-            'email',
751
-            'messenger',
752
-        );
753
-        $contexts       = $this->get_contexts();
754
-        foreach ($contexts as $context => $details) {
755
-            $this->_valid_shortcodes[ $context ] = $all_shortcodes;
756
-            // make sure non admin context does not include the event_author shortcodes
757
-            if ($context != 'admin') {
758
-                if (($key = array_search('event_author', $this->_valid_shortcodes[ $context ])) !== false) {
759
-                    unset($this->_valid_shortcodes[ $context ][ $key ]);
760
-                }
761
-            }
762
-        }
763
-        // make sure admin context does not include the recipient_details shortcodes
764
-        // IF we have admin context hooked in message types might not have that context.
765
-        if (! empty($this->_valid_shortcodes['admin'])) {
766
-            if (($key = array_search('recipient_details', $this->_valid_shortcodes['admin'])) !== false) {
767
-                unset($this->_valid_shortcodes['admin'][ $key ]);
768
-            }
769
-            // make sure admin context does not include the recipient_details shortcodes
770
-            if (($key = array_search('recipient_list', $this->_valid_shortcodes['admin'])) !== false) {
771
-                unset($this->_valid_shortcodes['admin'][ $key ]);
772
-            }
773
-        }
774
-    }
775
-
776
-
777
-    /**
778
-     * Used by Validators to modify the valid shortcodes.
779
-     *
780
-     * @param  array $new_config array of valid shortcodes (by context)
781
-     * @return void               sets valid_shortcodes property
782
-     */
783
-    public function reset_valid_shortcodes_config($new_config)
784
-    {
785
-        foreach ($new_config as $context => $shortcodes) {
786
-            $this->_valid_shortcodes[ $context ] = $shortcodes;
787
-        }
788
-    }
789
-
790
-
791
-    /**
792
-     * returns an array of addressee objects for event_admins
793
-     *
794
-     * @access protected
795
-     * @return array array of EE_Messages_Addressee objects
796
-     * @throws EE_Error
797
-     * @throws InvalidArgumentException
798
-     * @throws InvalidDataTypeException
799
-     * @throws InvalidInterfaceException
800
-     */
801
-    protected function _admin_addressees()
802
-    {
803
-        $admin_events = array();
804
-        $addressees   = array();
805
-        // first we need to get the event admin user id for all the events
806
-        // and setup an addressee object for each unique admin user.
807
-        foreach ($this->_data->events as $line_ref => $event) {
808
-            $admin_id = $this->_get_event_admin_id($event['ID']);
809
-            // make sure we are just including the events that belong to this admin!
810
-            $admin_events[ $admin_id ][ $line_ref ] = $event;
811
-        }
812
-        // k now we can loop through the event_admins and setup the addressee data.
813
-        foreach ($admin_events as $admin_id => $event_details) {
814
-            $aee          = array(
815
-                'user_id'        => $admin_id,
816
-                'events'         => $event_details,
817
-                'attendees'      => $this->_data->attendees,
818
-                'recipient_id'   => $admin_id,
819
-                'recipient_type' => 'WP_User',
820
-            );
821
-            $aee          = array_merge($this->_default_addressee_data, $aee);
822
-            $addressees[] = new EE_Messages_Addressee($aee);
823
-        }
824
-        return $addressees;
825
-    }
826
-
827
-
828
-    /**
829
-     * Takes care of setting up the addressee object(s) for the primary attendee.
830
-     *
831
-     * @access protected
832
-     * @return array of EE_Addressee objects
833
-     * @throws EE_Error
834
-     */
835
-    protected function _primary_attendee_addressees()
836
-    {
837
-        $aee                   = $this->_default_addressee_data;
838
-        $aee['events']         = $this->_data->events;
839
-        $aee['attendees']      = $this->_data->attendees;
840
-        $aee['recipient_id']   = $aee['primary_att_obj'] instanceof EE_Attendee ? $aee['primary_att_obj']->ID() : 0;
841
-        $aee['recipient_type'] = 'Attendee';
842
-        // great now we can instantiate the $addressee object and return (as an array);
843
-        $add[] = new EE_Messages_Addressee($aee);
844
-        return $add;
845
-    }
846
-
847
-
848
-    /**
849
-     * Takes care of setting up the addressee object(s) for the registered attendees
850
-     *
851
-     * @access protected
852
-     * @return array of EE_Addressee objects
853
-     */
854
-    protected function _attendee_addressees()
855
-    {
856
-        $add = array();
857
-        // we just have to loop through the attendees.  We'll also set the attached events for each attendee.
858
-        // use to verify unique attendee emails... we don't want to sent multiple copies to the same attendee do we?
859
-        $already_processed = array();
860
-        foreach ($this->_data->attendees as $att_id => $details) {
861
-            // set the attendee array to blank on each loop;
862
-            $aee = array();
863
-            if (isset($this->_data->reg_obj)
864
-                && ($this->_data->reg_obj->attendee_ID() != $att_id)
865
-                && $this->_single_message
866
-            ) {
867
-                continue;
868
-            }
869
-            // is $this->_regs_for_sending present?
870
-            // If so, let's make sure we ONLY generate addressee for registrations in that array.
871
-            if (! empty($this->_regs_for_sending) && is_array($this->_regs_for_sending)) {
872
-                $regs_allowed = array_intersect_key(array_flip($this->_regs_for_sending), $details['reg_objs']);
873
-                if (empty($regs_allowed)) {
874
-                    continue;
875
-                }
876
-            }
877
-            if (apply_filters(
878
-                'FHEE__EE_message_type___attendee_addressees__prevent_duplicate_email_sends',
879
-                true,
880
-                $this->_data,
881
-                $this
882
-            )
883
-                && in_array($att_id, $already_processed, true)
884
-            ) {
885
-                continue;
886
-            }
887
-            $already_processed[] = $att_id;
888
-            foreach ($details as $item => $value) {
889
-                $aee[ $item ] = $value;
890
-                if ($item === 'line_ref') {
891
-                    foreach ($value as $event_id) {
892
-                        $aee['events'][ $event_id ] = $this->_data->events[ $event_id ];
893
-                    }
894
-                }
895
-                if ($item === 'attendee_email') {
896
-                    $aee['attendee_email'] = $value;
897
-                }
898
-                /*if ( $item == 'registration_id' ) {
726
+	/**
727
+	 * see abstract declaration in parent class for details, children message types can
728
+	 * override these valid shortcodes if desired (we include all for all contexts by default).
729
+	 */
730
+	protected function _set_valid_shortcodes()
731
+	{
732
+		$all_shortcodes = array(
733
+			'attendee_list',
734
+			'attendee',
735
+			'datetime_list',
736
+			'datetime',
737
+			'event_list',
738
+			'event_meta',
739
+			'event',
740
+			'organization',
741
+			'recipient_details',
742
+			'recipient_list',
743
+			'ticket_list',
744
+			'ticket',
745
+			'transaction',
746
+			'venue',
747
+			'primary_registration_details',
748
+			'primary_registration_list',
749
+			'event_author',
750
+			'email',
751
+			'messenger',
752
+		);
753
+		$contexts       = $this->get_contexts();
754
+		foreach ($contexts as $context => $details) {
755
+			$this->_valid_shortcodes[ $context ] = $all_shortcodes;
756
+			// make sure non admin context does not include the event_author shortcodes
757
+			if ($context != 'admin') {
758
+				if (($key = array_search('event_author', $this->_valid_shortcodes[ $context ])) !== false) {
759
+					unset($this->_valid_shortcodes[ $context ][ $key ]);
760
+				}
761
+			}
762
+		}
763
+		// make sure admin context does not include the recipient_details shortcodes
764
+		// IF we have admin context hooked in message types might not have that context.
765
+		if (! empty($this->_valid_shortcodes['admin'])) {
766
+			if (($key = array_search('recipient_details', $this->_valid_shortcodes['admin'])) !== false) {
767
+				unset($this->_valid_shortcodes['admin'][ $key ]);
768
+			}
769
+			// make sure admin context does not include the recipient_details shortcodes
770
+			if (($key = array_search('recipient_list', $this->_valid_shortcodes['admin'])) !== false) {
771
+				unset($this->_valid_shortcodes['admin'][ $key ]);
772
+			}
773
+		}
774
+	}
775
+
776
+
777
+	/**
778
+	 * Used by Validators to modify the valid shortcodes.
779
+	 *
780
+	 * @param  array $new_config array of valid shortcodes (by context)
781
+	 * @return void               sets valid_shortcodes property
782
+	 */
783
+	public function reset_valid_shortcodes_config($new_config)
784
+	{
785
+		foreach ($new_config as $context => $shortcodes) {
786
+			$this->_valid_shortcodes[ $context ] = $shortcodes;
787
+		}
788
+	}
789
+
790
+
791
+	/**
792
+	 * returns an array of addressee objects for event_admins
793
+	 *
794
+	 * @access protected
795
+	 * @return array array of EE_Messages_Addressee objects
796
+	 * @throws EE_Error
797
+	 * @throws InvalidArgumentException
798
+	 * @throws InvalidDataTypeException
799
+	 * @throws InvalidInterfaceException
800
+	 */
801
+	protected function _admin_addressees()
802
+	{
803
+		$admin_events = array();
804
+		$addressees   = array();
805
+		// first we need to get the event admin user id for all the events
806
+		// and setup an addressee object for each unique admin user.
807
+		foreach ($this->_data->events as $line_ref => $event) {
808
+			$admin_id = $this->_get_event_admin_id($event['ID']);
809
+			// make sure we are just including the events that belong to this admin!
810
+			$admin_events[ $admin_id ][ $line_ref ] = $event;
811
+		}
812
+		// k now we can loop through the event_admins and setup the addressee data.
813
+		foreach ($admin_events as $admin_id => $event_details) {
814
+			$aee          = array(
815
+				'user_id'        => $admin_id,
816
+				'events'         => $event_details,
817
+				'attendees'      => $this->_data->attendees,
818
+				'recipient_id'   => $admin_id,
819
+				'recipient_type' => 'WP_User',
820
+			);
821
+			$aee          = array_merge($this->_default_addressee_data, $aee);
822
+			$addressees[] = new EE_Messages_Addressee($aee);
823
+		}
824
+		return $addressees;
825
+	}
826
+
827
+
828
+	/**
829
+	 * Takes care of setting up the addressee object(s) for the primary attendee.
830
+	 *
831
+	 * @access protected
832
+	 * @return array of EE_Addressee objects
833
+	 * @throws EE_Error
834
+	 */
835
+	protected function _primary_attendee_addressees()
836
+	{
837
+		$aee                   = $this->_default_addressee_data;
838
+		$aee['events']         = $this->_data->events;
839
+		$aee['attendees']      = $this->_data->attendees;
840
+		$aee['recipient_id']   = $aee['primary_att_obj'] instanceof EE_Attendee ? $aee['primary_att_obj']->ID() : 0;
841
+		$aee['recipient_type'] = 'Attendee';
842
+		// great now we can instantiate the $addressee object and return (as an array);
843
+		$add[] = new EE_Messages_Addressee($aee);
844
+		return $add;
845
+	}
846
+
847
+
848
+	/**
849
+	 * Takes care of setting up the addressee object(s) for the registered attendees
850
+	 *
851
+	 * @access protected
852
+	 * @return array of EE_Addressee objects
853
+	 */
854
+	protected function _attendee_addressees()
855
+	{
856
+		$add = array();
857
+		// we just have to loop through the attendees.  We'll also set the attached events for each attendee.
858
+		// use to verify unique attendee emails... we don't want to sent multiple copies to the same attendee do we?
859
+		$already_processed = array();
860
+		foreach ($this->_data->attendees as $att_id => $details) {
861
+			// set the attendee array to blank on each loop;
862
+			$aee = array();
863
+			if (isset($this->_data->reg_obj)
864
+				&& ($this->_data->reg_obj->attendee_ID() != $att_id)
865
+				&& $this->_single_message
866
+			) {
867
+				continue;
868
+			}
869
+			// is $this->_regs_for_sending present?
870
+			// If so, let's make sure we ONLY generate addressee for registrations in that array.
871
+			if (! empty($this->_regs_for_sending) && is_array($this->_regs_for_sending)) {
872
+				$regs_allowed = array_intersect_key(array_flip($this->_regs_for_sending), $details['reg_objs']);
873
+				if (empty($regs_allowed)) {
874
+					continue;
875
+				}
876
+			}
877
+			if (apply_filters(
878
+				'FHEE__EE_message_type___attendee_addressees__prevent_duplicate_email_sends',
879
+				true,
880
+				$this->_data,
881
+				$this
882
+			)
883
+				&& in_array($att_id, $already_processed, true)
884
+			) {
885
+				continue;
886
+			}
887
+			$already_processed[] = $att_id;
888
+			foreach ($details as $item => $value) {
889
+				$aee[ $item ] = $value;
890
+				if ($item === 'line_ref') {
891
+					foreach ($value as $event_id) {
892
+						$aee['events'][ $event_id ] = $this->_data->events[ $event_id ];
893
+					}
894
+				}
895
+				if ($item === 'attendee_email') {
896
+					$aee['attendee_email'] = $value;
897
+				}
898
+				/*if ( $item == 'registration_id' ) {
899 899
                     $aee['attendee_registration_id'] = $value;
900 900
                 }/**/
901
-            }
902
-            // note the FIRST reg object in this array is the one
903
-            // we'll use for this attendee as the primary registration for this attendee.
904
-            $aee['reg_obj']        = reset($this->_data->attendees[ $att_id ]['reg_objs']);
905
-            $aee['attendees']      = $this->_data->attendees;
906
-            $aee['recipient_id']   = $att_id;
907
-            $aee['recipient_type'] = 'Attendee';
908
-            // merge in the primary attendee data
909
-            $aee   = array_merge($this->_default_addressee_data, $aee);
910
-            $add[] = new EE_Messages_Addressee($aee);
911
-        }
912
-        return $add;
913
-    }
914
-
915
-
916
-    /**
917
-     * @param $event_id
918
-     * @return int
919
-     * @throws EE_Error
920
-     * @throws InvalidArgumentException
921
-     * @throws InvalidDataTypeException
922
-     * @throws InvalidInterfaceException
923
-     */
924
-    protected function _get_event_admin_id($event_id)
925
-    {
926
-        $event = EEM_Event::instance()->get_one_by_ID($event_id);
927
-        return $event instanceof EE_Event ? $event->wp_user() : 0;
928
-    }
901
+			}
902
+			// note the FIRST reg object in this array is the one
903
+			// we'll use for this attendee as the primary registration for this attendee.
904
+			$aee['reg_obj']        = reset($this->_data->attendees[ $att_id ]['reg_objs']);
905
+			$aee['attendees']      = $this->_data->attendees;
906
+			$aee['recipient_id']   = $att_id;
907
+			$aee['recipient_type'] = 'Attendee';
908
+			// merge in the primary attendee data
909
+			$aee   = array_merge($this->_default_addressee_data, $aee);
910
+			$add[] = new EE_Messages_Addressee($aee);
911
+		}
912
+		return $add;
913
+	}
914
+
915
+
916
+	/**
917
+	 * @param $event_id
918
+	 * @return int
919
+	 * @throws EE_Error
920
+	 * @throws InvalidArgumentException
921
+	 * @throws InvalidDataTypeException
922
+	 * @throws InvalidInterfaceException
923
+	 */
924
+	protected function _get_event_admin_id($event_id)
925
+	{
926
+		$event = EEM_Event::instance()->get_one_by_ID($event_id);
927
+		return $event instanceof EE_Event ? $event->wp_user() : 0;
928
+	}
929 929
 }
Please login to merge, or discard this patch.
Spacing   +29 added lines, -29 removed lines patch added patch discarded remove patch
@@ -408,7 +408,7 @@  discard block
 block discarded – undo
408 408
     {
409 409
         // validate context
410 410
         // valid context?
411
-        if (! isset($this->_contexts[ $context ])) {
411
+        if ( ! isset($this->_contexts[$context])) {
412 412
             throw new EE_Error(
413 413
                 sprintf(
414 414
                     __('The context %s is not a valid context for %s.', 'event_espresso'),
@@ -464,7 +464,7 @@  discard block
 block discarded – undo
464 464
     public function get_data_for_context($context, EE_Registration $registration, $id = 0)
465 465
     {
466 466
         // valid context?
467
-        if (! isset($this->_contexts[ $context ])) {
467
+        if ( ! isset($this->_contexts[$context])) {
468 468
             throw new EE_Error(
469 469
                 sprintf(
470 470
                     __('The context %s is not a valid context for %s.', 'event_espresso'),
@@ -479,7 +479,7 @@  discard block
 block discarded – undo
479 479
             $this->_get_data_for_context($context, $registration, $id),
480 480
             $this
481 481
         );
482
-        $data = apply_filters('FHEE__' . get_class($this) . '__get_data_for_context__data', $data, $this);
482
+        $data = apply_filters('FHEE__'.get_class($this).'__get_data_for_context__data', $data, $this);
483 483
         // if empty then something went wrong!
484 484
         if (empty($data)) {
485 485
             throw new EE_Error(
@@ -539,7 +539,7 @@  discard block
 block discarded – undo
539 539
     public function with_messengers()
540 540
     {
541 541
         return apply_filters(
542
-            'FHEE__EE_message_type__get_with_messengers__with_messengers__' . get_class($this),
542
+            'FHEE__EE_message_type__get_with_messengers__with_messengers__'.get_class($this),
543 543
             $this->_with_messengers
544 544
         );
545 545
     }
@@ -600,7 +600,7 @@  discard block
 block discarded – undo
600 600
     {
601 601
         // first class specific filter then filter that by the global filter.
602 602
         $master_templates = apply_filters(
603
-            'FHEE__' . get_class($this) . '__get_master_templates',
603
+            'FHEE__'.get_class($this).'__get_master_templates',
604 604
             $this->_master_templates
605 605
         );
606 606
         return apply_filters('FHEE__EE_message_type__get_master_templates', $master_templates, $this);
@@ -624,11 +624,11 @@  discard block
 block discarded – undo
624 624
         $addressees        = array();
625 625
         $original_contexts = $this->_contexts;
626 626
         // if incoming context then limit to that context
627
-        if (! empty($context)) {
628
-            $cntxt = ! empty($this->_contexts[ $context ]) ? $this->_contexts[ $context ] : '';
629
-            if (! empty($cntxt)) {
630
-                $this->_contexts           = array();
631
-                $this->_contexts[ $context ] = $cntxt;
627
+        if ( ! empty($context)) {
628
+            $cntxt = ! empty($this->_contexts[$context]) ? $this->_contexts[$context] : '';
629
+            if ( ! empty($cntxt)) {
630
+                $this->_contexts = array();
631
+                $this->_contexts[$context] = $cntxt;
632 632
             }
633 633
         }
634 634
         $this->_set_default_addressee_data();
@@ -653,13 +653,13 @@  discard block
 block discarded – undo
653 653
     {
654 654
         // at a minimum, we NEED EE_Attendee objects.
655 655
         if (empty($this->_data->attendees)) {
656
-            return false;  // there's no data to process!
656
+            return false; // there's no data to process!
657 657
         }
658 658
         // process addressees for each context.  Child classes will have to have methods for
659 659
         // each context defined to handle the processing of the data object within them
660 660
         foreach ($this->_contexts as $context => $details) {
661
-            $xpctd_method = '_' . $context . '_addressees';
662
-            if (! method_exists($this, $xpctd_method)) {
661
+            $xpctd_method = '_'.$context.'_addressees';
662
+            if ( ! method_exists($this, $xpctd_method)) {
663 663
                 throw new EE_Error(
664 664
                     sprintf(
665 665
                         __(
@@ -671,7 +671,7 @@  discard block
 block discarded – undo
671 671
                     )
672 672
                 );
673 673
             }
674
-            $this->_addressees[ $context ] = call_user_func(array($this, $xpctd_method));
674
+            $this->_addressees[$context] = call_user_func(array($this, $xpctd_method));
675 675
         }
676 676
         return true; // data was processed successfully.
677 677
     }
@@ -707,7 +707,7 @@  discard block
 block discarded – undo
707 707
             'total_ticket_count'       => $this->_data->total_ticket_count,
708 708
         );
709 709
         if (is_array($this->_data->primary_attendee_data)) {
710
-            $this->_default_addressee_data                    = array_merge(
710
+            $this->_default_addressee_data = array_merge(
711 711
                 $this->_default_addressee_data,
712 712
                 $this->_data->primary_attendee_data
713 713
             );
@@ -750,25 +750,25 @@  discard block
 block discarded – undo
750 750
             'email',
751 751
             'messenger',
752 752
         );
753
-        $contexts       = $this->get_contexts();
753
+        $contexts = $this->get_contexts();
754 754
         foreach ($contexts as $context => $details) {
755
-            $this->_valid_shortcodes[ $context ] = $all_shortcodes;
755
+            $this->_valid_shortcodes[$context] = $all_shortcodes;
756 756
             // make sure non admin context does not include the event_author shortcodes
757 757
             if ($context != 'admin') {
758
-                if (($key = array_search('event_author', $this->_valid_shortcodes[ $context ])) !== false) {
759
-                    unset($this->_valid_shortcodes[ $context ][ $key ]);
758
+                if (($key = array_search('event_author', $this->_valid_shortcodes[$context])) !== false) {
759
+                    unset($this->_valid_shortcodes[$context][$key]);
760 760
                 }
761 761
             }
762 762
         }
763 763
         // make sure admin context does not include the recipient_details shortcodes
764 764
         // IF we have admin context hooked in message types might not have that context.
765
-        if (! empty($this->_valid_shortcodes['admin'])) {
765
+        if ( ! empty($this->_valid_shortcodes['admin'])) {
766 766
             if (($key = array_search('recipient_details', $this->_valid_shortcodes['admin'])) !== false) {
767
-                unset($this->_valid_shortcodes['admin'][ $key ]);
767
+                unset($this->_valid_shortcodes['admin'][$key]);
768 768
             }
769 769
             // make sure admin context does not include the recipient_details shortcodes
770 770
             if (($key = array_search('recipient_list', $this->_valid_shortcodes['admin'])) !== false) {
771
-                unset($this->_valid_shortcodes['admin'][ $key ]);
771
+                unset($this->_valid_shortcodes['admin'][$key]);
772 772
             }
773 773
         }
774 774
     }
@@ -783,7 +783,7 @@  discard block
 block discarded – undo
783 783
     public function reset_valid_shortcodes_config($new_config)
784 784
     {
785 785
         foreach ($new_config as $context => $shortcodes) {
786
-            $this->_valid_shortcodes[ $context ] = $shortcodes;
786
+            $this->_valid_shortcodes[$context] = $shortcodes;
787 787
         }
788 788
     }
789 789
 
@@ -807,11 +807,11 @@  discard block
 block discarded – undo
807 807
         foreach ($this->_data->events as $line_ref => $event) {
808 808
             $admin_id = $this->_get_event_admin_id($event['ID']);
809 809
             // make sure we are just including the events that belong to this admin!
810
-            $admin_events[ $admin_id ][ $line_ref ] = $event;
810
+            $admin_events[$admin_id][$line_ref] = $event;
811 811
         }
812 812
         // k now we can loop through the event_admins and setup the addressee data.
813 813
         foreach ($admin_events as $admin_id => $event_details) {
814
-            $aee          = array(
814
+            $aee = array(
815 815
                 'user_id'        => $admin_id,
816 816
                 'events'         => $event_details,
817 817
                 'attendees'      => $this->_data->attendees,
@@ -868,7 +868,7 @@  discard block
 block discarded – undo
868 868
             }
869 869
             // is $this->_regs_for_sending present?
870 870
             // If so, let's make sure we ONLY generate addressee for registrations in that array.
871
-            if (! empty($this->_regs_for_sending) && is_array($this->_regs_for_sending)) {
871
+            if ( ! empty($this->_regs_for_sending) && is_array($this->_regs_for_sending)) {
872 872
                 $regs_allowed = array_intersect_key(array_flip($this->_regs_for_sending), $details['reg_objs']);
873 873
                 if (empty($regs_allowed)) {
874 874
                     continue;
@@ -886,10 +886,10 @@  discard block
 block discarded – undo
886 886
             }
887 887
             $already_processed[] = $att_id;
888 888
             foreach ($details as $item => $value) {
889
-                $aee[ $item ] = $value;
889
+                $aee[$item] = $value;
890 890
                 if ($item === 'line_ref') {
891 891
                     foreach ($value as $event_id) {
892
-                        $aee['events'][ $event_id ] = $this->_data->events[ $event_id ];
892
+                        $aee['events'][$event_id] = $this->_data->events[$event_id];
893 893
                     }
894 894
                 }
895 895
                 if ($item === 'attendee_email') {
@@ -901,7 +901,7 @@  discard block
 block discarded – undo
901 901
             }
902 902
             // note the FIRST reg object in this array is the one
903 903
             // we'll use for this attendee as the primary registration for this attendee.
904
-            $aee['reg_obj']        = reset($this->_data->attendees[ $att_id ]['reg_objs']);
904
+            $aee['reg_obj']        = reset($this->_data->attendees[$att_id]['reg_objs']);
905 905
             $aee['attendees']      = $this->_data->attendees;
906 906
             $aee['recipient_id']   = $att_id;
907 907
             $aee['recipient_type'] = 'Attendee';
Please login to merge, or discard this patch.