Completed
Branch dependabot/composer/wp-graphql... (5a0e42)
by
unknown
18:09 queued 13:06
created
Paypal_Pro/help_tabs/payment_methods_overview_paypalpro.help_tab.php 1 patch
Indentation   +39 added lines, -39 removed lines patch added patch discarded remove patch
@@ -2,12 +2,12 @@  discard block
 block discarded – undo
2 2
 <p><?php esc_html_e('Adjust the settings for the PayPal Pro payment gateway.', 'event_espresso'); ?></p>
3 3
 <p>
4 4
     <?php
5
-    printf(
6
-        esc_html__('See %1$shere%2$s for list of currencies supported by Paypal Pro.', 'event_espresso'),
7
-        "<a href='https://www.paypal.com/multicurrency' target='_blank' rel='noopener noreferrer'>",
8
-        "</a>"
9
-    );
10
-    ?>
5
+	printf(
6
+		esc_html__('See %1$shere%2$s for list of currencies supported by Paypal Pro.', 'event_espresso'),
7
+		"<a href='https://www.paypal.com/multicurrency' target='_blank' rel='noopener noreferrer'>",
8
+		"</a>"
9
+	);
10
+	?>
11 11
 </p>
12 12
 <p><strong><?php esc_html_e('PayPal Pro Settings', 'event_espresso'); ?></strong></p>
13 13
 <ul>
@@ -18,48 +18,48 @@  discard block
 block discarded – undo
18 18
     <li>
19 19
         <strong><?php esc_html_e('PayPal API Username', 'event_espresso'); ?></strong><br/>
20 20
         <?php
21
-        printf(
22
-            esc_html__(
23
-                'Enter your API Username for PayPal. Learn how to find your %1$sAPI Username%2$s.',
24
-                'event_espresso'
25
-            ),
26
-            '<a href="https://www.paypal.com/us/cgi-bin/webscr?cmd=xpt/cps/merchant/wppro/WPProIntegrationSteps-outside#SectionB" target="_blank" rel="noopener noreferrer">',
27
-            '</a>'
28
-        );
29
-        ?>
21
+		printf(
22
+			esc_html__(
23
+				'Enter your API Username for PayPal. Learn how to find your %1$sAPI Username%2$s.',
24
+				'event_espresso'
25
+			),
26
+			'<a href="https://www.paypal.com/us/cgi-bin/webscr?cmd=xpt/cps/merchant/wppro/WPProIntegrationSteps-outside#SectionB" target="_blank" rel="noopener noreferrer">',
27
+			'</a>'
28
+		);
29
+		?>
30 30
     </li>
31 31
     <li>
32 32
         <strong><?php esc_html_e('PayPal API Password', 'event_espresso'); ?></strong><br/>
33 33
         <?php
34
-        printf(
35
-            esc_html__(
36
-                'Enter your API Password for PayPal. Learn how to find your %1$sAPI Password%2$s.',
37
-                'event_espresso'
38
-            ),
39
-            '<a href="https://www.paypal.com/us/cgi-bin/webscr?cmd=xpt/cps/merchant/wppro/WPProIntegrationSteps-outside#SectionB" target="_blank" rel="noopener noreferrer">',
40
-            '</a>'
41
-        );
42
-        ?>
34
+		printf(
35
+			esc_html__(
36
+				'Enter your API Password for PayPal. Learn how to find your %1$sAPI Password%2$s.',
37
+				'event_espresso'
38
+			),
39
+			'<a href="https://www.paypal.com/us/cgi-bin/webscr?cmd=xpt/cps/merchant/wppro/WPProIntegrationSteps-outside#SectionB" target="_blank" rel="noopener noreferrer">',
40
+			'</a>'
41
+		);
42
+		?>
43 43
     </li>
44 44
     <li>
45 45
         <strong><?php esc_html_e('PayPal API Signature', 'event_espresso'); ?></strong><br/>
46 46
         <?php
47
-        printf(
48
-            esc_html__(
49
-                'Enter your API Signature for PayPal. Learn how to find your %1$sAPI Signature%2$s.',
50
-                'event_espresso'
51
-            ),
52
-            '<a href="https://www.paypal.com/us/cgi-bin/webscr?cmd=xpt/cps/merchant/wppro/WPProIntegrationSteps-outside#SectionB" target="_blank" rel="noopener noreferrer">',
53
-            '</a>'
54
-        );
55
-        ?>
47
+		printf(
48
+			esc_html__(
49
+				'Enter your API Signature for PayPal. Learn how to find your %1$sAPI Signature%2$s.',
50
+				'event_espresso'
51
+			),
52
+			'<a href="https://www.paypal.com/us/cgi-bin/webscr?cmd=xpt/cps/merchant/wppro/WPProIntegrationSteps-outside#SectionB" target="_blank" rel="noopener noreferrer">',
53
+			'</a>'
54
+		);
55
+		?>
56 56
     </li>
57 57
     <li>
58 58
         <strong><?php esc_html_e('Country Currency', 'event_espresso'); ?></strong><br/>
59 59
         <?php esc_html_e(
60
-            'Select the currency for your country. Payments will be accepted in this currency.',
61
-            'event_espresso'
62
-        ); ?>
60
+			'Select the currency for your country. Payments will be accepted in this currency.',
61
+			'event_espresso'
62
+		); ?>
63 63
     </li>
64 64
     <li>
65 65
         <strong><?php esc_html_e('Accepted Card Types', 'event_espresso'); ?></strong><br/>
@@ -68,9 +68,9 @@  discard block
 block discarded – undo
68 68
     <li>
69 69
         <strong><?php esc_html_e('Use the Debugging Feature and the PayPal Sandbox', 'event_espresso'); ?></strong><br/>
70 70
         <?php esc_html_e(
71
-            'Specify if you want to test the payment gateway by submitting a test transaction. If this option is enabled, be sure to enter your PayPal sandbox credentials in the fields above. Be sure to turn this setting off when you are done testing.',
72
-            'event_espresso'
73
-        ); ?>
71
+			'Specify if you want to test the payment gateway by submitting a test transaction. If this option is enabled, be sure to enter your PayPal sandbox credentials in the fields above. Be sure to turn this setting off when you are done testing.',
72
+			'event_espresso'
73
+		); ?>
74 74
     </li>
75 75
     <li>
76 76
         <strong><?php esc_html_e('Button Image URL', 'event_espresso'); ?></strong><br/>
Please login to merge, or discard this patch.
admin_pages/messages/help_tabs/messages_overview_types.help_tab.php 1 patch
Indentation   +18 added lines, -18 removed lines patch added patch discarded remove patch
@@ -1,15 +1,15 @@  discard block
 block discarded – undo
1 1
 <p><strong><?php esc_html_e('Message Types', 'event_espresso'); ?></strong></p>
2 2
 <p>
3 3
     <?php
4
-    printf(
5
-        esc_html__(
6
-            'Messages are email notifications that are sent out by Event Espresso. Message Types are the %1$skinds%2$s of messages that get delivered.  They can be thought of as the "type" of package that is being delivered by the messenger. For example, Event Espresso comes with two Message Types attached to the Email Messenger:',
7
-            'event_espresso'
8
-        ),
9
-        '<em>',
10
-        '</em>'
11
-    );
12
-    ?>
4
+	printf(
5
+		esc_html__(
6
+			'Messages are email notifications that are sent out by Event Espresso. Message Types are the %1$skinds%2$s of messages that get delivered.  They can be thought of as the "type" of package that is being delivered by the messenger. For example, Event Espresso comes with two Message Types attached to the Email Messenger:',
7
+			'event_espresso'
8
+		),
9
+		'<em>',
10
+		'</em>'
11
+	);
12
+	?>
13 13
 </p>
14 14
 <ul>
15 15
     <li>
@@ -24,20 +24,20 @@  discard block
 block discarded – undo
24 24
 <p><strong><?php esc_html_e('Contexts', 'event_espresso'); ?></strong></p>
25 25
 <p>
26 26
     <?php esc_html_e(
27
-        'Each Message Type (kind of message) has different contexts. Contexts are dynamic and typically represent recipients (individuals receiving email notifications). For example, when the Registration Confirmation message type is triggered, it will send out a message to the following recipients: Event Administrator, Primary Registrant, and Additional Registrants. On the other hand, the Payment Message Type has only two recipients: Event Administrator and Primary Registrant.',
28
-        'event_espresso'
29
-    ); ?>
27
+		'Each Message Type (kind of message) has different contexts. Contexts are dynamic and typically represent recipients (individuals receiving email notifications). For example, when the Registration Confirmation message type is triggered, it will send out a message to the following recipients: Event Administrator, Primary Registrant, and Additional Registrants. On the other hand, the Payment Message Type has only two recipients: Event Administrator and Primary Registrant.',
28
+		'event_espresso'
29
+	); ?>
30 30
 </p>
31 31
 <p>
32 32
     <?php esc_html_e(
33
-        'A message context can be deactivated by removing a recipient from the "TO" field. This will set the field to blank and you can save changes. Deactivated message contexts will appear in grey when viewed in the Messages Overview tab. To re-activate a message context, go to that message context and setup a recipient (using one of the available shortcodes) and save changes. This will reactivate the message context and it will appear as blue in the Messages Overview tab.',
34
-        'event_espresso'
35
-    ); ?>
33
+		'A message context can be deactivated by removing a recipient from the "TO" field. This will set the field to blank and you can save changes. Deactivated message contexts will appear in grey when viewed in the Messages Overview tab. To re-activate a message context, go to that message context and setup a recipient (using one of the available shortcodes) and save changes. This will reactivate the message context and it will appear as blue in the Messages Overview tab.',
34
+		'event_espresso'
35
+	); ?>
36 36
 </p>
37 37
 <p><strong><?php esc_html_e('Activation / Deactivation of Message Types', 'event_espresso'); ?></strong></p>
38 38
 <p>
39 39
     <?php esc_html_e(
40
-        'When a new install of Event Espresso is activated, all message types will be activated except for those for Cancelled and Declined registrations. The message types for Cancelled and Declined registrations can be easily activated through the Settings tab for Messages. Deactivating and re-activating Event Espresso will keep the current settings saved.',
41
-        'event_espresso'
42
-    ); ?>
40
+		'When a new install of Event Espresso is activated, all message types will be activated except for those for Cancelled and Declined registrations. The message types for Cancelled and Declined registrations can be easily activated through the Settings tab for Messages. Deactivating and re-activating Event Espresso will keep the current settings saved.',
41
+		'event_espresso'
42
+	); ?>
43 43
 </p>
Please login to merge, or discard this patch.
admin_pages/payments/help_tabs/payment_methods_overview.help_tab.php 2 patches
Spacing   +1 added lines, -1 removed lines patch added patch discarded remove patch
@@ -53,7 +53,7 @@
 block discarded – undo
53 53
                 'The URL of the button image for this payment method in the registration process. You may use any uploaded image on your website (click %s next to the field to select). If left blank, the default button image will be used.',
54 54
                 'event_espresso'
55 55
             ),
56
-            '<img src="' . admin_url('images/media-button-image.gif') . '">'
56
+            '<img src="'.admin_url('images/media-button-image.gif').'">'
57 57
         );
58 58
         ?>
59 59
     </li>
Please login to merge, or discard this patch.
Indentation   +37 added lines, -37 removed lines patch added patch discarded remove patch
@@ -12,62 +12,62 @@  discard block
 block discarded – undo
12 12
         <strong><?php esc_html_e('Name', 'event_espresso'); ?></strong>
13 13
         <br>
14 14
         <?php esc_html_e(
15
-            'The name of the payment method as customers see it in the registration form, in emails, in receipts, etc.',
16
-            'event_espresso'
17
-        ); ?>
15
+			'The name of the payment method as customers see it in the registration form, in emails, in receipts, etc.',
16
+			'event_espresso'
17
+		); ?>
18 18
     </li>
19 19
     <li>
20 20
         <strong><?php esc_html_e('Description', 'event_espresso'); ?></strong>
21 21
         <br />
22 22
         <?php esc_html_e(
23
-            'The description of how to use the payment method as customers will see it. This is mostly only seen during registration.',
24
-            'event_espresso'
25
-        ); ?>
23
+			'The description of how to use the payment method as customers will see it. This is mostly only seen during registration.',
24
+			'event_espresso'
25
+		); ?>
26 26
     </li>
27 27
     <li>
28 28
         <strong><?php esc_html_e('Admin-Only Name', 'event_espresso'); ?></strong>
29 29
         <br />
30 30
         <?php esc_html_e(
31
-            'The name of the payment method as seen internally by site administrators and staff.',
32
-            'event_espresso'
33
-        ); ?>
31
+			'The name of the payment method as seen internally by site administrators and staff.',
32
+			'event_espresso'
33
+		); ?>
34 34
     </li>
35 35
     <li>
36 36
         <strong><?php esc_html_e('Admin-Only Description', 'event_espresso'); ?></strong>
37 37
         <br />
38 38
         <?php esc_html_e(
39
-            'The description of the payment method as seen internally by site administrators and staff.',
40
-            'event_espresso'
41
-        ); ?>
39
+			'The description of the payment method as seen internally by site administrators and staff.',
40
+			'event_espresso'
41
+		); ?>
42 42
     </li>
43 43
     <li>
44 44
         <strong><?php esc_html_e('Debug (sandbox) Mode', 'event_espresso'); ?></strong>
45 45
         <br />
46 46
         <?php esc_html_e(
47
-            'Many payment methods have a debug/sandbox mode where payments are not processed but are only simulated. This is helpful when setup and debugging.',
48
-            'event_espresso'
49
-        ); ?>
47
+			'Many payment methods have a debug/sandbox mode where payments are not processed but are only simulated. This is helpful when setup and debugging.',
48
+			'event_espresso'
49
+		); ?>
50 50
     </li>
51 51
     <li>
52 52
         <strong><?php esc_html_e('Open by Default', 'event_espresso'); ?></strong>
53 53
         <br />
54 54
         <?php esc_html_e(
55
-            'If checked, this payment method will be selected by default (assuming no other valid payment methods are also marked as open by default.)',
56
-            'event_espresso'
57
-        ); ?>
55
+			'If checked, this payment method will be selected by default (assuming no other valid payment methods are also marked as open by default.)',
56
+			'event_espresso'
57
+		); ?>
58 58
     </li>
59 59
     <li>
60 60
         <strong><?php esc_html_e('Button URL', 'event_espresso'); ?></strong>
61 61
         <br />
62 62
         <?php
63
-        printf(
64
-            esc_html__(
65
-                'The URL of the button image for this payment method in the registration process. You may use any uploaded image on your website (click %s next to the field to select). If left blank, the default button image will be used.',
66
-                'event_espresso'
67
-            ),
68
-            '<img src="' . admin_url('images/media-button-image.gif') . '">'
69
-        );
70
-        ?>
63
+		printf(
64
+			esc_html__(
65
+				'The URL of the button image for this payment method in the registration process. You may use any uploaded image on your website (click %s next to the field to select). If left blank, the default button image will be used.',
66
+				'event_espresso'
67
+			),
68
+			'<img src="' . admin_url('images/media-button-image.gif') . '">'
69
+		);
70
+		?>
71 71
     </li>
72 72
     <li>
73 73
         <strong><?php esc_html_e('Usable From', 'event_espresso'); ?></strong>
@@ -76,15 +76,15 @@  discard block
 block discarded – undo
76 76
         <ul>
77 77
             <li>
78 78
                 <?php esc_html_e(
79
-                    'Front-end Registration Page: the payment method will appear as an option during the normal registration process to customers and they can use it to process payments.',
80
-                    'event_espresso'
81
-                ); ?>
79
+					'Front-end Registration Page: the payment method will appear as an option during the normal registration process to customers and they can use it to process payments.',
80
+					'event_espresso'
81
+				); ?>
82 82
             </li>
83 83
             <li>
84 84
                 <?php esc_html_e(
85
-                    'Admin Registration Page: when recording payments made from the transaction admin page, the payment method will appear as an option. Note: currently payments can only be RECORDED from the admin, they cannot be PROCESSED.',
86
-                    'event_espresso'
87
-                ); ?>
85
+					'Admin Registration Page: when recording payments made from the transaction admin page, the payment method will appear as an option. Note: currently payments can only be RECORDED from the admin, they cannot be PROCESSED.',
86
+					'event_espresso'
87
+				); ?>
88 88
             </li>
89 89
         </ul>
90 90
     </li>
@@ -92,14 +92,14 @@  discard block
 block discarded – undo
92 92
 <strong><?php esc_html_e('Recommendations', 'event_espresso'); ?></strong>
93 93
 <br />
94 94
 <?php esc_html_e(
95
-    'To learn more about the options on this page, take a look at the different tabs that appear on the left side of the page.',
96
-    'event_espresso'
95
+	'To learn more about the options on this page, take a look at the different tabs that appear on the left side of the page.',
96
+	'event_espresso'
97 97
 ); ?>
98 98
 <p>
99 99
     <strong><?php esc_html_e('Screen Options', 'event_espresso'); ?></strong>
100 100
     <br />
101 101
     <?php esc_html_e(
102
-        'You can customize the information that is shown on this page by toggling the Screen Options tab. Then you can add or remove checkmarks to hide or show certain content.',
103
-        'event_espresso'
104
-    ); ?>
102
+		'You can customize the information that is shown on this page by toggling the Screen Options tab. Then you can add or remove checkmarks to hide or show certain content.',
103
+		'event_espresso'
104
+	); ?>
105 105
 </p>
Please login to merge, or discard this patch.
core/domain/entities/routing/data_nodes/core/SitePermissions.php 1 patch
Indentation   +27 added lines, -27 removed lines patch added patch discarded remove patch
@@ -8,31 +8,31 @@
 block discarded – undo
8 8
 
9 9
 class SitePermissions extends JsonDataNode
