Completed
Branch fix-dummy-related-question-qst... (e5efcf)
by
unknown
07:49 queued 03:45
created
modules/ticket_selector_caff/EED_Ticket_Selector_Caff.module.php 2 patches
Spacing   +3 added lines, -3 removed lines patch added patch discarded remove patch
@@ -52,7 +52,7 @@  discard block
 block discarded – undo
52 52
     {
53 53
         define(
54 54
             'TICKET_SELECTOR_CAFF_TEMPLATES_PATH',
55
-            str_replace('\\', '/', plugin_dir_path(__FILE__)) . 'templates/'
55
+            str_replace('\\', '/', plugin_dir_path(__FILE__)).'templates/'
56 56
         );
57 57
         add_action(
58 58
             'AHEE__template_settings__template__before_settings_form',
@@ -107,7 +107,7 @@  discard block
 block discarded – undo
107 107
                     'FHEE__EED_Ticket_Selector_Caff___ticket_selector_settings_form__form_subsections',
108 108
                     array(
109 109
                         'appearance_settings_hdr' => new EE_Form_Section_HTML(
110
-                            EEH_HTML::br(2) .
110
+                            EEH_HTML::br(2).
111 111
                             EEH_HTML::h2(esc_html__('Ticket Selector Template Settings', 'event_espresso'))
112 112
                         ),
113 113
                         'appearance_settings'     => EED_Ticket_Selector_Caff::_ticket_selector_appearance_settings(),
@@ -273,7 +273,7 @@  discard block
 block discarded – undo
273 273
      */
274 274
     public static function update_template_settings(EE_Template_Config $CFG, $REQ)
275 275
     {
276
-        if (! $CFG->EED_Ticket_Selector instanceof EE_Ticket_Selector_Config) {
276
+        if ( ! $CFG->EED_Ticket_Selector instanceof EE_Ticket_Selector_Config) {
277 277
             EED_Ticket_Selector::instance()->set_config();
278 278
             $CFG->EED_Ticket_Selector = EED_Ticket_Selector::instance()->config();
279 279
         }
Please login to merge, or discard this patch.
Indentation   +294 added lines, -294 removed lines patch added patch discarded remove patch
@@ -15,319 +15,319 @@
 block discarded – undo
15 15
  */
16 16
 class EED_Ticket_Selector_Caff extends EED_Ticket_Selector
17 17
 {
18
-    /**
19
-     * @return EED_Module|EED_Ticket_Selector_Caff
20
-     */
21
-    public static function instance()
22
-    {
23
-        return parent::get_instance(__CLASS__);
24
-    }
18
+	/**
19
+	 * @return EED_Module|EED_Ticket_Selector_Caff
20
+	 */
21
+	public static function instance()
22
+	{
23
+		return parent::get_instance(__CLASS__);
24
+	}
25 25
 
26 26
 
27
-    /**
28
-     *    set_hooks - for hooking into EE Core, other modules, etc
29
-     *
30
-     * @access    public
31
-     * @return    void
32
-     */
33
-    public static function set_hooks()
34
-    {
35
-        add_action(
36
-            'AHEE__ticket_selector_chart_template__ticket_details__after_description',
37
-            array('EED_Ticket_Selector_Caff', 'ticket_price_details'),
38
-            10,
39
-            3
40
-        );
41
-    }
27
+	/**
28
+	 *    set_hooks - for hooking into EE Core, other modules, etc
29
+	 *
30
+	 * @access    public
31
+	 * @return    void
32
+	 */
33
+	public static function set_hooks()
34
+	{
35
+		add_action(
36
+			'AHEE__ticket_selector_chart_template__ticket_details__after_description',
37
+			array('EED_Ticket_Selector_Caff', 'ticket_price_details'),
38
+			10,
39
+			3
40
+		);
41
+	}
42 42
 
43
-    /**
44
-     *    set_hooks_admin - for hooking into EE Admin Core, other modules, etc
45
-     *
46
-     * @access    public
47
-     * @return    void
48
-     */
49
-    public static function set_hooks_admin()
50
-    {
51
-        define(
52
-            'TICKET_SELECTOR_CAFF_TEMPLATES_PATH',
53
-            str_replace('\\', '/', plugin_dir_path(__FILE__)) . 'templates/'
54
-        );
55
-        add_action(
56
-            'AHEE__template_settings__template__before_settings_form',
57
-            array('EED_Ticket_Selector_Caff', 'template_settings_form'),
58
-            10
59
-        );
60
-        add_filter(
61
-            'FHEE__General_Settings_Admin_Page__update_template_settings__data',
62
-            array('EED_Ticket_Selector_Caff', 'update_template_settings'),
63
-            10,
64
-            2
65
-        );
66
-    }
43
+	/**
44
+	 *    set_hooks_admin - for hooking into EE Admin Core, other modules, etc
45
+	 *
46
+	 * @access    public
47
+	 * @return    void
48
+	 */
49
+	public static function set_hooks_admin()
50
+	{
51
+		define(
52
+			'TICKET_SELECTOR_CAFF_TEMPLATES_PATH',
53
+			str_replace('\\', '/', plugin_dir_path(__FILE__)) . 'templates/'
54
+		);
55
+		add_action(
56
+			'AHEE__template_settings__template__before_settings_form',
57
+			array('EED_Ticket_Selector_Caff', 'template_settings_form'),
58
+			10
59
+		);
60
+		add_filter(
61
+			'FHEE__General_Settings_Admin_Page__update_template_settings__data',
62
+			array('EED_Ticket_Selector_Caff', 'update_template_settings'),
63
+			10,
64
+			2
65
+		);
66
+	}
67 67
 
68 68
 
69
-    /**
70
-     * @param \WP $WP
71
-     */
72
-    public function run($WP)
73
-    {
74
-        $this->set_config();
75
-    }
69
+	/**
70
+	 * @param \WP $WP
71
+	 */
72
+	public function run($WP)
73
+	{
74
+		$this->set_config();
75
+	}
76 76
 
77 77
 
78
-    /**
79
-     * @static
80
-     * @return void
81
-     * @throws EE_Error
82
-     * @throws InvalidArgumentException
83
-     * @throws InvalidDataTypeException
84
-     * @throws InvalidInterfaceException
85
-     */
86
-    public static function template_settings_form()
87
-    {
88
-        echo EED_Ticket_Selector_Caff::_ticket_selector_settings_form()->get_html();
89
-    }
78
+	/**
79
+	 * @static
80
+	 * @return void
81
+	 * @throws EE_Error
82
+	 * @throws InvalidArgumentException
83
+	 * @throws InvalidDataTypeException
84
+	 * @throws InvalidInterfaceException
85
+	 */
86
+	public static function template_settings_form()
87
+	{
88
+		echo EED_Ticket_Selector_Caff::_ticket_selector_settings_form()->get_html();
89
+	}
90 90
 
91 91
 
92
-    /**
93
-     * @return \EE_Form_Section_Proper
94
-     * @throws \EE_Error
95
-     */
96
-    public static function _ticket_selector_settings_form()
97
-    {
92
+	/**
93
+	 * @return \EE_Form_Section_Proper
94
+	 * @throws \EE_Error
95
+	 */
96
+	public static function _ticket_selector_settings_form()
97
+	{
98 98
 
99
-        return new EE_Form_Section_Proper(
100
-            array(
101
-                'name'            => 'ticket_selector_settings_form',
102
-                'html_id'         => 'ticket_selector_settings_form',
103
-                'layout_strategy' => new EE_Div_Per_Section_Layout(),
104
-                'subsections'     => apply_filters(
105
-                    'FHEE__EED_Ticket_Selector_Caff___ticket_selector_settings_form__form_subsections',
106
-                    array(
107
-                        'appearance_settings_hdr' => new EE_Form_Section_HTML(
108
-                            EEH_HTML::br(2) .
109
-                            EEH_HTML::h2(esc_html__('Ticket Selector Template Settings', 'event_espresso'))
110
-                        ),
111
-                        'appearance_settings'     => EED_Ticket_Selector_Caff::_ticket_selector_appearance_settings(),
112
-                    )
113
-                ),
114
-            )
115
-        );
116
-    }
99
+		return new EE_Form_Section_Proper(
100
+			array(
101
+				'name'            => 'ticket_selector_settings_form',
102
+				'html_id'         => 'ticket_selector_settings_form',
103
+				'layout_strategy' => new EE_Div_Per_Section_Layout(),
104
+				'subsections'     => apply_filters(
105
+					'FHEE__EED_Ticket_Selector_Caff___ticket_selector_settings_form__form_subsections',
106
+					array(
107
+						'appearance_settings_hdr' => new EE_Form_Section_HTML(
108
+							EEH_HTML::br(2) .
109
+							EEH_HTML::h2(esc_html__('Ticket Selector Template Settings', 'event_espresso'))
110
+						),
111
+						'appearance_settings'     => EED_Ticket_Selector_Caff::_ticket_selector_appearance_settings(),
112
+					)
113
+				),
114
+			)
115
+		);
116
+	}
117 117
 
118 118
 
119
-    /**
120
-     * @return \EE_Form_Section_Proper
121
-     * @throws \EE_Error
122
-     */
123
-    public static function _ticket_selector_appearance_settings()
124
-    {
125
-        if (
126
-            ! EE_Registry::instance()->CFG->template_settings->EED_Ticket_Selector instanceof EE_Ticket_Selector_Config
127
-        ) {
128
-            EED_Ticket_Selector::instance()->set_config();
129
-            EE_Registry::instance()->CFG->template_settings->EED_Ticket_Selector = EED_Ticket_Selector::instance()
130
-                                                                                                      ->config();
131
-        }
132
-        $EE_Ticket_Selector_Config = EE_Registry::instance()->CFG->template_settings->EED_Ticket_Selector;
133
-        // get option for whether to show datetime selector in TS
134
-        $show_datetime_selector = $EE_Ticket_Selector_Config->getShowDatetimeSelector();
135
-        // and option for how may datetimes must exist if display is conditional
136
-        $datetime_selector_threshold = $EE_Ticket_Selector_Config->getDatetimeSelectorThreshold();
119
+	/**
120
+	 * @return \EE_Form_Section_Proper
121
+	 * @throws \EE_Error
122
+	 */
123
+	public static function _ticket_selector_appearance_settings()
124
+	{
125
+		if (
126
+			! EE_Registry::instance()->CFG->template_settings->EED_Ticket_Selector instanceof EE_Ticket_Selector_Config
127
+		) {
128
+			EED_Ticket_Selector::instance()->set_config();
129
+			EE_Registry::instance()->CFG->template_settings->EED_Ticket_Selector = EED_Ticket_Selector::instance()
130
+																									  ->config();
131
+		}
132
+		$EE_Ticket_Selector_Config = EE_Registry::instance()->CFG->template_settings->EED_Ticket_Selector;
133
+		// get option for whether to show datetime selector in TS
134
+		$show_datetime_selector = $EE_Ticket_Selector_Config->getShowDatetimeSelector();
135
+		// and option for how may datetimes must exist if display is conditional
136
+		$datetime_selector_threshold = $EE_Ticket_Selector_Config->getDatetimeSelectorThreshold();
137 137
 
138
-        return new EE_Form_Section_Proper(
139
-            array(
140
-                'name'            => 'ticket_selector_settings_tbl',
141
-                'html_id'         => 'ticket_selector_settings_tbl',
142
-                'html_class'      => 'form-table',
143
-                'layout_strategy' => new EE_Admin_Two_Column_Layout(),
144
-                'subsections'     => apply_filters(
145
-                    'FHEE__EED_Ticket_Selector_Caff___ticket_selector_appearance_settings__form_subsections',
146
-                    array(
147
-                        'show_ticket_details'         => new EE_Yes_No_Input(
148
-                            array(
149
-                                'html_label_text'         => esc_html__(
150
-                                    'Show Ticket Details?',
151
-                                    'event_espresso'
152
-                                ),
153
-                                'html_help_text'          => esc_html__(
154
-                                    'This lets you choose whether the extra ticket details section is displayed with the ticket selector.',
155
-                                    'event_espresso'
156
-                                ),
157
-                                'default'                 => isset($EE_Ticket_Selector_Config->show_ticket_details)
158
-                                    ? $EE_Ticket_Selector_Config->show_ticket_details
159
-                                    : true,
160
-                                'display_html_label_text' => false,
161
-                            )
162
-                        ),
163
-                        'show_ticket_sale_columns'    => new EE_Yes_No_Input(
164
-                            array(
165
-                                'html_label_text'         => esc_html__(
166
-                                    'Show Ticket Sale Info?',
167
-                                    'event_espresso'
168
-                                ),
169
-                                'html_help_text'          => esc_html__(
170
-                                    'This lets you indicate whether information about ticket sales is shown with ticket details in the ticket selector.',
171
-                                    'event_espresso'
172
-                                ),
173
-                                'default'                 => isset($EE_Ticket_Selector_Config->show_ticket_sale_columns)
174
-                                    ? $EE_Ticket_Selector_Config->show_ticket_sale_columns
175
-                                    : true,
176
-                                'display_html_label_text' => false,
177
-                            )
178
-                        ),
179
-                        'show_expired_tickets'        => new EE_Yes_No_Input(
180
-                            array(
181
-                                'html_label_text'         => esc_html__(
182
-                                    'Show Expired Tickets?',
183
-                                    'event_espresso'
184
-                                ),
185
-                                'html_help_text'          => esc_html__(
186
-                                    'Indicate whether to show expired tickets in the ticket selector',
187
-                                    'event_espresso'
188
-                                ),
189
-                                'default'                 => isset($EE_Ticket_Selector_Config->show_expired_tickets)
190
-                                    ? $EE_Ticket_Selector_Config->show_expired_tickets
191
-                                    : true,
192
-                                'display_html_label_text' => false,
193
-                            )
194
-                        ),
195
-                        'show_datetime_selector'      => new EE_Select_Input(
196
-                            $EE_Ticket_Selector_Config->getShowDatetimeSelectorOptions(false),
197
-                            array(
198
-                                'html_label_text'         => esc_html__(
199
-                                    'Show Date & Time Filter?',
200
-                                    'event_espresso'
201
-                                ),
202
-                                'html_help_text'          => sprintf(
203
-                                    esc_html__(
204
-                                        'Indicates whether or not to display a dropdown select box above each ticket selector that displays dates and times for the available tickets. Ticket options can be unselected, which removes (hides) them from the list of tickets being displayed.%1$sOptions include:%1$s • %2$sdo not show date & time filter%3$s%1$s   this option will NEVER display a date filter, regardless of how many dates exist.%1$s • %2$smaybe show date & time filter%3$s%1$s   this option will conditionally display the date filter when the number of dates for the event matches the value set for "Date Filter Threshold".',
205
-                                        'event_espresso'
206
-                                    ),
207
-                                    '<br>',
208
-                                    '<strong>',
209
-                                    '</strong>'
210
-                                ),
211
-                                'default'                 => ! empty($show_datetime_selector)
212
-                                    ? $show_datetime_selector
213
-                                    : EE_Ticket_Selector_Config::DO_NOT_SHOW_DATETIME_SELECTOR,
214
-                                'display_html_label_text' => false,
215
-                            )
216
-                        ),
217
-                        'datetime_selector_threshold' => new EE_Select_Input(
218
-                            array_combine($r = range(1, 10), $r),
219
-                            array(
220
-                                'html_label_text'         => esc_html__(
221
-                                    'Date & Time Filter Threshold',
222
-                                    'event_espresso'
223
-                                ),
224
-                                'html_help_text'          => esc_html__(
225
-                                    'The number of unique dates an event has to have before conditionally displaying a date & time filter',
226
-                                    'event_espresso'
227
-                                ),
228
-                                'default'                 => ! empty($datetime_selector_threshold)
229
-                                    ? $datetime_selector_threshold
230
-                                    : 3,
231
-                                'display_html_label_text' => false,
232
-                            )
233
-                        ),
234
-                        'datetime_selector_max_checked' => new EE_Integer_Input(
235
-                            array(
236
-                                'html_label_text'         => esc_html__(
237
-                                    'Date & Time Filter Max Checked',
238
-                                    'event_espresso'
239
-                                ),
240
-                                'html_help_text'          => sprintf(
241
-                                    esc_html__(
242
-                                        'Determines the maximum number of dates that will be checked upon initial loading for a Date and Time Filter.%1$sIf set to zero or left blank, then ALL dates will be checked upon initial loading.',
243
-                                        'event_espresso'
244
-                                    ),
245
-                                    '<br>'
246
-                                ),
247
-                                'default'                 => $EE_Ticket_Selector_Config->getDatetimeSelectorMaxChecked(),
248
-                                'display_html_label_text' => false,
249
-                                'min_value'               => 0,
250
-                            )
251
-                        ),
252
-                    )
253
-                ),
254
-            )
255
-        );
256
-    }
138
+		return new EE_Form_Section_Proper(
139
+			array(
140
+				'name'            => 'ticket_selector_settings_tbl',
141
+				'html_id'         => 'ticket_selector_settings_tbl',
142
+				'html_class'      => 'form-table',
143
+				'layout_strategy' => new EE_Admin_Two_Column_Layout(),
144
+				'subsections'     => apply_filters(
145
+					'FHEE__EED_Ticket_Selector_Caff___ticket_selector_appearance_settings__form_subsections',
146
+					array(
147
+						'show_ticket_details'         => new EE_Yes_No_Input(
148
+							array(
149
+								'html_label_text'         => esc_html__(
150
+									'Show Ticket Details?',
151
+									'event_espresso'
152
+								),
153
+								'html_help_text'          => esc_html__(
154
+									'This lets you choose whether the extra ticket details section is displayed with the ticket selector.',
155
+									'event_espresso'
156
+								),
157
+								'default'                 => isset($EE_Ticket_Selector_Config->show_ticket_details)
158
+									? $EE_Ticket_Selector_Config->show_ticket_details
159
+									: true,
160
+								'display_html_label_text' => false,
161
+							)
162
+						),
163
+						'show_ticket_sale_columns'    => new EE_Yes_No_Input(
164
+							array(
165
+								'html_label_text'         => esc_html__(
166
+									'Show Ticket Sale Info?',
167
+									'event_espresso'
168
+								),
169
+								'html_help_text'          => esc_html__(
170
+									'This lets you indicate whether information about ticket sales is shown with ticket details in the ticket selector.',
171
+									'event_espresso'
172
+								),
173
+								'default'                 => isset($EE_Ticket_Selector_Config->show_ticket_sale_columns)
174
+									? $EE_Ticket_Selector_Config->show_ticket_sale_columns
175
+									: true,
176
+								'display_html_label_text' => false,
177
+							)
178
+						),
179
+						'show_expired_tickets'        => new EE_Yes_No_Input(
180
+							array(
181
+								'html_label_text'         => esc_html__(
182
+									'Show Expired Tickets?',
183
+									'event_espresso'
184
+								),
185
+								'html_help_text'          => esc_html__(
186
+									'Indicate whether to show expired tickets in the ticket selector',
187
+									'event_espresso'
188
+								),
189
+								'default'                 => isset($EE_Ticket_Selector_Config->show_expired_tickets)
190
+									? $EE_Ticket_Selector_Config->show_expired_tickets
191
+									: true,
192
+								'display_html_label_text' => false,
193
+							)
194
+						),
195
+						'show_datetime_selector'      => new EE_Select_Input(
196
+							$EE_Ticket_Selector_Config->getShowDatetimeSelectorOptions(false),
197
+							array(
198
+								'html_label_text'         => esc_html__(
199
+									'Show Date & Time Filter?',
200
+									'event_espresso'
201
+								),
202
+								'html_help_text'          => sprintf(
203
+									esc_html__(
204
+										'Indicates whether or not to display a dropdown select box above each ticket selector that displays dates and times for the available tickets. Ticket options can be unselected, which removes (hides) them from the list of tickets being displayed.%1$sOptions include:%1$s &bull; %2$sdo not show date & time filter%3$s%1$s &nbsp; this option will NEVER display a date filter, regardless of how many dates exist.%1$s &bull; %2$smaybe show date & time filter%3$s%1$s &nbsp; this option will conditionally display the date filter when the number of dates for the event matches the value set for "Date Filter Threshold".',
205
+										'event_espresso'
206
+									),
207
+									'<br>',
208
+									'<strong>',
209
+									'</strong>'
210
+								),
211
+								'default'                 => ! empty($show_datetime_selector)
212
+									? $show_datetime_selector
213
+									: EE_Ticket_Selector_Config::DO_NOT_SHOW_DATETIME_SELECTOR,
214
+								'display_html_label_text' => false,
215
+							)
216
+						),
217
+						'datetime_selector_threshold' => new EE_Select_Input(
218
+							array_combine($r = range(1, 10), $r),
219
+							array(
220
+								'html_label_text'         => esc_html__(
221
+									'Date & Time Filter Threshold',
222
+									'event_espresso'
223
+								),
224
+								'html_help_text'          => esc_html__(
225
+									'The number of unique dates an event has to have before conditionally displaying a date & time filter',
226
+									'event_espresso'
227
+								),
228
+								'default'                 => ! empty($datetime_selector_threshold)
229
+									? $datetime_selector_threshold
230
+									: 3,
231
+								'display_html_label_text' => false,
232
+							)
233
+						),
234
+						'datetime_selector_max_checked' => new EE_Integer_Input(
235
+							array(
236
+								'html_label_text'         => esc_html__(
237
+									'Date & Time Filter Max Checked',
238
+									'event_espresso'
239
+								),
240
+								'html_help_text'          => sprintf(
241
+									esc_html__(
242
+										'Determines the maximum number of dates that will be checked upon initial loading for a Date and Time Filter.%1$sIf set to zero or left blank, then ALL dates will be checked upon initial loading.',
243
+										'event_espresso'
244
+									),
245
+									'<br>'
246
+								),
247
+								'default'                 => $EE_Ticket_Selector_Config->getDatetimeSelectorMaxChecked(),
248
+								'display_html_label_text' => false,
249
+								'min_value'               => 0,
250
+							)
251
+						),
252
+					)
253
+				),
254
+			)
255
+		);
256
+	}
257 257
 
258 258
 
259
-    /**
260
-     * callback for updating template settings
261
-     *
262
-     * @since 4.6.18.rc.006
263
-     * @param EE_Template_Config $CFG
264
-     * @param array              $REQ incoming request
265
-     * @return EE_Template_Config
266
-     * @throws EE_Error
267
-     * @throws InvalidArgumentException
268
-     * @throws ReflectionException
269
-     * @throws InvalidDataTypeException
270
-     * @throws InvalidInterfaceException
271
-     */
272
-    public static function update_template_settings(EE_Template_Config $CFG, $REQ)
273
-    {
274
-        if (! $CFG->EED_Ticket_Selector instanceof EE_Ticket_Selector_Config) {
275
-            EED_Ticket_Selector::instance()->set_config();
276
-            $CFG->EED_Ticket_Selector = EED_Ticket_Selector::instance()->config();
277
-        }
278
-        try {
279
-            $ticket_selector_form = EED_Ticket_Selector_Caff::_ticket_selector_settings_form();
259
+	/**
260
+	 * callback for updating template settings
261
+	 *
262
+	 * @since 4.6.18.rc.006
263
+	 * @param EE_Template_Config $CFG
264
+	 * @param array              $REQ incoming request
265
+	 * @return EE_Template_Config
266
+	 * @throws EE_Error
267
+	 * @throws InvalidArgumentException
268
+	 * @throws ReflectionException
269
+	 * @throws InvalidDataTypeException
270
+	 * @throws InvalidInterfaceException
271
+	 */
272
+	public static function update_template_settings(EE_Template_Config $CFG, $REQ)
273
+	{
274
+		if (! $CFG->EED_Ticket_Selector instanceof EE_Ticket_Selector_Config) {
275
+			EED_Ticket_Selector::instance()->set_config();
276
+			$CFG->EED_Ticket_Selector = EED_Ticket_Selector::instance()->config();
277
+		}
278
+		try {
279
+			$ticket_selector_form = EED_Ticket_Selector_Caff::_ticket_selector_settings_form();
280 280
 
281
-            // check for form submission
282
-            if ($ticket_selector_form->was_submitted()) {
283
-                // capture form data
284
-                $ticket_selector_form->receive_form_submission();
281
+			// check for form submission
282
+			if ($ticket_selector_form->was_submitted()) {
283
+				// capture form data
284
+				$ticket_selector_form->receive_form_submission();
285 285
 
286
-                // validate form data
287
-                if ($ticket_selector_form->is_valid()) {
288
-                    // grab validated data from form
289
-                    $valid_data = $ticket_selector_form->valid_data();
286
+				// validate form data
287
+				if ($ticket_selector_form->is_valid()) {
288
+					// grab validated data from form
289
+					$valid_data = $ticket_selector_form->valid_data();
290 290
 
291
-                    // set data on config
292
-                    $CFG->EED_Ticket_Selector->show_ticket_sale_columns = $valid_data['appearance_settings']['show_ticket_sale_columns'];
293
-                    $CFG->EED_Ticket_Selector->show_ticket_details = $valid_data['appearance_settings']['show_ticket_details'];
294
-                    $CFG->EED_Ticket_Selector->show_expired_tickets = $valid_data['appearance_settings']['show_expired_tickets'];
295
-                    $CFG->EED_Ticket_Selector->setShowDatetimeSelector(
296
-                        $valid_data['appearance_settings']['show_datetime_selector']
297
-                    );
298
-                    $CFG->EED_Ticket_Selector->setDatetimeSelectorThreshold(
299
-                        $valid_data['appearance_settings']['datetime_selector_threshold']
300
-                    );
301
-                    $CFG->EED_Ticket_Selector->setDatetimeSelectorMaxChecked(
302
-                        $valid_data['appearance_settings']['datetime_selector_max_checked']
303
-                    );
304
-                } else {
305
-                    if ($ticket_selector_form->submission_error_message() !== '') {
306
-                        EE_Error::add_error(
307
-                            $ticket_selector_form->submission_error_message(),
308
-                            __FILE__,
309
-                            __FUNCTION__,
310
-                            __LINE__
311
-                        );
312
-                    }
313
-                }
314
-            }
315
-        } catch (EE_Error $e) {
316
-            $e->get_error();
317
-        }
291
+					// set data on config
292
+					$CFG->EED_Ticket_Selector->show_ticket_sale_columns = $valid_data['appearance_settings']['show_ticket_sale_columns'];
293
+					$CFG->EED_Ticket_Selector->show_ticket_details = $valid_data['appearance_settings']['show_ticket_details'];
294
+					$CFG->EED_Ticket_Selector->show_expired_tickets = $valid_data['appearance_settings']['show_expired_tickets'];
295
+					$CFG->EED_Ticket_Selector->setShowDatetimeSelector(
296
+						$valid_data['appearance_settings']['show_datetime_selector']
297
+					);
298
+					$CFG->EED_Ticket_Selector->setDatetimeSelectorThreshold(
299
+						$valid_data['appearance_settings']['datetime_selector_threshold']
300
+					);
301
+					$CFG->EED_Ticket_Selector->setDatetimeSelectorMaxChecked(
302
+						$valid_data['appearance_settings']['datetime_selector_max_checked']
303
+					);
304
+				} else {
305
+					if ($ticket_selector_form->submission_error_message() !== '') {
306
+						EE_Error::add_error(
307
+							$ticket_selector_form->submission_error_message(),
308
+							__FILE__,
309
+							__FUNCTION__,
310
+							__LINE__
311
+						);
312
+					}
313
+				}
314
+			}
315
+		} catch (EE_Error $e) {
316
+			$e->get_error();
317
+		}
318 318
 
319
-        return $CFG;
320
-    }
319
+		return $CFG;
320
+	}
321 321
 
322 322
 
323
-    /**
324
-     * @param \EE_Ticket $ticket
325
-     * @param int        $ticket_price
326
-     * @param bool       $display_ticket_price
327
-     */
328
-    public static function ticket_price_details(EE_Ticket $ticket, $ticket_price = 0, $display_ticket_price = false)
329
-    {
330
-        require str_replace('\\', '/', plugin_dir_path(__FILE__))
331
-                . 'templates/ticket_selector_price_details.template.php';
332
-    }
323
+	/**
324
+	 * @param \EE_Ticket $ticket
325
+	 * @param int        $ticket_price
326
+	 * @param bool       $display_ticket_price
327
+	 */
328
+	public static function ticket_price_details(EE_Ticket $ticket, $ticket_price = 0, $display_ticket_price = false)
329
+	{
330
+		require str_replace('\\', '/', plugin_dir_path(__FILE__))
331
+				. 'templates/ticket_selector_price_details.template.php';
332
+	}
333 333
 }
Please login to merge, or discard this patch.
libraries/line_item_display/EE_SPCO_Line_Item_Display_Strategy.strategy.php 2 patches
Spacing   +19 added lines, -19 removed lines patch added patch discarded remove patch
@@ -84,7 +84,7 @@  discard block
 block discarded – undo
84 84
         $html = '';
85 85
         // set some default options and merge with incoming
86 86
         $default_options = array(
87
-            'show_desc' => true,  //    true        false
87
+            'show_desc' => true, //    true        false
88 88
             'odd'       => false,
89 89
         );
90 90
         $options = array_merge($default_options, (array) $options);
@@ -119,7 +119,7 @@  discard block
 block discarded – undo
119 119
                 $text = esc_html__('Sub-Total', 'event_espresso');
120 120
                 if ($line_item->OBJ_type() === 'Event') {
121 121
                     $options['event_id'] = $event_id = $line_item->OBJ_ID();
122
-                    if (! isset($this->_events[ $options['event_id'] ])) {
122
+                    if ( ! isset($this->_events[$options['event_id']])) {
123 123
                         $event = EEM_Event::instance()->get_one_by_ID($options['event_id']);
124 124
                         // if event has default reg status of Not Approved, then don't display info on it
125 125
                         if (
@@ -130,7 +130,7 @@  discard block
 block discarded – undo
130 130
                             // unless there are registrations for it that are returning to pay
131 131
                             if (isset($options['registrations']) && is_array($options['registrations'])) {
132 132
                                 foreach ($options['registrations'] as $registration) {
133
-                                    if (! $registration instanceof EE_Registration) {
133
+                                    if ( ! $registration instanceof EE_Registration) {
134 134
                                         continue;
135 135
                                     }
136 136
                                     $display_event = $registration->event_ID() === $options['event_id']
@@ -139,11 +139,11 @@  discard block
 block discarded – undo
139 139
                                         : $display_event;
140 140
                                 }
141 141
                             }
142
-                            if (! $display_event) {
142
+                            if ( ! $display_event) {
143 143
                                 return '';
144 144
                             }
145 145
                         }
146
-                        $this->_events[ $options['event_id'] ] = 0;
146
+                        $this->_events[$options['event_id']] = 0;
147 147
                         $html .= $this->_event_row($line_item);
148 148
                         $text = esc_html__('Event Sub-Total', 'event_espresso');
149 149
                     }
@@ -154,7 +154,7 @@  discard block
 block discarded – undo
154 154
                     // recursively feed children back into this method
155 155
                     $html .= $this->display_line_item($child_line_item, $options, $line_item);
156 156
                 }
157
-                $event_sub_total += isset($options['event_id']) ? $this->_events[ $options['event_id'] ] : 0;
157
+                $event_sub_total += isset($options['event_id']) ? $this->_events[$options['event_id']] : 0;
158 158
                 $sub_total += $event_sub_total;
159 159
                 if (
160 160
                     (
@@ -263,7 +263,7 @@  discard block
 block discarded – undo
263 263
             'FHEE__EE_SPCO_Line_Item_Display_Strategy__item_row__desc',
264 264
             (
265 265
                 $options['show_desc']
266
-                    ? '<span class="line-item-desc-spn smaller-text">: ' . $line_item->desc() . '</span>'
266
+                    ? '<span class="line-item-desc-spn smaller-text">: '.$line_item->desc().'</span>'
267 267
                     : ''
268 268
             ),
269 269
             $line_item,
@@ -299,7 +299,7 @@  discard block
 block discarded – undo
299 299
             $line_item->total(),
300 300
             $line_item
301 301
         );
302
-        $this->_events[ $options['event_id'] ] += $total;
302
+        $this->_events[$options['event_id']] += $total;
303 303
         // total td
304 304
         $html .= EEH_HTML::td(
305 305
             EEH_Template::format_currency($total, false, false),
@@ -326,18 +326,18 @@  discard block
 block discarded – undo
326 326
         // start of row
327 327
         $row_class = $options['odd'] ? 'item odd' : 'item';
328 328
         $html = EEH_HTML::tr('', '', $row_class);
329
-        $obj_name = $line_item->OBJ_type() ? $line_item->OBJ_type_i18n() . ': ' : '';
329
+        $obj_name = $line_item->OBJ_type() ? $line_item->OBJ_type_i18n().': ' : '';
330 330
         // name && desc
331 331
         $name_and_desc = apply_filters(
332 332
             'FHEE__EE_SPCO_Line_Item_Display_Strategy__item_row__name',
333
-            $obj_name . $line_item->name(),
333
+            $obj_name.$line_item->name(),
334 334
             $line_item
335 335
         );
336 336
         $name_and_desc .= apply_filters(
337 337
             'FHEE__EE_SPCO_Line_Item_Display_Strategy__item_row__desc',
338 338
             (
339 339
                 $options['show_desc']
340
-                ? '<span class="line-item-desc-spn smaller-text">: ' . $line_item->desc() . '</span>'
340
+                ? '<span class="line-item-desc-spn smaller-text">: '.$line_item->desc().'</span>'
341 341
                 : ''
342 342
             ),
343 343
             $line_item,
@@ -355,7 +355,7 @@  discard block
 block discarded – undo
355 355
         $html .= EEH_HTML::td($name_and_desc, '', 'item_l');
356 356
         // price td
357 357
         if ($line_item->is_percent()) {
358
-            $html .= EEH_HTML::td($line_item->percent() . '%', '', 'item_c jst-rght');
358
+            $html .= EEH_HTML::td($line_item->percent().'%', '', 'item_c jst-rght');
359 359
         } else {
360 360
             $html .= EEH_HTML::td($line_item->unit_price_no_code(), '', 'item_c jst-rght');
361 361
         }
@@ -363,8 +363,8 @@  discard block
 block discarded – undo
363 363
         $html .= EEH_HTML::td($line_item->quantity(), '', 'item_l jst-rght');
364 364
         // $total = $line_item->total() * $line_item->quantity();
365 365
         $total = $line_item->total();
366
-        if (isset($options['event_id'], $this->_events[ $options['event_id'] ])) {
367
-            $this->_events[ $options['event_id'] ] += $total;
366
+        if (isset($options['event_id'], $this->_events[$options['event_id']])) {
367
+            $this->_events[$options['event_id']] += $total;
368 368
         }
369 369
         // total td
370 370
         $html .= EEH_HTML::td(
@@ -459,8 +459,8 @@  discard block
 block discarded – undo
459 459
         // name && desc
460 460
         $name_and_desc = $line_item->name();
461 461
         $name_and_desc .= '<span class="smaller-text lt-grey-text" style="margin:0 0 0 2em;">'
462
-                          . esc_html__(' * taxable items', 'event_espresso') . '</span>';
463
-        $name_and_desc .= $options['show_desc'] ? '<br/>' . $line_item->desc() : '';
462
+                          . esc_html__(' * taxable items', 'event_espresso').'</span>';
463
+        $name_and_desc .= $options['show_desc'] ? '<br/>'.$line_item->desc() : '';
464 464
         // name td
465 465
         $html .= EEH_HTML::td( /*__FUNCTION__ .*/
466 466
             $name_and_desc,
@@ -468,7 +468,7 @@  discard block
 block discarded – undo
468 468
             'item_l sub-item'
469 469
         );
470 470
         // percent td
471
-        $html .= EEH_HTML::td($line_item->percent() . '%', '', ' jst-rght', '');
471
+        $html .= EEH_HTML::td($line_item->percent().'%', '', ' jst-rght', '');
472 472
         // empty td (price)
473 473
         $html .= EEH_HTML::td(EEH_HTML::nbsp());
474 474
         // total td
@@ -613,7 +613,7 @@  discard block
 block discarded – undo
613 613
                     $registration_payments += $registration->registration_payments();
614 614
                 }
615 615
             }
616
-            if (! empty($registration_payments)) {
616
+            if ( ! empty($registration_payments)) {
617 617
                 foreach ($registration_payments as $registration_payment) {
618 618
                     if ($registration_payment instanceof EE_Registration_Payment) {
619 619
                         $owing -= $registration_payment->amount();
@@ -623,7 +623,7 @@  discard block
 block discarded – undo
623 623
                             $payment_desc = sprintf(
624 624
                                 esc_html__('Payment%1$s Received: %2$s', 'event_espresso'),
625 625
                                 $payment->txn_id_chq_nmbr() !== ''
626
-                                    ? ' <span class="small-text">(#' . $payment->txn_id_chq_nmbr() . ')</span> '
626
+                                    ? ' <span class="small-text">(#'.$payment->txn_id_chq_nmbr().')</span> '
627 627
                                     : '',
628 628
                                 $payment->timestamp()
629 629
                             );
Please login to merge, or discard this patch.
Indentation   +659 added lines, -659 removed lines patch added patch discarded remove patch
@@ -11,663 +11,663 @@
 block discarded – undo
11 11
  */
12 12
 class EE_SPCO_Line_Item_Display_Strategy implements EEI_Line_Item_Display
13 13
 {
14
-    /**
15
-     * array of events
16
-     *
17
-     * @type EE_Line_Item[] $_events
18
-     */
19
-    private $_events = array();
20
-
21
-    /**
22
-     * whether to display the taxes row or not
23
-     *
24
-     * @type bool $_show_taxes
25
-     */
26
-    private $_show_taxes = false;
27
-
28
-    /**
29
-     * html for any tax rows
30
-     *
31
-     * @type string $_show_taxes
32
-     */
33
-    private $_taxes_html = '';
34
-
35
-    /**
36
-     * total amount including tax we can bill for at this time
37
-     *
38
-     * @type float $_grand_total
39
-     */
40
-    private $_grand_total = 0.00;
41
-
42
-    /**
43
-     * total number of items being billed for
44
-     *
45
-     * @type int $_total_items
46
-     */
47
-    private $_total_items = 0;
48
-
49
-
50
-
51
-    /**
52
-     * @return float
53
-     */
54
-    public function grand_total()
55
-    {
56
-        return $this->_grand_total;
57
-    }
58
-
59
-
60
-
61
-    /**
62
-     * @return int
63
-     */
64
-    public function total_items()
65
-    {
66
-        return $this->_total_items;
67
-    }
68
-
69
-
70
-
71
-    /**
72
-     * @param EE_Line_Item $line_item
73
-     * @param array        $options
74
-     * @param EE_Line_Item $parent_line_item
75
-     * @return mixed
76
-     * @throws EE_Error
77
-     */
78
-    public function display_line_item(
79
-        EE_Line_Item $line_item,
80
-        $options = array(),
81
-        EE_Line_Item $parent_line_item = null
82
-    ) {
83
-        $html = '';
84
-        // set some default options and merge with incoming
85
-        $default_options = array(
86
-            'show_desc' => true,  //    true        false
87
-            'odd'       => false,
88
-        );
89
-        $options = array_merge($default_options, (array) $options);
90
-        switch ($line_item->type()) {
91
-            case EEM_Line_Item::type_line_item:
92
-                $this->_show_taxes = $line_item->is_taxable() ? true : $this->_show_taxes;
93
-                if ($line_item->OBJ_type() === 'Ticket') {
94
-                    // item row
95
-                    $html .= $this->_ticket_row($line_item, $options);
96
-                } else {
97
-                    // item row
98
-                    $html .= $this->_item_row($line_item, $options);
99
-                }
100
-                if (
101
-                    apply_filters(
102
-                        'FHEE__EE_SPCO_Line_Item_Display_Strategy__display_line_item__display_sub_line_items',
103
-                        true
104
-                    )
105
-                ) {
106
-                    // got any kids?
107
-                    foreach ($line_item->children() as $child_line_item) {
108
-                        $html .= $this->display_line_item($child_line_item, $options, $line_item);
109
-                    }
110
-                }
111
-                break;
112
-            case EEM_Line_Item::type_sub_line_item:
113
-                $html .= $this->_sub_item_row($line_item, $options, $parent_line_item);
114
-                break;
115
-            case EEM_Line_Item::type_sub_total:
116
-                static $sub_total = 0;
117
-                $event_sub_total = 0;
118
-                $text = esc_html__('Sub-Total', 'event_espresso');
119
-                if ($line_item->OBJ_type() === 'Event') {
120
-                    $options['event_id'] = $event_id = $line_item->OBJ_ID();
121
-                    if (! isset($this->_events[ $options['event_id'] ])) {
122
-                        $event = EEM_Event::instance()->get_one_by_ID($options['event_id']);
123
-                        // if event has default reg status of Not Approved, then don't display info on it
124
-                        if (
125
-                            $event instanceof EE_Event
126
-                            && $event->default_registration_status() === EEM_Registration::status_id_not_approved
127
-                        ) {
128
-                            $display_event = false;
129
-                            // unless there are registrations for it that are returning to pay
130
-                            if (isset($options['registrations']) && is_array($options['registrations'])) {
131
-                                foreach ($options['registrations'] as $registration) {
132
-                                    if (! $registration instanceof EE_Registration) {
133
-                                        continue;
134
-                                    }
135
-                                    $display_event = $registration->event_ID() === $options['event_id']
136
-                                                     && $registration->status_ID() !== EEM_Registration::status_id_not_approved
137
-                                        ? true
138
-                                        : $display_event;
139
-                                }
140
-                            }
141
-                            if (! $display_event) {
142
-                                return '';
143
-                            }
144
-                        }
145
-                        $this->_events[ $options['event_id'] ] = 0;
146
-                        $html .= $this->_event_row($line_item);
147
-                        $text = esc_html__('Event Sub-Total', 'event_espresso');
148
-                    }
149
-                }
150
-                $child_line_items = $line_item->children();
151
-                // loop thru children
152
-                foreach ($child_line_items as $child_line_item) {
153
-                    // recursively feed children back into this method
154
-                    $html .= $this->display_line_item($child_line_item, $options, $line_item);
155
-                }
156
-                $event_sub_total += isset($options['event_id']) ? $this->_events[ $options['event_id'] ] : 0;
157
-                $sub_total += $event_sub_total;
158
-                if (
159
-                    (
160
-                        // event subtotals
161
-                        $line_item->code() !== 'pre-tax-subtotal' && count($child_line_items) > 1
162
-                    )
163
-                    || (
164
-                        // pre-tax subtotals
165
-                        $line_item->code() === 'pre-tax-subtotal' && count($this->_events) > 1
166
-                    )
167
-                ) {
168
-                    $options['sub_total'] = $line_item->OBJ_type() === 'Event' ? $event_sub_total : $sub_total;
169
-                    $html .= $this->_sub_total_row($line_item, $text, $options);
170
-                }
171
-                break;
172
-            case EEM_Line_Item::type_tax:
173
-                if ($this->_show_taxes) {
174
-                    $this->_taxes_html .= $this->_tax_row($line_item, $options);
175
-                }
176
-                break;
177
-            case EEM_Line_Item::type_tax_sub_total:
178
-                if ($this->_show_taxes) {
179
-                    $child_line_items = $line_item->children();
180
-                    // loop thru children
181
-                    foreach ($child_line_items as $child_line_item) {
182
-                        // recursively feed children back into this method
183
-                        $html .= $this->display_line_item($child_line_item, $options, $line_item);
184
-                    }
185
-                    if (count($child_line_items) > 1) {
186
-                        $this->_taxes_html .= $this->_total_tax_row($line_item, esc_html__('Tax Total', 'event_espresso'));
187
-                    }
188
-                }
189
-                break;
190
-            case EEM_Line_Item::type_total:
191
-                // get all child line items
192
-                $children = $line_item->children();
193
-                // loop thru all non-tax child line items
194
-                foreach ($children as $child_line_item) {
195
-                    if ($child_line_item->type() !== EEM_Line_Item::type_tax_sub_total) {
196
-                        // recursively feed children back into this method
197
-                        $html .= $this->display_line_item($child_line_item, $options, $line_item);
198
-                    }
199
-                }
200
-                // now loop thru  tax child line items
201
-                foreach ($children as $child_line_item) {
202
-                    if ($child_line_item->type() === EEM_Line_Item::type_tax_sub_total) {
203
-                        // recursively feed children back into this method
204
-                        $html .= $this->display_line_item($child_line_item, $options, $line_item);
205
-                    }
206
-                }
207
-                $html .= $this->_taxes_html;
208
-                $html .= $this->_total_row($line_item, esc_html__('Total', 'event_espresso'));
209
-                $html .= $this->_payments_and_amount_owing_rows($line_item, $options);
210
-                break;
211
-        }
212
-        return $html;
213
-    }
214
-
215
-
216
-
217
-    /**
218
-     * _event_row - basically a Heading row displayed once above each event's ticket rows
219
-     *
220
-     * @param EE_Line_Item $line_item
221
-     * @return mixed
222
-     */
223
-    private function _event_row(EE_Line_Item $line_item)
224
-    {
225
-        // start of row
226
-        $html = EEH_HTML::tr('', 'event-cart-total-row', 'total_tr odd');
227
-        // event name td
228
-        $html .= EEH_HTML::td(
229
-            EEH_HTML::strong($line_item->name()),
230
-            '',
231
-            'event-header',
232
-            '',
233
-            ' colspan="4"'
234
-        );
235
-        // end of row
236
-        $html .= EEH_HTML::trx();
237
-        return $html;
238
-    }
239
-
240
-
241
-
242
-    /**
243
-     * _ticket_row
244
-     *
245
-     * @param EE_Line_Item $line_item
246
-     * @param array        $options
247
-     * @return mixed
248
-     * @throws EE_Error
249
-     */
250
-    private function _ticket_row(EE_Line_Item $line_item, $options = array())
251
-    {
252
-        // start of row
253
-        $row_class = $options['odd'] ? 'item odd' : 'item';
254
-        $html = EEH_HTML::tr('', '', $row_class);
255
-        // name && desc
256
-        $name_and_desc = apply_filters(
257
-            'FHEE__EE_SPCO_Line_Item_Display_Strategy__item_row__name',
258
-            $line_item->name(),
259
-            $line_item
260
-        );
261
-        $name_and_desc .= apply_filters(
262
-            'FHEE__EE_SPCO_Line_Item_Display_Strategy__item_row__desc',
263
-            (
264
-                $options['show_desc']
265
-                    ? '<span class="line-item-desc-spn smaller-text">: ' . $line_item->desc() . '</span>'
266
-                    : ''
267
-            ),
268
-            $line_item,
269
-            $options
270
-        );
271
-        $name_and_desc .= $line_item->is_taxable() ? ' * ' : '';
272
-        $name_and_desc = apply_filters(
273
-            'FHEE__EE_SPCO_Line_Item_Display_Strategy___ticket_row__name_and_desc',
274
-            $name_and_desc,
275
-            $line_item,
276
-            $options
277
-        );
278
-
279
-        // name td
280
-        $html .= EEH_HTML::td( /*__FUNCTION__ .*/
281
-            $name_and_desc,
282
-            '',
283
-            'item_l'
284
-        );
285
-        // price td
286
-        $price = apply_filters(
287
-            'FHEE__EE_SPCO_Line_Item_Display_Strategy___ticket_row__price',
288
-            $line_item->unit_price_no_code(),
289
-            $line_item
290
-        );
291
-        $html .= EEH_HTML::td($price, '', 'item_c jst-rght');
292
-        // quantity td
293
-        $html .= EEH_HTML::td($line_item->quantity(), '', 'item_l jst-rght');
294
-        $this->_total_items += $line_item->quantity();
295
-        // determine total for line item
296
-        $total = apply_filters(
297
-            'FHEE__EE_SPCO_Line_Item_Display_Strategy___ticket_row__total',
298
-            $line_item->total(),
299
-            $line_item
300
-        );
301
-        $this->_events[ $options['event_id'] ] += $total;
302
-        // total td
303
-        $html .= EEH_HTML::td(
304
-            EEH_Template::format_currency($total, false, false),
305
-            '',
306
-            'item_r jst-rght'
307
-        );
308
-        // end of row
309
-        $html .= EEH_HTML::trx();
310
-        return $html;
311
-    }
312
-
313
-
314
-
315
-    /**
316
-     * _item_row
317
-     *
318
-     * @param EE_Line_Item $line_item
319
-     * @param array        $options
320
-     * @return mixed
321
-     * @throws EE_Error
322
-     */
323
-    private function _item_row(EE_Line_Item $line_item, $options = array())
324
-    {
325
-        // start of row
326
-        $row_class = $options['odd'] ? 'item odd' : 'item';
327
-        $html = EEH_HTML::tr('', '', $row_class);
328
-        $obj_name = $line_item->OBJ_type() ? $line_item->OBJ_type_i18n() . ': ' : '';
329
-        // name && desc
330
-        $name_and_desc = apply_filters(
331
-            'FHEE__EE_SPCO_Line_Item_Display_Strategy__item_row__name',
332
-            $obj_name . $line_item->name(),
333
-            $line_item
334
-        );
335
-        $name_and_desc .= apply_filters(
336
-            'FHEE__EE_SPCO_Line_Item_Display_Strategy__item_row__desc',
337
-            (
338
-                $options['show_desc']
339
-                ? '<span class="line-item-desc-spn smaller-text">: ' . $line_item->desc() . '</span>'
340
-                : ''
341
-            ),
342
-            $line_item,
343
-            $options
344
-        );
345
-        $name_and_desc .= $line_item->is_taxable() ? ' * ' : '';
346
-        $name_and_desc = apply_filters(
347
-            'FHEE__EE_SPCO_Line_Item_Display_Strategy___item_row__name_and_desc',
348
-            $name_and_desc,
349
-            $line_item,
350
-            $options
351
-        );
352
-
353
-        // name td
354
-        $html .= EEH_HTML::td($name_and_desc, '', 'item_l');
355
-        // price td
356
-        if ($line_item->is_percent()) {
357
-            $html .= EEH_HTML::td($line_item->percent() . '%', '', 'item_c jst-rght');
358
-        } else {
359
-            $html .= EEH_HTML::td($line_item->unit_price_no_code(), '', 'item_c jst-rght');
360
-        }
361
-        // quantity td
362
-        $html .= EEH_HTML::td($line_item->quantity(), '', 'item_l jst-rght');
363
-        // $total = $line_item->total() * $line_item->quantity();
364
-        $total = $line_item->total();
365
-        if (isset($options['event_id'], $this->_events[ $options['event_id'] ])) {
366
-            $this->_events[ $options['event_id'] ] += $total;
367
-        }
368
-        // total td
369
-        $html .= EEH_HTML::td(
370
-            EEH_Template::format_currency($total, false, false),
371
-            '',
372
-            'item_r jst-rght'
373
-        );
374
-        // end of row
375
-        $html .= EEH_HTML::trx();
376
-        return $html;
377
-    }
378
-
379
-
380
-
381
-    /**
382
-     * _sub_item_row
383
-     *
384
-     * @param EE_Line_Item $line_item
385
-     * @param array        $options
386
-     * @param EE_Line_Item $parent_line_item
387
-     * @return mixed
388
-     * @throws EE_Error
389
-     */
390
-    private function _sub_item_row(EE_Line_Item $line_item, $options = array(), EE_Line_Item $parent_line_item = null)
391
-    {
392
-        if (
393
-            $parent_line_item instanceof  EE_Line_Item
394
-            && $line_item->children() === array()
395
-            && $line_item->name() === $parent_line_item->name()
396
-            && apply_filters(
397
-                'FHEE__EE_SPCO_Line_Item_Display_Strategy___sub_item_row__hide_main_sub_line_item',
398
-                true
399
-            )
400
-        ) {
401
-            return '';
402
-        }
403
-        // start of row
404
-        $html = EEH_HTML::tr('', '', 'item sub-item-row');
405
-        // name && desc
406
-        $name_and_desc = EEH_HTML::span('', '', 'sub-item-row-bullet dashicons dashicons-arrow-right')
407
-                         . $line_item->name();
408
-        $name_and_desc .= $options['show_desc'] ? '<span class="line-sub-item-desc-spn smaller-text">: '
409
-                                                  . $line_item->desc()
410
-                                                  . '</span>' : '';
411
-        // name td
412
-        $html .= EEH_HTML::td($name_and_desc, '', 'item_l sub-item');
413
-        $qty = $parent_line_item instanceof EE_Line_Item ? $parent_line_item->quantity() : 1;
414
-        // discount/surcharge td
415
-        if ($line_item->is_percent()) {
416
-            $html .= EEH_HTML::td(
417
-                EEH_Template::format_currency(
418
-                    $line_item->total() / $qty,
419
-                    false,
420
-                    false
421
-                ),
422
-                '',
423
-                'item_c jst-rght'
424
-            );
425
-        } else {
426
-            $html .= EEH_HTML::td($line_item->unit_price_no_code(), '', 'item_c jst-rght');
427
-        }
428
-        // no quantity td
429
-        $html .= EEH_HTML::td();
430
-        // no total td
431
-        $html .= EEH_HTML::td();
432
-        // end of row
433
-        $html .= EEH_HTML::trx();
434
-        $html = apply_filters(
435
-            'FHEE__EE_SPCO_Line_Item_Display_Strategy___sub_item_row__html',
436
-            $html,
437
-            $line_item,
438
-            $options,
439
-            $parent_line_item
440
-        );
441
-        return $html;
442
-    }
443
-
444
-
445
-
446
-    /**
447
-     * _tax_row
448
-     *
449
-     * @param EE_Line_Item $line_item
450
-     * @param array        $options
451
-     * @return mixed
452
-     * @throws EE_Error
453
-     */
454
-    private function _tax_row(EE_Line_Item $line_item, $options = array())
455
-    {
456
-        // start of row
457
-        $html = EEH_HTML::tr('', 'item sub-item tax-total');
458
-        // name && desc
459
-        $name_and_desc = $line_item->name();
460
-        $name_and_desc .= '<span class="smaller-text lt-grey-text" style="margin:0 0 0 2em;">'
461
-                          . esc_html__(' * taxable items', 'event_espresso') . '</span>';
462
-        $name_and_desc .= $options['show_desc'] ? '<br/>' . $line_item->desc() : '';
463
-        // name td
464
-        $html .= EEH_HTML::td( /*__FUNCTION__ .*/
465
-            $name_and_desc,
466
-            '',
467
-            'item_l sub-item'
468
-        );
469
-        // percent td
470
-        $html .= EEH_HTML::td($line_item->percent() . '%', '', ' jst-rght', '');
471
-        // empty td (price)
472
-        $html .= EEH_HTML::td(EEH_HTML::nbsp());
473
-        // total td
474
-        $html .= EEH_HTML::td(
475
-            EEH_Template::format_currency(
476
-                $line_item->total(),
477
-                false,
478
-                false
479
-            ),
480
-            '',
481
-            'item_r jst-rght'
482
-        );
483
-        // end of row
484
-        $html .= EEH_HTML::trx();
485
-        return $html;
486
-    }
487
-
488
-
489
-
490
-    /**
491
-     * _total_row
492
-     *
493
-     * @param EE_Line_Item $line_item
494
-     * @param string       $text
495
-     * @return mixed
496
-     * @throws EE_Error
497
-     */
498
-    private function _total_tax_row(EE_Line_Item $line_item, $text = '')
499
-    {
500
-        $html = '';
501
-        if ($line_item->total()) {
502
-            // start of row
503
-            $html = EEH_HTML::tr('', '', 'total_tr odd');
504
-            // total td
505
-            $html .= EEH_HTML::td(
506
-                $text,
507
-                '',
508
-                'total_currency total jst-rght',
509
-                '',
510
-                ' colspan="2"'
511
-            );
512
-            // empty td (price)
513
-            $html .= EEH_HTML::td(EEH_HTML::nbsp());
514
-            // total td
515
-            $html .= EEH_HTML::td(
516
-                EEH_Template::format_currency($line_item->total(), false, false),
517
-                '',
518
-                'total jst-rght'
519
-            );
520
-            // end of row
521
-            $html .= EEH_HTML::trx();
522
-        }
523
-        return $html;
524
-    }
525
-
526
-
527
-
528
-    /**
529
-     * _total_row
530
-     *
531
-     * @param EE_Line_Item $line_item
532
-     * @param string       $text
533
-     * @param array        $options
534
-     * @return mixed
535
-     * @throws EE_Error
536
-     */
537
-    private function _sub_total_row(EE_Line_Item $line_item, $text = '', $options = array())
538
-    {
539
-        $html = '';
540
-        if ($line_item->total()) {
541
-            // start of row
542
-            $html = EEH_HTML::tr('', '', 'total_tr odd');
543
-            // total td
544
-            $html .= EEH_HTML::td(
545
-                $text,
546
-                '',
547
-                'total_currency total jst-rght',
548
-                '',
549
-                ' colspan="3"'
550
-            );
551
-            // total td
552
-            $html .= EEH_HTML::td(
553
-                EEH_Template::format_currency($options['sub_total'], false, false),
554
-                '',
555
-                'total jst-rght'
556
-            );
557
-            // end of row
558
-            $html .= EEH_HTML::trx();
559
-        }
560
-        return $html;
561
-    }
562
-
563
-
564
-
565
-    /**
566
-     * _total_row
567
-     *
568
-     * @param EE_Line_Item $line_item
569
-     * @param string       $text
570
-     * @return mixed
571
-     * @throws EE_Error
572
-     */
573
-    private function _total_row(EE_Line_Item $line_item, $text = '')
574
-    {
575
-        // start of row
576
-        $html = EEH_HTML::tr('', '', 'spco-grand-total total_tr odd');
577
-        // total td
578
-        $html .= EEH_HTML::td($text, '', 'total_currency total jst-rght', '', ' colspan="3"');
579
-        // total td
580
-        $html .= EEH_HTML::td(
581
-            EEH_Template::format_currency($line_item->total(), false, false),
582
-            '',
583
-            'total jst-rght'
584
-        );
585
-        // end of row
586
-        $html .= EEH_HTML::trx();
587
-        return $html;
588
-    }
589
-
590
-
591
-
592
-    /**
593
-     * _payments_and_amount_owing_rows
594
-     *
595
-     * @param EE_Line_Item $line_item
596
-     * @param array        $options
597
-     * @return mixed
598
-     * @throws EE_Error
599
-     */
600
-    private function _payments_and_amount_owing_rows(EE_Line_Item $line_item, $options = array())
601
-    {
602
-        $html = '';
603
-        $owing = $line_item->total();
604
-        $transaction = EEM_Transaction::instance()->get_one_by_ID($line_item->TXN_ID());
605
-        if ($transaction instanceof EE_Transaction) {
606
-            $registration_payments = array();
607
-            $registrations = ! empty($options['registrations'])
608
-                ? $options['registrations']
609
-                : $transaction->registrations();
610
-            foreach ($registrations as $registration) {
611
-                if ($registration instanceof EE_Registration && $registration->owes_monies_and_can_pay()) {
612
-                    $registration_payments += $registration->registration_payments();
613
-                }
614
-            }
615
-            if (! empty($registration_payments)) {
616
-                foreach ($registration_payments as $registration_payment) {
617
-                    if ($registration_payment instanceof EE_Registration_Payment) {
618
-                        $owing -= $registration_payment->amount();
619
-                        $payment = $registration_payment->payment();
620
-                        $payment_desc = '';
621
-                        if ($payment instanceof EE_Payment) {
622
-                            $payment_desc = sprintf(
623
-                                esc_html__('Payment%1$s Received: %2$s', 'event_espresso'),
624
-                                $payment->txn_id_chq_nmbr() !== ''
625
-                                    ? ' <span class="small-text">(#' . $payment->txn_id_chq_nmbr() . ')</span> '
626
-                                    : '',
627
-                                $payment->timestamp()
628
-                            );
629
-                        }
630
-                        // start of row
631
-                        $html .= EEH_HTML::tr('', '', 'total_tr odd');
632
-                        // payment desc
633
-                        $html .= EEH_HTML::td($payment_desc, '', '', '', ' colspan="3"');
634
-                        // total td
635
-                        $html .= EEH_HTML::td(
636
-                            EEH_Template::format_currency(
637
-                                $registration_payment->amount(),
638
-                                false,
639
-                                false
640
-                            ),
641
-                            '',
642
-                            'total jst-rght'
643
-                        );
644
-                        // end of row
645
-                        $html .= EEH_HTML::trx();
646
-                    }
647
-                }
648
-                if ($line_item->total()) {
649
-                    // start of row
650
-                    $html .= EEH_HTML::tr('', '', 'total_tr odd');
651
-                    // total td
652
-                    $html .= EEH_HTML::td(
653
-                        esc_html__('Amount Owing', 'event_espresso'),
654
-                        '',
655
-                        'total_currency total jst-rght',
656
-                        '',
657
-                        ' colspan="3"'
658
-                    );
659
-                    // total td
660
-                    $html .= EEH_HTML::td(
661
-                        EEH_Template::format_currency($owing, false, false),
662
-                        '',
663
-                        'total jst-rght'
664
-                    );
665
-                    // end of row
666
-                    $html .= EEH_HTML::trx();
667
-                }
668
-            }
669
-        }
670
-        $this->_grand_total = $owing;
671
-        return $html;
672
-    }
14
+	/**
15
+	 * array of events
16
+	 *
17
+	 * @type EE_Line_Item[] $_events
18
+	 */
19
+	private $_events = array();
20
+
21
+	/**
22
+	 * whether to display the taxes row or not
23
+	 *
24
+	 * @type bool $_show_taxes
25
+	 */
26
+	private $_show_taxes = false;
27
+
28
+	/**
29
+	 * html for any tax rows
30
+	 *
31
+	 * @type string $_show_taxes
32
+	 */
33
+	private $_taxes_html = '';
34
+
35
+	/**
36
+	 * total amount including tax we can bill for at this time
37
+	 *
38
+	 * @type float $_grand_total
39
+	 */
40
+	private $_grand_total = 0.00;
41
+
42
+	/**
43
+	 * total number of items being billed for
44
+	 *
45
+	 * @type int $_total_items
46
+	 */
47
+	private $_total_items = 0;
48
+
49
+
50
+
51
+	/**
52
+	 * @return float
53
+	 */
54
+	public function grand_total()
55
+	{
56
+		return $this->_grand_total;
57
+	}
58
+
59
+
60
+
61
+	/**
62
+	 * @return int
63
+	 */
64
+	public function total_items()
65
+	{
66
+		return $this->_total_items;
67
+	}
68
+
69
+
70
+
71
+	/**
72
+	 * @param EE_Line_Item $line_item
73
+	 * @param array        $options
74
+	 * @param EE_Line_Item $parent_line_item
75
+	 * @return mixed
76
+	 * @throws EE_Error
77
+	 */
78
+	public function display_line_item(
79
+		EE_Line_Item $line_item,
80
+		$options = array(),
81
+		EE_Line_Item $parent_line_item = null
82
+	) {
83
+		$html = '';
84
+		// set some default options and merge with incoming
85
+		$default_options = array(
86
+			'show_desc' => true,  //    true        false
87
+			'odd'       => false,
88
+		);
89
+		$options = array_merge($default_options, (array) $options);
90
+		switch ($line_item->type()) {
91
+			case EEM_Line_Item::type_line_item:
92
+				$this->_show_taxes = $line_item->is_taxable() ? true : $this->_show_taxes;
93
+				if ($line_item->OBJ_type() === 'Ticket') {
94
+					// item row
95
+					$html .= $this->_ticket_row($line_item, $options);
96
+				} else {
97
+					// item row
98
+					$html .= $this->_item_row($line_item, $options);
99
+				}
100
+				if (
101
+					apply_filters(
102
+						'FHEE__EE_SPCO_Line_Item_Display_Strategy__display_line_item__display_sub_line_items',
103
+						true
104
+					)
105
+				) {
106
+					// got any kids?
107
+					foreach ($line_item->children() as $child_line_item) {
108
+						$html .= $this->display_line_item($child_line_item, $options, $line_item);
109
+					}
110
+				}
111
+				break;
112
+			case EEM_Line_Item::type_sub_line_item:
113
+				$html .= $this->_sub_item_row($line_item, $options, $parent_line_item);
114
+				break;
115
+			case EEM_Line_Item::type_sub_total:
116
+				static $sub_total = 0;
117
+				$event_sub_total = 0;
118
+				$text = esc_html__('Sub-Total', 'event_espresso');
119
+				if ($line_item->OBJ_type() === 'Event') {
120
+					$options['event_id'] = $event_id = $line_item->OBJ_ID();
121
+					if (! isset($this->_events[ $options['event_id'] ])) {
122
+						$event = EEM_Event::instance()->get_one_by_ID($options['event_id']);
123
+						// if event has default reg status of Not Approved, then don't display info on it
124
+						if (
125
+							$event instanceof EE_Event
126
+							&& $event->default_registration_status() === EEM_Registration::status_id_not_approved
127
+						) {
128
+							$display_event = false;
129
+							// unless there are registrations for it that are returning to pay
130
+							if (isset($options['registrations']) && is_array($options['registrations'])) {
131
+								foreach ($options['registrations'] as $registration) {
132
+									if (! $registration instanceof EE_Registration) {
133
+										continue;
134
+									}
135
+									$display_event = $registration->event_ID() === $options['event_id']
136
+													 && $registration->status_ID() !== EEM_Registration::status_id_not_approved
137
+										? true
138
+										: $display_event;
139
+								}
140
+							}
141
+							if (! $display_event) {
142
+								return '';
143
+							}
144
+						}
145
+						$this->_events[ $options['event_id'] ] = 0;
146
+						$html .= $this->_event_row($line_item);
147
+						$text = esc_html__('Event Sub-Total', 'event_espresso');
148
+					}
149
+				}
150
+				$child_line_items = $line_item->children();
151
+				// loop thru children
152
+				foreach ($child_line_items as $child_line_item) {
153
+					// recursively feed children back into this method
154
+					$html .= $this->display_line_item($child_line_item, $options, $line_item);
155
+				}
156
+				$event_sub_total += isset($options['event_id']) ? $this->_events[ $options['event_id'] ] : 0;
157
+				$sub_total += $event_sub_total;
158
+				if (
159
+					(
160
+						// event subtotals
161
+						$line_item->code() !== 'pre-tax-subtotal' && count($child_line_items) > 1
162
+					)
163
+					|| (
164
+						// pre-tax subtotals
165
+						$line_item->code() === 'pre-tax-subtotal' && count($this->_events) > 1
166
+					)
167
+				) {
168
+					$options['sub_total'] = $line_item->OBJ_type() === 'Event' ? $event_sub_total : $sub_total;
169
+					$html .= $this->_sub_total_row($line_item, $text, $options);
170
+				}
171
+				break;
172
+			case EEM_Line_Item::type_tax:
173
+				if ($this->_show_taxes) {
174
+					$this->_taxes_html .= $this->_tax_row($line_item, $options);
175
+				}
176
+				break;
177
+			case EEM_Line_Item::type_tax_sub_total:
178
+				if ($this->_show_taxes) {
179
+					$child_line_items = $line_item->children();
180
+					// loop thru children
181
+					foreach ($child_line_items as $child_line_item) {
182
+						// recursively feed children back into this method
183
+						$html .= $this->display_line_item($child_line_item, $options, $line_item);
184
+					}
185
+					if (count($child_line_items) > 1) {
186
+						$this->_taxes_html .= $this->_total_tax_row($line_item, esc_html__('Tax Total', 'event_espresso'));
187
+					}
188
+				}
189
+				break;
190
+			case EEM_Line_Item::type_total:
191
+				// get all child line items
192
+				$children = $line_item->children();
193
+				// loop thru all non-tax child line items
194
+				foreach ($children as $child_line_item) {
195
+					if ($child_line_item->type() !== EEM_Line_Item::type_tax_sub_total) {
196
+						// recursively feed children back into this method
197
+						$html .= $this->display_line_item($child_line_item, $options, $line_item);
198
+					}
199
+				}
200
+				// now loop thru  tax child line items
201
+				foreach ($children as $child_line_item) {
202
+					if ($child_line_item->type() === EEM_Line_Item::type_tax_sub_total) {
203
+						// recursively feed children back into this method
204
+						$html .= $this->display_line_item($child_line_item, $options, $line_item);
205
+					}
206
+				}
207
+				$html .= $this->_taxes_html;
208
+				$html .= $this->_total_row($line_item, esc_html__('Total', 'event_espresso'));
209
+				$html .= $this->_payments_and_amount_owing_rows($line_item, $options);
210
+				break;
211
+		}
212
+		return $html;
213
+	}
214
+
215
+
216
+
217
+	/**
218
+	 * _event_row - basically a Heading row displayed once above each event's ticket rows
219
+	 *
220
+	 * @param EE_Line_Item $line_item
221
+	 * @return mixed
222
+	 */
223
+	private function _event_row(EE_Line_Item $line_item)
224
+	{
225
+		// start of row
226
+		$html = EEH_HTML::tr('', 'event-cart-total-row', 'total_tr odd');
227
+		// event name td
228
+		$html .= EEH_HTML::td(
229
+			EEH_HTML::strong($line_item->name()),
230
+			'',
231
+			'event-header',
232
+			'',
233
+			' colspan="4"'
234
+		);
235
+		// end of row
236
+		$html .= EEH_HTML::trx();
237
+		return $html;
238
+	}
239
+
240
+
241
+
242
+	/**
243
+	 * _ticket_row
244
+	 *
245
+	 * @param EE_Line_Item $line_item
246
+	 * @param array        $options
247
+	 * @return mixed
248
+	 * @throws EE_Error
249
+	 */
250
+	private function _ticket_row(EE_Line_Item $line_item, $options = array())
251
+	{
252
+		// start of row
253
+		$row_class = $options['odd'] ? 'item odd' : 'item';
254
+		$html = EEH_HTML::tr('', '', $row_class);
255
+		// name && desc
256
+		$name_and_desc = apply_filters(
257
+			'FHEE__EE_SPCO_Line_Item_Display_Strategy__item_row__name',
258
+			$line_item->name(),
259
+			$line_item
260
+		);
261
+		$name_and_desc .= apply_filters(
262
+			'FHEE__EE_SPCO_Line_Item_Display_Strategy__item_row__desc',
263
+			(
264
+				$options['show_desc']
265
+					? '<span class="line-item-desc-spn smaller-text">: ' . $line_item->desc() . '</span>'
266
+					: ''
267
+			),
268
+			$line_item,
269
+			$options
270
+		);
271
+		$name_and_desc .= $line_item->is_taxable() ? ' * ' : '';
272
+		$name_and_desc = apply_filters(
273
+			'FHEE__EE_SPCO_Line_Item_Display_Strategy___ticket_row__name_and_desc',
274
+			$name_and_desc,
275
+			$line_item,
276
+			$options
277
+		);
278
+
279
+		// name td
280
+		$html .= EEH_HTML::td( /*__FUNCTION__ .*/
281
+			$name_and_desc,
282
+			'',
283
+			'item_l'
284
+		);
285
+		// price td
286
+		$price = apply_filters(
287
+			'FHEE__EE_SPCO_Line_Item_Display_Strategy___ticket_row__price',
288
+			$line_item->unit_price_no_code(),
289
+			$line_item
290
+		);
291
+		$html .= EEH_HTML::td($price, '', 'item_c jst-rght');
292
+		// quantity td
293
+		$html .= EEH_HTML::td($line_item->quantity(), '', 'item_l jst-rght');
294
+		$this->_total_items += $line_item->quantity();
295
+		// determine total for line item
296
+		$total = apply_filters(
297
+			'FHEE__EE_SPCO_Line_Item_Display_Strategy___ticket_row__total',
298
+			$line_item->total(),
299
+			$line_item
300
+		);
301
+		$this->_events[ $options['event_id'] ] += $total;
302
+		// total td
303
+		$html .= EEH_HTML::td(
304
+			EEH_Template::format_currency($total, false, false),
305
+			'',
306
+			'item_r jst-rght'
307
+		);
308
+		// end of row
309
+		$html .= EEH_HTML::trx();
310
+		return $html;
311
+	}
312
+
313
+
314
+
315
+	/**
316
+	 * _item_row
317
+	 *
318
+	 * @param EE_Line_Item $line_item
319
+	 * @param array        $options
320
+	 * @return mixed
321
+	 * @throws EE_Error
322
+	 */
323
+	private function _item_row(EE_Line_Item $line_item, $options = array())
324
+	{
325
+		// start of row
326
+		$row_class = $options['odd'] ? 'item odd' : 'item';
327
+		$html = EEH_HTML::tr('', '', $row_class);
328
+		$obj_name = $line_item->OBJ_type() ? $line_item->OBJ_type_i18n() . ': ' : '';
329
+		// name && desc
330
+		$name_and_desc = apply_filters(
331
+			'FHEE__EE_SPCO_Line_Item_Display_Strategy__item_row__name',
332
+			$obj_name . $line_item->name(),
333
+			$line_item
334
+		);
335
+		$name_and_desc .= apply_filters(
336
+			'FHEE__EE_SPCO_Line_Item_Display_Strategy__item_row__desc',
337
+			(
338
+				$options['show_desc']
339
+				? '<span class="line-item-desc-spn smaller-text">: ' . $line_item->desc() . '</span>'
340
+				: ''
341
+			),
342
+			$line_item,
343
+			$options
344
+		);
345
+		$name_and_desc .= $line_item->is_taxable() ? ' * ' : '';
346
+		$name_and_desc = apply_filters(
347
+			'FHEE__EE_SPCO_Line_Item_Display_Strategy___item_row__name_and_desc',
348
+			$name_and_desc,
349
+			$line_item,
350
+			$options
351
+		);
352
+
353
+		// name td
354
+		$html .= EEH_HTML::td($name_and_desc, '', 'item_l');
355
+		// price td
356
+		if ($line_item->is_percent()) {
357
+			$html .= EEH_HTML::td($line_item->percent() . '%', '', 'item_c jst-rght');
358
+		} else {
359
+			$html .= EEH_HTML::td($line_item->unit_price_no_code(), '', 'item_c jst-rght');
360
+		}
361
+		// quantity td
362
+		$html .= EEH_HTML::td($line_item->quantity(), '', 'item_l jst-rght');
363
+		// $total = $line_item->total() * $line_item->quantity();
364
+		$total = $line_item->total();
365
+		if (isset($options['event_id'], $this->_events[ $options['event_id'] ])) {
366
+			$this->_events[ $options['event_id'] ] += $total;
367
+		}
368
+		// total td
369
+		$html .= EEH_HTML::td(
370
+			EEH_Template::format_currency($total, false, false),
371
+			'',
372
+			'item_r jst-rght'
373
+		);
374
+		// end of row
375
+		$html .= EEH_HTML::trx();
376
+		return $html;
377
+	}
378
+
379
+
380
+
381
+	/**
382
+	 * _sub_item_row
383
+	 *
384
+	 * @param EE_Line_Item $line_item
385
+	 * @param array        $options
386
+	 * @param EE_Line_Item $parent_line_item
387
+	 * @return mixed
388
+	 * @throws EE_Error
389
+	 */
390
+	private function _sub_item_row(EE_Line_Item $line_item, $options = array(), EE_Line_Item $parent_line_item = null)
391
+	{
392
+		if (
393
+			$parent_line_item instanceof  EE_Line_Item
394
+			&& $line_item->children() === array()
395
+			&& $line_item->name() === $parent_line_item->name()
396
+			&& apply_filters(
397
+				'FHEE__EE_SPCO_Line_Item_Display_Strategy___sub_item_row__hide_main_sub_line_item',
398
+				true
399
+			)
400
+		) {
401
+			return '';
402
+		}
403
+		// start of row
404
+		$html = EEH_HTML::tr('', '', 'item sub-item-row');
405
+		// name && desc
406
+		$name_and_desc = EEH_HTML::span('', '', 'sub-item-row-bullet dashicons dashicons-arrow-right')
407
+						 . $line_item->name();
408
+		$name_and_desc .= $options['show_desc'] ? '<span class="line-sub-item-desc-spn smaller-text">: '
409
+												  . $line_item->desc()
410
+												  . '</span>' : '';
411
+		// name td
412
+		$html .= EEH_HTML::td($name_and_desc, '', 'item_l sub-item');
413
+		$qty = $parent_line_item instanceof EE_Line_Item ? $parent_line_item->quantity() : 1;
414
+		// discount/surcharge td
415
+		if ($line_item->is_percent()) {
416
+			$html .= EEH_HTML::td(
417
+				EEH_Template::format_currency(
418
+					$line_item->total() / $qty,
419
+					false,
420
+					false
421
+				),
422
+				'',
423
+				'item_c jst-rght'
424
+			);
425
+		} else {
426
+			$html .= EEH_HTML::td($line_item->unit_price_no_code(), '', 'item_c jst-rght');
427
+		}
428
+		// no quantity td
429
+		$html .= EEH_HTML::td();
430
+		// no total td
431
+		$html .= EEH_HTML::td();
432
+		// end of row
433
+		$html .= EEH_HTML::trx();
434
+		$html = apply_filters(
435
+			'FHEE__EE_SPCO_Line_Item_Display_Strategy___sub_item_row__html',
436
+			$html,
437
+			$line_item,
438
+			$options,
439
+			$parent_line_item
440
+		);
441
+		return $html;
442
+	}
443
+
444
+
445
+
446
+	/**
447
+	 * _tax_row
448
+	 *
449
+	 * @param EE_Line_Item $line_item
450
+	 * @param array        $options
451
+	 * @return mixed
452
+	 * @throws EE_Error
453
+	 */
454
+	private function _tax_row(EE_Line_Item $line_item, $options = array())
455
+	{
456
+		// start of row
457
+		$html = EEH_HTML::tr('', 'item sub-item tax-total');
458
+		// name && desc
459
+		$name_and_desc = $line_item->name();
460
+		$name_and_desc .= '<span class="smaller-text lt-grey-text" style="margin:0 0 0 2em;">'
461
+						  . esc_html__(' * taxable items', 'event_espresso') . '</span>';
462
+		$name_and_desc .= $options['show_desc'] ? '<br/>' . $line_item->desc() : '';
463
+		// name td
464
+		$html .= EEH_HTML::td( /*__FUNCTION__ .*/
465
+			$name_and_desc,
466
+			'',
467
+			'item_l sub-item'
468
+		);
469
+		// percent td
470
+		$html .= EEH_HTML::td($line_item->percent() . '%', '', ' jst-rght', '');
471
+		// empty td (price)
472
+		$html .= EEH_HTML::td(EEH_HTML::nbsp());
473
+		// total td
474
+		$html .= EEH_HTML::td(
475
+			EEH_Template::format_currency(
476
+				$line_item->total(),
477
+				false,
478
+				false
479
+			),
480
+			'',
481
+			'item_r jst-rght'
482
+		);
483
+		// end of row
484
+		$html .= EEH_HTML::trx();
485
+		return $html;
486
+	}
487
+
488
+
489
+
490
+	/**
491
+	 * _total_row
492
+	 *
493
+	 * @param EE_Line_Item $line_item
494
+	 * @param string       $text
495
+	 * @return mixed
496
+	 * @throws EE_Error
497
+	 */
498
+	private function _total_tax_row(EE_Line_Item $line_item, $text = '')
499
+	{
500
+		$html = '';
501
+		if ($line_item->total()) {
502
+			// start of row
503
+			$html = EEH_HTML::tr('', '', 'total_tr odd');
504
+			// total td
505
+			$html .= EEH_HTML::td(
506
+				$text,
507
+				'',
508
+				'total_currency total jst-rght',
509
+				'',
510
+				' colspan="2"'
511
+			);
512
+			// empty td (price)
513
+			$html .= EEH_HTML::td(EEH_HTML::nbsp());
514
+			// total td
515
+			$html .= EEH_HTML::td(
516
+				EEH_Template::format_currency($line_item->total(), false, false),
517
+				'',
518
+				'total jst-rght'
519
+			);
520
+			// end of row
521
+			$html .= EEH_HTML::trx();
522
+		}
523
+		return $html;
524
+	}
525
+
526
+
527
+
528
+	/**
529
+	 * _total_row
530
+	 *
531
+	 * @param EE_Line_Item $line_item
532
+	 * @param string       $text
533
+	 * @param array        $options
534
+	 * @return mixed
535
+	 * @throws EE_Error
536
+	 */
537
+	private function _sub_total_row(EE_Line_Item $line_item, $text = '', $options = array())
538
+	{
539
+		$html = '';
540
+		if ($line_item->total()) {
541
+			// start of row
542
+			$html = EEH_HTML::tr('', '', 'total_tr odd');
543
+			// total td
544
+			$html .= EEH_HTML::td(
545
+				$text,
546
+				'',
547
+				'total_currency total jst-rght',
548
+				'',
549
+				' colspan="3"'
550
+			);
551
+			// total td
552
+			$html .= EEH_HTML::td(
553
+				EEH_Template::format_currency($options['sub_total'], false, false),
554
+				'',
555
+				'total jst-rght'
556
+			);
557
+			// end of row
558
+			$html .= EEH_HTML::trx();
559
+		}
560
+		return $html;
561
+	}
562
+
563
+
564
+
565
+	/**
566
+	 * _total_row
567
+	 *
568
+	 * @param EE_Line_Item $line_item
569
+	 * @param string       $text
570
+	 * @return mixed
571
+	 * @throws EE_Error
572
+	 */
573
+	private function _total_row(EE_Line_Item $line_item, $text = '')
574
+	{
575
+		// start of row
576
+		$html = EEH_HTML::tr('', '', 'spco-grand-total total_tr odd');
577
+		// total td
578
+		$html .= EEH_HTML::td($text, '', 'total_currency total jst-rght', '', ' colspan="3"');
579
+		// total td
580
+		$html .= EEH_HTML::td(
581
+			EEH_Template::format_currency($line_item->total(), false, false),
582
+			'',
583
+			'total jst-rght'
584
+		);
585
+		// end of row
586
+		$html .= EEH_HTML::trx();
587
+		return $html;
588
+	}
589
+
590
+
591
+
592
+	/**
593
+	 * _payments_and_amount_owing_rows
594
+	 *
595
+	 * @param EE_Line_Item $line_item
596
+	 * @param array        $options
597
+	 * @return mixed
598
+	 * @throws EE_Error
599
+	 */
600
+	private function _payments_and_amount_owing_rows(EE_Line_Item $line_item, $options = array())
601
+	{
602
+		$html = '';
603
+		$owing = $line_item->total();
604
+		$transaction = EEM_Transaction::instance()->get_one_by_ID($line_item->TXN_ID());
605
+		if ($transaction instanceof EE_Transaction) {
606
+			$registration_payments = array();
607
+			$registrations = ! empty($options['registrations'])
608
+				? $options['registrations']
609
+				: $transaction->registrations();
610
+			foreach ($registrations as $registration) {
611
+				if ($registration instanceof EE_Registration && $registration->owes_monies_and_can_pay()) {
612
+					$registration_payments += $registration->registration_payments();
613
+				}
614
+			}
615
+			if (! empty($registration_payments)) {
616
+				foreach ($registration_payments as $registration_payment) {
617
+					if ($registration_payment instanceof EE_Registration_Payment) {
618
+						$owing -= $registration_payment->amount();
619
+						$payment = $registration_payment->payment();
620
+						$payment_desc = '';
621
+						if ($payment instanceof EE_Payment) {
622
+							$payment_desc = sprintf(
623
+								esc_html__('Payment%1$s Received: %2$s', 'event_espresso'),
624
+								$payment->txn_id_chq_nmbr() !== ''
625
+									? ' <span class="small-text">(#' . $payment->txn_id_chq_nmbr() . ')</span> '
626
+									: '',
627
+								$payment->timestamp()
628
+							);
629
+						}
630
+						// start of row
631
+						$html .= EEH_HTML::tr('', '', 'total_tr odd');
632
+						// payment desc
633
+						$html .= EEH_HTML::td($payment_desc, '', '', '', ' colspan="3"');
634
+						// total td
635
+						$html .= EEH_HTML::td(
636
+							EEH_Template::format_currency(
637
+								$registration_payment->amount(),
638
+								false,
639
+								false
640
+							),
641
+							'',
642
+							'total jst-rght'
643
+						);
644
+						// end of row
645
+						$html .= EEH_HTML::trx();
646
+					}
647
+				}
648
+				if ($line_item->total()) {
649
+					// start of row
650
+					$html .= EEH_HTML::tr('', '', 'total_tr odd');
651
+					// total td
652
+					$html .= EEH_HTML::td(
653
+						esc_html__('Amount Owing', 'event_espresso'),
654
+						'',
655
+						'total_currency total jst-rght',
656
+						'',
657
+						' colspan="3"'
658
+					);
659
+					// total td
660
+					$html .= EEH_HTML::td(
661
+						EEH_Template::format_currency($owing, false, false),
662
+						'',
663
+						'total jst-rght'
664
+					);
665
+					// end of row
666
+					$html .= EEH_HTML::trx();
667
+				}
668
+			}
669
+		}
670
+		$this->_grand_total = $owing;
671
+		return $html;
672
+	}
673 673
 }
Please login to merge, or discard this patch.
core/libraries/rest_api/Capabilities.php 2 patches
Spacing   +11 added lines, -11 removed lines patch added patch discarded remove patch
@@ -99,7 +99,7 @@  discard block
 block discarded – undo
99 99
     ) {
100 100
         $has_password = $model->hasPassword();
101 101
         if ($has_password) {
102
-            $entity[ $model->getPasswordField()->get_name() ] = ModelDataTranslator::prepareFieldValueForJson(
102
+            $entity[$model->getPasswordField()->get_name()] = ModelDataTranslator::prepareFieldValueForJson(
103 103
                 $model->getPasswordField(),
104 104
                 $model->getPasswordField()->get_default_value(),
105 105
                 $model_version_info->requestedVersion()
@@ -109,7 +109,7 @@  discard block
 block discarded – undo
109 109
             if (
110 110
                 $has_password
111 111
                 && $model->getPasswordField()->fieldIsProtected($field_name)
112
-                && $entity[ $field_name ]
112
+                && $entity[$field_name]
113 113
             ) {
114 114
                 $replacement_value = ModelDataTranslator::prepareFieldValueForJson(
115 115
                     $field_obj,
@@ -117,10 +117,10 @@  discard block
 block discarded – undo
117 117
                     $model_version_info->requestedVersion()
118 118
                 );
119 119
                 if ($model_version_info->fieldHasRenderedFormat($field_obj)) {
120
-                    $entity[ $field_name ]['rendered'] = $replacement_value;
120
+                    $entity[$field_name]['rendered'] = $replacement_value;
121 121
                 } elseif ($model_version_info->fieldHasPrettyFormat($field_obj)) {
122
-                    $entity[ $field_name ]['raw'] = $replacement_value;
123
-                    $entity[ $field_name ]['pretty'] = ModelDataTranslator::prepareFieldValueForJson(
122
+                    $entity[$field_name]['raw'] = $replacement_value;
123
+                    $entity[$field_name]['pretty'] = ModelDataTranslator::prepareFieldValueForJson(
124 124
                         $field_obj,
125 125
                         $field_obj->prepare_for_pretty_echoing($field_obj->get_default_value()),
126 126
                         $model_version_info->requestedVersion()
@@ -131,7 +131,7 @@  discard block
 block discarded – undo
131 131
                     // so just remove it (or rather, set its default)
132 132
                     // API clients will just need to look to fields with rendered formats to know if these have
133 133
                     // been redacted. Sorry.
134
-                    $entity[ $field_name ] = $replacement_value;
134
+                    $entity[$field_name] = $replacement_value;
135 135
                 }
136 136
             }
137 137
         }
@@ -160,11 +160,11 @@  discard block
 block discarded – undo
160 160
         foreach ($model->field_settings() as $field_name => $field_obj) {
161 161
             if (
162 162
                 $model_version_info->fieldHasRenderedFormat($field_obj)
163
-                && isset($entity[ $field_name ])
164
-                && is_array($entity[ $field_name ])
165
-                && isset($entity[ $field_name ]['raw'])
163
+                && isset($entity[$field_name])
164
+                && is_array($entity[$field_name])
165
+                && isset($entity[$field_name]['raw'])
166 166
             ) {
167
-                unset($entity[ $field_name ]['raw']);
167
+                unset($entity[$field_name]['raw']);
168 168
             }
169 169
         }
170 170
         // theoretically we may want to filter out specific fields for specific models
@@ -190,7 +190,7 @@  discard block
 block discarded – undo
190 190
      */
191 191
     public static function verifyAtLeastPartialAccessTo($model, $model_action_context, $action_name = 'list')
192 192
     {
193
-        if (! Capabilities::currentUserHasPartialAccessTo($model, $model_action_context)) {
193
+        if ( ! Capabilities::currentUserHasPartialAccessTo($model, $model_action_context)) {
194 194
             $model_name_plural = EEH_Inflector::pluralize_and_lower($model->get_this_model_name());
195 195
             throw new RestException(
196 196
                 sprintf('rest_cannot_%s_%s', strtolower($action_name), $model_name_plural),
Please login to merge, or discard this patch.
Indentation   +177 added lines, -177 removed lines patch added patch discarded remove patch
@@ -17,190 +17,190 @@
 block discarded – undo
17 17
  */
18 18
 class Capabilities
19 19
 {
20
-    /**
21
-     * The current user can see at least SOME of these entities.
22
-     *
23
-     * @param EEM_Base $model
24
-     * @param string   $model_context one of the return values from EEM_Base::valid_cap_contexts()
25
-     * @return boolean
26
-     */
27
-    public static function currentUserHasPartialAccessTo($model, $model_context = EEM_Base::caps_read)
28
-    {
29
-        if (
30
-            apply_filters(
31
-                'FHEE__Capabilities__current_user_has_partial_access_to__override_begin',
32
-                false,
33
-                $model,
34
-                $model
35
-            )
36
-        ) {
37
-            return true;
38
-        }
39
-        foreach ($model->caps_missing($model_context) as $capability_name => $restriction_obj) {
40
-            if ($restriction_obj instanceof \EE_Return_None_Where_Conditions) {
41
-                return false;
42
-            }
43
-        }
44
-        if (
45
-            apply_filters(
46
-                'FHEE__Capabilities__current_user_has_partial_access_to__override_end',
47
-                false,
48
-                $model,
49
-                $model
50
-            )
51
-        ) {
52
-            return false;
53
-        }
54
-        return true;
55
-    }
20
+	/**
21
+	 * The current user can see at least SOME of these entities.
22
+	 *
23
+	 * @param EEM_Base $model
24
+	 * @param string   $model_context one of the return values from EEM_Base::valid_cap_contexts()
25
+	 * @return boolean
26
+	 */
27
+	public static function currentUserHasPartialAccessTo($model, $model_context = EEM_Base::caps_read)
28
+	{
29
+		if (
30
+			apply_filters(
31
+				'FHEE__Capabilities__current_user_has_partial_access_to__override_begin',
32
+				false,
33
+				$model,
34
+				$model
35
+			)
36
+		) {
37
+			return true;
38
+		}
39
+		foreach ($model->caps_missing($model_context) as $capability_name => $restriction_obj) {
40
+			if ($restriction_obj instanceof \EE_Return_None_Where_Conditions) {
41
+				return false;
42
+			}
43
+		}
44
+		if (
45
+			apply_filters(
46
+				'FHEE__Capabilities__current_user_has_partial_access_to__override_end',
47
+				false,
48
+				$model,
49
+				$model
50
+			)
51
+		) {
52
+			return false;
53
+		}
54
+		return true;
55
+	}
56 56
 
57 57
 
58
-    /**
59
-     * Gets an array of all the capabilities the current user is missing that affected
60
-     * the query
61
-     *
62
-     * @param EEM_Base $model
63
-     * @param string   $request_type one of the constants on WP_JSON_Server
64
-     * @return array
65
-     */
66
-    public static function getMissingPermissions($model, $request_type = EEM_Base::caps_read)
67
-    {
68
-        return $model->caps_missing($request_type);
69
-    }
58
+	/**
59
+	 * Gets an array of all the capabilities the current user is missing that affected
60
+	 * the query
61
+	 *
62
+	 * @param EEM_Base $model
63
+	 * @param string   $request_type one of the constants on WP_JSON_Server
64
+	 * @return array
65
+	 */
66
+	public static function getMissingPermissions($model, $request_type = EEM_Base::caps_read)
67
+	{
68
+		return $model->caps_missing($request_type);
69
+	}
70 70
 
71 71
 
72
-    /**
73
-     * Gets a string of all the capabilities the current user is missing that affected
74
-     * the query
75
-     *
76
-     * @param EEM_Base $model
77
-     * @param string   $model_context one of the return values from EEM_Base::valid_cap_contexts()
78
-     * @return string
79
-     */
80
-    public static function getMissingPermissionsString($model, $model_context = EEM_Base::caps_read)
81
-    {
82
-        return implode(',', array_keys(self::getMissingPermissions($model, $model_context)));
83
-    }
72
+	/**
73
+	 * Gets a string of all the capabilities the current user is missing that affected
74
+	 * the query
75
+	 *
76
+	 * @param EEM_Base $model
77
+	 * @param string   $model_context one of the return values from EEM_Base::valid_cap_contexts()
78
+	 * @return string
79
+	 */
80
+	public static function getMissingPermissionsString($model, $model_context = EEM_Base::caps_read)
81
+	{
82
+		return implode(',', array_keys(self::getMissingPermissions($model, $model_context)));
83
+	}
84 84
 
85
-    /**
86
-     * "Removes" password-protected fields. Currently that means setting their values to their default.
87
-     * @since 4.9.74.p
88
-     * @param array $entity
89
-     * @param EEM_Base $model
90
-     * @param ModelVersionInfo $model_version_info
91
-     * @return array
92
-     * @throws EE_Error
93
-     */
94
-    public static function filterOutPasswordProtectedFields(
95
-        $entity,
96
-        EEM_Base $model,
97
-        ModelVersionInfo $model_version_info
98
-    ) {
99
-        $has_password = $model->hasPassword();
100
-        if ($has_password) {
101
-            $entity[ $model->getPasswordField()->get_name() ] = ModelDataTranslator::prepareFieldValueForJson(
102
-                $model->getPasswordField(),
103
-                $model->getPasswordField()->get_default_value(),
104
-                $model_version_info->requestedVersion()
105
-            );
106
-        }
107
-        foreach ($model->field_settings() as $field_name => $field_obj) {
108
-            if (
109
-                $has_password
110
-                && $model->getPasswordField()->fieldIsProtected($field_name)
111
-                && $entity[ $field_name ]
112
-            ) {
113
-                $replacement_value = ModelDataTranslator::prepareFieldValueForJson(
114
-                    $field_obj,
115
-                    $field_obj->get_default_value(),
116
-                    $model_version_info->requestedVersion()
117
-                );
118
-                if ($model_version_info->fieldHasRenderedFormat($field_obj)) {
119
-                    $entity[ $field_name ]['rendered'] = $replacement_value;
120
-                } elseif ($model_version_info->fieldHasPrettyFormat($field_obj)) {
121
-                    $entity[ $field_name ]['raw'] = $replacement_value;
122
-                    $entity[ $field_name ]['pretty'] = ModelDataTranslator::prepareFieldValueForJson(
123
-                        $field_obj,
124
-                        $field_obj->prepare_for_pretty_echoing($field_obj->get_default_value()),
125
-                        $model_version_info->requestedVersion()
126
-                    );
127
-                } else {
128
-                    // this is most likely an excerpt field. (These should have also had "rendered" and "raw"
129
-                    // versions, but we missed that, and can't change it without breaking backward compatibility)
130
-                    // so just remove it (or rather, set its default)
131
-                    // API clients will just need to look to fields with rendered formats to know if these have
132
-                    // been redacted. Sorry.
133
-                    $entity[ $field_name ] = $replacement_value;
134
-                }
135
-            }
136
-        }
137
-        return $entity;
138
-    }
85
+	/**
86
+	 * "Removes" password-protected fields. Currently that means setting their values to their default.
87
+	 * @since 4.9.74.p
88
+	 * @param array $entity
89
+	 * @param EEM_Base $model
90
+	 * @param ModelVersionInfo $model_version_info
91
+	 * @return array
92
+	 * @throws EE_Error
93
+	 */
94
+	public static function filterOutPasswordProtectedFields(
95
+		$entity,
96
+		EEM_Base $model,
97
+		ModelVersionInfo $model_version_info
98
+	) {
99
+		$has_password = $model->hasPassword();
100
+		if ($has_password) {
101
+			$entity[ $model->getPasswordField()->get_name() ] = ModelDataTranslator::prepareFieldValueForJson(
102
+				$model->getPasswordField(),
103
+				$model->getPasswordField()->get_default_value(),
104
+				$model_version_info->requestedVersion()
105
+			);
106
+		}
107
+		foreach ($model->field_settings() as $field_name => $field_obj) {
108
+			if (
109
+				$has_password
110
+				&& $model->getPasswordField()->fieldIsProtected($field_name)
111
+				&& $entity[ $field_name ]
112
+			) {
113
+				$replacement_value = ModelDataTranslator::prepareFieldValueForJson(
114
+					$field_obj,
115
+					$field_obj->get_default_value(),
116
+					$model_version_info->requestedVersion()
117
+				);
118
+				if ($model_version_info->fieldHasRenderedFormat($field_obj)) {
119
+					$entity[ $field_name ]['rendered'] = $replacement_value;
120
+				} elseif ($model_version_info->fieldHasPrettyFormat($field_obj)) {
121
+					$entity[ $field_name ]['raw'] = $replacement_value;
122
+					$entity[ $field_name ]['pretty'] = ModelDataTranslator::prepareFieldValueForJson(
123
+						$field_obj,
124
+						$field_obj->prepare_for_pretty_echoing($field_obj->get_default_value()),
125
+						$model_version_info->requestedVersion()
126
+					);
127
+				} else {
128
+					// this is most likely an excerpt field. (These should have also had "rendered" and "raw"
129
+					// versions, but we missed that, and can't change it without breaking backward compatibility)
130
+					// so just remove it (or rather, set its default)
131
+					// API clients will just need to look to fields with rendered formats to know if these have
132
+					// been redacted. Sorry.
133
+					$entity[ $field_name ] = $replacement_value;
134
+				}
135
+			}
136
+		}
137
+		return $entity;
138
+	}
139 139
 
140 140
 
141
-    /**
142
-     * Takes a entity that's ready to be returned and removes fields which the user shouldn't be able to access.
143
-     *
144
-     * @param array $entity
145
-     * @param EEM_Base $model
146
-     * @param string $request_type one of the return values from EEM_Base::valid_cap_contexts()
147
-     * @param ModelVersionInfo $model_version_info
148
-     * @param string $primary_key_string result of EEM_Base::get_index_primary_key_string(), so that we can
149
-     *                                               use this with models that have no primary key
150
-     * @return array ready for converting into json
151
-     */
152
-    public static function filterOutInaccessibleEntityFields(
153
-        $entity,
154
-        $model,
155
-        $request_type,
156
-        $model_version_info,
157
-        $primary_key_string = null
158
-    ) {
159
-        foreach ($model->field_settings() as $field_name => $field_obj) {
160
-            if (
161
-                $model_version_info->fieldHasRenderedFormat($field_obj)
162
-                && isset($entity[ $field_name ])
163
-                && is_array($entity[ $field_name ])
164
-                && isset($entity[ $field_name ]['raw'])
165
-            ) {
166
-                unset($entity[ $field_name ]['raw']);
167
-            }
168
-        }
169
-        // theoretically we may want to filter out specific fields for specific models
170
-        return apply_filters(
171
-            'FHEE__Capabilities__filter_out_inaccessible_entity_fields',
172
-            $entity,
173
-            $model,
174
-            $request_type
175
-        );
176
-    }
141
+	/**
142
+	 * Takes a entity that's ready to be returned and removes fields which the user shouldn't be able to access.
143
+	 *
144
+	 * @param array $entity
145
+	 * @param EEM_Base $model
146
+	 * @param string $request_type one of the return values from EEM_Base::valid_cap_contexts()
147
+	 * @param ModelVersionInfo $model_version_info
148
+	 * @param string $primary_key_string result of EEM_Base::get_index_primary_key_string(), so that we can
149
+	 *                                               use this with models that have no primary key
150
+	 * @return array ready for converting into json
151
+	 */
152
+	public static function filterOutInaccessibleEntityFields(
153
+		$entity,
154
+		$model,
155
+		$request_type,
156
+		$model_version_info,
157
+		$primary_key_string = null
158
+	) {
159
+		foreach ($model->field_settings() as $field_name => $field_obj) {
160
+			if (
161
+				$model_version_info->fieldHasRenderedFormat($field_obj)
162
+				&& isset($entity[ $field_name ])
163
+				&& is_array($entity[ $field_name ])
164
+				&& isset($entity[ $field_name ]['raw'])
165
+			) {
166
+				unset($entity[ $field_name ]['raw']);
167
+			}
168
+		}
169
+		// theoretically we may want to filter out specific fields for specific models
170
+		return apply_filters(
171
+			'FHEE__Capabilities__filter_out_inaccessible_entity_fields',
172
+			$entity,
173
+			$model,
174
+			$request_type
175
+		);
176
+	}
177 177
 
178 178
 
179
-    /**
180
-     * Verifies the current user has at least partial access to do this action on this model.
181
-     * If not, throws an exception (so we can define the code that sets up this error object
182
-     * once)
183
-     *
184
-     * @param EEM_Base $model
185
-     * @param string   $model_action_context
186
-     * @param string   $action_name
187
-     * @return void
188
-     * @throws RestException
189
-     */
190
-    public static function verifyAtLeastPartialAccessTo($model, $model_action_context, $action_name = 'list')
191
-    {
192
-        if (! Capabilities::currentUserHasPartialAccessTo($model, $model_action_context)) {
193
-            $model_name_plural = EEH_Inflector::pluralize_and_lower($model->get_this_model_name());
194
-            throw new RestException(
195
-                sprintf('rest_cannot_%s_%s', strtolower($action_name), $model_name_plural),
196
-                sprintf(
197
-                    esc_html__('Sorry, you are not allowed to %1$s %2$s. Missing permissions: %3$s', 'event_espresso'),
198
-                    $action_name,
199
-                    $model_name_plural,
200
-                    Capabilities::getMissingPermissionsString($model, $model_action_context)
201
-                ),
202
-                array('status' => 403)
203
-            );
204
-        }
205
-    }
179
+	/**
180
+	 * Verifies the current user has at least partial access to do this action on this model.
181
+	 * If not, throws an exception (so we can define the code that sets up this error object
182
+	 * once)
183
+	 *
184
+	 * @param EEM_Base $model
185
+	 * @param string   $model_action_context
186
+	 * @param string   $action_name
187
+	 * @return void
188
+	 * @throws RestException
189
+	 */
190
+	public static function verifyAtLeastPartialAccessTo($model, $model_action_context, $action_name = 'list')
191
+	{
192
+		if (! Capabilities::currentUserHasPartialAccessTo($model, $model_action_context)) {
193
+			$model_name_plural = EEH_Inflector::pluralize_and_lower($model->get_this_model_name());
194
+			throw new RestException(
195
+				sprintf('rest_cannot_%s_%s', strtolower($action_name), $model_name_plural),
196
+				sprintf(
197
+					esc_html__('Sorry, you are not allowed to %1$s %2$s. Missing permissions: %3$s', 'event_espresso'),
198
+					$action_name,
199
+					$model_name_plural,
200
+					Capabilities::getMissingPermissionsString($model, $model_action_context)
201
+				),
202
+				array('status' => 403)
203
+			);
204
+		}
205
+	}
206 206
 }
Please login to merge, or discard this patch.
core/libraries/rest_api/RestIncomingQueryParamMetadata.php 2 patches
Indentation   +701 added lines, -701 removed lines patch added patch discarded remove patch
@@ -28,707 +28,707 @@
 block discarded – undo
28 28
  */
29 29
 class RestIncomingQueryParamMetadata
30 30
 {
31
-    private $query_param_key;
32
-    private $query_param_value;
33
-    /**
34
-     * @var RestIncomingQueryParamContext
35
-     */
36
-    private $context;
37
-
38
-    /**
39
-     * @var EE_Model_Field_Base|null
40
-     */
41
-    private $field;
42
-
43
-    /**
44
-     * @var string same as $query_param_key but has the * and anything after it removed
45
-     */
46
-    private $query_param_key_sans_stars;
47
-
48
-    /**
49
-     * @var string for timezone or timezone offset
50
-     */
51
-    private $timezone;
52
-
53
-    /**
54
-     * @var boolean if the field in $query_param_key is for a GMT field (eg `EVT_modified_gmt`)
55
-     */
56
-    private $is_gmt_field = false;
57
-
58
-    /**
59
-     * RestIncomingQueryParamMetadata constructor.
60
-     * You probably want to call
61
-     * @param string $query_param_key
62
-     * @param string $query_param_value
63
-     * @param RestIncomingQueryParamContext $context
64
-     */
65
-    public function __construct($query_param_key, $query_param_value, RestIncomingQueryParamContext $context)
66
-    {
67
-        $this->query_param_key = $query_param_key;
68
-        $this->query_param_value = $query_param_value;
69
-        $this->context = $context;
70
-        $this->determineFieldAndTimezone();
71
-    }
72
-
73
-    /**
74
-     * Gets the query parameter key. This may have been modified (see setQueryParamValue())
75
-     * @return string
76
-     */
77
-    public function getQueryParamKey()
78
-    {
79
-        return $this->query_param_key;
80
-    }
81
-
82
-    /**
83
-     * Modifies the query parameter key passed in (Eg this is done when rewriting the simplified specified operator REST
84
-     * query parameters into the legacy structure)
85
-     * @param string|array|int|float $query_param_value
86
-     */
87
-    private function setQueryParamValue($query_param_value)
88
-    {
89
-        $this->query_param_value = $query_param_value;
90
-    }
91
-
92
-    /**
93
-     * Gets the original query parameter value passed in.
94
-     * @return string
95
-     */
96
-    public function getQueryParamValue()
97
-    {
98
-        return $this->query_param_value;
99
-    }
100
-
101
-    /**
102
-     * Gets the context object.
103
-     * @return RestIncomingQueryParamContext
104
-     */
105
-    public function getContext()
106
-    {
107
-        return $this->context;
108
-    }
109
-
110
-    /**
111
-     * Sets the query parameter key. This may be used to rewrite a key into its non-GMT alternative.
112
-     * @param string $query_param_key
113
-     */
114
-    private function setQueryParamKey($query_param_key)
115
-    {
116
-        $this->query_param_key = $query_param_key;
117
-    }
118
-
119
-    /**
120
-     * Gets the field the query parameter key indicated. This may be null (in cases where the query parameter key
121
-     * did not indicate a field, eg if it were `OR`).
122
-     * @return EE_Model_Field_Base|null
123
-     */
124
-    public function getField()
125
-    {
126
-        return $this->field;
127
-    }
128
-
129
-    /**
130
-     * Gets the query parameter key (with the star and everything afterwards removed).
131
-     * @return string
132
-     */
133
-    public function getQueryParamKeySansStars()
134
-    {
135
-        return $this->query_param_key_sans_stars;
136
-    }
137
-
138
-    /**
139
-     * Gets the timezone associated with this model (the site timezone, except for GMT datetime fields).
140
-     * @return string
141
-     */
142
-    public function getTimezone()
143
-    {
144
-        return $this->timezone;
145
-    }
146
-
147
-    /**
148
-     * Returns whether or not this is a GMT field
149
-     * @return boolean
150
-     */
151
-    public function isGmtField()
152
-    {
153
-        return $this->is_gmt_field;
154
-    }
155
-
156
-    /**
157
-     * Sets the field indicated by the query parameter key (might be null).
158
-     * @param EE_Model_Field_Base|null $field
159
-     */
160
-    private function setField(EE_Model_Field_Base $field = null)
161
-    {
162
-        $this->field = $field;
163
-    }
164
-
165
-    /**
166
-     * Sets the query parameter key-with-stars-removed.
167
-     * @param string $query_param_key_sans_stars
168
-     */
169
-    private function setQueryParamKeySansStars($query_param_key_sans_stars)
170
-    {
171
-        $this->query_param_key_sans_stars = $query_param_key_sans_stars;
172
-    }
173
-
174
-    /**
175
-     * Sets the timezone (this could be a timezeon offset string).
176
-     * @param string $timezone
177
-     */
178
-    private function setTimezone($timezone)
179
-    {
180
-        $this->timezone = $timezone;
181
-    }
182
-
183
-    /**
184
-     * @param mixed $is_gmt_field
185
-     */
186
-    private function setIsGmtField($is_gmt_field)
187
-    {
188
-        $this->is_gmt_field = $is_gmt_field;
189
-    }
190
-
191
-    /**
192
-     * Determines what field, query param name, and query param name without stars, and timezone to use.
193
-     * @since 4.9.72.p
194
-     * @type EE_Model_Field_Base $field
195
-     * @return void {
196
-     * @throws EE_Error
197
-     * @throws InvalidDataTypeException
198
-     * @throws InvalidInterfaceException
199
-     * @throws InvalidArgumentException
200
-     */
201
-    private function determineFieldAndTimezone()
202
-    {
203
-        $this->setQueryParamKeySansStars(ModelDataTranslator::removeStarsAndAnythingAfterFromConditionQueryParamKey(
204
-            $this->getQueryParamKey()
205
-        ));
206
-        $this->setField(ModelDataTranslator::deduceFieldFromQueryParam(
207
-            $this->getQueryParamKeySansStars(),
208
-            $this->getContext()->getModel()
209
-        ));
210
-        // double-check is it a *_gmt field?
211
-        if (
212
-            !$this->getField() instanceof EE_Model_Field_Base
213
-            && ModelDataTranslator::isGmtDateFieldName($this->getQueryParamKeySansStars())
214
-        ) {
215
-            // yep, take off '_gmt', and find the field
216
-            $this->setQueryParamKey(ModelDataTranslator::removeGmtFromFieldName($this->getQueryParamKeySansStars()));
217
-            $this->setField(ModelDataTranslator::deduceFieldFromQueryParam(
218
-                $this->getQueryParamKey(),
219
-                $this->context->getModel()
220
-            ));
221
-            $this->setTimezone('UTC');
222
-            $this->setIsGmtField(true);
223
-        } elseif ($this->getField() instanceof EE_Datetime_Field) {
224
-            // so it's not a GMT field. Set the timezone on the model to the default
225
-            $this->setTimezone(EEH_DTT_Helper::get_valid_timezone_string());
226
-        } else {
227
-            // just keep using what's already set for the timezone
228
-            $this->setTimezone($this->context->getModel()->get_timezone());
229
-        }
230
-        $this->assertOnlyAdminCanReadPasswordFields();
231
-    }
232
-
233
-    /**
234
-     * Throws an exception if a non-admin is trying to query by password.
235
-     * @since 4.9.74.p
236
-     * @throws RestException
237
-     */
238
-    private function assertOnlyAdminCanReadPasswordFields()
239
-    {
240
-        if (
241
-            $this->getField() instanceof EE_Password_Field
242
-            && ! current_user_can(EE_Restriction_Generator_Base::get_default_restrictions_cap())
243
-        ) {
244
-            // only full admins can query by password. sorry bub!
245
-            throw new RestException(
246
-                'only_admins_can_query_by_password',
247
-                // @codingStandardsIgnoreStart
248
-                esc_html__('You attempted to filter by a password field without the needed privileges. Only a full admin is allowed to do that.', 'event_espresso'),
249
-                // @codingStandardsIgnoreEnd
250
-                array(
251
-                    'status' => 403
252
-                )
253
-            );
254
-        }
255
-    }
256
-
257
-    /**
258
-     * Given a ton of input, determines the value to use for the models.
259
-     * @since 4.9.72.p
260
-     * @return array|null
261
-     * @throws DomainException
262
-     * @throws EE_Error
263
-     * @throws RestException
264
-     * @throws DomainException
265
-     */
266
-    public function determineConditionsQueryParameterValue()
267
-    {
268
-        if ($this->valueIsArrayDuringRead()) {
269
-            return $this->determineModelValueGivenRestInputArray();
270
-        }
271
-        return ModelDataTranslator::prepareFieldValueFromJson(
272
-            $this->getField(),
273
-            $this->getQueryParamValue(),
274
-            $this->getContext()->getRequestedVersion(),
275
-            $this->getTimezone()
276
-        );
277
-    }
278
-
279
-    /**
280
-     * Given that the array value provided was itself an array, handles finding the correct value to pass to the model.
281
-     * @since 4.9.72.p
282
-     * @return array|null
283
-     * @throws RestException
284
-     */
285
-    private function determineModelValueGivenRestInputArray()
286
-    {
287
-        $this->transformSimplifiedSpecifiedOperatorSyntaxIntoStandardSyntax();
288
-        // did they specify an operator?
289
-        if ($this->valueIsLegacySpecifiedOperator()) {
290
-            $query_param_value = $this->getQueryParamValue();
291
-            $sub_array_key = $query_param_value[0];
292
-            $translated_value = array($sub_array_key);
293
-            if ($this->operatorIsNAry($sub_array_key)) {
294
-                $translated_value[] = $this->prepareValuesFromJson($query_param_value[1]);
295
-            } elseif ($this->operatorIsTernary($sub_array_key)) {
296
-                $translated_value[] = array(
297
-                    $this->prepareValuesFromJson($query_param_value[1][0]),
298
-                    $this->prepareValuesFromJson($query_param_value[1][1])
299
-                );
300
-            } elseif ($this->operatorIsLike($sub_array_key)) {
301
-                // we want to leave this value mostly-as-is (eg don't force it to be a float
302
-                // or a boolean or an enum value. Leave it as-is with wildcards etc)
303
-                // but do verify it at least doesn't have any serialized data
304
-                ModelDataTranslator::throwExceptionIfContainsSerializedData($query_param_value[1]);
305
-                $translated_value[] = $query_param_value[1];
306
-            } elseif ($this->operatorIsUnary($sub_array_key)) {
307
-                // no arguments should have been provided, so don't look for any
308
-            } elseif ($this->operatorisBinary($sub_array_key)) {
309
-                // it's a valid operator, but none of the exceptions. Treat it normally.
310
-                $translated_value[] = $this->prepareValuesFromJson($query_param_value[1]);
311
-            } else {
312
-                // so they provided a valid operator, but wrong number of arguments
313
-                $this->throwWrongNumberOfArgsExceptionIfDebugging($sub_array_key);
314
-                $translated_value = null;
315
-            }
316
-        } else {
317
-            // so they didn't provide a valid operator
318
-            // if we aren't in debug mode, then just try our best to fulfill the user's request
319
-            $this->throwInvalidOperatorExceptionIfDebugging();
320
-            $translated_value = null;
321
-        }
322
-        return $translated_value;
323
-    }
324
-
325
-    /**
326
-     * Returns if this request is a "read" request and the value provided was an array.
327
-     * This will indicate is such things as `array('<', 123)` and `array('IN', array(1,2,3))` are acceptable or not.
328
-     * @since 4.9.72.p
329
-     * @return boolean
330
-     */
331
-    private function valueIsArrayDuringRead()
332
-    {
333
-        return !$this->getContext()->isWriting() && is_array($this->getQueryParamValue());
334
-    }
335
-
336
-    /**
337
-     * Returns if the value provided was an associative array (we should have already verified it's an array of some
338
-     * sort). If the value is an associative array, it had better be in the simplified specified operator structure.
339
-     * @since 4.9.72.p
340
-     * @return boolean
341
-     */
342
-    private function valueIsAssociativeArray()
343
-    {
344
-        return !EEH_Array::is_array_numerically_and_sequentially_indexed($this->getQueryParamValue());
345
-    }
346
-
347
-    /**
348
-     * Checks if the array value is itself an array that fits into the simplified specified operator structure
349
-     * (eg `array('!=' => 123)`).
350
-     * @since 4.9.72.p
351
-     * @return boolean
352
-     */
353
-    private function valueIsSimplifiedSpecifiedOperator()
354
-    {
355
-        return count($this->getQueryParamValue()) === 1
356
-            && array_key_exists(
357
-                key($this->getQueryParamValue()),
358
-                $this->getContext()->getModel()->valid_operators()
359
-            );
360
-    }
361
-
362
-    /**
363
-     * Throws an exception if the sub-value is an array (eg `array('!=' => array())`). It needs to just be a string,
364
-     * of either comma-separated-values, or a JSON array.
365
-     * @since 4.9.72.p
366
-     * @param $sub_array_key
367
-     * @param $sub_array_value
368
-     * @throws RestException
369
-     */
370
-    private function assertSubValueIsntArray($sub_array_key, $sub_array_value)
371
-    {
372
-        if (is_array($sub_array_value) && EED_Core_Rest_Api::debugMode()) {
373
-            throw new RestException(
374
-                'csv_or_json_string_only',
375
-                sprintf(
376
-                    /* translators: 1: variable name*/
377
-                    esc_html__(
378
-                        'The value provided for the operator "%1$s" should be comma-separated value string or a JSON array.',
379
-                        'event_espresso'
380
-                    ),
381
-                    $sub_array_key
382
-                ),
383
-                array(
384
-                    'status' => 400,
385
-                )
386
-            );
387
-        }
388
-    }
389
-
390
-    /**
391
-     * Determines if the sub-array key is an operator taking 3 or more operators.
392
-     * @since 4.9.72.p
393
-     * @param $sub_array_key
394
-     * @return boolean
395
-     */
396
-    private function subArrayKeyIsNonBinaryOperator($sub_array_key)
397
-    {
398
-        return array_key_exists(
399
-            $sub_array_key,
400
-            array_merge(
401
-                $this->getContext()->getModel()->valid_in_style_operators(),
402
-                $this->getContext()->getModel()->valid_between_style_operators()
403
-            )
404
-        );
405
-    }
406
-
407
-    /**
408
-     * Given that the $sub_array_key is a string, checks if it's an operator taking only 1 argument.
409
-     * @since 4.9.72.p
410
-     * @param string $sub_array_key
411
-     * @return boolean
412
-     */
413
-    private function subArrayKeyIsUnaryOperator($sub_array_key)
414
-    {
415
-        return array_key_exists(
416
-            $sub_array_key,
417
-            $this->getContext()->getModel()->valid_null_style_operators()
418
-        );
419
-    }
420
-
421
-    /**
422
-     * Parses the $sub_array_value string into an array (given it could either be a comma-separated-list or a JSON
423
-     * array). eg `"1,2,3"` or `"[1,2,3]"` into `array(1,2,3)`.
424
-     * @since 4.9.72.p
425
-     * @param $sub_array_value
426
-     * @return array|mixed|object
427
-     */
428
-    private function extractQuickStyleSpecifiedOperatorValue($sub_array_value)
429
-    {
430
-        // the value should be JSON or CSV
431
-        $values = json_decode($sub_array_value);
432
-        if (!is_array($values)) {
433
-            $values = array_filter(
434
-                array_map(
435
-                    'trim',
436
-                    explode(
437
-                        ',',
438
-                        $sub_array_value
439
-                    )
440
-                )
441
-            );
442
-        }
443
-        return $values;
444
-    }
445
-
446
-    /**
447
-     * Throws an exception if the value isn't a simplified specified operator (only called when we expect that).
448
-     * @since 4.9.72.p
449
-     * @throws RestException
450
-     */
451
-    private function assertSimplifiedSpecifiedOperator()
452
-    {
453
-        if (!$this->valueIsSimplifiedSpecifiedOperator() && EED_Core_Rest_Api::debugMode()) {
454
-            throw new RestException(
455
-                'numerically_indexed_array_of_values_only',
456
-                sprintf(
457
-                    /* translators: 1: variable name*/
458
-                    esc_html__(
459
-                        'The array provided for the parameter "%1$s" should be numerically indexed.',
460
-                        'event_espresso'
461
-                    ),
462
-                    $this->getQueryParamKey()
463
-                ),
464
-                array(
465
-                    'status' => 400,
466
-                )
467
-            );
468
-        }
469
-    }
470
-
471
-    /**
472
-     * If query_param_value were in the simplified specific operator structure, change it into the legacy structure.
473
-     * @since 4.9.72.p
474
-     * @throws RestException
475
-     */
476
-    private function transformSimplifiedSpecifiedOperatorSyntaxIntoStandardSyntax()
477
-    {
478
-        if ($this->valueIsAssociativeArray()) {
479
-            $this->assertSimplifiedSpecifiedOperator();
480
-            $query_param_value = $this->getQueryParamValue();
481
-            $sub_array_value = reset($query_param_value);
482
-            $sub_array_key = key($query_param_value);
483
-            $this->assertSubValueIsntArray($sub_array_key, $sub_array_value);
484
-            // they're doing something like "&where[EVT_ID][IN]=1,2,3" or "&where[EVT_ID][>]=5"
485
-            if ($this->subArrayKeyIsNonBinaryOperator($sub_array_key)) {
486
-                $this->setQueryParamValue(array(
487
-                    $sub_array_key,
488
-                    $this->extractQuickStyleSpecifiedOperatorValue($sub_array_value)
489
-                ));
490
-            } elseif ($this->subArrayKeyIsUnaryOperator($sub_array_key)) {
491
-                $this->setQueryParamValue(array($sub_array_key));
492
-            } else {
493
-                $this->setQueryParamValue(array($sub_array_key, $sub_array_value));
494
-            }
495
-        }
496
-    }
497
-
498
-    /**
499
-     * Returns true is the value is an array using the legacy structure to specify the operator. Eg `array('!=',123)`.
500
-     * @since 4.9.72.p
501
-     * @return boolean
502
-     */
503
-    private function valueIsLegacySpecifiedOperator()
504
-    {
505
-        $valid_operators = $this->getContext()->getModel()->valid_operators();
506
-        $query_param_value = $this->getQueryParamValue();
507
-        return isset($query_param_value[0])
508
-            && isset($valid_operators[ $query_param_value[0] ]);
509
-    }
510
-
511
-    /**
512
-     * Returns true if the value specified operator accepts arbitrary number of arguments, like "IN".
513
-     * @since 4.9.72.p
514
-     * @param $operator
515
-     * @return boolean
516
-     */
517
-    private function operatorIsNAry($operator)
518
-    {
519
-        $valueArray = $this->getQueryParamValue();
520
-        return array_key_exists(
521
-            $operator,
522
-            $this->getContext()->getModel()->valid_in_style_operators()
523
-        )
524
-            && isset($valueArray[1])
525
-            && is_array($valueArray[1])
526
-            && !isset($valueArray[2]);
527
-    }
528
-
529
-    /**
530
-     * Returns true if the operator accepts 3 arguments (eg "BETWEEN").
531
-     * So we're looking for a value that looks like
532
-     * `array('BETWEEN', array('2015-01-01T00:00:00', '2016-01-01T00:00:00'))`.
533
-     * @since 4.9.72.p
534
-     * @param $operator
535
-     * @return boolean
536
-     */
537
-    private function operatorIsTernary($operator)
538
-    {
539
-        $query_param_value = $this->getQueryParamValue();
540
-        return array_key_exists($operator, $this->getContext()->getModel()->valid_between_style_operators())
541
-            && isset($query_param_value[1])
542
-            && is_array($query_param_value[1])
543
-            && isset($query_param_value[1][0], $query_param_value[1][1])
544
-            && !isset($query_param_value[1][2])
545
-            && !isset($query_param_value[2]);
546
-    }
547
-
548
-    /**
549
-     * Returns true if the operator is a similar to LIKE, indicating the value may have wildcards we should leave alone.
550
-     * @since 4.9.72.p
551
-     * @param $operator
552
-     * @return boolean
553
-     */
554
-    private function operatorIsLike($operator)
555
-    {
556
-        $query_param_value = $this->getQueryParamValue();
557
-        return array_key_exists($operator, $this->getContext()->getModel()->valid_like_style_operators())
558
-            && isset($query_param_value[1])
559
-            && !isset($query_param_value[2]);
560
-    }
561
-
562
-    /**
563
-     * Returns true if the operator only takes one argument (eg it's like `IS NULL`).
564
-     * @since 4.9.72.p
565
-     * @param $operator
566
-     * @return boolean
567
-     */
568
-    private function operatorIsUnary($operator)
569
-    {
570
-        $query_param_value = $this->getQueryParamValue();
571
-        return array_key_exists($operator, $this->getContext()->getModel()->valid_null_style_operators())
572
-            && !isset($query_param_value[1]);
573
-    }
574
-
575
-    /**
576
-     * Returns true if the operator specified is a binary opeator (eg `=`, `!=`)
577
-     * @since 4.9.72.p
578
-     * @param $operator
579
-     * @return boolean
580
-     */
581
-    private function operatorisBinary($operator)
582
-    {
583
-        $query_param_value = $this->getQueryParamValue();
584
-        $model = $this->getContext()->getModel();
585
-        return isset($query_param_value[1])
586
-            && !isset($query_param_value[2])
587
-            && !array_key_exists(
588
-                $operator,
589
-                array_merge(
590
-                    $model->valid_in_style_operators(),
591
-                    $model->valid_null_style_operators(),
592
-                    $model->valid_like_style_operators(),
593
-                    $model->valid_between_style_operators()
594
-                )
595
-            );
596
-    }
597
-
598
-    /**
599
-     * If we're debugging, throws an exception saying that the wrong number of arguments was provided.
600
-     * @since 4.9.72.p
601
-     * @param $operator
602
-     * @throws RestException
603
-     */
604
-    private function throwWrongNumberOfArgsExceptionIfDebugging($operator)
605
-    {
606
-        if (EED_Core_Rest_Api::debugMode()) {
607
-            throw new RestException(
608
-                'wrong_number_of_arguments',
609
-                sprintf(
610
-                    esc_html__(
611
-                        'The operator you provided, "%1$s" had the wrong number of arguments',
612
-                        'event_espresso'
613
-                    ),
614
-                    $operator
615
-                ),
616
-                array(
617
-                    'status' => 400,
618
-                )
619
-            );
620
-        }
621
-    }
622
-
623
-    /**
624
-     * Wrapper for ModelDataTranslator::prepareFieldValuesFromJson(), just a tad more DRY.
625
-     * @since 4.9.72.p
626
-     * @param $value
627
-     * @return mixed
628
-     * @throws RestException
629
-     */
630
-    private function prepareValuesFromJson($value)
631
-    {
632
-        return ModelDataTranslator::prepareFieldValuesFromJson(
633
-            $this->getField(),
634
-            $value,
635
-            $this->getContext()->getRequestedVersion(),
636
-            $this->getTimezone()
637
-        );
638
-    }
639
-
640
-    /**
641
-     * Throws an exception if an invalid operator was specified and we're debugging.
642
-     * @since 4.9.72.p
643
-     * @throws RestException
644
-     */
645
-    private function throwInvalidOperatorExceptionIfDebugging()
646
-    {
647
-        // so they didn't provide a valid operator
648
-        if (EED_Core_Rest_Api::debugMode()) {
649
-            throw new RestException(
650
-                'invalid_operator',
651
-                sprintf(
652
-                    esc_html__(
653
-                        'You provided an invalid parameter, with key "%1$s" and value "%2$s"',
654
-                        'event_espresso'
655
-                    ),
656
-                    $this->getQueryParamKey(),
657
-                    $this->getQueryParamValue()
658
-                ),
659
-                array(
660
-                    'status' => 400,
661
-                )
662
-            );
663
-        }
664
-    }
665
-
666
-    /**
667
-     * Returns true if the query_param_key was a logic query parameter, eg `OR`, `AND`, `NOT`, `OR*`, etc.
668
-     * @since 4.9.72.p
669
-     * @return boolean
670
-     */
671
-    private function isLogicQueryParam()
672
-    {
673
-        return in_array($this->getQueryParamKeySansStars(), $this->getContext()->getModel()->logic_query_param_keys());
674
-    }
675
-
676
-
677
-    /**
678
-     * If the query param isn't for a field, it must be a nested query parameter which requires different logic.
679
-     * @since 4.9.72.p
680
-     * @return array
681
-     * @throws DomainException
682
-     * @throws EE_Error
683
-     * @throws RestException
684
-     * @throws InvalidDataTypeException
685
-     * @throws InvalidInterfaceException
686
-     * @throws InvalidArgumentException
687
-     */
688
-    public function determineNestedConditionQueryParameters()
689
-    {
690
-
691
-        // so this param doesn't correspond to a field eh?
692
-        if ($this->getContext()->isWriting()) {
693
-            // always tell API clients about invalid parameters when they're creating data. Otherwise,
694
-            // they are probably going to create invalid data
695
-            throw new RestException(
696
-                'invalid_field',
697
-                sprintf(
698
-                    /* translators: 1: variable name */
699
-                    esc_html__('You have provided an invalid parameter: "%1$s"', 'event_espresso'),
700
-                    $this->getQueryParamKey()
701
-                )
702
-            );
703
-        }
704
-        // so it's not for a field, is it a logic query param key?
705
-        if ($this->isLogicQueryParam()) {
706
-            return ModelDataTranslator::prepareConditionsQueryParamsForModels(
707
-                $this->getQueryParamValue(),
708
-                $this->getContext()->getModel(),
709
-                $this->getContext()->getRequestedVersion()
710
-            );
711
-        }
712
-        if (EED_Core_Rest_Api::debugMode()) {
713
-            // only tell API clients they got it wrong if we're in debug mode
714
-            // otherwise try our best ot fulfill their request by ignoring this invalid data
715
-            throw new RestException(
716
-                'invalid_parameter',
717
-                sprintf(
718
-                    /* translators: 1: variable name */
719
-                    esc_html__(
720
-                        'You provided an invalid parameter, with key "%1$s"',
721
-                        'event_espresso'
722
-                    ),
723
-                    $this->getQueryParamKey()
724
-                ),
725
-                array(
726
-                    'status' => 400,
727
-                )
728
-            );
729
-        }
730
-        return null;
731
-    }
31
+	private $query_param_key;
32
+	private $query_param_value;
33
+	/**
34
+	 * @var RestIncomingQueryParamContext
35
+	 */
36
+	private $context;
37
+
38
+	/**
39
+	 * @var EE_Model_Field_Base|null
40
+	 */
41
+	private $field;
42
+
43
+	/**
44
+	 * @var string same as $query_param_key but has the * and anything after it removed
45
+	 */
46
+	private $query_param_key_sans_stars;
47
+
48
+	/**
49
+	 * @var string for timezone or timezone offset
50
+	 */
51
+	private $timezone;
52
+
53
+	/**
54
+	 * @var boolean if the field in $query_param_key is for a GMT field (eg `EVT_modified_gmt`)
55
+	 */
56
+	private $is_gmt_field = false;
57
+
58
+	/**
59
+	 * RestIncomingQueryParamMetadata constructor.
60
+	 * You probably want to call
61
+	 * @param string $query_param_key
62
+	 * @param string $query_param_value
63
+	 * @param RestIncomingQueryParamContext $context
64
+	 */
65
+	public function __construct($query_param_key, $query_param_value, RestIncomingQueryParamContext $context)
66
+	{
67
+		$this->query_param_key = $query_param_key;
68
+		$this->query_param_value = $query_param_value;
69
+		$this->context = $context;
70
+		$this->determineFieldAndTimezone();
71
+	}
72
+
73
+	/**
74
+	 * Gets the query parameter key. This may have been modified (see setQueryParamValue())
75
+	 * @return string
76
+	 */
77
+	public function getQueryParamKey()
78
+	{
79
+		return $this->query_param_key;
80
+	}
81
+
82
+	/**
83
+	 * Modifies the query parameter key passed in (Eg this is done when rewriting the simplified specified operator REST
84
+	 * query parameters into the legacy structure)
85
+	 * @param string|array|int|float $query_param_value
86
+	 */
87
+	private function setQueryParamValue($query_param_value)
88
+	{
89
+		$this->query_param_value = $query_param_value;
90
+	}
91
+
92
+	/**
93
+	 * Gets the original query parameter value passed in.
94
+	 * @return string
95
+	 */
96
+	public function getQueryParamValue()
97
+	{
98
+		return $this->query_param_value;
99
+	}
100
+
101
+	/**
102
+	 * Gets the context object.
103
+	 * @return RestIncomingQueryParamContext
104
+	 */
105
+	public function getContext()
106
+	{
107
+		return $this->context;
108
+	}
109
+
110
+	/**
111
+	 * Sets the query parameter key. This may be used to rewrite a key into its non-GMT alternative.
112
+	 * @param string $query_param_key
113
+	 */
114
+	private function setQueryParamKey($query_param_key)
115
+	{
116
+		$this->query_param_key = $query_param_key;
117
+	}
118
+
119
+	/**
120
+	 * Gets the field the query parameter key indicated. This may be null (in cases where the query parameter key
121
+	 * did not indicate a field, eg if it were `OR`).
122
+	 * @return EE_Model_Field_Base|null
123
+	 */
124
+	public function getField()
125
+	{
126
+		return $this->field;
127
+	}
128
+
129
+	/**
130
+	 * Gets the query parameter key (with the star and everything afterwards removed).
131
+	 * @return string
132
+	 */
133
+	public function getQueryParamKeySansStars()
134
+	{
135
+		return $this->query_param_key_sans_stars;
136
+	}
137
+
138
+	/**
139
+	 * Gets the timezone associated with this model (the site timezone, except for GMT datetime fields).
140
+	 * @return string
141
+	 */
142
+	public function getTimezone()
143
+	{
144
+		return $this->timezone;
145
+	}
146
+
147
+	/**
148
+	 * Returns whether or not this is a GMT field
149
+	 * @return boolean
150
+	 */
151
+	public function isGmtField()
152
+	{
153
+		return $this->is_gmt_field;
154
+	}
155
+
156
+	/**
157
+	 * Sets the field indicated by the query parameter key (might be null).
158
+	 * @param EE_Model_Field_Base|null $field
159
+	 */
160
+	private function setField(EE_Model_Field_Base $field = null)
161
+	{
162
+		$this->field = $field;
163
+	}
164
+
165
+	/**
166
+	 * Sets the query parameter key-with-stars-removed.
167
+	 * @param string $query_param_key_sans_stars
168
+	 */
169
+	private function setQueryParamKeySansStars($query_param_key_sans_stars)
170
+	{
171
+		$this->query_param_key_sans_stars = $query_param_key_sans_stars;
172
+	}
173
+
174
+	/**
175
+	 * Sets the timezone (this could be a timezeon offset string).
176
+	 * @param string $timezone
177
+	 */
178
+	private function setTimezone($timezone)
179
+	{
180
+		$this->timezone = $timezone;
181
+	}
182
+
183
+	/**
184
+	 * @param mixed $is_gmt_field
185
+	 */
186
+	private function setIsGmtField($is_gmt_field)
187
+	{
188
+		$this->is_gmt_field = $is_gmt_field;
189
+	}
190
+
191
+	/**
192
+	 * Determines what field, query param name, and query param name without stars, and timezone to use.
193
+	 * @since 4.9.72.p
194
+	 * @type EE_Model_Field_Base $field
195
+	 * @return void {
196
+	 * @throws EE_Error
197
+	 * @throws InvalidDataTypeException
198
+	 * @throws InvalidInterfaceException
199
+	 * @throws InvalidArgumentException
200
+	 */
201
+	private function determineFieldAndTimezone()
202
+	{
203
+		$this->setQueryParamKeySansStars(ModelDataTranslator::removeStarsAndAnythingAfterFromConditionQueryParamKey(
204
+			$this->getQueryParamKey()
205
+		));
206
+		$this->setField(ModelDataTranslator::deduceFieldFromQueryParam(
207
+			$this->getQueryParamKeySansStars(),
208
+			$this->getContext()->getModel()
209
+		));
210
+		// double-check is it a *_gmt field?
211
+		if (
212
+			!$this->getField() instanceof EE_Model_Field_Base
213
+			&& ModelDataTranslator::isGmtDateFieldName($this->getQueryParamKeySansStars())
214
+		) {
215
+			// yep, take off '_gmt', and find the field
216
+			$this->setQueryParamKey(ModelDataTranslator::removeGmtFromFieldName($this->getQueryParamKeySansStars()));
217
+			$this->setField(ModelDataTranslator::deduceFieldFromQueryParam(
218
+				$this->getQueryParamKey(),
219
+				$this->context->getModel()
220
+			));
221
+			$this->setTimezone('UTC');
222
+			$this->setIsGmtField(true);
223
+		} elseif ($this->getField() instanceof EE_Datetime_Field) {
224
+			// so it's not a GMT field. Set the timezone on the model to the default
225
+			$this->setTimezone(EEH_DTT_Helper::get_valid_timezone_string());
226
+		} else {
227
+			// just keep using what's already set for the timezone
228
+			$this->setTimezone($this->context->getModel()->get_timezone());
229
+		}
230
+		$this->assertOnlyAdminCanReadPasswordFields();
231
+	}
232
+
233
+	/**
234
+	 * Throws an exception if a non-admin is trying to query by password.
235
+	 * @since 4.9.74.p
236
+	 * @throws RestException
237
+	 */
238
+	private function assertOnlyAdminCanReadPasswordFields()
239
+	{
240
+		if (
241
+			$this->getField() instanceof EE_Password_Field
242
+			&& ! current_user_can(EE_Restriction_Generator_Base::get_default_restrictions_cap())
243
+		) {
244
+			// only full admins can query by password. sorry bub!
245
+			throw new RestException(
246
+				'only_admins_can_query_by_password',
247
+				// @codingStandardsIgnoreStart
248
+				esc_html__('You attempted to filter by a password field without the needed privileges. Only a full admin is allowed to do that.', 'event_espresso'),
249
+				// @codingStandardsIgnoreEnd
250
+				array(
251
+					'status' => 403
252
+				)
253
+			);
254
+		}
255
+	}
256
+
257
+	/**
258
+	 * Given a ton of input, determines the value to use for the models.
259
+	 * @since 4.9.72.p
260
+	 * @return array|null
261
+	 * @throws DomainException
262
+	 * @throws EE_Error
263
+	 * @throws RestException
264
+	 * @throws DomainException
265
+	 */
266
+	public function determineConditionsQueryParameterValue()
267
+	{
268
+		if ($this->valueIsArrayDuringRead()) {
269
+			return $this->determineModelValueGivenRestInputArray();
270
+		}
271
+		return ModelDataTranslator::prepareFieldValueFromJson(
272
+			$this->getField(),
273
+			$this->getQueryParamValue(),
274
+			$this->getContext()->getRequestedVersion(),
275
+			$this->getTimezone()
276
+		);
277
+	}
278
+
279
+	/**
280
+	 * Given that the array value provided was itself an array, handles finding the correct value to pass to the model.
281
+	 * @since 4.9.72.p
282
+	 * @return array|null
283
+	 * @throws RestException
284
+	 */
285
+	private function determineModelValueGivenRestInputArray()
286
+	{
287
+		$this->transformSimplifiedSpecifiedOperatorSyntaxIntoStandardSyntax();
288
+		// did they specify an operator?
289
+		if ($this->valueIsLegacySpecifiedOperator()) {
290
+			$query_param_value = $this->getQueryParamValue();
291
+			$sub_array_key = $query_param_value[0];
292
+			$translated_value = array($sub_array_key);
293
+			if ($this->operatorIsNAry($sub_array_key)) {
294
+				$translated_value[] = $this->prepareValuesFromJson($query_param_value[1]);
295
+			} elseif ($this->operatorIsTernary($sub_array_key)) {
296
+				$translated_value[] = array(
297
+					$this->prepareValuesFromJson($query_param_value[1][0]),
298
+					$this->prepareValuesFromJson($query_param_value[1][1])
299
+				);
300
+			} elseif ($this->operatorIsLike($sub_array_key)) {
301
+				// we want to leave this value mostly-as-is (eg don't force it to be a float
302
+				// or a boolean or an enum value. Leave it as-is with wildcards etc)
303
+				// but do verify it at least doesn't have any serialized data
304
+				ModelDataTranslator::throwExceptionIfContainsSerializedData($query_param_value[1]);
305
+				$translated_value[] = $query_param_value[1];
306
+			} elseif ($this->operatorIsUnary($sub_array_key)) {
307
+				// no arguments should have been provided, so don't look for any
308
+			} elseif ($this->operatorisBinary($sub_array_key)) {
309
+				// it's a valid operator, but none of the exceptions. Treat it normally.
310
+				$translated_value[] = $this->prepareValuesFromJson($query_param_value[1]);
311
+			} else {
312
+				// so they provided a valid operator, but wrong number of arguments
313
+				$this->throwWrongNumberOfArgsExceptionIfDebugging($sub_array_key);
314
+				$translated_value = null;
315
+			}
316
+		} else {
317
+			// so they didn't provide a valid operator
318
+			// if we aren't in debug mode, then just try our best to fulfill the user's request
319
+			$this->throwInvalidOperatorExceptionIfDebugging();
320
+			$translated_value = null;
321
+		}
322
+		return $translated_value;
323
+	}
324
+
325
+	/**
326
+	 * Returns if this request is a "read" request and the value provided was an array.
327
+	 * This will indicate is such things as `array('<', 123)` and `array('IN', array(1,2,3))` are acceptable or not.
328
+	 * @since 4.9.72.p
329
+	 * @return boolean
330
+	 */
331
+	private function valueIsArrayDuringRead()
332
+	{
333
+		return !$this->getContext()->isWriting() && is_array($this->getQueryParamValue());
334
+	}
335
+
336
+	/**
337
+	 * Returns if the value provided was an associative array (we should have already verified it's an array of some
338
+	 * sort). If the value is an associative array, it had better be in the simplified specified operator structure.
339
+	 * @since 4.9.72.p
340
+	 * @return boolean
341
+	 */
342
+	private function valueIsAssociativeArray()
343
+	{
344
+		return !EEH_Array::is_array_numerically_and_sequentially_indexed($this->getQueryParamValue());
345
+	}
346
+
347
+	/**
348
+	 * Checks if the array value is itself an array that fits into the simplified specified operator structure
349
+	 * (eg `array('!=' => 123)`).
350
+	 * @since 4.9.72.p
351
+	 * @return boolean
352
+	 */
353
+	private function valueIsSimplifiedSpecifiedOperator()
354
+	{
355
+		return count($this->getQueryParamValue()) === 1
356
+			&& array_key_exists(
357
+				key($this->getQueryParamValue()),
358
+				$this->getContext()->getModel()->valid_operators()
359
+			);
360
+	}
361
+
362
+	/**
363
+	 * Throws an exception if the sub-value is an array (eg `array('!=' => array())`). It needs to just be a string,
364
+	 * of either comma-separated-values, or a JSON array.
365
+	 * @since 4.9.72.p
366
+	 * @param $sub_array_key
367
+	 * @param $sub_array_value
368
+	 * @throws RestException
369
+	 */
370
+	private function assertSubValueIsntArray($sub_array_key, $sub_array_value)
371
+	{
372
+		if (is_array($sub_array_value) && EED_Core_Rest_Api::debugMode()) {
373
+			throw new RestException(
374
+				'csv_or_json_string_only',
375
+				sprintf(
376
+					/* translators: 1: variable name*/
377
+					esc_html__(
378
+						'The value provided for the operator "%1$s" should be comma-separated value string or a JSON array.',
379
+						'event_espresso'
380
+					),
381
+					$sub_array_key
382
+				),
383
+				array(
384
+					'status' => 400,
385
+				)
386
+			);
387
+		}
388
+	}
389
+
390
+	/**
391
+	 * Determines if the sub-array key is an operator taking 3 or more operators.
392
+	 * @since 4.9.72.p
393
+	 * @param $sub_array_key
394
+	 * @return boolean
395
+	 */
396
+	private function subArrayKeyIsNonBinaryOperator($sub_array_key)
397
+	{
398
+		return array_key_exists(
399
+			$sub_array_key,
400
+			array_merge(
401
+				$this->getContext()->getModel()->valid_in_style_operators(),
402
+				$this->getContext()->getModel()->valid_between_style_operators()
403
+			)
404
+		);
405
+	}
406
+
407
+	/**
408
+	 * Given that the $sub_array_key is a string, checks if it's an operator taking only 1 argument.
409
+	 * @since 4.9.72.p
410
+	 * @param string $sub_array_key
411
+	 * @return boolean
412
+	 */
413
+	private function subArrayKeyIsUnaryOperator($sub_array_key)
414
+	{
415
+		return array_key_exists(
416
+			$sub_array_key,
417
+			$this->getContext()->getModel()->valid_null_style_operators()
418
+		);
419
+	}
420
+
421
+	/**
422
+	 * Parses the $sub_array_value string into an array (given it could either be a comma-separated-list or a JSON
423
+	 * array). eg `"1,2,3"` or `"[1,2,3]"` into `array(1,2,3)`.
424
+	 * @since 4.9.72.p
425
+	 * @param $sub_array_value
426
+	 * @return array|mixed|object
427
+	 */
428
+	private function extractQuickStyleSpecifiedOperatorValue($sub_array_value)
429
+	{
430
+		// the value should be JSON or CSV
431
+		$values = json_decode($sub_array_value);
432
+		if (!is_array($values)) {
433
+			$values = array_filter(
434
+				array_map(
435
+					'trim',
436
+					explode(
437
+						',',
438
+						$sub_array_value
439
+					)
440
+				)
441
+			);
442
+		}
443
+		return $values;
444
+	}
445
+
446
+	/**
447
+	 * Throws an exception if the value isn't a simplified specified operator (only called when we expect that).
448
+	 * @since 4.9.72.p
449
+	 * @throws RestException
450
+	 */
451
+	private function assertSimplifiedSpecifiedOperator()
452
+	{
453
+		if (!$this->valueIsSimplifiedSpecifiedOperator() && EED_Core_Rest_Api::debugMode()) {
454
+			throw new RestException(
455
+				'numerically_indexed_array_of_values_only',
456
+				sprintf(
457
+					/* translators: 1: variable name*/
458
+					esc_html__(
459
+						'The array provided for the parameter "%1$s" should be numerically indexed.',
460
+						'event_espresso'
461
+					),
462
+					$this->getQueryParamKey()
463
+				),
464
+				array(
465
+					'status' => 400,
466
+				)
467
+			);
468
+		}
469
+	}
470
+
471
+	/**
472
+	 * If query_param_value were in the simplified specific operator structure, change it into the legacy structure.
473
+	 * @since 4.9.72.p
474
+	 * @throws RestException
475
+	 */
476
+	private function transformSimplifiedSpecifiedOperatorSyntaxIntoStandardSyntax()
477
+	{
478
+		if ($this->valueIsAssociativeArray()) {
479
+			$this->assertSimplifiedSpecifiedOperator();
480
+			$query_param_value = $this->getQueryParamValue();
481
+			$sub_array_value = reset($query_param_value);
482
+			$sub_array_key = key($query_param_value);
483
+			$this->assertSubValueIsntArray($sub_array_key, $sub_array_value);
484
+			// they're doing something like "&where[EVT_ID][IN]=1,2,3" or "&where[EVT_ID][>]=5"
485
+			if ($this->subArrayKeyIsNonBinaryOperator($sub_array_key)) {
486
+				$this->setQueryParamValue(array(
487
+					$sub_array_key,
488
+					$this->extractQuickStyleSpecifiedOperatorValue($sub_array_value)
489
+				));
490
+			} elseif ($this->subArrayKeyIsUnaryOperator($sub_array_key)) {
491
+				$this->setQueryParamValue(array($sub_array_key));
492
+			} else {
493
+				$this->setQueryParamValue(array($sub_array_key, $sub_array_value));
494
+			}
495
+		}
496
+	}
497
+
498
+	/**
499
+	 * Returns true is the value is an array using the legacy structure to specify the operator. Eg `array('!=',123)`.
500
+	 * @since 4.9.72.p
501
+	 * @return boolean
502
+	 */
503
+	private function valueIsLegacySpecifiedOperator()
504
+	{
505
+		$valid_operators = $this->getContext()->getModel()->valid_operators();
506
+		$query_param_value = $this->getQueryParamValue();
507
+		return isset($query_param_value[0])
508
+			&& isset($valid_operators[ $query_param_value[0] ]);
509
+	}
510
+
511
+	/**
512
+	 * Returns true if the value specified operator accepts arbitrary number of arguments, like "IN".
513
+	 * @since 4.9.72.p
514
+	 * @param $operator
515
+	 * @return boolean
516
+	 */
517
+	private function operatorIsNAry($operator)
518
+	{
519
+		$valueArray = $this->getQueryParamValue();
520
+		return array_key_exists(
521
+			$operator,
522
+			$this->getContext()->getModel()->valid_in_style_operators()
523
+		)
524
+			&& isset($valueArray[1])
525
+			&& is_array($valueArray[1])
526
+			&& !isset($valueArray[2]);
527
+	}
528
+
529
+	/**
530
+	 * Returns true if the operator accepts 3 arguments (eg "BETWEEN").
531
+	 * So we're looking for a value that looks like
532
+	 * `array('BETWEEN', array('2015-01-01T00:00:00', '2016-01-01T00:00:00'))`.
533
+	 * @since 4.9.72.p
534
+	 * @param $operator
535
+	 * @return boolean
536
+	 */
537
+	private function operatorIsTernary($operator)
538
+	{
539
+		$query_param_value = $this->getQueryParamValue();
540
+		return array_key_exists($operator, $this->getContext()->getModel()->valid_between_style_operators())
541
+			&& isset($query_param_value[1])
542
+			&& is_array($query_param_value[1])
543
+			&& isset($query_param_value[1][0], $query_param_value[1][1])
544
+			&& !isset($query_param_value[1][2])
545
+			&& !isset($query_param_value[2]);
546
+	}
547
+
548
+	/**
549
+	 * Returns true if the operator is a similar to LIKE, indicating the value may have wildcards we should leave alone.
550
+	 * @since 4.9.72.p
551
+	 * @param $operator
552
+	 * @return boolean
553
+	 */
554
+	private function operatorIsLike($operator)
555
+	{
556
+		$query_param_value = $this->getQueryParamValue();
557
+		return array_key_exists($operator, $this->getContext()->getModel()->valid_like_style_operators())
558
+			&& isset($query_param_value[1])
559
+			&& !isset($query_param_value[2]);
560
+	}
561
+
562
+	/**
563
+	 * Returns true if the operator only takes one argument (eg it's like `IS NULL`).
564
+	 * @since 4.9.72.p
565
+	 * @param $operator
566
+	 * @return boolean
567
+	 */
568
+	private function operatorIsUnary($operator)
569
+	{
570
+		$query_param_value = $this->getQueryParamValue();
571
+		return array_key_exists($operator, $this->getContext()->getModel()->valid_null_style_operators())
572
+			&& !isset($query_param_value[1]);
573
+	}
574
+
575
+	/**
576
+	 * Returns true if the operator specified is a binary opeator (eg `=`, `!=`)
577
+	 * @since 4.9.72.p
578
+	 * @param $operator
579
+	 * @return boolean
580
+	 */
581
+	private function operatorisBinary($operator)
582
+	{
583
+		$query_param_value = $this->getQueryParamValue();
584
+		$model = $this->getContext()->getModel();
585
+		return isset($query_param_value[1])
586
+			&& !isset($query_param_value[2])
587
+			&& !array_key_exists(
588
+				$operator,
589
+				array_merge(
590
+					$model->valid_in_style_operators(),
591
+					$model->valid_null_style_operators(),
592
+					$model->valid_like_style_operators(),
593
+					$model->valid_between_style_operators()
594
+				)
595
+			);
596
+	}
597
+
598
+	/**
599
+	 * If we're debugging, throws an exception saying that the wrong number of arguments was provided.
600
+	 * @since 4.9.72.p
601
+	 * @param $operator
602
+	 * @throws RestException
603
+	 */
604
+	private function throwWrongNumberOfArgsExceptionIfDebugging($operator)
605
+	{
606
+		if (EED_Core_Rest_Api::debugMode()) {
607
+			throw new RestException(
608
+				'wrong_number_of_arguments',
609
+				sprintf(
610
+					esc_html__(
611
+						'The operator you provided, "%1$s" had the wrong number of arguments',
612
+						'event_espresso'
613
+					),
614
+					$operator
615
+				),
616
+				array(
617
+					'status' => 400,
618
+				)
619
+			);
620
+		}
621
+	}
622
+
623
+	/**
624
+	 * Wrapper for ModelDataTranslator::prepareFieldValuesFromJson(), just a tad more DRY.
625
+	 * @since 4.9.72.p
626
+	 * @param $value
627
+	 * @return mixed
628
+	 * @throws RestException
629
+	 */
630
+	private function prepareValuesFromJson($value)
631
+	{
632
+		return ModelDataTranslator::prepareFieldValuesFromJson(
633
+			$this->getField(),
634
+			$value,
635
+			$this->getContext()->getRequestedVersion(),
636
+			$this->getTimezone()
637
+		);
638
+	}
639
+
640
+	/**
641
+	 * Throws an exception if an invalid operator was specified and we're debugging.
642
+	 * @since 4.9.72.p
643
+	 * @throws RestException
644
+	 */
645
+	private function throwInvalidOperatorExceptionIfDebugging()
646
+	{
647
+		// so they didn't provide a valid operator
648
+		if (EED_Core_Rest_Api::debugMode()) {
649
+			throw new RestException(
650
+				'invalid_operator',
651
+				sprintf(
652
+					esc_html__(
653
+						'You provided an invalid parameter, with key "%1$s" and value "%2$s"',
654
+						'event_espresso'
655
+					),
656
+					$this->getQueryParamKey(),
657
+					$this->getQueryParamValue()
658
+				),
659
+				array(
660
+					'status' => 400,
661
+				)
662
+			);
663
+		}
664
+	}
665
+
666
+	/**
667
+	 * Returns true if the query_param_key was a logic query parameter, eg `OR`, `AND`, `NOT`, `OR*`, etc.
668
+	 * @since 4.9.72.p
669
+	 * @return boolean
670
+	 */
671
+	private function isLogicQueryParam()
672
+	{
673
+		return in_array($this->getQueryParamKeySansStars(), $this->getContext()->getModel()->logic_query_param_keys());
674
+	}
675
+
676
+
677
+	/**
678
+	 * If the query param isn't for a field, it must be a nested query parameter which requires different logic.
679
+	 * @since 4.9.72.p
680
+	 * @return array
681
+	 * @throws DomainException
682
+	 * @throws EE_Error
683
+	 * @throws RestException
684
+	 * @throws InvalidDataTypeException
685
+	 * @throws InvalidInterfaceException
686
+	 * @throws InvalidArgumentException
687
+	 */
688
+	public function determineNestedConditionQueryParameters()
689
+	{
690
+
691
+		// so this param doesn't correspond to a field eh?
692
+		if ($this->getContext()->isWriting()) {
693
+			// always tell API clients about invalid parameters when they're creating data. Otherwise,
694
+			// they are probably going to create invalid data
695
+			throw new RestException(
696
+				'invalid_field',
697
+				sprintf(
698
+					/* translators: 1: variable name */
699
+					esc_html__('You have provided an invalid parameter: "%1$s"', 'event_espresso'),
700
+					$this->getQueryParamKey()
701
+				)
702
+			);
703
+		}
704
+		// so it's not for a field, is it a logic query param key?
705
+		if ($this->isLogicQueryParam()) {
706
+			return ModelDataTranslator::prepareConditionsQueryParamsForModels(
707
+				$this->getQueryParamValue(),
708
+				$this->getContext()->getModel(),
709
+				$this->getContext()->getRequestedVersion()
710
+			);
711
+		}
712
+		if (EED_Core_Rest_Api::debugMode()) {
713
+			// only tell API clients they got it wrong if we're in debug mode
714
+			// otherwise try our best ot fulfill their request by ignoring this invalid data
715
+			throw new RestException(
716
+				'invalid_parameter',
717
+				sprintf(
718
+					/* translators: 1: variable name */
719
+					esc_html__(
720
+						'You provided an invalid parameter, with key "%1$s"',
721
+						'event_espresso'
722
+					),
723
+					$this->getQueryParamKey()
724
+				),
725
+				array(
726
+					'status' => 400,
727
+				)
728
+			);
729
+		}
730
+		return null;
731
+	}
732 732
 }
733 733
 // End of file RestQueryParamMetadata.php
734 734
 // Location: EventEspresso\core\libraries\rest_api/RestQueryParamMetadata.php
Please login to merge, or discard this patch.
Spacing   +13 added lines, -13 removed lines patch added patch discarded remove patch
@@ -209,7 +209,7 @@  discard block
 block discarded – undo
209 209
         ));
210 210
         // double-check is it a *_gmt field?
211 211
         if (
212
-            !$this->getField() instanceof EE_Model_Field_Base
212
+            ! $this->getField() instanceof EE_Model_Field_Base
213 213
             && ModelDataTranslator::isGmtDateFieldName($this->getQueryParamKeySansStars())
214 214
         ) {
215 215
             // yep, take off '_gmt', and find the field
@@ -330,7 +330,7 @@  discard block
 block discarded – undo
330 330
      */
331 331
     private function valueIsArrayDuringRead()
332 332
     {
333
-        return !$this->getContext()->isWriting() && is_array($this->getQueryParamValue());
333
+        return ! $this->getContext()->isWriting() && is_array($this->getQueryParamValue());
334 334
     }
335 335
 
336 336
     /**
@@ -341,7 +341,7 @@  discard block
 block discarded – undo
341 341
      */
342 342
     private function valueIsAssociativeArray()
343 343
     {
344
-        return !EEH_Array::is_array_numerically_and_sequentially_indexed($this->getQueryParamValue());
344
+        return ! EEH_Array::is_array_numerically_and_sequentially_indexed($this->getQueryParamValue());
345 345
     }
346 346
 
347 347
     /**
@@ -429,7 +429,7 @@  discard block
 block discarded – undo
429 429
     {
430 430
         // the value should be JSON or CSV
431 431
         $values = json_decode($sub_array_value);
432
-        if (!is_array($values)) {
432
+        if ( ! is_array($values)) {
433 433
             $values = array_filter(
434 434
                 array_map(
435 435
                     'trim',
@@ -450,7 +450,7 @@  discard block
 block discarded – undo
450 450
      */
451 451
     private function assertSimplifiedSpecifiedOperator()
452 452
     {
453
-        if (!$this->valueIsSimplifiedSpecifiedOperator() && EED_Core_Rest_Api::debugMode()) {
453
+        if ( ! $this->valueIsSimplifiedSpecifiedOperator() && EED_Core_Rest_Api::debugMode()) {
454 454
             throw new RestException(
455 455
                 'numerically_indexed_array_of_values_only',
456 456
                 sprintf(
@@ -505,7 +505,7 @@  discard block
 block discarded – undo
505 505
         $valid_operators = $this->getContext()->getModel()->valid_operators();
506 506
         $query_param_value = $this->getQueryParamValue();
507 507
         return isset($query_param_value[0])
508
-            && isset($valid_operators[ $query_param_value[0] ]);
508
+            && isset($valid_operators[$query_param_value[0]]);
509 509
     }
510 510
 
511 511
     /**
@@ -523,7 +523,7 @@  discard block
 block discarded – undo
523 523
         )
524 524
             && isset($valueArray[1])
525 525
             && is_array($valueArray[1])
526
-            && !isset($valueArray[2]);
526
+            && ! isset($valueArray[2]);
527 527
     }
528 528
 
529 529
     /**
@@ -541,8 +541,8 @@  discard block
 block discarded – undo
541 541
             && isset($query_param_value[1])
542 542
             && is_array($query_param_value[1])
543 543
             && isset($query_param_value[1][0], $query_param_value[1][1])
544
-            && !isset($query_param_value[1][2])
545
-            && !isset($query_param_value[2]);
544
+            && ! isset($query_param_value[1][2])
545
+            && ! isset($query_param_value[2]);
546 546
     }
547 547
 
548 548
     /**
@@ -556,7 +556,7 @@  discard block
 block discarded – undo
556 556
         $query_param_value = $this->getQueryParamValue();
557 557
         return array_key_exists($operator, $this->getContext()->getModel()->valid_like_style_operators())
558 558
             && isset($query_param_value[1])
559
-            && !isset($query_param_value[2]);
559
+            && ! isset($query_param_value[2]);
560 560
     }
561 561
 
562 562
     /**
@@ -569,7 +569,7 @@  discard block
 block discarded – undo
569 569
     {
570 570
         $query_param_value = $this->getQueryParamValue();
571 571
         return array_key_exists($operator, $this->getContext()->getModel()->valid_null_style_operators())
572
-            && !isset($query_param_value[1]);
572
+            && ! isset($query_param_value[1]);
573 573
     }
574 574
 
575 575
     /**
@@ -583,8 +583,8 @@  discard block
 block discarded – undo
583 583
         $query_param_value = $this->getQueryParamValue();
584 584
         $model = $this->getContext()->getModel();
585 585
         return isset($query_param_value[1])
586
-            && !isset($query_param_value[2])
587
-            && !array_key_exists(
586
+            && ! isset($query_param_value[2])
587
+            && ! array_key_exists(
588 588
                 $operator,
589 589
                 array_merge(
590 590
                     $model->valid_in_style_operators(),
Please login to merge, or discard this patch.
core/libraries/rest_api/changes/ChangesIn40834.php 1 patch
Indentation   +33 added lines, -33 removed lines patch added patch discarded remove patch
@@ -12,39 +12,39 @@
 block discarded – undo
12 12
 class ChangesIn40834 extends ChangesInBase
13 13
 {
14 14
 
15
-    /**
16
-     * Adds hooks so requests to 4.8.29 don't have the checkin endpoints
17
-     */
18
-    public function setHooks()
19
-    {
20
-        // set a hook to remove the checkout/checkout endpoints if the request
21
-        // is for lower than 4.8.33
22
-        add_filter(
23
-            'FHEE__EventEspresso\core\libraries\rest_api\controllers\Base___get_response_headers',
24
-            array($this, 'removeResponseHeaders'),
25
-            10,
26
-            3
27
-        );
28
-    }
15
+	/**
16
+	 * Adds hooks so requests to 4.8.29 don't have the checkin endpoints
17
+	 */
18
+	public function setHooks()
19
+	{
20
+		// set a hook to remove the checkout/checkout endpoints if the request
21
+		// is for lower than 4.8.33
22
+		add_filter(
23
+			'FHEE__EventEspresso\core\libraries\rest_api\controllers\Base___get_response_headers',
24
+			array($this, 'removeResponseHeaders'),
25
+			10,
26
+			3
27
+		);
28
+	}
29 29
 
30 30
 
31
-    /**
32
-     * Removes the checkin and checkout endpoints from the index for requests
33
-     * to api versions lowers than 4.8.33
34
-     *
35
-     * @param array  $response_headers
36
-     * @param Base   $controller
37
-     * @param string $requested_version
38
-     * @return array like $routes_on_this_version
39
-     */
40
-    public function removeResponseHeaders($response_headers, $controller, $requested_version)
41
-    {
42
-        if (
43
-            $controller instanceof Base
44
-            && $this->appliesToVersion($requested_version)
45
-        ) {
46
-            return array();
47
-        }
48
-        return $response_headers;
49
-    }
31
+	/**
32
+	 * Removes the checkin and checkout endpoints from the index for requests
33
+	 * to api versions lowers than 4.8.33
34
+	 *
35
+	 * @param array  $response_headers
36
+	 * @param Base   $controller
37
+	 * @param string $requested_version
38
+	 * @return array like $routes_on_this_version
39
+	 */
40
+	public function removeResponseHeaders($response_headers, $controller, $requested_version)
41
+	{
42
+		if (
43
+			$controller instanceof Base
44
+			&& $this->appliesToVersion($requested_version)
45
+		) {
46
+			return array();
47
+		}
48
+		return $response_headers;
49
+	}
50 50
 }
Please login to merge, or discard this patch.
core/libraries/rest_api/calculations/Registration.php 2 patches
Spacing   +1 added lines, -1 removed lines patch added patch discarded remove patch
@@ -96,7 +96,7 @@
 block discarded – undo
96 96
                     $status_pretty = 'NEVER';
97 97
                     break;
98 98
             }
99
-            $checkin_stati[ $datetime_id ] = $status_pretty;
99
+            $checkin_stati[$datetime_id] = $status_pretty;
100 100
         }
101 101
         return $checkin_stati;
102 102
     }
Please login to merge, or discard this patch.
Indentation   +101 added lines, -101 removed lines patch added patch discarded remove patch
@@ -24,109 +24,109 @@
 block discarded – undo
24 24
  */
25 25
 class Registration extends RegistrationCalculationBase
26 26
 {
27
-    /**
28
-     * @var EEM_Registration
29
-     */
30
-    protected $registration_model;
27
+	/**
28
+	 * @var EEM_Registration
29
+	 */
30
+	protected $registration_model;
31 31
 
32
-    /**
33
-     * Registration constructor.
34
-     * @param EEM_Registration $registration_model
35
-     */
36
-    public function __construct(EEM_Registration $registration_model)
37
-    {
38
-        $this->registration_model = $registration_model;
39
-    }
32
+	/**
33
+	 * Registration constructor.
34
+	 * @param EEM_Registration $registration_model
35
+	 */
36
+	public function __construct(EEM_Registration $registration_model)
37
+	{
38
+		$this->registration_model = $registration_model;
39
+	}
40 40
 
41
-    /**
42
-     * Calculates the checkin status for each datetime this registration has access to
43
-     *
44
-     * @param array            $wpdb_row
45
-     * @param WP_REST_Request $request
46
-     * @param RegistrationControllerBase $controller
47
-     * @return array
48
-     * @throws EE_Error
49
-     * @throws InvalidDataTypeException
50
-     * @throws InvalidInterfaceException
51
-     * @throws InvalidArgumentException
52
-     */
53
-    public function datetimeCheckinStati($wpdb_row, $request, $controller)
54
-    {
55
-        if (is_array($wpdb_row) && isset($wpdb_row['Registration.REG_ID'])) {
56
-            $reg = $this->registration_model->get_one_by_ID($wpdb_row['Registration.REG_ID']);
57
-        } else {
58
-            $reg = null;
59
-        }
60
-        if (
61
-            ! $reg instanceof EE_Registration
62
-        ) {
63
-            throw new EE_Error(
64
-                sprintf(
65
-                    esc_html__(
66
-                    // @codingStandardsIgnoreStart
67
-                        'Cannot calculate datetime_checkin_stati because the registration with ID %1$s (from database row %2$s) was not found',
68
-                        // @codingStandardsIgnoreEnd
69
-                        'event_espresso'
70
-                    ),
71
-                    $wpdb_row['Registration.REG_ID'],
72
-                    print_r($wpdb_row, true)
73
-                )
74
-            );
75
-        }
76
-        $datetime_ids = EEM_Datetime::instance()->get_col(
77
-            [
78
-                [
79
-                    'Ticket.TKT_ID' => $reg->ticket_ID(),
80
-                ],
81
-                'default_where_conditions' => EEM_Base::default_where_conditions_minimum_all,
82
-            ]
83
-        );
84
-        $checkin_stati = array();
85
-        foreach ($datetime_ids as $datetime_id) {
86
-            $status = $reg->check_in_status_for_datetime($datetime_id);
87
-            switch ($status) {
88
-                case EE_Checkin::status_checked_out:
89
-                    $status_pretty = 'OUT';
90
-                    break;
91
-                case EE_Checkin::status_checked_in:
92
-                    $status_pretty = 'IN';
93
-                    break;
94
-                case EE_Checkin::status_checked_never:
95
-                default:
96
-                    $status_pretty = 'NEVER';
97
-                    break;
98
-            }
99
-            $checkin_stati[ $datetime_id ] = $status_pretty;
100
-        }
101
-        return $checkin_stati;
102
-    }
41
+	/**
42
+	 * Calculates the checkin status for each datetime this registration has access to
43
+	 *
44
+	 * @param array            $wpdb_row
45
+	 * @param WP_REST_Request $request
46
+	 * @param RegistrationControllerBase $controller
47
+	 * @return array
48
+	 * @throws EE_Error
49
+	 * @throws InvalidDataTypeException
50
+	 * @throws InvalidInterfaceException
51
+	 * @throws InvalidArgumentException
52
+	 */
53
+	public function datetimeCheckinStati($wpdb_row, $request, $controller)
54
+	{
55
+		if (is_array($wpdb_row) && isset($wpdb_row['Registration.REG_ID'])) {
56
+			$reg = $this->registration_model->get_one_by_ID($wpdb_row['Registration.REG_ID']);
57
+		} else {
58
+			$reg = null;
59
+		}
60
+		if (
61
+			! $reg instanceof EE_Registration
62
+		) {
63
+			throw new EE_Error(
64
+				sprintf(
65
+					esc_html__(
66
+					// @codingStandardsIgnoreStart
67
+						'Cannot calculate datetime_checkin_stati because the registration with ID %1$s (from database row %2$s) was not found',
68
+						// @codingStandardsIgnoreEnd
69
+						'event_espresso'
70
+					),
71
+					$wpdb_row['Registration.REG_ID'],
72
+					print_r($wpdb_row, true)
73
+				)
74
+			);
75
+		}
76
+		$datetime_ids = EEM_Datetime::instance()->get_col(
77
+			[
78
+				[
79
+					'Ticket.TKT_ID' => $reg->ticket_ID(),
80
+				],
81
+				'default_where_conditions' => EEM_Base::default_where_conditions_minimum_all,
82
+			]
83
+		);
84
+		$checkin_stati = array();
85
+		foreach ($datetime_ids as $datetime_id) {
86
+			$status = $reg->check_in_status_for_datetime($datetime_id);
87
+			switch ($status) {
88
+				case EE_Checkin::status_checked_out:
89
+					$status_pretty = 'OUT';
90
+					break;
91
+				case EE_Checkin::status_checked_in:
92
+					$status_pretty = 'IN';
93
+					break;
94
+				case EE_Checkin::status_checked_never:
95
+				default:
96
+					$status_pretty = 'NEVER';
97
+					break;
98
+			}
99
+			$checkin_stati[ $datetime_id ] = $status_pretty;
100
+		}
101
+		return $checkin_stati;
102
+	}
103 103
 
104 104
 
105
-    /**
106
-     * Provides an array for all the calculations possible that outlines a json schema for those calculations.
107
-     * Array is indexed by calculation (snake case) and value is the schema for that calculation.
108
-     *
109
-     * @since 4.9.68.p
110
-     * @return array
111
-     */
112
-    public function schemaForCalculations()
113
-    {
114
-        return array(
115
-            'datetime_checkin_stati' => array(
116
-                'description' => esc_html__(
117
-                    'Returns the checkin status for each datetime this registration has access to.',
118
-                    'event_espresso'
119
-                ),
120
-                'type' => 'object',
121
-                'properties' => array(),
122
-                'additionalProperties' => array(
123
-                    'description' => esc_html__(
124
-                        'Keys are date-time ids and values are the check-in status',
125
-                        'event_espresso'
126
-                    ),
127
-                    'type' => 'string'
128
-                ),
129
-            ),
130
-        );
131
-    }
105
+	/**
106
+	 * Provides an array for all the calculations possible that outlines a json schema for those calculations.
107
+	 * Array is indexed by calculation (snake case) and value is the schema for that calculation.
108
+	 *
109
+	 * @since 4.9.68.p
110
+	 * @return array
111
+	 */
112
+	public function schemaForCalculations()
113
+	{
114
+		return array(
115
+			'datetime_checkin_stati' => array(
116
+				'description' => esc_html__(
117
+					'Returns the checkin status for each datetime this registration has access to.',
118
+					'event_espresso'
119
+				),
120
+				'type' => 'object',
121
+				'properties' => array(),
122
+				'additionalProperties' => array(
123
+					'description' => esc_html__(
124
+						'Keys are date-time ids and values are the check-in status',
125
+						'event_espresso'
126
+					),
127
+					'type' => 'string'
128
+				),
129
+			),
130
+		);
131
+	}
132 132
 }
Please login to merge, or discard this patch.
core/libraries/rest_api/CalculatedModelFields.php 2 patches
Spacing   +12 added lines, -12 removed lines patch added patch discarded remove patch
@@ -57,7 +57,7 @@  discard block
 block discarded – undo
57 57
      */
58 58
     public function mapping($refresh = false)
59 59
     {
60
-        if (! $this->mapping || $refresh) {
60
+        if ( ! $this->mapping || $refresh) {
61 61
             $this->mapping = $this->generateNewMapping();
62 62
         }
63 63
         return $this->mapping;
@@ -81,7 +81,7 @@  discard block
 block discarded – undo
81 81
         foreach ($models_with_calculated_fields as $model_name) {
82 82
             $calculator = $this->factory->createFromModel($model_name);
83 83
             foreach (array_keys(call_user_func(array($calculator, 'schemaForCalculations'))) as $field_name) {
84
-                $mapping[ $model_name ][ $field_name ] = get_class($calculator);
84
+                $mapping[$model_name][$field_name] = get_class($calculator);
85 85
             }
86 86
         }
87 87
         return apply_filters(
@@ -108,8 +108,8 @@  discard block
 block discarded – undo
108 108
             foreach ($map_for_model as $calculation_index => $calculations_class) {
109 109
                 $calculator = $this->factory->createFromClassname($calculations_class);
110 110
                 $schema = call_user_func(array($calculator, 'schemaForCalculation'), $calculation_index);
111
-                if (! empty($schema)) {
112
-                    $schema_map[ $map_model ][ $calculation_index ] = $schema;
111
+                if ( ! empty($schema)) {
112
+                    $schema_map[$map_model][$calculation_index] = $schema;
113 113
                 }
114 114
             }
115 115
         }
@@ -126,8 +126,8 @@  discard block
 block discarded – undo
126 126
     public function retrieveCalculatedFieldsForModel(EEM_Base $model)
127 127
     {
128 128
         $mapping = $this->mapping();
129
-        if (isset($mapping[ $model->get_this_model_name() ])) {
130
-            return array_keys($mapping[ $model->get_this_model_name() ]);
129
+        if (isset($mapping[$model->get_this_model_name()])) {
130
+            return array_keys($mapping[$model->get_this_model_name()]);
131 131
         }
132 132
         return array();
133 133
     }
@@ -140,7 +140,7 @@  discard block
 block discarded – undo
140 140
      */
141 141
     public function getJsonSchemaForModel(EEM_Base $model)
142 142
     {
143
-        if (! $this->mapping_schema) {
143
+        if ( ! $this->mapping_schema) {
144 144
             $this->mapping_schema = $this->generateNewMappingSchema();
145 145
         }
146 146
         return array(
@@ -149,8 +149,8 @@  discard block
 block discarded – undo
149 149
                 'event_espresso'
150 150
             ),
151 151
             'type' => 'object',
152
-            'properties' => isset($this->mapping_schema[ $model->get_this_model_name() ])
153
-                ? $this->mapping_schema[ $model->get_this_model_name() ]
152
+            'properties' => isset($this->mapping_schema[$model->get_this_model_name()])
153
+                ? $this->mapping_schema[$model->get_this_model_name()]
154 154
                 : array(),
155 155
             'additionalProperties' => false,
156 156
             'readonly' => true,
@@ -179,10 +179,10 @@  discard block
 block discarded – undo
179 179
     ) {
180 180
         $mapping = $this->mapping();
181 181
         if (
182
-            isset($mapping[ $model->get_this_model_name() ])
183
-            && isset($mapping[ $model->get_this_model_name() ][ $field_name ])
182
+            isset($mapping[$model->get_this_model_name()])
183
+            && isset($mapping[$model->get_this_model_name()][$field_name])
184 184
         ) {
185
-            $classname = $mapping[ $model->get_this_model_name() ][ $field_name ];
185
+            $classname = $mapping[$model->get_this_model_name()][$field_name];
186 186
             $calculator = $this->factory->createFromClassname($classname);
187 187
             $class_method_name = EEH_Inflector::camelize_all_but_first($field_name);
188 188
             return call_user_func(array($calculator, $class_method_name), $wpdb_row, $rest_request, $controller);
Please login to merge, or discard this patch.
Indentation   +174 added lines, -174 removed lines patch added patch discarded remove patch
@@ -21,178 +21,178 @@
 block discarded – undo
21 21
  */
22 22
 class CalculatedModelFields
23 23
 {
24
-    /**
25
-     * @var array
26
-     */
27
-    protected $mapping;
28
-
29
-    /**
30
-     * @var array
31
-     */
32
-    protected $mapping_schema;
33
-
34
-    /**
35
-     * @var CalculatedModelFieldsFactory
36
-     */
37
-    private $factory;
38
-
39
-    /**
40
-     * CalculatedModelFields constructor.
41
-     * @param CalculatedModelFieldsFactory $factory
42
-     */
43
-    public function __construct(CalculatedModelFieldsFactory $factory)
44
-    {
45
-        $this->factory = $factory;
46
-    }
47
-    /**
48
-     * @param bool $refresh
49
-     * @return array top-level-keys are model names (eg "Event")
50
-     * next-level are the calculated field names AND method names on classes
51
-     * which perform calculations, values are the fully qualified classnames which do the calculations
52
-     * These callbacks should accept as arguments:
53
-     * the wpdb row results,
54
-     * the WP_Request object,
55
-     * the controller object
56
-     */
57
-    public function mapping($refresh = false)
58
-    {
59
-        if (! $this->mapping || $refresh) {
60
-            $this->mapping = $this->generateNewMapping();
61
-        }
62
-        return $this->mapping;
63
-    }
64
-
65
-
66
-    /**
67
-     * Generates a new mapping between model calculated fields and their callbacks
68
-     *
69
-     * @return array
70
-     */
71
-    protected function generateNewMapping()
72
-    {
73
-        $mapping = array();
74
-        $models_with_calculated_fields = array(
75
-            'Attendee',
76
-            'Datetime',
77
-            'Event',
78
-            'Registration'
79
-        );
80
-        foreach ($models_with_calculated_fields as $model_name) {
81
-            $calculator = $this->factory->createFromModel($model_name);
82
-            foreach (array_keys(call_user_func(array($calculator, 'schemaForCalculations'))) as $field_name) {
83
-                $mapping[ $model_name ][ $field_name ] = get_class($calculator);
84
-            }
85
-        }
86
-        return apply_filters(
87
-            'FHEE__EventEspresso\core\libraries\rest_api\Calculated_Model_Fields__mapping',
88
-            $mapping
89
-        );
90
-    }
91
-
92
-
93
-    /**
94
-     * Generates the schema for each calculation index in the calculation map.
95
-     *
96
-     * @return array
97
-     * @throws UnexpectedEntityException
98
-     */
99
-    protected function generateNewMappingSchema()
100
-    {
101
-        $schema_map = array();
102
-        foreach ($this->mapping() as $map_model => $map_for_model) {
103
-            /**
104
-             * @var string $calculation_index
105
-             * @var string $calculations_class
106
-             */
107
-            foreach ($map_for_model as $calculation_index => $calculations_class) {
108
-                $calculator = $this->factory->createFromClassname($calculations_class);
109
-                $schema = call_user_func(array($calculator, 'schemaForCalculation'), $calculation_index);
110
-                if (! empty($schema)) {
111
-                    $schema_map[ $map_model ][ $calculation_index ] = $schema;
112
-                }
113
-            }
114
-        }
115
-        return $schema_map;
116
-    }
117
-
118
-
119
-    /**
120
-     * Gets the known calculated fields for model
121
-     *
122
-     * @param EEM_Base $model
123
-     * @return array allowable values for this field
124
-     */
125
-    public function retrieveCalculatedFieldsForModel(EEM_Base $model)
126
-    {
127
-        $mapping = $this->mapping();
128
-        if (isset($mapping[ $model->get_this_model_name() ])) {
129
-            return array_keys($mapping[ $model->get_this_model_name() ]);
130
-        }
131
-        return array();
132
-    }
133
-
134
-
135
-    /**
136
-     * Returns the JsonSchema for the calculated fields on the given model.
137
-     * @param EEM_Base $model
138
-     * @return array
139
-     */
140
-    public function getJsonSchemaForModel(EEM_Base $model)
141
-    {
142
-        if (! $this->mapping_schema) {
143
-            $this->mapping_schema = $this->generateNewMappingSchema();
144
-        }
145
-        return array(
146
-            'description' => esc_html__(
147
-                'Available calculated fields for this model.  Fields are only present in the response if explicitly requested',
148
-                'event_espresso'
149
-            ),
150
-            'type' => 'object',
151
-            'properties' => isset($this->mapping_schema[ $model->get_this_model_name() ])
152
-                ? $this->mapping_schema[ $model->get_this_model_name() ]
153
-                : array(),
154
-            'additionalProperties' => false,
155
-            'readonly' => true,
156
-        );
157
-    }
158
-
159
-
160
-    /**
161
-     * Retrieves the value for this calculation
162
-     *
163
-     * @param EEM_Base $model
164
-     * @param string $field_name
165
-     * @param array $wpdb_row
166
-     * @param $rest_request
167
-     * @param BaseController $controller
168
-     * @return mixed|null
169
-     * @throws RestException
170
-     * @throws UnexpectedEntityException
171
-     */
172
-    public function retrieveCalculatedFieldValue(
173
-        EEM_Base $model,
174
-        $field_name,
175
-        $wpdb_row,
176
-        $rest_request,
177
-        Base $controller
178
-    ) {
179
-        $mapping = $this->mapping();
180
-        if (
181
-            isset($mapping[ $model->get_this_model_name() ])
182
-            && isset($mapping[ $model->get_this_model_name() ][ $field_name ])
183
-        ) {
184
-            $classname = $mapping[ $model->get_this_model_name() ][ $field_name ];
185
-            $calculator = $this->factory->createFromClassname($classname);
186
-            $class_method_name = EEH_Inflector::camelize_all_but_first($field_name);
187
-            return call_user_func(array($calculator, $class_method_name), $wpdb_row, $rest_request, $controller);
188
-        }
189
-        throw new RestException(
190
-            'calculated_field_does_not_exist',
191
-            sprintf(
192
-                esc_html__('There is no calculated field %1$s on resource %2$s', 'event_espresso'),
193
-                $field_name,
194
-                $model->get_this_model_name()
195
-            )
196
-        );
197
-    }
24
+	/**
25
+	 * @var array
26
+	 */
27
+	protected $mapping;
28
+
29
+	/**
30
+	 * @var array
31
+	 */
32
+	protected $mapping_schema;
33
+
34
+	/**
35
+	 * @var CalculatedModelFieldsFactory
36
+	 */
37
+	private $factory;
38
+
39
+	/**
40
+	 * CalculatedModelFields constructor.
41
+	 * @param CalculatedModelFieldsFactory $factory
42
+	 */
43
+	public function __construct(CalculatedModelFieldsFactory $factory)
44
+	{
45
+		$this->factory = $factory;
46
+	}
47
+	/**
48
+	 * @param bool $refresh
49
+	 * @return array top-level-keys are model names (eg "Event")
50
+	 * next-level are the calculated field names AND method names on classes
51
+	 * which perform calculations, values are the fully qualified classnames which do the calculations
52
+	 * These callbacks should accept as arguments:
53
+	 * the wpdb row results,
54
+	 * the WP_Request object,
55
+	 * the controller object
56
+	 */
57
+	public function mapping($refresh = false)
58
+	{
59
+		if (! $this->mapping || $refresh) {
60
+			$this->mapping = $this->generateNewMapping();
61
+		}
62
+		return $this->mapping;
63
+	}
64
+
65
+
66
+	/**
67
+	 * Generates a new mapping between model calculated fields and their callbacks
68
+	 *
69
+	 * @return array
70
+	 */
71
+	protected function generateNewMapping()
72
+	{
73
+		$mapping = array();
74
+		$models_with_calculated_fields = array(
75
+			'Attendee',
76
+			'Datetime',
77
+			'Event',
78
+			'Registration'
79
+		);
80
+		foreach ($models_with_calculated_fields as $model_name) {
81
+			$calculator = $this->factory->createFromModel($model_name);
82
+			foreach (array_keys(call_user_func(array($calculator, 'schemaForCalculations'))) as $field_name) {
83
+				$mapping[ $model_name ][ $field_name ] = get_class($calculator);
84
+			}
85
+		}
86
+		return apply_filters(
87
+			'FHEE__EventEspresso\core\libraries\rest_api\Calculated_Model_Fields__mapping',
88
+			$mapping
89
+		);
90
+	}
91
+
92
+
93
+	/**
94
+	 * Generates the schema for each calculation index in the calculation map.
95
+	 *
96
+	 * @return array
97
+	 * @throws UnexpectedEntityException
98
+	 */
99
+	protected function generateNewMappingSchema()
100
+	{
101
+		$schema_map = array();
102
+		foreach ($this->mapping() as $map_model => $map_for_model) {
103
+			/**
104
+			 * @var string $calculation_index
105
+			 * @var string $calculations_class
106
+			 */
107
+			foreach ($map_for_model as $calculation_index => $calculations_class) {
108
+				$calculator = $this->factory->createFromClassname($calculations_class);
109
+				$schema = call_user_func(array($calculator, 'schemaForCalculation'), $calculation_index);
110
+				if (! empty($schema)) {
111
+					$schema_map[ $map_model ][ $calculation_index ] = $schema;
112
+				}
113
+			}
114
+		}
115
+		return $schema_map;
116
+	}
117
+
118
+
119
+	/**
120
+	 * Gets the known calculated fields for model
121
+	 *
122
+	 * @param EEM_Base $model
123
+	 * @return array allowable values for this field
124
+	 */
125
+	public function retrieveCalculatedFieldsForModel(EEM_Base $model)
126
+	{
127
+		$mapping = $this->mapping();
128
+		if (isset($mapping[ $model->get_this_model_name() ])) {
129
+			return array_keys($mapping[ $model->get_this_model_name() ]);
130
+		}
131
+		return array();
132
+	}
133
+
134
+
135
+	/**
136
+	 * Returns the JsonSchema for the calculated fields on the given model.
137
+	 * @param EEM_Base $model
138
+	 * @return array
139
+	 */
140
+	public function getJsonSchemaForModel(EEM_Base $model)
141
+	{
142
+		if (! $this->mapping_schema) {
143
+			$this->mapping_schema = $this->generateNewMappingSchema();
144
+		}
145
+		return array(
146
+			'description' => esc_html__(
147
+				'Available calculated fields for this model.  Fields are only present in the response if explicitly requested',
148
+				'event_espresso'
149
+			),
150
+			'type' => 'object',
151
+			'properties' => isset($this->mapping_schema[ $model->get_this_model_name() ])
152
+				? $this->mapping_schema[ $model->get_this_model_name() ]
153
+				: array(),
154
+			'additionalProperties' => false,
155
+			'readonly' => true,
156
+		);
157
+	}
158
+
159
+
160
+	/**
161
+	 * Retrieves the value for this calculation
162
+	 *
163
+	 * @param EEM_Base $model
164
+	 * @param string $field_name
165
+	 * @param array $wpdb_row
166
+	 * @param $rest_request
167
+	 * @param BaseController $controller
168
+	 * @return mixed|null
169
+	 * @throws RestException
170
+	 * @throws UnexpectedEntityException
171
+	 */
172
+	public function retrieveCalculatedFieldValue(
173
+		EEM_Base $model,
174
+		$field_name,
175
+		$wpdb_row,
176
+		$rest_request,
177
+		Base $controller
178
+	) {
179
+		$mapping = $this->mapping();
180
+		if (
181
+			isset($mapping[ $model->get_this_model_name() ])
182
+			&& isset($mapping[ $model->get_this_model_name() ][ $field_name ])
183
+		) {
184
+			$classname = $mapping[ $model->get_this_model_name() ][ $field_name ];
185
+			$calculator = $this->factory->createFromClassname($classname);
186
+			$class_method_name = EEH_Inflector::camelize_all_but_first($field_name);
187
+			return call_user_func(array($calculator, $class_method_name), $wpdb_row, $rest_request, $controller);
188
+		}
189
+		throw new RestException(
190
+			'calculated_field_does_not_exist',
191
+			sprintf(
192
+				esc_html__('There is no calculated field %1$s on resource %2$s', 'event_espresso'),
193
+				$field_name,
194
+				$model->get_this_model_name()
195
+			)
196
+		);
197
+	}
198 198
 }
Please login to merge, or discard this patch.
core/libraries/rest_api/ModelVersionInfo.php 2 patches
Spacing   +12 added lines, -12 removed lines patch added patch discarded remove patch
@@ -114,10 +114,10 @@  discard block
 block discarded – undo
114 114
         foreach ($this->resource_changes as $version => $model_classnames) {
115 115
             foreach ($model_classnames as $model_classname => $extra_fields) {
116 116
                 foreach ($extra_fields as $fieldname => $field_data) {
117
-                    $this->resource_changes[ $model_classname ][ $fieldname ]['name'] = $fieldname;
117
+                    $this->resource_changes[$model_classname][$fieldname]['name'] = $fieldname;
118 118
                     foreach ($defaults as $attribute => $default_value) {
119
-                        if (! isset($this->resource_changes[ $model_classname ][ $fieldname ][ $attribute ])) {
120
-                            $this->resource_changes[ $model_classname ][ $fieldname ][ $attribute ] = $default_value;
119
+                        if ( ! isset($this->resource_changes[$model_classname][$fieldname][$attribute])) {
120
+                            $this->resource_changes[$model_classname][$fieldname][$attribute] = $default_value;
121 121
                         }
122 122
                     }
123 123
                 }
@@ -139,7 +139,7 @@  discard block
 block discarded – undo
139 139
             $model_changes = array();
140 140
             foreach ($this->modelChanges() as $version => $models_changed_in_version) {
141 141
                 if ($version <= EED_Core_Rest_Api::core_version() && $version > $this->requestedVersion()) {
142
-                    $model_changes[ $version ] = $models_changed_in_version;
142
+                    $model_changes[$version] = $models_changed_in_version;
143 143
                 }
144 144
             }
145 145
             $this->cached_model_changes_between_requested_version_and_current = $model_changes;
@@ -161,7 +161,7 @@  discard block
 block discarded – undo
161 161
             $resource_changes = array();
162 162
             foreach ($this->resourceChanges() as $version => $model_classnames) {
163 163
                 if ($version <= EED_Core_Rest_Api::core_version() && $version > $this->requestedVersion()) {
164
-                    $resource_changes[ $version ] = $model_classnames;
164
+                    $resource_changes[$version] = $model_classnames;
165 165
                 }
166 166
             }
167 167
             $this->cached_resource_changes_between_requested_version_and_current = $resource_changes;
@@ -212,7 +212,7 @@  discard block
 block discarded – undo
212 212
             foreach ($this->modelChangesBetweenRequestedVersionAndCurrent() as $version => $models_changed) {
213 213
                 foreach ($models_changed as $model_name => $new_indicator_or_fields_added) {
214 214
                     if ($new_indicator_or_fields_added === ModelVersionInfo::MODEL_ADDED) {
215
-                        unset($all_models_in_current_version[ $model_name ]);
215
+                        unset($all_models_in_current_version[$model_name]);
216 216
                     }
217 217
                 }
218 218
             }
@@ -237,7 +237,7 @@  discard block
 block discarded – undo
237 237
     public function isModelNameInThisVersion($model_name)
238 238
     {
239 239
         $model_names = $this->modelsForRequestedVersion();
240
-        if (isset($model_names[ $model_name ])) {
240
+        if (isset($model_names[$model_name])) {
241 241
             return true;
242 242
         } else {
243 243
             return false;
@@ -280,7 +280,7 @@  discard block
 block discarded – undo
280 280
      */
281 281
     public function fieldsOnModelInThisVersion($model)
282 282
     {
283
-        if (! isset($this->cached_fields_on_models[ $model->get_this_model_name() ])) {
283
+        if ( ! isset($this->cached_fields_on_models[$model->get_this_model_name()])) {
284 284
             // get all model changes between the requested version and current core version
285 285
             $changes = $this->modelChangesBetweenRequestedVersionAndCurrent();
286 286
             // fetch all fields currently on this model
@@ -288,12 +288,12 @@  discard block
 block discarded – undo
288 288
             // remove all fields that have been added since
289 289
             foreach ($changes as $version => $changes_in_version) {
290 290
                 if (
291
-                    isset($changes_in_version[ $model->get_this_model_name() ])
292
-                    && $changes_in_version[ $model->get_this_model_name() ] !== ModelVersionInfo::MODEL_ADDED
291
+                    isset($changes_in_version[$model->get_this_model_name()])
292
+                    && $changes_in_version[$model->get_this_model_name()] !== ModelVersionInfo::MODEL_ADDED
293 293
                 ) {
294 294
                     $current_fields = array_diff_key(
295 295
                         $current_fields,
296
-                        array_flip($changes_in_version[ $model->get_this_model_name() ])
296
+                        array_flip($changes_in_version[$model->get_this_model_name()])
297 297
                     );
298 298
                 }
299 299
             }
@@ -448,7 +448,7 @@  discard block
 block discarded – undo
448 448
         $relations = array();
449 449
         foreach ($model->relation_settings() as $relation_name => $relation_obj) {
450 450
             if ($this->isModelNameInThisVersion($relation_name)) {
451
-                $relations[ $relation_name ] = $relation_obj;
451
+                $relations[$relation_name] = $relation_obj;
452 452
             }
453 453
         }
454 454
         // filter the results, but use the old filter name
Please login to merge, or discard this patch.
Indentation   +437 added lines, -437 removed lines patch added patch discarded remove patch
@@ -20,441 +20,441 @@
 block discarded – undo
20 20
  */
21 21
 class ModelVersionInfo
22 22
 {
23
-    /**
24
-     * Constant used in the $_model_changes array to indicate that a model
25
-     * was completely new in this version
26
-     */
27
-    const MODEL_ADDED = 'model_added_in_this_version';
28
-
29
-    /**
30
-     * Top-level keys are versions (major and minor version numbers, eg "4.6")
31
-     * next-level keys are model names (eg "Event") that underwent some change in that version
32
-     * and the value is either Model_Version_Info::model_added (indicating the model is completely NEW in this version),
33
-     * or it's an array where the values are model field names,
34
-     * or API resource properties (ie, non-model fields that appear in REST API results)
35
-     * If a version is missing then we don't know anything about what changes it introduced from the previous version
36
-     *
37
-     * @var array
38
-     */
39
-    protected $model_changes = array();
40
-
41
-    /**
42
-     * top-level keys are version numbers,
43
-     * next-level keys are model CLASSNAMES (even parent classnames),
44
-     * and next-level keys are extra resource properties to attach to those models' resources,
45
-     * and next-level key-value pairs, where the keys are:
46
-     * 'raw', 'type', 'nullable', 'table_alias', 'table_column',  'always_available'
47
-     *
48
-     * @var array
49
-     */
50
-    protected $resource_changes = array();
51
-
52
-    /**
53
-     * @var string indicating what version of the API was requested
54
-     * (eg although core might be at version 4.8.11, they may have sent a request
55
-     * for 4.6)
56
-     */
57
-    protected $requested_version = null;
58
-
59
-    /**
60
-     * Keys are model names, values are their classnames.
61
-     * We cache this so we only need to calculate this once per request
62
-     *
63
-     * @var array
64
-     */
65
-    protected $cached_models_for_requested_version = null;
66
-
67
-    /**
68
-     * @var array
69
-     */
70
-    protected $cached_model_changes_between_requested_version_and_current = null;
71
-
72
-    /**
73
-     * @var array
74
-     */
75
-    protected $cached_resource_changes_between_requested_version_and_current = null;
76
-
77
-    /**
78
-     * 2d array where top-level keys are model names, 2nd-level keys are field names
79
-     * and values are the actual field objects
80
-     *
81
-     * @var array
82
-     */
83
-    protected $cached_fields_on_models = array();
84
-
85
-
86
-    /**
87
-     * Model_Version_Info constructor.
88
-     *
89
-     * @param string $requested_version
90
-     */
91
-    public function __construct($requested_version)
92
-    {
93
-        $this->requested_version = (string) $requested_version;
94
-        $this->model_changes = array(
95
-            '4.8.29' => array(
96
-                // first version where the REST API is in EE core, so no need
97
-                // to specify how its different from the previous
98
-            ),
99
-        );
100
-        // setup data for "extra" fields added onto resources which don't actually exist on models
101
-        $this->resource_changes = apply_filters(
102
-            'FHEE__Model_Version_Info___construct__extra_resource_properties_for_models',
103
-            array()
104
-        );
105
-        $defaults = array(
106
-            'raw'              => false,
107
-            'type'             => 'N/A',
108
-            'nullable'         => true,
109
-            'table_alias'      => 'N/A',
110
-            'table_column'     => 'N/A',
111
-            'always_available' => true,
112
-        );
113
-        foreach ($this->resource_changes as $version => $model_classnames) {
114
-            foreach ($model_classnames as $model_classname => $extra_fields) {
115
-                foreach ($extra_fields as $fieldname => $field_data) {
116
-                    $this->resource_changes[ $model_classname ][ $fieldname ]['name'] = $fieldname;
117
-                    foreach ($defaults as $attribute => $default_value) {
118
-                        if (! isset($this->resource_changes[ $model_classname ][ $fieldname ][ $attribute ])) {
119
-                            $this->resource_changes[ $model_classname ][ $fieldname ][ $attribute ] = $default_value;
120
-                        }
121
-                    }
122
-                }
123
-            }
124
-        }
125
-    }
126
-
127
-
128
-    /**
129
-     * Returns a slice of Model_Version_Info::model_changes()'s array
130
-     * indicating exactly what changes happened between the current core version,
131
-     * and the version requested
132
-     *
133
-     * @return array
134
-     */
135
-    public function modelChangesBetweenRequestedVersionAndCurrent()
136
-    {
137
-        if ($this->cached_model_changes_between_requested_version_and_current === null) {
138
-            $model_changes = array();
139
-            foreach ($this->modelChanges() as $version => $models_changed_in_version) {
140
-                if ($version <= EED_Core_Rest_Api::core_version() && $version > $this->requestedVersion()) {
141
-                    $model_changes[ $version ] = $models_changed_in_version;
142
-                }
143
-            }
144
-            $this->cached_model_changes_between_requested_version_and_current = $model_changes;
145
-        }
146
-        return $this->cached_model_changes_between_requested_version_and_current;
147
-    }
148
-
149
-
150
-    /**
151
-     * Returns a slice of Model_Version_Info::model_changes()'s array
152
-     * indicating exactly what changes happened between the current core version,
153
-     * and the version requested
154
-     *
155
-     * @return array
156
-     */
157
-    public function resourceChangesBetweenRequestedVersionAndCurrent()
158
-    {
159
-        if ($this->cached_resource_changes_between_requested_version_and_current === null) {
160
-            $resource_changes = array();
161
-            foreach ($this->resourceChanges() as $version => $model_classnames) {
162
-                if ($version <= EED_Core_Rest_Api::core_version() && $version > $this->requestedVersion()) {
163
-                    $resource_changes[ $version ] = $model_classnames;
164
-                }
165
-            }
166
-            $this->cached_resource_changes_between_requested_version_and_current = $resource_changes;
167
-        }
168
-        return $this->cached_resource_changes_between_requested_version_and_current;
169
-    }
170
-
171
-
172
-    /**
173
-     * If a request was sent to 'wp-json/ee/v4.7/events' this would be '4.7'
174
-     *
175
-     * @return string like '4.6'
176
-     */
177
-    public function requestedVersion()
178
-    {
179
-        return $this->requested_version;
180
-    }
181
-
182
-
183
-    /**
184
-     * Returns an array describing how the models have changed in each version of core
185
-     * that supports the API (starting at 4.6)
186
-     * Top-level keys are versions (major and minor version numbers, eg "4.6")
187
-     * next-level keys are model names (eg "Event") that underwent some change in that version
188
-     * and the value is either NULL (indicating the model is completely NEW in this version),
189
-     * or it's an array where fields are value names.
190
-     * If a version is missing then we don't know anything about what changes it introduced from the previous version
191
-     *
192
-     * @return array
193
-     */
194
-    public function modelChanges()
195
-    {
196
-        return $this->model_changes;
197
-    }
198
-
199
-
200
-    /**
201
-     * Takes into account the requested version, and the current version, and
202
-     * what changed between the two, and tries to return.
203
-     * Analogous to EE_Registry::instance()->non_abstract_db_models
204
-     *
205
-     * @return array keys are model names, values are their classname
206
-     */
207
-    public function modelsForRequestedVersion()
208
-    {
209
-        if ($this->cached_models_for_requested_version === null) {
210
-            $all_models_in_current_version = EE_Registry::instance()->non_abstract_db_models;
211
-            foreach ($this->modelChangesBetweenRequestedVersionAndCurrent() as $version => $models_changed) {
212
-                foreach ($models_changed as $model_name => $new_indicator_or_fields_added) {
213
-                    if ($new_indicator_or_fields_added === ModelVersionInfo::MODEL_ADDED) {
214
-                        unset($all_models_in_current_version[ $model_name ]);
215
-                    }
216
-                }
217
-            }
218
-            $this->cached_models_for_requested_version = apply_filters(
219
-                'FHEE__EventEspresso_core_libraries_rest_api__models_for_requested_version',
220
-                $all_models_in_current_version,
221
-                $this
222
-            );
223
-        }
224
-        return $this->cached_models_for_requested_version;
225
-    }
226
-
227
-
228
-    /**
229
-     * Determines if this is a valid model name in the requested version.
230
-     * Similar to EE_Registry::instance()->is_model_name(), but takes the requested
231
-     * version's models into account
232
-     *
233
-     * @param string $model_name eg 'Event'
234
-     * @return boolean
235
-     */
236
-    public function isModelNameInThisVersion($model_name)
237
-    {
238
-        $model_names = $this->modelsForRequestedVersion();
239
-        if (isset($model_names[ $model_name ])) {
240
-            return true;
241
-        } else {
242
-            return false;
243
-        }
244
-    }
245
-
246
-
247
-    /**
248
-     * Wrapper for EE_Registry::instance()->load_model(), but takes the requested
249
-     * version's models into account
250
-     *
251
-     * @param string $model_name
252
-     * @return \EEM_Base
253
-     * @throws \EE_Error
254
-     */
255
-    public function loadModel($model_name)
256
-    {
257
-        if ($this->isModelNameInThisVersion($model_name)) {
258
-            return EE_Registry::instance()->load_model($model_name);
259
-        } else {
260
-            throw new \EE_Error(
261
-                sprintf(
262
-                    esc_html__(
263
-                        'Cannot load model "%1$s" because it does not exist in version %2$s of Event Espresso',
264
-                        'event_espresso'
265
-                    ),
266
-                    $model_name,
267
-                    $this->requestedVersion()
268
-                )
269
-            );
270
-        }
271
-    }
272
-
273
-
274
-    /**
275
-     * Gets all the fields that should exist on this model right now
276
-     *
277
-     * @param \EEM_Base $model
278
-     * @return array|\EE_Model_Field_Base[]
279
-     */
280
-    public function fieldsOnModelInThisVersion($model)
281
-    {
282
-        if (! isset($this->cached_fields_on_models[ $model->get_this_model_name() ])) {
283
-            // get all model changes between the requested version and current core version
284
-            $changes = $this->modelChangesBetweenRequestedVersionAndCurrent();
285
-            // fetch all fields currently on this model
286
-            $current_fields = $model->field_settings();
287
-            // remove all fields that have been added since
288
-            foreach ($changes as $version => $changes_in_version) {
289
-                if (
290
-                    isset($changes_in_version[ $model->get_this_model_name() ])
291
-                    && $changes_in_version[ $model->get_this_model_name() ] !== ModelVersionInfo::MODEL_ADDED
292
-                ) {
293
-                    $current_fields = array_diff_key(
294
-                        $current_fields,
295
-                        array_flip($changes_in_version[ $model->get_this_model_name() ])
296
-                    );
297
-                }
298
-            }
299
-            $this->cached_fields_on_models = $current_fields;
300
-        }
301
-        return $this->cached_fields_on_models;
302
-    }
303
-
304
-
305
-    /**
306
-     * Determines if $object is of one of the classes of $classes. Similar to
307
-     * in_array(), except this checks if $object is a subclass of the classnames provided
308
-     * in $classnames
309
-     *
310
-     * @param object $object
311
-     * @param array  $classnames
312
-     * @return boolean
313
-     */
314
-    public function isSubclassOfOne($object, $classnames)
315
-    {
316
-        foreach ($classnames as $classname) {
317
-            if (is_a($object, $classname)) {
318
-                return true;
319
-            }
320
-        }
321
-        return false;
322
-    }
323
-
324
-
325
-    /**
326
-     * Returns the list of model field classes that that the API basically ignores
327
-     *
328
-     * @return array
329
-     */
330
-    public function fieldsIgnored()
331
-    {
332
-        return apply_filters(
333
-            'FHEE__Controller_Model_Read_fields_ignored',
334
-            array()
335
-        );
336
-    }
337
-
338
-
339
-    /**
340
-     * If this field one that should be ignored by the API?
341
-     *
342
-     * @param EE_Model_Field_Base
343
-     * @return boolean
344
-     */
345
-    public function fieldIsIgnored($field_obj)
346
-    {
347
-        return $this->isSubclassOfOne($field_obj, $this->fieldsIgnored());
348
-    }
349
-
350
-
351
-    /**
352
-     * Returns the list of model field classes that have a "raw" and non-raw formats.
353
-     * Normally the "raw" versions are only accessible to those who can edit them.
354
-     *
355
-     * @return array an array of EE_Model_Field_Base child classnames
356
-     */
357
-    public function fieldsThatHaveRenderedFormat()
358
-    {
359
-        return apply_filters(
360
-            'FHEE__Controller_Model_Read__fields_raw',
361
-            array('EE_Post_Content_Field', 'EE_Full_HTML_Field')
362
-        );
363
-    }
364
-
365
-
366
-    /**
367
-     * If this field one that has a raw format
368
-     *
369
-     * @param EE_Model_Field_Base
370
-     * @return boolean
371
-     */
372
-    public function fieldHasRenderedFormat($field_obj)
373
-    {
374
-        return $this->isSubclassOfOne($field_obj, $this->fieldsThatHaveRenderedFormat());
375
-    }
376
-
377
-
378
-    /**
379
-     * Returns the list of model field classes that have a "_pretty" and non-pretty versions.
380
-     * The pretty version of the field is NOT query-able or editable, but requires no extra permissions
381
-     * to view
382
-     *
383
-     * @return array an array of EE_Model_Field_Base child classnames
384
-     */
385
-    public function fieldsThatHavePrettyFormat()
386
-    {
387
-        return apply_filters(
388
-            'FHEE__Controller_Model_Read__fields_pretty',
389
-            array('EE_Enum_Integer_Field', 'EE_Enum_Text_Field', 'EE_Money_Field')
390
-        );
391
-    }
392
-
393
-
394
-    /**
395
-     * If this field one that has a pretty equivalent
396
-     *
397
-     * @param EE_Model_Field_Base
398
-     * @return boolean
399
-     */
400
-    public function fieldHasPrettyFormat($field_obj)
401
-    {
402
-        return $this->isSubclassOfOne($field_obj, $this->fieldsThatHavePrettyFormat());
403
-    }
404
-
405
-
406
-    /**
407
-     * Returns an array describing what extra API resource properties have been added through the versions
408
-     *
409
-     * @return array @see $this->_extra_resource_properties_for_models
410
-     */
411
-    public function resourceChanges()
412
-    {
413
-        return $this->resource_changes;
414
-    }
415
-
416
-
417
-    /**
418
-     * Returns an array where keys are extra resource properties in this version of the API,
419
-     * and values are key-value pairs describing the new properties. @see Model_Version::_resource_changes
420
-     *
421
-     * @param \EEM_Base $model
422
-     * @return array
423
-     */
424
-    public function extraResourcePropertiesForModel($model)
425
-    {
426
-        $extra_properties = array();
427
-        foreach ($this->resourceChangesBetweenRequestedVersionAndCurrent() as $version => $model_classnames) {
428
-            foreach ($model_classnames as $model_classname => $properties_added_in_this_version) {
429
-                if (is_subclass_of($model, $model_classname)) {
430
-                    $extra_properties = array_merge($extra_properties, $properties_added_in_this_version);
431
-                }
432
-            }
433
-        }
434
-        return $extra_properties;
435
-    }
436
-
437
-
438
-    /**
439
-     * Gets all the related models for the specified model. It's good to use this
440
-     * in case this model didn't exist for this version or something
441
-     *
442
-     * @param \EEM_Base $model
443
-     * @return \EE_Model_Relation_Base[]
444
-     */
445
-    public function relationSettings(\EEM_Base $model)
446
-    {
447
-        $relations = array();
448
-        foreach ($model->relation_settings() as $relation_name => $relation_obj) {
449
-            if ($this->isModelNameInThisVersion($relation_name)) {
450
-                $relations[ $relation_name ] = $relation_obj;
451
-            }
452
-        }
453
-        // filter the results, but use the old filter name
454
-        return apply_filters(
455
-            'FHEE__Read__create_entity_from_wpdb_result__related_models_to_include',
456
-            $relations,
457
-            $model
458
-        );
459
-    }
23
+	/**
24
+	 * Constant used in the $_model_changes array to indicate that a model
25
+	 * was completely new in this version
26
+	 */
27
+	const MODEL_ADDED = 'model_added_in_this_version';
28
+
29
+	/**
30
+	 * Top-level keys are versions (major and minor version numbers, eg "4.6")
31
+	 * next-level keys are model names (eg "Event") that underwent some change in that version
32
+	 * and the value is either Model_Version_Info::model_added (indicating the model is completely NEW in this version),
33
+	 * or it's an array where the values are model field names,
34
+	 * or API resource properties (ie, non-model fields that appear in REST API results)
35
+	 * If a version is missing then we don't know anything about what changes it introduced from the previous version
36
+	 *
37
+	 * @var array
38
+	 */
39
+	protected $model_changes = array();
40
+
41
+	/**
42
+	 * top-level keys are version numbers,
43
+	 * next-level keys are model CLASSNAMES (even parent classnames),
44
+	 * and next-level keys are extra resource properties to attach to those models' resources,
45
+	 * and next-level key-value pairs, where the keys are:
46
+	 * 'raw', 'type', 'nullable', 'table_alias', 'table_column',  'always_available'
47
+	 *
48
+	 * @var array
49
+	 */
50
+	protected $resource_changes = array();
51
+
52
+	/**
53
+	 * @var string indicating what version of the API was requested
54
+	 * (eg although core might be at version 4.8.11, they may have sent a request
55
+	 * for 4.6)
56
+	 */
57
+	protected $requested_version = null;
58
+
59
+	/**
60
+	 * Keys are model names, values are their classnames.
61
+	 * We cache this so we only need to calculate this once per request
62
+	 *
63
+	 * @var array
64
+	 */
65
+	protected $cached_models_for_requested_version = null;
66
+
67
+	/**
68
+	 * @var array
69
+	 */
70
+	protected $cached_model_changes_between_requested_version_and_current = null;
71
+
72
+	/**
73
+	 * @var array
74
+	 */
75
+	protected $cached_resource_changes_between_requested_version_and_current = null;
76
+
77
+	/**
78
+	 * 2d array where top-level keys are model names, 2nd-level keys are field names
79
+	 * and values are the actual field objects
80
+	 *
81
+	 * @var array
82
+	 */
83
+	protected $cached_fields_on_models = array();
84
+
85
+
86
+	/**
87
+	 * Model_Version_Info constructor.
88
+	 *
89
+	 * @param string $requested_version
90
+	 */
91
+	public function __construct($requested_version)
92
+	{
93
+		$this->requested_version = (string) $requested_version;
94
+		$this->model_changes = array(
95
+			'4.8.29' => array(
96
+				// first version where the REST API is in EE core, so no need
97
+				// to specify how its different from the previous
98
+			),
99
+		);
100
+		// setup data for "extra" fields added onto resources which don't actually exist on models
101
+		$this->resource_changes = apply_filters(
102
+			'FHEE__Model_Version_Info___construct__extra_resource_properties_for_models',
103
+			array()
104
+		);
105
+		$defaults = array(
106
+			'raw'              => false,
107
+			'type'             => 'N/A',
108
+			'nullable'         => true,
109
+			'table_alias'      => 'N/A',
110
+			'table_column'     => 'N/A',
111
+			'always_available' => true,
112
+		);
113
+		foreach ($this->resource_changes as $version => $model_classnames) {
114
+			foreach ($model_classnames as $model_classname => $extra_fields) {
115
+				foreach ($extra_fields as $fieldname => $field_data) {
116
+					$this->resource_changes[ $model_classname ][ $fieldname ]['name'] = $fieldname;
117
+					foreach ($defaults as $attribute => $default_value) {
118
+						if (! isset($this->resource_changes[ $model_classname ][ $fieldname ][ $attribute ])) {
119
+							$this->resource_changes[ $model_classname ][ $fieldname ][ $attribute ] = $default_value;
120
+						}
121
+					}
122
+				}
123
+			}
124
+		}
125
+	}
126
+
127
+
128
+	/**
129
+	 * Returns a slice of Model_Version_Info::model_changes()'s array
130
+	 * indicating exactly what changes happened between the current core version,
131
+	 * and the version requested
132
+	 *
133
+	 * @return array
134
+	 */
135
+	public function modelChangesBetweenRequestedVersionAndCurrent()
136
+	{
137
+		if ($this->cached_model_changes_between_requested_version_and_current === null) {
138
+			$model_changes = array();
139
+			foreach ($this->modelChanges() as $version => $models_changed_in_version) {
140
+				if ($version <= EED_Core_Rest_Api::core_version() && $version > $this->requestedVersion()) {
141
+					$model_changes[ $version ] = $models_changed_in_version;
142
+				}
143
+			}
144
+			$this->cached_model_changes_between_requested_version_and_current = $model_changes;
145
+		}
146
+		return $this->cached_model_changes_between_requested_version_and_current;
147
+	}
148
+
149
+
150
+	/**
151
+	 * Returns a slice of Model_Version_Info::model_changes()'s array
152
+	 * indicating exactly what changes happened between the current core version,
153
+	 * and the version requested
154
+	 *
155
+	 * @return array
156
+	 */
157
+	public function resourceChangesBetweenRequestedVersionAndCurrent()
158
+	{
159
+		if ($this->cached_resource_changes_between_requested_version_and_current === null) {
160
+			$resource_changes = array();
161
+			foreach ($this->resourceChanges() as $version => $model_classnames) {
162
+				if ($version <= EED_Core_Rest_Api::core_version() && $version > $this->requestedVersion()) {
163
+					$resource_changes[ $version ] = $model_classnames;
164
+				}
165
+			}
166
+			$this->cached_resource_changes_between_requested_version_and_current = $resource_changes;
167
+		}
168
+		return $this->cached_resource_changes_between_requested_version_and_current;
169
+	}
170
+
171
+
172
+	/**
173
+	 * If a request was sent to 'wp-json/ee/v4.7/events' this would be '4.7'
174
+	 *
175
+	 * @return string like '4.6'
176
+	 */
177
+	public function requestedVersion()
178
+	{
179
+		return $this->requested_version;
180
+	}
181
+
182
+
183
+	/**
184
+	 * Returns an array describing how the models have changed in each version of core
185
+	 * that supports the API (starting at 4.6)
186
+	 * Top-level keys are versions (major and minor version numbers, eg "4.6")
187
+	 * next-level keys are model names (eg "Event") that underwent some change in that version
188
+	 * and the value is either NULL (indicating the model is completely NEW in this version),
189
+	 * or it's an array where fields are value names.
190
+	 * If a version is missing then we don't know anything about what changes it introduced from the previous version
191
+	 *
192
+	 * @return array
193
+	 */
194
+	public function modelChanges()
195
+	{
196
+		return $this->model_changes;
197
+	}
198
+
199
+
200
+	/**
201
+	 * Takes into account the requested version, and the current version, and
202
+	 * what changed between the two, and tries to return.
203
+	 * Analogous to EE_Registry::instance()->non_abstract_db_models
204
+	 *
205
+	 * @return array keys are model names, values are their classname
206
+	 */
207
+	public function modelsForRequestedVersion()
208
+	{
209
+		if ($this->cached_models_for_requested_version === null) {
210
+			$all_models_in_current_version = EE_Registry::instance()->non_abstract_db_models;
211
+			foreach ($this->modelChangesBetweenRequestedVersionAndCurrent() as $version => $models_changed) {
212
+				foreach ($models_changed as $model_name => $new_indicator_or_fields_added) {
213
+					if ($new_indicator_or_fields_added === ModelVersionInfo::MODEL_ADDED) {
214
+						unset($all_models_in_current_version[ $model_name ]);
215
+					}
216
+				}
217
+			}
218
+			$this->cached_models_for_requested_version = apply_filters(
219
+				'FHEE__EventEspresso_core_libraries_rest_api__models_for_requested_version',
220
+				$all_models_in_current_version,
221
+				$this
222
+			);
223
+		}
224
+		return $this->cached_models_for_requested_version;
225
+	}
226
+
227
+
228
+	/**
229
+	 * Determines if this is a valid model name in the requested version.
230
+	 * Similar to EE_Registry::instance()->is_model_name(), but takes the requested
231
+	 * version's models into account
232
+	 *
233
+	 * @param string $model_name eg 'Event'
234
+	 * @return boolean
235
+	 */
236
+	public function isModelNameInThisVersion($model_name)
237
+	{
238
+		$model_names = $this->modelsForRequestedVersion();
239
+		if (isset($model_names[ $model_name ])) {
240
+			return true;
241
+		} else {
242
+			return false;
243
+		}
244
+	}
245
+
246
+
247
+	/**
248
+	 * Wrapper for EE_Registry::instance()->load_model(), but takes the requested
249
+	 * version's models into account
250
+	 *
251
+	 * @param string $model_name
252
+	 * @return \EEM_Base
253
+	 * @throws \EE_Error
254
+	 */
255
+	public function loadModel($model_name)
256
+	{
257
+		if ($this->isModelNameInThisVersion($model_name)) {
258
+			return EE_Registry::instance()->load_model($model_name);
259
+		} else {
260
+			throw new \EE_Error(
261
+				sprintf(
262
+					esc_html__(
263
+						'Cannot load model "%1$s" because it does not exist in version %2$s of Event Espresso',
264
+						'event_espresso'
265
+					),
266
+					$model_name,
267
+					$this->requestedVersion()
268
+				)
269
+			);
270
+		}
271
+	}
272
+
273
+
274
+	/**
275
+	 * Gets all the fields that should exist on this model right now
276
+	 *
277
+	 * @param \EEM_Base $model
278
+	 * @return array|\EE_Model_Field_Base[]
279
+	 */
280
+	public function fieldsOnModelInThisVersion($model)
281
+	{
282
+		if (! isset($this->cached_fields_on_models[ $model->get_this_model_name() ])) {
283
+			// get all model changes between the requested version and current core version
284
+			$changes = $this->modelChangesBetweenRequestedVersionAndCurrent();
285
+			// fetch all fields currently on this model
286
+			$current_fields = $model->field_settings();
287
+			// remove all fields that have been added since
288
+			foreach ($changes as $version => $changes_in_version) {
289
+				if (
290
+					isset($changes_in_version[ $model->get_this_model_name() ])
291
+					&& $changes_in_version[ $model->get_this_model_name() ] !== ModelVersionInfo::MODEL_ADDED
292
+				) {
293
+					$current_fields = array_diff_key(
294
+						$current_fields,
295
+						array_flip($changes_in_version[ $model->get_this_model_name() ])
296
+					);
297
+				}
298
+			}
299
+			$this->cached_fields_on_models = $current_fields;
300
+		}
301
+		return $this->cached_fields_on_models;
302
+	}
303
+
304
+
305
+	/**
306
+	 * Determines if $object is of one of the classes of $classes. Similar to
307
+	 * in_array(), except this checks if $object is a subclass of the classnames provided
308
+	 * in $classnames
309
+	 *
310
+	 * @param object $object
311
+	 * @param array  $classnames
312
+	 * @return boolean
313
+	 */
314
+	public function isSubclassOfOne($object, $classnames)
315
+	{
316
+		foreach ($classnames as $classname) {
317
+			if (is_a($object, $classname)) {
318
+				return true;
319
+			}
320
+		}
321
+		return false;
322
+	}
323
+
324
+
325
+	/**
326
+	 * Returns the list of model field classes that that the API basically ignores
327
+	 *
328
+	 * @return array
329
+	 */
330
+	public function fieldsIgnored()
331
+	{
332
+		return apply_filters(
333
+			'FHEE__Controller_Model_Read_fields_ignored',
334
+			array()
335
+		);
336
+	}
337
+
338
+
339
+	/**
340
+	 * If this field one that should be ignored by the API?
341
+	 *
342
+	 * @param EE_Model_Field_Base
343
+	 * @return boolean
344
+	 */
345
+	public function fieldIsIgnored($field_obj)
346
+	{
347
+		return $this->isSubclassOfOne($field_obj, $this->fieldsIgnored());
348
+	}
349
+
350
+
351
+	/**
352
+	 * Returns the list of model field classes that have a "raw" and non-raw formats.
353
+	 * Normally the "raw" versions are only accessible to those who can edit them.
354
+	 *
355
+	 * @return array an array of EE_Model_Field_Base child classnames
356
+	 */
357
+	public function fieldsThatHaveRenderedFormat()
358
+	{
359
+		return apply_filters(
360
+			'FHEE__Controller_Model_Read__fields_raw',
361
+			array('EE_Post_Content_Field', 'EE_Full_HTML_Field')
362
+		);
363
+	}
364
+
365
+
366
+	/**
367
+	 * If this field one that has a raw format
368
+	 *
369
+	 * @param EE_Model_Field_Base
370
+	 * @return boolean
371
+	 */
372
+	public function fieldHasRenderedFormat($field_obj)
373
+	{
374
+		return $this->isSubclassOfOne($field_obj, $this->fieldsThatHaveRenderedFormat());
375
+	}
376
+
377
+
378
+	/**
379
+	 * Returns the list of model field classes that have a "_pretty" and non-pretty versions.
380
+	 * The pretty version of the field is NOT query-able or editable, but requires no extra permissions
381
+	 * to view
382
+	 *
383
+	 * @return array an array of EE_Model_Field_Base child classnames
384
+	 */
385
+	public function fieldsThatHavePrettyFormat()
386
+	{
387
+		return apply_filters(
388
+			'FHEE__Controller_Model_Read__fields_pretty',
389
+			array('EE_Enum_Integer_Field', 'EE_Enum_Text_Field', 'EE_Money_Field')
390
+		);
391
+	}
392
+
393
+
394
+	/**
395
+	 * If this field one that has a pretty equivalent
396
+	 *
397
+	 * @param EE_Model_Field_Base
398
+	 * @return boolean
399
+	 */
400
+	public function fieldHasPrettyFormat($field_obj)
401
+	{
402
+		return $this->isSubclassOfOne($field_obj, $this->fieldsThatHavePrettyFormat());
403
+	}
404
+
405
+
406
+	/**
407
+	 * Returns an array describing what extra API resource properties have been added through the versions
408
+	 *
409
+	 * @return array @see $this->_extra_resource_properties_for_models
410
+	 */
411
+	public function resourceChanges()
412
+	{
413
+		return $this->resource_changes;
414
+	}
415
+
416
+
417
+	/**
418
+	 * Returns an array where keys are extra resource properties in this version of the API,
419
+	 * and values are key-value pairs describing the new properties. @see Model_Version::_resource_changes
420
+	 *
421
+	 * @param \EEM_Base $model
422
+	 * @return array
423
+	 */
424
+	public function extraResourcePropertiesForModel($model)
425
+	{
426
+		$extra_properties = array();
427
+		foreach ($this->resourceChangesBetweenRequestedVersionAndCurrent() as $version => $model_classnames) {
428
+			foreach ($model_classnames as $model_classname => $properties_added_in_this_version) {
429
+				if (is_subclass_of($model, $model_classname)) {
430
+					$extra_properties = array_merge($extra_properties, $properties_added_in_this_version);
431
+				}
432
+			}
433
+		}
434
+		return $extra_properties;
435
+	}
436
+
437
+
438
+	/**
439
+	 * Gets all the related models for the specified model. It's good to use this
440
+	 * in case this model didn't exist for this version or something
441
+	 *
442
+	 * @param \EEM_Base $model
443
+	 * @return \EE_Model_Relation_Base[]
444
+	 */
445
+	public function relationSettings(\EEM_Base $model)
446
+	{
447
+		$relations = array();
448
+		foreach ($model->relation_settings() as $relation_name => $relation_obj) {
449
+			if ($this->isModelNameInThisVersion($relation_name)) {
450
+				$relations[ $relation_name ] = $relation_obj;
451
+			}
452
+		}
453
+		// filter the results, but use the old filter name
454
+		return apply_filters(
455
+			'FHEE__Read__create_entity_from_wpdb_result__related_models_to_include',
456
+			$relations,
457
+			$model
458
+		);
459
+	}
460 460
 }
Please login to merge, or discard this patch.
core/libraries/messages/EE_Messages_Base.lib.php 2 patches
Spacing   +9 added lines, -9 removed lines patch added patch discarded remove patch
@@ -196,11 +196,11 @@  discard block
 block discarded – undo
196 196
             ! empty($messenger)
197 197
             && $Message_Resource_Manager->is_message_type_active_for_messenger($messenger, $this->name)
198 198
         ) {
199
-            $settings_to_use = $active_messengers[ $messenger ]['settings'][ $messenger . '-message_types' ];
199
+            $settings_to_use = $active_messengers[$messenger]['settings'][$messenger.'-message_types'];
200 200
         }
201 201
 
202
-        $this->_existing_admin_settings = isset($settings_to_use[ $this->name ]['settings'])
203
-            ? $settings_to_use[ $this->name ]['settings']
202
+        $this->_existing_admin_settings = isset($settings_to_use[$this->name]['settings'])
203
+            ? $settings_to_use[$this->name]['settings']
204 204
             : null;
205 205
     }
206 206
 
@@ -240,7 +240,7 @@  discard block
 block discarded – undo
240 240
     public function get_valid_shortcodes()
241 241
     {
242 242
         $valid_shortcodes = apply_filters(
243
-            'FHEE__' . get_class($this) . '__get_valid_shortcodes',
243
+            'FHEE__'.get_class($this).'__get_valid_shortcodes',
244 244
             $this->_valid_shortcodes,
245 245
             $this
246 246
         );
@@ -283,19 +283,19 @@  discard block
 block discarded – undo
283 283
     protected function _get_admin_page_content($page, $action, $extra, $actives)
284 284
     {
285 285
         // we can also further refine the context by action (if present).
286
-        if (!empty($action)) {
287
-            $page = $page . '_' . $action;
286
+        if ( ! empty($action)) {
287
+            $page = $page.'_'.$action;
288 288
         }
289 289
 
290
-        if (!isset($this->admin_registered_pages[ $page ])) {
290
+        if ( ! isset($this->admin_registered_pages[$page])) {
291 291
             // todo: a place to throw an exception?
292 292
             // We need to indicate there is no registered page so this function is not being called correctly.
293 293
             return false;
294 294
         }
295 295
         // k made it here so let's call the method
296 296
         $content = call_user_func_array(
297
-            array( $this, '_get_admin_content_' . $page ),
298
-            array( $actives, $extra )
297
+            array($this, '_get_admin_content_'.$page),
298
+            array($actives, $extra)
299 299
         );
300 300
         if ($content === false) {
301 301
             // todo this needs to be an exception once we've got exceptions in place.
Please login to merge, or discard this patch.
Indentation   +265 added lines, -265 removed lines patch added patch discarded remove patch
@@ -13,44 +13,44 @@  discard block
 block discarded – undo
13 13
  */
14 14
 abstract class EE_Messages_Base extends EE_Base
15 15
 {
16
-    /** DETAILS PROPERTIES **/
17
-    /**
18
-     * The following are used to hold details on the type for reference (i.e. on admin screens)
19
-     * and also used by the EE_message_type object to figure out where to get template data.
20
-     */
21
-    public $name;
22
-    public $description;
23
-    protected $_messages_item_type; // messenger OR message_type?
24
-
25
-
26
-    /**
27
-     * This is an array describing the ui facing labels
28
-     * that will be used whenever the messenger is referenced in the ui
29
-     *
30
-     * array(
31
-     *  'singular' => esc_html__('something'),
32
-     *  'plural' => esc_html__('somethings')
33
-     * )
34
-     *
35
-     * @var array
36
-     */
37
-    public $label;
38
-
39
-
40
-
41
-
42
-    /**
43
-     * This property when set will hold the slugs of all EE admin pages that we will need to retrieve fields for
44
-     * (and used to determine which callback method to call from the child class)
45
-     *
46
-     * structure should be
47
-     * array(
48
-     * 'page_action' => true
49
-     * )
50
-     *
16
+	/** DETAILS PROPERTIES **/
17
+	/**
18
+	 * The following are used to hold details on the type for reference (i.e. on admin screens)
19
+	 * and also used by the EE_message_type object to figure out where to get template data.
20
+	 */
21
+	public $name;
22
+	public $description;
23
+	protected $_messages_item_type; // messenger OR message_type?
24
+
25
+
26
+	/**
27
+	 * This is an array describing the ui facing labels
28
+	 * that will be used whenever the messenger is referenced in the ui
29
+	 *
30
+	 * array(
31
+	 *  'singular' => esc_html__('something'),
32
+	 *  'plural' => esc_html__('somethings')
33
+	 * )
34
+	 *
35
+	 * @var array
36
+	 */
37
+	public $label;
38
+
39
+
40
+
41
+
42
+	/**
43
+	 * This property when set will hold the slugs of all EE admin pages that we will need to retrieve fields for
44
+	 * (and used to determine which callback method to call from the child class)
45
+	 *
46
+	 * structure should be
47
+	 * array(
48
+	 * 'page_action' => true
49
+	 * )
50
+	 *
51 51
 *@var array
52
-     */
53
-    public $admin_registered_pages = array();
52
+	 */
53
+	public $admin_registered_pages = array();
54 54
 
55 55
 
56 56
 
@@ -59,265 +59,265 @@  discard block
 block discarded – undo
59 59
 
60 60
 
61 61
 
62
-    /**
63
-     * this property holds any specific fields for holding any settings related to a messenger (if any needed)
64
-     * @var array
65
-     */
66
-    protected $_admin_settings_fields = array();
62
+	/**
63
+	 * this property holds any specific fields for holding any settings related to a messenger (if any needed)
64
+	 * @var array
65
+	 */
66
+	protected $_admin_settings_fields = array();
67 67
 
68 68
 
69 69
 
70 70
 
71 71
 
72
-    /**
73
-     * this property will hold any existing settings that may have been set in the admin.
74
-     * @var array
75
-     */
76
-    protected $_existing_admin_settings = array();
72
+	/**
73
+	 * this property will hold any existing settings that may have been set in the admin.
74
+	 * @var array
75
+	 */
76
+	protected $_existing_admin_settings = array();
77 77
 
78 78
 
79 79
 
80 80
 
81 81
 
82
-    /**
83
-     * this property will hold an array of valid shortcodes for this message type and messengers.
84
-     * #For Message Types:
85
-     * This is an array of strings that correspond to defined EE_Shortcode libraries and per context.
86
-     * For example:
87
-     * array( 'admin' => array('transaction', 'event', 'attendee') )
88
-     * corresponds to 'EE_Transaction_Shortcodes.lib.php, EE_Event_Shortcodes.lib.php, EE_Attendee_Shortcodes.lib.php'
89
-     * for the admin context;
90
-     *
91
-     *
92
-     * #For Messengers:
93
-     * For example:
94
-     * array('subject' => array('transaction', 'event', 'attendee'))
95
-     * corresponds to 'EE_Transaction_Shortcodes.lib.php, EE_Event_Shortcodes.lib.php, EE_Attendee_Shortcodes.lib.php'
96
-     * for the 'subject' field;
97
-     * NOTE:  by default, with messengers, if the valid shortcodes for a field is left blank,
98
-     * that field will inherit whatever are set as valid shortcodes by message_type.
99
-     * This is so messenger can set specific valid codes for fields and leave other
100
-     * valid shortcodes up to the message type matched with the messenger.
101
-     *
102
-     * @access protected
103
-     * @var array
104
-     */
105
-    protected $_valid_shortcodes = array();
82
+	/**
83
+	 * this property will hold an array of valid shortcodes for this message type and messengers.
84
+	 * #For Message Types:
85
+	 * This is an array of strings that correspond to defined EE_Shortcode libraries and per context.
86
+	 * For example:
87
+	 * array( 'admin' => array('transaction', 'event', 'attendee') )
88
+	 * corresponds to 'EE_Transaction_Shortcodes.lib.php, EE_Event_Shortcodes.lib.php, EE_Attendee_Shortcodes.lib.php'
89
+	 * for the admin context;
90
+	 *
91
+	 *
92
+	 * #For Messengers:
93
+	 * For example:
94
+	 * array('subject' => array('transaction', 'event', 'attendee'))
95
+	 * corresponds to 'EE_Transaction_Shortcodes.lib.php, EE_Event_Shortcodes.lib.php, EE_Attendee_Shortcodes.lib.php'
96
+	 * for the 'subject' field;
97
+	 * NOTE:  by default, with messengers, if the valid shortcodes for a field is left blank,
98
+	 * that field will inherit whatever are set as valid shortcodes by message_type.
99
+	 * This is so messenger can set specific valid codes for fields and leave other
100
+	 * valid shortcodes up to the message type matched with the messenger.
101
+	 *
102
+	 * @access protected
103
+	 * @var array
104
+	 */
105
+	protected $_valid_shortcodes = array();
106 106
 
107 107
 
108 108
 
109 109
 
110 110
 
111
-    public function __construct()
112
-    {
113
-        $this->_set_admin_settings_fields();
114
-        $this->_set_valid_shortcodes();
115
-        $this->_set_admin_pages();
116
-    }
111
+	public function __construct()
112
+	{
113
+		$this->_set_admin_settings_fields();
114
+		$this->_set_valid_shortcodes();
115
+		$this->_set_admin_pages();
116
+	}
117 117
 
118 118
 
119 119
 
120 120
 
121 121
 
122
-    /**
123
-     * sets the _admin_settings_fields property which needs to be defined by child classes.
124
-     * You will want to set the _admin_settings_fields properties as a multi-dimensional array with the following format
125
-     * array(
126
-     *      {field_name - also used for setting index} => array(
127
-     *          'field_type' => {type of field: 'text', 'textarea', 'checkbox'},
128
-     *          'value_type' => {type of value: 'string', 'int', 'array', 'bool'},
129
-     *          'required' => {bool, required or not},
130
-     *          'validation' => {bool, true if we want validation, false if not},
131
-     *          'format' => {%d, or %s},
132
-     *          'label' => {label for the field, make sure it's localized},
133
-     *          'default' => {default value for the setting}
134
-     *      ),
135
-     * );
136
-     *
137
-     * @abstract
138
-     * @access protected
139
-     * @return void
140
-     */
141
-    abstract protected function _set_admin_settings_fields();
122
+	/**
123
+	 * sets the _admin_settings_fields property which needs to be defined by child classes.
124
+	 * You will want to set the _admin_settings_fields properties as a multi-dimensional array with the following format
125
+	 * array(
126
+	 *      {field_name - also used for setting index} => array(
127
+	 *          'field_type' => {type of field: 'text', 'textarea', 'checkbox'},
128
+	 *          'value_type' => {type of value: 'string', 'int', 'array', 'bool'},
129
+	 *          'required' => {bool, required or not},
130
+	 *          'validation' => {bool, true if we want validation, false if not},
131
+	 *          'format' => {%d, or %s},
132
+	 *          'label' => {label for the field, make sure it's localized},
133
+	 *          'default' => {default value for the setting}
134
+	 *      ),
135
+	 * );
136
+	 *
137
+	 * @abstract
138
+	 * @access protected
139
+	 * @return void
140
+	 */
141
+	abstract protected function _set_admin_settings_fields();
142 142
 
143 143
 
144 144
 
145 145
 
146 146
 
147
-    /**
148
-     * sets any properties on whether a message type or messenger interface shows up on a ee administration page.
149
-     * Child classes have to define this method but don't necessarily have to set the flags
150
-     * as they will be set to false by default.
151
-     *
152
-     * Child classes use this method to set the `_admin_registered_page` property.
153
-     * That property is to indicate what EE admin pages we have a corresponding callback for in the child class
154
-     * so Message Type/messenger fields/content is included on that admin page.
155
-     *
156
-     * @abstract
157
-     * @access protected
158
-     * @return void
159
-     */
160
-    abstract protected function _set_admin_pages();
147
+	/**
148
+	 * sets any properties on whether a message type or messenger interface shows up on a ee administration page.
149
+	 * Child classes have to define this method but don't necessarily have to set the flags
150
+	 * as they will be set to false by default.
151
+	 *
152
+	 * Child classes use this method to set the `_admin_registered_page` property.
153
+	 * That property is to indicate what EE admin pages we have a corresponding callback for in the child class
154
+	 * so Message Type/messenger fields/content is included on that admin page.
155
+	 *
156
+	 * @abstract
157
+	 * @access protected
158
+	 * @return void
159
+	 */
160
+	abstract protected function _set_admin_pages();
161 161
 
162 162
 
163 163
 
164 164
 
165 165
 
166
-    /**
167
-     * Child classes must declare the $_valid_shortcodes property using this method.
168
-     * See comments for $_valid_shortcodes property for details on what it is used for.
169
-     *
170
-     * @access protected
171
-     * @return void
172
-     */
173
-    abstract protected function _set_valid_shortcodes();
166
+	/**
167
+	 * Child classes must declare the $_valid_shortcodes property using this method.
168
+	 * See comments for $_valid_shortcodes property for details on what it is used for.
169
+	 *
170
+	 * @access protected
171
+	 * @return void
172
+	 */
173
+	abstract protected function _set_valid_shortcodes();
174 174
 
175 175
 
176 176
 
177
-    /**
178
-     * sets the _existing_admin_settings property can be overridden by child classes.
179
-     * We do this so we only do database calls if needed.
180
-     *
181
-     * @access protected
182
-     * @param string $messenger
183
-     */
184
-    protected function _set_existing_admin_settings($messenger = '')
185
-    {
186
-        /** @var EE_Message_Resource_Manager $Message_Resource_Manager */
187
-        $Message_Resource_Manager = EE_Registry::instance()->load_lib('Message_Resource_Manager');
188
-        $active_messengers = $Message_Resource_Manager->get_active_messengers_option();
189
-        $settings_to_use = $active_messengers;
190
-
191
-        /**
192
-         * This determines what will be used for the getting the settings.
193
-         */
194
-        if (
195
-            ! empty($messenger)
196
-            && $Message_Resource_Manager->is_message_type_active_for_messenger($messenger, $this->name)
197
-        ) {
198
-            $settings_to_use = $active_messengers[ $messenger ]['settings'][ $messenger . '-message_types' ];
199
-        }
200
-
201
-        $this->_existing_admin_settings = isset($settings_to_use[ $this->name ]['settings'])
202
-            ? $settings_to_use[ $this->name ]['settings']
203
-            : null;
204
-    }
205
-
206
-
207
-
208
-
209
-
210
-
211
-    /**
212
-     * get_existing_admin_settings
213
-     * (if needed) sets and returns the _existing_admin_settings property.
214
-     *
215
-     * @access public
216
-     * @param string $messenger
217
-     * @return array          settings
218
-     */
219
-    public function get_existing_admin_settings($messenger = '')
220
-    {
221
-        // if admin_settings property empty lets try setting it.
222
-        if (method_exists($this, '_set_existing_admin_settings') && empty($this->_existing_admin_settings)) {
223
-            $this->_set_existing_admin_settings($messenger);
224
-        }
225
-        return property_exists($this, '_existing_admin_settings')
226
-            ? $this->_existing_admin_settings
227
-            : null;
228
-    }
229
-
230
-
231
-
232
-
233
-
234
-
235
-    /**
236
-     * This returns the array of valid shortcodes for a message type or messenger as set by the child in the $_valid_shortcode property.
237
-     * @return array   an array of valid shortcodes.
238
-     */
239
-    public function get_valid_shortcodes()
240
-    {
241
-        $valid_shortcodes = apply_filters(
242
-            'FHEE__' . get_class($this) . '__get_valid_shortcodes',
243
-            $this->_valid_shortcodes,
244
-            $this
245
-        );
246
-        // The below filter applies to ALL messengers and message types so use with care!
247
-        $valid_shortcodes = apply_filters('FHEE__EE_Messages_Base__get_valid_shortcodes', $valid_shortcodes, $this);
248
-        return $valid_shortcodes;
249
-    }
250
-
251
-
252
-
253
-
254
-    /**
255
-     * getter that returns the protected admin_settings_fields property
256
-     *
257
-     * @access public
258
-     * @return array admin settings fields
259
-     */
260
-    public function get_admin_settings_fields()
261
-    {
262
-        return $this->_admin_settings_fields;
263
-    }
264
-
265
-
266
-
267
-
268
-
269
-    /**
270
-     * this public method accepts a page slug (for an EE_admin page)
271
-     * and will return the response from the child class callback function
272
-     * if that page is registered via the `_admin_registered_page` property set by the child class.
273
-     *
274
-     * @param string $page the slug of the EE admin page
275
-     * @param array $actives an array of active message type (or messenger) objects.
276
-     * @param string $action the page action (to allow for more specific handling - i.e. edit vs. add pages)
277
-     * @param array $extra This is just an extra argument that can be used
278
-     *                     to pass additional data for setting up page content.
279
-     * @access protected
280
-     * @return string $content for page.
281
-     */
282
-    protected function _get_admin_page_content($page, $action, $extra, $actives)
283
-    {
284
-        // we can also further refine the context by action (if present).
285
-        if (!empty($action)) {
286
-            $page = $page . '_' . $action;
287
-        }
288
-
289
-        if (!isset($this->admin_registered_pages[ $page ])) {
290
-            // todo: a place to throw an exception?
291
-            // We need to indicate there is no registered page so this function is not being called correctly.
292
-            return false;
293
-        }
294
-        // k made it here so let's call the method
295
-        $content = call_user_func_array(
296
-            array( $this, '_get_admin_content_' . $page ),
297
-            array( $actives, $extra )
298
-        );
299
-        if ($content === false) {
300
-            // todo this needs to be an exception once we've got exceptions in place.
301
-            return false;
302
-        }
303
-        return $content;
304
-    }
305
-
306
-
307
-    /**
308
-     * Allows a message type to specifically exclude template fields for the provided messenger.
309
-     * Filtered so this can be programmatically altered as well.
310
-     * @param string $messenger_name name of messenger
311
-     * @return array
312
-     */
313
-    public function excludedFieldsForMessenger($messenger_name)
314
-    {
315
-        return apply_filters(
316
-            'FHEE__EE_Messages_Base__excludedFieldForMessenger',
317
-            array(),
318
-            $messenger_name,
319
-            $this->name,
320
-            $this
321
-        );
322
-    }
177
+	/**
178
+	 * sets the _existing_admin_settings property can be overridden by child classes.
179
+	 * We do this so we only do database calls if needed.
180
+	 *
181
+	 * @access protected
182
+	 * @param string $messenger
183
+	 */
184
+	protected function _set_existing_admin_settings($messenger = '')
185
+	{
186
+		/** @var EE_Message_Resource_Manager $Message_Resource_Manager */
187
+		$Message_Resource_Manager = EE_Registry::instance()->load_lib('Message_Resource_Manager');
188
+		$active_messengers = $Message_Resource_Manager->get_active_messengers_option();
189
+		$settings_to_use = $active_messengers;
190
+
191
+		/**
192
+		 * This determines what will be used for the getting the settings.
193
+		 */
194
+		if (
195
+			! empty($messenger)
196
+			&& $Message_Resource_Manager->is_message_type_active_for_messenger($messenger, $this->name)
197
+		) {
198
+			$settings_to_use = $active_messengers[ $messenger ]['settings'][ $messenger . '-message_types' ];
199
+		}
200
+
201
+		$this->_existing_admin_settings = isset($settings_to_use[ $this->name ]['settings'])
202
+			? $settings_to_use[ $this->name ]['settings']
203
+			: null;
204
+	}
205
+
206
+
207
+
208
+
209
+
210
+
211
+	/**
212
+	 * get_existing_admin_settings
213
+	 * (if needed) sets and returns the _existing_admin_settings property.
214
+	 *
215
+	 * @access public
216
+	 * @param string $messenger
217
+	 * @return array          settings
218
+	 */
219
+	public function get_existing_admin_settings($messenger = '')
220
+	{
221
+		// if admin_settings property empty lets try setting it.
222
+		if (method_exists($this, '_set_existing_admin_settings') && empty($this->_existing_admin_settings)) {
223
+			$this->_set_existing_admin_settings($messenger);
224
+		}
225
+		return property_exists($this, '_existing_admin_settings')
226
+			? $this->_existing_admin_settings
227
+			: null;
228
+	}
229
+
230
+
231
+
232
+
233
+
234
+
235
+	/**
236
+	 * This returns the array of valid shortcodes for a message type or messenger as set by the child in the $_valid_shortcode property.
237
+	 * @return array   an array of valid shortcodes.
238
+	 */
239
+	public function get_valid_shortcodes()
240
+	{
241
+		$valid_shortcodes = apply_filters(
242
+			'FHEE__' . get_class($this) . '__get_valid_shortcodes',
243
+			$this->_valid_shortcodes,
244
+			$this
245
+		);
246
+		// The below filter applies to ALL messengers and message types so use with care!
247
+		$valid_shortcodes = apply_filters('FHEE__EE_Messages_Base__get_valid_shortcodes', $valid_shortcodes, $this);
248
+		return $valid_shortcodes;
249
+	}
250
+
251
+
252
+
253
+
254
+	/**
255
+	 * getter that returns the protected admin_settings_fields property
256
+	 *
257
+	 * @access public
258
+	 * @return array admin settings fields
259
+	 */
260
+	public function get_admin_settings_fields()
261
+	{
262
+		return $this->_admin_settings_fields;
263
+	}
264
+
265
+
266
+
267
+
268
+
269
+	/**
270
+	 * this public method accepts a page slug (for an EE_admin page)
271
+	 * and will return the response from the child class callback function
272
+	 * if that page is registered via the `_admin_registered_page` property set by the child class.
273
+	 *
274
+	 * @param string $page the slug of the EE admin page
275
+	 * @param array $actives an array of active message type (or messenger) objects.
276
+	 * @param string $action the page action (to allow for more specific handling - i.e. edit vs. add pages)
277
+	 * @param array $extra This is just an extra argument that can be used
278
+	 *                     to pass additional data for setting up page content.
279
+	 * @access protected
280
+	 * @return string $content for page.
281
+	 */
282
+	protected function _get_admin_page_content($page, $action, $extra, $actives)
283
+	{
284
+		// we can also further refine the context by action (if present).
285
+		if (!empty($action)) {
286
+			$page = $page . '_' . $action;
287
+		}
288
+
289
+		if (!isset($this->admin_registered_pages[ $page ])) {
290
+			// todo: a place to throw an exception?
291
+			// We need to indicate there is no registered page so this function is not being called correctly.
292
+			return false;
293
+		}
294
+		// k made it here so let's call the method
295
+		$content = call_user_func_array(
296
+			array( $this, '_get_admin_content_' . $page ),
297
+			array( $actives, $extra )
298
+		);
299
+		if ($content === false) {
300
+			// todo this needs to be an exception once we've got exceptions in place.
301
+			return false;
302
+		}
303
+		return $content;
304
+	}
305
+
306
+
307
+	/**
308
+	 * Allows a message type to specifically exclude template fields for the provided messenger.
309
+	 * Filtered so this can be programmatically altered as well.
310
+	 * @param string $messenger_name name of messenger
311
+	 * @return array
312
+	 */
313
+	public function excludedFieldsForMessenger($messenger_name)
314
+	{
315
+		return apply_filters(
316
+			'FHEE__EE_Messages_Base__excludedFieldForMessenger',
317
+			array(),
318
+			$messenger_name,
319
+			$this->name,
320
+			$this
321
+		);
322
+	}
323 323
 }
Please login to merge, or discard this patch.