Completed
Branch master (d65695)
by
unknown
04:25
created
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/admin/GraphQLData/Event.php 2 patches
Indentation   +16 added lines, -16 removed lines patch added patch discarded remove patch
@@ -5,13 +5,13 @@  discard block
 block discarded – undo
5 5
 class Event extends GraphQLData
6 6
 {
7 7
 
8
-    /**
9
-     * @inheritDoc
10
-     */
11
-    public function getData(array $params = [])
12
-    {
13
-        $field_key = lcfirst($this->namespace) . 'Event';
14
-        $query     = <<<QUERY
8
+	/**
9
+	 * @inheritDoc
10
+	 */
11
+	public function getData(array $params = [])
12
+	{
13
+		$field_key = lcfirst($this->namespace) . 'Event';
14
+		$query     = <<<QUERY
15 15
         query GET_EVENT(\$id: ID!) {
16 16
             {$field_key}(id: \$id, idType: DATABASE_ID) {
17 17
                 id
@@ -48,14 +48,14 @@  discard block
 block discarded – undo
48 48
             }
49 49
         }
50 50
 QUERY;
51
-        $this->setParams(
52
-            [
53
-                'operation_name' => 'GET_EVENT',
54
-                'variables'      => $params,
55
-                'query'          => $query,
56
-            ]
57
-        );
51
+		$this->setParams(
52
+			[
53
+				'operation_name' => 'GET_EVENT',
54
+				'variables'      => $params,
55
+				'query'          => $query,
56
+			]
57
+		);
58 58
 
59
-        return $this->getQueryResponse($field_key);
60
-    }
59
+		return $this->getQueryResponse($field_key);
60
+	}
61 61
 }
Please login to merge, or discard this patch.
Spacing   +1 added lines, -1 removed lines patch added patch discarded remove patch
@@ -10,7 +10,7 @@
 block discarded – undo
10 10
      */
11 11
     public function getData(array $params = [])