10 10
 {
11
-    const NODE_NAME = 'sitePermissions';
12
-
13
-    /**
14
-     * @var FeatureFlags
15
-     */
16
-    private $feature_flags;
17
-
18
-
19
-    /**
20
-     * @param FeatureFlags          $feature_flags
21
-     * @param JsonDataNodeValidator $validator
22
-     */
23
-    public function __construct(FeatureFlags $feature_flags, JsonDataNodeValidator $validator)
24
-    {
25
-        $this->feature_flags = $feature_flags;
26
-        parent::__construct($validator);
27
-        $this->setNodeName(SitePermissions::NODE_NAME);
28
-    }
29
-
30
-
31
-    /**
32
-     * @inheritDoc
33
-     */
34
-    public function initialize()
35
-    {
36
-        $this->setDataArray($this->feature_flags->getAllowedFeatures());
37
-    }
11
+	const NODE_NAME = 'sitePermissions';
12
+
13
+	/**
14
+	 * @var FeatureFlags
15
+	 */
16
+	private $feature_flags;
17
+
18
+
19
+	/**
20
+	 * @param FeatureFlags          $feature_flags
21
+	 * @param JsonDataNodeValidator $validator
22
+	 */
23
+	public function __construct(FeatureFlags $feature_flags, JsonDataNodeValidator $validator)
24
+	{
25
+		$this->feature_flags = $feature_flags;
26
+		parent::__construct($validator);
27
+		$this->setNodeName(SitePermissions::NODE_NAME);
28
+	}
29
+
30
+
31
+	/**
32
+	 * @inheritDoc
33
+	 */
34
+	public function initialize()
35
+	{
36
+		$this->setDataArray($this->feature_flags->getAllowedFeatures());
37
+	}
38 38
 }
Please login to merge, or discard this patch.
core/db_models/EEM_Datetime.model.php 2 patches
Spacing   +20 added lines, -20 removed lines patch added patch discarded remove patch
@@ -121,7 +121,7 @@  discard block
 block discarded – undo
121 121
                 ),
122 122
             ],
123 123
         ];
