Completed
Branch Gutenberg/BUG/fix-editor-asset... (099b99)
by
unknown
29:37 queued 19:20
created
strategies/validation/EE_Email_Validation_Strategy.strategy.php 2 patches
Indentation   +59 added lines, -59 removed lines patch added patch discarded remove patch
@@ -18,72 +18,72 @@
 block discarded – undo
18 18
 {
19 19
 
20 20
 
21
-    /**
22
-     * @param string               $validation_error_message
23
-     */
24
-    public function __construct($validation_error_message = '')
25
-    {
26
-        if (! $validation_error_message) {
27
-            $validation_error_message = esc_html__('Please enter a valid email address.', 'event_espresso');
28
-        }
29
-        parent::__construct($validation_error_message);
30
-    }
21
+	/**
22
+	 * @param string               $validation_error_message
23
+	 */
24
+	public function __construct($validation_error_message = '')
25
+	{
26
+		if (! $validation_error_message) {
27
+			$validation_error_message = esc_html__('Please enter a valid email address.', 'event_espresso');
28
+		}
29
+		parent::__construct($validation_error_message);
30
+	}
31 31
 
32 32
 
33 33
 
34
-    /**
35
-     * just checks the field isn't blank
36
-     *
37
-     * @param $normalized_value
38
-     * @return bool
39
-     * @throws InvalidArgumentException
40
-     * @throws InvalidInterfaceException
41
-     * @throws InvalidDataTypeException
42
-     * @throws EE_Validation_Error
43
-     */
44
-    public function validate($normalized_value)
45
-    {
46
-        if ($normalized_value && ! $this->_validate_email($normalized_value)) {
47
-            throw new EE_Validation_Error($this->get_validation_error_message(), 'required');
48
-        }
49
-        return true;
50
-    }
34
+	/**
35
+	 * just checks the field isn't blank
36
+	 *
37
+	 * @param $normalized_value
38
+	 * @return bool
39
+	 * @throws InvalidArgumentException
40
+	 * @throws InvalidInterfaceException
41
+	 * @throws InvalidDataTypeException
42
+	 * @throws EE_Validation_Error
43
+	 */
44
+	public function validate($normalized_value)
45
+	{
46
+		if ($normalized_value && ! $this->_validate_email($normalized_value)) {
47
+			throw new EE_Validation_Error($this->get_validation_error_message(), 'required');
48
+		}
49
+		return true;
50
+	}
51 51
 
52 52
 
53 53
 
54
-    /**
55
-     * @return array
56
-     */
57
-    public function get_jquery_validation_rule_array()
58
-    {
59
-        return array('email' => true, 'messages' => array('email' => $this->get_validation_error_message()));
60
-    }
54
+	/**
55
+	 * @return array
56
+	 */
57
+	public function get_jquery_validation_rule_array()
58
+	{
59
+		return array('email' => true, 'messages' => array('email' => $this->get_validation_error_message()));
60
+	}
61 61
 
62 62
 
63 63
 
64
-    /**
65
-     * Validate an email address.
66
-     * Provide email address (raw input)
67
-     *
68
-     * @param $email
69
-     * @return bool of whether the email is valid or not
70
-     * @throws InvalidArgumentException
71
-     * @throws InvalidInterfaceException
72
-     * @throws InvalidDataTypeException
73
-     * @throws EE_Validation_Error
74
-     */
75
-    private function _validate_email($email)
76
-    {
77
-        try {
78
-            EmailAddressFactory::create($email);
79
-        } catch (EmailValidationException $e) {
80
-            throw new EE_Validation_Error(
81
-                $e->getMessage(),
82
-                'invalid_email',
83
-                $this->_input,
84
-                $e
85
-            );
86
-        }
87
-        return true;
88
-    }
64
+	/**
65
+	 * Validate an email address.
66
+	 * Provide email address (raw input)
67
+	 *
68
+	 * @param $email
69
+	 * @return bool of whether the email is valid or not
70
+	 * @throws InvalidArgumentException
71
+	 * @throws InvalidInterfaceException
72
+	 * @throws InvalidDataTypeException
73
+	 * @throws EE_Validation_Error
74
+	 */
75
+	private function _validate_email($email)
76
+	{
77
+		try {
78
+			EmailAddressFactory::create($email);
79
+		} catch (EmailValidationException $e) {
80
+			throw new EE_Validation_Error(
81
+				$e->getMessage(),
82
+				'invalid_email',
83
+				$this->_input,
84
+				$e
85
+			);
86
+		}
87
+		return true;
88
+	}
89 89
 }
Please login to merge, or discard this patch.
Spacing   +1 added lines, -1 removed lines patch added patch discarded remove patch
@@ -23,7 +23,7 @@
 block discarded – undo
23 23
      */
24 24
     public function __construct($validation_error_message = '')
25 25
     {
26
-        if (! $validation_error_message) {
26
+        if ( ! $validation_error_message) {
27 27
             $validation_error_message = esc_html__('Please enter a valid email address.', 'event_espresso');
28 28
         }
29 29
         parent::__construct($validation_error_message);
Please login to merge, or discard this patch.
core/db_models/EEM_Attendee.model.php 4 patches
Doc Comments   +1 added lines, -1 removed lines patch added patch discarded remove patch
@@ -351,7 +351,7 @@
 block discarded – undo
351 351
      * retrieve  a single attendee from db via their ID
352 352
      *
353 353
      * @param $ATT_ID
354
-     * @return mixed array on success, FALSE on fail
354
+     * @return EE_Base_Class|null array on success, FALSE on fail
355 355
      * @deprecated
356 356
      */
357 357
     public function get_attendee_by_ID($ATT_ID = false)
Please login to merge, or discard this patch.
Unused Use Statements   -1 removed lines patch added patch discarded remove patch
@@ -1,5 +1,4 @@
 block discarded – undo
1 1
 <?php
2
-use EventEspresso\core\services\loaders\Loader;
3 2
 use EventEspresso\core\services\orm\ModelFieldFactory;
4 3
 
5 4
 /**
Please login to merge, or discard this patch.
Indentation   +399 added lines, -399 removed lines patch added patch discarded remove patch
@@ -12,411 +12,411 @@
 block discarded – undo
12 12
 class EEM_Attendee extends EEM_CPT_Base
13 13
 {
14 14
 
15
-    // private instance of the Attendee object
16
-    protected static $_instance = null;
15
+	// private instance of the Attendee object
16
+	protected static $_instance = null;
17 17
 
18
-    /**
19
-     * QST_system for questions are strings not integers now,
20
-     * so these constants are deprecated.
21
-     * Please instead use the EEM_Attendee::system_question_* constants
22
-     *
23
-     * @deprecated
24
-     */
25
-    const fname_question_id = 1;
18
+	/**
19
+	 * QST_system for questions are strings not integers now,
20
+	 * so these constants are deprecated.
21
+	 * Please instead use the EEM_Attendee::system_question_* constants
22
+	 *
23
+	 * @deprecated
24
+	 */
25
+	const fname_question_id = 1;
26 26
 
27
-    /**
28
-     * @deprecated
29
-     */
30
-    const lname_question_id = 2;
27
+	/**
28
+	 * @deprecated
29
+	 */
30
+	const lname_question_id = 2;
31 31
 
32 32
 
33
-    /**
34
-     * @deprecated
35
-     */
36
-    const email_question_id = 3;
33
+	/**
34
+	 * @deprecated
35
+	 */
36
+	const email_question_id = 3;
37 37
 
38 38
 
39
-    /**
40
-     * @deprecated
41
-     */
42
-    const address_question_id = 4;
39
+	/**
40
+	 * @deprecated
41
+	 */
42
+	const address_question_id = 4;
43 43
 
44 44
 
45
-    /**
46
-     * @deprecated
47
-     */
48
-    const address2_question_id = 5;
49
-
50
-
51
-    /**
52
-     * @deprecated
53
-     */
54
-    const city_question_id = 6;
55
-
56
-
57
-    /**
58
-     * @deprecated
59
-     */
60
-    const state_question_id = 7;
61
-
62
-
63
-    /**
64
-     * @deprecated
65
-     */
66
-    const country_question_id = 8;
67
-
68
-
69
-    /**
70
-     * @deprecated
71
-     */
72
-    const zip_question_id = 9;
73
-
74
-
75
-    /**
76
-     * @deprecated
77
-     */
78
-    const phone_question_id = 10;
79
-
80
-    /**
81
-     * When looking for questions that correspond to attendee fields,
82
-     * look for the question with this QST_system value.
83
-     * These replace the old constants like EEM_Attendee::*_question_id
84
-     */
85
-    const system_question_fname = 'fname';
86
-
87
-    const system_question_lname = 'lname';
88
-
89
-    const system_question_email = 'email';
90
-
91
-    const system_question_address = 'address';
92
-
93
-    const system_question_address2 = 'address2';
94
-
95
-    const system_question_city = 'city';
96
-
97
-    const system_question_state = 'state';
98
-
99
-    const system_question_country = 'country';
100
-
101
-    const system_question_zip = 'zip';
102
-
103
-    const system_question_phone = 'phone';
104
-
105
-    /**
106
-     * Keys are all the EEM_Attendee::system_question_* constants, which are
107
-     * also all the values of QST_system in the questions table, and values
108
-     * are their corresponding Attendee field names
109
-     *
110
-     * @var array
111
-     */
112
-    protected $_system_question_to_attendee_field_name = array(
113
-        EEM_Attendee::system_question_fname    => 'ATT_fname',
114
-        EEM_Attendee::system_question_lname    => 'ATT_lname',
115
-        EEM_Attendee::system_question_email    => 'ATT_email',
116
-        EEM_Attendee::system_question_address  => 'ATT_address',
117
-        EEM_Attendee::system_question_address2 => 'ATT_address2',
118
-        EEM_Attendee::system_question_city     => 'ATT_city',
119
-        EEM_Attendee::system_question_state    => 'STA_ID',
120
-        EEM_Attendee::system_question_country  => 'CNT_ISO',
121
-        EEM_Attendee::system_question_zip      => 'ATT_zip',
122
-        EEM_Attendee::system_question_phone    => 'ATT_phone',
123
-    );
124
-
125
-
126
-
127
-    /**
128
-     * EEM_Attendee constructor.
129
-     *
130
-     * @param null              $timezone
131
-     * @param ModelFieldFactory $model_field_factory
132
-     * @throws EE_Error
133
-     * @throws InvalidArgumentException
134
-     */
135
-    protected function __construct($timezone = null, ModelFieldFactory $model_field_factory)
136
-    {
137
-        $this->singular_item = esc_html__('Attendee', 'event_espresso');
138
-        $this->plural_item = esc_html__('Attendees', 'event_espresso');
139
-        $this->_tables = array(
140
-            'Attendee_CPT'  => new EE_Primary_Table('posts', 'ID'),
141
-            'Attendee_Meta' => new EE_Secondary_Table(
142
-                'esp_attendee_meta',
143
-                'ATTM_ID',
144
-                'ATT_ID'
145
-            ),
146
-        );
147
-        $this->_fields = array(
148
-            'Attendee_CPT'  => array(
149
-                'ATT_ID'        => $model_field_factory->createPrimaryKeyIntField(
150
-                    'ID',
151
-                    esc_html__('Attendee ID', 'event_espresso')
152
-                ),
153
-                'ATT_full_name' => $model_field_factory->createPlainTextField(
154
-                    'post_title',
155
-                    esc_html__('Attendee Full Name', 'event_espresso'),
156
-                    false,
157
-                    esc_html__('Unknown', 'event_espresso')
158
-                ),
159
-                'ATT_bio'       => $model_field_factory->createPostContentField(
160
-                    'post_content',
161
-                    esc_html__('Attendee Biography', 'event_espresso'),
162
-                    false,
163
-                    esc_html__('No Biography Provided', 'event_espresso')
164
-                ),
165
-                'ATT_slug'      => $model_field_factory->createSlugField(
166
-                    'post_name',
167
-                    esc_html__('Attendee URL Slug', 'event_espresso')
168
-                ),
169
-                'ATT_created'   => $model_field_factory->createDatetimeField(
170
-                    'post_date',
171
-                    esc_html__('Time Attendee Created', 'event_espresso')
172
-                ),
173
-                'ATT_short_bio' => $model_field_factory->createSimpleHtmlField(
174
-                    'post_excerpt',
175
-                    esc_html__('Attendee Short Biography', 'event_espresso'),
176
-                    true,
177
-                    esc_html__('No Biography Provided', 'event_espresso')
178
-                ),
179
-                'ATT_modified'  => $model_field_factory->createDatetimeField(
180
-                    'post_modified',
181
-                    esc_html__('Time Attendee Last Modified', 'event_espresso')
182
-                ),
183
-                'ATT_author'    => $model_field_factory->createWpUserField(
184
-                    'post_author',
185
-                    esc_html__('Creator ID of the first Event attended', 'event_espresso'),
186
-                    false
187
-                ),
188
-                'ATT_parent'    => $model_field_factory->createDbOnlyIntField(
189
-                    'post_parent',
190
-                    esc_html__('Parent Attendee (unused)', 'event_espresso'),
191
-                    false,
192
-                    0
193
-                ),
194
-                'post_type'     => $model_field_factory->createWpPostTypeField('espresso_attendees'),
195
-                'status'        => $model_field_factory->createWpPostStatusField(
196
-                    'post_status',
197
-                    esc_html__('Attendee Status', 'event_espresso'),
198
-                    false,
199
-                    'publish'
200
-                ),
201
-            ),
202
-            'Attendee_Meta' => array(
203
-                'ATTM_ID'      => $model_field_factory->createDbOnlyIntField(
204
-                    'ATTM_ID',
205
-                    esc_html__('Attendee Meta Row ID', 'event_espresso'),
206
-                    false
207
-                ),
208
-                'ATT_ID_fk'    => $model_field_factory->createDbOnlyIntField(
209
-                    'ATT_ID',
210
-                    esc_html__('Foreign Key to Attendee in Post Table', 'event_espresso'),
211
-                    false
212
-                ),
213
-                'ATT_fname'    => $model_field_factory->createPlainTextField(
214
-                    'ATT_fname',
215
-                    esc_html__('First Name', 'event_espresso')
216
-                ),
217
-                'ATT_lname'    => $model_field_factory->createPlainTextField(
218
-                    'ATT_lname',
219
-                    esc_html__('Last Name', 'event_espresso')
220
-                ),
221
-                'ATT_address'  => $model_field_factory->createPlainTextField(
222
-                    'ATT_address',
223
-                    esc_html__('Address Part 1', 'event_espresso')
224
-                ),
225
-                'ATT_address2' => $model_field_factory->createPlainTextField(
226
-                    'ATT_address2',
227
-                    esc_html__('Address Part 2', 'event_espresso')
228
-                ),
229
-                'ATT_city'     => $model_field_factory->createPlainTextField(
230
-                    'ATT_city',
231
-                    esc_html__('City', 'event_espresso')
232
-                ),
233
-                'STA_ID'       => $model_field_factory->createForeignKeyIntField(
234
-                    'STA_ID',
235
-                    esc_html__('State', 'event_espresso'),
236
-                    true,
237
-                    0,
238
-                    'State'
239
-                ),
240
-                'CNT_ISO'      => $model_field_factory->createForeignKeyStringField(
241
-                    'CNT_ISO',
242
-                    esc_html__('Country', 'event_espresso'),
243
-                    true,
244
-                    '',
245
-                    'Country'
246
-                ),
247
-                'ATT_zip'      => $model_field_factory->createPlainTextField(
248
-                    'ATT_zip',
249
-                    esc_html__('ZIP/Postal Code', 'event_espresso')
250
-                ),
251
-                'ATT_email'    => $model_field_factory->createEmailField(
252
-                    'ATT_email',
253
-                    esc_html__('Email Address', 'event_espresso')
254
-                ),
255
-                'ATT_phone'    => $model_field_factory->createPlainTextField(
256
-                    'ATT_phone',
257
-                    esc_html__('Phone', 'event_espresso')
258
-                ),
259
-            ),
260
-        );
261
-        $this->_model_relations = array(
262
-            'Registration'      => new EE_Has_Many_Relation(),
263
-            'State'             => new EE_Belongs_To_Relation(),
264
-            'Country'           => new EE_Belongs_To_Relation(),
265
-            'Event'             => new EE_HABTM_Relation('Registration', false),
266
-            'WP_User'           => new EE_Belongs_To_Relation(),
267
-            'Message'           => new EE_Has_Many_Any_Relation(false),
268
-            // allow deletion of attendees even if they have messages in the queue for them.
269
-            'Term_Relationship' => new EE_Has_Many_Relation(),
270
-            'Term_Taxonomy'     => new EE_HABTM_Relation('Term_Relationship'),
271
-        );
272
-        $this->_caps_slug = 'contacts';
273
-        parent::__construct($timezone);
274
-    }
275
-
276
-
277
-
278
-    /**
279
-     * Gets the name of the field on the attendee model corresponding to the system question string
280
-     * which should be one of the keys from EEM_Attendee::_system_question_to_attendee_field_name
281
-     *
282
-     * @param string $system_question_string
283
-     * @return string|null if not found
284
-     */
285
-    public function get_attendee_field_for_system_question($system_question_string)
286
-    {
287
-        return isset($this->_system_question_to_attendee_field_name[ $system_question_string ])
288
-            ? $this->_system_question_to_attendee_field_name[ $system_question_string ]
289
-            : null;
290
-    }
291
-
292
-
293
-
294
-    /**
295
-     * Gets mapping from esp_question.QST_system values to their corresponding attendee field names
296
-     *
297
-     * @return array
298
-     */
299
-    public function system_question_to_attendee_field_mapping()
300
-    {
301
-        return $this->_system_question_to_attendee_field_name;
302
-    }
303
-
304
-
305
-
306
-    /**
307
-     * Gets all the attendees for a transaction (by using the esp_registration as a join table)
308
-     *
309
-     * @param EE_Transaction /int $transaction_id_or_obj EE_Transaction or its ID
310
-     * @return EE_Attendee[]|EE_Base_Class[]
311
-     * @throws EE_Error
312
-     */
313
-    public function get_attendees_for_transaction($transaction_id_or_obj)
314
-    {
315
-        return $this->get_all(
316
-            array(
317
-                array(
318
-                    'Registration.Transaction.TXN_ID' => $transaction_id_or_obj instanceof EE_Transaction
319
-                        ? $transaction_id_or_obj->ID()
320
-                        : $transaction_id_or_obj,
321
-                ),
322
-            )
323
-        );
324
-    }
325
-
326
-
327
-
328
-    /**
329
-     * retrieve  a single attendee from db via their ID
330
-     *
331
-     * @param $ATT_ID
332
-     * @return mixed array on success, FALSE on fail
333
-     * @deprecated
334
-     */
335
-    public function get_attendee_by_ID($ATT_ID = false)
336
-    {
337
-        // retrieve a particular EE_Attendee
338
-        return $this->get_one_by_ID($ATT_ID);
339
-    }
340
-
341
-
342
-
343
-    /**
344
-     * retrieve  a single attendee from db via their ID
345
-     *
346
-     * @param array $where_cols_n_values
347
-     * @return mixed array on success, FALSE on fail
348
-     * @throws EE_Error
349
-     */
350
-    public function get_attendee($where_cols_n_values = array())
351
-    {
352
-        if (empty($where_cols_n_values)) {
353
-            return false;
354
-        }
355
-        $attendee = $this->get_all(array($where_cols_n_values));
356
-        if (! empty($attendee)) {
357
-            return array_shift($attendee);
358
-        }
359
-        return false;
360
-    }
361
-
362
-
363
-
364
-    /**
365
-     * Search for an existing Attendee record in the DB
366
-     *
367
-     * @param array $where_cols_n_values
368
-     * @return bool|mixed
369
-     * @throws EE_Error
370
-     */
371
-    public function find_existing_attendee($where_cols_n_values = null)
372
-    {
373
-        // search by combo of first and last names plus the email address
374
-        $attendee_data_keys = array(
375
-            'ATT_fname' => $this->_ATT_fname,
376
-            'ATT_lname' => $this->_ATT_lname,
377
-            'ATT_email' => $this->_ATT_email,
378
-        );
379
-        // no search params means attendee object already exists.
380
-        $where_cols_n_values = is_array($where_cols_n_values) && ! empty($where_cols_n_values)
381
-            ? $where_cols_n_values
382
-            : $attendee_data_keys;
383
-        $valid_data = true;
384
-        // check for required values
385
-        $valid_data = isset($where_cols_n_values['ATT_fname']) && ! empty($where_cols_n_values['ATT_fname'])
386
-            ? $valid_data
387
-            : false;
388
-        $valid_data = isset($where_cols_n_values['ATT_lname']) && ! empty($where_cols_n_values['ATT_lname'])
389
-            ? $valid_data
390
-            : false;
391
-        $valid_data = isset($where_cols_n_values['ATT_email']) && ! empty($where_cols_n_values['ATT_email'])
392
-            ? $valid_data
393
-            : false;
394
-        if ($valid_data) {
395
-            $attendee = $this->get_attendee($where_cols_n_values);
396
-            if ($attendee instanceof EE_Attendee) {
397
-                return $attendee;
398
-            }
399
-        }
400
-        return false;
401
-    }
402
-
403
-
404
-
405
-    /**
406
-     * Takes an incoming array of EE_Registration ids
407
-     * and sends back a list of corresponding non duplicate EE_Attendee objects.
408
-     *
409
-     * @since  4.3.0
410
-     * @param  array $ids array of EE_Registration ids
411
-     * @return EE_Attendee[]|EE_Base_Class[]
412
-     * @throws EE_Error
413
-     */
414
-    public function get_array_of_contacts_from_reg_ids($ids)
415
-    {
416
-        $ids = (array) $ids;
417
-        $_where = array(
418
-            'Registration.REG_ID' => array('in', $ids),
419
-        );
420
-        return $this->get_all(array($_where));
421
-    }
45
+	/**
46
+	 * @deprecated
47
+	 */
48
+	const address2_question_id = 5;
49
+
50
+
51
+	/**
52
+	 * @deprecated
53
+	 */
54
+	const city_question_id = 6;
55
+
56
+
57
+	/**
58
+	 * @deprecated
59
+	 */
60
+	const state_question_id = 7;
61
+
62
+
63
+	/**
64
+	 * @deprecated
65
+	 */
66
+	const country_question_id = 8;
67
+
68
+
69
+	/**
70
+	 * @deprecated
71
+	 */
72
+	const zip_question_id = 9;
73
+
74
+
75
+	/**
76
+	 * @deprecated
77
+	 */
78
+	const phone_question_id = 10;
79
+
80
+	/**
81
+	 * When looking for questions that correspond to attendee fields,
82
+	 * look for the question with this QST_system value.
83
+	 * These replace the old constants like EEM_Attendee::*_question_id
84
+	 */
85
+	const system_question_fname = 'fname';
86
+
87
+	const system_question_lname = 'lname';
88
+
89
+	const system_question_email = 'email';
90
+
91
+	const system_question_address = 'address';
92
+
93
+	const system_question_address2 = 'address2';
94
+
95
+	const system_question_city = 'city';
96
+
97
+	const system_question_state = 'state';
98
+
99
+	const system_question_country = 'country';
100
+
101
+	const system_question_zip = 'zip';
102
+
103
+	const system_question_phone = 'phone';
104
+
105
+	/**
106
+	 * Keys are all the EEM_Attendee::system_question_* constants, which are
107
+	 * also all the values of QST_system in the questions table, and values
108
+	 * are their corresponding Attendee field names
109
+	 *
110
+	 * @var array
111
+	 */
112
+	protected $_system_question_to_attendee_field_name = array(
113
+		EEM_Attendee::system_question_fname    => 'ATT_fname',
114
+		EEM_Attendee::system_question_lname    => 'ATT_lname',
115
+		EEM_Attendee::system_question_email    => 'ATT_email',
116
+		EEM_Attendee::system_question_address  => 'ATT_address',
117
+		EEM_Attendee::system_question_address2 => 'ATT_address2',
118
+		EEM_Attendee::system_question_city     => 'ATT_city',
119
+		EEM_Attendee::system_question_state    => 'STA_ID',
120
+		EEM_Attendee::system_question_country  => 'CNT_ISO',
121
+		EEM_Attendee::system_question_zip      => 'ATT_zip',
122
+		EEM_Attendee::system_question_phone    => 'ATT_phone',
123
+	);
124
+
125
+
126
+
127
+	/**
128
+	 * EEM_Attendee constructor.
129
+	 *
130
+	 * @param null              $timezone
131
+	 * @param ModelFieldFactory $model_field_factory
132
+	 * @throws EE_Error
133
+	 * @throws InvalidArgumentException
134
+	 */
135
+	protected function __construct($timezone = null, ModelFieldFactory $model_field_factory)
136
+	{
137
+		$this->singular_item = esc_html__('Attendee', 'event_espresso');
138
+		$this->plural_item = esc_html__('Attendees', 'event_espresso');
139
+		$this->_tables = array(
140
+			'Attendee_CPT'  => new EE_Primary_Table('posts', 'ID'),
141
+			'Attendee_Meta' => new EE_Secondary_Table(
142
+				'esp_attendee_meta',
143
+				'ATTM_ID',
144
+				'ATT_ID'
145
+			),
146
+		);
147
+		$this->_fields = array(
148
+			'Attendee_CPT'  => array(
149
+				'ATT_ID'        => $model_field_factory->createPrimaryKeyIntField(
150
+					'ID',
151
+					esc_html__('Attendee ID', 'event_espresso')
152
+				),
153
+				'ATT_full_name' => $model_field_factory->createPlainTextField(
154
+					'post_title',
155
+					esc_html__('Attendee Full Name', 'event_espresso'),
156
+					false,
157
+					esc_html__('Unknown', 'event_espresso')
158
+				),
159
+				'ATT_bio'       => $model_field_factory->createPostContentField(
160
+					'post_content',
161
+					esc_html__('Attendee Biography', 'event_espresso'),
162
+					false,
163
+					esc_html__('No Biography Provided', 'event_espresso')
164
+				),
165
+				'ATT_slug'      => $model_field_factory->createSlugField(
166
+					'post_name',
167
+					esc_html__('Attendee URL Slug', 'event_espresso')
168
+				),
169
+				'ATT_created'   => $model_field_factory->createDatetimeField(
170
+					'post_date',
171
+					esc_html__('Time Attendee Created', 'event_espresso')
172
+				),
173
+				'ATT_short_bio' => $model_field_factory->createSimpleHtmlField(
174
+					'post_excerpt',
175
+					esc_html__('Attendee Short Biography', 'event_espresso'),
176
+					true,
177
+					esc_html__('No Biography Provided', 'event_espresso')
178
+				),
179
+				'ATT_modified'  => $model_field_factory->createDatetimeField(
180
+					'post_modified',
181
+					esc_html__('Time Attendee Last Modified', 'event_espresso')
182
+				),
183
+				'ATT_author'    => $model_field_factory->createWpUserField(
184
+					'post_author',
185
+					esc_html__('Creator ID of the first Event attended', 'event_espresso'),
186
+					false
187
+				),
188
+				'ATT_parent'    => $model_field_factory->createDbOnlyIntField(
189
+					'post_parent',
190
+					esc_html__('Parent Attendee (unused)', 'event_espresso'),
191
+					false,
192
+					0
193
+				),
194
+				'post_type'     => $model_field_factory->createWpPostTypeField('espresso_attendees'),
195
+				'status'        => $model_field_factory->createWpPostStatusField(
196
+					'post_status',
197
+					esc_html__('Attendee Status', 'event_espresso'),
198
+					false,
199
+					'publish'
200
+				),
201
+			),
202
+			'Attendee_Meta' => array(
203
+				'ATTM_ID'      => $model_field_factory->createDbOnlyIntField(
204
+					'ATTM_ID',
205
+					esc_html__('Attendee Meta Row ID', 'event_espresso'),
206
+					false
207
+				),
208
+				'ATT_ID_fk'    => $model_field_factory->createDbOnlyIntField(
209
+					'ATT_ID',
210
+					esc_html__('Foreign Key to Attendee in Post Table', 'event_espresso'),
211
+					false
212
+				),
213
+				'ATT_fname'    => $model_field_factory->createPlainTextField(
214
+					'ATT_fname',
215
+					esc_html__('First Name', 'event_espresso')
216
+				),
217
+				'ATT_lname'    => $model_field_factory->createPlainTextField(
218
+					'ATT_lname',
219
+					esc_html__('Last Name', 'event_espresso')
220
+				),
221
+				'ATT_address'  => $model_field_factory->createPlainTextField(
222
+					'ATT_address',
223
+					esc_html__('Address Part 1', 'event_espresso')
224
+				),
225
+				'ATT_address2' => $model_field_factory->createPlainTextField(
226
+					'ATT_address2',
227
+					esc_html__('Address Part 2', 'event_espresso')
228
+				),
229
+				'ATT_city'     => $model_field_factory->createPlainTextField(
230
+					'ATT_city',
231
+					esc_html__('City', 'event_espresso')
232
+				),
233
+				'STA_ID'       => $model_field_factory->createForeignKeyIntField(
234
+					'STA_ID',
235
+					esc_html__('State', 'event_espresso'),
236
+					true,
237
+					0,
238
+					'State'
239
+				),
240
+				'CNT_ISO'      => $model_field_factory->createForeignKeyStringField(
241
+					'CNT_ISO',
242
+					esc_html__('Country', 'event_espresso'),
243
+					true,
244
+					'',
245
+					'Country'
246
+				),
247
+				'ATT_zip'      => $model_field_factory->createPlainTextField(
248
+					'ATT_zip',
249
+					esc_html__('ZIP/Postal Code', 'event_espresso')
250
+				),
251
+				'ATT_email'    => $model_field_factory->createEmailField(
252
+					'ATT_email',
253
+					esc_html__('Email Address', 'event_espresso')
254
+				),
255
+				'ATT_phone'    => $model_field_factory->createPlainTextField(
256
+					'ATT_phone',
257
+					esc_html__('Phone', 'event_espresso')
258
+				),
259
+			),
260
+		);
261
+		$this->_model_relations = array(
262
+			'Registration'      => new EE_Has_Many_Relation(),
263
+			'State'             => new EE_Belongs_To_Relation(),
264
+			'Country'           => new EE_Belongs_To_Relation(),
265
+			'Event'             => new EE_HABTM_Relation('Registration', false),
266
+			'WP_User'           => new EE_Belongs_To_Relation(),
267
+			'Message'           => new EE_Has_Many_Any_Relation(false),
268
+			// allow deletion of attendees even if they have messages in the queue for them.
269
+			'Term_Relationship' => new EE_Has_Many_Relation(),
270
+			'Term_Taxonomy'     => new EE_HABTM_Relation('Term_Relationship'),
271
+		);
272
+		$this->_caps_slug = 'contacts';
273
+		parent::__construct($timezone);
274
+	}
275
+
276
+
277
+
278
+	/**
279
+	 * Gets the name of the field on the attendee model corresponding to the system question string
280
+	 * which should be one of the keys from EEM_Attendee::_system_question_to_attendee_field_name
281
+	 *
282
+	 * @param string $system_question_string
283
+	 * @return string|null if not found
284
+	 */
285
+	public function get_attendee_field_for_system_question($system_question_string)
286
+	{
287
+		return isset($this->_system_question_to_attendee_field_name[ $system_question_string ])
288
+			? $this->_system_question_to_attendee_field_name[ $system_question_string ]
289
+			: null;
290
+	}
291
+
292
+
293
+
294
+	/**
295
+	 * Gets mapping from esp_question.QST_system values to their corresponding attendee field names
296
+	 *
297
+	 * @return array
298
+	 */
299
+	public function system_question_to_attendee_field_mapping()
300
+	{
301
+		return $this->_system_question_to_attendee_field_name;
302
+	}
303
+
304
+
305
+
306
+	/**
307
+	 * Gets all the attendees for a transaction (by using the esp_registration as a join table)
308
+	 *
309
+	 * @param EE_Transaction /int $transaction_id_or_obj EE_Transaction or its ID
310
+	 * @return EE_Attendee[]|EE_Base_Class[]
311
+	 * @throws EE_Error
312
+	 */
313
+	public function get_attendees_for_transaction($transaction_id_or_obj)
314
+	{
315
+		return $this->get_all(
316
+			array(
317
+				array(
318
+					'Registration.Transaction.TXN_ID' => $transaction_id_or_obj instanceof EE_Transaction
319
+						? $transaction_id_or_obj->ID()
320
+						: $transaction_id_or_obj,
321
+				),
322
+			)
323
+		);
324
+	}
325
+
326
+
327
+
328
+	/**
329
+	 * retrieve  a single attendee from db via their ID
330
+	 *
331
+	 * @param $ATT_ID
332
+	 * @return mixed array on success, FALSE on fail
333
+	 * @deprecated
334
+	 */
335
+	public function get_attendee_by_ID($ATT_ID = false)
336
+	{
337
+		// retrieve a particular EE_Attendee
338
+		return $this->get_one_by_ID($ATT_ID);
339
+	}
340
+
341
+
342
+
343
+	/**
344
+	 * retrieve  a single attendee from db via their ID
345
+	 *
346
+	 * @param array $where_cols_n_values
347
+	 * @return mixed array on success, FALSE on fail
348
+	 * @throws EE_Error
349
+	 */
350
+	public function get_attendee($where_cols_n_values = array())
351
+	{
352
+		if (empty($where_cols_n_values)) {
353
+			return false;
354
+		}
355
+		$attendee = $this->get_all(array($where_cols_n_values));
356
+		if (! empty($attendee)) {
357
+			return array_shift($attendee);
358
+		}
359
+		return false;
360
+	}
361
+
362
+
363
+
364
+	/**
365
+	 * Search for an existing Attendee record in the DB
366
+	 *
367
+	 * @param array $where_cols_n_values
368
+	 * @return bool|mixed
369
+	 * @throws EE_Error
370
+	 */
371
+	public function find_existing_attendee($where_cols_n_values = null)
372
+	{
373
+		// search by combo of first and last names plus the email address
374
+		$attendee_data_keys = array(
375
+			'ATT_fname' => $this->_ATT_fname,
376
+			'ATT_lname' => $this->_ATT_lname,
377
+			'ATT_email' => $this->_ATT_email,
378
+		);
379
+		// no search params means attendee object already exists.
380
+		$where_cols_n_values = is_array($where_cols_n_values) && ! empty($where_cols_n_values)
381
+			? $where_cols_n_values
382
+			: $attendee_data_keys;
383
+		$valid_data = true;
384
+		// check for required values
385
+		$valid_data = isset($where_cols_n_values['ATT_fname']) && ! empty($where_cols_n_values['ATT_fname'])
386
+			? $valid_data
387
+			: false;
388
+		$valid_data = isset($where_cols_n_values['ATT_lname']) && ! empty($where_cols_n_values['ATT_lname'])
389
+			? $valid_data
390
+			: false;
391
+		$valid_data = isset($where_cols_n_values['ATT_email']) && ! empty($where_cols_n_values['ATT_email'])
392
+			? $valid_data
393
+			: false;
394
+		if ($valid_data) {
395
+			$attendee = $this->get_attendee($where_cols_n_values);
396
+			if ($attendee instanceof EE_Attendee) {
397
+				return $attendee;
398
+			}
399
+		}
400
+		return false;
401
+	}
402
+
403
+
404
+
405
+	/**
406
+	 * Takes an incoming array of EE_Registration ids
407
+	 * and sends back a list of corresponding non duplicate EE_Attendee objects.
408
+	 *
409
+	 * @since  4.3.0
410
+	 * @param  array $ids array of EE_Registration ids
411
+	 * @return EE_Attendee[]|EE_Base_Class[]
412
+	 * @throws EE_Error
413
+	 */
414
+	public function get_array_of_contacts_from_reg_ids($ids)
415
+	{
416
+		$ids = (array) $ids;
417
+		$_where = array(
418
+			'Registration.REG_ID' => array('in', $ids),
419
+		);
420
+		return $this->get_all(array($_where));
421
+	}
422 422
 }
Please login to merge, or discard this patch.
Spacing   +3 added lines, -3 removed lines patch added patch discarded remove patch
@@ -284,8 +284,8 @@  discard block
 block discarded – undo
284 284
      */
285 285
     public function get_attendee_field_for_system_question($system_question_string)
286 286
     {
287
-        return isset($this->_system_question_to_attendee_field_name[ $system_question_string ])
288
-            ? $this->_system_question_to_attendee_field_name[ $system_question_string ]
287
+        return isset($this->_system_question_to_attendee_field_name[$system_question_string])
288
+            ? $this->_system_question_to_attendee_field_name[$system_question_string]
289 289
             : null;
290 290
     }
291 291
 
@@ -353,7 +353,7 @@  discard block
 block discarded – undo
353 353
             return false;
354 354
         }