12 12
     {
13
-        $field_key = lcfirst($this->namespace) . 'Event';
13
+        $field_key = lcfirst($this->namespace).'Event';
14 14
         $query     = <<<QUERY
15 15
         query GET_EVENT(\$id: ID!) {
16 16
             {$field_key}(id: \$id, idType: DATABASE_ID) {
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   +838 added lines, -838 removed lines patch added patch discarded remove patch
@@ -16,842 +16,842 @@
 block discarded – undo
16 16
  */
17 17
 class EEM_Datetime extends EEM_Soft_Delete_Base
18 18
 {
19
-    /**
20
-     * @var EEM_Datetime $_instance
21
-     */
22
-    protected static $_instance;
23
-
24
-
25
-    /**
26
-     * private constructor to prevent direct creation
27
-     *
28
-     * @param string $timezone A string representing the timezone we want to set for returned Date Time Strings
29
-     *                         (and any incoming timezone data that gets saved).
30
-     *                         Note this just sends the timezone info to the date time model field objects.
31
-     *                         Default is NULL
32
-     *                         (and will be assumed using the set timezone in the 'timezone_string' wp option)
33
-     * @throws EE_Error
34
-     * @throws InvalidArgumentException
35
-     * @throws InvalidArgumentException
36
-     */
37
-    protected function __construct($timezone)
38
-    {
39
-        $this->singular_item           = esc_html__('Datetime', 'event_espresso');
40
-        $this->plural_item             = esc_html__('Datetimes', 'event_espresso');
41
-        $this->_tables                 = [
42
-            'Datetime' => new EE_Primary_Table('esp_datetime', 'DTT_ID'),
43
-        ];
44
-        $this->_fields                 = [
45
-            'Datetime' => [
46
-                'DTT_ID'          => new EE_Primary_Key_Int_Field(
47
-                    'DTT_ID',
48
-                    esc_html__('Datetime ID', 'event_espresso')
49
-                ),
50
-                'EVT_ID'          => new EE_Foreign_Key_Int_Field(
51
-                    'EVT_ID',
52
-                    esc_html__('Event ID', 'event_espresso'),
53
-                    false,
54
-                    0,
55
-                    'Event'
56
-                ),
57
-                'VNU_ID' => new EE_Foreign_Key_Int_Field(
58
-                    'VNU_ID',
59
-                    __('Venue ID', 'event_espresso'),
60
-                    false,
61
-                    0,
62
-                    'Venue'
63
-                ),
64
-                'DTT_name'        => new EE_Plain_Text_Field(
65
-                    'DTT_name',
66
-                    esc_html__('Datetime Name', 'event_espresso'),
67
-                    false,
68
-                    ''
69
-                ),
70
-                'DTT_description' => new EE_Post_Content_Field(
71
-                    'DTT_description',
72
-                    esc_html__('Description for Datetime', 'event_espresso'),
73
-                    false,
74
-                    ''
75
-                ),
76
-                'DTT_EVT_start'   => new EE_Datetime_Field(
77
-                    'DTT_EVT_start',
78
-                    esc_html__('Start time/date of Event', 'event_espresso'),
79
-                    false,
80
-                    EE_Datetime_Field::now,
81
-                    $timezone
82
-                ),
83
-                'DTT_EVT_end'     => new EE_Datetime_Field(
84
-                    'DTT_EVT_end',
85
-                    esc_html__('End time/date of Event', 'event_espresso'),
86
-                    false,
87
-                    EE_Datetime_Field::now,
88
-                    $timezone
89
-                ),
90
-                'DTT_reg_limit'   => new EE_Infinite_Integer_Field(
91
-                    'DTT_reg_limit',
92
-                    esc_html__('Registration Limit for this time', 'event_espresso'),
93
-                    true,
94
-                    EE_INF
95
-                ),
96
-                'DTT_sold'        => new EE_Integer_Field(
97
-                    'DTT_sold',
98
-                    esc_html__('How many sales for this Datetime that have occurred', 'event_espresso'),
99
-                    true,
100
-                    0
101
-                ),
102
-                'DTT_reserved'    => new EE_Integer_Field(
103
-                    'DTT_reserved',
104
-                    esc_html__('Quantity of tickets reserved, but not yet fully purchased', 'event_espresso'),
105
-                    false,
106
-                    0
107
-                ),
108
-                'DTT_is_primary'  => new EE_Boolean_Field(
109
-                    'DTT_is_primary',
110
-                    esc_html__('Flag indicating datetime is primary one for event', 'event_espresso'),
111
-                    false,
112
-                    false
113
-                ),
114
-                'DTT_order'       => new EE_Integer_Field(
115
-                    'DTT_order',
116
-                    esc_html__('The order in which the Datetime is displayed', 'event_espresso'),
117
-                    false,
118
-                    0
119
-                ),
120
-                'DTT_parent'      => new EE_Integer_Field(
121
-                    'DTT_parent',
122
-                    esc_html__('Indicates what DTT_ID is the parent of this DTT_ID', 'event_espresso'),
123
-                    true,
124
-                    0
125
-                ),
126
-                'DTT_deleted'     => new EE_Trashed_Flag_Field(
127
-                    'DTT_deleted',
128
-                    esc_html__('Flag indicating datetime is archived', 'event_espresso'),
129
-                    false,
130
-                    false
131
-                ),
132
-            ],
133
-        ];
134
-        $this->_model_relations        = [
135
-            'Ticket'          => new EE_HABTM_Relation('Datetime_Ticket'),
136
-            'Event'           => new EE_Belongs_To_Relation(),
137
-            'Checkin'         => new EE_Has_Many_Relation(),
138
-            'Datetime_Ticket' => new EE_Has_Many_Relation(),
139
-            'Venue'           => new EE_Belongs_To_Relation(),
140
-        ];
141
-        $path_to_event_model           = 'Event';
142
-        $this->model_chain_to_password = $path_to_event_model;
143
-        $this->_model_chain_to_wp_user = $path_to_event_model;
144
-        // this model is generally available for reading
145
-        $this->_cap_restriction_generators[ EEM_Base::caps_read ]       =
146
-            new EE_Restriction_Generator_Event_Related_Public(
147
-                $path_to_event_model
148
-            );
149
-        $this->_cap_restriction_generators[ EEM_Base::caps_read_admin ] =
150
-            new EE_Restriction_Generator_Event_Related_Protected(
151
-                $path_to_event_model
152
-            );
153
-        $this->_cap_restriction_generators[ EEM_Base::caps_edit ]       =
154
-            new EE_Restriction_Generator_Event_Related_Protected(
155
-                $path_to_event_model
156
-            );
157
-        $this->_cap_restriction_generators[ EEM_Base::caps_delete ]     =
158
-            new EE_Restriction_Generator_Event_Related_Protected(
159
-                $path_to_event_model,
160
-                EEM_Base::caps_edit
161
-            );
162
-        parent::__construct($timezone);
163
-    }
164
-
165
-
166
-    /**
167
-     * create new blank datetime
168
-     *
169
-     * @access public
170
-     * @return EE_Datetime[] array on success, FALSE on fail
171
-     * @throws EE_Error
172
-     * @throws InvalidArgumentException
173
-     * @throws InvalidDataTypeException
174
-     * @throws ReflectionException
175
-     * @throws InvalidInterfaceException
176
-     */
177
-    public function create_new_blank_datetime()
178
-    {
179
-        // makes sure timezone is always set.
180
-        $timezone_string = $this->get_timezone();
181
-        /**
182
-         * Filters the initial start date for the new datetime.
183
-         * Any time included in this value will be overridden later so use additional filters to modify the time.
184
-         *
185
-         * @param int $start_date Unix timestamp representing now + 30 days in seconds.
186
-         * @return int Unix timestamp
187
-         */
188
-        $start_date = apply_filters(
189
-            'FHEE__EEM_Datetime__create_new_blank_datetime__start_date',
190
-            $this->current_time_for_query('DTT_EVT_start', true) + MONTH_IN_SECONDS
191
-        );
192
-        /**
193
-         * Filters the initial end date for the new datetime.
194
-         * Any time included in this value will be overridden later so use additional filters to modify the time.
195
-         *
196
-         * @param int $end_data Unix timestamp representing now + 30 days in seconds.
197
-         * @return int Unix timestamp
198
-         */
199
-        $end_date       = apply_filters(
200
-            'FHEE__EEM_Datetime__create_new_blank_datetime__end_date',
201
-            $this->current_time_for_query('DTT_EVT_end', true) + MONTH_IN_SECONDS
202
-        );
203
-        $blank_datetime = EE_Datetime::new_instance(
204
-            [
205
-                'DTT_EVT_start' => $start_date,
206
-                'DTT_EVT_end'   => $end_date,
207
-                'DTT_order'     => 1,
208
-                'DTT_reg_limit' => EE_INF,
209
-            ],
210
-            $timezone_string
211
-        );
212
-        /**
213
-         * Filters the initial start time and format for the new EE_Datetime instance.
214
-         *
215
-         * @param array $start_time An array having size 2.  First element is the time, second element is the time
216
-         *                          format.
217
-         * @return array
218
-         */
219
-        $start_time = apply_filters(
220
-            'FHEE__EEM_Datetime__create_new_blank_datetime__start_time',
221
-            ['8am', 'ga']
222
-        );
223
-        /**
224
-         * Filters the initial end time and format for the new EE_Datetime instance.
225
-         *
226
-         * @param array $end_time An array having size 2.  First element is the time, second element is the time
227
-         *                        format
228
-         * @return array
229
-         */
230
-        $end_time = apply_filters(
231
-            'FHEE__EEM_Datetime__create_new_blank_datetime__end_time',
232
-            ['5pm', 'ga']
233
-        );
234
-        $this->validateStartAndEndTimeForBlankDate($start_time, $end_time);
235
-        $blank_datetime->set_start_time(
236
-            $this->convert_datetime_for_query(
237
-                'DTT_EVT_start',
238
-                $start_time[0],
239
-                $start_time[1],
240
-                $timezone_string
241
-            )
242
-        );
243
-        $blank_datetime->set_end_time(
244
-            $this->convert_datetime_for_query(
245
-                'DTT_EVT_end',
246
-                $end_time[0],
247
-                $end_time[1],
248
-                $timezone_string
249
-            )
250
-        );
251
-        return [$blank_datetime];
252
-    }
253
-
254
-
255
-    /**
256
-     * Validates whether the start_time and end_time are in the expected format.
257
-     *
258
-     * @param array $start_time
259
-     * @param array $end_time
260
-     * @throws InvalidArgumentException
261
-     * @throws InvalidDataTypeException
262
-     */
263
-    private function validateStartAndEndTimeForBlankDate(array $start_time, array $end_time)
264
-    {
265
-        if (! is_array($start_time)) {
266
-            throw new InvalidDataTypeException('start_time', $start_time, 'array');
267
-        }
268
-        if (! is_array($end_time)) {
269
-            throw new InvalidDataTypeException('end_time', $end_time, 'array');
270
-        }
271
-        if (count($start_time) !== 2) {
272
-            throw new InvalidArgumentException(
273
-                sprintf(
274
-                    'The variable %1$s is expected to be an array with two elements.  The first item in the '
275
-                    . 'array should be a valid time string, the second item in the array should be a valid time format',
276
-                    '$start_time'
277
-                )
278
-            );
279
-        }
280
-        if (count($end_time) !== 2) {
281
-            throw new InvalidArgumentException(
282
-                sprintf(
283
-                    'The variable %1$s is expected to be an array with two elements.  The first item in the '
284
-                    . 'array should be a valid time string, the second item in the array should be a valid time format',
285
-                    '$end_time'
286
-                )
287
-            );
288
-        }
289
-    }
290
-
291
-
292
-    /**
293
-     * get event start date from db
294
-     *
295
-     * @access public
296
-     * @param int $EVT_ID
297
-     * @return EE_Datetime[] array on success, FALSE on fail
298
-     * @throws EE_Error
299
-     * @throws ReflectionException
300
-     */
301
-    public function get_all_event_dates($EVT_ID = 0)
302
-    {
303
-        if (! $EVT_ID) { // on add_new_event event_id gets set to 0
304
-            return $this->create_new_blank_datetime();
305
-        }
306
-        $results = $this->get_datetimes_for_event_ordered_by_DTT_order($EVT_ID);
307
-        if (empty($results)) {
308
-            return $this->create_new_blank_datetime();
309
-        }
310
-        return $results;
311
-    }
312
-
313
-
314
-    /**
315
-     * get all datetimes attached to an event ordered by the DTT_order field
316
-     *
317
-     * @public
318
-     * @param int     $EVT_ID     event id
319
-     * @param boolean $include_expired
320
-     * @param boolean $include_deleted
321
-     * @param int     $limit      If included then limit the count of results by
322
-     *                            the given number
323
-     * @return EE_Datetime[]
324
-     * @throws EE_Error
325
-     */
326
-    public function get_datetimes_for_event_ordered_by_DTT_order(
327
-        int $EVT_ID,
328
-        bool $include_expired = true,
329
-        bool $include_deleted = true,
330
-        $limit = 0
331
-    ) {
332
-        $prev_data_prep_value = $this->prepModelForQuery();
333
-        $where_params         = ['Event.EVT_ID' => absint($EVT_ID)];
334
-        $query_params[0]      = $this->addDefaultWhereParams($where_params, $include_deleted, $include_expired);
335
-        $query_params         = $this->addDefaultWhereConditions($query_params);
336
-        $query_params         = $this->addDefaultQueryParams($query_params, $limit, 'DTT_order');
337
-        return $this->getDatetimesAndRestoreModel($query_params, $prev_data_prep_value);
338
-    }
339
-
340
-
341
-    /**
342
-     * Gets the datetimes for the event (with the given limit), and orders them by "importance".
343
-     * By importance, we mean that the primary datetimes are most important (DEPRECATED FOR NOW),
344
-     * and then the earlier datetimes are the most important.
345
-     * Maybe we'll want this to take into account datetimes that haven't already passed, but we don't yet.
346
-     *
347
-     * @param int $EVT_ID
348
-     * @param int $limit
349
-     * @return EE_Datetime[]|EE_Base_Class[]
350
-     * @throws EE_Error
351
-     */
352
-    public function get_datetimes_for_event_ordered_by_importance(int $EVT_ID, $limit = 0)
353
-    {
354
-        $query_params[0] = ['Event.EVT_ID' => absint($EVT_ID)];
355
-        $query_params    = $this->addDefaultWhereConditions($query_params);
356
-        $query_params    = $this->addDefaultQueryParams($query_params, $limit);
357
-        return $this->get_all($query_params);
358
-    }
359
-
360
-
361
-    /**
362
-     * @param int     $EVT_ID
363
-     * @param boolean $include_expired
364
-     * @param boolean $include_deleted
365
-     * @return EE_Datetime
366
-     * @throws EE_Error
367
-     */
368
-    public function get_oldest_datetime_for_event(
369
-        int $EVT_ID,
370
-        bool $include_expired = false,
371
-        bool $include_deleted = false
372
-    ) {
373
-        $results = $this->get_datetimes_for_event_ordered_by_start_time(
374
-            $EVT_ID,
375
-            $include_expired,
376
-            $include_deleted,
377
-            1
378
-        );
379
-        if ($results) {
380
-            return array_shift($results);
381
-        }
382
-        return null;
383
-    }
384
-
385
-
386
-    /**
387
-     * Gets the 'primary' datetime for an event.
388
-     *
389
-     * @param int  $EVT_ID
390
-     * @param bool $try_to_exclude_expired
391
-     * @param bool $try_to_exclude_deleted
392
-     * @return EE_Datetime
393
-     * @throws EE_Error
394
-     */
395
-    public function get_primary_datetime_for_event(
396
-        int $EVT_ID,
397
-        bool $try_to_exclude_expired = true,
398
-        bool $try_to_exclude_deleted = true
399
-    ) {
400
-        if ($try_to_exclude_expired) {
401
-            $non_expired = $this->get_oldest_datetime_for_event($EVT_ID, false, false);
402
-            if ($non_expired) {
403
-                return $non_expired;
404
-            }
405
-        }
406
-        if ($try_to_exclude_deleted) {
407
-            $expired_even = $this->get_oldest_datetime_for_event($EVT_ID, true);
408
-            if ($expired_even) {
409
-                return $expired_even;
410
-            }
411
-        }
412
-        return $this->get_oldest_datetime_for_event($EVT_ID, true, true);
413
-    }
414
-
415
-
416
-    /**
417
-     * Gets ALL the datetimes for an event (including trashed ones, for now), ordered
418
-     * only by start date
419
-     *
420
-     * @param int     $EVT_ID
421
-     * @param boolean $include_expired
422
-     * @param boolean $include_deleted
423
-     * @param int     $limit
424
-     * @return EE_Datetime[]
425
-     * @throws EE_Error
426
-     */
427
-    public function get_datetimes_for_event_ordered_by_start_time(
428
-        int $EVT_ID,
429
-        bool $include_expired = true,
430
-        bool $include_deleted = true,
431
-        $limit = 0
432
-    ) {
433
-        $prev_data_prep_value = $this->prepModelForQuery();
434
-        $where_params         = ['Event.EVT_ID' => absint($EVT_ID)];
435
-        $query_params[0]      = $this->addDefaultWhereParams($where_params, $include_deleted, $include_expired);
436
-        $query_params         = $this->addDefaultWhereConditions(
437
-            $query_params,
438
-            EEM_Base::default_where_conditions_this_only
439
-        );
440
-        $query_params         = $this->addDefaultQueryParams($query_params, $limit, 'DTT_order');
441
-        return $this->getDatetimesAndRestoreModel($query_params, $prev_data_prep_value);
442
-    }
443
-
444
-
445
-    /**
446
-     * Gets ALL the datetimes for an ticket (including trashed ones, for now), ordered
447
-     * only by start date
448
-     *
449
-     * @param int     $TKT_ID
450
-     * @param boolean $include_expired
451
-     * @param boolean $include_deleted
452
-     * @param int     $limit
453
-     * @return EE_Datetime[]
454
-     * @throws EE_Error
455
-     */
456
-    public function get_datetimes_for_ticket_ordered_by_start_time(
457
-        int $TKT_ID,
458
-        bool $include_expired = true,
459
-        bool $include_deleted = true,
460
-        $limit = 0
461
-    ) {
462
-        $prev_data_prep_value = $this->prepModelForQuery();
463
-        $where_params         = ['Ticket.TKT_ID' => absint($TKT_ID)];
464
-        $query_params[0]      = $this->addDefaultWhereParams($where_params, $include_deleted, $include_expired);
465
-        $query_params         = $this->addDefaultQueryParams($query_params, $limit);
466
-        return $this->getDatetimesAndRestoreModel($query_params, $prev_data_prep_value);
467
-    }
468
-
469
-
470
-    /**
471
-     * Gets all the datetimes for a ticket (including trashed ones, for now), ordered by the DTT_order for the
472
-     * datetimes.
473
-     *
474
-     * @param int      $TKT_ID           ID of ticket to retrieve the datetimes for
475
-     * @param boolean  $include_expired  whether to include expired datetimes or not
476
-     * @param boolean  $include_deleted  whether to include trashed datetimes or not.
477
-     * @param int|null $limit            if null, no limit, if int then limit results by
478
-     *                                   that number
479
-     * @return EE_Datetime[]
480
-     * @throws EE_Error
481
-     */
482
-    public function get_datetimes_for_ticket_ordered_by_DTT_order(
483
-        int $TKT_ID,
484
-        bool $include_expired = true,
485
-        bool $include_deleted = true,
486
-        $limit = 0
487
-    ) {
488
-        $prev_data_prep_value = $this->prepModelForQuery();
489
-        $where_params         = ['Ticket.TKT_ID' => absint($TKT_ID)];
490
-        $query_params[0]      = $this->addDefaultWhereParams($where_params, $include_deleted, $include_expired);
491
-        $query_params         = $this->addDefaultQueryParams($query_params, $limit, 'DTT_order');
492
-        return $this->getDatetimesAndRestoreModel($query_params, $prev_data_prep_value);
493
-    }
494
-
495
-
496
-    /**
497
-     * Gets the most important datetime for a particular event (ie, the primary event usually. But if for some WACK
498
-     * reason it doesn't exist, we consider the earliest event the most important)
499
-     *
500
-     * @param int $EVT_ID
501
-     * @return EE_Datetime
502
-     * @throws EE_Error
503
-     */
504
-    public function get_most_important_datetime_for_event(int $EVT_ID)
505
-    {
506
-        $results = $this->get_datetimes_for_event_ordered_by_importance($EVT_ID, 1);
507
-        if ($results) {
508
-            return array_shift($results);
509
-        }
510
-        return null;
511
-    }
512
-
513
-
514
-    /**
515
-     * This returns a wpdb->results        Array of all DTT month and years matching the incoming query params and
516
-     * grouped by month and year.
517
-     *
518
-     * @param array  $where_params       @see
519
-     *                                   https://github.com/eventespresso/event-espresso-core/tree/master/docs/G--Model-System/model-query-params.md#0-where-conditions
520
-     * @param string $evt_active_status  A string representing the evt active status to filter the months by.
521
-     *                                   Can be:
522
-     *                                   - '' = no filter
523
-     *                                   - upcoming = Published events with at least one upcoming datetime.
524
-     *                                   - expired = Events with all datetimes expired.
525
-     *                                   - active = Events that are published and have at least one datetime that
526
-     *                                   starts before now and ends after now.
527
-     *                                   - inactive = Events that are either not published.
528
-     * @return stdClass[]
529
-     * @throws EE_Error
530
-     * @throws InvalidArgumentException
531
-     * @throws InvalidArgumentException
532
-     */
533
-    public function get_dtt_months_and_years(array $where_params, $evt_active_status = '')
534
-    {
535
-        $current_time_for_DTT_EVT_start = $this->current_time_for_query('DTT_EVT_start');
536
-        $current_time_for_DTT_EVT_end   = $this->current_time_for_query('DTT_EVT_end');
537
-        switch ($evt_active_status) {
538
-            case 'upcoming':
539
-                $where_params['Event.status'] = 'publish';
540
-                // if there are already query_params matching DTT_EVT_start then we need to modify that to add them.
541
-                if (isset($where_params['DTT_EVT_start'])) {
542
-                    $where_params['DTT_EVT_start*****'] = $where_params['DTT_EVT_start'];
543
-                }
544
-                $where_params['DTT_EVT_start'] = ['>', $current_time_for_DTT_EVT_start];
545
-                break;
546
-            case 'expired':
547
-                if (isset($where_params['Event.status'])) {
548
-                    unset($where_params['Event.status']);
549
-                }
550
-                // get events to exclude
551
-                $exclude_query[0] = array_merge(
552
-                    $where_params,
553
-                    ['DTT_EVT_end' => ['>', $current_time_for_DTT_EVT_end]]
554
-                );
555
-                // first get all events that have datetimes where its not expired.
556
-                $event_ids = $this->_get_all_wpdb_results(
557
-                    $exclude_query,
558
-                    OBJECT_K,
559
-                    'Datetime.EVT_ID'
560
-                );
561
-                $event_ids = array_keys($event_ids);
562
-                if (isset($where_params['DTT_EVT_end'])) {
563
-                    $where_params['DTT_EVT_end****'] = $where_params['DTT_EVT_end'];
564
-                }
565
-                $where_params['DTT_EVT_end']  = ['<', $current_time_for_DTT_EVT_end];
566
-                $where_params['Event.EVT_ID'] = ['NOT IN', $event_ids];
567
-                break;
568
-            case 'active':
569
-                $where_params['Event.status'] = 'publish';
570
-                if (isset($where_params['DTT_EVT_start'])) {
571
-                    $where_params['Datetime.DTT_EVT_start******'] = $where_params['DTT_EVT_start'];
572
-                }
573
-                if (isset($where_params['Datetime.DTT_EVT_end'])) {
574
-                    $where_params['Datetime.DTT_EVT_end*****'] = $where_params['DTT_EVT_end'];
575
-                }
576
-                $where_params['DTT_EVT_start'] = ['<', $current_time_for_DTT_EVT_start];
577
-                $where_params['DTT_EVT_end']   = ['>', $current_time_for_DTT_EVT_end];
578
-                break;
579
-            case 'inactive':
580
-                if (isset($where_params['Event.status'])) {
581
-                    unset($where_params['Event.status']);
582
-                }
583
-                if (isset($where_params['OR'])) {
584
-                    $where_params['AND']['OR'] = $where_params['OR'];
585
-                }
586
-                if (isset($where_params['DTT_EVT_end'])) {
587
-                    $where_params['AND']['DTT_EVT_end****'] = $where_params['DTT_EVT_end'];
588
-                    unset($where_params['DTT_EVT_end']);
589
-                }
590
-                if (isset($where_params['DTT_EVT_start'])) {
591
-                    $where_params['AND']['DTT_EVT_start'] = $where_params['DTT_EVT_start'];
592
-                    unset($where_params['DTT_EVT_start']);
593
-                }
594
-                $where_params['AND']['Event.status'] = ['!=', 'publish'];
595
-                break;
596
-        }
597
-        $query_params[0]          = $where_params;
598
-        $query_params['group_by'] = ['dtt_year', 'dtt_month'];
599
-        $query_params             = $this->addOrderByQueryParams($query_params, 'DTT_EVT_start', 'DESC');
600
-
601
-        $query_interval    = EEH_DTT_Helper::get_sql_query_interval_for_offset(
602
-            $this->get_timezone(),
603
-            'DTT_EVT_start'
604
-        );
605
-        $columns_to_select = [
606
-            'dtt_year'      => ['YEAR(' . $query_interval . ')', '%s'],
607
-            'dtt_month'     => ['MONTHNAME(' . $query_interval . ')', '%s'],
608
-            'dtt_month_num' => ['MONTH(' . $query_interval . ')', '%s'],
609
-        ];
610
-        return $this->_get_all_wpdb_results($query_params, OBJECT, $columns_to_select);
611
-    }
612
-
613
-
614
-    /**
615
-     * Updates the DTT_sold attribute on each datetime (based on the registrations
616
-     * for the tickets for each datetime)
617
-     *
618
-     * @param EE_Base_Class[]|EE_Datetime[] $datetimes
619
-     * @throws EE_Error
620
-     * @throws ReflectionException
621
-     */
622
-    public function update_sold(array $datetimes)
623
-    {
624
-        EE_Error::doing_it_wrong(
625
-            __FUNCTION__,
626
-            esc_html__(
627
-                'Please use \EEM_Ticket::update_tickets_sold() instead which will in turn correctly update both the Ticket AND Datetime counts.',
628
-                'event_espresso'
629
-            ),
630
-            '4.9.32.rc.005'
631
-        );
632
-        foreach ($datetimes as $datetime) {
633
-            $datetime->update_sold();
634
-        }
635
-    }
636
-
637
-
638
-    /**
639
-     *    Gets the total number of tickets available at a particular datetime
640
-     *    (does NOT take into account the datetime's spaces available)
641
-     *
642
-     * @param int   $DTT_ID
643
-     * @param array $query_params
644
-     * @return int of tickets available. If sold out, return less than 1. If infinite, returns EE_INF,  IF there are NO
645
-     *             tickets attached to datetime then FALSE is returned.
646
-     * @throws EE_Error
647
-     * @throws ReflectionException
648
-     */
649
-    public function sum_tickets_currently_available_at_datetime(int $DTT_ID, array $query_params = [])
650
-    {
651
-        $datetime = $this->get_one_by_ID($DTT_ID);
652
-        if ($datetime instanceof EE_Datetime) {
653
-            return $datetime->tickets_remaining($query_params);
654
-        }
655
-        return 0;
656
-    }
657
-
658
-
659
-    /**
660
-     * This returns an array of counts of datetimes in the database for each Datetime status that can be queried.
661
-     *
662
-     * @param array $stati_to_include  If included you can restrict the statuses we return counts for by including the
663
-     *                                 stati you want counts for as values in the array.  An empty array returns counts
664
-     *                                 for all valid stati.
665
-     * @param array $query_params      If included can be used to refine the conditions for returning the count (i.e.
666
-     *                                 only for Datetimes connected to a specific event, or specific ticket.
667
-     * @return array  The value returned is an array indexed by Datetime Status and the values are the counts.  The
668
-     * @throws EE_Error
669
-     *                                 stati used as index keys are: EE_Datetime::active EE_Datetime::upcoming
670
-     *                                 EE_Datetime::expired
671
-     */
672
-    public function get_datetime_counts_by_status(array $stati_to_include = [], array $query_params = [])
673
-    {
674
-        // only accept where conditions for this query.
675
-        $_where            = isset($query_params[0]) ? $query_params[0] : [];
676
-        $status_query_args = [
677
-            EE_Datetime::active   => array_merge(
678
-                $_where,
679
-                ['DTT_EVT_start' => ['<', time()], 'DTT_EVT_end' => ['>', time()]]
680
-            ),
681
-            EE_Datetime::upcoming => array_merge(
682
-                $_where,
683
-                ['DTT_EVT_start' => ['>', time()]]
684
-            ),
685
-            EE_Datetime::expired  => array_merge(
686
-                $_where,
687
-                ['DTT_EVT_end' => ['<', time()]]
688
-            ),
689
-        ];
690
-        if (! empty($stati_to_include)) {
691
-            foreach (array_keys($status_query_args) as $status) {
692
-                if (! in_array($status, $stati_to_include, true)) {
693
-                    unset($status_query_args[ $status ]);
694
-                }
695
-            }
696
-        }
697
-        // loop through and query counts for each stati.
698
-        $status_query_results = [];
699
-        foreach ($status_query_args as $status => $status_where_conditions) {
700
-            $status_query_results[ $status ] = EEM_Datetime::count(
701
-                [$status_where_conditions],
702
-                'DTT_ID',
703
-                true
704
-            );
705
-        }
706
-        return $status_query_results;
707
-    }
708
-
709
-
710
-    /**
711
-     * Returns the specific count for a given Datetime status matching any given query_params.
712
-     *
713
-     * @param string $status Valid string representation for Datetime status requested. (Defaults to Active).
714
-     * @param array  $query_params
715
-     * @return int
716
-     * @throws EE_Error
717
-     */
718
-    public function get_datetime_count_for_status($status = EE_Datetime::active, array $query_params = [])
719
-    {
720
-        $count = $this->get_datetime_counts_by_status([$status], $query_params);
721
-        return ! empty($count[ $status ]) ? $count[ $status ] : 0;
722
-    }
723
-
724
-
725
-    /**
726
-     * @return bool|int
727
-     * @since   5.0.0.p
728
-     */
729
-    private function prepModelForQuery()
730
-    {
731
-        $prev_data_prep_value = $this->get_assumption_concerning_values_already_prepared_by_model_object();
732
-        $this->assume_values_already_prepared_by_model_object(EEM_Base::prepared_for_use_in_db);
733
-        return $prev_data_prep_value;
734
-    }
735
-
736
-
737
-    /**
738
-     * @param array    $query_params
739
-     * @param bool|int $prev_data_prep_value
740
-     * @return EE_Base_Class[]|EE_Datetime[]
741
-     * @throws EE_Error
742
-     * @since   5.0.0.p
743
-     */
744
-    private function getDatetimesAndRestoreModel(array $query_params, $prev_data_prep_value)
745
-    {
746
-        $result = $this->get_all($query_params);
747
-        $this->assume_values_already_prepared_by_model_object($prev_data_prep_value);
748
-        return $result;
749
-    }
750
-
751
-
752
-    /**
753
-     * @param array  $query_params
754
-     * @param int    $limit
755
-     * @param string $order_by
756
-     * @param string $order
757
-     * @return array
758
-     * @since   5.0.0.p
759
-     */
760
-    private function addDefaultQueryParams(array $query_params, $limit = 0, $order_by = 'DTT_EVT_start', $order = 'ASC')
761
-    {
762
-        $query_params = $this->addOrderByQueryParams($query_params, $order_by, $order);
763
-        $query_params = $this->addLimitQueryParams($query_params, $limit);
764
-        return $query_params;
765
-    }
766
-
767
-
768
-    /**
769
-     * @param array  $query_params
770
-     * @param string $default_where_conditions
771
-     * @return array
772
-     * @since   5.0.0.p
773
-     */
774
-    private function addDefaultWhereConditions(
775
-        array $query_params,
776
-        $default_where_conditions = EEM_Base::default_where_conditions_none
777
-    ) {
778
-        $query_params['default_where_conditions'] = $default_where_conditions;
779
-        return $query_params;
780
-    }
781
-
782
-
783
-    /**
784
-     * @param array $where_params
785
-     * @param bool  $include_deleted
786
-     * @param bool  $include_expired
787
-     * @return array
788
-     * @since   5.0.0.p
789
-     */
790
-    private function addDefaultWhereParams(array $where_params, bool $include_deleted = true, bool $include_expired = true)
791
-    {
792
-        $where_params = $this->addExpiredWhereParams($where_params, $include_expired);
793
-        $where_params = $this->addDeletedWhereParams($where_params, $include_deleted);
794
-        return $where_params;
795
-    }
796
-
797
-
798
-    /**
799
-     * @param array $where_params
800
-     * @param bool  $include_deleted
801
-     * @return array
802
-     * @since   5.0.0.p
803
-     */
804
-    private function addDeletedWhereParams(array $where_params, bool $include_deleted = true)
805
-    {
806
-        $deleted                     = $include_deleted ? [true, false] : [false];
807
-        $where_params['DTT_deleted'] = ['IN', $deleted];
808
-        return $where_params;
809
-    }
810
-
811
-
812
-    /**
813
-     * @param array $where_params
814
-     * @param bool  $include_expired
815
-     * @return array
816
-     * @since   5.0.0.p
817
-     */
818
-    private function addExpiredWhereParams(array $where_params, bool $include_expired = true)
819
-    {
820
-        if (! $include_expired) {
821
-            $where_params['DTT_EVT_end'] = ['>=', current_time('mysql', true)];
822
-        }
823
-        return $where_params;
824
-    }
825
-
826
-
827
-    /**
828
-     * @param array $query_params
829
-     * @param int   $limit
830
-     * @return array
831
-     * @since   5.0.0.p
832
-     */
833
-    private function addLimitQueryParams(array $query_params, $limit = 0)
834
-    {
835
-        if ($limit) {
836
-            $query_params['limit'] = $limit;
837
-        }
838
-        return $query_params;
839
-    }
840
-
841
-
842
-    /**
843
-     * @param array  $query_params
844
-     * @param string $order_by
845
-     * @param string $order
846
-     * @return array
847
-     * @since   5.0.0.p
848
-     */
849
-    private function addOrderByQueryParams(array $query_params, $order_by = 'DTT_EVT_start', $order = 'ASC')
850
-    {
851
-        $order                    = $order === 'ASC' ? 'ASC' : 'DESC';
852
-        $valid_order_columns      = ['DTT_ID', 'DTT_EVT_start', 'DTT_EVT_end', 'DTT_order'];
853
-        $order_by                 = in_array($order_by, $valid_order_columns, true) ? $order_by : 'DTT_EVT_start';
854
-        $query_params['order_by'] = [$order_by => $order];
855
-        return $query_params;
856
-    }
19
+	/**
20
+	 * @var EEM_Datetime $_instance
21
+	 */
22
+	protected static $_instance;
23
+
24
+
25
+	/**
26
+	 * private constructor to prevent direct creation
27
+	 *
28
+	 * @param string $timezone A string representing the timezone we want to set for returned Date Time Strings
29
+	 *                         (and any incoming timezone data that gets saved).
30
+	 *                         Note this just sends the timezone info to the date time model field objects.
31
+	 *                         Default is NULL
32
+	 *                         (and will be assumed using the set timezone in the 'timezone_string' wp option)
33
+	 * @throws EE_Error
34
+	 * @throws InvalidArgumentException
35
+	 * @throws InvalidArgumentException
36
+	 */
37
+	protected function __construct($timezone)
38
+	{
39
+		$this->singular_item           = esc_html__('Datetime', 'event_espresso');
40
+		$this->plural_item             = esc_html__('Datetimes', 'event_espresso');
41
+		$this->_tables                 = [
42
+			'Datetime' => new EE_Primary_Table('esp_datetime', 'DTT_ID'),
43
+		];
44
+		$this->_fields                 = [
45
+			'Datetime' => [
46
+				'DTT_ID'          => new EE_Primary_Key_Int_Field(
47
+					'DTT_ID',
48
+					esc_html__('Datetime ID', 'event_espresso')
49
+				),
50
+				'EVT_ID'          => new EE_Foreign_Key_Int_Field(
51
+					'EVT_ID',
52
+					esc_html__('Event ID', 'event_espresso'),
53
+					false,
54
+					0,
55
+					'Event'
56
+				),
57
+				'VNU_ID' => new EE_Foreign_Key_Int_Field(
58
+					'VNU_ID',
59
+					__('Venue ID', 'event_espresso'),
60
+					false,
61
+					0,
62
+					'Venue'
63
+				),
64
+				'DTT_name'        => new EE_Plain_Text_Field(
65
+					'DTT_name',
66
+					esc_html__('Datetime Name', 'event_espresso'),
67
+					false,
68
+					''
69
+				),
70
+				'DTT_description' => new EE_Post_Content_Field(
71
+					'DTT_description',
72
+					esc_html__('Description for Datetime', 'event_espresso'),
73
+					false,
74
+					''
75
+				),
76
+				'DTT_EVT_start'   => new EE_Datetime_Field(
77
+					'DTT_EVT_start',
78
+					esc_html__('Start time/date of Event', 'event_espresso'),
79
+					false,
80
+					EE_Datetime_Field::now,
81
+					$timezone
82
+				),
83
+				'DTT_EVT_end'     => new EE_Datetime_Field(
84
+					'DTT_EVT_end',
85
+					esc_html__('End time/date of Event', 'event_espresso'),
86
+					false,
87
+					EE_Datetime_Field::now,
88
+					$timezone
89
+				),
90
+				'DTT_reg_limit'   => new EE_Infinite_Integer_Field(
91
+					'DTT_reg_limit',
92
+					esc_html__('Registration Limit for this time', 'event_espresso'),
93
+					true,
94
+					EE_INF
95
+				),
96
+				'DTT_sold'        => new EE_Integer_Field(
97
+					'DTT_sold',
98
+					esc_html__('How many sales for this Datetime that have occurred', 'event_espresso'),
99
+					true,
100
+					0
101
+				),
102
+				'DTT_reserved'    => new EE_Integer_Field(
103
+					'DTT_reserved',
104
+					esc_html__('Quantity of tickets reserved, but not yet fully purchased', 'event_espresso'),
105
+					false,
106
+					0
107
+				),
108
+				'DTT_is_primary'  => new EE_Boolean_Field(
109
+					'DTT_is_primary',
110
+					esc_html__('Flag indicating datetime is primary one for event', 'event_espresso'),
111
+					false,
112
+					false
113
+				),
114
+				'DTT_order'       => new EE_Integer_Field(
115
+					'DTT_order',
116
+					esc_html__('The order in which the Datetime is displayed', 'event_espresso'),
117
+					false,
118
+					0
119
+				),
120
+				'DTT_parent'      => new EE_Integer_Field(
121
+					'DTT_parent',
122
+					esc_html__('Indicates what DTT_ID is the parent of this DTT_ID', 'event_espresso'),
123
+					true,
124
+					0
125
+				),
126
+				'DTT_deleted'     => new EE_Trashed_Flag_Field(
127
+					'DTT_deleted',
128
+					esc_html__('Flag indicating datetime is archived', 'event_espresso'),
129
+					false,
130
+					false
131
+				),
132
+			],
133
+		];
134
+		$this->_model_relations        = [
135
+			'Ticket'          => new EE_HABTM_Relation('Datetime_Ticket'),
136
+			'Event'           => new EE_Belongs_To_Relation(),
137
+			'Checkin'         => new EE_Has_Many_Relation(),
138
+			'Datetime_Ticket' => new EE_Has_Many_Relation(),
139
+			'Venue'           => new EE_Belongs_To_Relation(),
140
+		];
141
+		$path_to_event_model           = 'Event';
142
+		$this->model_chain_to_password = $path_to_event_model;
143
+		$this->_model_chain_to_wp_user = $path_to_event_model;
144
+		// this model is generally available for reading
145
+		$this->_cap_restriction_generators[ EEM_Base::caps_read ]       =
146
+			new EE_Restriction_Generator_Event_Related_Public(
147
+				$path_to_event_model
148
+			);
149
+		$this->_cap_restriction_generators[ EEM_Base::caps_read_admin ] =
150
+			new EE_Restriction_Generator_Event_Related_Protected(
151
+				$path_to_event_model
152
+			);
153
+		$this->_cap_restriction_generators[ EEM_Base::caps_edit ]       =
154
+			new EE_Restriction_Generator_Event_Related_Protected(
155
+				$path_to_event_model
156
+			);
157
+		$this->_cap_restriction_generators[ EEM_Base::caps_delete ]     =
158
+			new EE_Restriction_Generator_Event_Related_Protected(
159
+				$path_to_event_model,
160
+				EEM_Base::caps_edit
161
+			);
162
+		parent::__construct($timezone);
163
+	}
164
+
165
+
166
+	/**
167
+	 * create new blank datetime
168
+	 *
169
+	 * @access public
170
+	 * @return EE_Datetime[] array on success, FALSE on fail
171
+	 * @throws EE_Error
172
+	 * @throws InvalidArgumentException
173
+	 * @throws InvalidDataTypeException
174
+	 * @throws ReflectionException
175
+	 * @throws InvalidInterfaceException
176
+	 */
177
+	public function create_new_blank_datetime()
178
+	{
179
+		// makes sure timezone is always set.
180
+		$timezone_string = $this->get_timezone();
181
+		/**
182
+		 * Filters the initial start date for the new datetime.
183
+		 * Any time included in this value will be overridden later so use additional filters to modify the time.
184
+		 *
185
+		 * @param int $start_date Unix timestamp representing now + 30 days in seconds.
186
+		 * @return int Unix timestamp
187
+		 */
188
+		$start_date = apply_filters(
189
+			'FHEE__EEM_Datetime__create_new_blank_datetime__start_date',
190
+			$this->current_time_for_query('DTT_EVT_start', true) + MONTH_IN_SECONDS
191
+		);
192
+		/**
193
+		 * Filters the initial end date for the new datetime.
194
+		 * Any time included in this value will be overridden later so use additional filters to modify the time.
195
+		 *
196
+		 * @param int $end_data Unix timestamp representing now + 30 days in seconds.
197
+		 * @return int Unix timestamp
198
+		 */
199
+		$end_date       = apply_filters(
200
+			'FHEE__EEM_Datetime__create_new_blank_datetime__end_date',
201
+			$this->current_time_for_query('DTT_EVT_end', true) + MONTH_IN_SECONDS
202
+		);
203
+		$blank_datetime = EE_Datetime::new_instance(
204
+			[
205
+				'DTT_EVT_start' => $start_date,
206
+				'DTT_EVT_end'   => $end_date,
207
+				'DTT_order'     => 1,
208
+				'DTT_reg_limit' => EE_INF,
209
+			],
210
+			$timezone_string
211
+		);
212
+		/**
213
+		 * Filters the initial start time and format for the new EE_Datetime instance.
214
+		 *
215
+		 * @param array $start_time An array having size 2.  First element is the time, second element is the time
216
+		 *                          format.
217
+		 * @return array
218
+		 */
219
+		$start_time = apply_filters(
220
+			'FHEE__EEM_Datetime__create_new_blank_datetime__start_time',
221
+			['8am', 'ga']
222
+		);
223
+		/**
224
+		 * Filters the initial end time and format for the new EE_Datetime instance.
225
+		 *
226
+		 * @param array $end_time An array having size 2.  First element is the time, second element is the time
227
+		 *                        format
228
+		 * @return array
229
+		 */
230
+		$end_time = apply_filters(
231
+			'FHEE__EEM_Datetime__create_new_blank_datetime__end_time',
232
+			['5pm', 'ga']
233
+		);
234
+		$this->validateStartAndEndTimeForBlankDate($start_time, $end_time);
235
+		$blank_datetime->set_start_time(
236
+			$this->convert_datetime_for_query(
237
+				'DTT_EVT_start',
238
+				$start_time[0],
239
+				$start_time[1],
240
+				$timezone_string
241
+			)
242
+		);
243
+		$blank_datetime->set_end_time(
244
+			$this->convert_datetime_for_query(
245
+				'DTT_EVT_end',
246
+				$end_time[0],
247
+				$end_time[1],
248
+				$timezone_string
249
+			)
250
+		);
251
+		return [$blank_datetime];
252
+	}
253
+
254
+
255
+	/**
256
+	 * Validates whether the start_time and end_time are in the expected format.
257
+	 *
258
+	 * @param array $start_time
259
+	 * @param array $end_time
260
+	 * @throws InvalidArgumentException
261
+	 * @throws InvalidDataTypeException
262
+	 */
263
+	private function validateStartAndEndTimeForBlankDate(array $start_time, array $end_time)
264
+	{
265
+		if (! is_array($start_time)) {
266
+			throw new InvalidDataTypeException('start_time', $start_time, 'array');
267
+		}
268
+		if (! is_array($end_time)) {
269
+			throw new InvalidDataTypeException('end_time', $end_time, 'array');
270
+		}
271
+		if (count($start_time) !== 2) {
272
+			throw new InvalidArgumentException(
273
+				sprintf(
274
+					'The variable %1$s is expected to be an array with two elements.  The first item in the '
275
+					. 'array should be a valid time string, the second item in the array should be a valid time format',
276
+					'$start_time'
277
+				)
278
+			);
279
+		}
280
+		if (count($end_time) !== 2) {
281
+			throw new InvalidArgumentException(
282
+				sprintf(
283
+					'The variable %1$s is expected to be an array with two elements.  The first item in the '
284
+					. 'array should be a valid time string, the second item in the array should be a valid time format',
285
+					'$end_time'
286
+				)
287
+			);
288
+		}
289
+	}
290
+
291
+
292
+	/**
293
+	 * get event start date from db
294
+	 *
295
+	 * @access public
296
+	 * @param int $EVT_ID
297
+	 * @return EE_Datetime[] array on success, FALSE on fail
298
+	 * @throws EE_Error
299
+	 * @throws ReflectionException
300
+	 */
301
+	public function get_all_event_dates($EVT_ID = 0)
302
+	{
303
+		if (! $EVT_ID) { // on add_new_event event_id gets set to 0
304
+			return $this->create_new_blank_datetime();
305
+		}
306
+		$results = $this->get_datetimes_for_event_ordered_by_DTT_order($EVT_ID);
307
+		if (empty($results)) {
308
+			return $this->create_new_blank_datetime();
309
+		}
310
+		return $results;
311
+	}
312
+
313
+
314
+	/**
315
+	 * get all datetimes attached to an event ordered by the DTT_order field
316
+	 *
317
+	 * @public
318
+	 * @param int     $EVT_ID     event id
319
+	 * @param boolean $include_expired
320
+	 * @param boolean $include_deleted
321
+	 * @param int     $limit      If included then limit the count of results by
322
+	 *                            the given number
323
+	 * @return EE_Datetime[]
324
+	 * @throws EE_Error
325
+	 */
326
+	public function get_datetimes_for_event_ordered_by_DTT_order(
327
+		int $EVT_ID,
328
+		bool $include_expired = true,
329
+		bool $include_deleted = true,
330
+		$limit = 0
331
+	) {
332
+		$prev_data_prep_value = $this->prepModelForQuery();
333
+		$where_params         = ['Event.EVT_ID' => absint($EVT_ID)];
334
+		$query_params[0]      = $this->addDefaultWhereParams($where_params, $include_deleted, $include_expired);
335
+		$query_params         = $this->addDefaultWhereConditions($query_params);
336
+		$query_params         = $this->addDefaultQueryParams($query_params, $limit, 'DTT_order');
337
+		return $this->getDatetimesAndRestoreModel($query_params, $prev_data_prep_value);
338
+	}
339
+
340
+
341
+	/**
342
+	 * Gets the datetimes for the event (with the given limit), and orders them by "importance".
343
+	 * By importance, we mean that the primary datetimes are most important (DEPRECATED FOR NOW),
344
+	 * and then the earlier datetimes are the most important.
345
+	 * Maybe we'll want this to take into account datetimes that haven't already passed, but we don't yet.
346
+	 *
347
+	 * @param int $EVT_ID
348
+	 * @param int $limit
349
+	 * @return EE_Datetime[]|EE_Base_Class[]
350
+	 * @throws EE_Error
351
+	 */
352
+	public function get_datetimes_for_event_ordered_by_importance(int $EVT_ID, $limit = 0)
353
+	{
354
+		$query_params[0] = ['Event.EVT_ID' => absint($EVT_ID)];
355
+		$query_params    = $this->addDefaultWhereConditions($query_params);
356
+		$query_params    = $this->addDefaultQueryParams($query_params, $limit);
357
+		return $this->get_all($query_params);
358
+	}
359
+
360
+
361
+	/**
362
+	 * @param int     $EVT_ID
363
+	 * @param boolean $include_expired
364
+	 * @param boolean $include_deleted
365
+	 * @return EE_Datetime
366
+	 * @throws EE_Error
367
+	 */
368
+	public function get_oldest_datetime_for_event(
369
+		int $EVT_ID,
370
+		bool $include_expired = false,
371
+		bool $include_deleted = false
372
+	) {
373
+		$results = $this->get_datetimes_for_event_ordered_by_start_time(
374
+			$EVT_ID,
375
+			$include_expired,
376
+			$include_deleted,
377
+			1
378
+		);
379
+		if ($results) {
380
+			return array_shift($results);
381
+		}
382
+		return null;
383
+	}
384
+
385
+
386
+	/**
387
+	 * Gets the 'primary' datetime for an event.
388
+	 *
389
+	 * @param int  $EVT_ID
390
+	 * @param bool $try_to_exclude_expired
391
+	 * @param bool $try_to_exclude_deleted
392
+	 * @return EE_Datetime
393
+	 * @throws EE_Error
394
+	 */
395
+	public function get_primary_datetime_for_event(
396
+		int $EVT_ID,
397
+		bool $try_to_exclude_expired = true,
398
+		bool $try_to_exclude_deleted = true
399
+	) {
400
+		if ($try_to_exclude_expired) {
401
+			$non_expired = $this->get_oldest_datetime_for_event($EVT_ID, false, false);
402
+			if ($non_expired) {
403
+				return $non_expired;
404
+			}
405
+		}
406
+		if ($try_to_exclude_deleted) {
407
+			$expired_even = $this->get_oldest_datetime_for_event($EVT_ID, true);
408
+			if ($expired_even) {
409
+				return $expired_even;
410
+			}
411
+		}
412
+		return $this->get_oldest_datetime_for_event($EVT_ID, true, true);
413
+	}
414
+
415
+
416
+	/**
417
+	 * Gets ALL the datetimes for an event (including trashed ones, for now), ordered
418
+	 * only by start date
419
+	 *
420
+	 * @param int     $EVT_ID
421
+	 * @param boolean $include_expired
422
+	 * @param boolean $include_deleted
423
+	 * @param int     $limit
424
+	 * @return EE_Datetime[]
425
+	 * @throws EE_Error
426
+	 */
427
+	public function get_datetimes_for_event_ordered_by_start_time(
428
+		int $EVT_ID,
429
+		bool $include_expired = true,
430
+		bool $include_deleted = true,
431
+		$limit = 0
432
+	) {
433
+		$prev_data_prep_value = $this->prepModelForQuery();
434
+		$where_params         = ['Event.EVT_ID' => absint($EVT_ID)];
435
+		$query_params[0]      = $this->addDefaultWhereParams($where_params, $include_deleted, $include_expired);
436
+		$query_params         = $this->addDefaultWhereConditions(
437
+			$query_params,
438
+			EEM_Base::default_where_conditions_this_only
439
+		);
440
+		$query_params         = $this->addDefaultQueryParams($query_params, $limit, 'DTT_order');
441
+		return $this->getDatetimesAndRestoreModel($query_params, $prev_data_prep_value);
442
+	}
443
+
444
+
445
+	/**
446
+	 * Gets ALL the datetimes for an ticket (including trashed ones, for now), ordered
447
+	 * only by start date
448
+	 *
449
+	 * @param int     $TKT_ID
450
+	 * @param boolean $include_expired
451
+	 * @param boolean $include_deleted
452
+	 * @param int     $limit
453
+	 * @return EE_Datetime[]
454
+	 * @throws EE_Error
455
+	 */
456
+	public function get_datetimes_for_ticket_ordered_by_start_time(
457
+		int $TKT_ID,
458
+		bool $include_expired = true,
459
+		bool $include_deleted = true,
460
+		$limit = 0
461
+	) {
462
+		$prev_data_prep_value = $this->prepModelForQuery();
463
+		$where_params         = ['Ticket.TKT_ID' => absint($TKT_ID)];
464
+		$query_params[0]      = $this->addDefaultWhereParams($where_params, $include_deleted, $include_expired);
465
+		$query_params         = $this->addDefaultQueryParams($query_params, $limit);
466
+		return $this->getDatetimesAndRestoreModel($query_params, $prev_data_prep_value);
467
+	}
468
+
469
+
470
+	/**
471
+	 * Gets all the datetimes for a ticket (including trashed ones, for now), ordered by the DTT_order for the
472
+	 * datetimes.
473
+	 *
474
+	 * @param int      $TKT_ID           ID of ticket to retrieve the datetimes for
475
+	 * @param boolean  $include_expired  whether to include expired datetimes or not
476
+	 * @param boolean  $include_deleted  whether to include trashed datetimes or not.
477
+	 * @param int|null $limit            if null, no limit, if int then limit results by
478
+	 *                                   that number
479
+	 * @return EE_Datetime[]
480
+	 * @throws EE_Error
481
+	 */
482
+	public function get_datetimes_for_ticket_ordered_by_DTT_order(
483
+		int $TKT_ID,
484
+		bool $include_expired = true,
485
+		bool $include_deleted = true,
486
+		$limit = 0
487
+	) {
488
+		$prev_data_prep_value = $this->prepModelForQuery();
489
+		$where_params         = ['Ticket.TKT_ID' => absint($TKT_ID)];
490
+		$query_params[0]      = $this->addDefaultWhereParams($where_params, $include_deleted, $include_expired);
491
+		$query_params         = $this->addDefaultQueryParams($query_params, $limit, 'DTT_order');
492
+		return $this->getDatetimesAndRestoreModel($query_params, $prev_data_prep_value);
493
+	}
494
+
495
+
496
+	/**
497
+	 * Gets the most important datetime for a particular event (ie, the primary event usually. But if for some WACK
498
+	 * reason it doesn't exist, we consider the earliest event the most important)
499
+	 *
500
+	 * @param int $EVT_ID
501
+	 * @return EE_Datetime
502
+	 * @throws EE_Error
503
+	 */
504
+	public function get_most_important_datetime_for_event(int $EVT_ID)
505
+	{
506
+		$results = $this->get_datetimes_for_event_ordered_by_importance($EVT_ID, 1);
507
+		if ($results) {
508
+			return array_shift($results);
509
+		}
510
+		return null;
511
+	}
512
+
513
+
514
+	/**
515
+	 * This returns a wpdb->results        Array of all DTT month and years matching the incoming query params and
516
+	 * grouped by month and year.
517
+	 *
518
+	 * @param array  $where_params       @see
519
+	 *                                   https://github.com/eventespresso/event-espresso-core/tree/master/docs/G--Model-System/model-query-params.md#0-where-conditions
520
+	 * @param string $evt_active_status  A string representing the evt active status to filter the months by.
521
+	 *                                   Can be:
522
+	 *                                   - '' = no filter
523
+	 *                                   - upcoming = Published events with at least one upcoming datetime.
524
+	 *                                   - expired = Events with all datetimes expired.
525
+	 *                                   - active = Events that are published and have at least one datetime that
526
+	 *                                   starts before now and ends after now.
527
+	 *                                   - inactive = Events that are either not published.
528
+	 * @return stdClass[]
529
+	 * @throws EE_Error
530
+	 * @throws InvalidArgumentException
531
+	 * @throws InvalidArgumentException
532
+	 */
533
+	public function get_dtt_months_and_years(array $where_params, $evt_active_status = '')
534
+	{
535
+		$current_time_for_DTT_EVT_start = $this->current_time_for_query('DTT_EVT_start');
536
+		$current_time_for_DTT_EVT_end   = $this->current_time_for_query('DTT_EVT_end');
537
+		switch ($evt_active_status) {
538
+			case 'upcoming':
539
+				$where_params['Event.status'] = 'publish';
540
+				// if there are already query_params matching DTT_EVT_start then we need to modify that to add them.
541
+				if (isset($where_params['DTT_EVT_start'])) {
542
+					$where_params['DTT_EVT_start*****'] = $where_params['DTT_EVT_start'];
543
+				}
544
+				$where_params['DTT_EVT_start'] = ['>', $current_time_for_DTT_EVT_start];
545
+				break;
546
+			case 'expired':
547
+				if (isset($where_params['Event.status'])) {
548
+					unset($where_params['Event.status']);
549
+				}
550
+				// get events to exclude
551
+				$exclude_query[0] = array_merge(
552
+					$where_params,
553
+					['DTT_EVT_end' => ['>', $current_time_for_DTT_EVT_end]]
554
+				);
555
+				// first get all events that have datetimes where its not expired.
556
+				$event_ids = $this->_get_all_wpdb_results(
557
+					$exclude_query,
558
+					OBJECT_K,
559
+					'Datetime.EVT_ID'
560
+				);
561
+				$event_ids = array_keys($event_ids);
562
+				if (isset($where_params['DTT_EVT_end'])) {
563
+					$where_params['DTT_EVT_end****'] = $where_params['DTT_EVT_end'];
564
+				}
565
+				$where_params['DTT_EVT_end']  = ['<', $current_time_for_DTT_EVT_end];
566
+				$where_params['Event.EVT_ID'] = ['NOT IN', $event_ids];
567
+				break;
568
+			case 'active':
569
+				$where_params['Event.status'] = 'publish';
570
+				if (isset($where_params['DTT_EVT_start'])) {
571
+					$where_params['Datetime.DTT_EVT_start******'] = $where_params['DTT_EVT_start'];
572
+				}
573
+				if (isset($where_params['Datetime.DTT_EVT_end'])) {
574
+					$where_params['Datetime.DTT_EVT_end*****'] = $where_params['DTT_EVT_end'];
575
+				}
576
+				$where_params['DTT_EVT_start'] = ['<', $current_time_for_DTT_EVT_start];
577
+				$where_params['DTT_EVT_end']   = ['>', $current_time_for_DTT_EVT_end];
578
+				break;
579
+			case 'inactive':
580
+				if (isset($where_params['Event.status'])) {
581
+					unset($where_params['Event.status']);
582
+				}
583
+				if (isset($where_params['OR'])) {
584
+					$where_params['AND']['OR'] = $where_params['OR'];
585
+				}
586
+				if (isset($where_params['DTT_EVT_end'])) {
587
+					$where_params['AND']['DTT_EVT_end****'] = $where_params['DTT_EVT_end'];
588
+					unset($where_params['DTT_EVT_end']);
589
+				}
590
+				if (isset($where_params['DTT_EVT_start'])) {
591
+					$where_params['AND']['DTT_EVT_start'] = $where_params['DTT_EVT_start'];
592
+					unset($where_params['DTT_EVT_start']);
593
+				}
594
+				$where_params['AND']['Event.status'] = ['!=', 'publish'];
595
+				break;
596
+		}
597
+		$query_params[0]          = $where_params;
598
+		$query_params['group_by'] = ['dtt_year', 'dtt_month'];
599
+		$query_params             = $this->addOrderByQueryParams($query_params, 'DTT_EVT_start', 'DESC');
600
+
601
+		$query_interval    = EEH_DTT_Helper::get_sql_query_interval_for_offset(
602
+			$this->get_timezone(),
603
+			'DTT_EVT_start'
604
+		);
605
+		$columns_to_select = [
606
+			'dtt_year'      => ['YEAR(' . $query_interval . ')', '%s'],
607
+			'dtt_month'     => ['MONTHNAME(' . $query_interval . ')', '%s'],
608
+			'dtt_month_num' => ['MONTH(' . $query_interval . ')', '%s'],
609
+		];
610
+		return $this->_get_all_wpdb_results($query_params, OBJECT, $columns_to_select);
611
+	}
612
+
613
+
614
+	/**
615
+	 * Updates the DTT_sold attribute on each datetime (based on the registrations
616
+	 * for the tickets for each datetime)
617
+	 *
618
+	 * @param EE_Base_Class[]|EE_Datetime[] $datetimes
619
+	 * @throws EE_Error
620
+	 * @throws ReflectionException
621
+	 */
622
+	public function update_sold(array $datetimes)
623
+	{
624
+		EE_Error::doing_it_wrong(
625
+			__FUNCTION__,
626
+			esc_html__(
627
+				'Please use \EEM_Ticket::update_tickets_sold() instead which will in turn correctly update both the Ticket AND Datetime counts.',
628
+				'event_espresso'
629
+			),
630
+			'4.9.32.rc.005'
631
+		);
632
+		foreach ($datetimes as $datetime) {
633
+			$datetime->update_sold();
634
+		}
635
+	}
636
+
637
+
638
+	/**
639
+	 *    Gets the total number of tickets available at a particular datetime
640
+	 *    (does NOT take into account the datetime's spaces available)
641
+	 *
642
+	 * @param int   $DTT_ID
643
+	 * @param array $query_params
644
+	 * @return int of tickets available. If sold out, return less than 1. If infinite, returns EE_INF,  IF there are NO
645
+	 *             tickets attached to datetime then FALSE is returned.
646
+	 * @throws EE_Error
647
+	 * @throws ReflectionException
648
+	 */
649
+	public function sum_tickets_currently_available_at_datetime(int $DTT_ID, array $query_params = [])
650
+	{
651
+		$datetime = $this->get_one_by_ID($DTT_ID);
652
+		if ($datetime instanceof EE_Datetime) {
653
+			return $datetime->tickets_remaining($query_params);
654
+		}
655
+		return 0;
656
+	}
657
+
658
+
659
+	/**
660
+	 * This returns an array of counts of datetimes in the database for each Datetime status that can be queried.
661
+	 *
662
+	 * @param array $stati_to_include  If included you can restrict the statuses we return counts for by including the
663
+	 *                                 stati you want counts for as values in the array.  An empty array returns counts
664
+	 *                                 for all valid stati.
665
+	 * @param array $query_params      If included can be used to refine the conditions for returning the count (i.e.
666
+	 *                                 only for Datetimes connected to a specific event, or specific ticket.
667
+	 * @return array  The value returned is an array indexed by Datetime Status and the values are the counts.  The
668
+	 * @throws EE_Error
669
+	 *                                 stati used as index keys are: EE_Datetime::active EE_Datetime::upcoming
670
+	 *                                 EE_Datetime::expired
671
+	 */
672
+	public function get_datetime_counts_by_status(array $stati_to_include = [], array $query_params = [])
673
+	{
674
+		// only accept where conditions for this query.
675
+		$_where            = isset($query_params[0]) ? $query_params[0] : [];
676
+		$status_query_args = [
677
+			EE_Datetime::active   => array_merge(
678
+				$_where,
679
+				['DTT_EVT_start' => ['<', time()], 'DTT_EVT_end' => ['>', time()]]
680
+			),
681
+			EE_Datetime::upcoming => array_merge(
682
+				$_where,
683
+				['DTT_EVT_start' => ['>', time()]]
684
+			),
685
+			EE_Datetime::expired  => array_merge(
686
+				$_where,
687
+				['DTT_EVT_end' => ['<', time()]]
688
+			),
689
+		];
690
+		if (! empty($stati_to_include)) {
691
+			foreach (array_keys($status_query_args) as $status) {
692
+				if (! in_array($status, $stati_to_include, true)) {
693
+					unset($status_query_args[ $status ]);
694
+				}
695
+			}
696
+		}
697
+		// loop through and query counts for each stati.
698
+		$status_query_results = [];
699
+		foreach ($status_query_args as $status => $status_where_conditions) {
700
+			$status_query_results[ $status ] = EEM_Datetime::count(
701
+				[$status_where_conditions],
702
+				'DTT_ID',
703
+				true
704
+			);
705
+		}
706
+		return $status_query_results;
707
+	}
708
+
709
+
710
+	/**
711
+	 * Returns the specific count for a given Datetime status matching any given query_params.
712
+	 *
713
+	 * @param string $status Valid string representation for Datetime status requested. (Defaults to Active).
714
+	 * @param array  $query_params
715
+	 * @return int
716
+	 * @throws EE_Error
717
+	 */
718
+	public function get_datetime_count_for_status($status = EE_Datetime::active, array $query_params = [])
719
+	{
720
+		$count = $this->get_datetime_counts_by_status([$status], $query_params);
721
+		return ! empty($count[ $status ]) ? $count[ $status ] : 0;
722
+	}
723
+
724
+
725
+	/**
726
+	 * @return bool|int
727
+	 * @since   5.0.0.p
728
+	 */
729
+	private function prepModelForQuery()
730
+	{
731
+		$prev_data_prep_value = $this->get_assumption_concerning_values_already_prepared_by_model_object();
732
+		$this->assume_values_already_prepared_by_model_object(EEM_Base::prepared_for_use_in_db);
733
+		return $prev_data_prep_value;
734
+	}
735
+
736
+
737
+	/**
738
+	 * @param array    $query_params
739
+	 * @param bool|int $prev_data_prep_value
740
+	 * @return EE_Base_Class[]|EE_Datetime[]
741
+	 * @throws EE_Error
742
+	 * @since   5.0.0.p
743
+	 */
744
+	private function getDatetimesAndRestoreModel(array $query_params, $prev_data_prep_value)
745
+	{
746
+		$result = $this->get_all($query_params);
747
+		$this->assume_values_already_prepared_by_model_object($prev_data_prep_value);
748
+		return $result;
749
+	}
750
+
751
+
752
+	/**
753
+	 * @param array  $query_params
754
+	 * @param int    $limit
755
+	 * @param string $order_by
756
+	 * @param string $order
757
+	 * @return array
758
+	 * @since   5.0.0.p
759
+	 */
760
+	private function addDefaultQueryParams(array $query_params, $limit = 0, $order_by = 'DTT_EVT_start', $order = 'ASC')
761
+	{
762
+		$query_params = $this->addOrderByQueryParams($query_params, $order_by, $order);
763
+		$query_params = $this->addLimitQueryParams($query_params, $limit);
764
+		return $query_params;
765
+	}
766
+
767
+
768
+	/**
769
+	 * @param array  $query_params
770
+	 * @param string $default_where_conditions
771
+	 * @return array
772
+	 * @since   5.0.0.p
773
+	 */
774
+	private function addDefaultWhereConditions(
775
+		array $query_params,
776
+		$default_where_conditions = EEM_Base::default_where_conditions_none
777
+	) {
778
+		$query_params['default_where_conditions'] = $default_where_conditions;
779
+		return $query_params;
780
+	}
781
+
782
+
783
+	/**
784
+	 * @param array $where_params
785
+	 * @param bool  $include_deleted
786
+	 * @param bool  $include_expired
787
+	 * @return array
788
+	 * @since   5.0.0.p
789
+	 */
790
+	private function addDefaultWhereParams(array $where_params, bool $include_deleted = true, bool $include_expired = true)
791
+	{
792
+		$where_params = $this->addExpiredWhereParams($where_params, $include_expired);
793
+		$where_params = $this->addDeletedWhereParams($where_params, $include_deleted);
794
+		return $where_params;
795
+	}
796
+
797
+
798
+	/**
799
+	 * @param array $where_params
800
+	 * @param bool  $include_deleted
801
+	 * @return array
802
+	 * @since   5.0.0.p
803
+	 */
804
+	private function addDeletedWhereParams(array $where_params, bool $include_deleted = true)
805
+	{
806
+		$deleted                     = $include_deleted ? [true, false] : [false];
807
+		$where_params['DTT_deleted'] = ['IN', $deleted];
808
+		return $where_params;
809
+	}
810
+
811
+
812
+	/**
813
+	 * @param array $where_params
814
+	 * @param bool  $include_expired
815
+	 * @return array
816
+	 * @since   5.0.0.p
817
+	 */
818
+	private function addExpiredWhereParams(array $where_params, bool $include_expired = true)
819
+	{
820
+		if (! $include_expired) {
821
+			$where_params['DTT_EVT_end'] = ['>=', current_time('mysql', true)];
822
+		}
823
+		return $where_params;
824
+	}
825
+
826
+
827
+	/**
828
+	 * @param array $query_params
829
+	 * @param int   $limit
830
+	 * @return array
831
+	 * @since   5.0.0.p
832
+	 */
833
+	private function addLimitQueryParams(array $query_params, $limit = 0)
834
+	{
835
+		if ($limit) {
836
+			$query_params['limit'] = $limit;
837
+		}
838
+		return $query_params;
839
+	}
840
+
841
+
842
+	/**
843
+	 * @param array  $query_params
844
+	 * @param string $order_by
845
+	 * @param string $order
846
+	 * @return array
847
+	 * @since   5.0.0.p
848
+	 */
849
+	private function addOrderByQueryParams(array $query_params, $order_by = 'DTT_EVT_start', $order = 'ASC')
850
+	{
851
+		$order                    = $order === 'ASC' ? 'ASC' : 'DESC';
852
+		$valid_order_columns      = ['DTT_ID', 'DTT_EVT_start', 'DTT_EVT_end', 'DTT_order'];
853
+		$order_by                 = in_array($order_by, $valid_order_columns, true) ? $order_by : 'DTT_EVT_start';
854
+		$query_params['order_by'] = [$order_by => $order];
855
+		return $query_params;
856
+	}
857 857
 }
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
Indentation   +93 added lines, -93 removed lines patch added patch discarded remove patch
@@ -23,109 +23,109 @@
 block discarded – undo
23 23
  */
24 24
 class AddonManager
25 25
 {
26
-    /**
27
-     * @var AddonCollection
28
-     */
29
-    private $addons;
26
+	/**
27
+	 * @var AddonCollection
28
+	 */
29
+	private $addons;
30 30
 
31
-    /**
32
-     * @var IncompatibleAddonHandler
33
-     */
34
-    private $incompatible_addon_handler;
31
+	/**
32
+	 * @var IncompatibleAddonHandler
33
+	 */
34
+	private $incompatible_addon_handler;
35 35
 
36
-    /**
37
-     * @var Psr4Autoloader
38
-     */
39
-    private $psr4_loader;
36
+	/**
37
+	 * @var Psr4Autoloader
38
+	 */
39
+	private $psr4_loader;
40 40
 
41
-    /**
42
-     * @var RegisterV1Addon
43
-     */
44
-    private $register_v1_addon;
41
+	/**
42
+	 * @var RegisterV1Addon
43
+	 */
44
+	private $register_v1_addon;
45 45
 
46
-    /**
47
-     * @var ThirdPartyPluginHandler
48
-     */
49
-    private $third_party_plugin_handler;
46
+	/**
47
+	 * @var ThirdPartyPluginHandler
48
+	 */
49
+	private $third_party_plugin_handler;
50 50
 
51 51
 
52
-    /**
53
-     * AddonManager constructor.
54
-     *
55
-     * @param AddonCollection          $addons
56
-     * @param Psr4Autoloader           $psr4_loader
57
-     * @param RegisterV1Addon          $register_v1_addon
58
-     * @param IncompatibleAddonHandler $incompatible_addon_handler
59
-     * @param ThirdPartyPluginHandler  $third_party_plugin_handler
60
-     */
61
-    public function __construct(
62
-        AddonCollection $addons,
63
-        Psr4Autoloader $psr4_loader,
64
-        RegisterV1Addon $register_v1_addon,
65
-        IncompatibleAddonHandler $incompatible_addon_handler,
66
-        ThirdPartyPluginHandler $third_party_plugin_handler
67
-    ) {
68
-        $this->addons                     = $addons;
69
-        $this->psr4_loader                = $psr4_loader;
70
-        $this->register_v1_addon          = $register_v1_addon;
71
-        $this->incompatible_addon_handler = $incompatible_addon_handler;
72
-        $this->third_party_plugin_handler = $third_party_plugin_handler;
73
-    }
52
+	/**
53
+	 * AddonManager constructor.
54
+	 *
55
+	 * @param AddonCollection          $addons
56
+	 * @param Psr4Autoloader           $psr4_loader
57
+	 * @param RegisterV1Addon          $register_v1_addon
58
+	 * @param IncompatibleAddonHandler $incompatible_addon_handler
59
+	 * @param ThirdPartyPluginHandler  $third_party_plugin_handler
60
+	 */
61
+	public function __construct(
62
+		AddonCollection $addons,
63
+		Psr4Autoloader $psr4_loader,
64
+		RegisterV1Addon $register_v1_addon,
65
+		IncompatibleAddonHandler $incompatible_addon_handler,
66
+		ThirdPartyPluginHandler $third_party_plugin_handler
67
+	) {
68
+		$this->addons                     = $addons;
69
+		$this->psr4_loader                = $psr4_loader;
70
+		$this->register_v1_addon          = $register_v1_addon;
71
+		$this->incompatible_addon_handler = $incompatible_addon_handler;
72
+		$this->third_party_plugin_handler = $third_party_plugin_handler;
73
+	}
74 74
 
75 75
 
76
-    /**
77
-     * @throws Exception
78
-     */
79
-    public function initialize()
80
-    {
81
-        // set autoloaders for all of the classes implementing the legacy EEI_Plugin_API
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');
84
-    }
76
+	/**
77
+	 * @throws Exception
78
+	 */
79
+	public function initialize()
80
+	{
81
+		// set autoloaders for all of the classes implementing the legacy EEI_Plugin_API
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');
84
+	}
85 85
 
86 86
 
87
-    /**
88
-     * @throws Exception
89
-     */
90
-    public function loadAddons()
91
-    {
92
-        try {
93
-            $this->incompatible_addon_handler->deactivateIncompatibleAddons();
94
-            // legacy add-on API
95
-            do_action('AHEE__EE_System__load_espresso_addons');
96
-            // new add-on API that uses versioning
97
-            do_action(
98
-                'AHEE__EventEspresso_core_services_addon_AddonManager__initialize__addons',
99
-                $this->addons,
100
-                espresso_version()
101
-            );
102
-            // addons are responsible for loading their AddonApiVersion into the AddonCollection
103
-            foreach ($this->addons as $addon) {
104
-                if ($addon instanceof AddonApiVersion) {
105
-                    $this->registerAddon($addon);
106
-                }
107
-            }
108
-            $this->third_party_plugin_handler->loadPlugins();
109
-            do_action('AHEE__EE_System__load_espresso_addons__complete');
110
-        } catch (Exception $exception) {
111
-            new ExceptionStackTraceDisplay($exception);
112
-        }
113
-    }
87
+	/**
88
+	 * @throws Exception
89
+	 */
90
+	public function loadAddons()
91
+	{
92
+		try {
93
+			$this->incompatible_addon_handler->deactivateIncompatibleAddons();
94
+			// legacy add-on API
95
+			do_action('AHEE__EE_System__load_espresso_addons');
96
+			// new add-on API that uses versioning
97
+			do_action(
98
+				'AHEE__EventEspresso_core_services_addon_AddonManager__initialize__addons',
99
+				$this->addons,
100
+				espresso_version()
101
+			);
102
+			// addons are responsible for loading their AddonApiVersion into the AddonCollection
103
+			foreach ($this->addons as $addon) {
104
+				if ($addon instanceof AddonApiVersion) {
105
+					$this->registerAddon($addon);
106
+				}
107
+			}
108
+			$this->third_party_plugin_handler->loadPlugins();
109
+			do_action('AHEE__EE_System__load_espresso_addons__complete');
110
+		} catch (Exception $exception) {
111
+			new ExceptionStackTraceDisplay($exception);
112
+		}
113
+	}
114 114
 
115 115
 
116
-    /**
117
-     * @param AddonApiVersion $addon
118
-     * @throws EE_Error
119
-     */
120
-    private function registerAddon(AddonApiVersion $addon)
121
-    {
122
-        // first register addon namespace so that FQCNs resolve correctly
123
-        $this->psr4_loader->addNamespace($addon->getNamespace(), dirname($addon->mainFile()) . '/src/');
124
-        // then allow add-on to perform any other setup that relied on PSR4 autoloading
125
-        $addon->initialize();
126
-        // now register each addon based on it's API version
127
-        if ($addon instanceof AddonApiV1) {
128
-            $this->register_v1_addon->register($addon);
129
-        }
130
-    }
116
+	/**
117
+	 * @param AddonApiVersion $addon
118
+	 * @throws EE_Error
119
+	 */
120
+	private function registerAddon(AddonApiVersion $addon)
121
+	{
122
+		// first register addon namespace so that FQCNs resolve correctly
123
+		$this->psr4_loader->addNamespace($addon->getNamespace(), dirname($addon->mainFile()) . '/src/');
124
+		// then allow add-on to perform any other setup that relied on PSR4 autoloading
125
+		$addon->initialize();
126
+		// now register each addon based on it's API version
127
+		if ($addon instanceof AddonApiV1) {
128
+			$this->register_v1_addon->register($addon);
129
+		}
130
+	}
131 131
 }
Please login to merge, or discard this patch.
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.
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   +69 added lines, -69 removed lines patch added patch discarded remove patch
@@ -6,75 +6,75 @@
 block discarded – undo
6 6
 
7 7
 class IncompatibleAddonHandler
8 8
 {
9
-    /**
10
-     * @return void
11
-     */
12
-    public function deactivateIncompatibleAddons()
13
-    {
14
-        $this->deactivateIncompatibleAddon(
15
-            'Wait Lists',
16
-            'EE_WAIT_LISTS_VERSION',
17
-            '1.0.0.beta.074',
18
-            'load_espresso_wait_lists',
19
-            'EE_WAIT_LISTS_PLUGIN_FILE'
20
-        );
21
-        $this->deactivateIncompatibleAddon(
22
-            'Automated Upcoming Event Notifications',
23
-            'EE_AUTOMATED_UPCOMING_EVENT_NOTIFICATION_VERSION',
24
-            '1.0.0.beta.091',
25
-            'load_espresso_automated_upcoming_event_notification',
26
-            'EE_AUTOMATED_UPCOMING_EVENT_NOTIFICATION_PLUGIN_FILE'
27
-        );
28
-        // $this->deactivateIncompatibleAddon(
29
-        //     'WP Users Integration',
30
-        //     'EE_WPUSERS_VERSION',
31
-        //     '2.1.0.rc.003',
32
-        //     'load_ee_core_wpusers',
33
-        //     'EE_WPUSERS_PLUGIN_FILE'
34
-        // );
35
-    }
9
+	/**
10
+	 * @return void
11
+	 */
12
+	public function deactivateIncompatibleAddons()
13
+	{
14
+		$this->deactivateIncompatibleAddon(
15
+			'Wait Lists',
16
+			'EE_WAIT_LISTS_VERSION',
17
+			'1.0.0.beta.074',
18
+			'load_espresso_wait_lists',
19
+			'EE_WAIT_LISTS_PLUGIN_FILE'
20
+		);
21
+		$this->deactivateIncompatibleAddon(
22
+			'Automated Upcoming Event Notifications',
23
+			'EE_AUTOMATED_UPCOMING_EVENT_NOTIFICATION_VERSION',
24
+			'1.0.0.beta.091',
25
+			'load_espresso_automated_upcoming_event_notification',
26
+			'EE_AUTOMATED_UPCOMING_EVENT_NOTIFICATION_PLUGIN_FILE'
27
+		);
28
+		// $this->deactivateIncompatibleAddon(
29
+		//     'WP Users Integration',
30
+		//     'EE_WPUSERS_VERSION',
31
+		//     '2.1.0.rc.003',
32
+		//     'load_ee_core_wpusers',
33
+		//     'EE_WPUSERS_PLUGIN_FILE'
34
+		// );
35
+	}
36 36
 
37 37
 
38
-    /**
39
-     * @param string $addon_name
40
-     * @param string $version_constant
41
-     * @param string $min_version_required
42
-     * @param string $load_callback
43
-     * @param string $plugin_file_constant
44
-     * @return void
45
-     */
46
-    private function deactivateIncompatibleAddon(
47
-        string $addon_name,
48
-        string $version_constant,
49
-        string $min_version_required,
50
-        string $load_callback,
51
-        string $plugin_file_constant
52
-    ) {
53
-        if (! defined($version_constant)) {
54
-            return;
55
-        }
56
-        $addon_version = constant($version_constant);
57
-        if ($addon_version && version_compare($addon_version, $min_version_required, '<')) {
58
-            remove_action('AHEE__EE_System__load_espresso_addons', $load_callback);
59
-            if (! function_exists('deactivate_plugins')) {
60
-                require_once ABSPATH . 'wp-admin/includes/plugin.php';
61
-            }
62
-            deactivate_plugins(plugin_basename(constant($plugin_file_constant)));
63
-            unset($_GET['activate'], $_REQUEST['activate'], $_GET['activate-multi'], $_REQUEST['activate-multi']);
64
-            EE_Error::add_error(
65
-                sprintf(
66
-                    esc_html__(
67
-                        '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.',
68
-                        'event_espresso'
69
-                    ),
70
-                    $addon_name,
71
-                    $min_version_required
72
-                ),
73
-                __FILE__,
74
-                __FUNCTION__ . "({$addon_name})",
75
-                __LINE__
76
-            );
77
-            EE_Error::get_notices(false, true);
78
-        }
79
-    }
38
+	/**
39
+	 * @param string $addon_name
40
+	 * @param string $version_constant
41
+	 * @param string $min_version_required
42
+	 * @param string $load_callback
43
+	 * @param string $plugin_file_constant
44
+	 * @return void
45
+	 */
46
+	private function deactivateIncompatibleAddon(
47
+		string $addon_name,
48
+		string $version_constant,
49
+		string $min_version_required,
50
+		string $load_callback,
51
+		string $plugin_file_constant
52
+	) {
53
+		if (! defined($version_constant)) {
54
+			return;
55
+		}
56
+		$addon_version = constant($version_constant);
57
+		if ($addon_version && version_compare($addon_version, $min_version_required, '<')) {
58
+			remove_action('AHEE__EE_System__load_espresso_addons', $load_callback);
59
+			if (! function_exists('deactivate_plugins')) {
60
+				require_once ABSPATH . 'wp-admin/includes/plugin.php';
61
+			}
62
+			deactivate_plugins(plugin_basename(constant($plugin_file_constant)));
63
+			unset($_GET['activate'], $_REQUEST['activate'], $_GET['activate-multi'], $_REQUEST['activate-multi']);
64
+			EE_Error::add_error(
65
+				sprintf(
66
+					esc_html__(
67
+						'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.',
68
+						'event_espresso'
69
+					),
70
+					$addon_name,
71
+					$min_version_required
72
+				),
73
+				__FILE__,
74
+				__FUNCTION__ . "({$addon_name})",
75
+				__LINE__
76
+			);
77
+			EE_Error::get_notices(false, true);
78
+		}
79
+	}
80 80
 }
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.