124
-        $this->_model_relations        = [
124
+        $this->_model_relations = [
125 125
             'Ticket'          => new EE_HABTM_Relation('Datetime_Ticket'),
126 126
             'Event'           => new EE_Belongs_To_Relation(),
127 127
             'Checkin'         => new EE_Has_Many_Relation(),
@@ -131,19 +131,19 @@  discard block
 block discarded – undo
131 131
         $this->model_chain_to_password = $path_to_event_model;
132 132
         $this->_model_chain_to_wp_user = $path_to_event_model;
133 133
         // this model is generally available for reading
134
-        $this->_cap_restriction_generators[ EEM_Base::caps_read ]       =
134
+        $this->_cap_restriction_generators[EEM_Base::caps_read] =
135 135
             new EE_Restriction_Generator_Event_Related_Public(
136 136
                 $path_to_event_model
137 137
             );
138
-        $this->_cap_restriction_generators[ EEM_Base::caps_read_admin ] =
138
+        $this->_cap_restriction_generators[EEM_Base::caps_read_admin] =
139 139
             new EE_Restriction_Generator_Event_Related_Protected(
140 140
                 $path_to_event_model
141 141
             );
142
-        $this->_cap_restriction_generators[ EEM_Base::caps_edit ]       =
142
+        $this->_cap_restriction_generators[EEM_Base::caps_edit] =
143 143
             new EE_Restriction_Generator_Event_Related_Protected(
144 144
                 $path_to_event_model
145 145
             );
146
-        $this->_cap_restriction_generators[ EEM_Base::caps_delete ]     =
146
+        $this->_cap_restriction_generators[EEM_Base::caps_delete] =
147 147
             new EE_Restriction_Generator_Event_Related_Protected(
148 148
                 $path_to_event_model,
149 149
                 EEM_Base::caps_edit
@@ -185,7 +185,7 @@  discard block
 block discarded – undo
185 185
          * @param int $end_data Unix timestamp representing now + 30 days in seconds.
186 186
          * @return int Unix timestamp
187 187
          */
188
-        $end_date       = apply_filters(
188
+        $end_date = apply_filters(
189 189
             'FHEE__EEM_Datetime__create_new_blank_datetime__end_date',
190 190
             $this->current_time_for_query('DTT_EVT_end', true) + MONTH_IN_SECONDS
191 191
         );
@@ -251,10 +251,10 @@  discard block
 block discarded – undo
251 251
      */
252 252
     private function validateStartAndEndTimeForBlankDate(array $start_time, array $end_time)
253 253
     {
254
-        if (! is_array($start_time)) {
254
+        if ( ! is_array($start_time)) {
255 255
             throw new InvalidDataTypeException('start_time', $start_time, 'array');
256 256
         }
257
-        if (! is_array($end_time)) {
257
+        if ( ! is_array($end_time)) {
258 258
             throw new InvalidDataTypeException('end_time', $end_time, 'array');
259 259
         }
260 260
         if (count($start_time) !== 2) {
@@ -289,7 +289,7 @@  discard block
 block discarded – undo
289 289
      */
290 290
     public function get_all_event_dates($EVT_ID = 0)
291 291
     {
292
-        if (! $EVT_ID) { // on add_new_event event_id gets set to 0
292
+        if ( ! $EVT_ID) { // on add_new_event event_id gets set to 0
293 293
             return $this->create_new_blank_datetime();
294 294
         }
295 295
         $results = $this->get_datetimes_for_event_ordered_by_DTT_order($EVT_ID);
@@ -426,7 +426,7 @@  discard block
 block discarded – undo
426 426
             $query_params,
427 427
             EEM_Base::default_where_conditions_this_only
428 428
         );
429
-        $query_params         = $this->addDefaultQueryParams($query_params, $limit, 'DTT_order');
429
+        $query_params = $this->addDefaultQueryParams($query_params, $limit, 'DTT_order');
430 430
         return $this->getDatetimesAndRestoreModel($query_params, $prev_data_prep_value);
431 431
     }
432 432
 
@@ -587,14 +587,14 @@  discard block
 block discarded – undo
587 587
         $query_params['group_by'] = ['dtt_year', 'dtt_month'];
588 588
         $query_params             = $this->addOrderByQueryParams($query_params, 'DTT_EVT_start', 'DESC');
589 589
 
590
-        $query_interval    = EEH_DTT_Helper::get_sql_query_interval_for_offset(
590
+        $query_interval = EEH_DTT_Helper::get_sql_query_interval_for_offset(
591 591
             $this->get_timezone(),
592 592
             'DTT_EVT_start'
593 593
         );
594 594
         $columns_to_select = [
595
-            'dtt_year'      => ['YEAR(' . $query_interval . ')', '%s'],
596
-            'dtt_month'     => ['MONTHNAME(' . $query_interval . ')', '%s'],
597
-            'dtt_month_num' => ['MONTH(' . $query_interval . ')', '%s'],
595
+            'dtt_year'      => ['YEAR('.$query_interval.')', '%s'],
596
+            'dtt_month'     => ['MONTHNAME('.$query_interval.')', '%s'],
597
+            'dtt_month_num' => ['MONTH('.$query_interval.')', '%s'],
598 598
         ];
599 599
         return $this->_get_all_wpdb_results($query_params, OBJECT, $columns_to_select);
600 600
     }
@@ -676,17 +676,17 @@  discard block
 block discarded – undo
676 676
                 ['DTT_EVT_end' => ['<', time()]]
677 677
             ),
678 678
         ];
679
-        if (! empty($stati_to_include)) {
679
+        if ( ! empty($stati_to_include)) {
680 680
             foreach (array_keys($status_query_args) as $status) {
681
-                if (! in_array($status, $stati_to_include, true)) {
682
-                    unset($status_query_args[ $status ]);
681
+                if ( ! in_array($status, $stati_to_include, true)) {
682
+                    unset($status_query_args[$status]);
683 683
                 }
684 684
             }
685 685
         }
686 686
         // loop through and query counts for each stati.
687 687
         $status_query_results = [];
688 688
         foreach ($status_query_args as $status => $status_where_conditions) {
689
-            $status_query_results[ $status ] = EEM_Datetime::count(
689
+            $status_query_results[$status] = EEM_Datetime::count(
690 690
                 [$status_where_conditions],
691 691
                 'DTT_ID',
692 692
                 true
@@ -707,7 +707,7 @@  discard block
 block discarded – undo
707 707
     public function get_datetime_count_for_status($status = EE_Datetime::active, array $query_params = [])
708 708
     {
709 709
         $count = $this->get_datetime_counts_by_status([$status], $query_params);
710
-        return ! empty($count[ $status ]) ? $count[ $status ] : 0;
710
+        return ! empty($count[$status]) ? $count[$status] : 0;
711 711
     }
712 712
 
713 713
 
@@ -806,7 +806,7 @@  discard block
 block discarded – undo
806 806
      */
807 807
     private function addExpiredWhereParams(array $where_params, bool $include_expired = true)
808 808
     {
809
-        if (! $include_expired) {
809
+        if ( ! $include_expired) {
810 810
             $where_params['DTT_EVT_end'] = ['>=', current_time('mysql', true)];
811 811
         }
812 812
         return $where_params;
Please login to merge, or discard this patch.
Indentation   +836 added lines, -836 removed lines patch added patch discarded remove patch
@@ -16,840 +16,840 @@
 block discarded – undo
16 16
  */
17 17
 class EEM_Datetime extends EEM_Soft_Delete_Base
18 18
 {
19
-    protected static ?EEM_Datetime $_instance = null;
20
-
21
-
22
-    /**
23
-     * private constructor to prevent direct creation
24
-     *
25
-     * @param string|null $timezone A string representing the timezone we want to set for returned Date Time Strings
26
-     *                              (and any incoming timezone data that gets saved).
27
-     *                              Note this just sends the timezone info to the date time model field objects.
28
-     *                              Default is NULL
29
-     *                              (and will be assumed using the set timezone in the 'timezone_string' wp option)
30
-     * @throws EE_Error
31
-     */
32
-    protected function __construct(?string $timezone = '')
33
-    {
34
-        $this->singular_item           = esc_html__('Datetime', 'event_espresso');
35
-        $this->plural_item             = esc_html__('Datetimes', 'event_espresso');
36
-        $this->_tables                 = [
37
-            'Datetime' => new EE_Primary_Table('esp_datetime', 'DTT_ID'),
38
-        ];
39
-        $this->_fields                 = [
40
-            'Datetime' => [
41
-                'DTT_ID'          => new EE_Primary_Key_Int_Field(
42
-                    'DTT_ID',
43
-                    esc_html__('Datetime ID', 'event_espresso')
44
-                ),
45
-                'EVT_ID'          => new EE_Foreign_Key_Int_Field(
46
-                    'EVT_ID',
47
-                    esc_html__('Event ID', 'event_espresso'),
48
-                    false,
49
-                    0,
50
-                    'Event'
51
-                ),
52
-                'VNU_ID'          => new EE_Foreign_Key_Int_Field(
53
-                    'VNU_ID',
54
-                    __('Venue ID', 'event_espresso'),
55
-                    false,
56
-                    0,
57
-                    'Venue'
58
-                ),
59
-                'DTT_name'        => new EE_Plain_Text_Field(
60
-                    'DTT_name',
61
-                    esc_html__('Datetime Name', 'event_espresso'),
62
-                    false,
63
-                    ''
64
-                ),
65
-                'DTT_description' => new EE_Post_Content_Field(
66
-                    'DTT_description',
67
-                    esc_html__('Description for Datetime', 'event_espresso'),
68
-                    false,
69
-                    ''
70
-                ),
71
-                'DTT_EVT_start'   => new EE_Datetime_Field(
72
-                    'DTT_EVT_start',
73
-                    esc_html__('Start time/date of Event', 'event_espresso'),
74
-                    false,
75
-                    EE_Datetime_Field::now,
76
-                    $timezone
77
-                ),
78
-                'DTT_EVT_end'     => new EE_Datetime_Field(
79
-                    'DTT_EVT_end',
80
-                    esc_html__('End time/date of Event', 'event_espresso'),
81
-                    false,
82
-                    EE_Datetime_Field::now,
83
-                    $timezone
84
-                ),
85
-                'DTT_reg_limit'   => new EE_Infinite_Integer_Field(
86
-                    'DTT_reg_limit',
87
-                    esc_html__('Registration Limit for this time', 'event_espresso'),
88
-                    false,
89
-                    EE_INF
90
-                ),
91
-                'DTT_sold'        => new EE_Integer_Field(
92
-                    'DTT_sold',
93
-                    esc_html__('How many sales for this Datetime that have occurred', 'event_espresso'),
94
-                    false,
95
-                    0
96
-                ),
97
-                'DTT_reserved'    => new EE_Integer_Field(
98
-                    'DTT_reserved',
99
-                    esc_html__('Quantity of tickets reserved, but not yet fully purchased', 'event_espresso'),
100
-                    false,
101
-                    0
102
-                ),
103
-                'DTT_is_primary'  => new EE_Boolean_Field(
104
-                    'DTT_is_primary',
105
-                    esc_html__('Flag indicating datetime is primary one for event', 'event_espresso'),
106
-                    false,
107
-                    false
108
-                ),
109
-                'DTT_order'       => new EE_Integer_Field(
110
-                    'DTT_order',
111
-                    esc_html__('The order in which the Datetime is displayed', 'event_espresso'),
112
-                    false,
113
-                    0
114
-                ),
115
-                'DTT_parent'      => new EE_Integer_Field(
116
-                    'DTT_parent',
117
-                    esc_html__('Indicates what DTT_ID is the parent of this DTT_ID', 'event_espresso'),
118
-                    true,
119
-                    0
120
-                ),
121
-                'DTT_deleted'     => new EE_Trashed_Flag_Field(
122
-                    'DTT_deleted',
123
-                    esc_html__('Flag indicating datetime is archived', 'event_espresso'),
124
-                    false,
125
-                    false
126
-                ),
127
-            ],
128
-        ];
129
-        $this->_model_relations        = [
130
-            'Ticket'          => new EE_HABTM_Relation('Datetime_Ticket'),
131
-            'Event'           => new EE_Belongs_To_Relation(),
132
-            'Checkin'         => new EE_Has_Many_Relation(),
133
-            'Datetime_Ticket' => new EE_Has_Many_Relation(),
134
-            'Venue'           => new EE_Belongs_To_Relation(),
135
-        ];
136
-        $path_to_event_model           = 'Event';
137
-        $this->model_chain_to_password = $path_to_event_model;
138
-        $this->_model_chain_to_wp_user = $path_to_event_model;
139
-        // this model is generally available for reading
140
-        $this->_cap_restriction_generators[ EEM_Base::caps_read ]       =
141
-            new EE_Restriction_Generator_Event_Related_Public(
142
-                $path_to_event_model
143
-            );
144
-        $this->_cap_restriction_generators[ EEM_Base::caps_read_admin ] =
145
-            new EE_Restriction_Generator_Event_Related_Protected(
146
-                $path_to_event_model
147
-            );
148
-        $this->_cap_restriction_generators[ EEM_Base::caps_edit ]       =
149
-            new EE_Restriction_Generator_Event_Related_Protected(
150
-                $path_to_event_model
151
-            );
152
-        $this->_cap_restriction_generators[ EEM_Base::caps_delete ]     =
153
-            new EE_Restriction_Generator_Event_Related_Protected(
154
-                $path_to_event_model,
155
-                EEM_Base::caps_edit
156
-            );
157
-        parent::__construct($timezone);
158
-    }
159
-
160
-
161
-    /**
162
-     * create new blank datetime
163
-     *
164
-     * @access public
165
-     * @return EE_Datetime[] array on success, FALSE on fail
166
-     * @throws EE_Error
167
-     * @throws InvalidArgumentException
168
-     * @throws InvalidDataTypeException
169
-     * @throws ReflectionException
170
-     * @throws InvalidInterfaceException
171
-     */
172
-    public function create_new_blank_datetime()
173
-    {
174
-        // makes sure timezone is always set.
175
-        $timezone_string = $this->get_timezone();
176
-        /**
177
-         * Filters the initial start date for the new datetime.
178
-         * Any time included in this value will be overridden later so use additional filters to modify the time.
179
-         *
180
-         * @param int $start_date Unix timestamp representing now + 30 days in seconds.
181
-         * @return int Unix timestamp
182
-         */
183
-        $start_date = apply_filters(
184
-            'FHEE__EEM_Datetime__create_new_blank_datetime__start_date',
185
-            $this->current_time_for_query('DTT_EVT_start', true) + MONTH_IN_SECONDS
186
-        );
187
-        /**
188
-         * Filters the initial end date for the new datetime.
189
-         * Any time included in this value will be overridden later so use additional filters to modify the time.
190
-         *
191
-         * @param int $end_data Unix timestamp representing now + 30 days in seconds.
192
-         * @return int Unix timestamp
193
-         */
194
-        $end_date       = apply_filters(
195
-            'FHEE__EEM_Datetime__create_new_blank_datetime__end_date',
196
-            $this->current_time_for_query('DTT_EVT_end', true) + MONTH_IN_SECONDS
197
-        );
198
-        $blank_datetime = EE_Datetime::new_instance(
199
-            [
200
-                'DTT_EVT_start' => $start_date,
201
-                'DTT_EVT_end'   => $end_date,
202
-                'DTT_order'     => 1,
203
-                'DTT_reg_limit' => EE_INF_IN_DB,
204
-            ],
205
-            $timezone_string
206
-        );
207
-        /**
208
-         * Filters the initial start time and format for the new EE_Datetime instance.
209
-         *
210
-         * @param array $start_time An array having size 2.  First element is the time, second element is the time
211
-         *                          format.
212
-         * @return array
213
-         */
214
-        $start_time = apply_filters(
215
-            'FHEE__EEM_Datetime__create_new_blank_datetime__start_time',
216
-            ['8am', 'ga']
217
-        );
218
-        /**
219
-         * Filters the initial end time and format for the new EE_Datetime instance.
220
-         *
221
-         * @param array $end_time An array having size 2.  First element is the time, second element is the time
222
-         *                        format
223
-         * @return array
224
-         */
225
-        $end_time = apply_filters(
226
-            'FHEE__EEM_Datetime__create_new_blank_datetime__end_time',
227
-            ['5pm', 'ga']
228
-        );
229
-        $this->validateStartAndEndTimeForBlankDate($start_time, $end_time);
230
-        $blank_datetime->set_start_time(
231
-            $this->convert_datetime_for_query(
232
-                'DTT_EVT_start',
233
-                $start_time[0],
234
-                $start_time[1],
235
-                $timezone_string
236
-            )
237
-        );
238
-        $blank_datetime->set_end_time(
239
-            $this->convert_datetime_for_query(
240
-                'DTT_EVT_end',
241
-                $end_time[0],
242
-                $end_time[1],
243
-                $timezone_string
244
-            )
245
-        );
246
-        return [$blank_datetime];
247
-    }
248
-
249
-
250
-    /**
251
-     * Validates whether the start_time and end_time are in the expected format.
252
-     *
253
-     * @param array $start_time
254
-     * @param array $end_time
255
-     * @throws InvalidArgumentException
256
-     * @throws InvalidDataTypeException
257
-     */
258
-    private function validateStartAndEndTimeForBlankDate(array $start_time, array $end_time)
259
-    {
260
-        if (! is_array($start_time)) {
261
-            throw new InvalidDataTypeException('start_time', $start_time, 'array');
262
-        }
263
-        if (! is_array($end_time)) {
264
-            throw new InvalidDataTypeException('end_time', $end_time, 'array');
265
-        }
266
-        if (count($start_time) !== 2) {
267
-            throw new InvalidArgumentException(
268
-                sprintf(
269
-                    'The variable %1$s is expected to be an array with two elements.  The first item in the '
270
-                    . 'array should be a valid time string, the second item in the array should be a valid time format',
271
-                    '$start_time'
272
-                )
273
-            );
274
-        }
275
-        if (count($end_time) !== 2) {
276
-            throw new InvalidArgumentException(
277
-                sprintf(
278
-                    'The variable %1$s is expected to be an array with two elements.  The first item in the '
279
-                    . 'array should be a valid time string, the second item in the array should be a valid time format',
280
-                    '$end_time'
281
-                )
282
-            );
283
-        }
284
-    }
285
-
286
-
287
-    /**
288
-     * get event start date from db
289
-     *
290
-     * @access public
291
-     * @param int $EVT_ID
292
-     * @return EE_Datetime[] array on success, FALSE on fail
293
-     * @throws EE_Error
294
-     * @throws ReflectionException
295
-     */
296
-    public function get_all_event_dates($EVT_ID = 0)
297
-    {
298
-        if (! $EVT_ID) { // on add_new_event event_id gets set to 0
299
-            return $this->create_new_blank_datetime();
300
-        }
301
-        $results = $this->get_datetimes_for_event_ordered_by_DTT_order($EVT_ID);
302
-        if (empty($results)) {
303
-            return $this->create_new_blank_datetime();
304
-        }
305
-        return $results;
306
-    }
307
-
308
-
309
-    /**
310
-     * get all datetimes attached to an event ordered by the DTT_order field
311
-     *
312
-     * @public
313
-     * @param int     $EVT_ID     event id
314
-     * @param boolean $include_expired
315
-     * @param boolean $include_deleted
316
-     * @param int     $limit      If included then limit the count of results by
317
-     *                            the given number
318
-     * @return EE_Datetime[]
319
-     * @throws EE_Error
320
-     */
321
-    public function get_datetimes_for_event_ordered_by_DTT_order(
322
-        int $EVT_ID,
323
-        bool $include_expired = true,
324
-        bool $include_deleted = true,
325
-        $limit = 0
326
-    ) {
327
-        $prev_data_prep_value = $this->prepModelForQuery();
328
-        $where_params         = ['Event.EVT_ID' => absint($EVT_ID)];
329
-        $query_params[0]      = $this->addDefaultWhereParams($where_params, $include_deleted, $include_expired);
330
-        $query_params         = $this->addDefaultWhereConditions($query_params);
331
-        $query_params         = $this->addDefaultQueryParams($query_params, $limit, 'DTT_order');
332
-        return $this->getDatetimesAndRestoreModel($query_params, $prev_data_prep_value);
333
-    }
334
-
335
-
336
-    /**
337
-     * Gets the datetimes for the event (with the given limit), and orders them by "importance".
338
-     * By importance, we mean that the primary datetimes are most important (DEPRECATED FOR NOW),
339
-     * and then the earlier datetimes are the most important.
340
-     * Maybe we'll want this to take into account datetimes that haven't already passed, but we don't yet.
341
-     *
342
-     * @param int $EVT_ID
343
-     * @param int $limit
344
-     * @return EE_Datetime[]|EE_Base_Class[]
345
-     * @throws EE_Error
346
-     */
347
-    public function get_datetimes_for_event_ordered_by_importance(int $EVT_ID, $limit = 0)
348
-    {
349
-        $query_params[0] = ['Event.EVT_ID' => absint($EVT_ID)];
350
-        $query_params    = $this->addDefaultWhereConditions($query_params);
351
-        $query_params    = $this->addDefaultQueryParams($query_params, $limit);
352
-        return $this->get_all($query_params);
353
-    }
354
-
355
-
356
-    /**
357
-     * @param int     $EVT_ID
358
-     * @param boolean $include_expired
359
-     * @param boolean $include_deleted
360
-     * @return EE_Datetime
361
-     * @throws EE_Error
362
-     */
363
-    public function get_oldest_datetime_for_event(
364
-        int $EVT_ID,
365
-        bool $include_expired = false,
366
-        bool $include_deleted = false
367
-    ) {
368
-        $results = $this->get_datetimes_for_event_ordered_by_start_time(
369
-            $EVT_ID,
370
-            $include_expired,
371
-            $include_deleted,
372
-            1
373
-        );
374
-        if ($results) {
375
-            return array_shift($results);
376
-        }
377
-        return null;
378
-    }
379
-
380
-
381
-    /**
382
-     * Gets the 'primary' datetime for an event.
383
-     *
384
-     * @param int  $EVT_ID
385
-     * @param bool $try_to_exclude_expired
386
-     * @param bool $try_to_exclude_deleted
387
-     * @return EE_Datetime
388
-     * @throws EE_Error
389
-     */
390
-    public function get_primary_datetime_for_event(
391
-        int $EVT_ID,
392
-        bool $try_to_exclude_expired = true,
393
-        bool $try_to_exclude_deleted = true
394
-    ) {
395
-        if ($try_to_exclude_expired) {
396
-            $non_expired = $this->get_oldest_datetime_for_event($EVT_ID, false, false);
397
-            if ($non_expired) {
398
-                return $non_expired;
399
-            }
400
-        }
401
-        if ($try_to_exclude_deleted) {
402
-            $expired_even = $this->get_oldest_datetime_for_event($EVT_ID, true);
403
-            if ($expired_even) {
404
-                return $expired_even;
405
-            }
406
-        }
407
-        return $this->get_oldest_datetime_for_event($EVT_ID, true, true);
408
-    }
409
-
410
-
411
-    /**
412
-     * Gets ALL the datetimes for an event (including trashed ones, for now), ordered
413
-     * only by start date
414
-     *
415
-     * @param int     $EVT_ID
416
-     * @param boolean $include_expired
417
-     * @param boolean $include_deleted
418
-     * @param int     $limit
419
-     * @return EE_Datetime[]
420
-     * @throws EE_Error
421
-     */
422
-    public function get_datetimes_for_event_ordered_by_start_time(
423
-        int $EVT_ID,
424
-        bool $include_expired = true,
425
-        bool $include_deleted = true,
426
-        $limit = 0
427
-    ) {
428
-        $prev_data_prep_value = $this->prepModelForQuery();
429
-        $where_params         = ['Event.EVT_ID' => absint($EVT_ID)];
430
-        $query_params[0]      = $this->addDefaultWhereParams($where_params, $include_deleted, $include_expired);
431
-        $query_params         = $this->addDefaultWhereConditions(
432
-            $query_params,
433
-            EEM_Base::default_where_conditions_this_only
434
-        );
435
-        $query_params         = $this->addDefaultQueryParams($query_params, $limit, 'DTT_order');
436
-        return $this->getDatetimesAndRestoreModel($query_params, $prev_data_prep_value);
437
-    }
438
-
439
-
440
-    /**
441
-     * Gets ALL the datetimes for an ticket (including trashed ones, for now), ordered
442
-     * only by start date
443
-     *
444
-     * @param int     $TKT_ID
445
-     * @param boolean $include_expired
446
-     * @param boolean $include_deleted
447
-     * @param int     $limit
448
-     * @return EE_Datetime[]
449
-     * @throws EE_Error
450
-     */
451
-    public function get_datetimes_for_ticket_ordered_by_start_time(
452
-        int $TKT_ID,
453
-        bool $include_expired = true,
454
-        bool $include_deleted = true,
455
-        $limit = 0
456
-    ) {
457
-        $prev_data_prep_value = $this->prepModelForQuery();
458
-        $where_params         = ['Ticket.TKT_ID' => absint($TKT_ID)];
459
-        $query_params[0]      = $this->addDefaultWhereParams($where_params, $include_deleted, $include_expired);
460
-        $query_params         = $this->addDefaultQueryParams($query_params, $limit);
461
-        return $this->getDatetimesAndRestoreModel($query_params, $prev_data_prep_value);
462
-    }
463
-
464
-
465
-    /**
466
-     * Gets all the datetimes for a ticket (including trashed ones, for now), ordered by the DTT_order for the
467
-     * datetimes.
468
-     *
469
-     * @param int      $TKT_ID           ID of ticket to retrieve the datetimes for
470
-     * @param boolean  $include_expired  whether to include expired datetimes or not
471
-     * @param boolean  $include_deleted  whether to include trashed datetimes or not.
472
-     * @param int|null $limit            if null, no limit, if int then limit results by
473
-     *                                   that number
474
-     * @return EE_Datetime[]
475
-     * @throws EE_Error
476
-     */
477
-    public function get_datetimes_for_ticket_ordered_by_DTT_order(
478
-        int $TKT_ID,
479
-        bool $include_expired = true,
480
-        bool $include_deleted = true,
481
-        $limit = 0
482
-    ) {
483
-        $prev_data_prep_value = $this->prepModelForQuery();
484
-        $where_params         = ['Ticket.TKT_ID' => absint($TKT_ID)];
485
-        $query_params[0]      = $this->addDefaultWhereParams($where_params, $include_deleted, $include_expired);
486
-        $query_params         = $this->addDefaultQueryParams($query_params, $limit, 'DTT_order');
487
-        return $this->getDatetimesAndRestoreModel($query_params, $prev_data_prep_value);
488
-    }
489
-
490
-
491
-    /**
492
-     * Gets the most important datetime for a particular event (ie, the primary event usually. But if for some WACK
493
-     * reason it doesn't exist, we consider the earliest event the most important)
494
-     *
495
-     * @param int $EVT_ID
496
-     * @return EE_Datetime
497
-     * @throws EE_Error
498
-     */
499
-    public function get_most_important_datetime_for_event(int $EVT_ID)
500
-    {
501
-        $results = $this->get_datetimes_for_event_ordered_by_importance($EVT_ID, 1);
502
-        if ($results) {
503
-            return array_shift($results);
504
-        }
505
-        return null;
506
-    }
507
-
508
-
509
-    /**
510
-     * This returns a wpdb->results        Array of all DTT month and years matching the incoming query params and
511
-     * grouped by month and year.
512
-     *
513
-     * @param array  $where_params       @see
514
-     *                                   https://github.com/eventespresso/event-espresso-core/tree/master/docs/G--Model-System/model-query-params.md#0-where-conditions
515
-     * @param string $evt_active_status  A string representing the evt active status to filter the months by.
516
-     *                                   Can be:
517
-     *                                   - '' = no filter
518
-     *                                   - upcoming = Published events with at least one upcoming datetime.
519
-     *                                   - expired = Events with all datetimes expired.
520
-     *                                   - active = Events that are published and have at least one datetime that
521
-     *                                   starts before now and ends after now.
522
-     *                                   - inactive = Events that are either not published.
523
-     * @return stdClass[]
524
-     * @throws EE_Error
525
-     * @throws InvalidArgumentException
526
-     * @throws InvalidArgumentException
527
-     */
528
-    public function get_dtt_months_and_years(array $where_params, $evt_active_status = '')
529
-    {
530
-        $current_time_for_DTT_EVT_start = $this->current_time_for_query('DTT_EVT_start');
531
-        $current_time_for_DTT_EVT_end   = $this->current_time_for_query('DTT_EVT_end');
532
-        switch ($evt_active_status) {
533
-            case 'upcoming':
534
-                $where_params['Event.status'] = 'publish';
535
-                // if there are already query_params matching DTT_EVT_start then we need to modify that to add them.
536
-                if (isset($where_params['DTT_EVT_start'])) {
537
-                    $where_params['DTT_EVT_start*****'] = $where_params['DTT_EVT_start'];
538
-                }
539
-                $where_params['DTT_EVT_start'] = ['>', $current_time_for_DTT_EVT_start];
540
-                break;
541
-            case 'expired':
542
-                if (isset($where_params['Event.status'])) {
543
-                    unset($where_params['Event.status']);
544
-                }
545
-                // get events to exclude
546
-                $exclude_query[0] = array_merge(
547
-                    $where_params,
548
-                    ['DTT_EVT_end' => ['>', $current_time_for_DTT_EVT_end]]
549
-                );
550
-                // first get all events that have datetimes where its not expired.
551
-                $event_ids = $this->_get_all_wpdb_results(
552
-                    $exclude_query,
553
-                    OBJECT_K,
554
-                    'Datetime.EVT_ID'
555
-                );
556
-                $event_ids = array_keys($event_ids);
557
-                if (isset($where_params['DTT_EVT_end'])) {
558
-                    $where_params['DTT_EVT_end****'] = $where_params['DTT_EVT_end'];
559
-                }
560
-                $where_params['DTT_EVT_end']  = ['<', $current_time_for_DTT_EVT_end];
561
-                $where_params['Event.EVT_ID'] = ['NOT IN', $event_ids];
562
-                break;
563
-            case 'active':
564
-                $where_params['Event.status'] = 'publish';
565
-                if (isset($where_params['DTT_EVT_start'])) {
566
-                    $where_params['Datetime.DTT_EVT_start******'] = $where_params['DTT_EVT_start'];
567
-                }
568
-                if (isset($where_params['Datetime.DTT_EVT_end'])) {
569
-                    $where_params['Datetime.DTT_EVT_end*****'] = $where_params['DTT_EVT_end'];
570
-                }
571
-                $where_params['DTT_EVT_start'] = ['<', $current_time_for_DTT_EVT_start];
572
-                $where_params['DTT_EVT_end']   = ['>', $current_time_for_DTT_EVT_end];
573
-                break;
574
-            case 'inactive':
575
-                if (isset($where_params['Event.status'])) {
576
-                    unset($where_params['Event.status']);
577
-                }
578
-                if (isset($where_params['OR'])) {
579
-                    $where_params['AND']['OR'] = $where_params['OR'];
580
-                }
581
-                if (isset($where_params['DTT_EVT_end'])) {
582
-                    $where_params['AND']['DTT_EVT_end****'] = $where_params['DTT_EVT_end'];
583
-                    unset($where_params['DTT_EVT_end']);
584
-                }
585
-                if (isset($where_params['DTT_EVT_start'])) {
586
-                    $where_params['AND']['DTT_EVT_start'] = $where_params['DTT_EVT_start'];
587
-                    unset($where_params['DTT_EVT_start']);
588
-                }
589
-                $where_params['AND']['Event.status'] = ['!=', 'publish'];
590
-                break;
591
-        }
592
-        $query_params[0]          = $where_params;
593
-        $query_params['group_by'] = ['dtt_year', 'dtt_month'];
594
-        $query_params             = $this->addOrderByQueryParams($query_params, 'DTT_EVT_start', 'DESC');
595
-
596
-        $query_interval    = EEH_DTT_Helper::get_sql_query_interval_for_offset(
597
-            $this->get_timezone(),
598
-            'DTT_EVT_start'
599
-        );
600
-        $columns_to_select = [
601
-            'dtt_year'      => ['YEAR(' . $query_interval . ')', '%s'],
602
-            'dtt_month'     => ['MONTHNAME(' . $query_interval . ')', '%s'],
603
-            'dtt_month_num' => ['MONTH(' . $query_interval . ')', '%s'],
604
-        ];
605
-        return $this->_get_all_wpdb_results($query_params, OBJECT, $columns_to_select);
606
-    }
607
-
608
-
609
-    /**
610
-     * Updates the DTT_sold attribute on each datetime (based on the registrations
611
-     * for the tickets for each datetime)
612
-     *
613
-     * @param EE_Base_Class[]|EE_Datetime[] $datetimes
614
-     * @throws EE_Error
615
-     * @throws ReflectionException
616
-     */
617
-    public function update_sold(array $datetimes)
618
-    {
619
-        EE_Error::doing_it_wrong(
620
-            __FUNCTION__,
621
-            esc_html__(
622
-                'Please use \EEM_Ticket::update_tickets_sold() instead which will in turn correctly update both the Ticket AND Datetime counts.',
623
-                'event_espresso'
624
-            ),
625
-            '4.9.32.rc.005'
626
-        );
627
-        foreach ($datetimes as $datetime) {
628
-            $datetime->update_sold();
629
-        }
630
-    }
631
-
632
-
633
-    /**
634
-     *    Gets the total number of tickets available at a particular datetime
635
-     *    (does NOT take into account the datetime's spaces available)
636
-     *
637
-     * @param int   $DTT_ID
638
-     * @param array $query_params
639
-     * @return int of tickets available. If sold out, return less than 1. If infinite, returns EE_INF,  IF there are NO
640
-     *             tickets attached to datetime then FALSE is returned.
641
-     * @throws EE_Error
642
-     * @throws ReflectionException
643
-     */
644
-    public function sum_tickets_currently_available_at_datetime(int $DTT_ID, array $query_params = [])
645
-    {
646
-        $datetime = $this->get_one_by_ID($DTT_ID);
647
-        if ($datetime instanceof EE_Datetime) {
648
-            return $datetime->tickets_remaining($query_params);
649
-        }
650
-        return 0;
651
-    }
652
-
653
-
654
-    /**
655
-     * This returns an array of counts of datetimes in the database for each Datetime status that can be queried.
656
-     *
657
-     * @param array $stati_to_include  If included you can restrict the statuses we return counts for by including the
658
-     *                                 stati you want counts for as values in the array.  An empty array returns counts
659
-     *                                 for all valid stati.
660
-     * @param array $query_params      If included can be used to refine the conditions for returning the count (i.e.
661
-     *                                 only for Datetimes connected to a specific event, or specific ticket.
662
-     * @return array  The value returned is an array indexed by Datetime Status and the values are the counts.  The
663
-     * @throws EE_Error
664
-     *                                 stati used as index keys are: EE_Datetime::active EE_Datetime::upcoming
665
-     *                                 EE_Datetime::expired
666
-     */
667
-    public function get_datetime_counts_by_status(array $stati_to_include = [], array $query_params = [])
668
-    {
669
-        // only accept where conditions for this query.
670
-        $_where            = isset($query_params[0]) ? $query_params[0] : [];
671
-        $status_query_args = [
672
-            EE_Datetime::active   => array_merge(
673
-                $_where,
674
-                ['DTT_EVT_start' => ['<', time()], 'DTT_EVT_end' => ['>', time()]]
675
-            ),
676
-            EE_Datetime::upcoming => array_merge(
677
-                $_where,
678
-                ['DTT_EVT_start' => ['>', time()]]
679
-            ),
680
-            EE_Datetime::expired  => array_merge(
681
-                $_where,
682
-                ['DTT_EVT_end' => ['<', time()]]
683
-            ),
684
-        ];
685
-        if (! empty($stati_to_include)) {
686
-            foreach (array_keys($status_query_args) as $status) {
687
-                if (! in_array($status, $stati_to_include, true)) {
688
-                    unset($status_query_args[ $status ]);
689
-                }
690
-            }
691
-        }
692
-        // loop through and query counts for each stati.
693
-        $status_query_results = [];
694
-        foreach ($status_query_args as $status => $status_where_conditions) {
695
-            $status_query_results[ $status ] = EEM_Datetime::count(
696
-                [$status_where_conditions],
697
-                'DTT_ID',
698
-                true
699
-            );
700
-        }
701
-        return $status_query_results;
702
-    }
703
-
704
-
705
-    /**
706
-     * Returns the specific count for a given Datetime status matching any given query_params.
707
-     *
708
-     * @param string $status Valid string representation for Datetime status requested. (Defaults to Active).
709
-     * @param array  $query_params
710
-     * @return int
711
-     * @throws EE_Error
712
-     */
713
-    public function get_datetime_count_for_status($status = EE_Datetime::active, array $query_params = [])
714
-    {
715
-        $count = $this->get_datetime_counts_by_status([$status], $query_params);
716
-        return ! empty($count[ $status ]) ? $count[ $status ] : 0;
717
-    }
718
-
719
-
720
-    /**
721
-     * @return bool|int
722
-     * @since   5.0.0.p
723
-     */
724
-    private function prepModelForQuery()
725
-    {
726
-        $prev_data_prep_value = $this->get_assumption_concerning_values_already_prepared_by_model_object();
727
-        $this->assume_values_already_prepared_by_model_object(EEM_Base::prepared_for_use_in_db);
728
-        return $prev_data_prep_value;
729
-    }
730
-
731
-
732
-    /**
733
-     * @param array    $query_params
734
-     * @param bool|int $prev_data_prep_value
735
-     * @return EE_Base_Class[]|EE_Datetime[]
736
-     * @throws EE_Error
737
-     * @since   5.0.0.p
738
-     */
739
-    private function getDatetimesAndRestoreModel(array $query_params, $prev_data_prep_value)
740
-    {
741
-        $result = $this->get_all($query_params);
742
-        $this->assume_values_already_prepared_by_model_object($prev_data_prep_value);
743
-        return $result;
744
-    }
745
-
746
-
747
-    /**
748
-     * @param array  $query_params
749
-     * @param int    $limit
750
-     * @param string $order_by
751
-     * @param string $order
752
-     * @return array
753
-     * @since   5.0.0.p
754
-     */
755
-    private function addDefaultQueryParams(array $query_params, $limit = 0, $order_by = 'DTT_EVT_start', $order = 'ASC')
756
-    {
757
-        $query_params = $this->addOrderByQueryParams($query_params, $order_by, $order);
758
-        $query_params = $this->addLimitQueryParams($query_params, $limit);
759
-        return $query_params;
760
-    }
761
-
762
-
763
-    /**
764
-     * @param array  $query_params
765
-     * @param string $default_where_conditions
766
-     * @return array
767
-     * @since   5.0.0.p
768
-     */
769
-    private function addDefaultWhereConditions(
770
-        array $query_params,
771
-        $default_where_conditions = EEM_Base::default_where_conditions_none
772
-    ) {
773
-        $query_params['default_where_conditions'] = $default_where_conditions;
774
-        return $query_params;
775
-    }
776
-
777
-
778
-    /**
779
-     * @param array $where_params
780
-     * @param bool  $include_deleted
781
-     * @param bool  $include_expired
782
-     * @return array
783
-     * @since   5.0.0.p
784
-     */
785
-    private function addDefaultWhereParams(
786
-        array $where_params,
787
-        bool $include_deleted = true,
788
-        bool $include_expired = true
789
-    ) {
790
-        $where_params = $this->addExpiredWhereParams($where_params, $include_expired);
791
-        $where_params = $this->addDeletedWhereParams($where_params, $include_deleted);
792
-        return $where_params;
793
-    }
794
-
795
-
796
-    /**
797
-     * @param array $where_params
798
-     * @param bool  $include_deleted
799
-     * @return array
800
-     * @since   5.0.0.p
801
-     */
802
-    private function addDeletedWhereParams(array $where_params, bool $include_deleted = true)
803
-    {
804
-        $deleted                     = $include_deleted ? [true, false] : [false];
805
-        $where_params['DTT_deleted'] = ['IN', $deleted];
806
-        return $where_params;
807
-    }
808
-
809
-
810
-    /**
811
-     * @param array $where_params
812
-     * @param bool  $include_expired
813
-     * @return array
814
-     * @since   5.0.0.p
815
-     */
816
-    private function addExpiredWhereParams(array $where_params, bool $include_expired = true)
817
-    {
818
-        if (! $include_expired) {
819
-            $where_params['DTT_EVT_end'] = ['>=', current_time('mysql', true)];
820
-        }
821
-        return $where_params;
822
-    }
823
-
824
-
825
-    /**
826
-     * @param array $query_params
827
-     * @param int   $limit
828
-     * @return array
829
-     * @since   5.0.0.p
830
-     */
831
-    private function addLimitQueryParams(array $query_params, $limit = 0)
832
-    {
833
-        if ($limit) {
834
-            $query_params['limit'] = $limit;
835
-        }
836
-        return $query_params;
837
-    }
838
-
839
-
840
-    /**
841
-     * @param array  $query_params
842
-     * @param string $order_by
843
-     * @param string $order
844
-     * @return array
845
-     * @since   5.0.0.p
846
-     */
847
-    private function addOrderByQueryParams(array $query_params, $order_by = 'DTT_EVT_start', $order = 'ASC')
848
-    {
849
-        $order                    = $order === 'ASC' ? 'ASC' : 'DESC';
850
-        $valid_order_columns      = ['DTT_ID', 'DTT_EVT_start', 'DTT_EVT_end', 'DTT_order'];
851
-        $order_by                 = in_array($order_by, $valid_order_columns, true) ? $order_by : 'DTT_EVT_start';
852
-        $query_params['order_by'] = [$order_by => $order];
853
-        return $query_params;
854
-    }
19
+	protected static ?EEM_Datetime $_instance = null;
20
+
21
+
22
+	/**
23
+	 * private constructor to prevent direct creation
24
+	 *
25
+	 * @param string|null $timezone A string representing the timezone we want to set for returned Date Time Strings
26
+	 *                              (and any incoming timezone data that gets saved).
27
+	 *                              Note this just sends the timezone info to the date time model field objects.
28
+	 *                              Default is NULL
29
+	 *                              (and will be assumed using the set timezone in the 'timezone_string' wp option)
30
+	 * @throws EE_Error
31
+	 */
32
+	protected function __construct(?string $timezone = '')
33
+	{
34
+		$this->singular_item           = esc_html__('Datetime', 'event_espresso');
35
+		$this->plural_item             = esc_html__('Datetimes', 'event_espresso');
36
+		$this->_tables                 = [
37
+			'Datetime' => new EE_Primary_Table('esp_datetime', 'DTT_ID'),
38
+		];
39
+		$this->_fields                 = [
40
+			'Datetime' => [
41
+				'DTT_ID'          => new EE_Primary_Key_Int_Field(
42
+					'DTT_ID',
43
+					esc_html__('Datetime ID', 'event_espresso')
44
+				),
45
+				'EVT_ID'          => new EE_Foreign_Key_Int_Field(
46
+					'EVT_ID',
47
+					esc_html__('Event ID', 'event_espresso'),
48
+					false,
49
+					0,
50
+					'Event'
51
+				),
52
+				'VNU_ID'          => new EE_Foreign_Key_Int_Field(
53
+					'VNU_ID',
54
+					__('Venue ID', 'event_espresso'),
55
+					false,
56
+					0,
57
+					'Venue'
58
+				),
59
+				'DTT_name'        => new EE_Plain_Text_Field(
60
+					'DTT_name',
61
+					esc_html__('Datetime Name', 'event_espresso'),
62
+					false,
63
+					''
64
+				),
65
+				'DTT_description' => new EE_Post_Content_Field(
66
+					'DTT_description',
67
+					esc_html__('Description for Datetime', 'event_espresso'),
68
+					false,
69
+					''
70
+				),
71
+				'DTT_EVT_start'   => new EE_Datetime_Field(
72
+					'DTT_EVT_start',
73
+					esc_html__('Start time/date of Event', 'event_espresso'),
74
+					false,
75
+					EE_Datetime_Field::now,
76
+					$timezone
77
+				),
78
+				'DTT_EVT_end'     => new EE_Datetime_Field(
79
+					'DTT_EVT_end',
80
+					esc_html__('End time/date of Event', 'event_espresso'),
81
+					false,
82
+					EE_Datetime_Field::now,
83
+					$timezone
84
+				),
85
+				'DTT_reg_limit'   => new EE_Infinite_Integer_Field(
86
+					'DTT_reg_limit',
87
+					esc_html__('Registration Limit for this time', 'event_espresso'),
88
+					false,
89
+					EE_INF
90
+				),
91
+				'DTT_sold'        => new EE_Integer_Field(
92
+					'DTT_sold',
93
+					esc_html__('How many sales for this Datetime that have occurred', 'event_espresso'),
94
+					false,
95
+					0
96
+				),
97
+				'DTT_reserved'    => new EE_Integer_Field(
98
+					'DTT_reserved',
99
+					esc_html__('Quantity of tickets reserved, but not yet fully purchased', 'event_espresso'),
100
+					false,
101
+					0
102
+				),
103
+				'DTT_is_primary'  => new EE_Boolean_Field(
104
+					'DTT_is_primary',
105
+					esc_html__('Flag indicating datetime is primary one for event', 'event_espresso'),
106
+					false,
107
+					false
108
+				),
109
+				'DTT_order'       => new EE_Integer_Field(
110
+					'DTT_order',
111
+					esc_html__('The order in which the Datetime is displayed', 'event_espresso'),
112
+					false,
113
+					0
114
+				),
115
+				'DTT_parent'      => new EE_Integer_Field(
116
+					'DTT_parent',
117
+					esc_html__('Indicates what DTT_ID is the parent of this DTT_ID', 'event_espresso'),
118
+					true,
119
+					0
120
+				),
121
+				'DTT_deleted'     => new EE_Trashed_Flag_Field(
122
+					'DTT_deleted',
123
+					esc_html__('Flag indicating datetime is archived', 'event_espresso'),
124
+					false,
125
+					false
126
+				),
127
+			],
128
+		];
129
+		$this->_model_relations        = [
130
+			'Ticket'          => new EE_HABTM_Relation('Datetime_Ticket'),
131
+			'Event'           => new EE_Belongs_To_Relation(),
132
+			'Checkin'         => new EE_Has_Many_Relation(),
133
+			'Datetime_Ticket' => new EE_Has_Many_Relation(),
134
+			'Venue'           => new EE_Belongs_To_Relation(),
135
+		];
136
+		$path_to_event_model           = 'Event';
137
+		$this->model_chain_to_password = $path_to_event_model;
138
+		$this->_model_chain_to_wp_user = $path_to_event_model;
139
+		// this model is generally available for reading
140
+		$this->_cap_restriction_generators[ EEM_Base::caps_read ]       =
141
+			new EE_Restriction_Generator_Event_Related_Public(
142
+				$path_to_event_model
143
+			);
144
+		$this->_cap_restriction_generators[ EEM_Base::caps_read_admin ] =
145
+			new EE_Restriction_Generator_Event_Related_Protected(
146
+				$path_to_event_model
147
+			);
148
+		$this->_cap_restriction_generators[ EEM_Base::caps_edit ]       =
149
+			new EE_Restriction_Generator_Event_Related_Protected(
150
+				$path_to_event_model
151
+			);
152
+		$this->_cap_restriction_generators[ EEM_Base::caps_delete ]     =
153
+			new EE_Restriction_Generator_Event_Related_Protected(
154
+				$path_to_event_model,
155
+				EEM_Base::caps_edit
156
+			);
157
+		parent::__construct($timezone);
158
+	}
159
+
160
+
161
+	/**
162
+	 * create new blank datetime
163
+	 *
164
+	 * @access public
165
+	 * @return EE_Datetime[] array on success, FALSE on fail
166
+	 * @throws EE_Error
167
+	 * @throws InvalidArgumentException
168
+	 * @throws InvalidDataTypeException
169
+	 * @throws ReflectionException
170
+	 * @throws InvalidInterfaceException
171
+	 */
172
+	public function create_new_blank_datetime()
173
+	{
174
+		// makes sure timezone is always set.
175
+		$timezone_string = $this->get_timezone();
176
+		/**
177
+		 * Filters the initial start date for the new datetime.
178
+		 * Any time included in this value will be overridden later so use additional filters to modify the time.
179
+		 *
180
+		 * @param int $start_date Unix timestamp representing now + 30 days in seconds.
181
+		 * @return int Unix timestamp
182
+		 */
183
+		$start_date = apply_filters(
184
+			'FHEE__EEM_Datetime__create_new_blank_datetime__start_date',
185
+			$this->current_time_for_query('DTT_EVT_start', true) + MONTH_IN_SECONDS
186
+		);
187
+		/**
188
+		 * Filters the initial end date for the new datetime.
189
+		 * Any time included in this value will be overridden later so use additional filters to modify the time.
190
+		 *
191
+		 * @param int $end_data Unix timestamp representing now + 30 days in seconds.
192
+		 * @return int Unix timestamp
193
+		 */
194
+		$end_date       = apply_filters(
195
+			'FHEE__EEM_Datetime__create_new_blank_datetime__end_date',
196
+			$this->current_time_for_query('DTT_EVT_end', true) + MONTH_IN_SECONDS
197
+		);
198
+		$blank_datetime = EE_Datetime::new_instance(
199
+			[
200
+				'DTT_EVT_start' => $start_date,
201
+				'DTT_EVT_end'   => $end_date,
202
+				'DTT_order'     => 1,
203
+				'DTT_reg_limit' => EE_INF_IN_DB,
204
+			],
205
+			$timezone_string
206
+		);
207
+		/**
208
+		 * Filters the initial start time and format for the new EE_Datetime instance.
209
+		 *
210
+		 * @param array $start_time An array having size 2.  First element is the time, second element is the time
211
+		 *                          format.
212
+		 * @return array
213
+		 */
214
+		$start_time = apply_filters(
215
+			'FHEE__EEM_Datetime__create_new_blank_datetime__start_time',
216
+			['8am', 'ga']
217
+		);
218
+		/**
219
+		 * Filters the initial end time and format for the new EE_Datetime instance.
220
+		 *
221
+		 * @param array $end_time An array having size 2.  First element is the time, second element is the time
222
+		 *                        format
223
+		 * @return array
224
+		 */
225
+		$end_time = apply_filters(
226
+			'FHEE__EEM_Datetime__create_new_blank_datetime__end_time',
227
+			['5pm', 'ga']
228
+		);
229
+		$this->validateStartAndEndTimeForBlankDate($start_time, $end_time);
230
+		$blank_datetime->set_start_time(
231
+			$this->convert_datetime_for_query(
232
+				'DTT_EVT_start',
233
+				$start_time[0],
234
+				$start_time[1],
235
+				$timezone_string
236
+			)
237
+		);
238
+		$blank_datetime->set_end_time(
239
+			$this->convert_datetime_for_query(
240
+				'DTT_EVT_end',
241
+				$end_time[0],
242
+				$end_time[1],
243
+				$timezone_string
244
+			)
245
+		);
246
+		return [$blank_datetime];
247
+	}
248
+
249
+
250
+	/**
251
+	 * Validates whether the start_time and end_time are in the expected format.
252
+	 *
253
+	 * @param array $start_time
254
+	 * @param array $end_time
255
+	 * @throws InvalidArgumentException
256
+	 * @throws InvalidDataTypeException
257
+	 */
258
+	private function validateStartAndEndTimeForBlankDate(array $start_time, array $end_time)
259
+	{
260
+		if (! is_array($start_time)) {
261
+			throw new InvalidDataTypeException('start_time', $start_time, 'array');
262
+		}
263
+		if (! is_array($end_time)) {
264
+			throw new InvalidDataTypeException('end_time', $end_time, 'array');
265
+		}
266
+		if (count($start_time) !== 2) {
267
+			throw new InvalidArgumentException(
268
+				sprintf(
269
+					'The variable %1$s is expected to be an array with two elements.  The first item in the '
270
+					. 'array should be a valid time string, the second item in the array should be a valid time format',
271
+					'$start_time'
272
+				)
273
+			);
274
+		}
275
+		if (count($end_time) !== 2) {
276
+			throw new InvalidArgumentException(
277
+				sprintf(
278
+					'The variable %1$s is expected to be an array with two elements.  The first item in the '
279
+					. 'array should be a valid time string, the second item in the array should be a valid time format',
280
+					'$end_time'
281
+				)
282
+			);
283
+		}
284
+	}
285
+
286
+
287
+	/**
288
+	 * get event start date from db
289
+	 *
290
+	 * @access public
291
+	 * @param int $EVT_ID
292
+	 * @return EE_Datetime[] array on success, FALSE on fail
293
+	 * @throws EE_Error
294
+	 * @throws ReflectionException
295
+	 */
296
+	public function get_all_event_dates($EVT_ID = 0)
297
+	{
298
+		if (! $EVT_ID) { // on add_new_event event_id gets set to 0
299
+			return $this->create_new_blank_datetime();
300
+		}
301
+		$results = $this->get_datetimes_for_event_ordered_by_DTT_order($EVT_ID);
302
+		if (empty($results)) {
303
+			return $this->create_new_blank_datetime();
304
+		}
305
+		return $results;
306
+	}
307
+
308
+
309
+	/**
310
+	 * get all datetimes attached to an event ordered by the DTT_order field
311
+	 *
312
+	 * @public
313
+	 * @param int     $EVT_ID     event id
314
+	 * @param boolean $include_expired
315
+	 * @param boolean $include_deleted
316
+	 * @param int     $limit      If included then limit the count of results by
317
+	 *                            the given number
318
+	 * @return EE_Datetime[]
319
+	 * @throws EE_Error
320
+	 */
321
+	public function get_datetimes_for_event_ordered_by_DTT_order(
322
+		int $EVT_ID,
323
+		bool $include_expired = true,
324
+		bool $include_deleted = true,
325
+		$limit = 0
326
+	) {
327
+		$prev_data_prep_value = $this->prepModelForQuery();
328
+		$where_params         = ['Event.EVT_ID' => absint($EVT_ID)];
329
+		$query_params[0]      = $this->addDefaultWhereParams($where_params, $include_deleted, $include_expired);
330
+		$query_params         = $this->addDefaultWhereConditions($query_params);
331
+		$query_params         = $this->addDefaultQueryParams($query_params, $limit, 'DTT_order');
332
+		return $this->getDatetimesAndRestoreModel($query_params, $prev_data_prep_value);
333
+	}
334
+
335
+
336
+	/**
337
+	 * Gets the datetimes for the event (with the given limit), and orders them by "importance".
338
+	 * By importance, we mean that the primary datetimes are most important (DEPRECATED FOR NOW),
339
+	 * and then the earlier datetimes are the most important.
340
+	 * Maybe we'll want this to take into account datetimes that haven't already passed, but we don't yet.
341
+	 *
342
+	 * @param int $EVT_ID
343
+	 * @param int $limit
344
+	 * @return EE_Datetime[]|EE_Base_Class[]
345
+	 * @throws EE_Error
346
+	 */
347
+	public function get_datetimes_for_event_ordered_by_importance(int $EVT_ID, $limit = 0)
348
+	{
349
+		$query_params[0] = ['Event.EVT_ID' => absint($EVT_ID)];
350
+		$query_params    = $this->addDefaultWhereConditions($query_params);
351
+		$query_params    = $this->addDefaultQueryParams($query_params, $limit);
352
+		return $this->get_all($query_params);
353
+	}
354
+
355
+
356
+	/**
357
+	 * @param int     $EVT_ID
358
+	 * @param boolean $include_expired
359
+	 * @param boolean $include_deleted
360
+	 * @return EE_Datetime
361
+	 * @throws EE_Error
362
+	 */
363
+	public function get_oldest_datetime_for_event(
364
+		int $EVT_ID,
365
+		bool $include_expired = false,
366
+		bool $include_deleted = false
367
+	) {
368
+		$results = $this->get_datetimes_for_event_ordered_by_start_time(
369
+			$EVT_ID,
370
+			$include_expired,
371
+			$include_deleted,
372
+			1
373
+		);
374
+		if ($results) {
375
+			return array_shift($results);
376
+		}
377
+		return null;
378
+	}
379
+
380
+
381
+	/**
382
+	 * Gets the 'primary' datetime for an event.
383
+	 *
384
+	 * @param int  $EVT_ID
385
+	 * @param bool $try_to_exclude_expired
386
+	 * @param bool $try_to_exclude_deleted
387
+	 * @return EE_Datetime
388
+	 * @throws EE_Error
389
+	 */
390
+	public function get_primary_datetime_for_event(
391
+		int $EVT_ID,
392
+		bool $try_to_exclude_expired = true,
393
+		bool $try_to_exclude_deleted = true
394
+	) {
395
+		if ($try_to_exclude_expired) {
396
+			$non_expired = $this->get_oldest_datetime_for_event($EVT_ID, false, false);
397
+			if ($non_expired) {
398
+				return $non_expired;
399
+			}
400
+		}
401
+		if ($try_to_exclude_deleted) {
402
+			$expired_even = $this->get_oldest_datetime_for_event($EVT_ID, true);
403
+			if ($expired_even) {
404
+				return $expired_even;
405
+			}
406
+		}
407
+		return $this->get_oldest_datetime_for_event($EVT_ID, true, true);
408
+	}
409
+
410
+
411
+	/**
412
+	 * Gets ALL the datetimes for an event (including trashed ones, for now), ordered
413
+	 * only by start date
414
+	 *
415
+	 * @param int     $EVT_ID
416
+	 * @param boolean $include_expired
417
+	 * @param boolean $include_deleted
418
+	 * @param int     $limit
419
+	 * @return EE_Datetime[]
420
+	 * @throws EE_Error
421
+	 */
422
+	public function get_datetimes_for_event_ordered_by_start_time(
423
+		int $EVT_ID,
424
+		bool $include_expired = true,
425
+		bool $include_deleted = true,
426
+		$limit = 0
427
+	) {
428
+		$prev_data_prep_value = $this->prepModelForQuery();
429
+		$where_params         = ['Event.EVT_ID' => absint($EVT_ID)];
430
+		$query_params[0]      = $this->addDefaultWhereParams($where_params, $include_deleted, $include_expired);
431
+		$query_params         = $this->addDefaultWhereConditions(
432
+			$query_params,
433
+			EEM_Base::default_where_conditions_this_only
434
+		);
435
+		$query_params         = $this->addDefaultQueryParams($query_params, $limit, 'DTT_order');
436
+		return $this->getDatetimesAndRestoreModel($query_params, $prev_data_prep_value);
437
+	}
438
+
439
+
440
+	/**
441
+	 * Gets ALL the datetimes for an ticket (including trashed ones, for now), ordered
442
+	 * only by start date
443
+	 *
444
+	 * @param int     $TKT_ID
445
+	 * @param boolean $include_expired
446
+	 * @param boolean $include_deleted
447
+	 * @param int     $limit
448
+	 * @return EE_Datetime[]
449
+	 * @throws EE_Error
450
+	 */
451
+	public function get_datetimes_for_ticket_ordered_by_start_time(
452
+		int $TKT_ID,
453
+		bool $include_expired = true,
454
+		bool $include_deleted = true,
455
+		$limit = 0
456
+	) {
457
+		$prev_data_prep_value = $this->prepModelForQuery();
458
+		$where_params         = ['Ticket.TKT_ID' => absint($TKT_ID)];
459
+		$query_params[0]      = $this->addDefaultWhereParams($where_params, $include_deleted, $include_expired);
460
+		$query_params         = $this->addDefaultQueryParams($query_params, $limit);
461
+		return $this->getDatetimesAndRestoreModel($query_params, $prev_data_prep_value);
462
+	}
463
+
464
+
465
+	/**
466
+	 * Gets all the datetimes for a ticket (including trashed ones, for now), ordered by the DTT_order for the
467
+	 * datetimes.
468
+	 *
469
+	 * @param int      $TKT_ID           ID of ticket to retrieve the datetimes for
470
+	 * @param boolean  $include_expired  whether to include expired datetimes or not
471
+	 * @param boolean  $include_deleted  whether to include trashed datetimes or not.
472
+	 * @param int|null $limit            if null, no limit, if int then limit results by
473
+	 *                                   that number
474
+	 * @return EE_Datetime[]
475
+	 * @throws EE_Error
476
+	 */
477
+	public function get_datetimes_for_ticket_ordered_by_DTT_order(
478
+		int $TKT_ID,
479
+		bool $include_expired = true,
480
+		bool $include_deleted = true,
481
+		$limit = 0
482
+	) {
483
+		$prev_data_prep_value = $this->prepModelForQuery();
484
+		$where_params         = ['Ticket.TKT_ID' => absint($TKT_ID)];
485
+		$query_params[0]      = $this->addDefaultWhereParams($where_params, $include_deleted, $include_expired);
486
+		$query_params         = $this->addDefaultQueryParams($query_params, $limit, 'DTT_order');
487
+		return $this->getDatetimesAndRestoreModel($query_params, $prev_data_prep_value);
488
+	}
489
+
490
+
491
+	/**
492
+	 * Gets the most important datetime for a particular event (ie, the primary event usually. But if for some WACK
493
+	 * reason it doesn't exist, we consider the earliest event the most important)
494
+	 *
495
+	 * @param int $EVT_ID
496
+	 * @return EE_Datetime
497
+	 * @throws EE_Error
498
+	 */
499
+	public function get_most_important_datetime_for_event(int $EVT_ID)
500
+	{
501
+		$results = $this->get_datetimes_for_event_ordered_by_importance($EVT_ID, 1);
502
+		if ($results) {
503
+			return array_shift($results);
504
+		}
505
+		return null;
506
+	}
507
+
508
+
509
+	/**
510
+	 * This returns a wpdb->results        Array of all DTT month and years matching the incoming query params and
511
+	 * grouped by month and year.
512
+	 *
513
+	 * @param array  $where_params       @see
514
+	 *                                   https://github.com/eventespresso/event-espresso-core/tree/master/docs/G--Model-System/model-query-params.md#0-where-conditions
515
+	 * @param string $evt_active_status  A string representing the evt active status to filter the months by.
516
+	 *                                   Can be:
517
+	 *                                   - '' = no filter
518
+	 *                                   - upcoming = Published events with at least one upcoming datetime.
519
+	 *                                   - expired = Events with all datetimes expired.
520
+	 *                                   - active = Events that are published and have at least one datetime that
521
+	 *                                   starts before now and ends after now.
522
+	 *                                   - inactive = Events that are either not published.
523
+	 * @return stdClass[]
524
+	 * @throws EE_Error
525
+	 * @throws InvalidArgumentException
526
+	 * @throws InvalidArgumentException
527
+	 */
528
+	public function get_dtt_months_and_years(array $where_params, $evt_active_status = '')
529
+	{
530
+		$current_time_for_DTT_EVT_start = $this->current_time_for_query('DTT_EVT_start');
531
+		$current_time_for_DTT_EVT_end   = $this->current_time_for_query('DTT_EVT_end');
532
+		switch ($evt_active_status) {
533
+			case 'upcoming':
534
+				$where_params['Event.status'] = 'publish';
535
+				// if there are already query_params matching DTT_EVT_start then we need to modify that to add them.
536
+				if (isset($where_params['DTT_EVT_start'])) {
537
+					$where_params['DTT_EVT_start*****'] = $where_params['DTT_EVT_start'];
538
+				}
539
+				$where_params['DTT_EVT_start'] = ['>', $current_time_for_DTT_EVT_start];
540
+				break;
541
+			case 'expired':
542
+				if (isset($where_params['Event.status'])) {
543
+					unset($where_params['Event.status']);
544
+				}
545
+				// get events to exclude
546
+				$exclude_query[0] = array_merge(
547
+					$where_params,
548
+					['DTT_EVT_end' => ['>', $current_time_for_DTT_EVT_end]]
549
+				);
550
+				// first get all events that have datetimes where its not expired.
551
+				$event_ids = $this->_get_all_wpdb_results(
552
+					$exclude_query,
553
+					OBJECT_K,
554
+					'Datetime.EVT_ID'
555
+				);
556
+				$event_ids = array_keys($event_ids);
557
+				if (isset($where_params['DTT_EVT_end'])) {
558
+					$where_params['DTT_EVT_end****'] = $where_params['DTT_EVT_end'];
559
+				}
560
+				$where_params['DTT_EVT_end']  = ['<', $current_time_for_DTT_EVT_end];
561
+				$where_params['Event.EVT_ID'] = ['NOT IN', $event_ids];
562
+				break;
563
+			case 'active':
564
+				$where_params['Event.status'] = 'publish';
565
+				if (isset($where_params['DTT_EVT_start'])) {
566
+					$where_params['Datetime.DTT_EVT_start******'] = $where_params['DTT_EVT_start'];
567
+				}
568
+				if (isset($where_params['Datetime.DTT_EVT_end'])) {
569
+					$where_params['Datetime.DTT_EVT_end*****'] = $where_params['DTT_EVT_end'];
570
+				}
571
+				$where_params['DTT_EVT_start'] = ['<', $current_time_for_DTT_EVT_start];
572
+				$where_params['DTT_EVT_end']   = ['>', $current_time_for_DTT_EVT_end];
573
+				break;
574
+			case 'inactive':
575
+				if (isset($where_params['Event.status'])) {
576
+					unset($where_params['Event.status']);
577
+				}
578
+				if (isset($where_params['OR'])) {
579
+					$where_params['AND']['OR'] = $where_params['OR'];
580
+				}
581
+				if (isset($where_params['DTT_EVT_end'])) {
582
+					$where_params['AND']['DTT_EVT_end****'] = $where_params['DTT_EVT_end'];
583
+					unset($where_params['DTT_EVT_end']);
584
+				}
585
+				if (isset($where_params['DTT_EVT_start'])) {
586
+					$where_params['AND']['DTT_EVT_start'] = $where_params['DTT_EVT_start'];
587
+					unset($where_params['DTT_EVT_start']);
588
+				}
589
+				$where_params['AND']['Event.status'] = ['!=', 'publish'];
590
+				break;
591
+		}
592
+		$query_params[0]          = $where_params;
593
+		$query_params['group_by'] = ['dtt_year', 'dtt_month'];
594
+		$query_params             = $this->addOrderByQueryParams($query_params, 'DTT_EVT_start', 'DESC');
595
+
596
+		$query_interval    = EEH_DTT_Helper::get_sql_query_interval_for_offset(
597
+			$this->get_timezone(),
598
+			'DTT_EVT_start'
599
+		);
600
+		$columns_to_select = [
601
+			'dtt_year'      => ['YEAR(' . $query_interval . ')', '%s'],
602
+			'dtt_month'     => ['MONTHNAME(' . $query_interval . ')', '%s'],
603
+			'dtt_month_num' => ['MONTH(' . $query_interval . ')', '%s'],
604
+		];
605
+		return $this->_get_all_wpdb_results($query_params, OBJECT, $columns_to_select);
606
+	}
607
+
608
+
609
+	/**
610
+	 * Updates the DTT_sold attribute on each datetime (based on the registrations
611
+	 * for the tickets for each datetime)
612
+	 *
613
+	 * @param EE_Base_Class[]|EE_Datetime[] $datetimes
614
+	 * @throws EE_Error
615
+	 * @throws ReflectionException
616
+	 */
617
+	public function update_sold(array $datetimes)
618
+	{
619
+		EE_Error::doing_it_wrong(
620
+			__FUNCTION__,
621
+			esc_html__(
622
+				'Please use \EEM_Ticket::update_tickets_sold() instead which will in turn correctly update both the Ticket AND Datetime counts.',
623
+				'event_espresso'
624
+			),
625
+			'4.9.32.rc.005'
626
+		);
627
+		foreach ($datetimes as $datetime) {
628
+			$datetime->update_sold();
629
+		}
630
+	}
631
+
632
+
633
+	/**
634
+	 *    Gets the total number of tickets available at a particular datetime
635
+	 *    (does NOT take into account the datetime's spaces available)
636
+	 *
637
+	 * @param int   $DTT_ID
638
+	 * @param array $query_params
639
+	 * @return int of tickets available. If sold out, return less than 1. If infinite, returns EE_INF,  IF there are NO
640
+	 *             tickets attached to datetime then FALSE is returned.
641
+	 * @throws EE_Error
642
+	 * @throws ReflectionException
643
+	 */
644
+	public function sum_tickets_currently_available_at_datetime(int $DTT_ID, array $query_params = [])
645
+	{
646
+		$datetime = $this->get_one_by_ID($DTT_ID);
647
+		if ($datetime instanceof EE_Datetime) {
648
+			return $datetime->tickets_remaining($query_params);
649
+		}
650
+		return 0;
651
+	}
652
+
653
+
654
+	/**
655
+	 * This returns an array of counts of datetimes in the database for each Datetime status that can be queried.
656
+	 *
657
+	 * @param array $stati_to_include  If included you can restrict the statuses we return counts for by including the
658
+	 *                                 stati you want counts for as values in the array.  An empty array returns counts
659
+	 *                                 for all valid stati.
660
+	 * @param array $query_params      If included can be used to refine the conditions for returning the count (i.e.
661
+	 *                                 only for Datetimes connected to a specific event, or specific ticket.
662
+	 * @return array  The value returned is an array indexed by Datetime Status and the values are the counts.  The
663
+	 * @throws EE_Error
664
+	 *                                 stati used as index keys are: EE_Datetime::active EE_Datetime::upcoming
665
+	 *                                 EE_Datetime::expired
666
+	 */
667
+	public function get_datetime_counts_by_status(array $stati_to_include = [], array $query_params = [])
668
+	{
669
+		// only accept where conditions for this query.
670
+		$_where            = isset($query_params[0]) ? $query_params[0] : [];
671
+		$status_query_args = [
672
+			EE_Datetime::active   => array_merge(
673
+				$_where,
674
+				['DTT_EVT_start' => ['<', time()], 'DTT_EVT_end' => ['>', time()]]
675
+			),
676
+			EE_Datetime::upcoming => array_merge(
677
+				$_where,
678
+				['DTT_EVT_start' => ['>', time()]]
679
+			),
680
+			EE_Datetime::expired  => array_merge(
681
+				$_where,
682
+				['DTT_EVT_end' => ['<', time()]]
683
+			),
684
+		];
685
+		if (! empty($stati_to_include)) {
686
+			foreach (array_keys($status_query_args) as $status) {
687
+				if (! in_array($status, $stati_to_include, true)) {
688
+					unset($status_query_args[ $status ]);
689
+				}
690
+			}
691
+		}
692
+		// loop through and query counts for each stati.
693
+		$status_query_results = [];
694
+		foreach ($status_query_args as $status => $status_where_conditions) {
695
+			$status_query_results[ $status ] = EEM_Datetime::count(
696
+				[$status_where_conditions],
697
+				'DTT_ID',
698
+				true
699
+			);
700
+		}
701
+		return $status_query_results;
702
+	}
703
+
704
+
705
+	/**
706
+	 * Returns the specific count for a given Datetime status matching any given query_params.
707
+	 *
708
+	 * @param string $status Valid string representation for Datetime status requested. (Defaults to Active).
709
+	 * @param array  $query_params
710
+	 * @return int
711
+	 * @throws EE_Error
712
+	 */
713
+	public function get_datetime_count_for_status($status = EE_Datetime::active, array $query_params = [])
714
+	{
715
+		$count = $this->get_datetime_counts_by_status([$status], $query_params);
716
+		return ! empty($count[ $status ]) ? $count[ $status ] : 0;
717
+	}
718
+
719
+
720
+	/**
721
+	 * @return bool|int
722
+	 * @since   5.0.0.p
723
+	 */
724
+	private function prepModelForQuery()
725
+	{
726
+		$prev_data_prep_value = $this->get_assumption_concerning_values_already_prepared_by_model_object();
727
+		$this->assume_values_already_prepared_by_model_object(EEM_Base::prepared_for_use_in_db);
728
+		return $prev_data_prep_value;
729
+	}
730
+
731
+
732
+	/**
733
+	 * @param array    $query_params
734
+	 * @param bool|int $prev_data_prep_value
735
+	 * @return EE_Base_Class[]|EE_Datetime[]
736
+	 * @throws EE_Error
737
+	 * @since   5.0.0.p
738
+	 */
739
+	private function getDatetimesAndRestoreModel(array $query_params, $prev_data_prep_value)
740
+	{
741
+		$result = $this->get_all($query_params);
742
+		$this->assume_values_already_prepared_by_model_object($prev_data_prep_value);
743
+		return $result;
744
+	}
745
+
746
+
747
+	/**
748
+	 * @param array  $query_params
749
+	 * @param int    $limit
750
+	 * @param string $order_by
751
+	 * @param string $order
752
+	 * @return array
753
+	 * @since   5.0.0.p
754
+	 */
755
+	private function addDefaultQueryParams(array $query_params, $limit = 0, $order_by = 'DTT_EVT_start', $order = 'ASC')
756
+	{
757
+		$query_params = $this->addOrderByQueryParams($query_params, $order_by, $order);
758
+		$query_params = $this->addLimitQueryParams($query_params, $limit);
759
+		return $query_params;
760
+	}
761
+
762
+
763
+	/**
764
+	 * @param array  $query_params
765
+	 * @param string $default_where_conditions
766
+	 * @return array
767
+	 * @since   5.0.0.p
768
+	 */
769
+	private function addDefaultWhereConditions(
770
+		array $query_params,
771
+		$default_where_conditions = EEM_Base::default_where_conditions_none
772
+	) {
773
+		$query_params['default_where_conditions'] = $default_where_conditions;
774
+		return $query_params;
775
+	}
776
+
777
+
778
+	/**
779
+	 * @param array $where_params
780
+	 * @param bool  $include_deleted
781
+	 * @param bool  $include_expired
782
+	 * @return array
783
+	 * @since   5.0.0.p
784
+	 */
785
+	private function addDefaultWhereParams(
786
+		array $where_params,
787
+		bool $include_deleted = true,
788
+		bool $include_expired = true
789
+	) {
790
+		$where_params = $this->addExpiredWhereParams($where_params, $include_expired);
791
+		$where_params = $this->addDeletedWhereParams($where_params, $include_deleted);
792
+		return $where_params;
793
+	}
794
+
795
+
796
+	/**
797
+	 * @param array $where_params
798
+	 * @param bool  $include_deleted
799
+	 * @return array
800
+	 * @since   5.0.0.p
801
+	 */
802
+	private function addDeletedWhereParams(array $where_params, bool $include_deleted = true)
803
+	{
804
+		$deleted                     = $include_deleted ? [true, false] : [false];
805
+		$where_params['DTT_deleted'] = ['IN', $deleted];
806
+		return $where_params;
807
+	}
808
+
809
+
810
+	/**
811
+	 * @param array $where_params
812
+	 * @param bool  $include_expired
813
+	 * @return array
814
+	 * @since   5.0.0.p
815
+	 */
816
+	private function addExpiredWhereParams(array $where_params, bool $include_expired = true)
817
+	{
818
+		if (! $include_expired) {
819
+			$where_params['DTT_EVT_end'] = ['>=', current_time('mysql', true)];
820
+		}
821
+		return $where_params;
822
+	}
823
+
824
+
825
+	/**
826
+	 * @param array $query_params
827
+	 * @param int   $limit
828
+	 * @return array
829
+	 * @since   5.0.0.p
830
+	 */
831
+	private function addLimitQueryParams(array $query_params, $limit = 0)
832
+	{
833
+		if ($limit) {
834
+			$query_params['limit'] = $limit;
835
+		}
836
+		return $query_params;
837
+	}
838
+
839
+
840
+	/**
841
+	 * @param array  $query_params
842
+	 * @param string $order_by
843
+	 * @param string $order
844
+	 * @return array
845
+	 * @since   5.0.0.p
846
+	 */
847
+	private function addOrderByQueryParams(array $query_params, $order_by = 'DTT_EVT_start', $order = 'ASC')
848
+	{
849
+		$order                    = $order === 'ASC' ? 'ASC' : 'DESC';
850
+		$valid_order_columns      = ['DTT_ID', 'DTT_EVT_start', 'DTT_EVT_end', 'DTT_order'];
851
+		$order_by                 = in_array($order_by, $valid_order_columns, true) ? $order_by : 'DTT_EVT_start';
852
+		$query_params['order_by'] = [$order_by => $order];
853
+		return $query_params;
854
+	}
855 855
 }
Please login to merge, or discard this patch.
core/services/routing/Route.php 2 patches
Spacing   +2 added lines, -2 removed lines patch added patch discarded remove patch
@@ -251,7 +251,7 @@  discard block
 block discarded – undo
251 251
     private function loadDataNode()
252 252
     {
253 253
         $data_node_fqcn = $this->dataNodeClass();
254
-        if (! empty($data_node_fqcn)) {
254
+        if ( ! empty($data_node_fqcn)) {
255 255
             $data_node = $this->loader->getShared($data_node_fqcn);
256 256
             $this->setDataNode($data_node);
257 257
         }
@@ -279,7 +279,7 @@  discard block
 block discarded – undo
279 279
      */
280 280
     private function verifyIsHandled($handled)
281 281
     {
282
-        if (! is_bool($handled)) {
282
+        if ( ! is_bool($handled)) {
283 283
             throw new DomainException(
284 284
                 esc_html__(
285 285
                     'Route::requestHandler() must return a boolean to indicate whether the request has been handled or not.',
Please login to merge, or discard this patch.
Indentation   +267 added lines, -267 removed lines patch added patch discarded remove patch
@@ -28,271 +28,271 @@
 block discarded – undo
28 28
  */
29 29
 abstract class Route implements RouteInterface, RequiresCapCheckInterface
30 30
 {
31
-    /**
32
-     * @var AssetManagerInterface $asset_manager
33
-     */
34
-    protected $asset_manager;
35
-
36
-    /**
37
-     * @var EE_Dependency_Map $dependency_map
38
-     */
39
-    protected $dependency_map;
40
-
41
-    /**
42
-     * @var JsonDataNode $data_node
43
-     */
44
-    protected $data_node;
45
-
46
-    /**
47
-     * @var LoaderInterface $loader
48
-     */
49
-    protected $loader;
50
-
51
-    /**
52
-     * @var RequestInterface $request
53
-     */
54
-    protected $request;
55
-
56
-    /**
57
-     * @var RouteMatchSpecificationInterface $specification
58
-     */
59
-    protected $specification;
60
-
61
-    /**
62
-     * @var boolean $handled
63
-     */
64
-    private $handled = false;
65
-
66
-    /**
67
-     * @var array $default_dependencies
68
-     */
69
-    protected static $default_dependencies = [
70
-        'EE_Dependency_Map'                           => EE_Dependency_Map::load_from_cache,
71
-        'EventEspresso\core\services\loaders\Loader'  => EE_Dependency_Map::load_from_cache,
72
-        'EventEspresso\core\services\request\Request' => EE_Dependency_Map::load_from_cache,
73
-    ];
74
-
75
-    /**
76
-     * @var array $full_dependencies
77
-     */
78
-    protected static $full_dependencies = [
79
-        'EE_Dependency_Map'                             => EE_Dependency_Map::load_from_cache,
80
-        'EventEspresso\core\services\loaders\Loader'    => EE_Dependency_Map::load_from_cache,
81
-        'EventEspresso\core\services\request\Request'   => EE_Dependency_Map::load_from_cache,
82
-        'EventEspresso\core\services\json\JsonDataNode' => EE_Dependency_Map::load_from_cache,
83
-        RouteMatchSpecificationInterface::class         => EE_Dependency_Map::load_from_cache,
84
-    ];
85
-
86
-
87
-    /**
88
-     * Route constructor.
89
-     *
90
-     * @param EE_Dependency_Map                     $dependency_map
91
-     * @param LoaderInterface                       $loader
92
-     * @param RequestInterface                      $request
93
-     * @param JsonDataNode|null                     $data_node
94
-     * @param RouteMatchSpecificationInterface|null $specification
95
-     */
96
-    public function __construct(
97
-        EE_Dependency_Map $dependency_map,
98
-        LoaderInterface $loader,
99
-        RequestInterface $request,
100
-        JsonDataNode $data_node = null,
101
-        RouteMatchSpecificationInterface $specification = null
102
-    ) {
103
-        $this->dependency_map = $dependency_map;
104
-        $this->data_node      = $data_node;
105
-        $this->loader         = $loader;
106
-        $this->request        = $request;
107
-        $this->setSpecification($specification);
108
-    }
109
-
110
-
111
-    /**
112
-     * @return void
113
-     */
114
-    abstract protected function registerDependencies();
115
-
116
-
117
-    /**
118
-     * implements logic required to run during request
119
-     *
120
-     * @return bool
121
-     */
122
-    abstract protected function requestHandler(): bool;
123
-
124
-
125
-    /**
126
-     * called just before matchesCurrentRequest()
127
-     * and allows Route to perform any setup required such as calling setSpecification()
128
-     *
129
-     * @return void
130
-     */
131
-    public function initialize()
132
-    {
133
-        // do nothing by default
134
-    }
135
-
136
-
137
-    /**
138
-     * returns true if the current request matches this route
139
-     * child classes can override and use Request directly to match route with request
140
-     * or supply a RouteMatchSpecification class and just use the below
141
-     *
142
-     * @return bool
143
-     */
144
-    public function matchesCurrentRequest(): bool
145
-    {
146
-        return $this->specification instanceof RouteMatchSpecificationInterface
147
-               && $this->specification->isMatchingRoute();
148
-    }
149
-
150
-
151
-    /**
152
-     * returns the FQCN for this route's JsonDataNode
153
-     *
154
-     * @return string
155
-     */
156
-    protected function dataNodeClass(): string
157
-    {
158
-        return '';
159
-    }
160
-
161
-
162
-    public function getCapCheck()
163
-    {
164
-        return new PublicCapabilities('', 'access Event Espresso route');
165
-    }
166
-
167
-
168
-    /**
169
-     * @return array
170
-     */
171
-    public static function getDefaultDependencies(): array
172
-    {
173
-        return self::$default_dependencies;
174
-    }
175
-
176
-
177
-    /**
178
-     * @return array
179
-     */
180
-    public static function getFullDependencies(): array
181
-    {
182
-        return self::$full_dependencies;
183
-    }
184
-
185
-
186
-    /**
187
-     * @param JsonDataNode|null $data_node
188
-     */
189
-    protected function setDataNode(JsonDataNode $data_node = null)
190
-    {
191
-        $this->data_node = $data_node;
192
-    }
193
-
194
-
195
-    /**
196
-     * @param RouteMatchSpecificationInterface|null $specification
197
-     */
198
-    protected function setSpecification(RouteMatchSpecificationInterface $specification = null)
199
-    {
200
-        $this->specification = $specification;
201
-    }
202
-
203
-
204
-    /**
205
-     * @return JsonDataNode
206
-     */
207
-    public function dataNode(): ?JsonDataNode
208
-    {
209
-        return $this->data_node;
210
-    }
211
-
212
-
213
-    /**
214
-     * runs route requestHandler() if
215
-     *      - route has not previously been handled
216
-     *      - route specification matches for current request
217
-     * sets route handled property based on results returned by requestHandler()
218
-     *
219
-     * @return bool
220
-     */
221
-    public function handleRequest(): bool
222
-    {
223
-        if ($this->isNotHandled()) {
224
-            $this->initialize();
225
-            if ($this->matchesCurrentRequest()) {
226
-                do_action('AHEE__EventEspresso_core_domain_entities_routes_handlers_Route__handleRequest', $this);
227
-                $this->registerDependencies();
228
-                $this->loadDataNode();
229
-                $this->verifyIsHandled($this->requestHandler());
230
-            }
231
-        }
232
-        return $this->handled;
233
-    }
234
-
235
-
236
-    /**
237
-     * @return bool
238
-     */
239
-    final public function isHandled(): bool
240
-    {
241
-        return $this->handled;
242
-    }
243
-
244
-
245
-    /**
246
-     * @return bool
247
-     */
248
-    final public function isNotHandled(): bool
249
-    {
250
-        return ! $this->handled;
251
-    }
252
-
253
-
254
-    /**
255
-     * @return void
256
-     */
257
-    private function loadDataNode()
258
-    {
259
-        $data_node_fqcn = $this->dataNodeClass();
260
-        if (! empty($data_node_fqcn)) {
261
-            $data_node = $this->loader->getShared($data_node_fqcn);
262
-            $this->setDataNode($data_node);
263
-        }
264
-    }
265
-
266
-
267
-    /**
268
-     * @param string $domain_fqcn
269
-     */
270
-    public function initializeBaristaForDomain(string $domain_fqcn)
271
-    {
272
-        if (apply_filters('FHEE__load_Barista', true)) {
273
-            /** @var BaristaFactory $factory */
274
-            $factory = $this->loader->getShared(BaristaFactory::class);
275
-            $barista = $factory->createFromDomainClass($domain_fqcn);
276
-            if ($barista instanceof BaristaInterface) {
277
-                $barista->initialize();
278
-            }
279
-        }
280
-    }
281
-
282
-
283
-    /**
284
-     * @var bool
285
-     */
286
-    private function verifyIsHandled($handled)
287
-    {
288
-        if (! is_bool($handled)) {
289
-            throw new DomainException(
290
-                esc_html__(
291
-                    'Route::requestHandler() must return a boolean to indicate whether the request has been handled or not.',
292
-                    'event_espresso'
293
-                )
294
-            );
295
-        }
296
-        $this->handled = filter_var($handled, FILTER_VALIDATE_BOOLEAN);
297
-    }
31
+	/**
32
+	 * @var AssetManagerInterface $asset_manager
33
+	 */
34
+	protected $asset_manager;
35
+
36
+	/**
37
+	 * @var EE_Dependency_Map $dependency_map
38
+	 */
39
+	protected $dependency_map;
40
+
41
+	/**
42
+	 * @var JsonDataNode $data_node
43
+	 */
44
+	protected $data_node;
45
+
46
+	/**
47
+	 * @var LoaderInterface $loader
48
+	 */
49
+	protected $loader;
50
+
51
+	/**
52
+	 * @var RequestInterface $request
53
+	 */
54
+	protected $request;
55
+
56
+	/**
57
+	 * @var RouteMatchSpecificationInterface $specification
58
+	 */
59
+	protected $specification;
60
+
61
+	/**
62
+	 * @var boolean $handled
63
+	 */
64
+	private $handled = false;
65
+
66
+	/**
67
+	 * @var array $default_dependencies
68
+	 */
69
+	protected static $default_dependencies = [
70
+		'EE_Dependency_Map'                           => EE_Dependency_Map::load_from_cache,
71
+		'EventEspresso\core\services\loaders\Loader'  => EE_Dependency_Map::load_from_cache,
72
+		'EventEspresso\core\services\request\Request' => EE_Dependency_Map::load_from_cache,
73
+	];
74
+
75
+	/**
76
+	 * @var array $full_dependencies
77
+	 */
78
+	protected static $full_dependencies = [
79
+		'EE_Dependency_Map'                             => EE_Dependency_Map::load_from_cache,
80
+		'EventEspresso\core\services\loaders\Loader'    => EE_Dependency_Map::load_from_cache,
81
+		'EventEspresso\core\services\request\Request'   => EE_Dependency_Map::load_from_cache,
82
+		'EventEspresso\core\services\json\JsonDataNode' => EE_Dependency_Map::load_from_cache,
83
+		RouteMatchSpecificationInterface::class         => EE_Dependency_Map::load_from_cache,
84
+	];
85
+
86
+
87
+	/**
88
+	 * Route constructor.
89
+	 *
90
+	 * @param EE_Dependency_Map                     $dependency_map
91
+	 * @param LoaderInterface                       $loader
92
+	 * @param RequestInterface                      $request
93
+	 * @param JsonDataNode|null                     $data_node
94
+	 * @param RouteMatchSpecificationInterface|null $specification
95
+	 */
96
+	public function __construct(
97
+		EE_Dependency_Map $dependency_map,
98
+		LoaderInterface $loader,
99
+		RequestInterface $request,
100
+		JsonDataNode $data_node = null,
101
+		RouteMatchSpecificationInterface $specification = null
102
+	) {
103
+		$this->dependency_map = $dependency_map;
104
+		$this->data_node      = $data_node;
105
+		$this->loader         = $loader;
106
+		$this->request        = $request;
107
+		$this->setSpecification($specification);
108
+	}
109
+
110
+
111
+	/**
112
+	 * @return void
113
+	 */
114
+	abstract protected function registerDependencies();
115
+
116
+
117
+	/**
118
+	 * implements logic required to run during request
119
+	 *
120
+	 * @return bool
121
+	 */
122
+	abstract protected function requestHandler(): bool;
123
+
124
+
125
+	/**
126
+	 * called just before matchesCurrentRequest()
127
+	 * and allows Route to perform any setup required such as calling setSpecification()
128
+	 *
129
+	 * @return void
130
+	 */
131
+	public function initialize()
132
+	{
133
+		// do nothing by default
134
+	}
135
+
136
+
137
+	/**
138
+	 * returns true if the current request matches this route
139
+	 * child classes can override and use Request directly to match route with request
140
+	 * or supply a RouteMatchSpecification class and just use the below
141
+	 *
142
+	 * @return bool
143
+	 */
144
+	public function matchesCurrentRequest(): bool
145
+	{
146
+		return $this->specification instanceof RouteMatchSpecificationInterface
147
+			   && $this->specification->isMatchingRoute();
148
+	}
149
+
150
+
151
+	/**
152
+	 * returns the FQCN for this route's JsonDataNode
153
+	 *
154
+	 * @return string
155
+	 */
156
+	protected function dataNodeClass(): string
157
+	{
158
+		return '';
159
+	}
160
+
161
+
162
+	public function getCapCheck()
163
+	{
164
+		return new PublicCapabilities('', 'access Event Espresso route');
165
+	}
166
+
167
+
168
+	/**
169
+	 * @return array
170
+	 */
171
+	public static function getDefaultDependencies(): array
172
+	{
173
+		return self::$default_dependencies;
174
+	}
175
+
176
+
177
+	/**
178
+	 * @return array
179
+	 */
180
+	public static function getFullDependencies(): array
181
+	{
182
+		return self::$full_dependencies;
183
+	}
184
+
185
+
186
+	/**
187
+	 * @param JsonDataNode|null $data_node
188
+	 */
189
+	protected function setDataNode(JsonDataNode $data_node = null)
190
+	{
191
+		$this->data_node = $data_node;
192
+	}
193
+
194
+
195
+	/**
196
+	 * @param RouteMatchSpecificationInterface|null $specification
197
+	 */
198
+	protected function setSpecification(RouteMatchSpecificationInterface $specification = null)
199
+	{
200
+		$this->specification = $specification;
201
+	}
202
+
203
+
204
+	/**
205
+	 * @return JsonDataNode
206
+	 */
207
+	public function dataNode(): ?JsonDataNode
208
+	{
209
+		return $this->data_node;
210
+	}
211
+
212
+
213
+	/**
214
+	 * runs route requestHandler() if
215
+	 *      - route has not previously been handled
216
+	 *      - route specification matches for current request
217
+	 * sets route handled property based on results returned by requestHandler()
218
+	 *
219
+	 * @return bool
220
+	 */
221
+	public function handleRequest(): bool
222
+	{
223
+		if ($this->isNotHandled()) {
224
+			$this->initialize();
225
+			if ($this->matchesCurrentRequest()) {
226
+				do_action('AHEE__EventEspresso_core_domain_entities_routes_handlers_Route__handleRequest', $this);
227
+				$this->registerDependencies();
228
+				$this->loadDataNode();
229
+				$this->verifyIsHandled($this->requestHandler());
230
+			}
231
+		}
232
+		return $this->handled;
233
+	}
234
+
235
+
236
+	/**
237
+	 * @return bool
238
+	 */
239
+	final public function isHandled(): bool
240
+	{
241
+		return $this->handled;
242
+	}
243
+
244
+
245
+	/**
246
+	 * @return bool
247
+	 */
248
+	final public function isNotHandled(): bool
249
+	{
250
+		return ! $this->handled;
251
+	}
252
+
253
+
254
+	/**
255
+	 * @return void
256
+	 */
257
+	private function loadDataNode()
258
+	{
259
+		$data_node_fqcn = $this->dataNodeClass();
260
+		if (! empty($data_node_fqcn)) {
261
+			$data_node = $this->loader->getShared($data_node_fqcn);
262
+			$this->setDataNode($data_node);
263
+		}
264
+	}
265
+
266
+
267
+	/**
268
+	 * @param string $domain_fqcn
269
+	 */
270
+	public function initializeBaristaForDomain(string $domain_fqcn)
271
+	{
272
+		if (apply_filters('FHEE__load_Barista', true)) {
273
+			/** @var BaristaFactory $factory */
274
+			$factory = $this->loader->getShared(BaristaFactory::class);
275
+			$barista = $factory->createFromDomainClass($domain_fqcn);
276
+			if ($barista instanceof BaristaInterface) {
277
+				$barista->initialize();
278
+			}
279
+		}
280
+	}
281
+
282
+
283
+	/**
284
+	 * @var bool
285
+	 */
286
+	private function verifyIsHandled($handled)
287
+	{
288
+		if (! is_bool($handled)) {
289
+			throw new DomainException(
290
+				esc_html__(
291
+					'Route::requestHandler() must return a boolean to indicate whether the request has been handled or not.',
292
+					'event_espresso'
293
+				)
294
+			);
295
+		}
296
+		$this->handled = filter_var($handled, FILTER_VALIDATE_BOOLEAN);
297
+	}
298 298
 }
Please login to merge, or discard this patch.
core/services/addon/AddonManager.php 2 patches
Spacing   +2 added lines, -2 removed lines patch added patch discarded remove patch
@@ -80,7 +80,7 @@  discard block
 block discarded – undo
80 80
     {
81 81
         // set autoloaders for all of the classes implementing the legacy EEI_Plugin_API
82 82
         // which provide helpers for EE plugin authors to more easily register certain components with EE.
83
-        EEH_Autoloader::register_autoloaders_for_each_file_in_folder(EE_LIBRARIES . 'plugin_api');
83
+        EEH_Autoloader::register_autoloaders_for_each_file_in_folder(EE_LIBRARIES.'plugin_api');
84 84
     }
85 85
 
86 86
 
@@ -120,7 +120,7 @@  discard block
 block discarded – undo
120 120
     private function registerAddon(AddonApiVersion $addon)
121 121
     {
122 122
         // first register addon namespace so that FQCNs resolve correctly
123
-        $this->psr4_loader->addNamespace($addon->getNamespace(), dirname($addon->mainFile()) . '/src/');
123
+        $this->psr4_loader->addNamespace($addon->getNamespace(), dirname($addon->mainFile()).'/src/');
124 124
         // then allow add-on to perform any other setup that relied on PSR4 autoloading
125 125
         $addon->initialize();
126 126
         // now register each addon based on it's API version
Please login to merge, or discard this patch.
Indentation   +79 added lines, -79 removed lines patch added patch discarded remove patch
@@ -23,95 +23,95 @@
 block discarded – undo
23 23
  */
24 24
 class AddonManager
25 25
 {
26
-    private AddonCollection          $addons;
26
+	private AddonCollection          $addons;
27 27
 
28
-    private IncompatibleAddonHandler $incompatible_addon_handler;
28
+	private IncompatibleAddonHandler $incompatible_addon_handler;
29 29
 
30
-    private Psr4Autoloader           $psr4_loader;
30
+	private Psr4Autoloader           $psr4_loader;
31 31
 
32
-    private RegisterV1Addon          $register_v1_addon;
32
+	private RegisterV1Addon          $register_v1_addon;
33 33
 
34
-    private ThirdPartyPluginHandler  $third_party_plugin_handler;
34
+	private ThirdPartyPluginHandler  $third_party_plugin_handler;
35 35
 
36 36
 
37
-    /**
38
-     * AddonManager constructor.
39
-     *
40
-     * @param AddonCollection          $addons
41
-     * @param Psr4Autoloader           $psr4_loader
42
-     * @param RegisterV1Addon          $register_v1_addon
43
-     * @param IncompatibleAddonHandler $incompatible_addon_handler
44
-     * @param ThirdPartyPluginHandler  $third_party_plugin_handler
45
-     */
46
-    public function __construct(
47
-        AddonCollection $addons,
48
-        Psr4Autoloader $psr4_loader,
49
-        RegisterV1Addon $register_v1_addon,
50
-        IncompatibleAddonHandler $incompatible_addon_handler,
51
-        ThirdPartyPluginHandler $third_party_plugin_handler
52
-    ) {
53
-        $this->addons                     = $addons;
54
-        $this->psr4_loader                = $psr4_loader;
55
-        $this->register_v1_addon          = $register_v1_addon;
56
-        $this->incompatible_addon_handler = $incompatible_addon_handler;
57
-        $this->third_party_plugin_handler = $third_party_plugin_handler;
58
-    }
37
+	/**
38
+	 * AddonManager constructor.
39
+	 *
40
+	 * @param AddonCollection          $addons
41
+	 * @param Psr4Autoloader           $psr4_loader
42
+	 * @param RegisterV1Addon          $register_v1_addon
43
+	 * @param IncompatibleAddonHandler $incompatible_addon_handler
44
+	 * @param ThirdPartyPluginHandler  $third_party_plugin_handler
45
+	 */
46
+	public function __construct(
47
+		AddonCollection $addons,
48
+		Psr4Autoloader $psr4_loader,
49
+		RegisterV1Addon $register_v1_addon,
50
+		IncompatibleAddonHandler $incompatible_addon_handler,
51
+		ThirdPartyPluginHandler $third_party_plugin_handler
52
+	) {
53
+		$this->addons                     = $addons;
54
+		$this->psr4_loader                = $psr4_loader;
55
+		$this->register_v1_addon          = $register_v1_addon;
56
+		$this->incompatible_addon_handler = $incompatible_addon_handler;
57
+		$this->third_party_plugin_handler = $third_party_plugin_handler;
58
+	}
59 59
 
60 60
 
61
-    /**
62
-     * @throws Exception
63
-     */
64
-    public function initialize()
65
-    {
66
-        // set autoloaders for all of the classes implementing the legacy EEI_Plugin_API
67
-        // which provide helpers for EE plugin authors to more easily register certain components with EE.
68
-        EEH_Autoloader::register_autoloaders_for_each_file_in_folder(EE_LIBRARIES . 'plugin_api');
69
-    }
61
+	/**
62
+	 * @throws Exception
63
+	 */
64
+	public function initialize()
65
+	{
66
+		// set autoloaders for all of the classes implementing the legacy EEI_Plugin_API
67
+		// which provide helpers for EE plugin authors to more easily register certain components with EE.
68
+		EEH_Autoloader::register_autoloaders_for_each_file_in_folder(EE_LIBRARIES . 'plugin_api');
69
+	}
70 70
 
71 71
 
72
-    /**
73
-     * @throws Exception
74
-     * @throws Throwable
75
-     */
76
-    public function loadAddons()
77
-    {
78
-        try {
79
-            $this->incompatible_addon_handler->deactivateIncompatibleAddons();
80
-            // legacy add-on API
81
-            do_action('AHEE__EE_System__load_espresso_addons');
82
-            // new add-on API that uses versioning
83
-            do_action(
84
-                'AHEE__EventEspresso_core_services_addon_AddonManager__initialize__addons',
85
-                $this->addons,
86
-                espresso_version()
87
-            );
88
-            // addons are responsible for loading their AddonApiVersion into the AddonCollection
89
-            foreach ($this->addons as $addon) {
90
-                if ($addon instanceof AddonApiVersion) {
91
-                    $this->registerAddon($addon);
92
-                }
93
-            }
94
-            $this->third_party_plugin_handler->loadPlugins();
95
-            do_action('AHEE__EE_System__load_espresso_addons__complete');
96
-        } catch (Exception $exception) {
97
-            new ExceptionStackTraceDisplay($exception);
98
-        }
99
-    }
72
+	/**
73
+	 * @throws Exception
74
+	 * @throws Throwable
75
+	 */
76
+	public function loadAddons()
77
+	{
78
+		try {
79
+			$this->incompatible_addon_handler->deactivateIncompatibleAddons();
80
+			// legacy add-on API
81
+			do_action('AHEE__EE_System__load_espresso_addons');
82
+			// new add-on API that uses versioning
83
+			do_action(
84
+				'AHEE__EventEspresso_core_services_addon_AddonManager__initialize__addons',
85
+				$this->addons,
86
+				espresso_version()
87
+			);
88
+			// addons are responsible for loading their AddonApiVersion into the AddonCollection
89
+			foreach ($this->addons as $addon) {
90
+				if ($addon instanceof AddonApiVersion) {
91
+					$this->registerAddon($addon);
92
+				}
93
+			}
94
+			$this->third_party_plugin_handler->loadPlugins();
95
+			do_action('AHEE__EE_System__load_espresso_addons__complete');
96
+		} catch (Exception $exception) {
97
+			new ExceptionStackTraceDisplay($exception);
98
+		}
99
+	}
100 100
 
101 101
 
102
-    /**
103
-     * @param AddonApiVersion $addon
104
-     * @throws EE_Error
105
-     */
106
-    private function registerAddon(AddonApiVersion $addon)
107
-    {
108
-        // first register addon namespace so that FQCNs resolve correctly
109
-        $this->psr4_loader->addNamespace($addon->getNamespace(), dirname($addon->mainFile()) . '/src/');
110
-        // then allow add-on to perform any other setup that relied on PSR4 autoloading
111
-        $addon->initialize();
112
-        // now register each addon based on it's API version
113
-        if ($addon instanceof AddonApiV1) {
114
-            $this->register_v1_addon->register($addon);
115
-        }
116
-    }
102
+	/**
103
+	 * @param AddonApiVersion $addon
104
+	 * @throws EE_Error
105
+	 */
106
+	private function registerAddon(AddonApiVersion $addon)
107
+	{
108
+		// first register addon namespace so that FQCNs resolve correctly
109
+		$this->psr4_loader->addNamespace($addon->getNamespace(), dirname($addon->mainFile()) . '/src/');
110
+		// then allow add-on to perform any other setup that relied on PSR4 autoloading
111
+		$addon->initialize();
112
+		// now register each addon based on it's API version
113
+		if ($addon instanceof AddonApiV1) {
114
+			$this->register_v1_addon->register($addon);
115
+		}
116
+	}
117 117
 }
Please login to merge, or discard this patch.
core/services/addon/api/IncompatibleAddonHandler.php 2 patches
Spacing   +4 added lines, -4 removed lines patch added patch discarded remove patch
@@ -43,14 +43,14 @@  discard block
 block discarded – undo
43 43
         string $load_callback,
44 44
         string $plugin_file_constant
45 45
     ) {
46
-        if (! defined($version_constant)) {
46
+        if ( ! defined($version_constant)) {
47 47
             return;
48 48
         }
49 49
         $addon_version = constant($version_constant);
50 50
         if ($addon_version && version_compare($addon_version, $min_version_required, '<')) {
51 51
             remove_action('AHEE__EE_System__load_espresso_addons', $load_callback);
52
-            if (! function_exists('deactivate_plugins')) {
53
-                require_once ABSPATH . 'wp-admin/includes/plugin.php';
52
+            if ( ! function_exists('deactivate_plugins')) {
53
+                require_once ABSPATH.'wp-admin/includes/plugin.php';
54 54
             }
55 55
             deactivate_plugins(plugin_basename(constant($plugin_file_constant)));
56 56
             unset($_GET['activate'], $_REQUEST['activate'], $_GET['activate-multi'], $_REQUEST['activate-multi']);
@@ -64,7 +64,7 @@  discard block
 block discarded – undo
64 64
                     $min_version_required
65 65
                 ),
66 66
                 __FILE__,
67
-                __FUNCTION__ . "({$addon_name})",
67
+                __FUNCTION__."({$addon_name})",
68 68
                 __LINE__
69 69
             );
70 70
             EE_Error::get_notices(false, true);
Please login to merge, or discard this patch.
Indentation   +74 added lines, -74 removed lines patch added patch discarded remove patch
@@ -6,80 +6,80 @@
 block discarded – undo
6 6
 
7 7
 class IncompatibleAddonHandler
8 8
 {
9
-    /**
10
-     * @return void
11
-     */
12
-    public function deactivateIncompatibleAddons()
13
-    {
14
-        static $done = false;
15
-        if ($done) {
16
-            return;
17
-        }
18
-        $this->deactivateIncompatibleAddon(
19
-            'Wait Lists',
20
-            'EE_WAIT_LISTS_VERSION',
21
-            '1.0.0.beta.074',
22
-            'load_espresso_wait_lists',
23
-            'EE_WAIT_LISTS_PLUGIN_FILE'
24
-        );
25
-        $this->deactivateIncompatibleAddon(
26
-            'Automated Upcoming Event Notifications',
27
-            'EE_AUTOMATED_UPCOMING_EVENT_NOTIFICATION_VERSION',
28
-            '1.0.0.beta.091',
29
-            'load_espresso_automated_upcoming_event_notification',
30
-            'EE_AUTOMATED_UPCOMING_EVENT_NOTIFICATION_PLUGIN_FILE'
31
-        );
32
-        // $this->deactivateIncompatibleAddon(
33
-        //     'WP Users Integration',
34
-        //     'EE_WPUSERS_VERSION',
35
-        //     '2.1.0.rc.003',
36
-        //     'load_ee_core_wpusers',
37
-        //     'EE_WPUSERS_PLUGIN_FILE'
38
-        // );
39
-        $done = true;
40
-    }
9
+	/**
10
+	 * @return void
11
+	 */
12
+	public function deactivateIncompatibleAddons()
13
+	{
14
+		static $done = false;
15
+		if ($done) {
16
+			return;
17
+		}
18
+		$this->deactivateIncompatibleAddon(
19
+			'Wait Lists',
20
+			'EE_WAIT_LISTS_VERSION',
21
+			'1.0.0.beta.074',
22
+			'load_espresso_wait_lists',
23
+			'EE_WAIT_LISTS_PLUGIN_FILE'
24
+		);
25
+		$this->deactivateIncompatibleAddon(
26
+			'Automated Upcoming Event Notifications',
27
+			'EE_AUTOMATED_UPCOMING_EVENT_NOTIFICATION_VERSION',
28
+			'1.0.0.beta.091',
29
+			'load_espresso_automated_upcoming_event_notification',
30
+			'EE_AUTOMATED_UPCOMING_EVENT_NOTIFICATION_PLUGIN_FILE'
31
+		);
32
+		// $this->deactivateIncompatibleAddon(
33
+		//     'WP Users Integration',
34
+		//     'EE_WPUSERS_VERSION',
35
+		//     '2.1.0.rc.003',
36
+		//     'load_ee_core_wpusers',
37
+		//     'EE_WPUSERS_PLUGIN_FILE'
38
+		// );
39
+		$done = true;
40
+	}
41 41
 
42 42
 
43
-    /**
44
-     * @param string $addon_name
45
-     * @param string $version_constant
46
-     * @param string $min_version_required
47
-     * @param string $load_callback
48
-     * @param string $plugin_file_constant
49
-     * @return void
50
-     */
51
-    private function deactivateIncompatibleAddon(
52
-        string $addon_name,
53
-        string $version_constant,
54
-        string $min_version_required,
55
-        string $load_callback,
56
-        string $plugin_file_constant
57
-    ) {
58
-        if (! defined($version_constant)) {
59
-            return;
60
-        }
61
-        $addon_version = constant($version_constant);
62
-        if ($addon_version && version_compare($addon_version, $min_version_required, '<')) {
63
-            remove_action('AHEE__EE_System__load_espresso_addons', $load_callback);
64
-            if (! function_exists('deactivate_plugins')) {
65
-                require_once ABSPATH . 'wp-admin/includes/plugin.php';
66
-            }
67
-            deactivate_plugins(plugin_basename(constant($plugin_file_constant)));
68
-            unset($_GET['activate'], $_REQUEST['activate'], $_GET['activate-multi'], $_REQUEST['activate-multi']);
69
-            EE_Error::add_error(
70
-                sprintf(
71
-                    esc_html__(
72
-                        'We\'re sorry, but the Event Espresso %1$s addon was deactivated because version %2$s or higher is required with this version of Event Espresso core.',
73
-                        'event_espresso'
74
-                    ),
75
-                    $addon_name,
76
-                    $min_version_required
77
-                ),
78
-                __FILE__,
79
-                __FUNCTION__ . "({$addon_name})",
80
-                __LINE__
81
-            );
82
-            EE_Error::get_notices(false, true);
83
-        }
84
-    }
43
+	/**
44
+	 * @param string $addon_name
45
+	 * @param string $version_constant
46
+	 * @param string $min_version_required
47
+	 * @param string $load_callback
48
+	 * @param string $plugin_file_constant
49
+	 * @return void
50
+	 */
51
+	private function deactivateIncompatibleAddon(
52
+		string $addon_name,
53
+		string $version_constant,
54
+		string $min_version_required,
55
+		string $load_callback,
56
+		string $plugin_file_constant
57
+	) {
58
+		if (! defined($version_constant)) {
59
+			return;
60
+		}
61
+		$addon_version = constant($version_constant);
62
+		if ($addon_version && version_compare($addon_version, $min_version_required, '<')) {
63
+			remove_action('AHEE__EE_System__load_espresso_addons', $load_callback);
64
+			if (! function_exists('deactivate_plugins')) {
65
+				require_once ABSPATH . 'wp-admin/includes/plugin.php';
66
+			}
67
+			deactivate_plugins(plugin_basename(constant($plugin_file_constant)));
68
+			unset($_GET['activate'], $_REQUEST['activate'], $_GET['activate-multi'], $_REQUEST['activate-multi']);
69
+			EE_Error::add_error(
70
+				sprintf(
71
+					esc_html__(
72
+						'We\'re sorry, but the Event Espresso %1$s addon was deactivated because version %2$s or higher is required with this version of Event Espresso core.',
73
+						'event_espresso'
74
+					),
75
+					$addon_name,
76
+					$min_version_required
77
+				),
78
+				__FILE__,
79
+				__FUNCTION__ . "({$addon_name})",
80
+				__LINE__
81
+			);
82
+			EE_Error::get_notices(false, true);
83
+		}
84
+	}
85 85
 }
Please login to merge, or discard this patch.
core/services/addon/api/AddonApiVersion.php 2 patches
Indentation   +282 added lines, -282 removed lines patch added patch discarded remove patch
@@ -19,286 +19,286 @@
 block discarded – undo
19 19
  */
20 20
 abstract class AddonApiVersion
21 21
 {
22
-    const V1 = 1;
23
-
24
-    /**
25
-     * @var int one of the API_VERSION_* constants from above
26
-     */
27
-    private $api_version;
28
-
29
-    /**
30
-     * @var DomainInterface
31
-     */
32
-    private $domain;
33
-
34
-    /**
35
-     * @var Version minimum version of EE core that the add-on will work with
36
-     */
37
-    private $min_core_version;
38
-
39
-    /**
40
-     * @var Version minimum version of WP core that the add-on will work with
41
-     */
42
-    private $min_wp_version;
43
-
44
-    /**
45
-     * @var string  PascalCase identifier for the add-on.
46
-     *              IMPORTANT! there must be a class of the same name in the root of the add-ons /src/domain/ folder
47
-     */
48
-    private $name;
49
-
50
-    /**
51
-     * @var string
52
-     */
53
-    private $addon_namespace;
54
-
55
-    /**
56
-     * @var FilePath
57
-     */
58
-    private $main_file;
59
-
60
-    /**
61
-     * @var string
62
-     */
63
-    private $slug;
64
-
65
-    /**
66
-     * @var Version the current add-on version
67
-     */
68
-    private $version;
69
-
70
-
71
-    /**
72
-     * Bootstrap constructor.
73
-     *
74
-     * @param string $slug
75
-     * @param string $name
76
-     * @param string $namespace
77
-     * @param string $version
78
-     * @param string $min_core_version
79
-     * @param string $main_file
80
-     * @param int    $api_version
81
-     */
82
-    protected function __construct(
83
-        string $slug,
84
-        string $name,
85
-        string $namespace,
86
-        string $version,
87
-        string $min_core_version,
88
-        string $main_file,
89
-        int $api_version
90
-    ) {
91
-        $this->setSlug($slug);
92
-        $this->setName($name);
93
-        $this->setNamespace($namespace);
94
-        $this->setMinCoreVersion($min_core_version);
95
-        $this->setMainFile($main_file);
96
-        $this->setVersion($version);
97
-        $this->setApiVersion($api_version);
98
-    }
99
-
100
-
101
-    /**
102
-     * @return void
103
-     */
104
-    public function initialize(): void
105
-    {
106
-        $this->domain = DomainFactory::create(
107
-            "{$this->addon_namespace}\\domain\\Domain",
108
-            $this->main_file,
109
-            $this->version
110
-        );
111
-    }
112
-
113
-
114
-    /**
115
-     * @return int[]
116
-     */
117
-    private function validApiVersions(): array
118
-    {
119
-        return [
120
-            AddonApiVersion::V1,
121
-        ];
122
-    }
123
-
124
-
125
-    /**
126
-     * @param int $api_version
127
-     */
128
-    private function setApiVersion(int $api_version): void
129
-    {
130
-        if (! in_array($api_version, $this->validApiVersions())) {
131
-            throw new DomainException(
132
-                esc_html__(
133
-                    'Invalid Add-on API Version! Please use one of the EventEspresso\core\domain\entities\addon\Bootstrap class constants',
134
-                    'event_espresso'
135
-                )
136
-            );
137
-        }
138
-        $this->api_version = $api_version;
139
-    }
140
-
141
-
142
-    /**
143
-     * @param string $main_file
144
-     */
145
-    public function setMainFile(string $main_file): void
146
-    {
147
-        $this->main_file = new FilePath($main_file);
148
-    }
149
-
150
-
151
-    /**
152
-     * @param string $min_core_version
153
-     */
154
-    private function setMinCoreVersion(string $min_core_version): void
155
-    {
156
-        $this->min_core_version = Version::fromString($min_core_version);
157
-    }
158
-
159
-
160
-    /**
161
-     * @param string $name
162
-     */
163
-    public function setName(string $name): void
164
-    {
165
-        $this->name = $name;
166
-    }
167
-
168
-
169
-    /**
170
-     * @param string $namespace
171
-     */
172
-    private function setNamespace(string $namespace): void
173
-    {
174
-        $this->addon_namespace = $namespace;
175
-    }
176
-
177
-
178
-    /**
179
-     * @param string $slug
180
-     */
181
-    private function setSlug(string $slug): void
182
-    {
183
-        $valid_slug = sanitize_key($slug);
184
-        if ($slug !== $valid_slug) {
185
-            throw new DomainException(
186
-                esc_html__(
187
-                    'Invalid Add-on "slug"! Please ensure that slug only uses lowercase characters and dashes.',
188
-                    'event_espresso'
189
-                )
190
-            );
191
-        }
192
-        $this->slug = $valid_slug;
193
-    }
194
-
195
-
196
-    /**
197
-     * @param string $version
198
-     */
199
-    public function setVersion(string $version): void
200
-    {
201
-        $this->version = Version::fromString($version);
202
-    }
203
-
204
-
205
-    /**
206
-     * @return int
207
-     */
208
-    public function apiVersion(): int
209
-    {
210
-        return $this->api_version;
211
-    }
212
-
213
-
214
-    /**
215
-     * @return DomainInterface
216
-     */
217
-    public function domain(): DomainInterface
218
-    {
219
-        return $this->domain;
220
-    }
221
-
222
-
223
-    /**
224
-     * @return Version|null
225
-     */
226
-    public function minCoreVersion(): ?Version
227
-    {
228
-        return $this->min_core_version;
229
-    }
230
-
231
-
232
-    /**
233
-     * @return Version|null
234
-     */
235
-    public function minWpVersion(): ?Version
236
-    {
237
-        return $this->min_wp_version;
238
-    }
239
-
240
-
241
-    /**
242
-     * @param string $min_wp_version
243
-     */
244
-    public function setMinWpVersion(string $min_wp_version = EE_MIN_WP_VER_REQUIRED): void
245
-    {
246
-        $this->min_wp_version = Version::fromString($min_wp_version);
247
-    }
248
-
249
-
250
-    /**
251
-     * @return string
252
-     */
253
-    public function name(): string
254
-    {
255
-        return $this->name;
256
-    }
257
-
258
-
259
-    /**
260
-     * FQCN for the domain's EE_Addon class
261
-     *
262
-     * @return string
263
-     */
264
-    public function fqcn(): string
265
-    {
266
-        return "{$this->addon_namespace}\\domain\\{$this->name}";
267
-    }
268
-
269
-
270
-    /**
271
-     * @return string
272
-     */
273
-    public function getNamespace(): string
274
-    {
275
-        return $this->addon_namespace;
276
-    }
277
-
278
-
279
-    /**
280
-     * @return FilePath
281
-     */
282
-    public function mainFile(): FilePath
283
-    {
284
-        return $this->main_file;
285
-    }
286
-
287
-
288
-    /**
289
-     * @return string
290
-     */
291
-    public function slug(): string
292
-    {
293
-        return $this->slug;
294
-    }
295
-
296
-
297
-    /**
298
-     * @return Version
299
-     */
300
-    public function version(): Version
301
-    {
302
-        return $this->version;
303
-    }
22
+	const V1 = 1;
23
+
24
+	/**
25
+	 * @var int one of the API_VERSION_* constants from above
26
+	 */
27
+	private $api_version;
28
+
29
+	/**
30
+	 * @var DomainInterface
31
+	 */
32
+	private $domain;
33
+
34
+	/**
35
+	 * @var Version minimum version of EE core that the add-on will work with
36
+	 */
37
+	private $min_core_version;
38
+
39
+	/**
40
+	 * @var Version minimum version of WP core that the add-on will work with
41
+	 */
42
+	private $min_wp_version;
43
+
44
+	/**
45
+	 * @var string  PascalCase identifier for the add-on.
46
+	 *              IMPORTANT! there must be a class of the same name in the root of the add-ons /src/domain/ folder
47
+	 */
48
+	private $name;
49
+
50
+	/**
51
+	 * @var string
52
+	 */
53
+	private $addon_namespace;
54
+
55
+	/**
56
+	 * @var FilePath
57
+	 */
58
+	private $main_file;
59
+
60
+	/**
61
+	 * @var string
62
+	 */
63
+	private $slug;
64
+
65
+	/**
66
+	 * @var Version the current add-on version
67
+	 */
68
+	private $version;
69
+
70
+
71
+	/**
72
+	 * Bootstrap constructor.
73
+	 *
74
+	 * @param string $slug
75
+	 * @param string $name
76
+	 * @param string $namespace
77
+	 * @param string $version
78
+	 * @param string $min_core_version
79
+	 * @param string $main_file
80
+	 * @param int    $api_version
81
+	 */
82
+	protected function __construct(
83
+		string $slug,
84
+		string $name,
85
+		string $namespace,
86
+		string $version,
87
+		string $min_core_version,
88
+		string $main_file,
89
+		int $api_version
90
+	) {
91
+		$this->setSlug($slug);
92
+		$this->setName($name);
93
+		$this->setNamespace($namespace);
94
+		$this->setMinCoreVersion($min_core_version);
95
+		$this->setMainFile($main_file);
96
+		$this->setVersion($version);
97
+		$this->setApiVersion($api_version);
98
+	}
99
+
100
+
101
+	/**
102
+	 * @return void
103
+	 */
104
+	public function initialize(): void
105
+	{
106
+		$this->domain = DomainFactory::create(
107
+			"{$this->addon_namespace}\\domain\\Domain",
108
+			$this->main_file,
109
+			$this->version
110
+		);
111
+	}
112
+
113
+
114
+	/**
115
+	 * @return int[]
116
+	 */
117
+	private function validApiVersions(): array
118
+	{
119
+		return [
120
+			AddonApiVersion::V1,
121
+		];
122
+	}
123
+
124
+
125
+	/**
126
+	 * @param int $api_version
127
+	 */
128
+	private function setApiVersion(int $api_version): void
129
+	{
130
+		if (! in_array($api_version, $this->validApiVersions())) {
131
+			throw new DomainException(
132
+				esc_html__(
133
+					'Invalid Add-on API Version! Please use one of the EventEspresso\core\domain\entities\addon\Bootstrap class constants',
134
+					'event_espresso'
135
+				)
136
+			);
137
+		}
138
+		$this->api_version = $api_version;
139
+	}
140
+
141
+
142
+	/**
143
+	 * @param string $main_file
144
+	 */
145
+	public function setMainFile(string $main_file): void
146
+	{
147
+		$this->main_file = new FilePath($main_file);
148
+	}
149
+
150
+
151
+	/**
152
+	 * @param string $min_core_version
153
+	 */
154
+	private function setMinCoreVersion(string $min_core_version): void
155
+	{
156
+		$this->min_core_version = Version::fromString($min_core_version);
157
+	}
158
+
159
+
160
+	/**
161
+	 * @param string $name
162
+	 */
163
+	public function setName(string $name): void
164
+	{
165
+		$this->name = $name;
166
+	}
167
+
168
+
169
+	/**
170
+	 * @param string $namespace
171
+	 */
172
+	private function setNamespace(string $namespace): void
173
+	{
174
+		$this->addon_namespace = $namespace;
175
+	}
176
+
177
+
178
+	/**
179
+	 * @param string $slug
180
+	 */
181
+	private function setSlug(string $slug): void
182
+	{
183
+		$valid_slug = sanitize_key($slug);
184
+		if ($slug !== $valid_slug) {
185
+			throw new DomainException(
186
+				esc_html__(
187
+					'Invalid Add-on "slug"! Please ensure that slug only uses lowercase characters and dashes.',
188
+					'event_espresso'
189
+				)
190
+			);
191
+		}
192
+		$this->slug = $valid_slug;
193
+	}
194
+
195
+
196
+	/**
197
+	 * @param string $version
198
+	 */
199
+	public function setVersion(string $version): void
200
+	{
201
+		$this->version = Version::fromString($version);
202
+	}
203
+
204
+
205
+	/**
206
+	 * @return int
207
+	 */
208
+	public function apiVersion(): int
209
+	{
210
+		return $this->api_version;
211
+	}
212
+
213
+
214
+	/**
215
+	 * @return DomainInterface
216
+	 */
217
+	public function domain(): DomainInterface
218
+	{
219
+		return $this->domain;
220
+	}
221
+
222
+
223
+	/**
224
+	 * @return Version|null
225
+	 */
226
+	public function minCoreVersion(): ?Version
227
+	{
228
+		return $this->min_core_version;
229
+	}
230
+
231
+
232
+	/**
233
+	 * @return Version|null
234
+	 */
235
+	public function minWpVersion(): ?Version
236
+	{
237
+		return $this->min_wp_version;
238
+	}
239
+
240
+
241
+	/**
242
+	 * @param string $min_wp_version
243
+	 */
244
+	public function setMinWpVersion(string $min_wp_version = EE_MIN_WP_VER_REQUIRED): void
245
+	{
246
+		$this->min_wp_version = Version::fromString($min_wp_version);
247
+	}
248
+
249
+
250
+	/**
251
+	 * @return string
252
+	 */
253
+	public function name(): string
254
+	{
255
+		return $this->name;
256
+	}
257
+
258
+
259
+	/**
260
+	 * FQCN for the domain's EE_Addon class
261
+	 *
262
+	 * @return string
263
+	 */
264
+	public function fqcn(): string
265
+	{
266
+		return "{$this->addon_namespace}\\domain\\{$this->name}";
267
+	}
268
+
269
+
270
+	/**
271
+	 * @return string
272
+	 */
273
+	public function getNamespace(): string
274
+	{
275
+		return $this->addon_namespace;
276
+	}
277
+
278
+
279
+	/**
280
+	 * @return FilePath
281
+	 */
282
+	public function mainFile(): FilePath
283
+	{
284
+		return $this->main_file;
285
+	}
286
+
287
+
288
+	/**
289
+	 * @return string
290
+	 */
291
+	public function slug(): string
292
+	{
293
+		return $this->slug;
294
+	}
295
+
296
+
297
+	/**
298
+	 * @return Version
299
+	 */
300
+	public function version(): Version
301
+	{
302
+		return $this->version;
303
+	}
304 304
 }
Please login to merge, or discard this patch.
Spacing   +1 added lines, -1 removed lines patch added patch discarded remove patch
@@ -127,7 +127,7 @@
 block discarded – undo
127 127
      */
128 128
     private function setApiVersion(int $api_version): void
129 129
     {
130
-        if (! in_array($api_version, $this->validApiVersions())) {
130
+        if ( ! in_array($api_version, $this->validApiVersions())) {
131 131
             throw new DomainException(
132 132
                 esc_html__(
133 133
                     'Invalid Add-on API Version! Please use one of the EventEspresso\core\domain\entities\addon\Bootstrap class constants',
Please login to merge, or discard this patch.