355 355
         $attendee = $this->get_all(array($where_cols_n_values));
356
-        if (! empty($attendee)) {
356
+        if ( ! empty($attendee)) {
357 357
             return array_shift($attendee);
358 358
         }
359 359
         return false;
Please login to merge, or discard this patch.
admin/extend/messages/espresso_events_Messages_Hooks_Extend.class.php 3 patches
Doc Comments   +1 added lines, -1 removed lines patch added patch discarded remove patch
@@ -98,7 +98,7 @@
 block discarded – undo
98 98
      *
99 99
      * @param  EE_Event $event EE event object
100 100
      * @param  array    $data  The request data from the form
101
-     * @return bool success or fail
101
+     * @return integer success or fail
102 102
      * @throws EE_Error
103 103
      */
104 104
     public function attach_evt_message_templates($event, $data)
Please login to merge, or discard this patch.
Indentation   +267 added lines, -267 removed lines patch added patch discarded remove patch
@@ -12,276 +12,276 @@
 block discarded – undo
12 12
  */
13 13
 class espresso_events_Messages_Hooks_Extend extends espresso_events_Messages_Hooks
14 14
 {
15
-    /**
16
-     * espresso_events_Messages_Hooks_Extend constructor.
17
-     *
18
-     * @param \EE_Admin_Page $admin_page
19
-     */
20
-    public function __construct(EE_Admin_Page $admin_page)
21
-    {
22
-        /**
23
-         * Add cap restriction ... metaboxes should not show if user does not have the ability to edit_custom_messages
24
-         */
25
-        if (! EE_Registry::instance()->CAP->current_user_can(
26
-            'ee_edit_messages',
27
-            'messages_events_editor_metabox'
28
-        )) {
29
-            return;
30
-        }
31
-        add_filter(
32
-            'FHEE__Events_Admin_Page___insert_update_cpt_item__event_update_callbacks',
33
-            array($this, 'caf_updates'),
34
-            10
35
-        );
36
-        add_action(
37
-            'AHEE__Extend_Events_Admin_Page___duplicate_event__after',
38
-            array($this, 'duplicate_custom_message_settings'),
39
-            10,
40
-            2
41
-        );
42
-        parent::__construct($admin_page);
43
-    }
44
-
45
-
46
-    /**
47
-     * extending the properties set in espresso_events_Messages_Hooks
48
-     *
49
-     * @access protected
50
-     * @return void
51
-     */
52
-    protected function _extend_properties()
53
-    {
54
-        define('EE_MSGS_EXTEND_ASSETS_URL', EE_CORE_CAF_ADMIN_EXTEND_URL . 'messages/assets/');
55
-        $this->_ajax_func = array(
56
-            'ee_msgs_create_new_custom' => 'create_new_custom',
57
-        );
58
-        $this->_metaboxes = array(
59
-            0 => array(
60
-                'page_route' => array('edit', 'create_new'),
61
-                'func'       => 'messages_metabox',
62
-                'label'      => esc_html__('Notifications', 'event_espresso'),
63
-                'priority'   => 'high',
64
-            ),
65
-        );
66
-
67
-        // see explanation for layout in EE_Admin_Hooks
68
-        $this->_scripts_styles = array(
69
-            'registers' => array(
70
-                'events_msg_admin'     => array(
71
-                    'url'     => EE_MSGS_EXTEND_ASSETS_URL . 'events_messages_admin.js',
72
-                    'depends' => array('ee-dialog', 'ee-parse-uri', 'ee-serialize-full-array'),
73
-                ),
74
-                'events_msg_admin_css' => array(
75
-                    'url'  => EE_MSGS_EXTEND_ASSETS_URL . 'ee_msg_events_admin.css',
76
-                    'type' => 'css',
77
-                ),
78
-            ),
79
-            'enqueues'  => array(
80
-                'events_msg_admin'     => array('edit', 'create_new'),
81
-                'events_msg_admin_css' => array('edit', 'create_new'),
82
-            ),
83
-        );
84
-    }
85
-
86
-
87
-    public function caf_updates($update_callbacks)
88
-    {
89
-        $update_callbacks[] = array($this, 'attach_evt_message_templates');
90
-        return $update_callbacks;
91
-    }
92
-
93
-
94
-    /**
95
-     * Handles attaching Message Templates to the Event on save.
96
-     *
97
-     * @param  EE_Event $event EE event object
98
-     * @param  array    $data  The request data from the form
99
-     * @return bool success or fail
100
-     * @throws EE_Error
101
-     */
102
-    public function attach_evt_message_templates($event, $data)
103
-    {
104
-        // first we remove all existing relations on the Event for message types.
105
-        $event->_remove_relations('Message_Template_Group');
106
-        // now let's just loop through the selected templates and add relations!
107
-        if (isset($data['event_message_templates_relation'])) {
108
-            foreach ($data['event_message_templates_relation'] as $grp_ID) {
109
-                $event->_add_relation_to($grp_ID, 'Message_Template_Group');
110
-            }
111
-        }
112
-        // now save
113
-        return $event->save();
114
-    }
115
-
116
-
117
-    /**
118
-     * @param $event
119
-     * @param $callback_args
120
-     * @return string
121
-     * @throws \EE_Error
122
-     */
123
-    public function messages_metabox($event, $callback_args)
124
-    {
125
-        // let's get the active messengers (b/c messenger objects have the active message templates)
126
-        // convert 'evt_id' to 'EVT_ID'
127
-        $this->_req_data['EVT_ID'] = isset($this->_req_data['EVT_ID']) ? $this->_req_data['EVT_ID'] : null;
128
-        $this->_req_data['EVT_ID'] = isset($this->_req_data['post']) && empty($this->_req_data['EVT_ID'])
129
-            ? $this->_req_data['post']
130
-            : $this->_req_data['EVT_ID'];
131
-
132
-        $this->_req_data['EVT_ID'] = empty($this->_req_data['EVT_ID']) && isset($this->_req_data['evt_id'])
133
-            ? $this->_req_data['evt_id']
134
-            : $this->_req_data['EVT_ID'];
135
-        /** @type EE_Message_Resource_Manager $message_resource_manager */
136
-        $message_resource_manager = EE_Registry::instance()->load_lib('Message_Resource_Manager');
137
-        $active_messengers = $message_resource_manager->active_messengers();
138
-        $tabs = array();
139
-
140
-        // empty messengers?
141
-        // Note message types will always have at least one available because every messenger has a default message type
142
-        // associated with it (payment) if no other message types are selected.
143
-        if (empty($active_messengers)) {
144
-            $msg_activate_url = EE_Admin_Page::add_query_args_and_nonce(
145
-                array('action' => 'settings'),
146
-                EE_MSG_ADMIN_URL
147
-            );
148
-            $error_msg = sprintf(
149
-                esc_html__(
150
-                    'There are no active messengers. So no notifications will go out for %1$sany%2$s events.  You will want to %3$sActivate a Messenger%4$s.',
151
-                    'event_espresso'
152
-                ),
153
-                '<strong>',
154
-                '</strong>',
155
-                '<a href="' . $msg_activate_url . '">',
156
-                '</a>'
157
-            );
158
-            $error_content = '<div class="error"><p>' . $error_msg . '</p></div>';
159
-            $internal_content = '<div id="messages-error"><p>' . $error_msg . '</p></div>';
160
-
161
-            echo $error_content;
162
-            echo $internal_content;
163
-            return '';
164
-        }
165
-
166
-        $event_id = isset($this->_req_data['EVT_ID']) ? $this->_req_data['EVT_ID'] : null;
167
-        // get content for active messengers
168
-        foreach ($active_messengers as $name => $messenger) {
169
-            // first check if there are any active message types for this messenger.
170
-            $active_mts = $message_resource_manager->get_active_message_types_for_messenger($name);
171
-            if (empty($active_mts)) {
172
-                continue;
173
-            }
174
-
175
-            $tab_content = $messenger->get_messenger_admin_page_content(
176
-                'events',
177
-                'edit',
178
-                array('event' => $event_id)
179
-            );
180
-
181
-            if (! empty($tab_content)) {
182
-                $tabs[ $name ] = $tab_content;
183
-            }
184
-        }
185
-
186
-
187
-        // we want this to be tabbed content so let's use the EEH_Tabbed_Content::display helper.
188
-        $tabbed_content = EEH_Tabbed_Content::display($tabs);
189
-        if ($tabbed_content instanceof WP_Error) {
190
-            $tabbed_content = $tabbed_content->get_error_message();
191
-        }
192
-
193
-        $notices = '
15
+	/**
16
+	 * espresso_events_Messages_Hooks_Extend constructor.
17
+	 *
18
+	 * @param \EE_Admin_Page $admin_page
19
+	 */
20
+	public function __construct(EE_Admin_Page $admin_page)
21
+	{
22
+		/**
23
+		 * Add cap restriction ... metaboxes should not show if user does not have the ability to edit_custom_messages
24
+		 */
25
+		if (! EE_Registry::instance()->CAP->current_user_can(
26
+			'ee_edit_messages',
27
+			'messages_events_editor_metabox'
28
+		)) {
29
+			return;
30
+		}
31
+		add_filter(
32
+			'FHEE__Events_Admin_Page___insert_update_cpt_item__event_update_callbacks',
33
+			array($this, 'caf_updates'),
34
+			10
35
+		);
36
+		add_action(
37
+			'AHEE__Extend_Events_Admin_Page___duplicate_event__after',
38
+			array($this, 'duplicate_custom_message_settings'),
39
+			10,
40
+			2
41
+		);
42
+		parent::__construct($admin_page);
43
+	}
44
+
45
+
46
+	/**
47
+	 * extending the properties set in espresso_events_Messages_Hooks
48
+	 *
49
+	 * @access protected
50
+	 * @return void
51
+	 */
52
+	protected function _extend_properties()
53
+	{
54
+		define('EE_MSGS_EXTEND_ASSETS_URL', EE_CORE_CAF_ADMIN_EXTEND_URL . 'messages/assets/');
55
+		$this->_ajax_func = array(
56
+			'ee_msgs_create_new_custom' => 'create_new_custom',
57
+		);
58
+		$this->_metaboxes = array(
59
+			0 => array(
60
+				'page_route' => array('edit', 'create_new'),
61
+				'func'       => 'messages_metabox',
62
+				'label'      => esc_html__('Notifications', 'event_espresso'),
63
+				'priority'   => 'high',
64
+			),
65
+		);
66
+
67
+		// see explanation for layout in EE_Admin_Hooks
68
+		$this->_scripts_styles = array(
69
+			'registers' => array(
70
+				'events_msg_admin'     => array(
71
+					'url'     => EE_MSGS_EXTEND_ASSETS_URL . 'events_messages_admin.js',
72
+					'depends' => array('ee-dialog', 'ee-parse-uri', 'ee-serialize-full-array'),
73
+				),
74
+				'events_msg_admin_css' => array(
75
+					'url'  => EE_MSGS_EXTEND_ASSETS_URL . 'ee_msg_events_admin.css',
76
+					'type' => 'css',
77
+				),
78
+			),
79
+			'enqueues'  => array(
80
+				'events_msg_admin'     => array('edit', 'create_new'),
81
+				'events_msg_admin_css' => array('edit', 'create_new'),
82
+			),
83
+		);
84
+	}
85
+
86
+
87
+	public function caf_updates($update_callbacks)
88
+	{
89
+		$update_callbacks[] = array($this, 'attach_evt_message_templates');
90
+		return $update_callbacks;
91
+	}
92
+
93
+
94
+	/**
95
+	 * Handles attaching Message Templates to the Event on save.
96
+	 *
97
+	 * @param  EE_Event $event EE event object
98
+	 * @param  array    $data  The request data from the form
99
+	 * @return bool success or fail
100
+	 * @throws EE_Error
101
+	 */
102
+	public function attach_evt_message_templates($event, $data)
103
+	{
104
+		// first we remove all existing relations on the Event for message types.
105
+		$event->_remove_relations('Message_Template_Group');
106
+		// now let's just loop through the selected templates and add relations!
107
+		if (isset($data['event_message_templates_relation'])) {
108
+			foreach ($data['event_message_templates_relation'] as $grp_ID) {
109
+				$event->_add_relation_to($grp_ID, 'Message_Template_Group');
110
+			}
111
+		}
112
+		// now save
113
+		return $event->save();
114
+	}
115
+
116
+
117
+	/**
118
+	 * @param $event
119
+	 * @param $callback_args
120
+	 * @return string
121
+	 * @throws \EE_Error
122
+	 */
123
+	public function messages_metabox($event, $callback_args)
124
+	{
125
+		// let's get the active messengers (b/c messenger objects have the active message templates)
126
+		// convert 'evt_id' to 'EVT_ID'
127
+		$this->_req_data['EVT_ID'] = isset($this->_req_data['EVT_ID']) ? $this->_req_data['EVT_ID'] : null;
128
+		$this->_req_data['EVT_ID'] = isset($this->_req_data['post']) && empty($this->_req_data['EVT_ID'])
129
+			? $this->_req_data['post']
130
+			: $this->_req_data['EVT_ID'];
131
+
132
+		$this->_req_data['EVT_ID'] = empty($this->_req_data['EVT_ID']) && isset($this->_req_data['evt_id'])
133
+			? $this->_req_data['evt_id']
134
+			: $this->_req_data['EVT_ID'];
135
+		/** @type EE_Message_Resource_Manager $message_resource_manager */
136
+		$message_resource_manager = EE_Registry::instance()->load_lib('Message_Resource_Manager');
137
+		$active_messengers = $message_resource_manager->active_messengers();
138
+		$tabs = array();
139
+
140
+		// empty messengers?
141
+		// Note message types will always have at least one available because every messenger has a default message type
142
+		// associated with it (payment) if no other message types are selected.
143
+		if (empty($active_messengers)) {
144
+			$msg_activate_url = EE_Admin_Page::add_query_args_and_nonce(
145
+				array('action' => 'settings'),
146
+				EE_MSG_ADMIN_URL
147
+			);
148
+			$error_msg = sprintf(
149
+				esc_html__(
150
+					'There are no active messengers. So no notifications will go out for %1$sany%2$s events.  You will want to %3$sActivate a Messenger%4$s.',
151
+					'event_espresso'
152
+				),
153
+				'<strong>',
154
+				'</strong>',
155
+				'<a href="' . $msg_activate_url . '">',
156
+				'</a>'
157
+			);
158
+			$error_content = '<div class="error"><p>' . $error_msg . '</p></div>';
159
+			$internal_content = '<div id="messages-error"><p>' . $error_msg . '</p></div>';
160
+
161
+			echo $error_content;
162
+			echo $internal_content;
163
+			return '';
164
+		}
165
+
166
+		$event_id = isset($this->_req_data['EVT_ID']) ? $this->_req_data['EVT_ID'] : null;
167
+		// get content for active messengers
168
+		foreach ($active_messengers as $name => $messenger) {
169
+			// first check if there are any active message types for this messenger.
170
+			$active_mts = $message_resource_manager->get_active_message_types_for_messenger($name);
171
+			if (empty($active_mts)) {
172
+				continue;
173
+			}
174
+
175
+			$tab_content = $messenger->get_messenger_admin_page_content(
176
+				'events',
177
+				'edit',
178
+				array('event' => $event_id)
179
+			);
180
+
181
+			if (! empty($tab_content)) {
182
+				$tabs[ $name ] = $tab_content;
183
+			}
184
+		}
185
+
186
+
187
+		// we want this to be tabbed content so let's use the EEH_Tabbed_Content::display helper.
188
+		$tabbed_content = EEH_Tabbed_Content::display($tabs);
189
+		if ($tabbed_content instanceof WP_Error) {
190
+			$tabbed_content = $tabbed_content->get_error_message();
191
+		}
192
+
193
+		$notices = '
194 194
 	<div id="espresso-ajax-loading" class="ajax-loader-grey">
195 195
 		<span class="ee-spinner ee-spin"></span><span class="hidden">'
196
-                   . esc_html__('loading...', 'event_espresso')
197
-                   . '</span>
196
+				   . esc_html__('loading...', 'event_espresso')
197
+				   . '</span>
198 198
 	</div>
199 199
 	<div class="ee-notices"></div>';
200 200
 
201
-        if (defined('DOING_AJAX')) {
202
-            return $tabbed_content;
203
-        }
204
-
205
-        do_action('AHEE__espresso_events_Messages_Hooks_Extend__messages_metabox__before_content');
206
-        echo $notices . '<div class="messages-tabs-content">' . $tabbed_content . '</div>';
207
-        do_action('AHEE__espresso_events_Messages_Hooks_Extend__messages_metabox__after_content');
208
-    }
209
-
210
-
211
-    /**
212
-     * Ajax callback for ee_msgs_create_new_custom ajax request.
213
-     * Takes incoming GRP_ID and name and description values from ajax request
214
-     * to create a new custom template based off of the incoming GRP_ID.
215
-     *
216
-     * @access public
217
-     * @return string either an html string will be returned or a success message
218
-     * @throws EE_Error
219
-     */
220
-    public function create_new_custom()
221
-    {
222
-        if (! EE_Registry::instance()->CAP->current_user_can('ee_edit_messages', 'create_new_custom_ajax')) {
223
-            wp_die(__('You don\'t have privileges to do this action', 'event_espresso'));
224
-        }
225
-
226
-        // let's clean up the _POST global a bit for downstream usage of name and description.
227
-        $_POST['templateName'] = ! empty($this->_req_data['custom_template_args']['MTP_name'])
228
-            ? $this->_req_data['custom_template_args']['MTP_name']
229
-            : '';
230
-        $_POST['templateDescription'] = ! empty($this->_req_data['custom_template_args']['MTP_description'])
231
-            ? $this->_req_data['custom_template_args']['MTP_description']
232
-            : '';
233
-
234
-
235
-        // set EE_Admin_Page object (see method details in EE_Admin_Hooks parent
236
-        $this->_set_page_object();
237
-
238
-        // is this a template switch if so EE_Admin_Page child needs this object
239
-        $this->_page_object->set_hook_object($this);
240
-
241
-        $this->_page_object->add_message_template(
242
-            $this->_req_data['messageType'],
243
-            $this->_req_data['messenger'],
244
-            $this->_req_data['group_ID']
245
-        );
246
-    }
247
-
248
-
249
-    public function create_new_admin_footer()
250
-    {
251
-        $this->edit_admin_footer();
252
-    }
253
-
254
-
255
-    /**
256
-     * This is the dynamic method for this class
257
-     * that will end up hooking into the 'admin_footer' hook on the 'edit_event' route in the events page.
258
-     *
259
-     * @return string
260
-     * @throws DomainException
261
-     */
262
-    public function edit_admin_footer()
263
-    {
264
-        EEH_Template::display_template(
265
-            EE_CORE_CAF_ADMIN_EXTEND . 'messages/templates/create_custom_template_form.template.php'
266
-        );
267
-    }
268
-
269
-
270
-    /**
271
-     * Callback for AHEE__Extend_Events_Admin_Page___duplicate_event__after hook used to ensure new events duplicate
272
-     * the assigned custom message templates.
273
-     *
274
-     * @param EE_Event $new_event
275
-     * @param EE_Event $original_event
276
-     * @throws EE_Error
277
-     */
278
-    public function duplicate_custom_message_settings(EE_Event $new_event, EE_Event $original_event)
279
-    {
280
-        $message_template_groups = $original_event->get_many_related('Message_Template_Group');
281
-        foreach ($message_template_groups as $message_template_group) {
282
-            $new_event->_add_relation_to($message_template_group, 'Message_Template_Group');
283
-        }
284
-        // save new event
285
-        $new_event->save();
286
-    }
201
+		if (defined('DOING_AJAX')) {
202
+			return $tabbed_content;
203
+		}
204
+
205
+		do_action('AHEE__espresso_events_Messages_Hooks_Extend__messages_metabox__before_content');
206
+		echo $notices . '<div class="messages-tabs-content">' . $tabbed_content . '</div>';
207
+		do_action('AHEE__espresso_events_Messages_Hooks_Extend__messages_metabox__after_content');
208
+	}
209
+
210
+
211
+	/**
212
+	 * Ajax callback for ee_msgs_create_new_custom ajax request.
213
+	 * Takes incoming GRP_ID and name and description values from ajax request
214
+	 * to create a new custom template based off of the incoming GRP_ID.
215
+	 *
216
+	 * @access public
217
+	 * @return string either an html string will be returned or a success message
218
+	 * @throws EE_Error
219
+	 */
220
+	public function create_new_custom()
221
+	{
222
+		if (! EE_Registry::instance()->CAP->current_user_can('ee_edit_messages', 'create_new_custom_ajax')) {
223
+			wp_die(__('You don\'t have privileges to do this action', 'event_espresso'));
224
+		}
225
+
226
+		// let's clean up the _POST global a bit for downstream usage of name and description.
227
+		$_POST['templateName'] = ! empty($this->_req_data['custom_template_args']['MTP_name'])
228
+			? $this->_req_data['custom_template_args']['MTP_name']
229
+			: '';
230
+		$_POST['templateDescription'] = ! empty($this->_req_data['custom_template_args']['MTP_description'])
231
+			? $this->_req_data['custom_template_args']['MTP_description']
232
+			: '';
233
+
234
+
235
+		// set EE_Admin_Page object (see method details in EE_Admin_Hooks parent
236
+		$this->_set_page_object();
237
+
238
+		// is this a template switch if so EE_Admin_Page child needs this object
239
+		$this->_page_object->set_hook_object($this);
240
+
241
+		$this->_page_object->add_message_template(
242
+			$this->_req_data['messageType'],
243
+			$this->_req_data['messenger'],
244
+			$this->_req_data['group_ID']
245
+		);
246
+	}
247
+
248
+
249
+	public function create_new_admin_footer()
250
+	{
251
+		$this->edit_admin_footer();
252
+	}
253
+
254
+
255
+	/**
256
+	 * This is the dynamic method for this class
257
+	 * that will end up hooking into the 'admin_footer' hook on the 'edit_event' route in the events page.
258
+	 *
259
+	 * @return string
260
+	 * @throws DomainException
261
+	 */
262
+	public function edit_admin_footer()
263
+	{
264
+		EEH_Template::display_template(
265
+			EE_CORE_CAF_ADMIN_EXTEND . 'messages/templates/create_custom_template_form.template.php'
266
+		);
267
+	}
268
+
269
+
270
+	/**
271
+	 * Callback for AHEE__Extend_Events_Admin_Page___duplicate_event__after hook used to ensure new events duplicate
272
+	 * the assigned custom message templates.
273
+	 *
274
+	 * @param EE_Event $new_event
275
+	 * @param EE_Event $original_event
276
+	 * @throws EE_Error
277
+	 */
278
+	public function duplicate_custom_message_settings(EE_Event $new_event, EE_Event $original_event)
279
+	{
280
+		$message_template_groups = $original_event->get_many_related('Message_Template_Group');
281
+		foreach ($message_template_groups as $message_template_group) {
282
+			$new_event->_add_relation_to($message_template_group, 'Message_Template_Group');
283
+		}
284
+		// save new event
285
+		$new_event->save();
286
+	}
287 287
 }
Please login to merge, or discard this patch.
Spacing   +12 added lines, -12 removed lines patch added patch discarded remove patch
@@ -22,7 +22,7 @@  discard block
 block discarded – undo
22 22
         /**
23 23
          * Add cap restriction ... metaboxes should not show if user does not have the ability to edit_custom_messages
24 24
          */
25
-        if (! EE_Registry::instance()->CAP->current_user_can(
25
+        if ( ! EE_Registry::instance()->CAP->current_user_can(
26 26
             'ee_edit_messages',
27 27
             'messages_events_editor_metabox'
28 28
         )) {
@@ -51,7 +51,7 @@  discard block
 block discarded – undo
51 51
      */
52 52
     protected function _extend_properties()
53 53
     {
54
-        define('EE_MSGS_EXTEND_ASSETS_URL', EE_CORE_CAF_ADMIN_EXTEND_URL . 'messages/assets/');
54
+        define('EE_MSGS_EXTEND_ASSETS_URL', EE_CORE_CAF_ADMIN_EXTEND_URL.'messages/assets/');
55 55
         $this->_ajax_func = array(
56 56
             'ee_msgs_create_new_custom' => 'create_new_custom',
57 57
         );
@@ -68,11 +68,11 @@  discard block
 block discarded – undo
68 68
         $this->_scripts_styles = array(
69 69
             'registers' => array(
70 70
                 'events_msg_admin'     => array(
71
-                    'url'     => EE_MSGS_EXTEND_ASSETS_URL . 'events_messages_admin.js',
71
+                    'url'     => EE_MSGS_EXTEND_ASSETS_URL.'events_messages_admin.js',
72 72
                     'depends' => array('ee-dialog', 'ee-parse-uri', 'ee-serialize-full-array'),
73 73
                 ),
74 74
                 'events_msg_admin_css' => array(
75
-                    'url'  => EE_MSGS_EXTEND_ASSETS_URL . 'ee_msg_events_admin.css',
75
+                    'url'  => EE_MSGS_EXTEND_ASSETS_URL.'ee_msg_events_admin.css',
76 76
                     'type' => 'css',
77 77
                 ),
78 78
             ),
@@ -152,11 +152,11 @@  discard block
 block discarded – undo
152 152
                 ),
153 153
                 '<strong>',
154 154
                 '</strong>',
155
-                '<a href="' . $msg_activate_url . '">',
155
+                '<a href="'.$msg_activate_url.'">',
156 156
                 '</a>'
157 157
             );
158
-            $error_content = '<div class="error"><p>' . $error_msg . '</p></div>';
159
-            $internal_content = '<div id="messages-error"><p>' . $error_msg . '</p></div>';
158
+            $error_content = '<div class="error"><p>'.$error_msg.'</p></div>';
159
+            $internal_content = '<div id="messages-error"><p>'.$error_msg.'</p></div>';
160 160
 
161 161
             echo $error_content;
162 162
             echo $internal_content;
@@ -178,8 +178,8 @@  discard block
 block discarded – undo
178 178
                 array('event' => $event_id)
179 179
             );
180 180
 
181
-            if (! empty($tab_content)) {
182
-                $tabs[ $name ] = $tab_content;
181
+            if ( ! empty($tab_content)) {
182
+                $tabs[$name] = $tab_content;
183 183
             }
184 184
         }
185 185
 
@@ -203,7 +203,7 @@  discard block
 block discarded – undo
203 203
         }
204 204
 
205 205
         do_action('AHEE__espresso_events_Messages_Hooks_Extend__messages_metabox__before_content');
206
-        echo $notices . '<div class="messages-tabs-content">' . $tabbed_content . '</div>';
206
+        echo $notices.'<div class="messages-tabs-content">'.$tabbed_content.'</div>';
207 207
         do_action('AHEE__espresso_events_Messages_Hooks_Extend__messages_metabox__after_content');
208 208
     }
209 209
 
@@ -219,7 +219,7 @@  discard block
 block discarded – undo
219 219
      */
220 220
     public function create_new_custom()
221 221
     {
222
-        if (! EE_Registry::instance()->CAP->current_user_can('ee_edit_messages', 'create_new_custom_ajax')) {
222
+        if ( ! EE_Registry::instance()->CAP->current_user_can('ee_edit_messages', 'create_new_custom_ajax')) {
223 223
             wp_die(__('You don\'t have privileges to do this action', 'event_espresso'));
224 224
         }
225 225
 
@@ -262,7 +262,7 @@  discard block
 block discarded – undo
262 262
     public function edit_admin_footer()
263 263
     {
264 264
         EEH_Template::display_template(
265
-            EE_CORE_CAF_ADMIN_EXTEND . 'messages/templates/create_custom_template_form.template.php'
265
+            EE_CORE_CAF_ADMIN_EXTEND.'messages/templates/create_custom_template_form.template.php'
266 266
         );
267 267
     }
268 268
 
Please login to merge, or discard this patch.
core/libraries/messages/messenger/EE_Email_messenger.class.php 3 patches
Doc Comments   +1 added lines, -1 removed lines patch added patch discarded remove patch
@@ -456,7 +456,7 @@
 block discarded – undo
456 456
      * be empty
457 457
      *
458 458
      * @since 4.3.1
459
-     * @return array
459
+     * @return string[]
460 460
      */
461 461
     private function _parse_from()
462 462
     {
Please login to merge, or discard this patch.
Indentation   +644 added lines, -644 removed lines patch added patch discarded remove patch
@@ -6,648 +6,648 @@
 block discarded – undo
6 6
 class EE_Email_messenger extends EE_messenger
7 7
 {
8 8
 
9
-    /**
10
-     * To field for email
11
-     * @var string
12
-     */
13
-    protected $_to = '';
14
-
15
-
16
-    /**
17
-     * CC field for email.
18
-     * @var string
19
-     */
20
-    protected $_cc = '';
21
-
22
-    /**
23
-     * From field for email
24
-     * @var string
25
-     */
26
-    protected $_from = '';
27
-
28
-
29
-    /**
30
-     * Subject field for email
31
-     * @var string
32
-     */
33
-    protected $_subject = '';
34
-
35
-
36
-    /**
37
-     * Content field for email
38
-     * @var string
39
-     */
40
-    protected $_content = '';
41
-
42
-
43
-    /**
44
-     * constructor
45
-     *
46
-     * @access public
47
-     */
48
-    public function __construct()
49
-    {
50
-        // set name and description properties
51
-        $this->name                = 'email';
52
-        $this->description         = sprintf(
53
-            esc_html__(
54
-                'This messenger delivers messages via email using the built-in %s function included with WordPress',
55
-                'event_espresso'
56
-            ),
57
-            '<code>wp_mail</code>'
58
-        );
59
-        $this->label               = array(
60
-            'singular' => esc_html__('email', 'event_espresso'),
61
-            'plural'   => esc_html__('emails', 'event_espresso'),
62
-        );
63
-        $this->activate_on_install = true;
64
-
65
-        // we're using defaults so let's call parent constructor that will take care of setting up all the other
66
-        // properties
67
-        parent::__construct();
68
-    }
69
-
70
-
71
-    /**
72
-     * see abstract declaration in parent class for details.
73
-     */
74
-    protected function _set_admin_pages()
75
-    {
76
-        $this->admin_registered_pages = array(
77
-            'events_edit' => true,
78
-        );
79
-    }
80
-
81
-
82
-    /**
83
-     * see abstract declaration in parent class for details
84
-     */
85
-    protected function _set_valid_shortcodes()
86
-    {
87
-        // remember by leaving the other fields not set, those fields will inherit the valid shortcodes from the
88
-        // message type.
89
-        $this->_valid_shortcodes = array(
90
-            'to'   => array('email', 'event_author', 'primary_registration_details', 'recipient_details'),
91
-            'cc' => array('email', 'event_author', 'primary_registration_details', 'recipient_details'),
92
-            'from' => array('email', 'event_author', 'primary_registration_details', 'recipient_details'),
93
-        );
94
-    }
95
-
96
-
97
-    /**
98
-     * see abstract declaration in parent class for details
99
-     *
100
-     * @access protected
101
-     * @return void
102
-     */
103
-    protected function _set_validator_config()
104
-    {
105
-        $valid_shortcodes = $this->get_valid_shortcodes();
106
-
107
-        $this->_validator_config = array(
108
-            'to'            => array(
109
-                'shortcodes' => $valid_shortcodes['to'],
110
-                'type'       => 'email',
111
-            ),
112
-            'cc' => array(
113
-                'shortcodes' => $valid_shortcodes['to'],
114
-                'type' => 'email',
115
-            ),
116
-            'from'          => array(
117
-                'shortcodes' => $valid_shortcodes['from'],
118
-                'type'       => 'email',
119
-            ),
120
-            'subject'       => array(
121
-                'shortcodes' => array(
122
-                    'organization',
123
-                    'primary_registration_details',
124
-                    'event_author',
125
-                    'primary_registration_details',
126
-                    'recipient_details',
127
-                ),
128
-            ),
129
-            'content'       => array(
130
-                'shortcodes' => array(
131
-                    'event_list',
132
-                    'attendee_list',
133
-                    'ticket_list',
134
-                    'organization',
135
-                    'primary_registration_details',
136
-                    'primary_registration_list',
137
-                    'event_author',
138
-                    'recipient_details',
139
-                    'recipient_list',
140
-                    'transaction',
141
-                    'messenger',
142
-                ),
143
-            ),
144
-            'attendee_list' => array(
145
-                'shortcodes' => array('attendee', 'event_list', 'ticket_list'),
146
-                'required'   => array('[ATTENDEE_LIST]'),
147
-            ),
148
-            'event_list'    => array(
149
-                'shortcodes' => array(
150
-                    'event',
151
-                    'attendee_list',
152
-                    'ticket_list',
153
-                    'venue',
154
-                    'datetime_list',
155
-                    'attendee',
156
-                    'primary_registration_details',
157
-                    'primary_registration_list',
158
-                    'event_author',
159
-                    'recipient_details',
160
-                    'recipient_list',
161
-                ),
162
-                'required'   => array('[EVENT_LIST]'),
163
-            ),
164
-            'ticket_list'   => array(
165
-                'shortcodes' => array(
166
-                    'event_list',
167
-                    'attendee_list',
168
-                    'ticket',
169
-                    'datetime_list',
170
-                    'primary_registration_details',
171
-                    'recipient_details',
172
-                ),
173
-                'required'   => array('[TICKET_LIST]'),
174
-            ),
175
-            'datetime_list' => array(
176
-                'shortcodes' => array('datetime'),
177
-                'required'   => array('[DATETIME_LIST]'),
178
-            ),
179
-        );
180
-    }
181
-
182
-
183
-    /**
184
-     * @see   parent EE_messenger class for docs
185
-     * @since 4.5.0
186
-     */
187
-    public function do_secondary_messenger_hooks($sending_messenger_name)
188
-    {
189
-        if ($sending_messenger_name = 'html') {
190
-            add_filter('FHEE__EE_Messages_Template_Pack__get_variation', array($this, 'add_email_css'), 10, 8);
191
-        }
192
-    }
193
-
194
-
195
-    public function add_email_css(
196
-        $variation_path,
197
-        $messenger,
198
-        $message_type,
199
-        $type,
200
-        $variation,
201
-        $file_extension,
202
-        $url,
203
-        EE_Messages_Template_Pack $template_pack
204
-    ) {
205
-        // prevent recursion on this callback.
206
-        remove_filter('FHEE__EE_Messages_Template_Pack__get_variation', array($this, 'add_email_css'), 10);
207
-        $variation = $this->get_variation($template_pack, $message_type, $url, 'main', $variation, false);
208
-
209
-        add_filter('FHEE__EE_Messages_Template_Pack__get_variation', array($this, 'add_email_css'), 10, 8);
210
-        return $variation;
211
-    }
212
-
213
-
214
-    /**
215
-     * See parent for details
216
-     *
217
-     * @access protected
218
-     * @return void
219
-     */
220
-    protected function _set_test_settings_fields()
221
-    {
222
-        $this->_test_settings_fields = array(
223
-            'to'      => array(
224
-                'input'      => 'text',
225
-                'label'      => esc_html__('Send a test email to', 'event_espresso'),
226
-                'type'       => 'email',
227
-                'required'   => true,
228
-                'validation' => true,
229
-                'css_class'  => 'large-text',
230
-                'format'     => '%s',
231
-                'default'    => get_bloginfo('admin_email'),
232
-            ),
233
-            'subject' => array(
234
-                'input'      => 'hidden',
235
-                'label'      => '',
236
-                'type'       => 'string',
237
-                'required'   => false,
238
-                'validation' => false,
239
-                'format'     => '%s',
240
-                'value'      => sprintf(__('Test email sent from %s', 'event_espresso'), get_bloginfo('name')),
241
-                'default'    => '',
242
-                'css_class'  => '',
243
-            ),
244
-        );
245
-    }
246
-
247
-
248
-    /**
249
-     * _set_template_fields
250
-     * This sets up the fields that a messenger requires for the message to go out.
251
-     *
252
-     * @access  protected
253
-     * @return void
254
-     */
255
-    protected function _set_template_fields()
256
-    {
257
-        // any extra template fields that are NOT used by the messenger but will get used by a messenger field for
258
-        // shortcode replacement get added to the 'extra' key in an associated array indexed by the messenger field
259
-        // they relate to.  This is important for the Messages_admin to know what fields to display to the user.
260
-        //  Also, notice that the "values" are equal to the field type that messages admin will use to know what
261
-        // kind of field to display. The values ALSO have one index labeled "shortcode".  the values in that array
262
-        // indicate which ACTUAL SHORTCODE (i.e. [SHORTCODE]) is required in order for this extra field to be
263
-        // displayed.  If the required shortcode isn't part of the shortcodes array then the field is not needed and
264
-        // will not be displayed/parsed.
265
-        $this->_template_fields = array(
266
-            'to'      => array(
267
-                'input'      => 'text',
268
-                'label'      => esc_html_x(
269
-                    'To',
270
-                    'Label for the "To" field for email addresses',
271
-                    'event_espresso'
272
-                ),
273
-                'type'       => 'string',
274
-                'required'   => true,
275
-                'validation' => true,
276
-                'css_class'  => 'large-text',
277
-                'format'     => '%s',
278
-            ),
279
-            'cc'      => array(
280
-                'input'      => 'text',
281
-                'label'      => esc_html_x(
282
-                    'CC',
283
-                    'Label for the "Carbon Copy" field used for additional email addresses',
284
-                    'event_espresso'
285
-                ),
286
-                'type'       => 'string',
287
-                'required'   => false,
288
-                'validation' => true,
289
-                'css_class'  => 'large-text',
290
-                'format'     => '%s',
291
-            ),
292
-            'from'    => array(
293
-                'input'      => 'text',
294
-                'label'      => esc_html_x(
295
-                    'From',
296
-                    'Label for the "From" field for email addresses.',
297
-                    'event_espresso'
298
-                ),
299
-                'type'       => 'string',
300
-                'required'   => true,
301
-                'validation' => true,
302
-                'css_class'  => 'large-text',
303
-                'format'     => '%s',
304
-            ),
305
-            'subject' => array(
306
-                'input'      => 'text',
307
-                'label'      => esc_html_x(
308
-                    'Subject',
309
-                    'Label for the "Subject" field (short description of contents) for emails.',
310
-                    'event_espresso'
311
-                ),
312
-                'type'       => 'string',
313
-                'required'   => true,
314
-                'validation' => true,
315
-                'css_class'  => 'large-text',
316
-                'format'     => '%s',
317
-            ),
318
-            'content' => '',
319
-            // left empty b/c it is in the "extra array" but messenger still needs needs to know this is a field.
320
-            'extra'   => array(
321
-                'content' => array(
322
-                    'main'          => array(
323
-                        'input'      => 'wp_editor',
324
-                        'label'      => esc_html__('Main Content', 'event_espresso'),
325
-                        'type'       => 'string',
326
-                        'required'   => true,
327
-                        'validation' => true,
328
-                        'format'     => '%s',
329
-                        'rows'       => '15',
330
-                    ),
331
-                    'event_list'    => array(
332
-                        'input'               => 'wp_editor',
333
-                        'label'               => '[EVENT_LIST]',
334
-                        'type'                => 'string',
335
-                        'required'            => true,
336
-                        'validation'          => true,
337
-                        'format'              => '%s',
338
-                        'rows'                => '15',
339
-                        'shortcodes_required' => array('[EVENT_LIST]'),
340
-                    ),
341
-                    'attendee_list' => array(
342
-                        'input'               => 'textarea',
343
-                        'label'               => '[ATTENDEE_LIST]',
344
-                        'type'                => 'string',
345
-                        'required'            => true,
346
-                        'validation'          => true,
347
-                        'format'              => '%s',
348
-                        'css_class'           => 'large-text',
349
-                        'rows'                => '5',
350
-                        'shortcodes_required' => array('[ATTENDEE_LIST]'),
351
-                    ),
352
-                    'ticket_list'   => array(
353
-                        'input'               => 'textarea',
354
-                        'label'               => '[TICKET_LIST]',
355
-                        'type'                => 'string',
356
-                        'required'            => true,
357
-                        'validation'          => true,
358
-                        'format'              => '%s',
359
-                        'css_class'           => 'large-text',
360
-                        'rows'                => '10',
361
-                        'shortcodes_required' => array('[TICKET_LIST]'),
362
-                    ),
363
-                    'datetime_list' => array(
364
-                        'input'               => 'textarea',
365
-                        'label'               => '[DATETIME_LIST]',
366
-                        'type'                => 'string',
367
-                        'required'            => true,
368
-                        'validation'          => true,
369
-                        'format'              => '%s',
370
-                        'css_class'           => 'large-text',
371
-                        'rows'                => '10',
372
-                        'shortcodes_required' => array('[DATETIME_LIST]'),
373
-                    ),
374
-                ),
375
-            ),
376
-        );
377
-    }
378
-
379
-
380
-    /**
381
-     * See definition of this class in parent
382
-     */
383
-    protected function _set_default_message_types()
384
-    {
385
-        $this->_default_message_types = array(
386
-            'payment',
387
-            'payment_refund',
388
-            'registration',
389
-            'not_approved_registration',
390
-            'pending_approval',
391
-        );
392
-    }
393
-
394
-
395
-    /**
396
-     * @see   definition of this class in parent
397
-     * @since 4.5.0
398
-     */
399
-    protected function _set_valid_message_types()
400
-    {
401
-        $this->_valid_message_types = array(
402
-            'payment',
403
-            'registration',
404
-            'not_approved_registration',
405
-            'declined_registration',
406
-            'cancelled_registration',
407
-            'pending_approval',
408
-            'registration_summary',
409
-            'payment_reminder',
410
-            'payment_declined',
411
-            'payment_refund',
412
-        );
413
-    }
414
-
415
-
416
-    /**
417
-     * setting up admin_settings_fields for messenger.
418
-     */
419
-    protected function _set_admin_settings_fields()
420
-    {
421
-    }
422
-
423
-    /**
424
-     * We just deliver the messages don't kill us!!
425
-     *
426
-     * @return bool|WP_Error true if message delivered, false if it didn't deliver OR bubble up any error object if
427
-     *              present.
428
-     * @throws EE_Error
429
-     * @throws \TijsVerkoyen\CssToInlineStyles\Exception
430
-     */
431
-    protected function _send_message()
432
-    {
433
-        $success = wp_mail(
434
-            $this->_to,
435
-            // some old values for subject may be expecting HTML entities to be decoded in the subject
436
-            // and subjects aren't interpreted as HTML, so there should be no HTML in them
437
-            wp_strip_all_tags(wp_specialchars_decode($this->_subject, ENT_QUOTES)),
438
-            $this->_body(),
439
-            $this->_headers()
440
-        );
441
-        if (! $success) {
442
-            EE_Error::add_error(
443
-                sprintf(
444
-                    esc_html__(
445
-                        'The email did not send successfully.%3$sThe WordPress wp_mail function is used for sending mails but does not give any useful information when an email fails to send.%3$sIt is possible the "to" address (%1$s) or "from" address (%2$s) is invalid.%3$s',
446
-                        'event_espresso'
447
-                    ),
448
-                    $this->_to,
449
-                    $this->_from,
450
-                    '<br />'
451
-                ),
452
-                __FILE__,
453
-                __FUNCTION__,
454
-                __LINE__
455
-            );
456
-        }
457
-        return $success;
458
-    }
459
-
460
-
461
-    /**
462
-     * see parent for definition
463
-     *
464
-     * @return string html body of the message content and the related css.
465
-     * @throws EE_Error
466
-     * @throws \TijsVerkoyen\CssToInlineStyles\Exception
467
-     */
468
-    protected function _preview()
469
-    {
470
-        return $this->_body(true);
471
-    }
472
-
473
-
474
-    /**
475
-     * Setup headers for email
476
-     *
477
-     * @access protected
478
-     * @return string formatted header for email
479
-     */
480
-    protected function _headers()
481
-    {
482
-        $this->_ensure_has_from_email_address();
483
-        $from    = $this->_from;
484
-        $headers = array(
485
-            'From:' . $from,
486
-            'Reply-To:' . $from,
487
-            'Content-Type:text/html; charset=utf-8',
488
-        );
489
-
490
-        /**
491
-         * Second condition added as a result of https://events.codebasehq.com/projects/event-espresso/tickets/11416 to
492
-         * cover back compat where there may be users who have saved cc values in their db for the newsletter message
493
-         * type which they are no longer able to change.
494
-         */
495
-        if (! empty($this->_cc) && ! $this->_incoming_message_type instanceof EE_Newsletter_message_type) {
496
-            $headers[] = 'cc: ' . $this->_cc;
497
-        }
498
-
499
-        // but wait!  Header's for the from is NOT reliable because some plugins don't respect From: as set in the
500
-        // header.
501
-        add_filter('wp_mail_from', array($this, 'set_from_address'), 100);
502
-        add_filter('wp_mail_from_name', array($this, 'set_from_name'), 100);
503
-        return apply_filters('FHEE__EE_Email_messenger___headers', $headers, $this->_incoming_message_type, $this);
504
-    }
505
-
506
-
507
-    /**
508
-     * This simply ensures that the from address is not empty.  If it is, then we use whatever is set as the site email
509
-     * address for the from address to avoid problems with sending emails.
510
-     */
511
-    protected function _ensure_has_from_email_address()
512
-    {
513
-        if (empty($this->_from)) {
514
-            $this->_from = get_bloginfo('admin_email');
515
-        }
516
-    }
517
-
518
-
519
-    /**
520
-     * This simply parses whatever is set as the $_from address and determines if it is in the format {name} <{email}>
521
-     * or just {email} and returns an array with the "from_name" and "from_email" as the values. Note from_name *MAY*
522
-     * be empty
523
-     *
524
-     * @since 4.3.1
525
-     * @return array
526
-     */
527
-    private function _parse_from()
528
-    {
529
-        if (strpos($this->_from, '<') !== false) {
530
-            $from_name = substr($this->_from, 0, strpos($this->_from, '<') - 1);
531
-            $from_name = str_replace('"', '', $from_name);
532
-            $from_name = trim($from_name);
533
-
534
-            $from_email = substr($this->_from, strpos($this->_from, '<') + 1);
535
-            $from_email = str_replace('>', '', $from_email);
536
-            $from_email = trim($from_email);
537
-        } elseif (trim($this->_from) !== '') {
538
-            $from_name  = '';
539
-            $from_email = trim($this->_from);
540
-        } else {
541
-            $from_name = $from_email = '';
542
-        }
543
-        return array($from_name, $from_email);
544
-    }
545
-
546
-
547
-    /**
548
-     * Callback for the wp_mail_from filter.
549
-     *
550
-     * @since 4.3.1
551
-     * @param string $from_email What the original from_email is.
552
-     * @return string
553
-     */
554
-    public function set_from_address($from_email)
555
-    {
556
-        $parsed_from = $this->_parse_from();
557
-        // includes fallback if the parsing failed.
558
-        $from_email = is_array($parsed_from) && ! empty($parsed_from[1])
559
-            ? $parsed_from[1]
560
-            : get_bloginfo('admin_email');
561
-        return $from_email;
562
-    }
563
-
564
-
565
-    /**
566
-     * Callback fro the wp_mail_from_name filter.
567
-     *
568
-     * @since 4.3.1
569
-     * @param string $from_name The original from_name.
570
-     * @return string
571
-     */
572
-    public function set_from_name($from_name)
573
-    {
574
-        $parsed_from = $this->_parse_from();
575
-        if (is_array($parsed_from) && ! empty($parsed_from[0])) {
576
-            $from_name = $parsed_from[0];
577
-        }
578
-
579
-        // if from name is "WordPress" let's sub in the site name instead (more friendly!)
580
-        // but realize the default name is HTML entity-encoded
581
-        $from_name = $from_name == 'WordPress' ? wp_specialchars_decode(get_bloginfo(), ENT_QUOTES) : $from_name;
582
-
583
-        return $from_name;
584
-    }
585
-
586
-
587
-    /**
588
-     * setup body for email
589
-     *
590
-     * @param bool $preview will determine whether this is preview template or not.
591
-     * @return string formatted body for email.
592
-     * @throws EE_Error
593
-     * @throws \TijsVerkoyen\CssToInlineStyles\Exception
594
-     */
595
-    protected function _body($preview = false)
596
-    {
597
-        // setup template args!
598
-        $this->_template_args = array(
599
-            'subject'   => $this->_subject,
600
-            'from'      => $this->_from,
601
-            'main_body' => wpautop($this->_content),
602
-        );
603
-        $body                 = $this->_get_main_template($preview);
604
-
605
-        /**
606
-         * This filter allows one to bypass the CSSToInlineStyles tool and leave the body untouched.
607
-         *
608
-         * @type    bool $preview Indicates whether a preview is being generated or not.
609
-         * @return  bool    true  indicates to use the inliner, false bypasses it.
610
-         */
611
-        if (apply_filters('FHEE__EE_Email_messenger__apply_CSSInliner ', true, $preview)) {
612
-            // require CssToInlineStyles library and its dependencies via composer autoloader
613
-            require_once EE_THIRD_PARTY . 'cssinliner/vendor/autoload.php';
614
-
615
-            // now if this isn't a preview, let's setup the body so it has inline styles
616
-            if (! $preview || ($preview && defined('DOING_AJAX'))) {
617
-                $style = file_get_contents(
618
-                    $this->get_variation(
619
-                        $this->_tmp_pack,
620
-                        $this->_incoming_message_type->name,
621
-                        false,
622
-                        'main',
623
-                        $this->_variation
624
-                    ),
625
-                    true
626
-                );
627
-                $CSS   = new TijsVerkoyen\CssToInlineStyles\CssToInlineStyles($body, $style);
628
-                // for some reason the library has a bracket and new line at the beginning.  This takes care of that.
629
-                $body  = ltrim($CSS->convert(true), ">\n");
630
-                // see https://events.codebasehq.com/projects/event-espresso/tickets/8609
631
-                $body  = ltrim($body, "<?");
632
-            }
633
-        }
634
-        return $body;
635
-    }
636
-
637
-
638
-    /**
639
-     * This just returns any existing test settings that might be saved in the database
640
-     *
641
-     * @access public
642
-     * @return array
643
-     */
644
-    public function get_existing_test_settings()
645
-    {
646
-        $settings = parent::get_existing_test_settings();
647
-        // override subject if present because we always want it to be fresh.
648
-        if (is_array($settings) && ! empty($settings['subject'])) {
649
-            $settings['subject'] = sprintf(__('Test email sent from %s', 'event_espresso'), get_bloginfo('name'));
650
-        }
651
-        return $settings;
652
-    }
9
+	/**
10
+	 * To field for email
11
+	 * @var string
12
+	 */
13
+	protected $_to = '';
14
+
15
+
16
+	/**
17
+	 * CC field for email.
18
+	 * @var string
19
+	 */
20
+	protected $_cc = '';
21
+
22
+	/**
23
+	 * From field for email
24
+	 * @var string
25
+	 */
26
+	protected $_from = '';
27
+
28
+
29
+	/**
30
+	 * Subject field for email
31
+	 * @var string
32
+	 */
33
+	protected $_subject = '';
34
+
35
+
36
+	/**
37
+	 * Content field for email
38
+	 * @var string
39
+	 */
40
+	protected $_content = '';
41
+
42
+
43
+	/**
44
+	 * constructor
45
+	 *
46
+	 * @access public
47
+	 */
48
+	public function __construct()
49
+	{
50
+		// set name and description properties
51
+		$this->name                = 'email';
52
+		$this->description         = sprintf(
53
+			esc_html__(
54
+				'This messenger delivers messages via email using the built-in %s function included with WordPress',
55
+				'event_espresso'
56
+			),
57
+			'<code>wp_mail</code>'
58
+		);
59
+		$this->label               = array(
60
+			'singular' => esc_html__('email', 'event_espresso'),
61
+			'plural'   => esc_html__('emails', 'event_espresso'),
62
+		);
63
+		$this->activate_on_install = true;
64
+
65
+		// we're using defaults so let's call parent constructor that will take care of setting up all the other
66
+		// properties
67
+		parent::__construct();
68
+	}
69
+
70
+
71
+	/**
72
+	 * see abstract declaration in parent class for details.
73
+	 */
74
+	protected function _set_admin_pages()
75
+	{
76
+		$this->admin_registered_pages = array(
77
+			'events_edit' => true,
78
+		);
79
+	}
80
+
81
+
82
+	/**
83
+	 * see abstract declaration in parent class for details
84
+	 */
85
+	protected function _set_valid_shortcodes()
86
+	{
87
+		// remember by leaving the other fields not set, those fields will inherit the valid shortcodes from the
88
+		// message type.
89
+		$this->_valid_shortcodes = array(
90
+			'to'   => array('email', 'event_author', 'primary_registration_details', 'recipient_details'),
91
+			'cc' => array('email', 'event_author', 'primary_registration_details', 'recipient_details'),
92
+			'from' => array('email', 'event_author', 'primary_registration_details', 'recipient_details'),
93
+		);
94
+	}
95
+
96
+
97
+	/**
98
+	 * see abstract declaration in parent class for details
99
+	 *
100
+	 * @access protected
101
+	 * @return void
102
+	 */
103
+	protected function _set_validator_config()
104
+	{
105
+		$valid_shortcodes = $this->get_valid_shortcodes();
106
+
107
+		$this->_validator_config = array(
108
+			'to'            => array(
109
+				'shortcodes' => $valid_shortcodes['to'],
110
+				'type'       => 'email',
111
+			),
112
+			'cc' => array(
113
+				'shortcodes' => $valid_shortcodes['to'],
114
+				'type' => 'email',
115
+			),
116
+			'from'          => array(
117
+				'shortcodes' => $valid_shortcodes['from'],
118
+				'type'       => 'email',
119
+			),
120
+			'subject'       => array(
121
+				'shortcodes' => array(
122
+					'organization',
123
+					'primary_registration_details',
124
+					'event_author',
125
+					'primary_registration_details',
126
+					'recipient_details',
127
+				),
128
+			),
129
+			'content'       => array(
130
+				'shortcodes' => array(
131
+					'event_list',
132
+					'attendee_list',
133
+					'ticket_list',
134
+					'organization',
135
+					'primary_registration_details',
136
+					'primary_registration_list',
137
+					'event_author',
138
+					'recipient_details',
139
+					'recipient_list',
140
+					'transaction',
141
+					'messenger',
142
+				),
143
+			),
144
+			'attendee_list' => array(
145
+				'shortcodes' => array('attendee', 'event_list', 'ticket_list'),
146
+				'required'   => array('[ATTENDEE_LIST]'),
147
+			),
148
+			'event_list'    => array(
149
+				'shortcodes' => array(
150
+					'event',
151
+					'attendee_list',
152
+					'ticket_list',
153
+					'venue',
154
+					'datetime_list',
155
+					'attendee',
156
+					'primary_registration_details',
157
+					'primary_registration_list',
158
+					'event_author',
159
+					'recipient_details',
160
+					'recipient_list',
161
+				),
162
+				'required'   => array('[EVENT_LIST]'),
163
+			),
164
+			'ticket_list'   => array(
165
+				'shortcodes' => array(
166
+					'event_list',
167
+					'attendee_list',
168
+					'ticket',
169
+					'datetime_list',
170
+					'primary_registration_details',
171
+					'recipient_details',
172
+				),
173
+				'required'   => array('[TICKET_LIST]'),
174
+			),
175
+			'datetime_list' => array(
176
+				'shortcodes' => array('datetime'),
177
+				'required'   => array('[DATETIME_LIST]'),
178
+			),
179
+		);
180
+	}
181
+
182
+
183
+	/**
184
+	 * @see   parent EE_messenger class for docs
185
+	 * @since 4.5.0
186
+	 */
187
+	public function do_secondary_messenger_hooks($sending_messenger_name)
188
+	{
189
+		if ($sending_messenger_name = 'html') {
190
+			add_filter('FHEE__EE_Messages_Template_Pack__get_variation', array($this, 'add_email_css'), 10, 8);
191
+		}
192
+	}
193
+
194
+
195
+	public function add_email_css(
196
+		$variation_path,
197
+		$messenger,
198
+		$message_type,
199
+		$type,
200
+		$variation,
201
+		$file_extension,
202
+		$url,
203
+		EE_Messages_Template_Pack $template_pack
204
+	) {
205
+		// prevent recursion on this callback.
206
+		remove_filter('FHEE__EE_Messages_Template_Pack__get_variation', array($this, 'add_email_css'), 10);
207
+		$variation = $this->get_variation($template_pack, $message_type, $url, 'main', $variation, false);
208
+
209
+		add_filter('FHEE__EE_Messages_Template_Pack__get_variation', array($this, 'add_email_css'), 10, 8);
210
+		return $variation;
211
+	}
212
+
213
+
214
+	/**
215
+	 * See parent for details
216
+	 *
217
+	 * @access protected
218
+	 * @return void
219
+	 */
220
+	protected function _set_test_settings_fields()
221
+	{
222
+		$this->_test_settings_fields = array(
223
+			'to'      => array(
224
+				'input'      => 'text',
225
+				'label'      => esc_html__('Send a test email to', 'event_espresso'),
226
+				'type'       => 'email',
227
+				'required'   => true,
228
+				'validation' => true,
229
+				'css_class'  => 'large-text',
230
+				'format'     => '%s',
231
+				'default'    => get_bloginfo('admin_email'),
232
+			),
233
+			'subject' => array(
234
+				'input'      => 'hidden',
235
+				'label'      => '',
236
+				'type'       => 'string',
237
+				'required'   => false,
238
+				'validation' => false,
239
+				'format'     => '%s',
240
+				'value'      => sprintf(__('Test email sent from %s', 'event_espresso'), get_bloginfo('name')),
241
+				'default'    => '',
242
+				'css_class'  => '',
243
+			),
244
+		);
245
+	}
246
+
247
+
248
+	/**
249
+	 * _set_template_fields
250
+	 * This sets up the fields that a messenger requires for the message to go out.
251
+	 *
252
+	 * @access  protected
253
+	 * @return void
254
+	 */
255
+	protected function _set_template_fields()
256
+	{
257
+		// any extra template fields that are NOT used by the messenger but will get used by a messenger field for
258
+		// shortcode replacement get added to the 'extra' key in an associated array indexed by the messenger field
259
+		// they relate to.  This is important for the Messages_admin to know what fields to display to the user.
260
+		//  Also, notice that the "values" are equal to the field type that messages admin will use to know what
261
+		// kind of field to display. The values ALSO have one index labeled "shortcode".  the values in that array
262
+		// indicate which ACTUAL SHORTCODE (i.e. [SHORTCODE]) is required in order for this extra field to be
263
+		// displayed.  If the required shortcode isn't part of the shortcodes array then the field is not needed and
264
+		// will not be displayed/parsed.
265
+		$this->_template_fields = array(
266
+			'to'      => array(
267
+				'input'      => 'text',
268
+				'label'      => esc_html_x(
269
+					'To',
270
+					'Label for the "To" field for email addresses',
271
+					'event_espresso'
272
+				),
273
+				'type'       => 'string',
274
+				'required'   => true,
275
+				'validation' => true,
276
+				'css_class'  => 'large-text',
277
+				'format'     => '%s',
278
+			),
279
+			'cc'      => array(
280
+				'input'      => 'text',
281
+				'label'      => esc_html_x(
282
+					'CC',
283
+					'Label for the "Carbon Copy" field used for additional email addresses',
284
+					'event_espresso'
285
+				),
286
+				'type'       => 'string',
287
+				'required'   => false,
288
+				'validation' => true,
289
+				'css_class'  => 'large-text',
290
+				'format'     => '%s',
291
+			),
292
+			'from'    => array(
293
+				'input'      => 'text',
294
+				'label'      => esc_html_x(
295
+					'From',
296
+					'Label for the "From" field for email addresses.',
297
+					'event_espresso'
298
+				),
299
+				'type'       => 'string',
300
+				'required'   => true,
301
+				'validation' => true,
302
+				'css_class'  => 'large-text',
303
+				'format'     => '%s',
304
+			),
305
+			'subject' => array(
306
+				'input'      => 'text',
307
+				'label'      => esc_html_x(
308
+					'Subject',
309
+					'Label for the "Subject" field (short description of contents) for emails.',
310
+					'event_espresso'
311
+				),
312
+				'type'       => 'string',
313
+				'required'   => true,
314
+				'validation' => true,
315
+				'css_class'  => 'large-text',
316
+				'format'     => '%s',
317
+			),
318
+			'content' => '',
319
+			// left empty b/c it is in the "extra array" but messenger still needs needs to know this is a field.
320
+			'extra'   => array(
321
+				'content' => array(
322
+					'main'          => array(
323
+						'input'      => 'wp_editor',
324
+						'label'      => esc_html__('Main Content', 'event_espresso'),
325
+						'type'       => 'string',
326
+						'required'   => true,
327
+						'validation' => true,
328
+						'format'     => '%s',
329
+						'rows'       => '15',
330
+					),
331
+					'event_list'    => array(
332
+						'input'               => 'wp_editor',
333
+						'label'               => '[EVENT_LIST]',
334
+						'type'                => 'string',
335
+						'required'            => true,
336
+						'validation'          => true,
337
+						'format'              => '%s',
338
+						'rows'                => '15',
339
+						'shortcodes_required' => array('[EVENT_LIST]'),
340
+					),
341
+					'attendee_list' => array(
342
+						'input'               => 'textarea',
343
+						'label'               => '[ATTENDEE_LIST]',
344
+						'type'                => 'string',
345
+						'required'            => true,
346
+						'validation'          => true,
347
+						'format'              => '%s',
348
+						'css_class'           => 'large-text',
349
+						'rows'                => '5',
350
+						'shortcodes_required' => array('[ATTENDEE_LIST]'),
351
+					),
352
+					'ticket_list'   => array(
353
+						'input'               => 'textarea',
354
+						'label'               => '[TICKET_LIST]',
355
+						'type'                => 'string',
356
+						'required'            => true,
357
+						'validation'          => true,
358
+						'format'              => '%s',
359
+						'css_class'           => 'large-text',
360
+						'rows'                => '10',
361
+						'shortcodes_required' => array('[TICKET_LIST]'),
362
+					),
363
+					'datetime_list' => array(
364
+						'input'               => 'textarea',
365
+						'label'               => '[DATETIME_LIST]',
366
+						'type'                => 'string',
367
+						'required'            => true,
368
+						'validation'          => true,
369
+						'format'              => '%s',
370
+						'css_class'           => 'large-text',
371
+						'rows'                => '10',
372
+						'shortcodes_required' => array('[DATETIME_LIST]'),
373
+					),
374
+				),
375
+			),
376
+		);
377
+	}
378
+
379
+
380
+	/**
381
+	 * See definition of this class in parent
382
+	 */
383
+	protected function _set_default_message_types()
384
+	{
385
+		$this->_default_message_types = array(
386
+			'payment',
387
+			'payment_refund',
388
+			'registration',
389
+			'not_approved_registration',
390
+			'pending_approval',
391
+		);
392
+	}
393
+
394
+
395
+	/**
396
+	 * @see   definition of this class in parent
397
+	 * @since 4.5.0
398
+	 */
399
+	protected function _set_valid_message_types()
400
+	{
401
+		$this->_valid_message_types = array(
402
+			'payment',
403
+			'registration',
404
+			'not_approved_registration',
405
+			'declined_registration',
406
+			'cancelled_registration',
407
+			'pending_approval',
408
+			'registration_summary',
409
+			'payment_reminder',
410
+			'payment_declined',
411
+			'payment_refund',
412
+		);
413
+	}
414
+
415
+
416
+	/**
417
+	 * setting up admin_settings_fields for messenger.
418
+	 */
419
+	protected function _set_admin_settings_fields()
420
+	{
421
+	}
422
+
423
+	/**
424
+	 * We just deliver the messages don't kill us!!
425
+	 *
426
+	 * @return bool|WP_Error true if message delivered, false if it didn't deliver OR bubble up any error object if
427
+	 *              present.
428
+	 * @throws EE_Error
429
+	 * @throws \TijsVerkoyen\CssToInlineStyles\Exception
430
+	 */
431
+	protected function _send_message()
432
+	{
433
+		$success = wp_mail(
434
+			$this->_to,
435
+			// some old values for subject may be expecting HTML entities to be decoded in the subject
436
+			// and subjects aren't interpreted as HTML, so there should be no HTML in them
437
+			wp_strip_all_tags(wp_specialchars_decode($this->_subject, ENT_QUOTES)),
438
+			$this->_body(),
439
+			$this->_headers()
440
+		);
441
+		if (! $success) {
442
+			EE_Error::add_error(
443
+				sprintf(
444
+					esc_html__(
445
+						'The email did not send successfully.%3$sThe WordPress wp_mail function is used for sending mails but does not give any useful information when an email fails to send.%3$sIt is possible the "to" address (%1$s) or "from" address (%2$s) is invalid.%3$s',
446
+						'event_espresso'
447
+					),
448
+					$this->_to,
449
+					$this->_from,
450
+					'<br />'
451
+				),
452
+				__FILE__,
453
+				__FUNCTION__,
454
+				__LINE__
455
+			);
456
+		}
457
+		return $success;
458
+	}
459
+
460
+
461
+	/**
462
+	 * see parent for definition
463
+	 *
464
+	 * @return string html body of the message content and the related css.
465
+	 * @throws EE_Error
466
+	 * @throws \TijsVerkoyen\CssToInlineStyles\Exception
467
+	 */
468
+	protected function _preview()
469
+	{
470
+		return $this->_body(true);
471
+	}
472
+
473
+
474
+	/**
475
+	 * Setup headers for email
476
+	 *
477
+	 * @access protected
478
+	 * @return string formatted header for email
479
+	 */
480
+	protected function _headers()
481
+	{
482
+		$this->_ensure_has_from_email_address();
483
+		$from    = $this->_from;
484
+		$headers = array(
485
+			'From:' . $from,
486
+			'Reply-To:' . $from,
487
+			'Content-Type:text/html; charset=utf-8',
488
+		);
489
+
490
+		/**
491
+		 * Second condition added as a result of https://events.codebasehq.com/projects/event-espresso/tickets/11416 to
492
+		 * cover back compat where there may be users who have saved cc values in their db for the newsletter message
493
+		 * type which they are no longer able to change.
494
+		 */
495
+		if (! empty($this->_cc) && ! $this->_incoming_message_type instanceof EE_Newsletter_message_type) {
496
+			$headers[] = 'cc: ' . $this->_cc;
497
+		}
498
+
499
+		// but wait!  Header's for the from is NOT reliable because some plugins don't respect From: as set in the
500
+		// header.
501
+		add_filter('wp_mail_from', array($this, 'set_from_address'), 100);
502
+		add_filter('wp_mail_from_name', array($this, 'set_from_name'), 100);
503
+		return apply_filters('FHEE__EE_Email_messenger___headers', $headers, $this->_incoming_message_type, $this);
504
+	}
505
+
506
+
507
+	/**
508
+	 * This simply ensures that the from address is not empty.  If it is, then we use whatever is set as the site email
509
+	 * address for the from address to avoid problems with sending emails.
510
+	 */
511
+	protected function _ensure_has_from_email_address()
512
+	{
513
+		if (empty($this->_from)) {
514
+			$this->_from = get_bloginfo('admin_email');
515
+		}
516
+	}
517
+
518
+
519
+	/**
520
+	 * This simply parses whatever is set as the $_from address and determines if it is in the format {name} <{email}>
521
+	 * or just {email} and returns an array with the "from_name" and "from_email" as the values. Note from_name *MAY*
522
+	 * be empty
523
+	 *
524
+	 * @since 4.3.1
525
+	 * @return array
526
+	 */
527
+	private function _parse_from()
528
+	{
529
+		if (strpos($this->_from, '<') !== false) {
530
+			$from_name = substr($this->_from, 0, strpos($this->_from, '<') - 1);
531
+			$from_name = str_replace('"', '', $from_name);
532
+			$from_name = trim($from_name);
533
+
534
+			$from_email = substr($this->_from, strpos($this->_from, '<') + 1);
535
+			$from_email = str_replace('>', '', $from_email);
536
+			$from_email = trim($from_email);
537
+		} elseif (trim($this->_from) !== '') {
538
+			$from_name  = '';
539
+			$from_email = trim($this->_from);
540
+		} else {
541
+			$from_name = $from_email = '';
542
+		}
543
+		return array($from_name, $from_email);
544
+	}
545
+
546
+
547
+	/**
548
+	 * Callback for the wp_mail_from filter.
549
+	 *
550
+	 * @since 4.3.1
551
+	 * @param string $from_email What the original from_email is.
552
+	 * @return string
553
+	 */
554
+	public function set_from_address($from_email)
555
+	{
556
+		$parsed_from = $this->_parse_from();
557
+		// includes fallback if the parsing failed.
558
+		$from_email = is_array($parsed_from) && ! empty($parsed_from[1])
559
+			? $parsed_from[1]
560
+			: get_bloginfo('admin_email');
561
+		return $from_email;
562
+	}
563
+
564
+
565
+	/**
566
+	 * Callback fro the wp_mail_from_name filter.
567
+	 *
568
+	 * @since 4.3.1
569
+	 * @param string $from_name The original from_name.
570
+	 * @return string
571
+	 */
572
+	public function set_from_name($from_name)
573
+	{
574
+		$parsed_from = $this->_parse_from();
575
+		if (is_array($parsed_from) && ! empty($parsed_from[0])) {
576
+			$from_name = $parsed_from[0];
577
+		}
578
+
579
+		// if from name is "WordPress" let's sub in the site name instead (more friendly!)
580
+		// but realize the default name is HTML entity-encoded
581
+		$from_name = $from_name == 'WordPress' ? wp_specialchars_decode(get_bloginfo(), ENT_QUOTES) : $from_name;
582
+
583
+		return $from_name;
584
+	}
585
+
586
+
587
+	/**
588
+	 * setup body for email
589
+	 *
590
+	 * @param bool $preview will determine whether this is preview template or not.
591
+	 * @return string formatted body for email.
592
+	 * @throws EE_Error
593
+	 * @throws \TijsVerkoyen\CssToInlineStyles\Exception
594
+	 */
595
+	protected function _body($preview = false)
596
+	{
597
+		// setup template args!
598
+		$this->_template_args = array(
599
+			'subject'   => $this->_subject,
600
+			'from'      => $this->_from,
601
+			'main_body' => wpautop($this->_content),
602
+		);
603
+		$body                 = $this->_get_main_template($preview);
604
+
605
+		/**
606
+		 * This filter allows one to bypass the CSSToInlineStyles tool and leave the body untouched.
607
+		 *
608
+		 * @type    bool $preview Indicates whether a preview is being generated or not.
609
+		 * @return  bool    true  indicates to use the inliner, false bypasses it.
610
+		 */
611
+		if (apply_filters('FHEE__EE_Email_messenger__apply_CSSInliner ', true, $preview)) {
612
+			// require CssToInlineStyles library and its dependencies via composer autoloader
613
+			require_once EE_THIRD_PARTY . 'cssinliner/vendor/autoload.php';
614
+
615
+			// now if this isn't a preview, let's setup the body so it has inline styles
616
+			if (! $preview || ($preview && defined('DOING_AJAX'))) {
617
+				$style = file_get_contents(
618
+					$this->get_variation(
619
+						$this->_tmp_pack,
620
+						$this->_incoming_message_type->name,
621
+						false,
622
+						'main',
623
+						$this->_variation
624
+					),
625
+					true
626
+				);
627
+				$CSS   = new TijsVerkoyen\CssToInlineStyles\CssToInlineStyles($body, $style);
628
+				// for some reason the library has a bracket and new line at the beginning.  This takes care of that.
629
+				$body  = ltrim($CSS->convert(true), ">\n");
630
+				// see https://events.codebasehq.com/projects/event-espresso/tickets/8609
631
+				$body  = ltrim($body, "<?");
632
+			}
633
+		}
634
+		return $body;
635
+	}
636
+
637
+
638
+	/**
639
+	 * This just returns any existing test settings that might be saved in the database
640
+	 *
641
+	 * @access public
642
+	 * @return array
643
+	 */
644
+	public function get_existing_test_settings()
645
+	{
646
+		$settings = parent::get_existing_test_settings();
647
+		// override subject if present because we always want it to be fresh.
648
+		if (is_array($settings) && ! empty($settings['subject'])) {
649
+			$settings['subject'] = sprintf(__('Test email sent from %s', 'event_espresso'), get_bloginfo('name'));
650
+		}
651
+		return $settings;
652
+	}
653 653
 }
Please login to merge, or discard this patch.
Spacing   +9 added lines, -9 removed lines patch added patch discarded remove patch
@@ -56,7 +56,7 @@  discard block
 block discarded – undo
56 56
             ),
57 57
             '<code>wp_mail</code>'
58 58
         );
59
-        $this->label               = array(
59
+        $this->label = array(
60 60
             'singular' => esc_html__('email', 'event_espresso'),
61 61
             'plural'   => esc_html__('emails', 'event_espresso'),
62 62
         );
@@ -438,7 +438,7 @@  discard block
 block discarded – undo
438 438
             $this->_body(),
439 439
             $this->_headers()
440 440
         );
441
-        if (! $success) {
441
+        if ( ! $success) {
442 442
             EE_Error::add_error(
443 443
                 sprintf(
444 444
                     esc_html__(
@@ -482,8 +482,8 @@  discard block
 block discarded – undo
482 482
         $this->_ensure_has_from_email_address();
483 483
         $from    = $this->_from;
484 484
         $headers = array(
485
-            'From:' . $from,
486
-            'Reply-To:' . $from,
485
+            'From:'.$from,
486
+            'Reply-To:'.$from,
487 487
             'Content-Type:text/html; charset=utf-8',
488 488
         );
489 489
 
@@ -492,8 +492,8 @@  discard block
 block discarded – undo
492 492
          * cover back compat where there may be users who have saved cc values in their db for the newsletter message
493 493
          * type which they are no longer able to change.
494 494
          */
495
-        if (! empty($this->_cc) && ! $this->_incoming_message_type instanceof EE_Newsletter_message_type) {
496
-            $headers[] = 'cc: ' . $this->_cc;
495
+        if ( ! empty($this->_cc) && ! $this->_incoming_message_type instanceof EE_Newsletter_message_type) {
496
+            $headers[] = 'cc: '.$this->_cc;
497 497
         }
498 498
 
499 499
         // but wait!  Header's for the from is NOT reliable because some plugins don't respect From: as set in the
@@ -600,7 +600,7 @@  discard block
 block discarded – undo
600 600
             'from'      => $this->_from,
601 601
             'main_body' => wpautop($this->_content),
602 602
         );
603
-        $body                 = $this->_get_main_template($preview);
603
+        $body = $this->_get_main_template($preview);
604 604
 
605 605
         /**
606 606
          * This filter allows one to bypass the CSSToInlineStyles tool and leave the body untouched.
@@ -610,10 +610,10 @@  discard block
 block discarded – undo
610 610
          */
611 611
         if (apply_filters('FHEE__EE_Email_messenger__apply_CSSInliner ', true, $preview)) {
612 612
             // require CssToInlineStyles library and its dependencies via composer autoloader
613
-            require_once EE_THIRD_PARTY . 'cssinliner/vendor/autoload.php';
613
+            require_once EE_THIRD_PARTY.'cssinliner/vendor/autoload.php';
614 614
 
615 615
             // now if this isn't a preview, let's setup the body so it has inline styles
616
-            if (! $preview || ($preview && defined('DOING_AJAX'))) {
616
+            if ( ! $preview || ($preview && defined('DOING_AJAX'))) {
617 617
                 $style = file_get_contents(
618 618
                     $this->get_variation(
619 619
                         $this->_tmp_pack,
Please login to merge, or discard this patch.
core/domain/services/event/EventSpacesCalculator.php 3 patches
Doc Comments   +1 added lines, -1 removed lines patch added patch discarded remove patch
@@ -164,7 +164,7 @@
 block discarded – undo
164 164
 
165 165
 
166 166
     /**
167
-     * @param $ticket
167
+     * @param \EE_Base_Class $ticket
168 168
      * @throws DomainException
169 169
      * @throws EE_Error
170 170
      * @throws UnexpectedEntityException
Please login to merge, or discard this patch.
Indentation   +698 added lines, -698 removed lines patch added patch discarded remove patch
@@ -26,702 +26,702 @@
 block discarded – undo
26 26
 class EventSpacesCalculator
27 27
 {
28 28
 
29
-    /**
30
-     * @var EE_Event $event
31
-     */
32
-    private $event;
33
-
34
-    /**
35
-     * @var array $datetime_query_params
36
-     */
37
-    private $datetime_query_params;
38
-
39
-    /**
40
-     * @var EE_Ticket[] $active_tickets
41
-     */
42
-    private $active_tickets = array();
43
-
44
-    /**
45
-     * @var EE_Datetime[] $datetimes
46
-     */
47
-    private $datetimes = array();
48
-
49
-    /**
50
-     * Array of Ticket IDs grouped by Datetime
51
-     *
52
-     * @var array $datetimes
53
-     */
54
-    private $datetime_tickets = array();
55
-
56
-    /**
57
-     * Max spaces for each Datetime (reg limit - previous sold)
58
-     *
59
-     * @var array $datetime_spaces
60
-     */
61
-    private $datetime_spaces = array();
62
-
63
-    /**
64
-     * Array of Datetime IDs grouped by Ticket
65
-     *
66
-     * @var array[] $ticket_datetimes
67
-     */
68
-    private $ticket_datetimes = array();
69
-
70
-    /**
71
-     * maximum ticket quantities for each ticket (adjusted for reg limit)
72
-     *
73
-     * @var array $ticket_quantities
74
-     */
75
-    private $ticket_quantities = array();
76
-
77
-    /**
78
-     * total quantity of sold and reserved for each ticket
79
-     *
80
-     * @var array $tickets_sold
81
-     */
82
-    private $tickets_sold = array();
83
-
84
-    /**
85
-     * total spaces available across all datetimes
86
-     *
87
-     * @var array $total_spaces
88
-     */
89
-    private $total_spaces = array();
90
-
91
-    /**
92
-     * @var boolean $debug
93
-     */
94
-    private $debug = false; // true false
95
-
96
-    /**
97
-     * @var null|int $spaces_remaining
98
-     */
99
-    private $spaces_remaining;
100
-
101
-    /**
102
-     * @var null|int $total_spaces_available
103
-     */
104
-    private $total_spaces_available;
105
-
106
-
107
-    /**
108
-     * EventSpacesCalculator constructor.
109
-     *
110
-     * @param EE_Event $event
111
-     * @param array    $datetime_query_params
112
-     * @throws EE_Error
113
-     */
114
-    public function __construct(EE_Event $event, array $datetime_query_params = array())
115
-    {
116
-        $this->event = $event;
117
-        $this->datetime_query_params = $datetime_query_params + array('order_by' => array('DTT_reg_limit' => 'ASC'));
118
-        $this->setHooks();
119
-    }
120
-
121
-
122
-    /**
123
-     * @return void
124
-     */
125
-    private function setHooks()
126
-    {
127
-        add_action('AHEE__EE_Ticket__increase_sold', array($this, 'clearResults'));
128
-        add_action('AHEE__EE_Ticket__decrease_sold', array($this, 'clearResults'));
129
-        add_action('AHEE__EE_Datetime__increase_sold', array($this, 'clearResults'));
130
-        add_action('AHEE__EE_Datetime__decrease_sold', array($this, 'clearResults'));
131
-        add_action('AHEE__EE_Ticket__increase_reserved', array($this, 'clearResults'));
132
-        add_action('AHEE__EE_Ticket__decrease_reserved', array($this, 'clearResults'));
133
-        add_action('AHEE__EE_Datetime__increase_reserved', array($this, 'clearResults'));
134
-        add_action('AHEE__EE_Datetime__decrease_reserved', array($this, 'clearResults'));
135
-    }
136
-
137
-
138
-    /**
139
-     * @return void
140
-     */
141
-    public function clearResults()
142
-    {
143
-        $this->spaces_remaining = null;
144
-        $this->total_spaces_available = null;
145
-    }
146
-
147
-
148
-    /**
149
-     * @return EE_Ticket[]
150
-     * @throws EE_Error
151
-     * @throws InvalidDataTypeException
152
-     * @throws InvalidInterfaceException
153
-     * @throws InvalidArgumentException
154
-     */
155
-    public function getActiveTickets()
156
-    {
157
-        if (empty($this->active_tickets)) {
158
-            $this->active_tickets = $this->event->tickets(
159
-                array(
160
-                    array('TKT_deleted' => false),
161
-                    'order_by' => array('TKT_qty' => 'ASC'),
162
-                )
163
-            );
164
-        }
165
-        return $this->active_tickets;
166
-    }
167
-
168
-
169
-    /**
170
-     * @param EE_Ticket[] $active_tickets
171
-     * @throws EE_Error
172
-     * @throws DomainException
173
-     * @throws UnexpectedEntityException
174
-     */
175
-    public function setActiveTickets(array $active_tickets = array())
176
-    {
177
-        if (! empty($active_tickets)) {
178
-            foreach ($active_tickets as $active_ticket) {
179
-                $this->validateTicket($active_ticket);
180
-            }
181
-            // sort incoming array by ticket quantity (asc)
182
-            usort(
183
-                $active_tickets,
184
-                function (EE_Ticket $a, EE_Ticket $b) {
185
-                    if ($a->qty() === $b->qty()) {
186
-                        return 0;
187
-                    }
188
-                    return ($a->qty() < $b->qty())
189
-                        ? -1
190
-                        : 1;
191
-                }
192
-            );
193
-        }
194
-        $this->active_tickets = $active_tickets;
195
-    }
196
-
197
-
198
-    /**
199
-     * @param $ticket
200
-     * @throws DomainException
201
-     * @throws EE_Error
202
-     * @throws UnexpectedEntityException
203
-     */
204
-    private function validateTicket($ticket)
205
-    {
206
-        if (! $ticket instanceof EE_Ticket) {
207
-            throw new DomainException(
208
-                esc_html__(
209
-                    'Invalid Ticket. Only EE_Ticket objects can be used to calculate event space availability.',
210
-                    'event_espresso'
211
-                )
212
-            );
213
-        }
214
-        if ($ticket->get_event_ID() !== $this->event->ID()) {
215
-            throw new DomainException(
216
-                sprintf(
217
-                    esc_html__(
218
-                        'An EE_Ticket for Event %1$d was supplied while calculating event space availability for Event %2$d.',
219
-                        'event_espresso'
220
-                    ),
221
-                    $ticket->get_event_ID(),
222
-                    $this->event->ID()
223
-                )
224
-            );
225
-        }
226
-    }
227
-
228
-
229
-    /**
230
-     * @return EE_Datetime[]
231
-     */
232
-    public function getDatetimes()
233
-    {
234
-        return $this->datetimes;
235
-    }
236
-
237
-
238
-    /**
239
-     * @param EE_Datetime $datetime
240
-     * @throws EE_Error
241
-     * @throws DomainException
242
-     */
243
-    public function setDatetime(EE_Datetime $datetime)
244
-    {
245
-        if ($datetime->event()->ID() !== $this->event->ID()) {
246
-            throw new DomainException(
247
-                sprintf(
248
-                    esc_html__(
249
-                        'An EE_Datetime for Event %1$d was supplied while calculating event space availability for Event %2$d.',
250
-                        'event_espresso'
251
-                    ),
252
-                    $datetime->event()->ID(),
253
-                    $this->event->ID()
254
-                )
255
-            );
256
-        }
257
-        $this->datetimes[ $datetime->ID() ] = $datetime;
258
-    }
259
-
260
-
261
-    /**
262
-     * calculate spaces remaining based on "saleable" tickets
263
-     *
264
-     * @return float|int
265
-     * @throws EE_Error
266
-     * @throws DomainException
267
-     * @throws UnexpectedEntityException
268
-     * @throws InvalidDataTypeException
269
-     * @throws InvalidInterfaceException
270
-     * @throws InvalidArgumentException
271
-     */
272
-    public function spacesRemaining()
273
-    {
274
-        if ($this->spaces_remaining === null) {
275
-            $this->initialize();
276
-            $this->spaces_remaining = $this->calculate();
277
-        }
278
-        return $this->spaces_remaining;
279
-    }
280
-
281
-
282
-    /**
283
-     * calculates total available spaces for an event with no regard for sold tickets
284
-     *
285
-     * @return int|float
286
-     * @throws EE_Error
287
-     * @throws DomainException
288
-     * @throws UnexpectedEntityException
289
-     * @throws InvalidDataTypeException
290
-     * @throws InvalidInterfaceException
291
-     * @throws InvalidArgumentException
292
-     */
293
-    public function totalSpacesAvailable()
294
-    {
295
-        if ($this->total_spaces_available === null) {
296
-            $this->initialize();
297
-            $this->total_spaces_available = $this->calculate(false);
298
-        }
299
-        return $this->total_spaces_available;
300
-    }
301
-
302
-
303
-    /**
304
-     * Loops through the active tickets for the event
305
-     * and builds a series of data arrays that will be used for calculating
306
-     * the total maximum available spaces, as well as the spaces remaining.
307
-     * Because ticket quantities affect datetime spaces and vice versa,
308
-     * we need to be constantly updating these data arrays as things change,
309
-     * which is the entire reason for their existence.
310
-     *
311
-     * @throws EE_Error
312
-     * @throws DomainException
313
-     * @throws UnexpectedEntityException
314
-     * @throws InvalidDataTypeException
315
-     * @throws InvalidInterfaceException
316
-     * @throws InvalidArgumentException
317
-     */
318
-    private function initialize()
319
-    {
320
-        if ($this->debug) {
321
-            \EEH_Debug_Tools::printr(__FUNCTION__, __CLASS__, __FILE__, __LINE__, 2);
322
-        }
323
-        $this->datetime_tickets = array();
324
-        $this->datetime_spaces = array();
325
-        $this->ticket_datetimes = array();
326
-        $this->ticket_quantities = array();
327
-        $this->tickets_sold = array();
328
-        $this->total_spaces = array();
329
-        $active_tickets = $this->getActiveTickets();
330
-        if (! empty($active_tickets)) {
331
-            foreach ($active_tickets as $ticket) {
332
-                $this->validateTicket($ticket);
333
-                // we need to index our data arrays using strings for the purpose of sorting,
334
-                // but we also need them to be unique, so  we'll just prepend a letter T to the ID
335
-                $ticket_identifier = "T{$ticket->ID()}";
336
-                // to start, we'll just consider the raw qty to be the maximum availability for this ticket,
337
-                // unless the ticket is past its "sell until" date, in which case the qty will be 0
338
-                $max_tickets = $ticket->is_expired() ? 0 : $ticket->qty();
339
-                // but we'll adjust that after looping over each datetime for the ticket and checking reg limits
340
-                $ticket_datetimes = $ticket->datetimes($this->datetime_query_params);
341
-                foreach ($ticket_datetimes as $datetime) {
342
-                    // save all datetimes
343
-                    $this->setDatetime($datetime);
344
-                    $datetime_identifier = "D{$datetime->ID()}";
345
-                    $reg_limit = $datetime->reg_limit();
346
-                    // ticket quantity can not exceed datetime reg limit
347
-                    $max_tickets = min($max_tickets, $reg_limit);
348
-                    // as described earlier, because we need to be able to constantly adjust numbers for things,
349
-                    // we are going to move all of our data into the following arrays:
350
-                    // datetime spaces initially represents the reg limit for each datetime,
351
-                    // but this will get adjusted as tickets are accounted for
352
-                    $this->datetime_spaces[ $datetime_identifier ] = $reg_limit;
353
-                    // just an array of ticket IDs grouped by datetime
354
-                    $this->datetime_tickets[ $datetime_identifier ][] = $ticket_identifier;
355
-                    // and an array of datetime IDs grouped by ticket
356
-                    $this->ticket_datetimes[ $ticket_identifier ][] = $datetime_identifier;
357
-                }
358
-                // total quantity of sold and reserved for each ticket
359
-                $this->tickets_sold[ $ticket_identifier ] = $ticket->sold() + $ticket->reserved();
360
-                // and the maximum ticket quantities for each ticket (adjusted for reg limit)
361
-                $this->ticket_quantities[ $ticket_identifier ] = $max_tickets;
362
-            }
363
-        }
364
-        // sort datetime spaces by reg limit, but maintain our string indexes
365
-        asort($this->datetime_spaces, SORT_NUMERIC);
366
-        // datetime tickets need to be sorted in the SAME order as the above array...
367
-        // so we'll just use array_merge() to take the structure of datetime_spaces
368
-        // but overwrite all of the data with that from datetime_tickets
369
-        $this->datetime_tickets = array_merge(
370
-            $this->datetime_spaces,
371
-            $this->datetime_tickets
372
-        );
373
-        if ($this->debug) {
374
-            \EEH_Debug_Tools::printr($this->datetime_spaces, 'datetime_spaces', __FILE__, __LINE__);
375
-            \EEH_Debug_Tools::printr($this->datetime_tickets, 'datetime_tickets', __FILE__, __LINE__);
376
-            \EEH_Debug_Tools::printr($this->ticket_quantities, 'ticket_quantities', __FILE__, __LINE__);
377
-        }
378
-    }
379
-
380
-
381
-    /**
382
-     * performs calculations on initialized data
383
-     *
384
-     * @param bool $consider_sold
385
-     * @return int|float
386
-     */
387
-    private function calculate($consider_sold = true)
388
-    {
389
-        if ($this->debug) {
390
-            \EEH_Debug_Tools::printr(__FUNCTION__, __CLASS__, __FILE__, __LINE__, 2);
391
-            \EEH_Debug_Tools::printr($consider_sold, '$consider_sold', __FILE__, __LINE__);
392
-        }
393
-        if ($consider_sold) {
394
-            // subtract amounts sold from all ticket quantities and datetime spaces
395
-            $this->adjustTicketQuantitiesDueToSales();
396
-        }
397
-        foreach ($this->datetime_tickets as $datetime_identifier => $tickets) {
398
-            $this->trackAvailableSpacesForDatetimes($datetime_identifier, $tickets);
399
-        }
400
-        // total spaces available is just the sum of the spaces available for each datetime
401
-        $spaces_remaining = array_sum($this->total_spaces);
402
-        if ($this->debug) {
403
-            \EEH_Debug_Tools::printr($this->total_spaces, '$this->total_spaces', __FILE__, __LINE__);
404
-            \EEH_Debug_Tools::printr($this->tickets_sold, '$this->tickets_sold', __FILE__, __LINE__);
405
-            \EEH_Debug_Tools::printr($spaces_remaining, '$spaces_remaining', __FILE__, __LINE__);
406
-        }
407
-        return $spaces_remaining;
408
-    }
409
-
410
-
411
-    /**
412
-     * subtracts amount of  tickets sold from ticket quantities and datetime spaces
413
-     */
414
-    private function adjustTicketQuantitiesDueToSales()
415
-    {
416
-        if ($this->debug) {
417
-            \EEH_Debug_Tools::printr(__FUNCTION__, __CLASS__, __FILE__, __LINE__, 2);
418
-        }
419
-        foreach ($this->tickets_sold as $ticket_identifier => $tickets_sold) {
420
-            if (isset($this->ticket_quantities[ $ticket_identifier ])) {
421
-                $this->ticket_quantities[ $ticket_identifier ] -= $tickets_sold;
422
-                // don't let values go below zero
423
-                $this->ticket_quantities[ $ticket_identifier ] = max(
424
-                    $this->ticket_quantities[ $ticket_identifier ],
425
-                    0
426
-                );
427
-                if ($this->debug) {
428
-                    \EEH_Debug_Tools::printr(
429
-                        "{$tickets_sold} sales for ticket {$ticket_identifier} ",
430
-                        'subtracting',
431
-                        __FILE__,
432
-                        __LINE__
433
-                    );
434
-                }
435
-            }
436
-            if (isset($this->ticket_datetimes[ $ticket_identifier ])
437
-                && is_array($this->ticket_datetimes[ $ticket_identifier ])
438
-            ) {
439
-                foreach ($this->ticket_datetimes[ $ticket_identifier ] as $ticket_datetime) {
440
-                    if (isset($this->ticket_quantities[ $ticket_identifier ])) {
441
-                        $this->datetime_spaces[ $ticket_datetime ] -= $tickets_sold;
442
-                        // don't let values go below zero
443
-                        $this->datetime_spaces[ $ticket_datetime ] = max(
444
-                            $this->datetime_spaces[ $ticket_datetime ],
445
-                            0
446
-                        );
447
-                        if ($this->debug) {
448
-                            \EEH_Debug_Tools::printr(
449
-                                "{$tickets_sold} sales for datetime {$ticket_datetime} ",
450
-                                'subtracting',
451
-                                __FILE__,
452
-                                __LINE__
453
-                            );
454
-                        }
455
-                    }
456
-                }
457
-            }
458
-        }
459
-    }
460
-
461
-
462
-    /**
463
-     * @param string $datetime_identifier
464
-     * @param array  $tickets
465
-     */
466
-    private function trackAvailableSpacesForDatetimes($datetime_identifier, array $tickets)
467
-    {
468
-        // make sure a reg limit is set for the datetime
469
-        $reg_limit = isset($this->datetime_spaces[ $datetime_identifier ])
470
-            ? $this->datetime_spaces[ $datetime_identifier ]
471
-            : 0;
472
-        // and bail if it is not
473
-        if (! $reg_limit) {
474
-            if ($this->debug) {
475
-                \EEH_Debug_Tools::printr('AT CAPACITY', " . {$datetime_identifier}", __FILE__, __LINE__);
476
-            }
477
-            return;
478
-        }
479
-        if ($this->debug) {
480
-            \EEH_Debug_Tools::printr($datetime_identifier, '* $datetime_identifier', __FILE__, __LINE__, 1);
481
-            \EEH_Debug_Tools::printr(
482
-                "{$reg_limit}",
483
-                'REG LIMIT',
484
-                __FILE__,
485
-                __LINE__
486
-            );
487
-        }
488
-        // number of allocated spaces always starts at zero
489
-        $spaces_allocated = 0;
490
-        $this->total_spaces[ $datetime_identifier ] = 0;
491
-        foreach ($tickets as $ticket_identifier) {
492
-            $spaces_allocated = $this->calculateAvailableSpacesForTicket(
493
-                $datetime_identifier,
494
-                $reg_limit,
495
-                $ticket_identifier,
496
-                $spaces_allocated
497
-            );
498
-        }
499
-        // spaces can't be negative
500
-        $spaces_allocated = max($spaces_allocated, 0);
501
-        if ($spaces_allocated) {
502
-            // track any non-zero values
503
-            $this->total_spaces[ $datetime_identifier ] += $spaces_allocated;
504
-            if ($this->debug) {
505
-                \EEH_Debug_Tools::printr((string) $spaces_allocated, ' . $spaces_allocated: ', __FILE__, __LINE__);
506
-            }
507
-        } else {
508
-            if ($this->debug) {
509
-                \EEH_Debug_Tools::printr(' ', ' . NO TICKETS AVAILABLE FOR DATETIME', __FILE__, __LINE__);
510
-            }
511
-        }
512
-        if ($this->debug) {
513
-            \EEH_Debug_Tools::printr(
514
-                $this->total_spaces[ $datetime_identifier ],
515
-                '$total_spaces',
516
-                __FILE__,
517
-                __LINE__
518
-            );
519
-            \EEH_Debug_Tools::printr($this->ticket_quantities, '$ticket_quantities', __FILE__, __LINE__);
520
-            \EEH_Debug_Tools::printr($this->datetime_spaces, 'datetime_spaces', __FILE__, __LINE__);
521
-        }
522
-    }
523
-
524
-
525
-    /**
526
-     * @param string $datetime_identifier
527
-     * @param int    $reg_limit
528
-     * @param string $ticket_identifier
529
-     * @param int    $spaces_allocated
530
-     * @return int
531
-     */
532
-    private function calculateAvailableSpacesForTicket(
533
-        $datetime_identifier,
534
-        $reg_limit,
535
-        $ticket_identifier,
536
-        $spaces_allocated
537
-    ) {
538
-        // make sure ticket quantity is set
539
-        $ticket_quantity = isset($this->ticket_quantities[ $ticket_identifier ])
540
-            ? $this->ticket_quantities[ $ticket_identifier ]
541
-            : 0;
542
-        if ($this->debug) {
543
-            \EEH_Debug_Tools::printr("{$spaces_allocated}", '$spaces_allocated', __FILE__, __LINE__);
544
-            \EEH_Debug_Tools::printr(
545
-                "{$ticket_quantity}",
546
-                "ticket $ticket_identifier quantity: ",
547
-                __FILE__,
548
-                __LINE__,
549
-                2
550
-            );
551
-        }
552
-        if ($ticket_quantity) {
553
-            if ($this->debug) {
554
-                \EEH_Debug_Tools::printr(
555
-                    ($spaces_allocated <= $reg_limit)
556
-                        ? 'true'
557
-                        : 'false',
558
-                    ' . spaces_allocated <= reg_limit = ',
559
-                    __FILE__,
560
-                    __LINE__
561
-                );
562
-            }
563
-            // if the datetime is NOT at full capacity yet
564
-            if ($spaces_allocated <= $reg_limit) {
565
-                // then the maximum ticket quantity we can allocate is the lowest value of either:
566
-                //  the number of remaining spaces for the datetime, which is the limit - spaces already taken
567
-                //  or the maximum ticket quantity
568
-                $ticket_quantity = min($reg_limit - $spaces_allocated, $ticket_quantity);
569
-                // adjust the available quantity in our tracking array
570
-                $this->ticket_quantities[ $ticket_identifier ] -= $ticket_quantity;
571
-                // and increment spaces allocated for this datetime
572
-                $spaces_allocated += $ticket_quantity;
573
-                $at_capacity = $spaces_allocated >= $reg_limit;
574
-                if ($this->debug) {
575
-                    \EEH_Debug_Tools::printr(
576
-                        "{$ticket_quantity} {$ticket_identifier} tickets",
577
-                        ' > > allocate ',
578
-                        __FILE__,
579
-                        __LINE__,
580
-                        3
581
-                    );
582
-                    if ($at_capacity) {
583
-                        \EEH_Debug_Tools::printr('AT CAPACITY', " . {$datetime_identifier}", __FILE__, __LINE__, 3);
584
-                    }
585
-                }
586
-                // now adjust all other datetimes that allow access to this ticket
587
-                $this->adjustDatetimes(
588
-                    $datetime_identifier,
589
-                    $ticket_identifier,
590
-                    $ticket_quantity,
591
-                    $at_capacity
592
-                );
593
-            }
594
-        }
595
-        return $spaces_allocated;
596
-    }
597
-
598
-
599
-    /**
600
-     * subtracts ticket amounts from all datetime reg limits
601
-     * that allow access to the ticket specified,
602
-     * because that ticket could be used
603
-     * to attend any of the datetimes it has access to
604
-     *
605
-     * @param string $datetime_identifier
606
-     * @param string $ticket_identifier
607
-     * @param bool   $at_capacity
608
-     * @param int    $ticket_quantity
609
-     */
610
-    private function adjustDatetimes(
611
-        $datetime_identifier,
612
-        $ticket_identifier,
613
-        $ticket_quantity,
614
-        $at_capacity
615
-    ) {
616
-        /** @var array $datetime_tickets */
617
-        foreach ($this->datetime_tickets as $datetime_ID => $datetime_tickets) {
618
-            if ($datetime_ID !== $datetime_identifier || ! is_array($datetime_tickets)) {
619
-                continue;
620
-            }
621
-            $adjusted = $this->adjustDatetimeSpaces(
622
-                $datetime_ID,
623
-                $ticket_identifier,
624
-                $ticket_quantity
625
-            );
626
-            // skip to next ticket if nothing changed
627
-            if (! ($adjusted || $at_capacity)) {
628
-                continue;
629
-            }
630
-            // then all of it's tickets are now unavailable
631
-            foreach ($datetime_tickets as $datetime_ticket) {
632
-                if (($ticket_identifier === $datetime_ticket || $at_capacity)
633
-                    && isset($this->ticket_quantities[ $datetime_ticket ])
634
-                    && $this->ticket_quantities[ $datetime_ticket ] > 0
635
-                ) {
636
-                    if ($this->debug) {
637
-                        \EEH_Debug_Tools::printr(
638
-                            $datetime_ticket,
639
-                            ' . . . adjust ticket quantities for',
640
-                            __FILE__,
641
-                            __LINE__
642
-                        );
643
-                    }
644
-                    // if this datetime is at full capacity, set any tracked available quantities to zero
645
-                    // otherwise just subtract the ticket quantity
646
-                    $new_quantity = $at_capacity
647
-                        ? 0
648
-                        : $this->ticket_quantities[ $datetime_ticket ] - $ticket_quantity;
649
-                    // don't let ticket quantity go below zero
650
-                    $this->ticket_quantities[ $datetime_ticket ] = max($new_quantity, 0);
651
-                    if ($this->debug) {
652
-                        \EEH_Debug_Tools::printr(
653
-                            $at_capacity
654
-                                ? "0 because Datetime {$datetime_identifier} is at capacity"
655
-                                : "{$this->ticket_quantities[ $datetime_ticket ]}",
656
-                            " . . . . {$datetime_ticket} quantity set to ",
657
-                            __FILE__,
658
-                            __LINE__
659
-                        );
660
-                    }
661
-                }
662
-                // but we also need to adjust spaces for any other datetimes this ticket has access to
663
-                if ($datetime_ticket === $ticket_identifier) {
664
-                    if (isset($this->ticket_datetimes[ $datetime_ticket ])
665
-                        && is_array($this->ticket_datetimes[ $datetime_ticket ])
666
-                    ) {
667
-                        if ($this->debug) {
668
-                            \EEH_Debug_Tools::printr(
669
-                                $datetime_ticket,
670
-                                ' . . adjust other Datetimes for',
671
-                                __FILE__,
672
-                                __LINE__
673
-                            );
674
-                        }
675
-                        foreach ($this->ticket_datetimes[ $datetime_ticket ] as $datetime) {
676
-                            // don't adjust the current datetime twice
677
-                            if ($datetime !== $datetime_identifier) {
678
-                                $this->adjustDatetimeSpaces(
679
-                                    $datetime,
680
-                                    $datetime_ticket,
681
-                                    $ticket_quantity
682
-                                );
683
-                            }
684
-                        }
685
-                    }
686
-                }
687
-            }
688
-        }
689
-    }
690
-
691
-    private function adjustDatetimeSpaces($datetime_identifier, $ticket_identifier, $ticket_quantity = 0)
692
-    {
693
-        // does datetime have spaces available?
694
-        // and does the supplied ticket have access to this datetime ?
695
-        if ($this->datetime_spaces[ $datetime_identifier ] > 0
696
-            && isset($this->datetime_spaces[ $datetime_identifier ], $this->datetime_tickets[ $datetime_identifier ])
697
-            && in_array($ticket_identifier, $this->datetime_tickets[ $datetime_identifier ], true)
698
-        ) {
699
-            if ($this->debug) {
700
-                \EEH_Debug_Tools::printr($datetime_identifier, ' . . adjust Datetime Spaces for', __FILE__, __LINE__);
701
-                \EEH_Debug_Tools::printr(
702
-                    "{$this->datetime_spaces[ $datetime_identifier ]}",
703
-                    " . . current  {$datetime_identifier} spaces available",
704
-                    __FILE__,
705
-                    __LINE__
706
-                );
707
-            }
708
-            // then decrement the available spaces for the datetime
709
-            $this->datetime_spaces[ $datetime_identifier ] -= $ticket_quantity;
710
-            // but don't let quantities go below zero
711
-            $this->datetime_spaces[ $datetime_identifier ] = max(
712
-                $this->datetime_spaces[ $datetime_identifier ],
713
-                0
714
-            );
715
-            if ($this->debug) {
716
-                \EEH_Debug_Tools::printr(
717
-                    "{$ticket_quantity}",
718
-                    " . . . {$datetime_identifier} capacity reduced by",
719
-                    __FILE__,
720
-                    __LINE__
721
-                );
722
-            }
723
-            return true;
724
-        }
725
-        return false;
726
-    }
29
+	/**
30
+	 * @var EE_Event $event
31
+	 */
32
+	private $event;
33
+
34
+	/**
35
+	 * @var array $datetime_query_params
36
+	 */
37
+	private $datetime_query_params;
38
+
39
+	/**
40
+	 * @var EE_Ticket[] $active_tickets
41
+	 */
42
+	private $active_tickets = array();
43
+
44
+	/**
45
+	 * @var EE_Datetime[] $datetimes
46
+	 */
47
+	private $datetimes = array();
48
+
49
+	/**
50
+	 * Array of Ticket IDs grouped by Datetime
51
+	 *
52
+	 * @var array $datetimes
53
+	 */
54
+	private $datetime_tickets = array();
55
+
56
+	/**
57
+	 * Max spaces for each Datetime (reg limit - previous sold)
58
+	 *
59
+	 * @var array $datetime_spaces
60
+	 */
61
+	private $datetime_spaces = array();
62
+
63
+	/**
64
+	 * Array of Datetime IDs grouped by Ticket
65
+	 *
66
+	 * @var array[] $ticket_datetimes
67
+	 */
68
+	private $ticket_datetimes = array();
69
+
70
+	/**
71
+	 * maximum ticket quantities for each ticket (adjusted for reg limit)
72
+	 *
73
+	 * @var array $ticket_quantities
74
+	 */
75
+	private $ticket_quantities = array();
76
+
77
+	/**
78
+	 * total quantity of sold and reserved for each ticket
79
+	 *
80
+	 * @var array $tickets_sold
81
+	 */
82
+	private $tickets_sold = array();
83
+
84
+	/**
85
+	 * total spaces available across all datetimes
86
+	 *
87
+	 * @var array $total_spaces
88
+	 */
89
+	private $total_spaces = array();
90
+
91
+	/**
92
+	 * @var boolean $debug
93
+	 */
94
+	private $debug = false; // true false
95
+
96
+	/**
97
+	 * @var null|int $spaces_remaining
98
+	 */
99
+	private $spaces_remaining;
100
+
101
+	/**
102
+	 * @var null|int $total_spaces_available
103
+	 */
104
+	private $total_spaces_available;
105
+
106
+
107
+	/**
108
+	 * EventSpacesCalculator constructor.
109
+	 *
110
+	 * @param EE_Event $event
111
+	 * @param array    $datetime_query_params
112
+	 * @throws EE_Error
113
+	 */
114
+	public function __construct(EE_Event $event, array $datetime_query_params = array())
115
+	{
116
+		$this->event = $event;
117
+		$this->datetime_query_params = $datetime_query_params + array('order_by' => array('DTT_reg_limit' => 'ASC'));
118
+		$this->setHooks();
119
+	}
120
+
121
+
122
+	/**
123
+	 * @return void
124
+	 */
125
+	private function setHooks()
126
+	{
127
+		add_action('AHEE__EE_Ticket__increase_sold', array($this, 'clearResults'));
128
+		add_action('AHEE__EE_Ticket__decrease_sold', array($this, 'clearResults'));
129
+		add_action('AHEE__EE_Datetime__increase_sold', array($this, 'clearResults'));
130
+		add_action('AHEE__EE_Datetime__decrease_sold', array($this, 'clearResults'));
131
+		add_action('AHEE__EE_Ticket__increase_reserved', array($this, 'clearResults'));
132
+		add_action('AHEE__EE_Ticket__decrease_reserved', array($this, 'clearResults'));
133
+		add_action('AHEE__EE_Datetime__increase_reserved', array($this, 'clearResults'));
134
+		add_action('AHEE__EE_Datetime__decrease_reserved', array($this, 'clearResults'));
135
+	}
136
+
137
+
138
+	/**
139
+	 * @return void
140
+	 */
141
+	public function clearResults()
142
+	{
143
+		$this->spaces_remaining = null;
144
+		$this->total_spaces_available = null;
145
+	}
146
+
147
+
148
+	/**
149
+	 * @return EE_Ticket[]
150
+	 * @throws EE_Error
151
+	 * @throws InvalidDataTypeException
152
+	 * @throws InvalidInterfaceException
153
+	 * @throws InvalidArgumentException
154
+	 */
155
+	public function getActiveTickets()
156
+	{
157
+		if (empty($this->active_tickets)) {
158
+			$this->active_tickets = $this->event->tickets(
159
+				array(
160
+					array('TKT_deleted' => false),
161
+					'order_by' => array('TKT_qty' => 'ASC'),
162
+				)
163
+			);
164
+		}
165
+		return $this->active_tickets;
166
+	}
167
+
168
+
169
+	/**
170
+	 * @param EE_Ticket[] $active_tickets
171
+	 * @throws EE_Error
172
+	 * @throws DomainException
173
+	 * @throws UnexpectedEntityException
174
+	 */
175
+	public function setActiveTickets(array $active_tickets = array())
176
+	{
177
+		if (! empty($active_tickets)) {
178
+			foreach ($active_tickets as $active_ticket) {
179
+				$this->validateTicket($active_ticket);
180
+			}
181
+			// sort incoming array by ticket quantity (asc)
182
+			usort(
183
+				$active_tickets,
184
+				function (EE_Ticket $a, EE_Ticket $b) {
185
+					if ($a->qty() === $b->qty()) {
186
+						return 0;
187
+					}
188
+					return ($a->qty() < $b->qty())
189
+						? -1
190
+						: 1;
191
+				}
192
+			);
193
+		}
194
+		$this->active_tickets = $active_tickets;
195
+	}
196
+
197
+
198
+	/**
199
+	 * @param $ticket
200
+	 * @throws DomainException
201
+	 * @throws EE_Error
202
+	 * @throws UnexpectedEntityException
203
+	 */
204
+	private function validateTicket($ticket)
205
+	{
206
+		if (! $ticket instanceof EE_Ticket) {
207
+			throw new DomainException(
208
+				esc_html__(
209
+					'Invalid Ticket. Only EE_Ticket objects can be used to calculate event space availability.',
210
+					'event_espresso'
211
+				)
212
+			);
213
+		}
214
+		if ($ticket->get_event_ID() !== $this->event->ID()) {
215
+			throw new DomainException(
216
+				sprintf(
217
+					esc_html__(
218
+						'An EE_Ticket for Event %1$d was supplied while calculating event space availability for Event %2$d.',
219
+						'event_espresso'
220
+					),
221
+					$ticket->get_event_ID(),
222
+					$this->event->ID()
223
+				)
224
+			);
225
+		}
226
+	}
227
+
228
+
229
+	/**
230
+	 * @return EE_Datetime[]
231
+	 */
232
+	public function getDatetimes()
233
+	{
234
+		return $this->datetimes;
235
+	}
236
+
237
+
238
+	/**
239
+	 * @param EE_Datetime $datetime
240
+	 * @throws EE_Error
241
+	 * @throws DomainException
242
+	 */
243
+	public function setDatetime(EE_Datetime $datetime)
244
+	{
245
+		if ($datetime->event()->ID() !== $this->event->ID()) {
246
+			throw new DomainException(
247
+				sprintf(
248
+					esc_html__(
249
+						'An EE_Datetime for Event %1$d was supplied while calculating event space availability for Event %2$d.',
250
+						'event_espresso'
251
+					),
252
+					$datetime->event()->ID(),
253
+					$this->event->ID()
254
+				)
255
+			);
256
+		}
257
+		$this->datetimes[ $datetime->ID() ] = $datetime;
258
+	}
259
+
260
+
261
+	/**
262
+	 * calculate spaces remaining based on "saleable" tickets
263
+	 *
264
+	 * @return float|int
265
+	 * @throws EE_Error
266
+	 * @throws DomainException
267
+	 * @throws UnexpectedEntityException
268
+	 * @throws InvalidDataTypeException
269
+	 * @throws InvalidInterfaceException
270
+	 * @throws InvalidArgumentException
271
+	 */
272
+	public function spacesRemaining()
273
+	{
274
+		if ($this->spaces_remaining === null) {
275
+			$this->initialize();
276
+			$this->spaces_remaining = $this->calculate();
277
+		}
278
+		return $this->spaces_remaining;
279
+	}
280
+
281
+
282
+	/**
283
+	 * calculates total available spaces for an event with no regard for sold tickets
284
+	 *
285
+	 * @return int|float
286
+	 * @throws EE_Error
287
+	 * @throws DomainException
288
+	 * @throws UnexpectedEntityException
289
+	 * @throws InvalidDataTypeException
290
+	 * @throws InvalidInterfaceException
291
+	 * @throws InvalidArgumentException
292
+	 */
293
+	public function totalSpacesAvailable()
294
+	{
295
+		if ($this->total_spaces_available === null) {
296
+			$this->initialize();
297
+			$this->total_spaces_available = $this->calculate(false);
298
+		}
299
+		return $this->total_spaces_available;
300
+	}
301
+
302
+
303
+	/**
304
+	 * Loops through the active tickets for the event
305
+	 * and builds a series of data arrays that will be used for calculating
306
+	 * the total maximum available spaces, as well as the spaces remaining.
307
+	 * Because ticket quantities affect datetime spaces and vice versa,
308
+	 * we need to be constantly updating these data arrays as things change,
309
+	 * which is the entire reason for their existence.
310
+	 *
311
+	 * @throws EE_Error
312
+	 * @throws DomainException
313
+	 * @throws UnexpectedEntityException
314
+	 * @throws InvalidDataTypeException
315
+	 * @throws InvalidInterfaceException
316
+	 * @throws InvalidArgumentException
317
+	 */
318
+	private function initialize()
319
+	{
320
+		if ($this->debug) {
321
+			\EEH_Debug_Tools::printr(__FUNCTION__, __CLASS__, __FILE__, __LINE__, 2);
322
+		}
323
+		$this->datetime_tickets = array();
324
+		$this->datetime_spaces = array();
325
+		$this->ticket_datetimes = array();
326
+		$this->ticket_quantities = array();
327
+		$this->tickets_sold = array();
328
+		$this->total_spaces = array();
329
+		$active_tickets = $this->getActiveTickets();
330
+		if (! empty($active_tickets)) {
331
+			foreach ($active_tickets as $ticket) {
332
+				$this->validateTicket($ticket);
333
+				// we need to index our data arrays using strings for the purpose of sorting,
334
+				// but we also need them to be unique, so  we'll just prepend a letter T to the ID
335
+				$ticket_identifier = "T{$ticket->ID()}";
336
+				// to start, we'll just consider the raw qty to be the maximum availability for this ticket,
337
+				// unless the ticket is past its "sell until" date, in which case the qty will be 0
338
+				$max_tickets = $ticket->is_expired() ? 0 : $ticket->qty();
339
+				// but we'll adjust that after looping over each datetime for the ticket and checking reg limits
340
+				$ticket_datetimes = $ticket->datetimes($this->datetime_query_params);
341
+				foreach ($ticket_datetimes as $datetime) {
342
+					// save all datetimes
343
+					$this->setDatetime($datetime);
344
+					$datetime_identifier = "D{$datetime->ID()}";
345
+					$reg_limit = $datetime->reg_limit();
346
+					// ticket quantity can not exceed datetime reg limit
347
+					$max_tickets = min($max_tickets, $reg_limit);
348
+					// as described earlier, because we need to be able to constantly adjust numbers for things,
349
+					// we are going to move all of our data into the following arrays:
350
+					// datetime spaces initially represents the reg limit for each datetime,
351
+					// but this will get adjusted as tickets are accounted for
352
+					$this->datetime_spaces[ $datetime_identifier ] = $reg_limit;
353
+					// just an array of ticket IDs grouped by datetime
354
+					$this->datetime_tickets[ $datetime_identifier ][] = $ticket_identifier;
355
+					// and an array of datetime IDs grouped by ticket
356
+					$this->ticket_datetimes[ $ticket_identifier ][] = $datetime_identifier;
357
+				}
358
+				// total quantity of sold and reserved for each ticket
359
+				$this->tickets_sold[ $ticket_identifier ] = $ticket->sold() + $ticket->reserved();
360
+				// and the maximum ticket quantities for each ticket (adjusted for reg limit)
361
+				$this->ticket_quantities[ $ticket_identifier ] = $max_tickets;
362
+			}
363
+		}
364
+		// sort datetime spaces by reg limit, but maintain our string indexes
365
+		asort($this->datetime_spaces, SORT_NUMERIC);
366
+		// datetime tickets need to be sorted in the SAME order as the above array...
367
+		// so we'll just use array_merge() to take the structure of datetime_spaces
368
+		// but overwrite all of the data with that from datetime_tickets
369
+		$this->datetime_tickets = array_merge(
370
+			$this->datetime_spaces,
371
+			$this->datetime_tickets
372
+		);
373
+		if ($this->debug) {
374
+			\EEH_Debug_Tools::printr($this->datetime_spaces, 'datetime_spaces', __FILE__, __LINE__);
375
+			\EEH_Debug_Tools::printr($this->datetime_tickets, 'datetime_tickets', __FILE__, __LINE__);
376
+			\EEH_Debug_Tools::printr($this->ticket_quantities, 'ticket_quantities', __FILE__, __LINE__);
377
+		}
378
+	}
379
+
380
+
381
+	/**
382
+	 * performs calculations on initialized data
383
+	 *
384
+	 * @param bool $consider_sold
385
+	 * @return int|float
386
+	 */
387
+	private function calculate($consider_sold = true)
388
+	{
389
+		if ($this->debug) {
390
+			\EEH_Debug_Tools::printr(__FUNCTION__, __CLASS__, __FILE__, __LINE__, 2);
391
+			\EEH_Debug_Tools::printr($consider_sold, '$consider_sold', __FILE__, __LINE__);
392
+		}
393
+		if ($consider_sold) {
394
+			// subtract amounts sold from all ticket quantities and datetime spaces
395
+			$this->adjustTicketQuantitiesDueToSales();
396
+		}
397
+		foreach ($this->datetime_tickets as $datetime_identifier => $tickets) {
398
+			$this->trackAvailableSpacesForDatetimes($datetime_identifier, $tickets);
399
+		}
400
+		// total spaces available is just the sum of the spaces available for each datetime
401
+		$spaces_remaining = array_sum($this->total_spaces);
402
+		if ($this->debug) {
403
+			\EEH_Debug_Tools::printr($this->total_spaces, '$this->total_spaces', __FILE__, __LINE__);
404
+			\EEH_Debug_Tools::printr($this->tickets_sold, '$this->tickets_sold', __FILE__, __LINE__);
405
+			\EEH_Debug_Tools::printr($spaces_remaining, '$spaces_remaining', __FILE__, __LINE__);
406
+		}
407
+		return $spaces_remaining;
408
+	}
409
+
410
+
411
+	/**
412
+	 * subtracts amount of  tickets sold from ticket quantities and datetime spaces
413
+	 */
414
+	private function adjustTicketQuantitiesDueToSales()
415
+	{
416
+		if ($this->debug) {
417
+			\EEH_Debug_Tools::printr(__FUNCTION__, __CLASS__, __FILE__, __LINE__, 2);
418
+		}
419
+		foreach ($this->tickets_sold as $ticket_identifier => $tickets_sold) {
420
+			if (isset($this->ticket_quantities[ $ticket_identifier ])) {
421
+				$this->ticket_quantities[ $ticket_identifier ] -= $tickets_sold;
422
+				// don't let values go below zero
423
+				$this->ticket_quantities[ $ticket_identifier ] = max(
424
+					$this->ticket_quantities[ $ticket_identifier ],
425
+					0
426
+				);
427
+				if ($this->debug) {
428
+					\EEH_Debug_Tools::printr(
429
+						"{$tickets_sold} sales for ticket {$ticket_identifier} ",
430
+						'subtracting',
431
+						__FILE__,
432
+						__LINE__
433
+					);
434
+				}
435
+			}
436
+			if (isset($this->ticket_datetimes[ $ticket_identifier ])
437
+				&& is_array($this->ticket_datetimes[ $ticket_identifier ])
438
+			) {
439
+				foreach ($this->ticket_datetimes[ $ticket_identifier ] as $ticket_datetime) {
440
+					if (isset($this->ticket_quantities[ $ticket_identifier ])) {
441
+						$this->datetime_spaces[ $ticket_datetime ] -= $tickets_sold;
442
+						// don't let values go below zero
443
+						$this->datetime_spaces[ $ticket_datetime ] = max(
444
+							$this->datetime_spaces[ $ticket_datetime ],
445
+							0
446
+						);
447
+						if ($this->debug) {
448
+							\EEH_Debug_Tools::printr(
449
+								"{$tickets_sold} sales for datetime {$ticket_datetime} ",
450
+								'subtracting',
451
+								__FILE__,
452
+								__LINE__
453
+							);
454
+						}
455
+					}
456
+				}
457
+			}
458
+		}
459
+	}
460
+
461
+
462
+	/**
463
+	 * @param string $datetime_identifier
464
+	 * @param array  $tickets
465
+	 */
466
+	private function trackAvailableSpacesForDatetimes($datetime_identifier, array $tickets)
467
+	{
468
+		// make sure a reg limit is set for the datetime
469
+		$reg_limit = isset($this->datetime_spaces[ $datetime_identifier ])
470
+			? $this->datetime_spaces[ $datetime_identifier ]
471
+			: 0;
472
+		// and bail if it is not
473
+		if (! $reg_limit) {
474
+			if ($this->debug) {
475
+				\EEH_Debug_Tools::printr('AT CAPACITY', " . {$datetime_identifier}", __FILE__, __LINE__);
476
+			}
477
+			return;
478
+		}
479
+		if ($this->debug) {
480
+			\EEH_Debug_Tools::printr($datetime_identifier, '* $datetime_identifier', __FILE__, __LINE__, 1);
481
+			\EEH_Debug_Tools::printr(
482
+				"{$reg_limit}",
483
+				'REG LIMIT',
484
+				__FILE__,
485
+				__LINE__
486
+			);
487
+		}
488
+		// number of allocated spaces always starts at zero
489
+		$spaces_allocated = 0;
490
+		$this->total_spaces[ $datetime_identifier ] = 0;
491
+		foreach ($tickets as $ticket_identifier) {
492
+			$spaces_allocated = $this->calculateAvailableSpacesForTicket(
493
+				$datetime_identifier,
494
+				$reg_limit,
495
+				$ticket_identifier,
496
+				$spaces_allocated
497
+			);
498
+		}
499
+		// spaces can't be negative
500
+		$spaces_allocated = max($spaces_allocated, 0);
501
+		if ($spaces_allocated) {
502
+			// track any non-zero values
503
+			$this->total_spaces[ $datetime_identifier ] += $spaces_allocated;
504
+			if ($this->debug) {
505
+				\EEH_Debug_Tools::printr((string) $spaces_allocated, ' . $spaces_allocated: ', __FILE__, __LINE__);
506
+			}
507
+		} else {
508
+			if ($this->debug) {
509
+				\EEH_Debug_Tools::printr(' ', ' . NO TICKETS AVAILABLE FOR DATETIME', __FILE__, __LINE__);
510
+			}
511
+		}
512
+		if ($this->debug) {
513
+			\EEH_Debug_Tools::printr(
514
+				$this->total_spaces[ $datetime_identifier ],
515
+				'$total_spaces',
516
+				__FILE__,
517
+				__LINE__
518
+			);
519
+			\EEH_Debug_Tools::printr($this->ticket_quantities, '$ticket_quantities', __FILE__, __LINE__);
520
+			\EEH_Debug_Tools::printr($this->datetime_spaces, 'datetime_spaces', __FILE__, __LINE__);
521
+		}
522
+	}
523
+
524
+
525
+	/**
526
+	 * @param string $datetime_identifier
527
+	 * @param int    $reg_limit
528
+	 * @param string $ticket_identifier
529
+	 * @param int    $spaces_allocated
530
+	 * @return int
531
+	 */
532
+	private function calculateAvailableSpacesForTicket(
533
+		$datetime_identifier,
534
+		$reg_limit,
535
+		$ticket_identifier,
536
+		$spaces_allocated
537
+	) {
538
+		// make sure ticket quantity is set
539
+		$ticket_quantity = isset($this->ticket_quantities[ $ticket_identifier ])
540
+			? $this->ticket_quantities[ $ticket_identifier ]
541
+			: 0;
542
+		if ($this->debug) {
543
+			\EEH_Debug_Tools::printr("{$spaces_allocated}", '$spaces_allocated', __FILE__, __LINE__);
544
+			\EEH_Debug_Tools::printr(
545
+				"{$ticket_quantity}",
546
+				"ticket $ticket_identifier quantity: ",
547
+				__FILE__,
548
+				__LINE__,
549
+				2
550
+			);
551
+		}
552
+		if ($ticket_quantity) {
553
+			if ($this->debug) {
554
+				\EEH_Debug_Tools::printr(
555
+					($spaces_allocated <= $reg_limit)
556
+						? 'true'
557
+						: 'false',
558
+					' . spaces_allocated <= reg_limit = ',
559
+					__FILE__,
560
+					__LINE__
561
+				);
562
+			}
563
+			// if the datetime is NOT at full capacity yet
564
+			if ($spaces_allocated <= $reg_limit) {
565
+				// then the maximum ticket quantity we can allocate is the lowest value of either:
566
+				//  the number of remaining spaces for the datetime, which is the limit - spaces already taken
567
+				//  or the maximum ticket quantity
568
+				$ticket_quantity = min($reg_limit - $spaces_allocated, $ticket_quantity);
569
+				// adjust the available quantity in our tracking array
570
+				$this->ticket_quantities[ $ticket_identifier ] -= $ticket_quantity;
571
+				// and increment spaces allocated for this datetime
572
+				$spaces_allocated += $ticket_quantity;
573
+				$at_capacity = $spaces_allocated >= $reg_limit;
574
+				if ($this->debug) {
575
+					\EEH_Debug_Tools::printr(
576
+						"{$ticket_quantity} {$ticket_identifier} tickets",
577
+						' > > allocate ',
578
+						__FILE__,
579
+						__LINE__,
580
+						3
581
+					);
582
+					if ($at_capacity) {
583
+						\EEH_Debug_Tools::printr('AT CAPACITY', " . {$datetime_identifier}", __FILE__, __LINE__, 3);
584
+					}
585
+				}
586
+				// now adjust all other datetimes that allow access to this ticket
587
+				$this->adjustDatetimes(
588
+					$datetime_identifier,
589
+					$ticket_identifier,
590
+					$ticket_quantity,
591
+					$at_capacity
592
+				);
593
+			}
594
+		}
595
+		return $spaces_allocated;
596
+	}
597
+
598
+
599
+	/**
600
+	 * subtracts ticket amounts from all datetime reg limits
601
+	 * that allow access to the ticket specified,
602
+	 * because that ticket could be used
603
+	 * to attend any of the datetimes it has access to
604
+	 *
605
+	 * @param string $datetime_identifier
606
+	 * @param string $ticket_identifier
607
+	 * @param bool   $at_capacity
608
+	 * @param int    $ticket_quantity
609
+	 */
610
+	private function adjustDatetimes(
611
+		$datetime_identifier,
612
+		$ticket_identifier,
613
+		$ticket_quantity,
614
+		$at_capacity
615
+	) {
616
+		/** @var array $datetime_tickets */
617
+		foreach ($this->datetime_tickets as $datetime_ID => $datetime_tickets) {
618
+			if ($datetime_ID !== $datetime_identifier || ! is_array($datetime_tickets)) {
619
+				continue;
620
+			}
621
+			$adjusted = $this->adjustDatetimeSpaces(
622
+				$datetime_ID,
623
+				$ticket_identifier,
624
+				$ticket_quantity
625
+			);
626
+			// skip to next ticket if nothing changed
627
+			if (! ($adjusted || $at_capacity)) {
628
+				continue;
629
+			}
630
+			// then all of it's tickets are now unavailable
631
+			foreach ($datetime_tickets as $datetime_ticket) {
632
+				if (($ticket_identifier === $datetime_ticket || $at_capacity)
633
+					&& isset($this->ticket_quantities[ $datetime_ticket ])
634
+					&& $this->ticket_quantities[ $datetime_ticket ] > 0
635
+				) {
636
+					if ($this->debug) {
637
+						\EEH_Debug_Tools::printr(
638
+							$datetime_ticket,
639
+							' . . . adjust ticket quantities for',
640
+							__FILE__,
641
+							__LINE__
642
+						);
643
+					}
644
+					// if this datetime is at full capacity, set any tracked available quantities to zero
645
+					// otherwise just subtract the ticket quantity
646
+					$new_quantity = $at_capacity
647
+						? 0
648
+						: $this->ticket_quantities[ $datetime_ticket ] - $ticket_quantity;
649
+					// don't let ticket quantity go below zero
650
+					$this->ticket_quantities[ $datetime_ticket ] = max($new_quantity, 0);
651
+					if ($this->debug) {
652
+						\EEH_Debug_Tools::printr(
653
+							$at_capacity
654
+								? "0 because Datetime {$datetime_identifier} is at capacity"
655
+								: "{$this->ticket_quantities[ $datetime_ticket ]}",
656
+							" . . . . {$datetime_ticket} quantity set to ",
657
+							__FILE__,
658
+							__LINE__
659
+						);
660
+					}
661
+				}
662
+				// but we also need to adjust spaces for any other datetimes this ticket has access to
663
+				if ($datetime_ticket === $ticket_identifier) {
664
+					if (isset($this->ticket_datetimes[ $datetime_ticket ])
665
+						&& is_array($this->ticket_datetimes[ $datetime_ticket ])
666
+					) {
667
+						if ($this->debug) {
668
+							\EEH_Debug_Tools::printr(
669
+								$datetime_ticket,
670
+								' . . adjust other Datetimes for',
671
+								__FILE__,
672
+								__LINE__
673
+							);
674
+						}
675
+						foreach ($this->ticket_datetimes[ $datetime_ticket ] as $datetime) {
676
+							// don't adjust the current datetime twice
677
+							if ($datetime !== $datetime_identifier) {
678
+								$this->adjustDatetimeSpaces(
679
+									$datetime,
680
+									$datetime_ticket,
681
+									$ticket_quantity
682
+								);
683
+							}
684
+						}
685
+					}
686
+				}
687
+			}
688
+		}
689
+	}
690
+
691
+	private function adjustDatetimeSpaces($datetime_identifier, $ticket_identifier, $ticket_quantity = 0)
692
+	{
693
+		// does datetime have spaces available?
694
+		// and does the supplied ticket have access to this datetime ?
695
+		if ($this->datetime_spaces[ $datetime_identifier ] > 0
696
+			&& isset($this->datetime_spaces[ $datetime_identifier ], $this->datetime_tickets[ $datetime_identifier ])
697
+			&& in_array($ticket_identifier, $this->datetime_tickets[ $datetime_identifier ], true)
698
+		) {
699
+			if ($this->debug) {
700
+				\EEH_Debug_Tools::printr($datetime_identifier, ' . . adjust Datetime Spaces for', __FILE__, __LINE__);
701
+				\EEH_Debug_Tools::printr(
702
+					"{$this->datetime_spaces[ $datetime_identifier ]}",
703
+					" . . current  {$datetime_identifier} spaces available",
704
+					__FILE__,
705
+					__LINE__
706
+				);
707
+			}
708
+			// then decrement the available spaces for the datetime
709
+			$this->datetime_spaces[ $datetime_identifier ] -= $ticket_quantity;
710
+			// but don't let quantities go below zero
711
+			$this->datetime_spaces[ $datetime_identifier ] = max(
712
+				$this->datetime_spaces[ $datetime_identifier ],
713
+				0
714
+			);
715
+			if ($this->debug) {
716
+				\EEH_Debug_Tools::printr(
717
+					"{$ticket_quantity}",
718
+					" . . . {$datetime_identifier} capacity reduced by",
719
+					__FILE__,
720
+					__LINE__
721
+				);
722
+			}
723
+			return true;
724
+		}
725
+		return false;
726
+	}
727 727
 }
Please login to merge, or discard this patch.
Spacing   +46 added lines, -46 removed lines patch added patch discarded remove patch
@@ -174,14 +174,14 @@  discard block
 block discarded – undo
174 174
      */
175 175
     public function setActiveTickets(array $active_tickets = array())
176 176
     {
177
-        if (! empty($active_tickets)) {
177
+        if ( ! empty($active_tickets)) {
178 178
             foreach ($active_tickets as $active_ticket) {
179 179
                 $this->validateTicket($active_ticket);
180 180
             }
181 181
             // sort incoming array by ticket quantity (asc)
182 182
             usort(
183 183
                 $active_tickets,
184
-                function (EE_Ticket $a, EE_Ticket $b) {
184
+                function(EE_Ticket $a, EE_Ticket $b) {
185 185
                     if ($a->qty() === $b->qty()) {
186 186
                         return 0;
187 187
                     }
@@ -203,7 +203,7 @@  discard block
 block discarded – undo
203 203
      */
204 204
     private function validateTicket($ticket)
205 205
     {
206
-        if (! $ticket instanceof EE_Ticket) {
206
+        if ( ! $ticket instanceof EE_Ticket) {
207 207
             throw new DomainException(
208 208
                 esc_html__(
209 209
                     'Invalid Ticket. Only EE_Ticket objects can be used to calculate event space availability.',
@@ -254,7 +254,7 @@  discard block
 block discarded – undo
254 254
                 )
255 255
             );
256 256
         }
257
-        $this->datetimes[ $datetime->ID() ] = $datetime;
257
+        $this->datetimes[$datetime->ID()] = $datetime;
258 258
     }
259 259
 
260 260
 
@@ -327,7 +327,7 @@  discard block
 block discarded – undo
327 327
         $this->tickets_sold = array();
328 328
         $this->total_spaces = array();
329 329
         $active_tickets = $this->getActiveTickets();
330
-        if (! empty($active_tickets)) {
330
+        if ( ! empty($active_tickets)) {
331 331
             foreach ($active_tickets as $ticket) {
332 332
                 $this->validateTicket($ticket);
333 333
                 // we need to index our data arrays using strings for the purpose of sorting,
@@ -349,16 +349,16 @@  discard block
 block discarded – undo
349 349
                     // we are going to move all of our data into the following arrays:
350 350
                     // datetime spaces initially represents the reg limit for each datetime,
351 351
                     // but this will get adjusted as tickets are accounted for
352
-                    $this->datetime_spaces[ $datetime_identifier ] = $reg_limit;
352
+                    $this->datetime_spaces[$datetime_identifier] = $reg_limit;
353 353
                     // just an array of ticket IDs grouped by datetime
354
-                    $this->datetime_tickets[ $datetime_identifier ][] = $ticket_identifier;
354
+                    $this->datetime_tickets[$datetime_identifier][] = $ticket_identifier;
355 355
                     // and an array of datetime IDs grouped by ticket
356
-                    $this->ticket_datetimes[ $ticket_identifier ][] = $datetime_identifier;
356
+                    $this->ticket_datetimes[$ticket_identifier][] = $datetime_identifier;
357 357
                 }
358 358
                 // total quantity of sold and reserved for each ticket
359
-                $this->tickets_sold[ $ticket_identifier ] = $ticket->sold() + $ticket->reserved();
359
+                $this->tickets_sold[$ticket_identifier] = $ticket->sold() + $ticket->reserved();
360 360
                 // and the maximum ticket quantities for each ticket (adjusted for reg limit)
361
-                $this->ticket_quantities[ $ticket_identifier ] = $max_tickets;
361
+                $this->ticket_quantities[$ticket_identifier] = $max_tickets;
362 362
             }
363 363
         }
364 364
         // sort datetime spaces by reg limit, but maintain our string indexes
@@ -417,11 +417,11 @@  discard block
 block discarded – undo
417 417
             \EEH_Debug_Tools::printr(__FUNCTION__, __CLASS__, __FILE__, __LINE__, 2);
418 418
         }
419 419
         foreach ($this->tickets_sold as $ticket_identifier => $tickets_sold) {
420
-            if (isset($this->ticket_quantities[ $ticket_identifier ])) {
421
-                $this->ticket_quantities[ $ticket_identifier ] -= $tickets_sold;
420
+            if (isset($this->ticket_quantities[$ticket_identifier])) {
421
+                $this->ticket_quantities[$ticket_identifier] -= $tickets_sold;
422 422
                 // don't let values go below zero
423
-                $this->ticket_quantities[ $ticket_identifier ] = max(
424
-                    $this->ticket_quantities[ $ticket_identifier ],
423
+                $this->ticket_quantities[$ticket_identifier] = max(
424
+                    $this->ticket_quantities[$ticket_identifier],
425 425
                     0
426 426
                 );
427 427
                 if ($this->debug) {
@@ -433,15 +433,15 @@  discard block
 block discarded – undo
433 433
                     );
434 434
                 }
435 435
             }
436
-            if (isset($this->ticket_datetimes[ $ticket_identifier ])
437
-                && is_array($this->ticket_datetimes[ $ticket_identifier ])
436
+            if (isset($this->ticket_datetimes[$ticket_identifier])
437
+                && is_array($this->ticket_datetimes[$ticket_identifier])
438 438
             ) {
439
-                foreach ($this->ticket_datetimes[ $ticket_identifier ] as $ticket_datetime) {
440
-                    if (isset($this->ticket_quantities[ $ticket_identifier ])) {
441
-                        $this->datetime_spaces[ $ticket_datetime ] -= $tickets_sold;
439
+                foreach ($this->ticket_datetimes[$ticket_identifier] as $ticket_datetime) {
440
+                    if (isset($this->ticket_quantities[$ticket_identifier])) {
441
+                        $this->datetime_spaces[$ticket_datetime] -= $tickets_sold;
442 442
                         // don't let values go below zero
443
-                        $this->datetime_spaces[ $ticket_datetime ] = max(
444
-                            $this->datetime_spaces[ $ticket_datetime ],
443
+                        $this->datetime_spaces[$ticket_datetime] = max(
444
+                            $this->datetime_spaces[$ticket_datetime],
445 445
                             0
446 446
                         );
447 447
                         if ($this->debug) {
@@ -466,11 +466,11 @@  discard block
 block discarded – undo
466 466
     private function trackAvailableSpacesForDatetimes($datetime_identifier, array $tickets)
467 467
     {
468 468
         // make sure a reg limit is set for the datetime
469
-        $reg_limit = isset($this->datetime_spaces[ $datetime_identifier ])
470
-            ? $this->datetime_spaces[ $datetime_identifier ]
469
+        $reg_limit = isset($this->datetime_spaces[$datetime_identifier])
470
+            ? $this->datetime_spaces[$datetime_identifier]
471 471
             : 0;
472 472
         // and bail if it is not
473
-        if (! $reg_limit) {
473
+        if ( ! $reg_limit) {
474 474
             if ($this->debug) {
475 475
                 \EEH_Debug_Tools::printr('AT CAPACITY', " . {$datetime_identifier}", __FILE__, __LINE__);
476 476
             }
@@ -487,7 +487,7 @@  discard block
 block discarded – undo
487 487
         }
488 488
         // number of allocated spaces always starts at zero
489 489
         $spaces_allocated = 0;
490
-        $this->total_spaces[ $datetime_identifier ] = 0;
490
+        $this->total_spaces[$datetime_identifier] = 0;
491 491
         foreach ($tickets as $ticket_identifier) {
492 492
             $spaces_allocated = $this->calculateAvailableSpacesForTicket(
493 493
                 $datetime_identifier,
@@ -500,7 +500,7 @@  discard block
 block discarded – undo
500 500
         $spaces_allocated = max($spaces_allocated, 0);
501 501
         if ($spaces_allocated) {
502 502
             // track any non-zero values
503
-            $this->total_spaces[ $datetime_identifier ] += $spaces_allocated;
503
+            $this->total_spaces[$datetime_identifier] += $spaces_allocated;
504 504
             if ($this->debug) {
505 505
                 \EEH_Debug_Tools::printr((string) $spaces_allocated, ' . $spaces_allocated: ', __FILE__, __LINE__);
506 506
             }
@@ -511,7 +511,7 @@  discard block
 block discarded – undo
511 511
         }
512 512
         if ($this->debug) {
513 513
             \EEH_Debug_Tools::printr(
514
-                $this->total_spaces[ $datetime_identifier ],
514
+                $this->total_spaces[$datetime_identifier],
515 515
                 '$total_spaces',
516 516
                 __FILE__,
517 517
                 __LINE__
@@ -536,8 +536,8 @@  discard block
 block discarded – undo
536 536
         $spaces_allocated
537 537
     ) {
538 538
         // make sure ticket quantity is set
539
-        $ticket_quantity = isset($this->ticket_quantities[ $ticket_identifier ])
540
-            ? $this->ticket_quantities[ $ticket_identifier ]
539
+        $ticket_quantity = isset($this->ticket_quantities[$ticket_identifier])
540
+            ? $this->ticket_quantities[$ticket_identifier]
541 541
             : 0;
542 542
         if ($this->debug) {
543 543
             \EEH_Debug_Tools::printr("{$spaces_allocated}", '$spaces_allocated', __FILE__, __LINE__);
@@ -567,7 +567,7 @@  discard block
 block discarded – undo
567 567
                 //  or the maximum ticket quantity
568 568
                 $ticket_quantity = min($reg_limit - $spaces_allocated, $ticket_quantity);
569 569
                 // adjust the available quantity in our tracking array
570
-                $this->ticket_quantities[ $ticket_identifier ] -= $ticket_quantity;
570
+                $this->ticket_quantities[$ticket_identifier] -= $ticket_quantity;
571 571
                 // and increment spaces allocated for this datetime
572 572
                 $spaces_allocated += $ticket_quantity;
573 573
                 $at_capacity = $spaces_allocated >= $reg_limit;
@@ -624,14 +624,14 @@  discard block
 block discarded – undo
624 624
                 $ticket_quantity
625 625
             );
626 626
             // skip to next ticket if nothing changed
627
-            if (! ($adjusted || $at_capacity)) {
627
+            if ( ! ($adjusted || $at_capacity)) {
628 628
                 continue;
629 629
             }
630 630
             // then all of it's tickets are now unavailable
631 631
             foreach ($datetime_tickets as $datetime_ticket) {
632 632
                 if (($ticket_identifier === $datetime_ticket || $at_capacity)
633
-                    && isset($this->ticket_quantities[ $datetime_ticket ])
634
-                    && $this->ticket_quantities[ $datetime_ticket ] > 0
633
+                    && isset($this->ticket_quantities[$datetime_ticket])
634
+                    && $this->ticket_quantities[$datetime_ticket] > 0
635 635
                 ) {
636 636
                     if ($this->debug) {
637 637
                         \EEH_Debug_Tools::printr(
@@ -645,14 +645,14 @@  discard block
 block discarded – undo
645 645
                     // otherwise just subtract the ticket quantity
646 646
                     $new_quantity = $at_capacity
647 647
                         ? 0
648
-                        : $this->ticket_quantities[ $datetime_ticket ] - $ticket_quantity;
648
+                        : $this->ticket_quantities[$datetime_ticket] - $ticket_quantity;
649 649
                     // don't let ticket quantity go below zero
650
-                    $this->ticket_quantities[ $datetime_ticket ] = max($new_quantity, 0);
650
+                    $this->ticket_quantities[$datetime_ticket] = max($new_quantity, 0);
651 651
                     if ($this->debug) {
652 652
                         \EEH_Debug_Tools::printr(
653 653
                             $at_capacity
654 654
                                 ? "0 because Datetime {$datetime_identifier} is at capacity"
655
-                                : "{$this->ticket_quantities[ $datetime_ticket ]}",
655
+                                : "{$this->ticket_quantities[$datetime_ticket]}",
656 656
                             " . . . . {$datetime_ticket} quantity set to ",
657 657
                             __FILE__,
658 658
                             __LINE__
@@ -661,8 +661,8 @@  discard block
 block discarded – undo
661 661
                 }
662 662
                 // but we also need to adjust spaces for any other datetimes this ticket has access to
663 663
                 if ($datetime_ticket === $ticket_identifier) {
664
-                    if (isset($this->ticket_datetimes[ $datetime_ticket ])
665
-                        && is_array($this->ticket_datetimes[ $datetime_ticket ])
664
+                    if (isset($this->ticket_datetimes[$datetime_ticket])
665
+                        && is_array($this->ticket_datetimes[$datetime_ticket])
666 666
                     ) {
667 667
                         if ($this->debug) {
668 668
                             \EEH_Debug_Tools::printr(
@@ -672,7 +672,7 @@  discard block
 block discarded – undo
672 672
                                 __LINE__
673 673
                             );
674 674
                         }
675
-                        foreach ($this->ticket_datetimes[ $datetime_ticket ] as $datetime) {
675
+                        foreach ($this->ticket_datetimes[$datetime_ticket] as $datetime) {
676 676
                             // don't adjust the current datetime twice
677 677
                             if ($datetime !== $datetime_identifier) {
678 678
                                 $this->adjustDatetimeSpaces(
@@ -692,24 +692,24 @@  discard block
 block discarded – undo
692 692
     {
693 693
         // does datetime have spaces available?
694 694
         // and does the supplied ticket have access to this datetime ?
695
-        if ($this->datetime_spaces[ $datetime_identifier ] > 0
696
-            && isset($this->datetime_spaces[ $datetime_identifier ], $this->datetime_tickets[ $datetime_identifier ])
697
-            && in_array($ticket_identifier, $this->datetime_tickets[ $datetime_identifier ], true)
695
+        if ($this->datetime_spaces[$datetime_identifier] > 0
696
+            && isset($this->datetime_spaces[$datetime_identifier], $this->datetime_tickets[$datetime_identifier])
697
+            && in_array($ticket_identifier, $this->datetime_tickets[$datetime_identifier], true)
698 698
         ) {
699 699
             if ($this->debug) {
700 700
                 \EEH_Debug_Tools::printr($datetime_identifier, ' . . adjust Datetime Spaces for', __FILE__, __LINE__);
701 701
                 \EEH_Debug_Tools::printr(
702
-                    "{$this->datetime_spaces[ $datetime_identifier ]}",
702
+                    "{$this->datetime_spaces[$datetime_identifier]}",
703 703
                     " . . current  {$datetime_identifier} spaces available",
704 704
                     __FILE__,
705 705
                     __LINE__
706 706
                 );
707 707
             }
708 708
             // then decrement the available spaces for the datetime
709
-            $this->datetime_spaces[ $datetime_identifier ] -= $ticket_quantity;
709
+            $this->datetime_spaces[$datetime_identifier] -= $ticket_quantity;
710 710
             // but don't let quantities go below zero
711
-            $this->datetime_spaces[ $datetime_identifier ] = max(
712
-                $this->datetime_spaces[ $datetime_identifier ],
711
+            $this->datetime_spaces[$datetime_identifier] = max(
712
+                $this->datetime_spaces[$datetime_identifier],
713 713
                 0
714 714
             );
715 715
             if ($this->debug) {
Please login to merge, or discard this patch.
form_sections/strategies/display/EE_Number_Input_Display_Strategy.php 2 patches
Doc Comments   +3 added lines patch added patch discarded remove patch
@@ -64,6 +64,9 @@
 block discarded – undo
64 64
     }
65 65
 
66 66
 
67
+    /**
68
+     * @param string $argument_label
69
+     */
67 70
     private function throwValidationException($argument_label, $argument_value)
68 71
     {
69 72
         throw new InvalidArgumentException(
Please login to merge, or discard this patch.
Indentation   +93 added lines, -93 removed lines patch added patch discarded remove patch
@@ -11,109 +11,109 @@
 block discarded – undo
11 11
 class EE_Number_Input_Display_Strategy extends EE_Display_Strategy_Base
12 12
 {
13 13
 
14
-    /**
15
-     * minimum value for number field
16
-     *
17
-     * @var int|null $min
18
-     */
19
-    protected $min;
14
+	/**
15
+	 * minimum value for number field
16
+	 *
17
+	 * @var int|null $min
18
+	 */
19
+	protected $min;
20 20
 
21
-    /**
22
-     * maximum value for number field
23
-     *
24
-     * @var int|null $max
25
-     */
26
-    protected $max;
21
+	/**
22
+	 * maximum value for number field
23
+	 *
24
+	 * @var int|null $max
25
+	 */
26
+	protected $max;
27 27
 
28 28
 
29
-    /**
30
-     * This is used to set the "step" attribute for the html5 number input.
31
-     * Controls the increments on the input when incrementing or decrementing the value.
32
-     * Note:  Although the step attribute allows for the string "any" to be used, Firefox and Chrome will interpret that
33
-     * to increment by 1.  So although "any" is accepted as a value, it is converted to 1.
34
-     * @var float
35
-     */
36
-    protected $step;
29
+	/**
30
+	 * This is used to set the "step" attribute for the html5 number input.
31
+	 * Controls the increments on the input when incrementing or decrementing the value.
32
+	 * Note:  Although the step attribute allows for the string "any" to be used, Firefox and Chrome will interpret that
33
+	 * to increment by 1.  So although "any" is accepted as a value, it is converted to 1.
34
+	 * @var float
35
+	 */
36
+	protected $step;
37 37
 
38 38
 
39
-    /**
40
-     * EE_Number_Input_Display_Strategy constructor.
41
-     * Null is the default value for the incoming arguments because 0 is a valid value.  So we use null
42
-     * to indicate NOT setting this attribute.
43
-     *
44
-     * @param int|null $min
45
-     * @param int|null $max
46
-     * @param int|null $step
47
-     * @throws InvalidArgumentException
48
-     */
49
-    public function __construct($min = null, $max = null, $step = null)
50
-    {
51
-        $this->min = is_numeric($min) || $min === null
52
-            ? $min
53
-            : $this->throwValidationException('min', $min);
54
-        $this->max = is_numeric($max) || $max === null
55
-            ? $max
56
-            : $this->throwValidationException('max', $max);
57
-        $step = $step === 'any' ? 1 : $step;
58
-        $this->step = is_numeric($step) || $step === null
59
-            ? $step
60
-            : $this->throwValidationException('step', $step);
61
-    }
39
+	/**
40
+	 * EE_Number_Input_Display_Strategy constructor.
41
+	 * Null is the default value for the incoming arguments because 0 is a valid value.  So we use null
42
+	 * to indicate NOT setting this attribute.
43
+	 *
44
+	 * @param int|null $min
45
+	 * @param int|null $max
46
+	 * @param int|null $step
47
+	 * @throws InvalidArgumentException
48
+	 */
49
+	public function __construct($min = null, $max = null, $step = null)
50
+	{
51
+		$this->min = is_numeric($min) || $min === null
52
+			? $min
53
+			: $this->throwValidationException('min', $min);
54
+		$this->max = is_numeric($max) || $max === null
55
+			? $max
56
+			: $this->throwValidationException('max', $max);
57
+		$step = $step === 'any' ? 1 : $step;
58
+		$this->step = is_numeric($step) || $step === null
59
+			? $step
60
+			: $this->throwValidationException('step', $step);
61
+	}
62 62
 
63 63
 
64
-    private function throwValidationException($argument_label, $argument_value)
65
-    {
66
-        throw new InvalidArgumentException(
67
-            sprintf(
68
-                esc_html__(
69
-                    'The %1$s parameter value for %2$s must be numeric or null, %3$s was passed into the constructor.',
70
-                    'event_espresso'
71
-                ),
72
-                $argument_label,
73
-                __CLASS__,
74
-                $argument_value
75
-            )
76
-        );
77
-    }
64
+	private function throwValidationException($argument_label, $argument_value)
65
+	{
66
+		throw new InvalidArgumentException(
67
+			sprintf(
68
+				esc_html__(
69
+					'The %1$s parameter value for %2$s must be numeric or null, %3$s was passed into the constructor.',
70
+					'event_espresso'
71
+				),
72
+				$argument_label,
73
+				__CLASS__,
74
+				$argument_value
75
+			)
76
+		);
77
+	}
78 78
 
79 79
 
80 80
 
81
-    /**
82
-     * @return string of html to display the field
83
-     */
84
-    public function display()
85
-    {
86
-        $input = $this->_opening_tag('input');
87
-        $input .= $this->_attributes_string(
88
-            array_merge(
89
-                $this->_standard_attributes_array(),
90
-                $this->getNumberInputAttributes()
91
-            )
92
-        );
93
-        $input .= $this->_close_tag();
94
-        return $input;
95
-    }
81
+	/**
82
+	 * @return string of html to display the field
83
+	 */
84
+	public function display()
85
+	{
86
+		$input = $this->_opening_tag('input');
87
+		$input .= $this->_attributes_string(
88
+			array_merge(
89
+				$this->_standard_attributes_array(),
90
+				$this->getNumberInputAttributes()
91
+			)
92
+		);
93
+		$input .= $this->_close_tag();
94
+		return $input;
95
+	}
96 96
 
97 97
 
98
-    /**
99
-     * Return the attributes specific to this display strategy
100
-     * @return array
101
-     */
102
-    private function getNumberInputAttributes()
103
-    {
104
-        $attributes = array(
105
-            'type' => 'number',
106
-            'value' => $this->_input->raw_value_in_form()
107
-        );
108
-        if ($this->min !== null) {
109
-            $attributes['min'] = $this->min;
110
-        }
111
-        if ($this->max !== null) {
112
-            $attributes['max'] = $this->max;
113
-        }
114
-        if ($this->step !== null) {
115
-            $attributes['step'] = $this->step;
116
-        }
117
-        return $attributes;
118
-    }
98
+	/**
99
+	 * Return the attributes specific to this display strategy
100
+	 * @return array
101
+	 */
102
+	private function getNumberInputAttributes()
103
+	{
104
+		$attributes = array(
105
+			'type' => 'number',
106
+			'value' => $this->_input->raw_value_in_form()
107
+		);
108
+		if ($this->min !== null) {
109
+			$attributes['min'] = $this->min;
110
+		}
111
+		if ($this->max !== null) {
112
+			$attributes['max'] = $this->max;
113
+		}
114
+		if ($this->step !== null) {
115
+			$attributes['step'] = $this->step;
116
+		}
117
+		return $attributes;
118
+	}
119 119
 }
Please login to merge, or discard this patch.
core/libraries/form_sections/inputs/EE_Float_Input.input.php 1 patch
Indentation   +29 added lines, -29 removed lines patch added patch discarded remove patch
@@ -11,33 +11,33 @@
 block discarded – undo
11 11
 class EE_Float_Input extends EE_Form_Input_Base
12 12
 {
13 13
 
14
-    /**
15
-     * @param array $input_settings
16
-     * @throws InvalidArgumentException
17
-     */
18
-    public function __construct($input_settings = array())
19
-    {
20
-        $this->_set_display_strategy(
21
-            new EE_Number_Input_Display_Strategy(
22
-                isset($input_settings['min_value'])
23
-                    ? $input_settings['min_value']
24
-                    : null,
25
-                isset($input_settings['max_value'])
26
-                    ? $input_settings['max_value']
27
-                    : null,
28
-                isset($input_settings['step_value'])
29
-                    ? $input_settings['step_value']
30
-                    : null
31
-            )
32
-        );
33
-        $this->_set_normalization_strategy(new EE_Float_Normalization());
34
-        $this->_add_validation_strategy(
35
-            new EE_Float_Validation_Strategy(
36
-                isset($input_settings['validation_error_message'])
37
-                    ? $input_settings['validation_error_message']
38
-                    : null
39
-            )
40
-        );
41
-        parent::__construct($input_settings);
42
-    }
14
+	/**
15
+	 * @param array $input_settings
16
+	 * @throws InvalidArgumentException
17
+	 */
18
+	public function __construct($input_settings = array())
19
+	{
20
+		$this->_set_display_strategy(
21
+			new EE_Number_Input_Display_Strategy(
22
+				isset($input_settings['min_value'])
23
+					? $input_settings['min_value']
24
+					: null,
25
+				isset($input_settings['max_value'])
26
+					? $input_settings['max_value']
27
+					: null,
28
+				isset($input_settings['step_value'])
29
+					? $input_settings['step_value']
30
+					: null
31
+			)
32
+		);
33
+		$this->_set_normalization_strategy(new EE_Float_Normalization());
34
+		$this->_add_validation_strategy(
35
+			new EE_Float_Validation_Strategy(
36
+				isset($input_settings['validation_error_message'])
37
+					? $input_settings['validation_error_message']
38
+					: null
39
+			)
40
+		);
41
+		parent::__construct($input_settings);
42
+	}
43 43
 }
Please login to merge, or discard this patch.
admin_pages/events/Events_Admin_List_Table.class.php 3 patches
Doc Comments   +1 added lines, -1 removed lines patch added patch discarded remove patch
@@ -152,7 +152,7 @@
 block discarded – undo
152 152
 
153 153
     /**
154 154
      * @param EE_Event $item
155
-     * @return mixed|string
155
+     * @return string
156 156
      * @throws EE_Error
157 157
      */
158 158
     public function column_id(EE_Event $item)
Please login to merge, or discard this patch.
Indentation   +500 added lines, -500 removed lines patch added patch discarded remove patch
@@ -15,504 +15,504 @@
 block discarded – undo
15 15
 class Events_Admin_List_Table extends EE_Admin_List_Table
16 16
 {
17 17
 
18
-    /**
19
-     * @var EE_Datetime
20
-     */
21
-    private $_dtt;
22
-
23
-
24
-    /**
25
-     * Initial setup of data properties for the list table.
26
-     */
27
-    protected function _setup_data()
28
-    {
29
-        $this->_data = $this->_admin_page->get_events($this->_per_page, $this->_current_page);
30
-        $this->_all_data_count = $this->_admin_page->get_events(0, 0, true);
31
-    }
32
-
33
-
34
-    /**
35
-     * Set up of additional properties for the list table.
36
-     */
37
-    protected function _set_properties()
38
-    {
39
-        $this->_wp_list_args = array(
40
-            'singular' => esc_html__('event', 'event_espresso'),
41
-            'plural'   => esc_html__('events', 'event_espresso'),
42
-            'ajax'     => true, // for now
43
-            'screen'   => $this->_admin_page->get_current_screen()->id,
44
-        );
45
-        $this->_columns = array(
46
-            'cb'              => '<input type="checkbox" />',
47
-            'id'              => esc_html__('ID', 'event_espresso'),
48
-            'name'            => esc_html__('Name', 'event_espresso'),
49
-            'author'          => esc_html__('Author', 'event_espresso'),
50
-            'venue'           => esc_html__('Venue', 'event_espresso'),
51
-            'start_date_time' => esc_html__('Event Start', 'event_espresso'),
52
-            'reg_begins'      => esc_html__('On Sale', 'event_espresso'),
53
-            'attendees'       => '<span class="dashicons dashicons-groups ee-icon-color-ee-green ee-icon-size-20">'
54
-                                 . '<span class="screen-reader-text">'
55
-                                 . esc_html__('Approved Registrations', 'event_espresso')
56
-                                 . '</span>'
57
-                                 . '</span>',
58
-            // 'tkts_sold' => esc_html__('Tickets Sold', 'event_espresso'),
59
-            'actions'         => esc_html__('Actions', 'event_espresso'),
60
-        );
61
-        $this->_sortable_columns = array(
62
-            'id'              => array('EVT_ID' => true),
63
-            'name'            => array('EVT_name' => false),
64
-            'author'          => array('EVT_wp_user' => false),
65
-            'venue'           => array('Venue.VNU_name' => false),
66
-            'start_date_time' => array('Datetime.DTT_EVT_start' => false),
67
-            'reg_begins'      => array('Datetime.Ticket.TKT_start_date' => false),
68
-        );
69
-        $this->_primary_column = 'id';
70
-        $this->_hidden_columns = array('author');
71
-    }
72
-
73
-
74
-    /**
75
-     * @return array
76
-     */
77
-    protected function _get_table_filters()
78
-    {
79
-        return array(); // no filters with decaf
80
-    }
81
-
82
-
83
-    /**
84
-     * Setup of views properties.
85
-     *
86
-     * @throws InvalidDataTypeException
87
-     * @throws InvalidInterfaceException
88
-     * @throws InvalidArgumentException
89
-     */
90
-    protected function _add_view_counts()
91
-    {
92
-        $this->_views['all']['count'] = $this->_admin_page->total_events();
93
-        $this->_views['draft']['count'] = $this->_admin_page->total_events_draft();
94
-        if (EE_Registry::instance()->CAP->current_user_can(
95
-            'ee_delete_events',
96
-            'espresso_events_trash_events'
97
-        )) {
98
-            $this->_views['trash']['count'] = $this->_admin_page->total_trashed_events();
99
-        }
100
-    }
101
-
102
-
103
-    /**
104
-     * @param EE_Event $item
105
-     * @return string
106
-     * @throws EE_Error
107
-     */
108
-    protected function _get_row_class($item)
109
-    {
110
-        $class = parent::_get_row_class($item);
111
-        // add status class
112
-        $class .= $item instanceof EE_Event
113
-            ? ' ee-status-strip event-status-' . $item->get_active_status()
114
-            : '';
115
-        if ($this->_has_checkbox_column) {
116
-            $class .= ' has-checkbox-column';
117
-        }
118
-        return $class;
119
-    }
120
-
121
-
122
-    /**
123
-     * @param EE_Event $item
124
-     * @return string
125
-     * @throws EE_Error
126
-     */
127
-    public function column_status(EE_Event $item)
128
-    {
129
-        return '<span class="ee-status-strip ee-status-strip-td event-status-'
130
-               . $item->get_active_status()
131
-               . '"></span>';
132
-    }
133
-
134
-
135
-    /**
136
-     * @param  EE_Event $item
137
-     * @return string
138
-     * @throws EE_Error
139
-     */
140
-    public function column_cb($item)
141
-    {
142
-        if (! $item instanceof EE_Event) {
143
-            return '';
144
-        }
145
-        $this->_dtt = $item->primary_datetime(); // set this for use in other columns
146
-        // does event have any attached registrations?
147
-        $regs = $item->count_related('Registration');
148
-        return $regs > 0 && $this->_view === 'trash'
149
-            ? '<span class="ee-lock-icon"></span>'
150
-            : sprintf(
151
-                '<input type="checkbox" name="EVT_IDs[]" value="%s" />',
152
-                $item->ID()
153
-            );
154
-    }
155
-
156
-
157
-    /**
158
-     * @param EE_Event $item
159
-     * @return mixed|string
160
-     * @throws EE_Error
161
-     */
162
-    public function column_id(EE_Event $item)
163
-    {
164
-        $content = $item->ID();
165
-        $content .= '  <span class="show-on-mobile-view-only">' . $item->name() . '</span>';
166
-        return $content;
167
-    }
168
-
169
-
170
-    /**
171
-     * @param EE_Event $item
172
-     * @return string
173
-     * @throws EE_Error
174
-     * @throws InvalidArgumentException
175
-     * @throws InvalidDataTypeException
176
-     * @throws InvalidInterfaceException
177
-     */
178
-    public function column_name(EE_Event $item)
179
-    {
180
-        $edit_query_args = array(
181
-            'action' => 'edit',
182
-            'post'   => $item->ID(),
183
-        );
184
-        $edit_link = EE_Admin_Page::add_query_args_and_nonce($edit_query_args, EVENTS_ADMIN_URL);
185
-        $actions = $this->_column_name_action_setup($item);
186
-        $status = ''; // $item->status() !== 'publish' ? ' (' . $item->status() . ')' : '';
187
-        $content = '<strong><a class="row-title" href="'
188
-                   . $edit_link . '">'
189
-                   . $item->name()
190
-                   . '</a></strong>'
191
-                   . $status;
192
-        $content .= '<br><span class="ee-status-text-small">'
193
-                    . EEH_Template::pretty_status(
194
-                        $item->get_active_status(),
195
-                        false,
196
-                        'sentence'
197
-                    )
198
-                    . '</span>';
199
-        $content .= $this->row_actions($actions);
200
-        return $content;
201
-    }
202
-
203
-
204
-    /**
205
-     * Just a method for setting up the actions for the name column
206
-     *
207
-     * @param EE_Event $item
208
-     * @return array array of actions
209
-     * @throws EE_Error
210
-     * @throws InvalidArgumentException
211
-     * @throws InvalidDataTypeException
212
-     * @throws InvalidInterfaceException
213
-     */
214
-    protected function _column_name_action_setup(EE_Event $item)
215
-    {
216
-        // todo: remove when attendees is active
217
-        if (! defined('REG_ADMIN_URL')) {
218
-            define('REG_ADMIN_URL', EVENTS_ADMIN_URL);
219
-        }
220
-        $actions = array();
221
-        $restore_event_link = '';
222
-        $delete_event_link = '';
223
-        $trash_event_link = '';
224
-        if (EE_Registry::instance()->CAP->current_user_can(
225
-            'ee_edit_event',
226
-            'espresso_events_edit',
227
-            $item->ID()
228
-        )) {
229
-            $edit_query_args = array(
230
-                'action' => 'edit',
231
-                'post'   => $item->ID(),
232
-            );
233
-            $edit_link = EE_Admin_Page::add_query_args_and_nonce($edit_query_args, EVENTS_ADMIN_URL);
234
-            $actions['edit'] = '<a href="' . $edit_link . '"'
235
-                               . ' title="' . esc_attr__('Edit Event', 'event_espresso') . '">'
236
-                               . esc_html__('Edit', 'event_espresso')
237
-                               . '</a>';
238
-        }
239
-        if (EE_Registry::instance()->CAP->current_user_can(
240
-            'ee_read_registrations',
241
-            'espresso_registrations_view_registration'
242
-        )
243
-            && EE_Registry::instance()->CAP->current_user_can(
244
-                'ee_read_event',
245
-                'espresso_registrations_view_registration',
246
-                $item->ID()
247
-            )
248
-        ) {
249
-            $attendees_query_args = array(
250
-                'action'   => 'default',
251
-                'event_id' => $item->ID(),
252
-            );
253
-            $attendees_link = EE_Admin_Page::add_query_args_and_nonce($attendees_query_args, REG_ADMIN_URL);
254
-            $actions['attendees'] = '<a href="' . $attendees_link . '"'
255
-                                    . ' title="' . esc_attr__('View Registrations', 'event_espresso') . '">'
256
-                                    . esc_html__('Registrations', 'event_espresso')
257
-                                    . '</a>';
258
-        }
259
-        if (EE_Registry::instance()->CAP->current_user_can(
260
-            'ee_delete_event',
261
-            'espresso_events_trash_event',
262
-            $item->ID()
263
-        )) {
264
-            $trash_event_query_args = array(
265
-                'action' => 'trash_event',
266
-                'EVT_ID' => $item->ID(),
267
-            );
268
-            $trash_event_link = EE_Admin_Page::add_query_args_and_nonce(
269
-                $trash_event_query_args,
270
-                EVENTS_ADMIN_URL
271
-            );
272
-        }
273
-        if (EE_Registry::instance()->CAP->current_user_can(
274
-            'ee_delete_event',
275
-            'espresso_events_restore_event',
276
-            $item->ID()
277
-        )) {
278
-            $restore_event_query_args = array(
279
-                'action' => 'restore_event',
280
-                'EVT_ID' => $item->ID(),
281
-            );
282
-            $restore_event_link = EE_Admin_Page::add_query_args_and_nonce(
283
-                $restore_event_query_args,
284
-                EVENTS_ADMIN_URL
285
-            );
286
-        }
287
-        if (EE_Registry::instance()->CAP->current_user_can(
288
-            'ee_delete_event',
289
-            'espresso_events_delete_event',
290
-            $item->ID()
291
-        )) {
292
-            $delete_event_query_args = array(
293
-                'action' => 'delete_event',
294
-                'EVT_ID' => $item->ID(),
295
-            );
296
-            $delete_event_link = EE_Admin_Page::add_query_args_and_nonce(
297
-                $delete_event_query_args,
298
-                EVENTS_ADMIN_URL
299
-            );
300
-        }
301
-        $view_link = get_permalink($item->ID());
302
-        $actions['view'] = '<a href="' . $view_link . '"'
303
-                           . ' title="' . esc_attr__('View Event', 'event_espresso') . '">'
304
-                           . esc_html__('View', 'event_espresso')
305
-                           . '</a>';
306
-        if ($item->get('status') === 'trash') {
307
-            if (EE_Registry::instance()->CAP->current_user_can(
308
-                'ee_delete_event',
309
-                'espresso_events_restore_event',
310
-                $item->ID()
311
-            )) {
312
-                $actions['restore_from_trash'] = '<a href="' . $restore_event_link . '"'
313
-                                                 . ' title="' . esc_attr__('Restore from Trash', 'event_espresso')
314
-                                                 . '">'
315
-                                                 . esc_html__('Restore from Trash', 'event_espresso')
316
-                                                 . '</a>';
317
-            }
318
-            if ($item->count_related('Registration') === 0
319
-                && EE_Registry::instance()->CAP->current_user_can(
320
-                    'ee_delete_event',
321
-                    'espresso_events_delete_event',
322
-                    $item->ID()
323
-                )
324
-            ) {
325
-                $actions['delete'] = '<a href="' . $delete_event_link . '"'
326
-                                     . ' title="' . esc_attr__('Delete Permanently', 'event_espresso') . '">'
327
-                                     . esc_html__('Delete Permanently', 'event_espresso')
328
-                                     . '</a>';
329
-            }
330
-        } else {
331
-            if (EE_Registry::instance()->CAP->current_user_can(
332
-                'ee_delete_event',
333
-                'espresso_events_trash_event',
334
-                $item->ID()
335
-            )) {
336
-                $actions['move to trash'] = '<a href="' . $trash_event_link . '"'
337
-                                            . ' title="' . esc_attr__('Trash Event', 'event_espresso') . '">'
338
-                                            . esc_html__('Trash', 'event_espresso')
339
-                                            . '</a>';
340
-            }
341
-        }
342
-        return $actions;
343
-    }
344
-
345
-
346
-    /**
347
-     * @param EE_Event $item
348
-     * @return string
349
-     * @throws EE_Error
350
-     */
351
-    public function column_author(EE_Event $item)
352
-    {
353
-        // user author info
354
-        $event_author = get_userdata($item->wp_user());
355
-        $gravatar = get_avatar($item->wp_user(), '15');
356
-        // filter link
357
-        $query_args = array(
358
-            'action'      => 'default',
359
-            'EVT_wp_user' => $item->wp_user(),
360
-        );
361
-        $filter_url = EE_Admin_Page::add_query_args_and_nonce($query_args, EVENTS_ADMIN_URL);
362
-        return $gravatar . '  <a href="' . $filter_url . '"'
363
-               . ' title="' . esc_attr__('Click to filter events by this author.', 'event_espresso') . '">'
364
-               . $event_author->display_name
365
-               . '</a>';
366
-    }
367
-
368
-
369
-    /**
370
-     * @param EE_Event $item
371
-     * @return string
372
-     * @throws EE_Error
373
-     */
374
-    public function column_venue(EE_Event $item)
375
-    {
376
-        $venue = $item->get_first_related('Venue');
377
-        return ! empty($venue)
378
-            ? $venue->name()
379
-            : '';
380
-    }
381
-
382
-
383
-    /**
384
-     * @param EE_Event $item
385
-     * @return string
386
-     * @throws EE_Error
387
-     */
388
-    public function column_start_date_time(EE_Event $item)
389
-    {
390
-        return $this->_dtt instanceof EE_Datetime
391
-            ? $this->_dtt->get_i18n_datetime('DTT_EVT_start')
392
-            : esc_html__('No Date was saved for this Event', 'event_espresso');
393
-    }
394
-
395
-
396
-    /**
397
-     * @param EE_Event $item
398
-     * @return string
399
-     * @throws EE_Error
400
-     */
401
-    public function column_reg_begins(EE_Event $item)
402
-    {
403
-        $reg_start = $item->get_ticket_with_earliest_start_time();
404
-        return $reg_start instanceof EE_Ticket
405
-            ? $reg_start->get_i18n_datetime('TKT_start_date')
406
-            : esc_html__('No Tickets have been setup for this Event', 'event_espresso');
407
-    }
408
-
409
-
410
-    /**
411
-     * @param EE_Event $item
412
-     * @return int|string
413
-     * @throws EE_Error
414
-     * @throws InvalidArgumentException
415
-     * @throws InvalidDataTypeException
416
-     * @throws InvalidInterfaceException
417
-     */
418
-    public function column_attendees(EE_Event $item)
419
-    {
420
-        $attendees_query_args = array(
421
-            'action'   => 'default',
422
-            'event_id' => $item->ID(),
423
-        );
424
-        $attendees_link = EE_Admin_Page::add_query_args_and_nonce($attendees_query_args, REG_ADMIN_URL);
425
-        $registered_attendees = EEM_Registration::instance()->get_event_registration_count($item->ID());
426
-        return EE_Registry::instance()->CAP->current_user_can(
427
-            'ee_read_event',
428
-            'espresso_registrations_view_registration',
429
-            $item->ID()
430
-        )
431
-               && EE_Registry::instance()->CAP->current_user_can(
432
-                   'ee_read_registrations',
433
-                   'espresso_registrations_view_registration'
434
-               )
435
-            ? '<a href="' . $attendees_link . '">' . $registered_attendees . '</a>'
436
-            : $registered_attendees;
437
-    }
438
-
439
-
440
-    /**
441
-     * @param EE_Event $item
442
-     * @return float
443
-     * @throws EE_Error
444
-     * @throws InvalidArgumentException
445
-     * @throws InvalidDataTypeException
446
-     * @throws InvalidInterfaceException
447
-     */
448
-    public function column_tkts_sold(EE_Event $item)
449
-    {
450
-        return EEM_Ticket::instance()->sum(array(array('Datetime.EVT_ID' => $item->ID())), 'TKT_sold');
451
-    }
452
-
453
-
454
-    /**
455
-     * @param EE_Event $item
456
-     * @return string
457
-     * @throws EE_Error
458
-     * @throws InvalidArgumentException
459
-     * @throws InvalidDataTypeException
460
-     * @throws InvalidInterfaceException
461
-     */
462
-    public function column_actions(EE_Event $item)
463
-    {
464
-        // todo: remove when attendees is active
465
-        if (! defined('REG_ADMIN_URL')) {
466
-            define('REG_ADMIN_URL', EVENTS_ADMIN_URL);
467
-        }
468
-        $action_links = array();
469
-        $view_link = get_permalink($item->ID());
470
-        $action_links[] = '<a href="' . $view_link . '"'
471
-                          . ' title="' . esc_attr__('View Event', 'event_espresso') . '" target="_blank">';
472
-        $action_links[] = '<div class="dashicons dashicons-search"></div></a>';
473
-        if (EE_Registry::instance()->CAP->current_user_can(
474
-            'ee_edit_event',
475
-            'espresso_events_edit',
476
-            $item->ID()
477
-        )) {
478
-            $edit_query_args = array(
479
-                'action' => 'edit',
480
-                'post'   => $item->ID(),
481
-            );
482
-            $edit_link = EE_Admin_Page::add_query_args_and_nonce($edit_query_args, EVENTS_ADMIN_URL);
483
-            $action_links[] = '<a href="' . $edit_link . '"'
484
-                              . ' title="' . esc_attr__('Edit Event', 'event_espresso') . '">'
485
-                              . '<div class="ee-icon ee-icon-calendar-edit"></div>'
486
-                              . '</a>';
487
-        }
488
-        if (EE_Registry::instance()->CAP->current_user_can(
489
-            'ee_read_registrations',
490
-            'espresso_registrations_view_registration'
491
-        ) && EE_Registry::instance()->CAP->current_user_can(
492
-            'ee_read_event',
493
-            'espresso_registrations_view_registration',
494
-            $item->ID()
495
-        )
496
-        ) {
497
-            $attendees_query_args = array(
498
-                'action'   => 'default',
499
-                'event_id' => $item->ID(),
500
-            );
501
-            $attendees_link = EE_Admin_Page::add_query_args_and_nonce($attendees_query_args, REG_ADMIN_URL);
502
-            $action_links[] = '<a href="' . $attendees_link . '"'
503
-                              . ' title="' . esc_attr__('View Registrants', 'event_espresso') . '">'
504
-                              . '<div class="dashicons dashicons-groups"></div>'
505
-                              . '</a>';
506
-        }
507
-        $action_links = apply_filters(
508
-            'FHEE__Events_Admin_List_Table__column_actions__action_links',
509
-            $action_links,
510
-            $item
511
-        );
512
-        return $this->_action_string(
513
-            implode("\n\t", $action_links),
514
-            $item,
515
-            'div'
516
-        );
517
-    }
18
+	/**
19
+	 * @var EE_Datetime
20
+	 */
21
+	private $_dtt;
22
+
23
+
24
+	/**
25
+	 * Initial setup of data properties for the list table.
26
+	 */
27
+	protected function _setup_data()
28
+	{
29
+		$this->_data = $this->_admin_page->get_events($this->_per_page, $this->_current_page);
30
+		$this->_all_data_count = $this->_admin_page->get_events(0, 0, true);
31
+	}
32
+
33
+
34
+	/**
35
+	 * Set up of additional properties for the list table.
36
+	 */
37
+	protected function _set_properties()
38
+	{
39
+		$this->_wp_list_args = array(
40
+			'singular' => esc_html__('event', 'event_espresso'),
41
+			'plural'   => esc_html__('events', 'event_espresso'),
42
+			'ajax'     => true, // for now
43
+			'screen'   => $this->_admin_page->get_current_screen()->id,
44
+		);
45
+		$this->_columns = array(
46
+			'cb'              => '<input type="checkbox" />',
47
+			'id'              => esc_html__('ID', 'event_espresso'),
48
+			'name'            => esc_html__('Name', 'event_espresso'),
49
+			'author'          => esc_html__('Author', 'event_espresso'),
50
+			'venue'           => esc_html__('Venue', 'event_espresso'),
51
+			'start_date_time' => esc_html__('Event Start', 'event_espresso'),
52
+			'reg_begins'      => esc_html__('On Sale', 'event_espresso'),
53
+			'attendees'       => '<span class="dashicons dashicons-groups ee-icon-color-ee-green ee-icon-size-20">'
54
+								 . '<span class="screen-reader-text">'
55
+								 . esc_html__('Approved Registrations', 'event_espresso')
56
+								 . '</span>'
57
+								 . '</span>',
58
+			// 'tkts_sold' => esc_html__('Tickets Sold', 'event_espresso'),
59
+			'actions'         => esc_html__('Actions', 'event_espresso'),
60
+		);
61
+		$this->_sortable_columns = array(
62
+			'id'              => array('EVT_ID' => true),
63
+			'name'            => array('EVT_name' => false),
64
+			'author'          => array('EVT_wp_user' => false),
65
+			'venue'           => array('Venue.VNU_name' => false),
66
+			'start_date_time' => array('Datetime.DTT_EVT_start' => false),
67
+			'reg_begins'      => array('Datetime.Ticket.TKT_start_date' => false),
68
+		);
69
+		$this->_primary_column = 'id';
70
+		$this->_hidden_columns = array('author');
71
+	}
72
+
73
+
74
+	/**
75
+	 * @return array
76
+	 */
77
+	protected function _get_table_filters()
78
+	{
79
+		return array(); // no filters with decaf
80
+	}
81
+
82
+
83
+	/**
84
+	 * Setup of views properties.
85
+	 *
86
+	 * @throws InvalidDataTypeException
87
+	 * @throws InvalidInterfaceException
88
+	 * @throws InvalidArgumentException
89
+	 */
90
+	protected function _add_view_counts()
91
+	{
92
+		$this->_views['all']['count'] = $this->_admin_page->total_events();
93
+		$this->_views['draft']['count'] = $this->_admin_page->total_events_draft();
94
+		if (EE_Registry::instance()->CAP->current_user_can(
95
+			'ee_delete_events',
96
+			'espresso_events_trash_events'
97
+		)) {
98
+			$this->_views['trash']['count'] = $this->_admin_page->total_trashed_events();
99
+		}
100
+	}
101
+
102
+
103
+	/**
104
+	 * @param EE_Event $item
105
+	 * @return string
106
+	 * @throws EE_Error
107
+	 */
108
+	protected function _get_row_class($item)
109
+	{
110
+		$class = parent::_get_row_class($item);
111
+		// add status class
112
+		$class .= $item instanceof EE_Event
113
+			? ' ee-status-strip event-status-' . $item->get_active_status()
114
+			: '';
115
+		if ($this->_has_checkbox_column) {
116
+			$class .= ' has-checkbox-column';
117
+		}
118
+		return $class;
119
+	}
120
+
121
+
122
+	/**
123
+	 * @param EE_Event $item
124
+	 * @return string
125
+	 * @throws EE_Error
126
+	 */
127
+	public function column_status(EE_Event $item)
128
+	{
129
+		return '<span class="ee-status-strip ee-status-strip-td event-status-'
130
+			   . $item->get_active_status()
131
+			   . '"></span>';
132
+	}
133
+
134
+
135
+	/**
136
+	 * @param  EE_Event $item
137
+	 * @return string
138
+	 * @throws EE_Error
139
+	 */
140
+	public function column_cb($item)
141
+	{
142
+		if (! $item instanceof EE_Event) {
143
+			return '';
144
+		}
145
+		$this->_dtt = $item->primary_datetime(); // set this for use in other columns
146
+		// does event have any attached registrations?
147
+		$regs = $item->count_related('Registration');
148
+		return $regs > 0 && $this->_view === 'trash'
149
+			? '<span class="ee-lock-icon"></span>'
150
+			: sprintf(
151
+				'<input type="checkbox" name="EVT_IDs[]" value="%s" />',
152
+				$item->ID()
153
+			);
154
+	}
155
+
156
+
157
+	/**
158
+	 * @param EE_Event $item
159
+	 * @return mixed|string
160
+	 * @throws EE_Error
161
+	 */
162
+	public function column_id(EE_Event $item)
163
+	{
164
+		$content = $item->ID();
165
+		$content .= '  <span class="show-on-mobile-view-only">' . $item->name() . '</span>';
166
+		return $content;
167
+	}
168
+
169
+
170
+	/**
171
+	 * @param EE_Event $item
172
+	 * @return string
173
+	 * @throws EE_Error
174
+	 * @throws InvalidArgumentException
175
+	 * @throws InvalidDataTypeException
176
+	 * @throws InvalidInterfaceException
177
+	 */
178
+	public function column_name(EE_Event $item)
179
+	{
180
+		$edit_query_args = array(
181
+			'action' => 'edit',
182
+			'post'   => $item->ID(),
183
+		);
184
+		$edit_link = EE_Admin_Page::add_query_args_and_nonce($edit_query_args, EVENTS_ADMIN_URL);
185
+		$actions = $this->_column_name_action_setup($item);
186
+		$status = ''; // $item->status() !== 'publish' ? ' (' . $item->status() . ')' : '';
187
+		$content = '<strong><a class="row-title" href="'
188
+				   . $edit_link . '">'
189
+				   . $item->name()
190
+				   . '</a></strong>'
191
+				   . $status;
192
+		$content .= '<br><span class="ee-status-text-small">'
193
+					. EEH_Template::pretty_status(
194
+						$item->get_active_status(),
195
+						false,
196
+						'sentence'
197
+					)
198
+					. '</span>';
199
+		$content .= $this->row_actions($actions);
200
+		return $content;
201
+	}
202
+
203
+
204
+	/**
205
+	 * Just a method for setting up the actions for the name column
206
+	 *
207
+	 * @param EE_Event $item
208
+	 * @return array array of actions
209
+	 * @throws EE_Error
210
+	 * @throws InvalidArgumentException
211
+	 * @throws InvalidDataTypeException
212
+	 * @throws InvalidInterfaceException
213
+	 */
214
+	protected function _column_name_action_setup(EE_Event $item)
215
+	{
216
+		// todo: remove when attendees is active
217
+		if (! defined('REG_ADMIN_URL')) {
218
+			define('REG_ADMIN_URL', EVENTS_ADMIN_URL);
219
+		}
220
+		$actions = array();
221
+		$restore_event_link = '';
222
+		$delete_event_link = '';
223
+		$trash_event_link = '';
224
+		if (EE_Registry::instance()->CAP->current_user_can(
225
+			'ee_edit_event',
226
+			'espresso_events_edit',
227
+			$item->ID()
228
+		)) {
229
+			$edit_query_args = array(
230
+				'action' => 'edit',
231
+				'post'   => $item->ID(),
232
+			);
233
+			$edit_link = EE_Admin_Page::add_query_args_and_nonce($edit_query_args, EVENTS_ADMIN_URL);
234
+			$actions['edit'] = '<a href="' . $edit_link . '"'
235
+							   . ' title="' . esc_attr__('Edit Event', 'event_espresso') . '">'
236
+							   . esc_html__('Edit', 'event_espresso')
237
+							   . '</a>';
238
+		}
239
+		if (EE_Registry::instance()->CAP->current_user_can(
240
+			'ee_read_registrations',
241
+			'espresso_registrations_view_registration'
242
+		)
243
+			&& EE_Registry::instance()->CAP->current_user_can(
244
+				'ee_read_event',
245
+				'espresso_registrations_view_registration',
246
+				$item->ID()
247
+			)
248
+		) {
249
+			$attendees_query_args = array(
250
+				'action'   => 'default',
251
+				'event_id' => $item->ID(),
252
+			);
253
+			$attendees_link = EE_Admin_Page::add_query_args_and_nonce($attendees_query_args, REG_ADMIN_URL);
254
+			$actions['attendees'] = '<a href="' . $attendees_link . '"'
255
+									. ' title="' . esc_attr__('View Registrations', 'event_espresso') . '">'
256
+									. esc_html__('Registrations', 'event_espresso')
257
+									. '</a>';
258
+		}
259
+		if (EE_Registry::instance()->CAP->current_user_can(
260
+			'ee_delete_event',
261
+			'espresso_events_trash_event',
262
+			$item->ID()
263
+		)) {
264
+			$trash_event_query_args = array(
265
+				'action' => 'trash_event',
266
+				'EVT_ID' => $item->ID(),
267
+			);
268
+			$trash_event_link = EE_Admin_Page::add_query_args_and_nonce(
269
+				$trash_event_query_args,
270
+				EVENTS_ADMIN_URL
271
+			);
272
+		}
273
+		if (EE_Registry::instance()->CAP->current_user_can(
274
+			'ee_delete_event',
275
+			'espresso_events_restore_event',
276
+			$item->ID()
277
+		)) {
278
+			$restore_event_query_args = array(
279
+				'action' => 'restore_event',
280
+				'EVT_ID' => $item->ID(),
281
+			);
282
+			$restore_event_link = EE_Admin_Page::add_query_args_and_nonce(
283
+				$restore_event_query_args,
284
+				EVENTS_ADMIN_URL
285
+			);
286
+		}
287
+		if (EE_Registry::instance()->CAP->current_user_can(
288
+			'ee_delete_event',
289
+			'espresso_events_delete_event',
290
+			$item->ID()
291
+		)) {
292
+			$delete_event_query_args = array(
293
+				'action' => 'delete_event',
294
+				'EVT_ID' => $item->ID(),
295
+			);
296
+			$delete_event_link = EE_Admin_Page::add_query_args_and_nonce(
297
+				$delete_event_query_args,
298
+				EVENTS_ADMIN_URL
299
+			);
300
+		}
301
+		$view_link = get_permalink($item->ID());
302
+		$actions['view'] = '<a href="' . $view_link . '"'
303
+						   . ' title="' . esc_attr__('View Event', 'event_espresso') . '">'
304
+						   . esc_html__('View', 'event_espresso')
305
+						   . '</a>';
306
+		if ($item->get('status') === 'trash') {
307
+			if (EE_Registry::instance()->CAP->current_user_can(
308
+				'ee_delete_event',
309
+				'espresso_events_restore_event',
310
+				$item->ID()
311
+			)) {
312
+				$actions['restore_from_trash'] = '<a href="' . $restore_event_link . '"'
313
+												 . ' title="' . esc_attr__('Restore from Trash', 'event_espresso')
314
+												 . '">'
315
+												 . esc_html__('Restore from Trash', 'event_espresso')
316
+												 . '</a>';
317
+			}
318
+			if ($item->count_related('Registration') === 0
319
+				&& EE_Registry::instance()->CAP->current_user_can(
320
+					'ee_delete_event',
321
+					'espresso_events_delete_event',
322
+					$item->ID()
323
+				)
324
+			) {
325
+				$actions['delete'] = '<a href="' . $delete_event_link . '"'
326
+									 . ' title="' . esc_attr__('Delete Permanently', 'event_espresso') . '">'
327
+									 . esc_html__('Delete Permanently', 'event_espresso')
328
+									 . '</a>';
329
+			}
330
+		} else {
331
+			if (EE_Registry::instance()->CAP->current_user_can(
332
+				'ee_delete_event',
333
+				'espresso_events_trash_event',
334
+				$item->ID()
335
+			)) {
336
+				$actions['move to trash'] = '<a href="' . $trash_event_link . '"'
337
+											. ' title="' . esc_attr__('Trash Event', 'event_espresso') . '">'
338
+											. esc_html__('Trash', 'event_espresso')
339
+											. '</a>';
340
+			}
341
+		}
342
+		return $actions;
343
+	}
344
+
345
+
346
+	/**
347
+	 * @param EE_Event $item
348
+	 * @return string
349
+	 * @throws EE_Error
350
+	 */
351
+	public function column_author(EE_Event $item)
352
+	{
353
+		// user author info
354
+		$event_author = get_userdata($item->wp_user());
355
+		$gravatar = get_avatar($item->wp_user(), '15');
356
+		// filter link
357
+		$query_args = array(
358
+			'action'      => 'default',
359
+			'EVT_wp_user' => $item->wp_user(),
360
+		);
361
+		$filter_url = EE_Admin_Page::add_query_args_and_nonce($query_args, EVENTS_ADMIN_URL);
362
+		return $gravatar . '  <a href="' . $filter_url . '"'
363
+			   . ' title="' . esc_attr__('Click to filter events by this author.', 'event_espresso') . '">'
364
+			   . $event_author->display_name
365
+			   . '</a>';
366
+	}
367
+
368
+
369
+	/**
370
+	 * @param EE_Event $item
371
+	 * @return string
372
+	 * @throws EE_Error
373
+	 */
374
+	public function column_venue(EE_Event $item)
375
+	{
376
+		$venue = $item->get_first_related('Venue');
377
+		return ! empty($venue)
378
+			? $venue->name()
379
+			: '';
380
+	}
381
+
382
+
383
+	/**
384
+	 * @param EE_Event $item
385
+	 * @return string
386
+	 * @throws EE_Error
387
+	 */
388
+	public function column_start_date_time(EE_Event $item)
389
+	{
390
+		return $this->_dtt instanceof EE_Datetime
391
+			? $this->_dtt->get_i18n_datetime('DTT_EVT_start')
392
+			: esc_html__('No Date was saved for this Event', 'event_espresso');
393
+	}
394
+
395
+
396
+	/**
397
+	 * @param EE_Event $item
398
+	 * @return string
399
+	 * @throws EE_Error
400
+	 */
401
+	public function column_reg_begins(EE_Event $item)
402
+	{
403
+		$reg_start = $item->get_ticket_with_earliest_start_time();
404
+		return $reg_start instanceof EE_Ticket
405
+			? $reg_start->get_i18n_datetime('TKT_start_date')
406
+			: esc_html__('No Tickets have been setup for this Event', 'event_espresso');
407
+	}
408
+
409
+
410
+	/**
411
+	 * @param EE_Event $item
412
+	 * @return int|string
413
+	 * @throws EE_Error
414
+	 * @throws InvalidArgumentException
415
+	 * @throws InvalidDataTypeException
416
+	 * @throws InvalidInterfaceException
417
+	 */
418
+	public function column_attendees(EE_Event $item)
419
+	{
420
+		$attendees_query_args = array(
421
+			'action'   => 'default',
422
+			'event_id' => $item->ID(),
423
+		);
424
+		$attendees_link = EE_Admin_Page::add_query_args_and_nonce($attendees_query_args, REG_ADMIN_URL);
425
+		$registered_attendees = EEM_Registration::instance()->get_event_registration_count($item->ID());
426
+		return EE_Registry::instance()->CAP->current_user_can(
427
+			'ee_read_event',
428
+			'espresso_registrations_view_registration',
429
+			$item->ID()
430
+		)
431
+			   && EE_Registry::instance()->CAP->current_user_can(
432
+				   'ee_read_registrations',
433
+				   'espresso_registrations_view_registration'
434
+			   )
435
+			? '<a href="' . $attendees_link . '">' . $registered_attendees . '</a>'
436
+			: $registered_attendees;
437
+	}
438
+
439
+
440
+	/**
441
+	 * @param EE_Event $item
442
+	 * @return float
443
+	 * @throws EE_Error
444
+	 * @throws InvalidArgumentException
445
+	 * @throws InvalidDataTypeException
446
+	 * @throws InvalidInterfaceException
447
+	 */
448
+	public function column_tkts_sold(EE_Event $item)
449
+	{
450
+		return EEM_Ticket::instance()->sum(array(array('Datetime.EVT_ID' => $item->ID())), 'TKT_sold');
451
+	}
452
+
453
+
454
+	/**
455
+	 * @param EE_Event $item
456
+	 * @return string
457
+	 * @throws EE_Error
458
+	 * @throws InvalidArgumentException
459
+	 * @throws InvalidDataTypeException
460
+	 * @throws InvalidInterfaceException
461
+	 */
462
+	public function column_actions(EE_Event $item)
463
+	{
464
+		// todo: remove when attendees is active
465
+		if (! defined('REG_ADMIN_URL')) {
466
+			define('REG_ADMIN_URL', EVENTS_ADMIN_URL);
467
+		}
468
+		$action_links = array();
469
+		$view_link = get_permalink($item->ID());
470
+		$action_links[] = '<a href="' . $view_link . '"'
471
+						  . ' title="' . esc_attr__('View Event', 'event_espresso') . '" target="_blank">';
472
+		$action_links[] = '<div class="dashicons dashicons-search"></div></a>';
473
+		if (EE_Registry::instance()->CAP->current_user_can(
474
+			'ee_edit_event',
475
+			'espresso_events_edit',
476
+			$item->ID()
477
+		)) {
478
+			$edit_query_args = array(
479
+				'action' => 'edit',
480
+				'post'   => $item->ID(),
481
+			);
482
+			$edit_link = EE_Admin_Page::add_query_args_and_nonce($edit_query_args, EVENTS_ADMIN_URL);
483
+			$action_links[] = '<a href="' . $edit_link . '"'
484
+							  . ' title="' . esc_attr__('Edit Event', 'event_espresso') . '">'
485
+							  . '<div class="ee-icon ee-icon-calendar-edit"></div>'
486
+							  . '</a>';
487
+		}
488
+		if (EE_Registry::instance()->CAP->current_user_can(
489
+			'ee_read_registrations',
490
+			'espresso_registrations_view_registration'
491
+		) && EE_Registry::instance()->CAP->current_user_can(
492
+			'ee_read_event',
493
+			'espresso_registrations_view_registration',
494
+			$item->ID()
495
+		)
496
+		) {
497
+			$attendees_query_args = array(
498
+				'action'   => 'default',
499
+				'event_id' => $item->ID(),
500
+			);
501
+			$attendees_link = EE_Admin_Page::add_query_args_and_nonce($attendees_query_args, REG_ADMIN_URL);
502
+			$action_links[] = '<a href="' . $attendees_link . '"'
503
+							  . ' title="' . esc_attr__('View Registrants', 'event_espresso') . '">'
504
+							  . '<div class="dashicons dashicons-groups"></div>'
505
+							  . '</a>';
506
+		}
507
+		$action_links = apply_filters(
508
+			'FHEE__Events_Admin_List_Table__column_actions__action_links',
509
+			$action_links,
510
+			$item
511
+		);
512
+		return $this->_action_string(
513
+			implode("\n\t", $action_links),
514
+			$item,
515
+			'div'
516
+		);
517
+	}
518 518
 }
Please login to merge, or discard this patch.
Spacing   +27 added lines, -27 removed lines patch added patch discarded remove patch
@@ -110,7 +110,7 @@  discard block
 block discarded – undo
110 110
         $class = parent::_get_row_class($item);
111 111
         // add status class
112 112
         $class .= $item instanceof EE_Event
113
-            ? ' ee-status-strip event-status-' . $item->get_active_status()
113
+            ? ' ee-status-strip event-status-'.$item->get_active_status()
114 114
             : '';
115 115
         if ($this->_has_checkbox_column) {
116 116
             $class .= ' has-checkbox-column';
@@ -139,7 +139,7 @@  discard block
 block discarded – undo
139 139
      */
140 140
     public function column_cb($item)
141 141
     {
142
-        if (! $item instanceof EE_Event) {
142
+        if ( ! $item instanceof EE_Event) {
143 143
             return '';
144 144
         }
145 145
         $this->_dtt = $item->primary_datetime(); // set this for use in other columns
@@ -162,7 +162,7 @@  discard block
 block discarded – undo
162 162
     public function column_id(EE_Event $item)
163 163
     {
164 164
         $content = $item->ID();
165
-        $content .= '  <span class="show-on-mobile-view-only">' . $item->name() . '</span>';
165
+        $content .= '  <span class="show-on-mobile-view-only">'.$item->name().'</span>';
166 166
         return $content;
167 167
     }
168 168
 
@@ -185,7 +185,7 @@  discard block
 block discarded – undo
185 185
         $actions = $this->_column_name_action_setup($item);
186 186
         $status = ''; // $item->status() !== 'publish' ? ' (' . $item->status() . ')' : '';
187 187
         $content = '<strong><a class="row-title" href="'
188
-                   . $edit_link . '">'
188
+                   . $edit_link.'">'
189 189
                    . $item->name()
190 190
                    . '</a></strong>'
191 191
                    . $status;
@@ -214,7 +214,7 @@  discard block
 block discarded – undo
214 214
     protected function _column_name_action_setup(EE_Event $item)
215 215
     {
216 216
         // todo: remove when attendees is active
217
-        if (! defined('REG_ADMIN_URL')) {
217
+        if ( ! defined('REG_ADMIN_URL')) {
218 218
             define('REG_ADMIN_URL', EVENTS_ADMIN_URL);
219 219
         }
220 220
         $actions = array();
@@ -231,8 +231,8 @@  discard block
 block discarded – undo
231 231
                 'post'   => $item->ID(),
232 232
             );
233 233
             $edit_link = EE_Admin_Page::add_query_args_and_nonce($edit_query_args, EVENTS_ADMIN_URL);
234
-            $actions['edit'] = '<a href="' . $edit_link . '"'
235
-                               . ' title="' . esc_attr__('Edit Event', 'event_espresso') . '">'
234
+            $actions['edit'] = '<a href="'.$edit_link.'"'
235
+                               . ' title="'.esc_attr__('Edit Event', 'event_espresso').'">'
236 236
                                . esc_html__('Edit', 'event_espresso')
237 237
                                . '</a>';
238 238
         }
@@ -251,8 +251,8 @@  discard block
 block discarded – undo
251 251
                 'event_id' => $item->ID(),
252 252
             );
253 253
             $attendees_link = EE_Admin_Page::add_query_args_and_nonce($attendees_query_args, REG_ADMIN_URL);
254
-            $actions['attendees'] = '<a href="' . $attendees_link . '"'
255
-                                    . ' title="' . esc_attr__('View Registrations', 'event_espresso') . '">'
254
+            $actions['attendees'] = '<a href="'.$attendees_link.'"'
255
+                                    . ' title="'.esc_attr__('View Registrations', 'event_espresso').'">'
256 256
                                     . esc_html__('Registrations', 'event_espresso')
257 257
                                     . '</a>';
258 258
         }
@@ -299,8 +299,8 @@  discard block
 block discarded – undo
299 299
             );
300 300
         }
301 301
         $view_link = get_permalink($item->ID());
302
-        $actions['view'] = '<a href="' . $view_link . '"'
303
-                           . ' title="' . esc_attr__('View Event', 'event_espresso') . '">'
302
+        $actions['view'] = '<a href="'.$view_link.'"'
303
+                           . ' title="'.esc_attr__('View Event', 'event_espresso').'">'
304 304
                            . esc_html__('View', 'event_espresso')
305 305
                            . '</a>';
306 306
         if ($item->get('status') === 'trash') {
@@ -309,8 +309,8 @@  discard block
 block discarded – undo
309 309
                 'espresso_events_restore_event',
310 310
                 $item->ID()
311 311
             )) {
312
-                $actions['restore_from_trash'] = '<a href="' . $restore_event_link . '"'
313
-                                                 . ' title="' . esc_attr__('Restore from Trash', 'event_espresso')
312
+                $actions['restore_from_trash'] = '<a href="'.$restore_event_link.'"'
313
+                                                 . ' title="'.esc_attr__('Restore from Trash', 'event_espresso')
314 314
                                                  . '">'
315 315
                                                  . esc_html__('Restore from Trash', 'event_espresso')
316 316
                                                  . '</a>';
@@ -322,8 +322,8 @@  discard block
 block discarded – undo
322 322
                     $item->ID()
323 323
                 )
324 324
             ) {
325
-                $actions['delete'] = '<a href="' . $delete_event_link . '"'
326
-                                     . ' title="' . esc_attr__('Delete Permanently', 'event_espresso') . '">'
325
+                $actions['delete'] = '<a href="'.$delete_event_link.'"'
326
+                                     . ' title="'.esc_attr__('Delete Permanently', 'event_espresso').'">'
327 327
                                      . esc_html__('Delete Permanently', 'event_espresso')
328 328
                                      . '</a>';
329 329
             }
@@ -333,8 +333,8 @@  discard block
 block discarded – undo
333 333
                 'espresso_events_trash_event',
334 334
                 $item->ID()
335 335
             )) {
336
-                $actions['move to trash'] = '<a href="' . $trash_event_link . '"'
337
-                                            . ' title="' . esc_attr__('Trash Event', 'event_espresso') . '">'
336
+                $actions['move to trash'] = '<a href="'.$trash_event_link.'"'
337
+                                            . ' title="'.esc_attr__('Trash Event', 'event_espresso').'">'
338 338
                                             . esc_html__('Trash', 'event_espresso')
339 339
                                             . '</a>';
340 340
             }
@@ -359,8 +359,8 @@  discard block
 block discarded – undo
359 359
             'EVT_wp_user' => $item->wp_user(),
360 360
         );
361 361
         $filter_url = EE_Admin_Page::add_query_args_and_nonce($query_args, EVENTS_ADMIN_URL);
362
-        return $gravatar . '  <a href="' . $filter_url . '"'
363
-               . ' title="' . esc_attr__('Click to filter events by this author.', 'event_espresso') . '">'
362
+        return $gravatar.'  <a href="'.$filter_url.'"'
363
+               . ' title="'.esc_attr__('Click to filter events by this author.', 'event_espresso').'">'
364 364
                . $event_author->display_name
365 365
                . '</a>';
366 366
     }
@@ -432,7 +432,7 @@  discard block
 block discarded – undo
432 432
                    'ee_read_registrations',
433 433
                    'espresso_registrations_view_registration'
434 434
                )
435
-            ? '<a href="' . $attendees_link . '">' . $registered_attendees . '</a>'
435
+            ? '<a href="'.$attendees_link.'">'.$registered_attendees.'</a>'
436 436
             : $registered_attendees;
437 437
     }
438 438
 
@@ -462,13 +462,13 @@  discard block
 block discarded – undo
462 462
     public function column_actions(EE_Event $item)
463 463
     {
464 464
         // todo: remove when attendees is active
465
-        if (! defined('REG_ADMIN_URL')) {
465
+        if ( ! defined('REG_ADMIN_URL')) {
466 466
             define('REG_ADMIN_URL', EVENTS_ADMIN_URL);
467 467
         }
468 468
         $action_links = array();
469 469
         $view_link = get_permalink($item->ID());
470
-        $action_links[] = '<a href="' . $view_link . '"'
471
-                          . ' title="' . esc_attr__('View Event', 'event_espresso') . '" target="_blank">';
470
+        $action_links[] = '<a href="'.$view_link.'"'
471
+                          . ' title="'.esc_attr__('View Event', 'event_espresso').'" target="_blank">';
472 472
         $action_links[] = '<div class="dashicons dashicons-search"></div></a>';
473 473
         if (EE_Registry::instance()->CAP->current_user_can(
474 474
             'ee_edit_event',
@@ -480,8 +480,8 @@  discard block
 block discarded – undo
480 480
                 'post'   => $item->ID(),
481 481
             );
482 482
             $edit_link = EE_Admin_Page::add_query_args_and_nonce($edit_query_args, EVENTS_ADMIN_URL);
483
-            $action_links[] = '<a href="' . $edit_link . '"'
484
-                              . ' title="' . esc_attr__('Edit Event', 'event_espresso') . '">'
483
+            $action_links[] = '<a href="'.$edit_link.'"'
484
+                              . ' title="'.esc_attr__('Edit Event', 'event_espresso').'">'
485 485
                               . '<div class="ee-icon ee-icon-calendar-edit"></div>'
486 486
                               . '</a>';
487 487
         }
@@ -499,8 +499,8 @@  discard block
 block discarded – undo
499 499
                 'event_id' => $item->ID(),
500 500
             );
501 501
             $attendees_link = EE_Admin_Page::add_query_args_and_nonce($attendees_query_args, REG_ADMIN_URL);
502
-            $action_links[] = '<a href="' . $attendees_link . '"'
503
-                              . ' title="' . esc_attr__('View Registrants', 'event_espresso') . '">'
502
+            $action_links[] = '<a href="'.$attendees_link.'"'
503
+                              . ' title="'.esc_attr__('View Registrants', 'event_espresso').'">'
504 504
                               . '<div class="dashicons dashicons-groups"></div>'
505 505
                               . '</a>';
506 506
         }
Please login to merge, or discard this patch.
core/services/orm/ModelFieldFactory.php 3 patches
Unused Use Statements   -3 removed lines patch added patch discarded remove patch
@@ -33,9 +33,6 @@
 block discarded – undo
33 33
 use EE_WP_Post_Status_Field;
34 34
 use EE_WP_Post_Type_Field;
35 35
 use EE_WP_User_Field;
36
-use EventEspresso\core\exceptions\InvalidDataTypeException;
37
-use EventEspresso\core\exceptions\InvalidInterfaceException;
38
-use EventEspresso\core\services\loaders\LoaderFactory;
39 36
 use EventEspresso\core\services\loaders\LoaderInterface;
40 37
 use InvalidArgumentException;
41 38
 
Please login to merge, or discard this patch.
Doc Comments   +4 added lines, -5 removed lines patch added patch discarded remove patch
@@ -125,7 +125,6 @@  discard block
 block discarded – undo
125 125
     /**
126 126
      * @param string $table_column
127 127
      * @param string $nice_name
128
-     * @param string $timezone_string
129 128
      * @param bool   $nullable
130 129
      * @param string $default_value
131 130
      * @throws EE_Error
@@ -170,7 +169,7 @@  discard block
 block discarded – undo
170 169
      * @param string $table_column
171 170
      * @param string $nice_name
172 171
      * @param bool   $nullable
173
-     * @param null   $default_value
172
+     * @param integer   $default_value
174 173
      * @return EE_DB_Only_Int_Field
175 174
      */
176 175
     public function createDbOnlyIntField($table_column, $nice_name, $nullable, $default_value = null)
@@ -280,7 +279,7 @@  discard block
 block discarded – undo
280 279
      * @param string $table_column
281 280
      * @param string $nice_name
282 281
      * @param bool   $nullable
283
-     * @param null   $default_value
282
+     * @param integer   $default_value
284 283
      * @param string $model_name
285 284
      * @return EE_Foreign_Key_Int_Field
286 285
      */
@@ -297,7 +296,7 @@  discard block
 block discarded – undo
297 296
      * @param string $table_column
298 297
      * @param string $nice_name
299 298
      * @param bool   $nullable
300
-     * @param null   $default_value
299
+     * @param string   $default_value
301 300
      * @param string $model_name
302 301
      * @return EE_Foreign_Key_String_Field
303 302
      */
@@ -533,7 +532,7 @@  discard block
 block discarded – undo
533 532
      * @param string $table_column
534 533
      * @param string $nice_name
535 534
      * @param bool   $nullable
536
-     * @param mixed  $default_value
535
+     * @param string  $default_value
537 536
      * @param array  $values                            If additional stati are to be used other than the default WP
538 537
      *                                                  statuses, then they can be registered via this property. The
539 538
      *                                                  format of the array should be as follows: array(
Please login to merge, or discard this patch.
Indentation   +543 added lines, -543 removed lines patch added patch discarded remove patch
@@ -51,547 +51,547 @@
 block discarded – undo
51 51
 class ModelFieldFactory
52 52
 {
53 53
 
54
-    /**
55
-     * @var LoaderInterface $loader
56
-     */
57
-    private $loader;
58
-
59
-
60
-    /**
61
-     * ModelFieldFactory constructor.
62
-     *
63
-     * @param LoaderInterface $loader
64
-     */
65
-    public function __construct(LoaderInterface $loader)
66
-    {
67
-        $this->loader = $loader;
68
-    }
69
-
70
-
71
-    /**
72
-     * @param string $table_column
73
-     * @param string $nice_name
74
-     * @param bool   $nullable
75
-     * @param null   $default_value
76
-     * @return EE_All_Caps_Text_Field
77
-     */
78
-    public function createAllCapsTextField($table_column, $nice_name, $nullable, $default_value = null)
79
-    {
80
-        return $this->loader->getNew(
81
-            'EE_All_Caps_Text_Field',
82
-            array($table_column, $nice_name, $nullable, $default_value)
83
-        );
84
-    }
85
-
86
-
87
-    /**
88
-     * @param string $table_column
89
-     * @param string $nice_name
90
-     * @param bool   $nullable
91
-     * @param null   $default_value
92
-     * @param string $model_name
93
-     * @return EE_Any_Foreign_Model_Name_Field
94
-     */
95
-    public function createAnyForeignModelNameField(
96
-        $table_column,
97
-        $nice_name,
98
-        $nullable,
99
-        $default_value = null,
100
-        $model_name
101
-    ) {
102
-        return $this->loader->getNew(
103
-            'EE_Any_Foreign_Model_Name_Field',
104
-            array($table_column, $nice_name, $nullable, $default_value, $model_name)
105
-        );
106
-    }
107
-
108
-
109
-    /**
110
-     * @param string $table_column
111
-     * @param string $nice_name
112
-     * @param bool   $nullable
113
-     * @param null   $default_value
114
-     * @return EE_Boolean_Field
115
-     */
116
-    public function createBooleanField($table_column, $nice_name, $nullable, $default_value = null)
117
-    {
118
-        return $this->loader->getNew(
119
-            'EE_Boolean_Field',
120
-            array($table_column, $nice_name, $nullable, $default_value)
121
-        );
122
-    }
123
-
124
-
125
-    /**
126
-     * @param string $table_column
127
-     * @param string $nice_name
128
-     * @param string $timezone_string
129
-     * @param bool   $nullable
130
-     * @param string $default_value
131
-     * @throws EE_Error
132
-     * @throws InvalidArgumentException
133
-     * @return EE_Datetime_Field
134
-     */
135
-    public function createDatetimeField(
136
-        $table_column,
137
-        $nice_name,
138
-        $nullable = false,
139
-        $default_value = EE_Datetime_Field::now
140
-    ) {
141
-        return $this->loader->getNew(
142
-            'EE_Datetime_Field',
143
-            array(
144
-                $table_column,
145
-                $nice_name,
146
-                $nullable,
147
-                $default_value,
148
-            )
149
-        );
150
-    }
151
-
152
-
153
-    /**
154
-     * @param string $table_column
155
-     * @param string $nice_name
156
-     * @param bool   $nullable
157
-     * @param null   $default_value
158
-     * @return EE_DB_Only_Float_Field
159
-     */
160
-    public function createDbOnlyFloatField($table_column, $nice_name, $nullable, $default_value = null)
161
-    {
162
-        return $this->loader->getNew(
163
-            'EE_DB_Only_Float_Field',
164
-            array($table_column, $nice_name, $nullable, $default_value)
165
-        );
166
-    }
167
-
168
-
169
-    /**
170
-     * @param string $table_column
171
-     * @param string $nice_name
172
-     * @param bool   $nullable
173
-     * @param null   $default_value
174
-     * @return EE_DB_Only_Int_Field
175
-     */
176
-    public function createDbOnlyIntField($table_column, $nice_name, $nullable, $default_value = null)
177
-    {
178
-        return $this->loader->getNew(
179
-            'EE_DB_Only_Int_Field',
180
-            array($table_column, $nice_name, $nullable, $default_value)
181
-        );
182
-    }
183
-
184
-
185
-    /**
186
-     * @param string $table_column
187
-     * @param string $nice_name
188
-     * @param bool   $nullable
189
-     * @param null   $default_value
190
-     * @return EE_DB_Only_Text_Field
191
-     */
192
-    public function createDbOnlyTextField($table_column, $nice_name, $nullable, $default_value = null)
193
-    {
194
-        return $this->loader->getNew(
195
-            'EE_DB_Only_Text_Field',
196
-            array($table_column, $nice_name, $nullable, $default_value)
197
-        );
198
-    }
199
-
200
-
201
-    /**
202
-     * @param string $table_column
203
-     * @param string $nice_name
204
-     * @param bool   $nullable
205
-     * @param string $default_value
206
-     * @return EE_Email_Field
207
-     */
208
-    public function createEmailField($table_column, $nice_name, $nullable = true, $default_value = '')
209
-    {
210
-        return $this->loader->getNew(
211
-            'EE_Email_Field',
212
-            array($table_column, $nice_name, $nullable, $default_value)
213
-        );
214
-    }
215
-
216
-
217
-    /**
218
-     * @param string $table_column
219
-     * @param string $nice_name
220
-     * @param bool   $nullable
221
-     * @param null   $default_value
222
-     * @param array  $allowed_enum_values keys are values to be used in the DB,
223
-     *                                    values are how they should be displayed
224
-     * @return EE_Enum_Integer_Field
225
-     */
226
-    public function createEnumIntegerField(
227
-        $table_column,
228
-        $nice_name,
229
-        $nullable,
230
-        $default_value = null,
231
-        array $allowed_enum_values
232
-    ) {
233
-        return $this->loader->getNew(
234
-            'EE_Enum_Integer_Field',
235
-            array($table_column, $nice_name, $nullable, $default_value, $allowed_enum_values)
236
-        );
237
-    }
238
-
239
-
240
-    /**
241
-     * @param string $table_column
242
-     * @param string $nice_name
243
-     * @param bool   $nullable
244
-     * @param null   $default_value
245
-     * @param array  $allowed_enum_values keys are values to be used in the DB,
246
-     *                                    values are how they should be displayed
247
-     * @return EE_Enum_Text_Field
248
-     */
249
-    public function createEnumTextField(
250
-        $table_column,
251
-        $nice_name,
252
-        $nullable,
253
-        $default_value,
254
-        array $allowed_enum_values
255
-    ) {
256
-        return $this->loader->getNew(
257
-            'EE_Enum_Text_Field',
258
-            array($table_column, $nice_name, $nullable, $default_value, $allowed_enum_values)
259
-        );
260
-    }
261
-
262
-
263
-    /**
264
-     * @param string $table_column
265
-     * @param string $nice_name
266
-     * @param bool   $nullable
267
-     * @param null   $default_value
268
-     * @return EE_Float_Field
269
-     */
270
-    public function createFloatField($table_column, $nice_name, $nullable, $default_value = null)
271
-    {
272
-        return $this->loader->getNew(
273
-            'EE_Float_Field',
274
-            array($table_column, $nice_name, $nullable, $default_value)
275
-        );
276
-    }
277
-
278
-
279
-    /**
280
-     * @param string $table_column
281
-     * @param string $nice_name
282
-     * @param bool   $nullable
283
-     * @param null   $default_value
284
-     * @param string $model_name
285
-     * @return EE_Foreign_Key_Int_Field
286
-     */
287
-    public function createForeignKeyIntField($table_column, $nice_name, $nullable, $default_value, $model_name)
288
-    {
289
-        return $this->loader->getNew(
290
-            'EE_Foreign_Key_Int_Field',
291
-            array($table_column, $nice_name, $nullable, $default_value, $model_name)
292
-        );
293
-    }
294
-
295
-
296
-    /**
297
-     * @param string $table_column
298
-     * @param string $nice_name
299
-     * @param bool   $nullable
300
-     * @param null   $default_value
301
-     * @param string $model_name
302
-     * @return EE_Foreign_Key_String_Field
303
-     */
304
-    public function createForeignKeyStringField(
305
-        $table_column,
306
-        $nice_name,
307
-        $nullable,
308
-        $default_value,
309
-        $model_name
310
-    ) {
311
-        return $this->loader->getNew(
312
-            'EE_Foreign_Key_String_Field',
313
-            array($table_column, $nice_name, $nullable, $default_value, $model_name)
314
-        );
315
-    }
316
-
317
-
318
-    /**
319
-     * @param string $table_column
320
-     * @param string $nice_name
321
-     * @param bool   $nullable
322
-     * @param null   $default_value
323
-     * @return EE_Full_HTML_Field
324
-     */
325
-    public function createFullHtmlField($table_column, $nice_name, $nullable, $default_value = null)
326
-    {
327
-        return $this->loader->getNew(
328
-            'EE_Full_HTML_Field',
329
-            array($table_column, $nice_name, $nullable, $default_value)
330
-        );
331
-    }
332
-
333
-
334
-    /**
335
-     * @param string $table_column
336
-     * @param string $nice_name
337
-     * @param bool   $nullable
338
-     * @param null   $default_value
339
-     * @return EE_Infinite_Integer_Field
340
-     */
341
-    public function createInfiniteIntegerField($table_column, $nice_name, $nullable, $default_value = null)
342
-    {
343
-        return $this->loader->getNew(
344
-            'EE_Infinite_Integer_Field',
345
-            array($table_column, $nice_name, $nullable, $default_value)
346
-        );
347
-    }
348
-
349
-
350
-    /**
351
-     * @param string  $table_column
352
-     * @param string  $nice_name
353
-     * @param bool    $nullable
354
-     * @param integer $default_value
355
-     * @return EE_Integer_Field
356
-     */
357
-    public function createIntegerField($table_column, $nice_name, $nullable = false, $default_value = 0)
358
-    {
359
-        return $this->loader->getNew(
360
-            'EE_Integer_Field',
361
-            array($table_column, $nice_name, $nullable, $default_value)
362
-        );
363
-    }
364
-
365
-
366
-    /**
367
-     * @param string $table_column
368
-     * @param string $nice_name
369
-     * @param bool   $nullable
370
-     * @param null   $default_value
371
-     * @return EE_Maybe_Serialized_Simple_HTML_Field
372
-     */
373
-    public function createMaybeSerializedSimpleHtmlField($table_column, $nice_name, $nullable, $default_value = null)
374
-    {
375
-        return $this->loader->getNew(
376
-            'EE_Maybe_Serialized_Simple_HTML_Field',
377
-            array($table_column, $nice_name, $nullable, $default_value)
378
-        );
379
-    }
380
-
381
-
382
-    /**
383
-     * @param string $table_column
384
-     * @param string $nice_name
385
-     * @param bool   $nullable
386
-     * @param null   $default_value
387
-     * @return EE_Maybe_Serialized_Text_Field
388
-     */
389
-    public function createMaybeSerializedTextField($table_column, $nice_name, $nullable, $default_value = null)
390
-    {
391
-        return $this->loader->getNew(
392
-            'EE_Maybe_Serialized_Text_Field',
393
-            array($table_column, $nice_name, $nullable, $default_value)
394
-        );
395
-    }
396
-
397
-
398
-    /**
399
-     * @param string $table_column
400
-     * @param string $nice_name
401
-     * @param bool   $nullable
402
-     * @param null   $default_value
403
-     * @return EE_Money_Field
404
-     */
405
-    public function createMoneyField($table_column, $nice_name, $nullable, $default_value = null)
406
-    {
407
-        return $this->loader->getNew(
408
-            'EE_Money_Field',
409
-            array($table_column, $nice_name, $nullable, $default_value)
410
-        );
411
-    }
412
-
413
-
414
-    /**
415
-     * @param string $table_column
416
-     * @param string $nice_name
417
-     * @param bool   $nullable
418
-     * @param string $default_value
419
-     * @return EE_Plain_Text_Field
420
-     */
421
-    public function createPlainTextField($table_column, $nice_name, $nullable = true, $default_value = '')
422
-    {
423
-        return $this->loader->getNew(
424
-            'EE_Plain_Text_Field',
425
-            array($table_column, $nice_name, $nullable, $default_value)
426
-        );
427
-    }
428
-
429
-
430
-    /**
431
-     * @param string $table_column
432
-     * @param string $nice_name
433
-     * @param bool   $nullable
434
-     * @param null   $default_value
435
-     * @return EE_Post_Content_Field
436
-     */
437
-    public function createPostContentField($table_column, $nice_name, $nullable, $default_value = null)
438
-    {
439
-        return $this->loader->getNew(
440
-            'EE_Post_Content_Field',
441
-            array($table_column, $nice_name, $nullable, $default_value)
442
-        );
443
-    }
444
-
445
-
446
-    /**
447
-     * @param string $table_column
448
-     * @param string $nice_name
449
-     * @return EE_Primary_Key_Int_Field
450
-     */
451
-    public function createPrimaryKeyIntField($table_column, $nice_name)
452
-    {
453
-        return $this->loader->getNew('EE_Primary_Key_Int_Field', array($table_column, $nice_name));
454
-    }
455
-
456
-
457
-    /**
458
-     * @param string $table_column
459
-     * @param string $nice_name
460
-     * @return EE_Primary_Key_String_Field
461
-     */
462
-    public function createPrimaryKeyStringField($table_column, $nice_name)
463
-    {
464
-        return $this->loader->getNew('EE_Primary_Key_String_Field', array($table_column, $nice_name));
465
-    }
466
-
467
-
468
-    /**
469
-     * @param string $table_column
470
-     * @param string $nice_name
471
-     * @param bool   $nullable
472
-     * @param null   $default_value
473
-     * @return EE_Serialized_Text_Field
474
-     */
475
-    public function createSerializedTextField($table_column, $nice_name, $nullable, $default_value = null)
476
-    {
477
-        return $this->loader->getNew(
478
-            'EE_Serialized_Text_Field',
479
-            array($table_column, $nice_name, $nullable, $default_value)
480
-        );
481
-    }
482
-
483
-
484
-    /**
485
-     * @param string $table_column
486
-     * @param string $nice_name
487
-     * @param bool   $nullable
488
-     * @param null   $default_value
489
-     * @return EE_Simple_HTML_Field
490
-     */
491
-    public function createSimpleHtmlField($table_column, $nice_name, $nullable, $default_value = null)
492
-    {
493
-        return $this->loader->getNew(
494
-            'EE_Simple_HTML_Field',
495
-            array($table_column, $nice_name, $nullable, $default_value)
496
-        );
497
-    }
498
-
499
-
500
-    /**
501
-     * @param string $table_column
502
-     * @param string $nice_name
503
-     * @param bool   $nullable
504
-     * @param null   $default_value
505
-     * @return EE_Slug_Field
506
-     */
507
-    public function createSlugField($table_column, $nice_name, $nullable = false, $default_value = null)
508
-    {
509
-        return $this->loader->getNew(
510
-            'EE_Slug_Field',
511
-            array($table_column, $nice_name, $nullable, $default_value)
512
-        );
513
-    }
514
-
515
-
516
-    /**
517
-     * @param string $table_column
518
-     * @param string $nice_name
519
-     * @param bool   $nullable
520
-     * @param null   $default_value
521
-     * @return EE_Trashed_Flag_Field
522
-     */
523
-    public function createTrashedFlagField($table_column, $nice_name, $nullable, $default_value = null)
524
-    {
525
-        return $this->loader->getNew(
526
-            'EE_Trashed_Flag_Field',
527
-            array($table_column, $nice_name, $nullable, $default_value)
528
-        );
529
-    }
530
-
531
-
532
-    /**
533
-     * @param string $table_column
534
-     * @param string $nice_name
535
-     * @param bool   $nullable
536
-     * @param mixed  $default_value
537
-     * @param array  $values                            If additional stati are to be used other than the default WP
538
-     *                                                  statuses, then they can be registered via this property. The
539
-     *                                                  format of the array should be as follows: array(
540
-     *                                                  'status_reference' => array(
541
-     *                                                  'label' => __('Status Reference Label', 'event_espresso'),
542
-     *                                                  'public' => true,                 // whether this status should
543
-     *                                                  be shown on the frontend of the site
544
-     *                                                  'exclude_from_search' => false,   // whether this status should
545
-     *                                                  be excluded from wp searches
546
-     *                                                  'show_in_admin_all_list' => true, // whether this status is
547
-     *                                                  included in queries for the admin "all" view in list table
548
-     *                                                  views.
549
-     *                                                  'show_in_admin_status_list' => true, // show in the list of
550
-     *                                                  statuses with post counts at the top of the admin list tables
551
-     *                                                  (i.e. Status Reference(2) )
552
-     *                                                  'label_count' => _n_noop(
553
-     *                                                  'Status Reference <span class="count">(%s)</span>',
554
-     *                                                  'Status References <span class="count">(%s)</span>'
555
-     *                                                  ),                                   // the text to display on
556
-     *                                                  the admin screen
557
-     *                                                  ( or you won't see your status count ).
558
-     *                                                  )
559
-     *                                                  )
560
-     * @link http://codex.wordpress.org/Function_Reference/register_post_status for more info
561
-     * @return EE_WP_Post_Status_Field
562
-     */
563
-    public function createWpPostStatusField(
564
-        $table_column,
565
-        $nice_name,
566
-        $nullable,
567
-        $default_value = null,
568
-        array $values = array()
569
-    ) {
570
-        return $this->loader->getNew(
571
-            'EE_WP_Post_Status_Field',
572
-            array($table_column, $nice_name, $nullable, $default_value, $values)
573
-        );
574
-    }
575
-
576
-
577
-    /**
578
-     * @param string $post_type
579
-     * @return EE_WP_Post_Type_Field
580
-     */
581
-    public function createWpPostTypeField($post_type)
582
-    {
583
-        return $this->loader->getNew('EE_WP_Post_Type_Field', array($post_type));
584
-    }
585
-
586
-
587
-    /**
588
-     * @param string $table_column
589
-     * @param string $nice_name
590
-     * @param bool   $nullable
591
-     * @return EE_WP_User_Field
592
-     */
593
-    public function createWpUserField($table_column, $nice_name, $nullable)
594
-    {
595
-        return $this->loader->getNew('EE_WP_User_Field', array($table_column, $nice_name, $nullable));
596
-    }
54
+	/**
55
+	 * @var LoaderInterface $loader
56
+	 */
57
+	private $loader;
58
+
59
+
60
+	/**
61
+	 * ModelFieldFactory constructor.
62
+	 *
63
+	 * @param LoaderInterface $loader
64
+	 */
65
+	public function __construct(LoaderInterface $loader)
66
+	{
67
+		$this->loader = $loader;
68
+	}
69
+
70
+
71
+	/**
72
+	 * @param string $table_column
73
+	 * @param string $nice_name
74
+	 * @param bool   $nullable
75
+	 * @param null   $default_value
76
+	 * @return EE_All_Caps_Text_Field
77
+	 */
78
+	public function createAllCapsTextField($table_column, $nice_name, $nullable, $default_value = null)
79
+	{
80
+		return $this->loader->getNew(
81
+			'EE_All_Caps_Text_Field',
82
+			array($table_column, $nice_name, $nullable, $default_value)
83
+		);
84
+	}
85
+
86
+
87
+	/**
88
+	 * @param string $table_column
89
+	 * @param string $nice_name
90
+	 * @param bool   $nullable
91
+	 * @param null   $default_value
92
+	 * @param string $model_name
93
+	 * @return EE_Any_Foreign_Model_Name_Field
94
+	 */
95
+	public function createAnyForeignModelNameField(
96
+		$table_column,
97
+		$nice_name,
98
+		$nullable,
99
+		$default_value = null,
100
+		$model_name
101
+	) {
102
+		return $this->loader->getNew(
103
+			'EE_Any_Foreign_Model_Name_Field',
104
+			array($table_column, $nice_name, $nullable, $default_value, $model_name)
105
+		);
106
+	}
107
+
108
+
109
+	/**
110
+	 * @param string $table_column
111
+	 * @param string $nice_name
112
+	 * @param bool   $nullable
113
+	 * @param null   $default_value
114
+	 * @return EE_Boolean_Field
115
+	 */
116
+	public function createBooleanField($table_column, $nice_name, $nullable, $default_value = null)
117
+	{
118
+		return $this->loader->getNew(
119
+			'EE_Boolean_Field',
120
+			array($table_column, $nice_name, $nullable, $default_value)
121
+		);
122
+	}
123
+
124
+
125
+	/**
126
+	 * @param string $table_column
127
+	 * @param string $nice_name
128
+	 * @param string $timezone_string
129
+	 * @param bool   $nullable
130
+	 * @param string $default_value
131
+	 * @throws EE_Error
132
+	 * @throws InvalidArgumentException
133
+	 * @return EE_Datetime_Field
134
+	 */
135
+	public function createDatetimeField(
136
+		$table_column,
137
+		$nice_name,
138
+		$nullable = false,
139
+		$default_value = EE_Datetime_Field::now
140
+	) {
141
+		return $this->loader->getNew(
142
+			'EE_Datetime_Field',
143
+			array(
144
+				$table_column,
145
+				$nice_name,
146
+				$nullable,
147
+				$default_value,
148
+			)
149
+		);
150
+	}
151
+
152
+
153
+	/**
154
+	 * @param string $table_column
155
+	 * @param string $nice_name
156
+	 * @param bool   $nullable
157
+	 * @param null   $default_value
158
+	 * @return EE_DB_Only_Float_Field
159
+	 */
160
+	public function createDbOnlyFloatField($table_column, $nice_name, $nullable, $default_value = null)
161
+	{
162
+		return $this->loader->getNew(
163
+			'EE_DB_Only_Float_Field',
164
+			array($table_column, $nice_name, $nullable, $default_value)
165
+		);
166
+	}
167
+
168
+
169
+	/**
170
+	 * @param string $table_column
171
+	 * @param string $nice_name
172
+	 * @param bool   $nullable
173
+	 * @param null   $default_value
174
+	 * @return EE_DB_Only_Int_Field
175
+	 */
176
+	public function createDbOnlyIntField($table_column, $nice_name, $nullable, $default_value = null)
177
+	{
178
+		return $this->loader->getNew(
179
+			'EE_DB_Only_Int_Field',
180
+			array($table_column, $nice_name, $nullable, $default_value)
181
+		);
182
+	}
183
+
184
+
185
+	/**
186
+	 * @param string $table_column
187
+	 * @param string $nice_name
188
+	 * @param bool   $nullable
189
+	 * @param null   $default_value
190
+	 * @return EE_DB_Only_Text_Field
191
+	 */
192
+	public function createDbOnlyTextField($table_column, $nice_name, $nullable, $default_value = null)
193
+	{
194
+		return $this->loader->getNew(
195
+			'EE_DB_Only_Text_Field',
196
+			array($table_column, $nice_name, $nullable, $default_value)
197
+		);
198
+	}
199
+
200
+
201
+	/**
202
+	 * @param string $table_column
203
+	 * @param string $nice_name
204
+	 * @param bool   $nullable
205
+	 * @param string $default_value
206
+	 * @return EE_Email_Field
207
+	 */
208
+	public function createEmailField($table_column, $nice_name, $nullable = true, $default_value = '')
209
+	{
210
+		return $this->loader->getNew(
211
+			'EE_Email_Field',
212
+			array($table_column, $nice_name, $nullable, $default_value)
213
+		);
214
+	}
215
+
216
+
217
+	/**
218
+	 * @param string $table_column
219
+	 * @param string $nice_name
220
+	 * @param bool   $nullable
221
+	 * @param null   $default_value
222
+	 * @param array  $allowed_enum_values keys are values to be used in the DB,
223
+	 *                                    values are how they should be displayed
224
+	 * @return EE_Enum_Integer_Field
225
+	 */
226
+	public function createEnumIntegerField(
227
+		$table_column,
228
+		$nice_name,
229
+		$nullable,
230
+		$default_value = null,
231
+		array $allowed_enum_values
232
+	) {
233
+		return $this->loader->getNew(
234
+			'EE_Enum_Integer_Field',
235
+			array($table_column, $nice_name, $nullable, $default_value, $allowed_enum_values)
236
+		);
237
+	}
238
+
239
+
240
+	/**
241
+	 * @param string $table_column
242
+	 * @param string $nice_name
243
+	 * @param bool   $nullable
244
+	 * @param null   $default_value
245
+	 * @param array  $allowed_enum_values keys are values to be used in the DB,
246
+	 *                                    values are how they should be displayed
247
+	 * @return EE_Enum_Text_Field
248
+	 */
249
+	public function createEnumTextField(
250
+		$table_column,
251
+		$nice_name,
252
+		$nullable,
253
+		$default_value,
254
+		array $allowed_enum_values
255
+	) {
256
+		return $this->loader->getNew(
257
+			'EE_Enum_Text_Field',
258
+			array($table_column, $nice_name, $nullable, $default_value, $allowed_enum_values)
259
+		);
260
+	}
261
+
262
+
263
+	/**
264
+	 * @param string $table_column
265
+	 * @param string $nice_name
266
+	 * @param bool   $nullable
267
+	 * @param null   $default_value
268
+	 * @return EE_Float_Field
269
+	 */
270
+	public function createFloatField($table_column, $nice_name, $nullable, $default_value = null)
271
+	{
272
+		return $this->loader->getNew(
273
+			'EE_Float_Field',
274
+			array($table_column, $nice_name, $nullable, $default_value)
275
+		);
276
+	}
277
+
278
+
279
+	/**
280
+	 * @param string $table_column
281
+	 * @param string $nice_name
282
+	 * @param bool   $nullable
283
+	 * @param null   $default_value
284
+	 * @param string $model_name
285
+	 * @return EE_Foreign_Key_Int_Field
286
+	 */
287
+	public function createForeignKeyIntField($table_column, $nice_name, $nullable, $default_value, $model_name)
288
+	{
289
+		return $this->loader->getNew(
290
+			'EE_Foreign_Key_Int_Field',
291
+			array($table_column, $nice_name, $nullable, $default_value, $model_name)
292
+		);
293
+	}
294
+
295
+
296
+	/**
297
+	 * @param string $table_column
298
+	 * @param string $nice_name
299
+	 * @param bool   $nullable
300
+	 * @param null   $default_value
301
+	 * @param string $model_name
302
+	 * @return EE_Foreign_Key_String_Field
303
+	 */
304
+	public function createForeignKeyStringField(
305
+		$table_column,
306
+		$nice_name,
307
+		$nullable,
308
+		$default_value,
309
+		$model_name
310
+	) {
311
+		return $this->loader->getNew(
312
+			'EE_Foreign_Key_String_Field',
313
+			array($table_column, $nice_name, $nullable, $default_value, $model_name)
314
+		);
315
+	}
316
+
317
+
318
+	/**
319
+	 * @param string $table_column
320
+	 * @param string $nice_name
321
+	 * @param bool   $nullable
322
+	 * @param null   $default_value
323
+	 * @return EE_Full_HTML_Field
324
+	 */
325
+	public function createFullHtmlField($table_column, $nice_name, $nullable, $default_value = null)
326
+	{
327
+		return $this->loader->getNew(
328
+			'EE_Full_HTML_Field',
329
+			array($table_column, $nice_name, $nullable, $default_value)
330
+		);
331
+	}
332
+
333
+
334
+	/**
335
+	 * @param string $table_column
336
+	 * @param string $nice_name
337
+	 * @param bool   $nullable
338
+	 * @param null   $default_value
339
+	 * @return EE_Infinite_Integer_Field
340
+	 */
341
+	public function createInfiniteIntegerField($table_column, $nice_name, $nullable, $default_value = null)
342
+	{
343
+		return $this->loader->getNew(
344
+			'EE_Infinite_Integer_Field',
345
+			array($table_column, $nice_name, $nullable, $default_value)
346
+		);
347
+	}
348
+
349
+
350
+	/**
351
+	 * @param string  $table_column
352
+	 * @param string  $nice_name
353
+	 * @param bool    $nullable
354
+	 * @param integer $default_value
355
+	 * @return EE_Integer_Field
356
+	 */
357
+	public function createIntegerField($table_column, $nice_name, $nullable = false, $default_value = 0)
358
+	{
359
+		return $this->loader->getNew(
360
+			'EE_Integer_Field',
361
+			array($table_column, $nice_name, $nullable, $default_value)
362
+		);
363
+	}
364
+
365
+
366
+	/**
367
+	 * @param string $table_column
368
+	 * @param string $nice_name
369
+	 * @param bool   $nullable
370
+	 * @param null   $default_value
371
+	 * @return EE_Maybe_Serialized_Simple_HTML_Field
372
+	 */
373
+	public function createMaybeSerializedSimpleHtmlField($table_column, $nice_name, $nullable, $default_value = null)
374
+	{
375
+		return $this->loader->getNew(
376
+			'EE_Maybe_Serialized_Simple_HTML_Field',
377
+			array($table_column, $nice_name, $nullable, $default_value)
378
+		);
379
+	}
380
+
381
+
382
+	/**
383
+	 * @param string $table_column
384
+	 * @param string $nice_name
385
+	 * @param bool   $nullable
386
+	 * @param null   $default_value
387
+	 * @return EE_Maybe_Serialized_Text_Field
388
+	 */
389
+	public function createMaybeSerializedTextField($table_column, $nice_name, $nullable, $default_value = null)
390
+	{
391
+		return $this->loader->getNew(
392
+			'EE_Maybe_Serialized_Text_Field',
393
+			array($table_column, $nice_name, $nullable, $default_value)
394
+		);
395
+	}
396
+
397
+
398
+	/**
399
+	 * @param string $table_column
400
+	 * @param string $nice_name
401
+	 * @param bool   $nullable
402
+	 * @param null   $default_value
403
+	 * @return EE_Money_Field
404
+	 */
405
+	public function createMoneyField($table_column, $nice_name, $nullable, $default_value = null)
406
+	{
407
+		return $this->loader->getNew(
408
+			'EE_Money_Field',
409
+			array($table_column, $nice_name, $nullable, $default_value)
410
+		);
411
+	}
412
+
413
+
414
+	/**
415
+	 * @param string $table_column
416
+	 * @param string $nice_name
417
+	 * @param bool   $nullable
418
+	 * @param string $default_value
419
+	 * @return EE_Plain_Text_Field
420
+	 */
421
+	public function createPlainTextField($table_column, $nice_name, $nullable = true, $default_value = '')
422
+	{
423
+		return $this->loader->getNew(
424
+			'EE_Plain_Text_Field',
425
+			array($table_column, $nice_name, $nullable, $default_value)
426
+		);
427
+	}
428
+
429
+
430
+	/**
431
+	 * @param string $table_column
432
+	 * @param string $nice_name
433
+	 * @param bool   $nullable
434
+	 * @param null   $default_value
435
+	 * @return EE_Post_Content_Field
436
+	 */
437
+	public function createPostContentField($table_column, $nice_name, $nullable, $default_value = null)
438
+	{
439
+		return $this->loader->getNew(
440
+			'EE_Post_Content_Field',
441
+			array($table_column, $nice_name, $nullable, $default_value)
442
+		);
443
+	}
444
+
445
+
446
+	/**
447
+	 * @param string $table_column
448
+	 * @param string $nice_name
449
+	 * @return EE_Primary_Key_Int_Field
450
+	 */
451
+	public function createPrimaryKeyIntField($table_column, $nice_name)
452
+	{
453
+		return $this->loader->getNew('EE_Primary_Key_Int_Field', array($table_column, $nice_name));
454
+	}
455
+
456
+
457
+	/**
458
+	 * @param string $table_column
459
+	 * @param string $nice_name
460
+	 * @return EE_Primary_Key_String_Field
461
+	 */
462
+	public function createPrimaryKeyStringField($table_column, $nice_name)
463
+	{
464
+		return $this->loader->getNew('EE_Primary_Key_String_Field', array($table_column, $nice_name));
465
+	}
466
+
467
+
468
+	/**
469
+	 * @param string $table_column
470
+	 * @param string $nice_name
471
+	 * @param bool   $nullable
472
+	 * @param null   $default_value
473
+	 * @return EE_Serialized_Text_Field
474
+	 */
475
+	public function createSerializedTextField($table_column, $nice_name, $nullable, $default_value = null)
476
+	{
477
+		return $this->loader->getNew(
478
+			'EE_Serialized_Text_Field',
479
+			array($table_column, $nice_name, $nullable, $default_value)
480
+		);
481
+	}
482
+
483
+
484
+	/**
485
+	 * @param string $table_column
486
+	 * @param string $nice_name
487
+	 * @param bool   $nullable
488
+	 * @param null   $default_value
489
+	 * @return EE_Simple_HTML_Field
490
+	 */
491
+	public function createSimpleHtmlField($table_column, $nice_name, $nullable, $default_value = null)
492
+	{
493
+		return $this->loader->getNew(
494
+			'EE_Simple_HTML_Field',
495
+			array($table_column, $nice_name, $nullable, $default_value)
496
+		);
497
+	}
498
+
499
+
500
+	/**
501
+	 * @param string $table_column
502
+	 * @param string $nice_name
503
+	 * @param bool   $nullable
504
+	 * @param null   $default_value
505
+	 * @return EE_Slug_Field
506
+	 */
507
+	public function createSlugField($table_column, $nice_name, $nullable = false, $default_value = null)
508
+	{
509
+		return $this->loader->getNew(
510
+			'EE_Slug_Field',
511
+			array($table_column, $nice_name, $nullable, $default_value)
512
+		);
513
+	}
514
+
515
+
516
+	/**
517
+	 * @param string $table_column
518
+	 * @param string $nice_name
519
+	 * @param bool   $nullable
520
+	 * @param null   $default_value
521
+	 * @return EE_Trashed_Flag_Field
522
+	 */
523
+	public function createTrashedFlagField($table_column, $nice_name, $nullable, $default_value = null)
524
+	{
525
+		return $this->loader->getNew(
526
+			'EE_Trashed_Flag_Field',
527
+			array($table_column, $nice_name, $nullable, $default_value)
528
+		);
529
+	}
530
+
531
+
532
+	/**
533
+	 * @param string $table_column
534
+	 * @param string $nice_name
535
+	 * @param bool   $nullable
536
+	 * @param mixed  $default_value
537
+	 * @param array  $values                            If additional stati are to be used other than the default WP
538
+	 *                                                  statuses, then they can be registered via this property. The
539
+	 *                                                  format of the array should be as follows: array(
540
+	 *                                                  'status_reference' => array(
541
+	 *                                                  'label' => __('Status Reference Label', 'event_espresso'),
542
+	 *                                                  'public' => true,                 // whether this status should
543
+	 *                                                  be shown on the frontend of the site
544
+	 *                                                  'exclude_from_search' => false,   // whether this status should
545
+	 *                                                  be excluded from wp searches
546
+	 *                                                  'show_in_admin_all_list' => true, // whether this status is
547
+	 *                                                  included in queries for the admin "all" view in list table
548
+	 *                                                  views.
549
+	 *                                                  'show_in_admin_status_list' => true, // show in the list of
550
+	 *                                                  statuses with post counts at the top of the admin list tables
551
+	 *                                                  (i.e. Status Reference(2) )
552
+	 *                                                  'label_count' => _n_noop(
553
+	 *                                                  'Status Reference <span class="count">(%s)</span>',
554
+	 *                                                  'Status References <span class="count">(%s)</span>'
555
+	 *                                                  ),                                   // the text to display on
556
+	 *                                                  the admin screen
557
+	 *                                                  ( or you won't see your status count ).
558
+	 *                                                  )
559
+	 *                                                  )
560
+	 * @link http://codex.wordpress.org/Function_Reference/register_post_status for more info
561
+	 * @return EE_WP_Post_Status_Field
562
+	 */
563
+	public function createWpPostStatusField(
564
+		$table_column,
565
+		$nice_name,
566
+		$nullable,
567
+		$default_value = null,
568
+		array $values = array()
569
+	) {
570
+		return $this->loader->getNew(
571
+			'EE_WP_Post_Status_Field',
572
+			array($table_column, $nice_name, $nullable, $default_value, $values)
573
+		);
574
+	}
575
+
576
+
577
+	/**
578
+	 * @param string $post_type
579
+	 * @return EE_WP_Post_Type_Field
580
+	 */
581
+	public function createWpPostTypeField($post_type)
582
+	{
583
+		return $this->loader->getNew('EE_WP_Post_Type_Field', array($post_type));
584
+	}
585
+
586
+
587
+	/**
588
+	 * @param string $table_column
589
+	 * @param string $nice_name
590
+	 * @param bool   $nullable
591
+	 * @return EE_WP_User_Field
592
+	 */
593
+	public function createWpUserField($table_column, $nice_name, $nullable)
594
+	{
595
+		return $this->loader->getNew('EE_WP_User_Field', array($table_column, $nice_name, $nullable));
596
+	}
597 597
 }
Please login to merge, or discard this patch.