@@ -65,7 +65,7 @@ |
||
65 | 65 | */ |
66 | 66 | public function registerCustomTaxonomyTerm($taxonomy, $term_slug, array $cpt_slugs = array()) |
67 | 67 | { |
68 | - $this->custom_taxonomy_terms[][ $term_slug ] = new CustomTaxonomyTerm( |
|
68 | + $this->custom_taxonomy_terms[][$term_slug] = new CustomTaxonomyTerm( |
|
69 | 69 | $taxonomy, |
70 | 70 | $term_slug, |
71 | 71 | $cpt_slugs |
@@ -16,180 +16,180 @@ |
||
16 | 16 | class RegisterCustomTaxonomyTerms |
17 | 17 | { |
18 | 18 | |
19 | - /** |
|
20 | - * @var array[] $custom_taxonomy_terms |
|
21 | - */ |
|
22 | - public $custom_taxonomy_terms = array(); |
|
23 | - |
|
24 | - |
|
25 | - /** |
|
26 | - * RegisterCustomTaxonomyTerms constructor. |
|
27 | - */ |
|
28 | - public function __construct() |
|
29 | - { |
|
30 | - // hook into save_post so that we can make sure that the default terms get saved on publish of registered cpts |
|
31 | - // IF they don't have a term for that taxonomy set. |
|
32 | - add_action('save_post', array($this, 'saveDefaultTerm'), 100, 2); |
|
33 | - do_action( |
|
34 | - 'AHEE__EventEspresso_core_domain_services_custom_post_types_RegisterCustomTaxonomyTerms__construct_end', |
|
35 | - $this |
|
36 | - ); |
|
37 | - } |
|
38 | - |
|
39 | - |
|
40 | - public function registerCustomTaxonomyTerms() |
|
41 | - { |
|
42 | - // setup default terms in any of our taxonomies (but only if we're in admin). |
|
43 | - // Why not added via register_activation_hook? |
|
44 | - // Because it's possible that in future iterations of EE we may add new defaults for specialized taxonomies |
|
45 | - // (think event_types) and register_activation_hook only reliably runs when a user manually activates the plugin. |
|
46 | - // Keep in mind that this will READ these terms if they are deleted by the user. Hence MUST use terms. |
|
47 | - // if ( is_admin() ) { |
|
48 | - // $this->set_must_use_event_types(); |
|
49 | - // } |
|
50 | - // set default terms |
|
51 | - $this->registerCustomTaxonomyTerm( |
|
52 | - 'espresso_event_type', |
|
53 | - 'single-event', |
|
54 | - array('espresso_events') |
|
55 | - ); |
|
56 | - } |
|
57 | - |
|
58 | - |
|
59 | - /** |
|
60 | - * Allows us to set what the default will be for terms when a cpt is PUBLISHED. |
|
61 | - * |
|
62 | - * @param string $taxonomy The taxonomy we're using for the default term |
|
63 | - * @param string $term_slug The slug of the term that will be the default. |
|
64 | - * @param array $cpt_slugs An array of custom post types we want the default assigned to |
|
65 | - */ |
|
66 | - public function registerCustomTaxonomyTerm($taxonomy, $term_slug, array $cpt_slugs = array()) |
|
67 | - { |
|
68 | - $this->custom_taxonomy_terms[][ $term_slug ] = new CustomTaxonomyTerm( |
|
69 | - $taxonomy, |
|
70 | - $term_slug, |
|
71 | - $cpt_slugs |
|
72 | - ); |
|
73 | - } |
|
74 | - |
|
75 | - |
|
76 | - /** |
|
77 | - * hooked into the wp 'save_post' action hook for setting our default terms found in the $_default_terms property |
|
78 | - * |
|
79 | - * @param int $post_id ID of CPT being saved |
|
80 | - * @param WP_Post $post Post object |
|
81 | - * @return void |
|
82 | - */ |
|
83 | - public function saveDefaultTerm($post_id, WP_Post $post) |
|
84 | - { |
|
85 | - if (empty($this->custom_taxonomy_terms)) { |
|
86 | - return; |
|
87 | - } |
|
88 | - // no default terms set so lets just exit. |
|
89 | - foreach ($this->custom_taxonomy_terms as $custom_taxonomy_terms) { |
|
90 | - foreach ($custom_taxonomy_terms as $custom_taxonomy_term) { |
|
91 | - if ($post->post_status === 'publish' |
|
92 | - && $custom_taxonomy_term instanceof CustomTaxonomyTerm |
|
93 | - && in_array($post->post_type, $custom_taxonomy_term->customPostTypeSlugs(), true) |
|
94 | - ) { |
|
95 | - // note some error proofing going on here to save unnecessary db queries |
|
96 | - $taxonomies = get_object_taxonomies($post->post_type); |
|
97 | - foreach ($taxonomies as $taxonomy) { |
|
98 | - $terms = wp_get_post_terms($post_id, $taxonomy); |
|
99 | - if (empty($terms) && $taxonomy === $custom_taxonomy_term->taxonomySlug()) { |
|
100 | - wp_set_object_terms( |
|
101 | - $post_id, |
|
102 | - array($custom_taxonomy_term->termSlug()), |
|
103 | - $taxonomy |
|
104 | - ); |
|
105 | - } |
|
106 | - } |
|
107 | - } |
|
108 | - } |
|
109 | - } |
|
110 | - } |
|
111 | - |
|
112 | - |
|
113 | - /** |
|
114 | - * @return void |
|
115 | - */ |
|
116 | - public function setMustUseEventTypes() |
|
117 | - { |
|
118 | - $term_details = array( |
|
119 | - // Attendee's register for the first date-time only |
|
120 | - 'single-event' => array( |
|
121 | - 'term' => esc_html__('Single Event', 'event_espresso'), |
|
122 | - 'desc' => esc_html__( |
|
123 | - 'A single event that spans one or more consecutive days.', |
|
124 | - 'event_espresso' |
|
125 | - ), |
|
126 | - ), |
|
127 | - // example: a party or two-day long workshop |
|
128 | - // Attendee's can register for any of the date-times |
|
129 | - 'multi-event' => array( |
|
130 | - 'term' => esc_html__('Multi Event', 'event_espresso'), |
|
131 | - 'desc' => esc_html__( |
|
132 | - 'Multiple, separate, but related events that occur on consecutive days.', |
|
133 | - 'event_espresso' |
|
134 | - ), |
|
135 | - ), |
|
136 | - // example: a three day music festival or week long conference |
|
137 | - // Attendee's register for the first date-time only |
|
138 | - 'event-series' => array( |
|
139 | - 'term' => esc_html__('Event Series', 'event_espresso'), |
|
140 | - 'desc' => esc_html__( |
|
141 | - ' Multiple events that occur over multiple non-consecutive days.', |
|
142 | - 'event_espresso' |
|
143 | - ), |
|
144 | - ), |
|
145 | - // example: an 8 week introduction to basket weaving course |
|
146 | - // Attendee's can register for any of the date-times. |
|
147 | - 'recurring-event' => array( |
|
148 | - 'term' => esc_html__('Recurring Event', 'event_espresso'), |
|
149 | - 'desc' => esc_html__( |
|
150 | - 'Multiple events that occur over multiple non-consecutive days.', |
|
151 | - 'event_espresso' |
|
152 | - ), |
|
153 | - ), |
|
154 | - // example: a yoga class |
|
155 | - 'ongoing' => array( |
|
156 | - 'term' => esc_html__('Ongoing Event', 'event_espresso'), |
|
157 | - 'desc' => esc_html__( |
|
158 | - 'An "event" that people can purchase tickets to gain access for anytime for this event regardless of date times on the event', |
|
159 | - 'event_espresso' |
|
160 | - ), |
|
161 | - ) |
|
162 | - // example: access to a museum |
|
163 | - // 'walk-in' => array( esc_html__('Walk In', 'event_espresso'), esc_html__('Single datetime and single entry recurring events. Attendees register for one or multiple datetimes individually.', 'event_espresso') ), |
|
164 | - // 'reservation' => array( esc_html__('Reservation', 'event_espresso'), esc_html__('Reservations are created by specifying available datetimes and quantities. Attendees choose from the available datetimes and specify the quantity available (if the maximum is greater than 1)') ), //@TODO to avoid confusion we'll implement this in a later iteration > EE4.1 |
|
165 | - // 'multiple-session' => array( esc_html__('Multiple Session', 'event_espresso'), esc_html__('Multiple event, multiple datetime, hierarchically organized, custom entry events. Attendees may be required to register for a parent event before being allowed to register for child events. Attendees can register for any combination of child events as long as the datetimes do not conflict. Parent and child events may have additional fees or registration questions.') ), //@TODO to avoid confusion we'll implement this in a later iteration > EE4.1 |
|
166 | - // 'appointment' => array( esc_html__('Appointments', 'event_espresso'), esc_html__('Time slotted events where datetimes are generally in hours or minutes. For example, attendees can register for a single 15 minute or 1 hour time slot and this type of availability frequently reoccurs.', 'event_espresso') ) |
|
167 | - ); |
|
168 | - $this->setMustUseTerms('espresso_event_type', $term_details); |
|
169 | - } |
|
170 | - |
|
171 | - |
|
172 | - /** |
|
173 | - * wrapper method for handling the setting up of initial terms in the db (if they don't already exist). |
|
174 | - * Note this should ONLY be used for terms that always must be present. Be aware that if an initial term is |
|
175 | - * deleted then it WILL be recreated. |
|
176 | - * |
|
177 | - * @param string $taxonomy The name of the taxonomy |
|
178 | - * @param array $term_details An array of term details indexed by slug and containing Name of term, and |
|
179 | - * description as the elements in the array |
|
180 | - * @return void |
|
181 | - */ |
|
182 | - public function setMustUseTerms($taxonomy, $term_details) |
|
183 | - { |
|
184 | - $term_details = (array) $term_details; |
|
185 | - foreach ($term_details as $slug => $details) { |
|
186 | - if (isset($details['term'], $details['desc']) && ! term_exists($slug, $taxonomy)) { |
|
187 | - $insert_arr = array( |
|
188 | - 'slug' => $slug, |
|
189 | - 'description' => $details['desc'], |
|
190 | - ); |
|
191 | - wp_insert_term($details['term'], $taxonomy, $insert_arr); |
|
192 | - } |
|
193 | - } |
|
194 | - } |
|
19 | + /** |
|
20 | + * @var array[] $custom_taxonomy_terms |
|
21 | + */ |
|
22 | + public $custom_taxonomy_terms = array(); |
|
23 | + |
|
24 | + |
|
25 | + /** |
|
26 | + * RegisterCustomTaxonomyTerms constructor. |
|
27 | + */ |
|
28 | + public function __construct() |
|
29 | + { |
|
30 | + // hook into save_post so that we can make sure that the default terms get saved on publish of registered cpts |
|
31 | + // IF they don't have a term for that taxonomy set. |
|
32 | + add_action('save_post', array($this, 'saveDefaultTerm'), 100, 2); |
|
33 | + do_action( |
|
34 | + 'AHEE__EventEspresso_core_domain_services_custom_post_types_RegisterCustomTaxonomyTerms__construct_end', |
|
35 | + $this |
|
36 | + ); |
|
37 | + } |
|
38 | + |
|
39 | + |
|
40 | + public function registerCustomTaxonomyTerms() |
|
41 | + { |
|
42 | + // setup default terms in any of our taxonomies (but only if we're in admin). |
|
43 | + // Why not added via register_activation_hook? |
|
44 | + // Because it's possible that in future iterations of EE we may add new defaults for specialized taxonomies |
|
45 | + // (think event_types) and register_activation_hook only reliably runs when a user manually activates the plugin. |
|
46 | + // Keep in mind that this will READ these terms if they are deleted by the user. Hence MUST use terms. |
|
47 | + // if ( is_admin() ) { |
|
48 | + // $this->set_must_use_event_types(); |
|
49 | + // } |
|
50 | + // set default terms |
|
51 | + $this->registerCustomTaxonomyTerm( |
|
52 | + 'espresso_event_type', |
|
53 | + 'single-event', |
|
54 | + array('espresso_events') |
|
55 | + ); |
|
56 | + } |
|
57 | + |
|
58 | + |
|
59 | + /** |
|
60 | + * Allows us to set what the default will be for terms when a cpt is PUBLISHED. |
|
61 | + * |
|
62 | + * @param string $taxonomy The taxonomy we're using for the default term |
|
63 | + * @param string $term_slug The slug of the term that will be the default. |
|
64 | + * @param array $cpt_slugs An array of custom post types we want the default assigned to |
|
65 | + */ |
|
66 | + public function registerCustomTaxonomyTerm($taxonomy, $term_slug, array $cpt_slugs = array()) |
|
67 | + { |
|
68 | + $this->custom_taxonomy_terms[][ $term_slug ] = new CustomTaxonomyTerm( |
|
69 | + $taxonomy, |
|
70 | + $term_slug, |
|
71 | + $cpt_slugs |
|
72 | + ); |
|
73 | + } |
|
74 | + |
|
75 | + |
|
76 | + /** |
|
77 | + * hooked into the wp 'save_post' action hook for setting our default terms found in the $_default_terms property |
|
78 | + * |
|
79 | + * @param int $post_id ID of CPT being saved |
|
80 | + * @param WP_Post $post Post object |
|
81 | + * @return void |
|
82 | + */ |
|
83 | + public function saveDefaultTerm($post_id, WP_Post $post) |
|
84 | + { |
|
85 | + if (empty($this->custom_taxonomy_terms)) { |
|
86 | + return; |
|
87 | + } |
|
88 | + // no default terms set so lets just exit. |
|
89 | + foreach ($this->custom_taxonomy_terms as $custom_taxonomy_terms) { |
|
90 | + foreach ($custom_taxonomy_terms as $custom_taxonomy_term) { |
|
91 | + if ($post->post_status === 'publish' |
|
92 | + && $custom_taxonomy_term instanceof CustomTaxonomyTerm |
|
93 | + && in_array($post->post_type, $custom_taxonomy_term->customPostTypeSlugs(), true) |
|
94 | + ) { |
|
95 | + // note some error proofing going on here to save unnecessary db queries |
|
96 | + $taxonomies = get_object_taxonomies($post->post_type); |
|
97 | + foreach ($taxonomies as $taxonomy) { |
|
98 | + $terms = wp_get_post_terms($post_id, $taxonomy); |
|
99 | + if (empty($terms) && $taxonomy === $custom_taxonomy_term->taxonomySlug()) { |
|
100 | + wp_set_object_terms( |
|
101 | + $post_id, |
|
102 | + array($custom_taxonomy_term->termSlug()), |
|
103 | + $taxonomy |
|
104 | + ); |
|
105 | + } |
|
106 | + } |
|
107 | + } |
|
108 | + } |
|
109 | + } |
|
110 | + } |
|
111 | + |
|
112 | + |
|
113 | + /** |
|
114 | + * @return void |
|
115 | + */ |
|
116 | + public function setMustUseEventTypes() |
|
117 | + { |
|
118 | + $term_details = array( |
|
119 | + // Attendee's register for the first date-time only |
|
120 | + 'single-event' => array( |
|
121 | + 'term' => esc_html__('Single Event', 'event_espresso'), |
|
122 | + 'desc' => esc_html__( |
|
123 | + 'A single event that spans one or more consecutive days.', |
|
124 | + 'event_espresso' |
|
125 | + ), |
|
126 | + ), |
|
127 | + // example: a party or two-day long workshop |
|
128 | + // Attendee's can register for any of the date-times |
|
129 | + 'multi-event' => array( |
|
130 | + 'term' => esc_html__('Multi Event', 'event_espresso'), |
|
131 | + 'desc' => esc_html__( |
|
132 | + 'Multiple, separate, but related events that occur on consecutive days.', |
|
133 | + 'event_espresso' |
|
134 | + ), |
|
135 | + ), |
|
136 | + // example: a three day music festival or week long conference |
|
137 | + // Attendee's register for the first date-time only |
|
138 | + 'event-series' => array( |
|
139 | + 'term' => esc_html__('Event Series', 'event_espresso'), |
|
140 | + 'desc' => esc_html__( |
|
141 | + ' Multiple events that occur over multiple non-consecutive days.', |
|
142 | + 'event_espresso' |
|
143 | + ), |
|
144 | + ), |
|
145 | + // example: an 8 week introduction to basket weaving course |
|
146 | + // Attendee's can register for any of the date-times. |
|
147 | + 'recurring-event' => array( |
|
148 | + 'term' => esc_html__('Recurring Event', 'event_espresso'), |
|
149 | + 'desc' => esc_html__( |
|
150 | + 'Multiple events that occur over multiple non-consecutive days.', |
|
151 | + 'event_espresso' |
|
152 | + ), |
|
153 | + ), |
|
154 | + // example: a yoga class |
|
155 | + 'ongoing' => array( |
|
156 | + 'term' => esc_html__('Ongoing Event', 'event_espresso'), |
|
157 | + 'desc' => esc_html__( |
|
158 | + 'An "event" that people can purchase tickets to gain access for anytime for this event regardless of date times on the event', |
|
159 | + 'event_espresso' |
|
160 | + ), |
|
161 | + ) |
|
162 | + // example: access to a museum |
|
163 | + // 'walk-in' => array( esc_html__('Walk In', 'event_espresso'), esc_html__('Single datetime and single entry recurring events. Attendees register for one or multiple datetimes individually.', 'event_espresso') ), |
|
164 | + // 'reservation' => array( esc_html__('Reservation', 'event_espresso'), esc_html__('Reservations are created by specifying available datetimes and quantities. Attendees choose from the available datetimes and specify the quantity available (if the maximum is greater than 1)') ), //@TODO to avoid confusion we'll implement this in a later iteration > EE4.1 |
|
165 | + // 'multiple-session' => array( esc_html__('Multiple Session', 'event_espresso'), esc_html__('Multiple event, multiple datetime, hierarchically organized, custom entry events. Attendees may be required to register for a parent event before being allowed to register for child events. Attendees can register for any combination of child events as long as the datetimes do not conflict. Parent and child events may have additional fees or registration questions.') ), //@TODO to avoid confusion we'll implement this in a later iteration > EE4.1 |
|
166 | + // 'appointment' => array( esc_html__('Appointments', 'event_espresso'), esc_html__('Time slotted events where datetimes are generally in hours or minutes. For example, attendees can register for a single 15 minute or 1 hour time slot and this type of availability frequently reoccurs.', 'event_espresso') ) |
|
167 | + ); |
|
168 | + $this->setMustUseTerms('espresso_event_type', $term_details); |
|
169 | + } |
|
170 | + |
|
171 | + |
|
172 | + /** |
|
173 | + * wrapper method for handling the setting up of initial terms in the db (if they don't already exist). |
|
174 | + * Note this should ONLY be used for terms that always must be present. Be aware that if an initial term is |
|
175 | + * deleted then it WILL be recreated. |
|
176 | + * |
|
177 | + * @param string $taxonomy The name of the taxonomy |
|
178 | + * @param array $term_details An array of term details indexed by slug and containing Name of term, and |
|
179 | + * description as the elements in the array |
|
180 | + * @return void |
|
181 | + */ |
|
182 | + public function setMustUseTerms($taxonomy, $term_details) |
|
183 | + { |
|
184 | + $term_details = (array) $term_details; |
|
185 | + foreach ($term_details as $slug => $details) { |
|
186 | + if (isset($details['term'], $details['desc']) && ! term_exists($slug, $taxonomy)) { |
|
187 | + $insert_arr = array( |
|
188 | + 'slug' => $slug, |
|
189 | + 'description' => $details['desc'], |
|
190 | + ); |
|
191 | + wp_insert_term($details['term'], $taxonomy, $insert_arr); |
|
192 | + } |
|
193 | + } |
|
194 | + } |
|
195 | 195 | } |
@@ -47,7 +47,7 @@ |
||
47 | 47 | */ |
48 | 48 | public function __construct($generator) |
49 | 49 | { |
50 | - if (! ($generator instanceof EE_Registry || $generator instanceof CoffeeShop)) { |
|
50 | + if ( ! ($generator instanceof EE_Registry || $generator instanceof CoffeeShop)) { |
|
51 | 51 | throw new InvalidArgumentException( |
52 | 52 | esc_html__( |
53 | 53 | 'The CoreLoader class must receive an instance of EE_Registry or the CoffeeShop DI container.', |
@@ -29,108 +29,108 @@ |
||
29 | 29 | class CoreLoader implements LoaderDecoratorInterface |
30 | 30 | { |
31 | 31 | |
32 | - /** |
|
33 | - * @var EE_Registry|CoffeeShop $generator |
|
34 | - */ |
|
35 | - private $generator; |
|
32 | + /** |
|
33 | + * @var EE_Registry|CoffeeShop $generator |
|
34 | + */ |
|
35 | + private $generator; |
|
36 | 36 | |
37 | 37 | |
38 | - /** |
|
39 | - * CoreLoader constructor. |
|
40 | - * |
|
41 | - * @param EE_Registry|CoffeeShop $generator |
|
42 | - * @throws InvalidArgumentException |
|
43 | - */ |
|
44 | - public function __construct($generator) |
|
45 | - { |
|
46 | - if (! ($generator instanceof EE_Registry || $generator instanceof CoffeeShop)) { |
|
47 | - throw new InvalidArgumentException( |
|
48 | - esc_html__( |
|
49 | - 'The CoreLoader class must receive an instance of EE_Registry or the CoffeeShop DI container.', |
|
50 | - 'event_espresso' |
|
51 | - ) |
|
52 | - ); |
|
53 | - } |
|
54 | - $this->generator = $generator; |
|
55 | - } |
|
38 | + /** |
|
39 | + * CoreLoader constructor. |
|
40 | + * |
|
41 | + * @param EE_Registry|CoffeeShop $generator |
|
42 | + * @throws InvalidArgumentException |
|
43 | + */ |
|
44 | + public function __construct($generator) |
|
45 | + { |
|
46 | + if (! ($generator instanceof EE_Registry || $generator instanceof CoffeeShop)) { |
|
47 | + throw new InvalidArgumentException( |
|
48 | + esc_html__( |
|
49 | + 'The CoreLoader class must receive an instance of EE_Registry or the CoffeeShop DI container.', |
|
50 | + 'event_espresso' |
|
51 | + ) |
|
52 | + ); |
|
53 | + } |
|
54 | + $this->generator = $generator; |
|
55 | + } |
|
56 | 56 | |
57 | 57 | |
58 | - /** |
|
59 | - * Calls the appropriate loading method from the installed generator; |
|
60 | - * If EE_Registry is being used, then the additional parameters for the EE_Registry::create() method |
|
61 | - * can be added to the $arguments array and they will be extracted and passed to EE_Registry::create(), |
|
62 | - * but NOT to the class being instantiated. |
|
63 | - * This is done by adding the parameters to the $arguments array as follows: |
|
64 | - * array( |
|
65 | - * 'EE_Registry::create(from_db)' => true, // boolean value, default = false |
|
66 | - * 'EE_Registry::create(load_only)' => true, // boolean value, default = false |
|
67 | - * 'EE_Registry::create(addon)' => true, // boolean value, default = false |
|
68 | - * ) |
|
69 | - * |
|
70 | - * @param string $fqcn |
|
71 | - * @param array $arguments |
|
72 | - * @param bool $shared |
|
73 | - * @return mixed |
|
74 | - * @throws OutOfBoundsException |
|
75 | - * @throws ServiceExistsException |
|
76 | - * @throws InstantiationException |
|
77 | - * @throws InvalidIdentifierException |
|
78 | - * @throws InvalidDataTypeException |
|
79 | - * @throws InvalidClassException |
|
80 | - * @throws EE_Error |
|
81 | - * @throws ServiceNotFoundException |
|
82 | - * @throws ReflectionException |
|
83 | - * @throws InvalidInterfaceException |
|
84 | - * @throws InvalidArgumentException |
|
85 | - */ |
|
86 | - public function load($fqcn, $arguments = array(), $shared = true) |
|
87 | - { |
|
88 | - $shared = filter_var($shared, FILTER_VALIDATE_BOOLEAN); |
|
89 | - if ($this->generator instanceof EE_Registry) { |
|
90 | - // check if additional EE_Registry::create() arguments have been passed |
|
91 | - // from_db |
|
92 | - $from_db = isset($arguments['EE_Registry::create(from_db)']) |
|
93 | - ? filter_var($arguments['EE_Registry::create(from_db)'], FILTER_VALIDATE_BOOLEAN) |
|
94 | - : false; |
|
95 | - // load_only |
|
96 | - $load_only = isset($arguments['EE_Registry::create(load_only)']) |
|
97 | - ? filter_var($arguments['EE_Registry::create(load_only)'], FILTER_VALIDATE_BOOLEAN) |
|
98 | - : false; |
|
99 | - // addon |
|
100 | - $addon = isset($arguments['EE_Registry::create(addon)']) |
|
101 | - ? filter_var($arguments['EE_Registry::create(addon)'], FILTER_VALIDATE_BOOLEAN) |
|
102 | - : false; |
|
103 | - unset( |
|
104 | - $arguments['EE_Registry::create(from_db)'], |
|
105 | - $arguments['EE_Registry::create(load_only)'], |
|
106 | - $arguments['EE_Registry::create(addon)'] |
|
107 | - ); |
|
108 | - // addons need to be cached on EE_Registry |
|
109 | - $shared = $addon ? true : $shared; |
|
110 | - return $this->generator->create( |
|
111 | - $fqcn, |
|
112 | - $arguments, |
|
113 | - $shared, |
|
114 | - $from_db, |
|
115 | - $load_only, |
|
116 | - $addon |
|
117 | - ); |
|
118 | - } |
|
119 | - return $this->generator->brew( |
|
120 | - $fqcn, |
|
121 | - $arguments, |
|
122 | - $shared ? CoffeeMaker::BREW_SHARED : CoffeeMaker::BREW_NEW |
|
123 | - ); |
|
124 | - } |
|
58 | + /** |
|
59 | + * Calls the appropriate loading method from the installed generator; |
|
60 | + * If EE_Registry is being used, then the additional parameters for the EE_Registry::create() method |
|
61 | + * can be added to the $arguments array and they will be extracted and passed to EE_Registry::create(), |
|
62 | + * but NOT to the class being instantiated. |
|
63 | + * This is done by adding the parameters to the $arguments array as follows: |
|
64 | + * array( |
|
65 | + * 'EE_Registry::create(from_db)' => true, // boolean value, default = false |
|
66 | + * 'EE_Registry::create(load_only)' => true, // boolean value, default = false |
|
67 | + * 'EE_Registry::create(addon)' => true, // boolean value, default = false |
|
68 | + * ) |
|
69 | + * |
|
70 | + * @param string $fqcn |
|
71 | + * @param array $arguments |
|
72 | + * @param bool $shared |
|
73 | + * @return mixed |
|
74 | + * @throws OutOfBoundsException |
|
75 | + * @throws ServiceExistsException |
|
76 | + * @throws InstantiationException |
|
77 | + * @throws InvalidIdentifierException |
|
78 | + * @throws InvalidDataTypeException |
|
79 | + * @throws InvalidClassException |
|
80 | + * @throws EE_Error |
|
81 | + * @throws ServiceNotFoundException |
|
82 | + * @throws ReflectionException |
|
83 | + * @throws InvalidInterfaceException |
|
84 | + * @throws InvalidArgumentException |
|
85 | + */ |
|
86 | + public function load($fqcn, $arguments = array(), $shared = true) |
|
87 | + { |
|
88 | + $shared = filter_var($shared, FILTER_VALIDATE_BOOLEAN); |
|
89 | + if ($this->generator instanceof EE_Registry) { |
|
90 | + // check if additional EE_Registry::create() arguments have been passed |
|
91 | + // from_db |
|
92 | + $from_db = isset($arguments['EE_Registry::create(from_db)']) |
|
93 | + ? filter_var($arguments['EE_Registry::create(from_db)'], FILTER_VALIDATE_BOOLEAN) |
|
94 | + : false; |
|
95 | + // load_only |
|
96 | + $load_only = isset($arguments['EE_Registry::create(load_only)']) |
|
97 | + ? filter_var($arguments['EE_Registry::create(load_only)'], FILTER_VALIDATE_BOOLEAN) |
|
98 | + : false; |
|
99 | + // addon |
|
100 | + $addon = isset($arguments['EE_Registry::create(addon)']) |
|
101 | + ? filter_var($arguments['EE_Registry::create(addon)'], FILTER_VALIDATE_BOOLEAN) |
|
102 | + : false; |
|
103 | + unset( |
|
104 | + $arguments['EE_Registry::create(from_db)'], |
|
105 | + $arguments['EE_Registry::create(load_only)'], |
|
106 | + $arguments['EE_Registry::create(addon)'] |
|
107 | + ); |
|
108 | + // addons need to be cached on EE_Registry |
|
109 | + $shared = $addon ? true : $shared; |
|
110 | + return $this->generator->create( |
|
111 | + $fqcn, |
|
112 | + $arguments, |
|
113 | + $shared, |
|
114 | + $from_db, |
|
115 | + $load_only, |
|
116 | + $addon |
|
117 | + ); |
|
118 | + } |
|
119 | + return $this->generator->brew( |
|
120 | + $fqcn, |
|
121 | + $arguments, |
|
122 | + $shared ? CoffeeMaker::BREW_SHARED : CoffeeMaker::BREW_NEW |
|
123 | + ); |
|
124 | + } |
|
125 | 125 | |
126 | 126 | |
127 | - /** |
|
128 | - * calls reset() on generator if method exists |
|
129 | - */ |
|
130 | - public function reset() |
|
131 | - { |
|
132 | - if ($this->generator instanceof ResettableInterface) { |
|
133 | - $this->generator->reset(); |
|
134 | - } |
|
135 | - } |
|
127 | + /** |
|
128 | + * calls reset() on generator if method exists |
|
129 | + */ |
|
130 | + public function reset() |
|
131 | + { |
|
132 | + if ($this->generator instanceof ResettableInterface) { |
|
133 | + $this->generator->reset(); |
|
134 | + } |
|
135 | + } |
|
136 | 136 | } |
@@ -53,7 +53,7 @@ discard block |
||
53 | 53 | $identifier = '' |
54 | 54 | ) { |
55 | 55 | parent::__construct($loader); |
56 | - $this->cache = $cache; |
|
56 | + $this->cache = $cache; |
|
57 | 57 | $this->object_identifier = $object_identifier; |
58 | 58 | $this->setIdentifier($identifier); |
59 | 59 | if ($this->identifier !== '') { |
@@ -89,7 +89,7 @@ discard block |
||
89 | 89 | */ |
90 | 90 | private function setIdentifier($identifier) |
91 | 91 | { |
92 | - if (! is_string($identifier)) { |
|
92 | + if ( ! is_string($identifier)) { |
|
93 | 93 | throw new InvalidDataTypeException('$identifier', $identifier, 'string'); |
94 | 94 | } |
95 | 95 | $this->identifier = $identifier; |
@@ -17,158 +17,158 @@ |
||
17 | 17 | class CachingLoader extends CachingLoaderDecorator |
18 | 18 | { |
19 | 19 | |
20 | - /** |
|
21 | - * @var string $identifier |
|
22 | - */ |
|
23 | - protected $identifier; |
|
24 | - |
|
25 | - /** |
|
26 | - * @var CollectionInterface $cache |
|
27 | - */ |
|
28 | - protected $cache; |
|
29 | - |
|
30 | - /** |
|
31 | - * @var ObjectIdentifier |
|
32 | - */ |
|
33 | - private $object_identifier; |
|
34 | - |
|
35 | - |
|
36 | - /** |
|
37 | - * CachingLoader constructor. |
|
38 | - * |
|
39 | - * @param LoaderDecoratorInterface $loader |
|
40 | - * @param CollectionInterface $cache |
|
41 | - * @param ObjectIdentifier $object_identifier |
|
42 | - * @param string $identifier |
|
43 | - * @throws InvalidDataTypeException |
|
44 | - */ |
|
45 | - public function __construct( |
|
46 | - LoaderDecoratorInterface $loader, |
|
47 | - CollectionInterface $cache, |
|
48 | - ObjectIdentifier $object_identifier, |
|
49 | - $identifier = '' |
|
50 | - ) { |
|
51 | - parent::__construct($loader); |
|
52 | - $this->cache = $cache; |
|
53 | - $this->object_identifier = $object_identifier; |
|
54 | - $this->setIdentifier($identifier); |
|
55 | - if ($this->identifier !== '') { |
|
56 | - // to only clear this cache, and assuming an identifier has been set, simply do the following: |
|
57 | - // do_action('AHEE__EventEspresso_core_services_loaders_CachingLoader__resetCache__IDENTIFIER'); |
|
58 | - // where "IDENTIFIER" = the string that was set during construction |
|
59 | - add_action( |
|
60 | - "AHEE__EventEspresso_core_services_loaders_CachingLoader__resetCache__{$identifier}", |
|
61 | - array($this, 'reset') |
|
62 | - ); |
|
63 | - } |
|
64 | - // to clear ALL caches, simply do the following: |
|
65 | - // do_action('AHEE__EventEspresso_core_services_loaders_CachingLoader__resetCache'); |
|
66 | - add_action( |
|
67 | - 'AHEE__EventEspresso_core_services_loaders_CachingLoader__resetCache', |
|
68 | - array($this, 'reset') |
|
69 | - ); |
|
70 | - } |
|
71 | - |
|
72 | - |
|
73 | - /** |
|
74 | - * @return string |
|
75 | - */ |
|
76 | - public function identifier() |
|
77 | - { |
|
78 | - return $this->identifier; |
|
79 | - } |
|
80 | - |
|
81 | - |
|
82 | - /** |
|
83 | - * @param string $identifier |
|
84 | - * @throws InvalidDataTypeException |
|
85 | - */ |
|
86 | - private function setIdentifier($identifier) |
|
87 | - { |
|
88 | - if (! is_string($identifier)) { |
|
89 | - throw new InvalidDataTypeException('$identifier', $identifier, 'string'); |
|
90 | - } |
|
91 | - $this->identifier = $identifier; |
|
92 | - } |
|
93 | - |
|
94 | - |
|
95 | - /** |
|
96 | - * @param FullyQualifiedName|string $fqcn |
|
97 | - * @param mixed $object |
|
98 | - * @param array $arguments |
|
99 | - * @return bool |
|
100 | - * @throws InvalidArgumentException |
|
101 | - */ |
|
102 | - public function share($fqcn, $object, array $arguments = array()) |
|
103 | - { |
|
104 | - if ($object instanceof $fqcn) { |
|
105 | - return $this->cache->add( |
|
106 | - $object, |
|
107 | - $this->object_identifier->getIdentifier($fqcn, $arguments) |
|
108 | - ); |
|
109 | - } |
|
110 | - throw new InvalidArgumentException( |
|
111 | - sprintf( |
|
112 | - esc_html__( |
|
113 | - 'The supplied class name "%1$s" must match the class of the supplied object.', |
|
114 | - 'event_espresso' |
|
115 | - ), |
|
116 | - $fqcn |
|
117 | - ) |
|
118 | - ); |
|
119 | - } |
|
120 | - |
|
121 | - |
|
122 | - /** |
|
123 | - * @param FullyQualifiedName|string $fqcn |
|
124 | - * @param array $arguments |
|
125 | - * @param bool $shared |
|
126 | - * @param array $interfaces |
|
127 | - * @return mixed |
|
128 | - */ |
|
129 | - public function load($fqcn, $arguments = array(), $shared = true, array $interfaces = array()) |
|
130 | - { |
|
131 | - $fqcn = ltrim($fqcn, '\\'); |
|
132 | - // caching can be turned off via the following code: |
|
133 | - // add_filter('FHEE__EventEspresso_core_services_loaders_CachingLoader__load__bypass_cache', '__return_true'); |
|
134 | - if (apply_filters( |
|
135 | - 'FHEE__EventEspresso_core_services_loaders_CachingLoader__load__bypass_cache', |
|
136 | - false, |
|
137 | - $this |
|
138 | - )) { |
|
139 | - // even though $shared might be true, caching could be bypassed for whatever reason, |
|
140 | - // so we don't want the core loader to cache anything, therefore caching is turned off |
|
141 | - return $this->loader->load($fqcn, $arguments, false); |
|
142 | - } |
|
143 | - $object_identifier = $this->object_identifier->getIdentifier($fqcn, $arguments); |
|
144 | - if ($this->cache->has($object_identifier)) { |
|
145 | - return $this->cache->get($object_identifier); |
|
146 | - } |
|
147 | - $object = $this->loader->load($fqcn, $arguments, $shared); |
|
148 | - if ($object instanceof $fqcn) { |
|
149 | - $this->cache->add($object, $object_identifier); |
|
150 | - } |
|
151 | - return $object; |
|
152 | - } |
|
153 | - |
|
154 | - |
|
155 | - /** |
|
156 | - * empties cache and calls reset() on loader if method exists |
|
157 | - */ |
|
158 | - public function reset() |
|
159 | - { |
|
160 | - $this->clearCache(); |
|
161 | - $this->loader->reset(); |
|
162 | - } |
|
163 | - |
|
164 | - |
|
165 | - /** |
|
166 | - * unsets and detaches ALL objects from the cache |
|
167 | - * |
|
168 | - * @since 4.9.62.p |
|
169 | - */ |
|
170 | - public function clearCache() |
|
171 | - { |
|
172 | - $this->cache->trashAndDetachAll(); |
|
173 | - } |
|
20 | + /** |
|
21 | + * @var string $identifier |
|
22 | + */ |
|
23 | + protected $identifier; |
|
24 | + |
|
25 | + /** |
|
26 | + * @var CollectionInterface $cache |
|
27 | + */ |
|
28 | + protected $cache; |
|
29 | + |
|
30 | + /** |
|
31 | + * @var ObjectIdentifier |
|
32 | + */ |
|
33 | + private $object_identifier; |
|
34 | + |
|
35 | + |
|
36 | + /** |
|
37 | + * CachingLoader constructor. |
|
38 | + * |
|
39 | + * @param LoaderDecoratorInterface $loader |
|
40 | + * @param CollectionInterface $cache |
|
41 | + * @param ObjectIdentifier $object_identifier |
|
42 | + * @param string $identifier |
|
43 | + * @throws InvalidDataTypeException |
|
44 | + */ |
|
45 | + public function __construct( |
|
46 | + LoaderDecoratorInterface $loader, |
|
47 | + CollectionInterface $cache, |
|
48 | + ObjectIdentifier $object_identifier, |
|
49 | + $identifier = '' |
|
50 | + ) { |
|
51 | + parent::__construct($loader); |
|
52 | + $this->cache = $cache; |
|
53 | + $this->object_identifier = $object_identifier; |
|
54 | + $this->setIdentifier($identifier); |
|
55 | + if ($this->identifier !== '') { |
|
56 | + // to only clear this cache, and assuming an identifier has been set, simply do the following: |
|
57 | + // do_action('AHEE__EventEspresso_core_services_loaders_CachingLoader__resetCache__IDENTIFIER'); |
|
58 | + // where "IDENTIFIER" = the string that was set during construction |
|
59 | + add_action( |
|
60 | + "AHEE__EventEspresso_core_services_loaders_CachingLoader__resetCache__{$identifier}", |
|
61 | + array($this, 'reset') |
|
62 | + ); |
|
63 | + } |
|
64 | + // to clear ALL caches, simply do the following: |
|
65 | + // do_action('AHEE__EventEspresso_core_services_loaders_CachingLoader__resetCache'); |
|
66 | + add_action( |
|
67 | + 'AHEE__EventEspresso_core_services_loaders_CachingLoader__resetCache', |
|
68 | + array($this, 'reset') |
|
69 | + ); |
|
70 | + } |
|
71 | + |
|
72 | + |
|
73 | + /** |
|
74 | + * @return string |
|
75 | + */ |
|
76 | + public function identifier() |
|
77 | + { |
|
78 | + return $this->identifier; |
|
79 | + } |
|
80 | + |
|
81 | + |
|
82 | + /** |
|
83 | + * @param string $identifier |
|
84 | + * @throws InvalidDataTypeException |
|
85 | + */ |
|
86 | + private function setIdentifier($identifier) |
|
87 | + { |
|
88 | + if (! is_string($identifier)) { |
|
89 | + throw new InvalidDataTypeException('$identifier', $identifier, 'string'); |
|
90 | + } |
|
91 | + $this->identifier = $identifier; |
|
92 | + } |
|
93 | + |
|
94 | + |
|
95 | + /** |
|
96 | + * @param FullyQualifiedName|string $fqcn |
|
97 | + * @param mixed $object |
|
98 | + * @param array $arguments |
|
99 | + * @return bool |
|
100 | + * @throws InvalidArgumentException |
|
101 | + */ |
|
102 | + public function share($fqcn, $object, array $arguments = array()) |
|
103 | + { |
|
104 | + if ($object instanceof $fqcn) { |
|
105 | + return $this->cache->add( |
|
106 | + $object, |
|
107 | + $this->object_identifier->getIdentifier($fqcn, $arguments) |
|
108 | + ); |
|
109 | + } |
|
110 | + throw new InvalidArgumentException( |
|
111 | + sprintf( |
|
112 | + esc_html__( |
|
113 | + 'The supplied class name "%1$s" must match the class of the supplied object.', |
|
114 | + 'event_espresso' |
|
115 | + ), |
|
116 | + $fqcn |
|
117 | + ) |
|
118 | + ); |
|
119 | + } |
|
120 | + |
|
121 | + |
|
122 | + /** |
|
123 | + * @param FullyQualifiedName|string $fqcn |
|
124 | + * @param array $arguments |
|
125 | + * @param bool $shared |
|
126 | + * @param array $interfaces |
|
127 | + * @return mixed |
|
128 | + */ |
|
129 | + public function load($fqcn, $arguments = array(), $shared = true, array $interfaces = array()) |
|
130 | + { |
|
131 | + $fqcn = ltrim($fqcn, '\\'); |
|
132 | + // caching can be turned off via the following code: |
|
133 | + // add_filter('FHEE__EventEspresso_core_services_loaders_CachingLoader__load__bypass_cache', '__return_true'); |
|
134 | + if (apply_filters( |
|
135 | + 'FHEE__EventEspresso_core_services_loaders_CachingLoader__load__bypass_cache', |
|
136 | + false, |
|
137 | + $this |
|
138 | + )) { |
|
139 | + // even though $shared might be true, caching could be bypassed for whatever reason, |
|
140 | + // so we don't want the core loader to cache anything, therefore caching is turned off |
|
141 | + return $this->loader->load($fqcn, $arguments, false); |
|
142 | + } |
|
143 | + $object_identifier = $this->object_identifier->getIdentifier($fqcn, $arguments); |
|
144 | + if ($this->cache->has($object_identifier)) { |
|
145 | + return $this->cache->get($object_identifier); |
|
146 | + } |
|
147 | + $object = $this->loader->load($fqcn, $arguments, $shared); |
|
148 | + if ($object instanceof $fqcn) { |
|
149 | + $this->cache->add($object, $object_identifier); |
|
150 | + } |
|
151 | + return $object; |
|
152 | + } |
|
153 | + |
|
154 | + |
|
155 | + /** |
|
156 | + * empties cache and calls reset() on loader if method exists |
|
157 | + */ |
|
158 | + public function reset() |
|
159 | + { |
|
160 | + $this->clearCache(); |
|
161 | + $this->loader->reset(); |
|
162 | + } |
|
163 | + |
|
164 | + |
|
165 | + /** |
|
166 | + * unsets and detaches ALL objects from the cache |
|
167 | + * |
|
168 | + * @since 4.9.62.p |
|
169 | + */ |
|
170 | + public function clearCache() |
|
171 | + { |
|
172 | + $this->cache->trashAndDetachAll(); |
|
173 | + } |
|
174 | 174 | } |
@@ -19,94 +19,94 @@ |
||
19 | 19 | class ExitModal |
20 | 20 | { |
21 | 21 | |
22 | - /** |
|
23 | - * @var Registry |
|
24 | - */ |
|
25 | - private $assets_registry; |
|
22 | + /** |
|
23 | + * @var Registry |
|
24 | + */ |
|
25 | + private $assets_registry; |
|
26 | 26 | |
27 | - /** |
|
28 | - * ExitModal constructor. |
|
29 | - * |
|
30 | - * @param Registry $assets_registry |
|
31 | - */ |
|
32 | - public function __construct(Registry $assets_registry) |
|
33 | - { |
|
34 | - $this->assets_registry = $assets_registry; |
|
35 | - add_action('in_admin_footer', array($this, 'modalContainer')); |
|
36 | - add_action('admin_enqueue_scripts', array($this, 'enqueues')); |
|
37 | - } |
|
27 | + /** |
|
28 | + * ExitModal constructor. |
|
29 | + * |
|
30 | + * @param Registry $assets_registry |
|
31 | + */ |
|
32 | + public function __construct(Registry $assets_registry) |
|
33 | + { |
|
34 | + $this->assets_registry = $assets_registry; |
|
35 | + add_action('in_admin_footer', array($this, 'modalContainer')); |
|
36 | + add_action('admin_enqueue_scripts', array($this, 'enqueues')); |
|
37 | + } |
|
38 | 38 | |
39 | 39 | |
40 | - /** |
|
41 | - * Callback on in_admin_footer that is used to output the exit modal container. |
|
42 | - */ |
|
43 | - public function modalContainer() |
|
44 | - { |
|
45 | - echo '<div id="ee-exit-survey-modal"></div>'; |
|
46 | - } |
|
40 | + /** |
|
41 | + * Callback on in_admin_footer that is used to output the exit modal container. |
|
42 | + */ |
|
43 | + public function modalContainer() |
|
44 | + { |
|
45 | + echo '<div id="ee-exit-survey-modal"></div>'; |
|
46 | + } |
|
47 | 47 | |
48 | 48 | |
49 | - /** |
|
50 | - * Callback for `admin_enqueue_scripts` to take care of enqueueing scripts and styles specific to the modal. |
|
51 | - * |
|
52 | - * @throws InvalidArgumentException |
|
53 | - */ |
|
54 | - public function enqueues() |
|
55 | - { |
|
56 | - $current_user = new WP_User(get_current_user_id()); |
|
57 | - $this->assets_registry->addData( |
|
58 | - 'exitModali18n', |
|
59 | - array( |
|
60 | - 'introText' => htmlspecialchars( |
|
61 | - __( |
|
62 | - 'Do you have a moment to share why you are deactivating Event Espresso?', |
|
63 | - 'event_espresso' |
|
64 | - ), |
|
65 | - ENT_NOQUOTES |
|
66 | - ), |
|
67 | - 'doSurveyButtonText' => htmlspecialchars( |
|
68 | - __( |
|
69 | - 'Sure I\'ll help', |
|
70 | - 'event_espresso' |
|
71 | - ), |
|
72 | - ENT_NOQUOTES |
|
73 | - ), |
|
74 | - 'skipButtonText' => htmlspecialchars( |
|
75 | - __( |
|
76 | - 'Skip', |
|
77 | - 'event_espresso' |
|
78 | - ), |
|
79 | - ENT_NOQUOTES |
|
80 | - ) |
|
81 | - ) |
|
82 | - ); |
|
83 | - $this->assets_registry->addData( |
|
84 | - 'exitModalInfo', |
|
85 | - array( |
|
86 | - 'firstname' => htmlspecialchars($current_user->user_firstname), |
|
87 | - 'emailaddress' => htmlspecialchars($current_user->user_email), |
|
88 | - 'website' => htmlspecialchars(site_url()), |
|
89 | - 'isModalActive' => $this->isModalActive() |
|
90 | - ) |
|
91 | - ); |
|
49 | + /** |
|
50 | + * Callback for `admin_enqueue_scripts` to take care of enqueueing scripts and styles specific to the modal. |
|
51 | + * |
|
52 | + * @throws InvalidArgumentException |
|
53 | + */ |
|
54 | + public function enqueues() |
|
55 | + { |
|
56 | + $current_user = new WP_User(get_current_user_id()); |
|
57 | + $this->assets_registry->addData( |
|
58 | + 'exitModali18n', |
|
59 | + array( |
|
60 | + 'introText' => htmlspecialchars( |
|
61 | + __( |
|
62 | + 'Do you have a moment to share why you are deactivating Event Espresso?', |
|
63 | + 'event_espresso' |
|
64 | + ), |
|
65 | + ENT_NOQUOTES |
|
66 | + ), |
|
67 | + 'doSurveyButtonText' => htmlspecialchars( |
|
68 | + __( |
|
69 | + 'Sure I\'ll help', |
|
70 | + 'event_espresso' |
|
71 | + ), |
|
72 | + ENT_NOQUOTES |
|
73 | + ), |
|
74 | + 'skipButtonText' => htmlspecialchars( |
|
75 | + __( |
|
76 | + 'Skip', |
|
77 | + 'event_espresso' |
|
78 | + ), |
|
79 | + ENT_NOQUOTES |
|
80 | + ) |
|
81 | + ) |
|
82 | + ); |
|
83 | + $this->assets_registry->addData( |
|
84 | + 'exitModalInfo', |
|
85 | + array( |
|
86 | + 'firstname' => htmlspecialchars($current_user->user_firstname), |
|
87 | + 'emailaddress' => htmlspecialchars($current_user->user_email), |
|
88 | + 'website' => htmlspecialchars(site_url()), |
|
89 | + 'isModalActive' => $this->isModalActive() |
|
90 | + ) |
|
91 | + ); |
|
92 | 92 | |
93 | - wp_enqueue_script('ee-wp-plugins-page'); |
|
94 | - wp_enqueue_style('ee-wp-plugins-page'); |
|
95 | - } |
|
93 | + wp_enqueue_script('ee-wp-plugins-page'); |
|
94 | + wp_enqueue_style('ee-wp-plugins-page'); |
|
95 | + } |
|
96 | 96 | |
97 | 97 | |
98 | - /** |
|
99 | - * Exposes a filter switch for turning off the enqueueing of the modal script. |
|
100 | - * @return bool |
|
101 | - */ |
|
102 | - private function isModalActive() |
|
103 | - { |
|
104 | - return filter_var( |
|
105 | - apply_filters( |
|
106 | - 'FHEE__EventEspresso_core_domain_services_admin_ExitModal__isModalActive', |
|
107 | - true |
|
108 | - ), |
|
109 | - FILTER_VALIDATE_BOOLEAN |
|
110 | - ); |
|
111 | - } |
|
98 | + /** |
|
99 | + * Exposes a filter switch for turning off the enqueueing of the modal script. |
|
100 | + * @return bool |
|
101 | + */ |
|
102 | + private function isModalActive() |
|
103 | + { |
|
104 | + return filter_var( |
|
105 | + apply_filters( |
|
106 | + 'FHEE__EventEspresso_core_domain_services_admin_ExitModal__isModalActive', |
|
107 | + true |
|
108 | + ), |
|
109 | + FILTER_VALIDATE_BOOLEAN |
|
110 | + ); |
|
111 | + } |
|
112 | 112 | } |
@@ -73,7 +73,7 @@ discard block |
||
73 | 73 | public function fqcnMatchesObjectIdentifier($fqcn, $object_identifier) |
74 | 74 | { |
75 | 75 | return $fqcn === $object_identifier |
76 | - || strpos($object_identifier, $fqcn . ObjectIdentifier::DELIMITER) === 0; |
|
76 | + || strpos($object_identifier, $fqcn.ObjectIdentifier::DELIMITER) === 0; |
|
77 | 77 | } |
78 | 78 | |
79 | 79 | |
@@ -93,8 +93,8 @@ discard block |
||
93 | 93 | ) |
94 | 94 | ? $this->getIdentifierForArguments($arguments) |
95 | 95 | : ''; |
96 | - if (! empty($identifier)) { |
|
97 | - $fqcn .= ObjectIdentifier::DELIMITER . md5($identifier); |
|
96 | + if ( ! empty($identifier)) { |
|
97 | + $fqcn .= ObjectIdentifier::DELIMITER.md5($identifier); |
|
98 | 98 | } |
99 | 99 | return $fqcn; |
100 | 100 | } |
@@ -16,113 +16,113 @@ |
||
16 | 16 | class ObjectIdentifier |
17 | 17 | { |
18 | 18 | |
19 | - /** |
|
20 | - * used to separate the FQCN from the class's arguments identifier |
|
21 | - */ |
|
22 | - const DELIMITER = '____'; |
|
19 | + /** |
|
20 | + * used to separate the FQCN from the class's arguments identifier |
|
21 | + */ |
|
22 | + const DELIMITER = '____'; |
|
23 | 23 | |
24 | - /** |
|
25 | - * @var ClassInterfaceCache $class_cache |
|
26 | - */ |
|
27 | - private $class_cache; |
|
24 | + /** |
|
25 | + * @var ClassInterfaceCache $class_cache |
|
26 | + */ |
|
27 | + private $class_cache; |
|
28 | 28 | |
29 | 29 | |
30 | - /** |
|
31 | - * ObjectIdentifier constructor. |
|
32 | - * |
|
33 | - * @param ClassInterfaceCache $class_cache |
|
34 | - */ |
|
35 | - public function __construct(ClassInterfaceCache $class_cache) |
|
36 | - { |
|
37 | - $this->class_cache = $class_cache; |
|
38 | - } |
|
30 | + /** |
|
31 | + * ObjectIdentifier constructor. |
|
32 | + * |
|
33 | + * @param ClassInterfaceCache $class_cache |
|
34 | + */ |
|
35 | + public function __construct(ClassInterfaceCache $class_cache) |
|
36 | + { |
|
37 | + $this->class_cache = $class_cache; |
|
38 | + } |
|
39 | 39 | |
40 | 40 | |
41 | - /** |
|
42 | - * Returns true if the supplied $object_identifier contains |
|
43 | - * the delimiter used to separate an fqcn from the arguments hash |
|
44 | - * |
|
45 | - * @param string $object_identifier |
|
46 | - * @return bool |
|
47 | - */ |
|
48 | - public function hasArguments($object_identifier) |
|
49 | - { |
|
50 | - // type casting to bool instead of using strpos() !== false |
|
51 | - // because an object identifier should never begin with the delimiter |
|
52 | - // therefore the delimiter should NOT be found at position 0 |
|
53 | - return (bool) strpos($object_identifier, ObjectIdentifier::DELIMITER); |
|
54 | - } |
|
41 | + /** |
|
42 | + * Returns true if the supplied $object_identifier contains |
|
43 | + * the delimiter used to separate an fqcn from the arguments hash |
|
44 | + * |
|
45 | + * @param string $object_identifier |
|
46 | + * @return bool |
|
47 | + */ |
|
48 | + public function hasArguments($object_identifier) |
|
49 | + { |
|
50 | + // type casting to bool instead of using strpos() !== false |
|
51 | + // because an object identifier should never begin with the delimiter |
|
52 | + // therefore the delimiter should NOT be found at position 0 |
|
53 | + return (bool) strpos($object_identifier, ObjectIdentifier::DELIMITER); |
|
54 | + } |
|
55 | 55 | |
56 | 56 | |
57 | - /** |
|
58 | - * Returns true if the supplied FQCN equals the supplied $object_identifier |
|
59 | - * OR the supplied FQCN matches the FQCN portion of the supplied $object_identifier |
|
60 | - * AND that $object_identifier is for an object with arguments. |
|
61 | - * This allows a request for an object using a FQCN to match |
|
62 | - * a previously instantiated object with arguments |
|
63 | - * without having to know those arguments. |
|
64 | - * |
|
65 | - * @param string $fqcn |
|
66 | - * @param string $object_identifier |
|
67 | - * @return bool |
|
68 | - */ |
|
69 | - public function fqcnMatchesObjectIdentifier($fqcn, $object_identifier) |
|
70 | - { |
|
71 | - return $fqcn === $object_identifier |
|
72 | - || strpos($object_identifier, $fqcn . ObjectIdentifier::DELIMITER) === 0; |
|
73 | - } |
|
57 | + /** |
|
58 | + * Returns true if the supplied FQCN equals the supplied $object_identifier |
|
59 | + * OR the supplied FQCN matches the FQCN portion of the supplied $object_identifier |
|
60 | + * AND that $object_identifier is for an object with arguments. |
|
61 | + * This allows a request for an object using a FQCN to match |
|
62 | + * a previously instantiated object with arguments |
|
63 | + * without having to know those arguments. |
|
64 | + * |
|
65 | + * @param string $fqcn |
|
66 | + * @param string $object_identifier |
|
67 | + * @return bool |
|
68 | + */ |
|
69 | + public function fqcnMatchesObjectIdentifier($fqcn, $object_identifier) |
|
70 | + { |
|
71 | + return $fqcn === $object_identifier |
|
72 | + || strpos($object_identifier, $fqcn . ObjectIdentifier::DELIMITER) === 0; |
|
73 | + } |
|
74 | 74 | |
75 | 75 | |
76 | - /** |
|
77 | - * build a string representation of an object's FQCN and arguments |
|
78 | - * |
|
79 | - * @param string $fqcn |
|
80 | - * @param array $arguments |
|
81 | - * @return string |
|
82 | - */ |
|
83 | - public function getIdentifier($fqcn, array $arguments = array()) |
|
84 | - { |
|
85 | - // only build identifier from arguments if class is not ReservedInstanceInterface |
|
86 | - $identifier = ! $this->class_cache->hasInterface( |
|
87 | - $fqcn, |
|
88 | - 'EventEspresso\core\interfaces\ReservedInstanceInterface' |
|
89 | - ) |
|
90 | - ? $this->getIdentifierForArguments($arguments) |
|
91 | - : ''; |
|
92 | - if (! empty($identifier)) { |
|
93 | - $fqcn .= ObjectIdentifier::DELIMITER . md5($identifier); |
|
94 | - } |
|
95 | - return $fqcn; |
|
96 | - } |
|
76 | + /** |
|
77 | + * build a string representation of an object's FQCN and arguments |
|
78 | + * |
|
79 | + * @param string $fqcn |
|
80 | + * @param array $arguments |
|
81 | + * @return string |
|
82 | + */ |
|
83 | + public function getIdentifier($fqcn, array $arguments = array()) |
|
84 | + { |
|
85 | + // only build identifier from arguments if class is not ReservedInstanceInterface |
|
86 | + $identifier = ! $this->class_cache->hasInterface( |
|
87 | + $fqcn, |
|
88 | + 'EventEspresso\core\interfaces\ReservedInstanceInterface' |
|
89 | + ) |
|
90 | + ? $this->getIdentifierForArguments($arguments) |
|
91 | + : ''; |
|
92 | + if (! empty($identifier)) { |
|
93 | + $fqcn .= ObjectIdentifier::DELIMITER . md5($identifier); |
|
94 | + } |
|
95 | + return $fqcn; |
|
96 | + } |
|
97 | 97 | |
98 | 98 | |
99 | - /** |
|
100 | - * build a string representation of a object's arguments |
|
101 | - * (mostly because Closures can't be serialized) |
|
102 | - * |
|
103 | - * @param array $arguments |
|
104 | - * @return string |
|
105 | - */ |
|
106 | - protected function getIdentifierForArguments(array $arguments) |
|
107 | - { |
|
108 | - if (empty($arguments)) { |
|
109 | - return ''; |
|
110 | - } |
|
111 | - $identifier = ''; |
|
112 | - foreach ($arguments as $argument) { |
|
113 | - switch (true) { |
|
114 | - case is_object($argument): |
|
115 | - case $argument instanceof Closure: |
|
116 | - $identifier .= spl_object_hash($argument); |
|
117 | - break; |
|
118 | - case is_array($argument): |
|
119 | - $identifier .= $this->getIdentifierForArguments($argument); |
|
120 | - break; |
|
121 | - default: |
|
122 | - $identifier .= $argument; |
|
123 | - break; |
|
124 | - } |
|
125 | - } |
|
126 | - return $identifier; |
|
127 | - } |
|
99 | + /** |
|
100 | + * build a string representation of a object's arguments |
|
101 | + * (mostly because Closures can't be serialized) |
|
102 | + * |
|
103 | + * @param array $arguments |
|
104 | + * @return string |
|
105 | + */ |
|
106 | + protected function getIdentifierForArguments(array $arguments) |
|
107 | + { |
|
108 | + if (empty($arguments)) { |
|
109 | + return ''; |
|
110 | + } |
|
111 | + $identifier = ''; |
|
112 | + foreach ($arguments as $argument) { |
|
113 | + switch (true) { |
|
114 | + case is_object($argument): |
|
115 | + case $argument instanceof Closure: |
|
116 | + $identifier .= spl_object_hash($argument); |
|
117 | + break; |
|
118 | + case is_array($argument): |
|
119 | + $identifier .= $this->getIdentifierForArguments($argument); |
|
120 | + break; |
|
121 | + default: |
|
122 | + $identifier .= $argument; |
|
123 | + break; |
|
124 | + } |
|
125 | + } |
|
126 | + return $identifier; |
|
127 | + } |
|
128 | 128 | } |
@@ -16,55 +16,55 @@ |
||
16 | 16 | interface DomainInterface extends InterminableInterface |
17 | 17 | { |
18 | 18 | |
19 | - /** |
|
20 | - * @return string |
|
21 | - * @throws DomainException |
|
22 | - */ |
|
23 | - public function pluginFile(); |
|
19 | + /** |
|
20 | + * @return string |
|
21 | + * @throws DomainException |
|
22 | + */ |
|
23 | + public function pluginFile(); |
|
24 | 24 | |
25 | 25 | |
26 | - /** |
|
27 | - * @return string |
|
28 | - * @throws DomainException |
|
29 | - */ |
|
30 | - public function pluginBasename(); |
|
26 | + /** |
|
27 | + * @return string |
|
28 | + * @throws DomainException |
|
29 | + */ |
|
30 | + public function pluginBasename(); |
|
31 | 31 | |
32 | 32 | |
33 | - /** |
|
34 | - * @return string |
|
35 | - */ |
|
36 | - public function pluginPath(); |
|
33 | + /** |
|
34 | + * @return string |
|
35 | + */ |
|
36 | + public function pluginPath(); |
|
37 | 37 | |
38 | 38 | |
39 | - /** |
|
40 | - * @return string |
|
41 | - * @throws DomainException |
|
42 | - */ |
|
43 | - public function pluginUrl(); |
|
39 | + /** |
|
40 | + * @return string |
|
41 | + * @throws DomainException |
|
42 | + */ |
|
43 | + public function pluginUrl(); |
|
44 | 44 | |
45 | 45 | |
46 | - /** |
|
47 | - * @return string |
|
48 | - * @throws DomainException |
|
49 | - */ |
|
50 | - public function version(); |
|
46 | + /** |
|
47 | + * @return string |
|
48 | + * @throws DomainException |
|
49 | + */ |
|
50 | + public function version(); |
|
51 | 51 | |
52 | 52 | |
53 | - /** |
|
54 | - * @return string |
|
55 | - */ |
|
56 | - public function distributionAssetsPath(); |
|
53 | + /** |
|
54 | + * @return string |
|
55 | + */ |
|
56 | + public function distributionAssetsPath(); |
|
57 | 57 | |
58 | 58 | |
59 | - /** |
|
60 | - * @return string |
|
61 | - */ |
|
62 | - public function distributionAssetsUrl(); |
|
59 | + /** |
|
60 | + * @return string |
|
61 | + */ |
|
62 | + public function distributionAssetsUrl(); |
|
63 | 63 | |
64 | 64 | |
65 | - /** |
|
66 | - * @return string |
|
67 | - */ |
|
68 | - public function assetNamespace(); |
|
65 | + /** |
|
66 | + * @return string |
|
67 | + */ |
|
68 | + public function assetNamespace(); |
|
69 | 69 | |
70 | 70 | } |
@@ -20,55 +20,55 @@ |
||
20 | 20 | class BlockCollection extends Collection |
21 | 21 | { |
22 | 22 | |
23 | - /** |
|
24 | - * Collection constructor |
|
25 | - * |
|
26 | - * @throws InvalidInterfaceException |
|
27 | - */ |
|
28 | - public function __construct() |
|
29 | - { |
|
30 | - parent::__construct('EventEspresso\core\domain\entities\editor\BlockInterface'); |
|
31 | - } |
|
23 | + /** |
|
24 | + * Collection constructor |
|
25 | + * |
|
26 | + * @throws InvalidInterfaceException |
|
27 | + */ |
|
28 | + public function __construct() |
|
29 | + { |
|
30 | + parent::__construct('EventEspresso\core\domain\entities\editor\BlockInterface'); |
|
31 | + } |
|
32 | 32 | |
33 | 33 | |
34 | - /** |
|
35 | - * unRegisterBlock |
|
36 | - * finds block in the Collection based on the identifier that was set using addObject() |
|
37 | - * and calls unRegisterBlock() on it. Returns block if successful and false if block was not found. |
|
38 | - * PLZ NOTE: the pointer is reset to the beginning of the collection afterwards |
|
39 | - * |
|
40 | - * @param mixed $identifier |
|
41 | - * @return boolean |
|
42 | - */ |
|
43 | - public function unRegisterBlock($identifier) |
|
44 | - { |
|
45 | - $this->rewind(); |
|
46 | - while ($this->valid()) { |
|
47 | - if ($identifier === $this->getInfo()) { |
|
48 | - $object = $this->current(); |
|
49 | - $this->rewind(); |
|
50 | - return $object->unRegisterBlock(); |
|
51 | - } |
|
52 | - $this->next(); |
|
53 | - } |
|
54 | - return false; |
|
55 | - } |
|
34 | + /** |
|
35 | + * unRegisterBlock |
|
36 | + * finds block in the Collection based on the identifier that was set using addObject() |
|
37 | + * and calls unRegisterBlock() on it. Returns block if successful and false if block was not found. |
|
38 | + * PLZ NOTE: the pointer is reset to the beginning of the collection afterwards |
|
39 | + * |
|
40 | + * @param mixed $identifier |
|
41 | + * @return boolean |
|
42 | + */ |
|
43 | + public function unRegisterBlock($identifier) |
|
44 | + { |
|
45 | + $this->rewind(); |
|
46 | + while ($this->valid()) { |
|
47 | + if ($identifier === $this->getInfo()) { |
|
48 | + $object = $this->current(); |
|
49 | + $this->rewind(); |
|
50 | + return $object->unRegisterBlock(); |
|
51 | + } |
|
52 | + $this->next(); |
|
53 | + } |
|
54 | + return false; |
|
55 | + } |
|
56 | 56 | |
57 | 57 | |
58 | - /** |
|
59 | - * unRegisterAllBlocks |
|
60 | - * calls unRegisterBlock() on all blocks in Collection. |
|
61 | - * PLZ NOTE: the pointer is reset to the beginning of the collection afterwards |
|
62 | - * |
|
63 | - * @return void |
|
64 | - */ |
|
65 | - public function unRegisterAllBlocks() |
|
66 | - { |
|
67 | - $this->rewind(); |
|
68 | - while ($this->valid()) { |
|
69 | - $this->current()->unRegisterBlock(); |
|
70 | - $this->next(); |
|
71 | - } |
|
72 | - $this->rewind(); |
|
73 | - } |
|
58 | + /** |
|
59 | + * unRegisterAllBlocks |
|
60 | + * calls unRegisterBlock() on all blocks in Collection. |
|
61 | + * PLZ NOTE: the pointer is reset to the beginning of the collection afterwards |
|
62 | + * |
|
63 | + * @return void |
|
64 | + */ |
|
65 | + public function unRegisterAllBlocks() |
|
66 | + { |
|
67 | + $this->rewind(); |
|
68 | + while ($this->valid()) { |
|
69 | + $this->current()->unRegisterBlock(); |
|
70 | + $this->next(); |
|
71 | + } |
|
72 | + $this->rewind(); |
|
73 | + } |
|
74 | 74 | } |
@@ -375,11 +375,11 @@ discard block |
||
375 | 375 | |
376 | 376 | |
377 | 377 | /** |
378 | - * @param mixed $var |
|
378 | + * @param string $var |
|
379 | 379 | * @param string $var_name |
380 | 380 | * @param string $file |
381 | 381 | * @param int|string $line |
382 | - * @param int|string $heading_tag |
|
382 | + * @param integer $heading_tag |
|
383 | 383 | * @param bool $die |
384 | 384 | * @param string $margin |
385 | 385 | */ |
@@ -411,6 +411,9 @@ discard block |
||
411 | 411 | } |
412 | 412 | |
413 | 413 | |
414 | + /** |
|
415 | + * @param integer $heading_tag |
|
416 | + */ |
|
414 | 417 | protected static function headingTag($heading_tag) |
415 | 418 | { |
416 | 419 | $heading_tag = absint($heading_tag); |
@@ -532,8 +535,8 @@ discard block |
||
532 | 535 | * @param mixed $var |
533 | 536 | * @param string $var_name |
534 | 537 | * @param string $file |
535 | - * @param int|string $line |
|
536 | - * @param int|string $heading_tag |
|
538 | + * @param integer $line |
|
539 | + * @param integer $heading_tag |
|
537 | 540 | * @param bool $die |
538 | 541 | */ |
539 | 542 | public static function printr( |
@@ -596,7 +599,7 @@ discard block |
||
596 | 599 | |
597 | 600 | /** |
598 | 601 | * @deprecated 4.9.39.rc.034 |
599 | - * @param null $timer_name |
|
602 | + * @param string $timer_name |
|
600 | 603 | */ |
601 | 604 | public function start_timer($timer_name = null) |
602 | 605 | { |
@@ -34,7 +34,7 @@ discard block |
||
34 | 34 | public static function instance() |
35 | 35 | { |
36 | 36 | // check if class object is instantiated, and instantiated properly |
37 | - if (! self::$_instance instanceof EEH_Debug_Tools) { |
|
37 | + if ( ! self::$_instance instanceof EEH_Debug_Tools) { |
|
38 | 38 | self::$_instance = new self(); |
39 | 39 | } |
40 | 40 | return self::$_instance; |
@@ -48,13 +48,13 @@ discard block |
||
48 | 48 | private function __construct() |
49 | 49 | { |
50 | 50 | // load Kint PHP debugging library |
51 | - if (! class_exists('Kint') && file_exists(EE_PLUGIN_DIR_PATH . 'tests' . DS . 'kint' . DS . 'Kint.class.php')) { |
|
51 | + if ( ! class_exists('Kint') && file_exists(EE_PLUGIN_DIR_PATH.'tests'.DS.'kint'.DS.'Kint.class.php')) { |
|
52 | 52 | // despite EE4 having a check for an existing copy of the Kint debugging class, |
53 | 53 | // if another plugin was loaded AFTER EE4 and they did NOT perform a similar check, |
54 | 54 | // then hilarity would ensue as PHP throws a "Cannot redeclare class Kint" error |
55 | 55 | // so we've moved it to our test folder so that it is not included with production releases |
56 | 56 | // plz use https://wordpress.org/plugins/kint-debugger/ if testing production versions of EE |
57 | - require_once(EE_PLUGIN_DIR_PATH . 'tests' . DS . 'kint' . DS . 'Kint.class.php'); |
|
57 | + require_once(EE_PLUGIN_DIR_PATH.'tests'.DS.'kint'.DS.'Kint.class.php'); |
|
58 | 58 | } |
59 | 59 | // if ( ! defined('DOING_AJAX') || $_REQUEST['noheader'] !== 'true' || ! isset( $_REQUEST['noheader'], $_REQUEST['TB_iframe'] ) ) { |
60 | 60 | // add_action( 'shutdown', array($this,'espresso_session_footer_dump') ); |
@@ -74,7 +74,7 @@ discard block |
||
74 | 74 | */ |
75 | 75 | public static function show_db_name() |
76 | 76 | { |
77 | - if (! defined('DOING_AJAX') && (defined('EE_ERROR_EMAILS') && EE_ERROR_EMAILS)) { |
|
77 | + if ( ! defined('DOING_AJAX') && (defined('EE_ERROR_EMAILS') && EE_ERROR_EMAILS)) { |
|
78 | 78 | echo '<p style="font-size:10px;font-weight:normal;color:#E76700;margin: 1em 2em; text-align: right;">DB_NAME: ' |
79 | 79 | . DB_NAME |
80 | 80 | . '</p>'; |
@@ -123,12 +123,12 @@ discard block |
||
123 | 123 | global $wp_filter; |
124 | 124 | echo '<br/><br/><br/><h3>Hooked Functions</h3>'; |
125 | 125 | if ($tag) { |
126 | - $hook[ $tag ] = $wp_filter[ $tag ]; |
|
127 | - if (! is_array($hook[ $tag ])) { |
|
126 | + $hook[$tag] = $wp_filter[$tag]; |
|
127 | + if ( ! is_array($hook[$tag])) { |
|
128 | 128 | trigger_error("Nothing found for '$tag' hook", E_USER_WARNING); |
129 | 129 | return; |
130 | 130 | } |
131 | - echo '<h5>For Tag: ' . $tag . '</h5>'; |
|
131 | + echo '<h5>For Tag: '.$tag.'</h5>'; |
|
132 | 132 | } else { |
133 | 133 | $hook = is_array($wp_filter) ? $wp_filter : array($wp_filter); |
134 | 134 | ksort($hook); |
@@ -157,12 +157,12 @@ discard block |
||
157 | 157 | { |
158 | 158 | $filters = array(); |
159 | 159 | global $wp_filter; |
160 | - if (isset($wp_filter[ $hook_name ])) { |
|
161 | - $filters[ $hook_name ] = array(); |
|
162 | - foreach ($wp_filter[ $hook_name ] as $priority => $callbacks) { |
|
163 | - $filters[ $hook_name ][ $priority ] = array(); |
|
160 | + if (isset($wp_filter[$hook_name])) { |
|
161 | + $filters[$hook_name] = array(); |
|
162 | + foreach ($wp_filter[$hook_name] as $priority => $callbacks) { |
|
163 | + $filters[$hook_name][$priority] = array(); |
|
164 | 164 | foreach ($callbacks as $callback) { |
165 | - $filters[ $hook_name ][ $priority ][] = $callback['function']; |
|
165 | + $filters[$hook_name][$priority][] = $callback['function']; |
|
166 | 166 | } |
167 | 167 | } |
168 | 168 | } |
@@ -181,17 +181,17 @@ discard block |
||
181 | 181 | { |
182 | 182 | if (WP_DEBUG) { |
183 | 183 | $activation_errors = ob_get_contents(); |
184 | - if (! empty($activation_errors)) { |
|
185 | - $activation_errors = date('Y-m-d H:i:s') . "\n" . $activation_errors; |
|
184 | + if ( ! empty($activation_errors)) { |
|
185 | + $activation_errors = date('Y-m-d H:i:s')."\n".$activation_errors; |
|
186 | 186 | } |
187 | - espresso_load_required('EEH_File', EE_HELPERS . 'EEH_File.helper.php'); |
|
187 | + espresso_load_required('EEH_File', EE_HELPERS.'EEH_File.helper.php'); |
|
188 | 188 | if (class_exists('EEH_File')) { |
189 | 189 | try { |
190 | 190 | EEH_File::ensure_file_exists_and_is_writable( |
191 | - EVENT_ESPRESSO_UPLOAD_DIR . 'logs' . DS . 'espresso_plugin_activation_errors.html' |
|
191 | + EVENT_ESPRESSO_UPLOAD_DIR.'logs'.DS.'espresso_plugin_activation_errors.html' |
|
192 | 192 | ); |
193 | 193 | EEH_File::write_to_file( |
194 | - EVENT_ESPRESSO_UPLOAD_DIR . 'logs' . DS . 'espresso_plugin_activation_errors.html', |
|
194 | + EVENT_ESPRESSO_UPLOAD_DIR.'logs'.DS.'espresso_plugin_activation_errors.html', |
|
195 | 195 | $activation_errors |
196 | 196 | ); |
197 | 197 | } catch (EE_Error $e) { |
@@ -211,11 +211,11 @@ discard block |
||
211 | 211 | } else { |
212 | 212 | // old school attempt |
213 | 213 | file_put_contents( |
214 | - EVENT_ESPRESSO_UPLOAD_DIR . 'logs' . DS . 'espresso_plugin_activation_errors.html', |
|
214 | + EVENT_ESPRESSO_UPLOAD_DIR.'logs'.DS.'espresso_plugin_activation_errors.html', |
|
215 | 215 | $activation_errors |
216 | 216 | ); |
217 | 217 | } |
218 | - $activation_errors = get_option('ee_plugin_activation_errors', '') . $activation_errors; |
|
218 | + $activation_errors = get_option('ee_plugin_activation_errors', '').$activation_errors; |
|
219 | 219 | update_option('ee_plugin_activation_errors', $activation_errors); |
220 | 220 | } |
221 | 221 | } |
@@ -275,7 +275,7 @@ discard block |
||
275 | 275 | // don't trigger error if doing ajax, |
276 | 276 | // instead we'll add a transient EE_Error notice that in theory should show on the next request. |
277 | 277 | if (defined('DOING_AJAX') && DOING_AJAX) { |
278 | - $error_message .= ' ' . esc_html__( |
|
278 | + $error_message .= ' '.esc_html__( |
|
279 | 279 | 'This is a doing_it_wrong message that was triggered during an ajax request. The request params on this request were: ', |
280 | 280 | 'event_espresso' |
281 | 281 | ); |
@@ -319,19 +319,19 @@ discard block |
||
319 | 319 | $debug_key = 'EE_DEBUG_SPCO' |
320 | 320 | ) { |
321 | 321 | if (WP_DEBUG) { |
322 | - $debug_key = $debug_key . '_' . EE_Session::instance()->id(); |
|
322 | + $debug_key = $debug_key.'_'.EE_Session::instance()->id(); |
|
323 | 323 | $debug_data = get_option($debug_key, array()); |
324 | 324 | $default_data = array( |
325 | - $class => $func . '() : ' . $line, |
|
325 | + $class => $func.'() : '.$line, |
|
326 | 326 | 'REQ' => $display_request ? $_REQUEST : '', |
327 | 327 | ); |
328 | 328 | // don't serialize objects |
329 | 329 | $info = self::strip_objects($info); |
330 | 330 | $index = ! empty($debug_index) ? $debug_index : 0; |
331 | - if (! isset($debug_data[ $index ])) { |
|
332 | - $debug_data[ $index ] = array(); |
|
331 | + if ( ! isset($debug_data[$index])) { |
|
332 | + $debug_data[$index] = array(); |
|
333 | 333 | } |
334 | - $debug_data[ $index ][ microtime() ] = array_merge($default_data, $info); |
|
334 | + $debug_data[$index][microtime()] = array_merge($default_data, $info); |
|
335 | 335 | update_option($debug_key, $debug_data); |
336 | 336 | } |
337 | 337 | } |
@@ -348,20 +348,20 @@ discard block |
||
348 | 348 | { |
349 | 349 | foreach ($info as $key => $value) { |
350 | 350 | if (is_array($value)) { |
351 | - $info[ $key ] = self::strip_objects($value); |
|
351 | + $info[$key] = self::strip_objects($value); |
|
352 | 352 | } elseif (is_object($value)) { |
353 | 353 | $object_class = get_class($value); |
354 | - $info[ $object_class ] = array(); |
|
355 | - $info[ $object_class ]['ID'] = method_exists($value, 'ID') ? $value->ID() : spl_object_hash($value); |
|
354 | + $info[$object_class] = array(); |
|
355 | + $info[$object_class]['ID'] = method_exists($value, 'ID') ? $value->ID() : spl_object_hash($value); |
|
356 | 356 | if (method_exists($value, 'ID')) { |
357 | - $info[ $object_class ]['ID'] = $value->ID(); |
|
357 | + $info[$object_class]['ID'] = $value->ID(); |
|
358 | 358 | } |
359 | 359 | if (method_exists($value, 'status')) { |
360 | - $info[ $object_class ]['status'] = $value->status(); |
|
360 | + $info[$object_class]['status'] = $value->status(); |
|
361 | 361 | } elseif (method_exists($value, 'status_ID')) { |
362 | - $info[ $object_class ]['status'] = $value->status_ID(); |
|
362 | + $info[$object_class]['status'] = $value->status_ID(); |
|
363 | 363 | } |
364 | - unset($info[ $key ]); |
|
364 | + unset($info[$key]); |
|
365 | 365 | } |
366 | 366 | } |
367 | 367 | return (array) $info; |
@@ -395,8 +395,8 @@ discard block |
||
395 | 395 | $result = EEH_Debug_Tools::headingSpacer($heading_tag); |
396 | 396 | $result .= EEH_Debug_Tools::heading($var_name, $heading_tag, $margin, $line); |
397 | 397 | $result .= $is_method |
398 | - ? EEH_Debug_Tools::grey_span('::') . EEH_Debug_Tools::orange_span($var . '()') |
|
399 | - : EEH_Debug_Tools::grey_span(' : ') . EEH_Debug_Tools::orange_span($var); |
|
398 | + ? EEH_Debug_Tools::grey_span('::').EEH_Debug_Tools::orange_span($var.'()') |
|
399 | + : EEH_Debug_Tools::grey_span(' : ').EEH_Debug_Tools::orange_span($var); |
|
400 | 400 | $result .= EEH_Debug_Tools::file_and_line($file, $line, $heading_tag); |
401 | 401 | $result .= EEH_Debug_Tools::headingX($heading_tag); |
402 | 402 | if ($die) { |
@@ -445,7 +445,7 @@ discard block |
||
445 | 445 | return $heading; |
446 | 446 | } |
447 | 447 | $margin = "25px 0 0 {$margin}"; |
448 | - return '<' . $heading_tag . ' style="color:#2EA2CC; margin:' . $margin . ';"><b>' . $var_name . '</b>'; |
|
448 | + return '<'.$heading_tag.' style="color:#2EA2CC; margin:'.$margin.';"><b>'.$var_name.'</b>'; |
|
449 | 449 | } |
450 | 450 | |
451 | 451 | |
@@ -459,7 +459,7 @@ discard block |
||
459 | 459 | if (EEH_Debug_Tools::plainOutput()) { |
460 | 460 | return ''; |
461 | 461 | } |
462 | - return '</' . $heading_tag . '>'; |
|
462 | + return '</'.$heading_tag.'>'; |
|
463 | 463 | } |
464 | 464 | |
465 | 465 | |
@@ -473,7 +473,7 @@ discard block |
||
473 | 473 | if (EEH_Debug_Tools::plainOutput()) { |
474 | 474 | return $content; |
475 | 475 | } |
476 | - return '<span style="color:#999">' . $content . '</span>'; |
|
476 | + return '<span style="color:#999">'.$content.'</span>'; |
|
477 | 477 | } |
478 | 478 | |
479 | 479 | |
@@ -513,7 +513,7 @@ discard block |
||
513 | 513 | if (EEH_Debug_Tools::plainOutput()) { |
514 | 514 | return $content; |
515 | 515 | } |
516 | - return '<span style="color:#E76700">' . $content . '</span>'; |
|
516 | + return '<span style="color:#E76700">'.$content.'</span>'; |
|
517 | 517 | } |
518 | 518 | |
519 | 519 | |
@@ -530,7 +530,7 @@ discard block |
||
530 | 530 | if (EEH_Debug_Tools::plainOutput()) { |
531 | 531 | return $var; |
532 | 532 | } |
533 | - return '<pre style="color:#999; padding:1em; background: #fff">' . $var . '</pre>'; |
|
533 | + return '<pre style="color:#999; padding:1em; background: #fff">'.$var.'</pre>'; |
|
534 | 534 | } |
535 | 535 | |
536 | 536 | |
@@ -574,7 +574,7 @@ discard block |
||
574 | 574 | $heading_tag = EEH_Debug_Tools::headingTag($heading_tag); |
575 | 575 | $result = EEH_Debug_Tools::headingSpacer($heading_tag); |
576 | 576 | $result .= EEH_Debug_Tools::heading($var_name, $heading_tag, $margin, $line); |
577 | - $result .= EEH_Debug_Tools::grey_span(' : ') . EEH_Debug_Tools::orange_span( |
|
577 | + $result .= EEH_Debug_Tools::grey_span(' : ').EEH_Debug_Tools::orange_span( |
|
578 | 578 | EEH_Debug_Tools::pre_span($var) |
579 | 579 | ); |
580 | 580 | $result .= EEH_Debug_Tools::file_and_line($file, $line, $heading_tag); |
@@ -11,670 +11,670 @@ discard block |
||
11 | 11 | class EEH_Debug_Tools |
12 | 12 | { |
13 | 13 | |
14 | - /** |
|
15 | - * instance of the EEH_Autoloader object |
|
16 | - * |
|
17 | - * @var $_instance |
|
18 | - * @access private |
|
19 | - */ |
|
20 | - private static $_instance; |
|
21 | - |
|
22 | - /** |
|
23 | - * @var array |
|
24 | - */ |
|
25 | - protected $_memory_usage_points = array(); |
|
26 | - |
|
27 | - |
|
28 | - |
|
29 | - /** |
|
30 | - * @singleton method used to instantiate class object |
|
31 | - * @access public |
|
32 | - * @return EEH_Debug_Tools |
|
33 | - */ |
|
34 | - public static function instance() |
|
35 | - { |
|
36 | - // check if class object is instantiated, and instantiated properly |
|
37 | - if (! self::$_instance instanceof EEH_Debug_Tools) { |
|
38 | - self::$_instance = new self(); |
|
39 | - } |
|
40 | - return self::$_instance; |
|
41 | - } |
|
42 | - |
|
43 | - |
|
44 | - |
|
45 | - /** |
|
46 | - * private class constructor |
|
47 | - */ |
|
48 | - private function __construct() |
|
49 | - { |
|
50 | - // load Kint PHP debugging library |
|
51 | - if (! class_exists('Kint') && file_exists(EE_PLUGIN_DIR_PATH . 'tests' . DS . 'kint' . DS . 'Kint.class.php')) { |
|
52 | - // despite EE4 having a check for an existing copy of the Kint debugging class, |
|
53 | - // if another plugin was loaded AFTER EE4 and they did NOT perform a similar check, |
|
54 | - // then hilarity would ensue as PHP throws a "Cannot redeclare class Kint" error |
|
55 | - // so we've moved it to our test folder so that it is not included with production releases |
|
56 | - // plz use https://wordpress.org/plugins/kint-debugger/ if testing production versions of EE |
|
57 | - require_once(EE_PLUGIN_DIR_PATH . 'tests' . DS . 'kint' . DS . 'Kint.class.php'); |
|
58 | - } |
|
59 | - // if ( ! defined('DOING_AJAX') || $_REQUEST['noheader'] !== 'true' || ! isset( $_REQUEST['noheader'], $_REQUEST['TB_iframe'] ) ) { |
|
60 | - // add_action( 'shutdown', array($this,'espresso_session_footer_dump') ); |
|
61 | - // } |
|
62 | - $plugin = basename(EE_PLUGIN_DIR_PATH); |
|
63 | - add_action("activate_{$plugin}", array('EEH_Debug_Tools', 'ee_plugin_activation_errors')); |
|
64 | - add_action('activated_plugin', array('EEH_Debug_Tools', 'ee_plugin_activation_errors')); |
|
65 | - add_action('shutdown', array('EEH_Debug_Tools', 'show_db_name')); |
|
66 | - } |
|
67 | - |
|
68 | - |
|
69 | - |
|
70 | - /** |
|
71 | - * show_db_name |
|
72 | - * |
|
73 | - * @return void |
|
74 | - */ |
|
75 | - public static function show_db_name() |
|
76 | - { |
|
77 | - if (! defined('DOING_AJAX') && (defined('EE_ERROR_EMAILS') && EE_ERROR_EMAILS)) { |
|
78 | - echo '<p style="font-size:10px;font-weight:normal;color:#E76700;margin: 1em 2em; text-align: right;">DB_NAME: ' |
|
79 | - . DB_NAME |
|
80 | - . '</p>'; |
|
81 | - } |
|
82 | - if (EE_DEBUG) { |
|
83 | - Benchmark::displayResults(); |
|
84 | - } |
|
85 | - } |
|
86 | - |
|
87 | - |
|
88 | - |
|
89 | - /** |
|
90 | - * dump EE_Session object at bottom of page after everything else has happened |
|
91 | - * |
|
92 | - * @return void |
|
93 | - */ |
|
94 | - public function espresso_session_footer_dump() |
|
95 | - { |
|
96 | - if ((defined('WP_DEBUG') && WP_DEBUG) |
|
97 | - && ! defined('DOING_AJAX') |
|
98 | - && class_exists('Kint') |
|
99 | - && function_exists('wp_get_current_user') |
|
100 | - && current_user_can('update_core') |
|
101 | - && class_exists('EE_Registry') |
|
102 | - ) { |
|
103 | - Kint::dump(EE_Registry::instance()->SSN->id()); |
|
104 | - Kint::dump(EE_Registry::instance()->SSN); |
|
105 | - // Kint::dump( EE_Registry::instance()->SSN->get_session_data('cart')->get_tickets() ); |
|
106 | - $this->espresso_list_hooked_functions(); |
|
107 | - Benchmark::displayResults(); |
|
108 | - } |
|
109 | - } |
|
110 | - |
|
111 | - |
|
112 | - |
|
113 | - /** |
|
114 | - * List All Hooked Functions |
|
115 | - * to list all functions for a specific hook, add ee_list_hooks={hook-name} to URL |
|
116 | - * http://wp.smashingmagazine.com/2009/08/18/10-useful-wordpress-hook-hacks/ |
|
117 | - * |
|
118 | - * @param string $tag |
|
119 | - * @return void |
|
120 | - */ |
|
121 | - public function espresso_list_hooked_functions($tag = '') |
|
122 | - { |
|
123 | - global $wp_filter; |
|
124 | - echo '<br/><br/><br/><h3>Hooked Functions</h3>'; |
|
125 | - if ($tag) { |
|
126 | - $hook[ $tag ] = $wp_filter[ $tag ]; |
|
127 | - if (! is_array($hook[ $tag ])) { |
|
128 | - trigger_error("Nothing found for '$tag' hook", E_USER_WARNING); |
|
129 | - return; |
|
130 | - } |
|
131 | - echo '<h5>For Tag: ' . $tag . '</h5>'; |
|
132 | - } else { |
|
133 | - $hook = is_array($wp_filter) ? $wp_filter : array($wp_filter); |
|
134 | - ksort($hook); |
|
135 | - } |
|
136 | - foreach ($hook as $tag_name => $priorities) { |
|
137 | - echo "<br />>>>>>\t<strong>$tag_name</strong><br />"; |
|
138 | - ksort($priorities); |
|
139 | - foreach ($priorities as $priority => $function) { |
|
140 | - echo $priority; |
|
141 | - foreach ($function as $name => $properties) { |
|
142 | - echo "\t$name<br />"; |
|
143 | - } |
|
144 | - } |
|
145 | - } |
|
146 | - } |
|
147 | - |
|
148 | - |
|
149 | - |
|
150 | - /** |
|
151 | - * registered_filter_callbacks |
|
152 | - * |
|
153 | - * @param string $hook_name |
|
154 | - * @return array |
|
155 | - */ |
|
156 | - public static function registered_filter_callbacks($hook_name = '') |
|
157 | - { |
|
158 | - $filters = array(); |
|
159 | - global $wp_filter; |
|
160 | - if (isset($wp_filter[ $hook_name ])) { |
|
161 | - $filters[ $hook_name ] = array(); |
|
162 | - foreach ($wp_filter[ $hook_name ] as $priority => $callbacks) { |
|
163 | - $filters[ $hook_name ][ $priority ] = array(); |
|
164 | - foreach ($callbacks as $callback) { |
|
165 | - $filters[ $hook_name ][ $priority ][] = $callback['function']; |
|
166 | - } |
|
167 | - } |
|
168 | - } |
|
169 | - return $filters; |
|
170 | - } |
|
171 | - |
|
172 | - |
|
173 | - |
|
174 | - /** |
|
175 | - * captures plugin activation errors for debugging |
|
176 | - * |
|
177 | - * @return void |
|
178 | - * @throws EE_Error |
|
179 | - */ |
|
180 | - public static function ee_plugin_activation_errors() |
|
181 | - { |
|
182 | - if (WP_DEBUG) { |
|
183 | - $activation_errors = ob_get_contents(); |
|
184 | - if (! empty($activation_errors)) { |
|
185 | - $activation_errors = date('Y-m-d H:i:s') . "\n" . $activation_errors; |
|
186 | - } |
|
187 | - espresso_load_required('EEH_File', EE_HELPERS . 'EEH_File.helper.php'); |
|
188 | - if (class_exists('EEH_File')) { |
|
189 | - try { |
|
190 | - EEH_File::ensure_file_exists_and_is_writable( |
|
191 | - EVENT_ESPRESSO_UPLOAD_DIR . 'logs' . DS . 'espresso_plugin_activation_errors.html' |
|
192 | - ); |
|
193 | - EEH_File::write_to_file( |
|
194 | - EVENT_ESPRESSO_UPLOAD_DIR . 'logs' . DS . 'espresso_plugin_activation_errors.html', |
|
195 | - $activation_errors |
|
196 | - ); |
|
197 | - } catch (EE_Error $e) { |
|
198 | - EE_Error::add_error( |
|
199 | - sprintf( |
|
200 | - __( |
|
201 | - 'The Event Espresso activation errors file could not be setup because: %s', |
|
202 | - 'event_espresso' |
|
203 | - ), |
|
204 | - $e->getMessage() |
|
205 | - ), |
|
206 | - __FILE__, |
|
207 | - __FUNCTION__, |
|
208 | - __LINE__ |
|
209 | - ); |
|
210 | - } |
|
211 | - } else { |
|
212 | - // old school attempt |
|
213 | - file_put_contents( |
|
214 | - EVENT_ESPRESSO_UPLOAD_DIR . 'logs' . DS . 'espresso_plugin_activation_errors.html', |
|
215 | - $activation_errors |
|
216 | - ); |
|
217 | - } |
|
218 | - $activation_errors = get_option('ee_plugin_activation_errors', '') . $activation_errors; |
|
219 | - update_option('ee_plugin_activation_errors', $activation_errors); |
|
220 | - } |
|
221 | - } |
|
222 | - |
|
223 | - |
|
224 | - |
|
225 | - /** |
|
226 | - * This basically mimics the WordPress _doing_it_wrong() function except adds our own messaging etc. |
|
227 | - * Very useful for providing helpful messages to developers when the method of doing something has been deprecated, |
|
228 | - * or we want to make sure they use something the right way. |
|
229 | - * |
|
230 | - * @access public |
|
231 | - * @param string $function The function that was called |
|
232 | - * @param string $message A message explaining what has been done incorrectly |
|
233 | - * @param string $version The version of Event Espresso where the error was added |
|
234 | - * @param string $applies_when a version string for when you want the doing_it_wrong notice to begin appearing |
|
235 | - * for a deprecated function. This allows deprecation to occur during one version, |
|
236 | - * but not have any notices appear until a later version. This allows developers |
|
237 | - * extra time to update their code before notices appear. |
|
238 | - * @param int $error_type |
|
239 | - * @uses trigger_error() |
|
240 | - */ |
|
241 | - public function doing_it_wrong( |
|
242 | - $function, |
|
243 | - $message, |
|
244 | - $version, |
|
245 | - $applies_when = '', |
|
246 | - $error_type = null |
|
247 | - ) { |
|
248 | - $applies_when = ! empty($applies_when) ? $applies_when : espresso_version(); |
|
249 | - $error_type = $error_type !== null ? $error_type : E_USER_NOTICE; |
|
250 | - // because we swapped the parameter order around for the last two params, |
|
251 | - // let's verify that some third party isn't still passing an error type value for the third param |
|
252 | - if (is_int($applies_when)) { |
|
253 | - $error_type = $applies_when; |
|
254 | - $applies_when = espresso_version(); |
|
255 | - } |
|
256 | - // if not displaying notices yet, then just leave |
|
257 | - if (version_compare(espresso_version(), $applies_when, '<')) { |
|
258 | - return; |
|
259 | - } |
|
260 | - do_action('AHEE__EEH_Debug_Tools__doing_it_wrong_run', $function, $message, $version); |
|
261 | - $version = $version === null |
|
262 | - ? '' |
|
263 | - : sprintf( |
|
264 | - __('(This message was added in version %s of Event Espresso)', 'event_espresso'), |
|
265 | - $version |
|
266 | - ); |
|
267 | - $error_message = sprintf( |
|
268 | - esc_html__('%1$s was called %2$sincorrectly%3$s. %4$s %5$s', 'event_espresso'), |
|
269 | - $function, |
|
270 | - '<strong>', |
|
271 | - '</strong>', |
|
272 | - $message, |
|
273 | - $version |
|
274 | - ); |
|
275 | - // don't trigger error if doing ajax, |
|
276 | - // instead we'll add a transient EE_Error notice that in theory should show on the next request. |
|
277 | - if (defined('DOING_AJAX') && DOING_AJAX) { |
|
278 | - $error_message .= ' ' . esc_html__( |
|
279 | - 'This is a doing_it_wrong message that was triggered during an ajax request. The request params on this request were: ', |
|
280 | - 'event_espresso' |
|
281 | - ); |
|
282 | - $error_message .= '<ul><li>'; |
|
283 | - $error_message .= implode('</li><li>', EE_Registry::instance()->REQ->params()); |
|
284 | - $error_message .= '</ul>'; |
|
285 | - EE_Error::add_error($error_message, 'debug::doing_it_wrong', $function, '42'); |
|
286 | - // now we set this on the transient so it shows up on the next request. |
|
287 | - EE_Error::get_notices(false, true); |
|
288 | - } else { |
|
289 | - trigger_error($error_message, $error_type); |
|
290 | - } |
|
291 | - } |
|
292 | - |
|
293 | - |
|
294 | - |
|
295 | - |
|
296 | - /** |
|
297 | - * Logger helpers |
|
298 | - */ |
|
299 | - /** |
|
300 | - * debug |
|
301 | - * |
|
302 | - * @param string $class |
|
303 | - * @param string $func |
|
304 | - * @param string $line |
|
305 | - * @param array $info |
|
306 | - * @param bool $display_request |
|
307 | - * @param string $debug_index |
|
308 | - * @param string $debug_key |
|
309 | - * @throws EE_Error |
|
310 | - * @throws \EventEspresso\core\exceptions\InvalidSessionDataException |
|
311 | - */ |
|
312 | - public static function log( |
|
313 | - $class = '', |
|
314 | - $func = '', |
|
315 | - $line = '', |
|
316 | - $info = array(), |
|
317 | - $display_request = false, |
|
318 | - $debug_index = '', |
|
319 | - $debug_key = 'EE_DEBUG_SPCO' |
|
320 | - ) { |
|
321 | - if (WP_DEBUG) { |
|
322 | - $debug_key = $debug_key . '_' . EE_Session::instance()->id(); |
|
323 | - $debug_data = get_option($debug_key, array()); |
|
324 | - $default_data = array( |
|
325 | - $class => $func . '() : ' . $line, |
|
326 | - 'REQ' => $display_request ? $_REQUEST : '', |
|
327 | - ); |
|
328 | - // don't serialize objects |
|
329 | - $info = self::strip_objects($info); |
|
330 | - $index = ! empty($debug_index) ? $debug_index : 0; |
|
331 | - if (! isset($debug_data[ $index ])) { |
|
332 | - $debug_data[ $index ] = array(); |
|
333 | - } |
|
334 | - $debug_data[ $index ][ microtime() ] = array_merge($default_data, $info); |
|
335 | - update_option($debug_key, $debug_data); |
|
336 | - } |
|
337 | - } |
|
338 | - |
|
339 | - |
|
340 | - |
|
341 | - /** |
|
342 | - * strip_objects |
|
343 | - * |
|
344 | - * @param array $info |
|
345 | - * @return array |
|
346 | - */ |
|
347 | - public static function strip_objects($info = array()) |
|
348 | - { |
|
349 | - foreach ($info as $key => $value) { |
|
350 | - if (is_array($value)) { |
|
351 | - $info[ $key ] = self::strip_objects($value); |
|
352 | - } elseif (is_object($value)) { |
|
353 | - $object_class = get_class($value); |
|
354 | - $info[ $object_class ] = array(); |
|
355 | - $info[ $object_class ]['ID'] = method_exists($value, 'ID') ? $value->ID() : spl_object_hash($value); |
|
356 | - if (method_exists($value, 'ID')) { |
|
357 | - $info[ $object_class ]['ID'] = $value->ID(); |
|
358 | - } |
|
359 | - if (method_exists($value, 'status')) { |
|
360 | - $info[ $object_class ]['status'] = $value->status(); |
|
361 | - } elseif (method_exists($value, 'status_ID')) { |
|
362 | - $info[ $object_class ]['status'] = $value->status_ID(); |
|
363 | - } |
|
364 | - unset($info[ $key ]); |
|
365 | - } |
|
366 | - } |
|
367 | - return (array) $info; |
|
368 | - } |
|
369 | - |
|
370 | - |
|
371 | - |
|
372 | - /** |
|
373 | - * @param mixed $var |
|
374 | - * @param string $var_name |
|
375 | - * @param string $file |
|
376 | - * @param int|string $line |
|
377 | - * @param int|string $heading_tag |
|
378 | - * @param bool $die |
|
379 | - * @param string $margin |
|
380 | - */ |
|
381 | - public static function printv( |
|
382 | - $var, |
|
383 | - $var_name = '', |
|
384 | - $file = '', |
|
385 | - $line = '', |
|
386 | - $heading_tag = 5, |
|
387 | - $die = false, |
|
388 | - $margin = '' |
|
389 | - ) { |
|
390 | - $var_name = ! $var_name ? 'string' : $var_name; |
|
391 | - $var_name = ucwords(str_replace('$', '', $var_name)); |
|
392 | - $is_method = method_exists($var_name, $var); |
|
393 | - $var_name = ucwords(str_replace('_', ' ', $var_name)); |
|
394 | - $heading_tag = EEH_Debug_Tools::headingTag($heading_tag); |
|
395 | - $result = EEH_Debug_Tools::headingSpacer($heading_tag); |
|
396 | - $result .= EEH_Debug_Tools::heading($var_name, $heading_tag, $margin, $line); |
|
397 | - $result .= $is_method |
|
398 | - ? EEH_Debug_Tools::grey_span('::') . EEH_Debug_Tools::orange_span($var . '()') |
|
399 | - : EEH_Debug_Tools::grey_span(' : ') . EEH_Debug_Tools::orange_span($var); |
|
400 | - $result .= EEH_Debug_Tools::file_and_line($file, $line, $heading_tag); |
|
401 | - $result .= EEH_Debug_Tools::headingX($heading_tag); |
|
402 | - if ($die) { |
|
403 | - die($result); |
|
404 | - } |
|
405 | - echo $result; |
|
406 | - } |
|
407 | - |
|
408 | - |
|
409 | - protected static function headingTag($heading_tag) |
|
410 | - { |
|
411 | - $heading_tag = absint($heading_tag); |
|
412 | - return $heading_tag > 0 && $heading_tag < 7 ? "h{$heading_tag}" : 'h5'; |
|
413 | - } |
|
414 | - |
|
415 | - |
|
416 | - protected static function headingSpacer($heading_tag) |
|
417 | - { |
|
418 | - return EEH_Debug_Tools::plainOutput() && ($heading_tag === 'h1' || $heading_tag === 'h2') |
|
419 | - ? "\n" |
|
420 | - : ''; |
|
421 | - } |
|
422 | - |
|
423 | - |
|
424 | - protected static function plainOutput() |
|
425 | - { |
|
426 | - return defined('EE_TESTS_DIR') |
|
427 | - || (defined('DOING_AJAX') && DOING_AJAX) |
|
428 | - || ( |
|
429 | - isset($_SERVER['REQUEST_URI']) |
|
430 | - && strpos(parse_url($_SERVER['REQUEST_URI'], PHP_URL_PATH), 'wp-json') !== false |
|
431 | - ); |
|
432 | - } |
|
433 | - |
|
434 | - |
|
435 | - /** |
|
436 | - * @param string $var_name |
|
437 | - * @param string $heading_tag |
|
438 | - * @param string $margin |
|
439 | - * @param int $line |
|
440 | - * @return string |
|
441 | - */ |
|
442 | - protected static function heading($var_name = '', $heading_tag = 'h5', $margin = '', $line = 0) |
|
443 | - { |
|
444 | - if (EEH_Debug_Tools::plainOutput()) { |
|
445 | - $heading = ''; |
|
446 | - if ($heading_tag === 'h1' || $heading_tag === 'h2') { |
|
447 | - $heading .= "\n"; |
|
448 | - } |
|
449 | - $heading .= "\n{$line}) {$var_name}"; |
|
450 | - return $heading; |
|
451 | - } |
|
452 | - $margin = "25px 0 0 {$margin}"; |
|
453 | - return '<' . $heading_tag . ' style="color:#2EA2CC; margin:' . $margin . ';"><b>' . $var_name . '</b>'; |
|
454 | - } |
|
455 | - |
|
456 | - |
|
457 | - |
|
458 | - /** |
|
459 | - * @param string $heading_tag |
|
460 | - * @return string |
|
461 | - */ |
|
462 | - protected static function headingX($heading_tag = 'h5') |
|
463 | - { |
|
464 | - if (EEH_Debug_Tools::plainOutput()) { |
|
465 | - return ''; |
|
466 | - } |
|
467 | - return '</' . $heading_tag . '>'; |
|
468 | - } |
|
469 | - |
|
470 | - |
|
471 | - |
|
472 | - /** |
|
473 | - * @param string $content |
|
474 | - * @return string |
|
475 | - */ |
|
476 | - protected static function grey_span($content = '') |
|
477 | - { |
|
478 | - if (EEH_Debug_Tools::plainOutput()) { |
|
479 | - return $content; |
|
480 | - } |
|
481 | - return '<span style="color:#999">' . $content . '</span>'; |
|
482 | - } |
|
483 | - |
|
484 | - |
|
485 | - |
|
486 | - /** |
|
487 | - * @param string $file |
|
488 | - * @param int $line |
|
489 | - * @return string |
|
490 | - */ |
|
491 | - protected static function file_and_line($file, $line, $heading_tag) |
|
492 | - { |
|
493 | - if ($file === '' || $line === '') { |
|
494 | - return ''; |
|
495 | - } |
|
496 | - $file = str_replace(EE_PLUGIN_DIR_PATH, '/', $file); |
|
497 | - if (EEH_Debug_Tools::plainOutput()) { |
|
498 | - if ($heading_tag === 'h1' || $heading_tag === 'h2') { |
|
499 | - return " ({$file})"; |
|
500 | - } |
|
501 | - return ''; |
|
502 | - } |
|
503 | - return '<br /><span style="font-size:9px;font-weight:normal;color:#666;line-height: 12px;">' |
|
504 | - . $file |
|
505 | - . '<br />line no: ' |
|
506 | - . $line |
|
507 | - . '</span>'; |
|
508 | - } |
|
509 | - |
|
510 | - |
|
511 | - |
|
512 | - /** |
|
513 | - * @param string $content |
|
514 | - * @return string |
|
515 | - */ |
|
516 | - protected static function orange_span($content = '') |
|
517 | - { |
|
518 | - if (EEH_Debug_Tools::plainOutput()) { |
|
519 | - return $content; |
|
520 | - } |
|
521 | - return '<span style="color:#E76700">' . $content . '</span>'; |
|
522 | - } |
|
523 | - |
|
524 | - |
|
525 | - |
|
526 | - /** |
|
527 | - * @param mixed $var |
|
528 | - * @return string |
|
529 | - */ |
|
530 | - protected static function pre_span($var) |
|
531 | - { |
|
532 | - ob_start(); |
|
533 | - var_dump($var); |
|
534 | - $var = ob_get_clean(); |
|
535 | - if (EEH_Debug_Tools::plainOutput()) { |
|
536 | - return $var; |
|
537 | - } |
|
538 | - return '<pre style="color:#999; padding:1em; background: #fff">' . $var . '</pre>'; |
|
539 | - } |
|
540 | - |
|
541 | - |
|
542 | - |
|
543 | - /** |
|
544 | - * @param mixed $var |
|
545 | - * @param string $var_name |
|
546 | - * @param string $file |
|
547 | - * @param int|string $line |
|
548 | - * @param int|string $heading_tag |
|
549 | - * @param bool $die |
|
550 | - */ |
|
551 | - public static function printr( |
|
552 | - $var, |
|
553 | - $var_name = '', |
|
554 | - $file = '', |
|
555 | - $line = '', |
|
556 | - $heading_tag = 5, |
|
557 | - $die = false |
|
558 | - ) { |
|
559 | - // return; |
|
560 | - $file = str_replace(rtrim(ABSPATH, '\\/'), '', $file); |
|
561 | - $margin = is_admin() ? ' 180px' : '0'; |
|
562 | - // $print_r = false; |
|
563 | - if (is_string($var)) { |
|
564 | - EEH_Debug_Tools::printv($var, $var_name, $file, $line, $heading_tag, $die, $margin); |
|
565 | - return; |
|
566 | - } |
|
567 | - if (is_object($var)) { |
|
568 | - $var_name = ! $var_name ? 'object' : $var_name; |
|
569 | - // $print_r = true; |
|
570 | - } elseif (is_array($var)) { |
|
571 | - $var_name = ! $var_name ? 'array' : $var_name; |
|
572 | - // $print_r = true; |
|
573 | - } elseif (is_numeric($var)) { |
|
574 | - $var_name = ! $var_name ? 'numeric' : $var_name; |
|
575 | - } elseif ($var === null) { |
|
576 | - $var_name = ! $var_name ? 'null' : $var_name; |
|
577 | - } |
|
578 | - $var_name = ucwords(str_replace(array('$', '_'), array('', ' '), $var_name)); |
|
579 | - $heading_tag = EEH_Debug_Tools::headingTag($heading_tag); |
|
580 | - $result = EEH_Debug_Tools::headingSpacer($heading_tag); |
|
581 | - $result .= EEH_Debug_Tools::heading($var_name, $heading_tag, $margin, $line); |
|
582 | - $result .= EEH_Debug_Tools::grey_span(' : ') . EEH_Debug_Tools::orange_span( |
|
583 | - EEH_Debug_Tools::pre_span($var) |
|
584 | - ); |
|
585 | - $result .= EEH_Debug_Tools::file_and_line($file, $line, $heading_tag); |
|
586 | - $result .= EEH_Debug_Tools::headingX($heading_tag); |
|
587 | - if ($die) { |
|
588 | - die($result); |
|
589 | - } |
|
590 | - echo $result; |
|
591 | - } |
|
592 | - |
|
593 | - |
|
594 | - |
|
595 | - /******************** deprecated ********************/ |
|
596 | - |
|
597 | - |
|
598 | - |
|
599 | - /** |
|
600 | - * @deprecated 4.9.39.rc.034 |
|
601 | - */ |
|
602 | - public function reset_times() |
|
603 | - { |
|
604 | - Benchmark::resetTimes(); |
|
605 | - } |
|
606 | - |
|
607 | - |
|
608 | - |
|
609 | - /** |
|
610 | - * @deprecated 4.9.39.rc.034 |
|
611 | - * @param null $timer_name |
|
612 | - */ |
|
613 | - public function start_timer($timer_name = null) |
|
614 | - { |
|
615 | - Benchmark::startTimer($timer_name); |
|
616 | - } |
|
617 | - |
|
618 | - |
|
619 | - |
|
620 | - /** |
|
621 | - * @deprecated 4.9.39.rc.034 |
|
622 | - * @param string $timer_name |
|
623 | - */ |
|
624 | - public function stop_timer($timer_name = '') |
|
625 | - { |
|
626 | - Benchmark::stopTimer($timer_name); |
|
627 | - } |
|
628 | - |
|
629 | - |
|
630 | - |
|
631 | - /** |
|
632 | - * @deprecated 4.9.39.rc.034 |
|
633 | - * @param string $label The label to show for this time eg "Start of calling Some_Class::some_function" |
|
634 | - * @param boolean $output_now whether to echo now, or wait until EEH_Debug_Tools::show_times() is called |
|
635 | - * @return void |
|
636 | - */ |
|
637 | - public function measure_memory($label, $output_now = false) |
|
638 | - { |
|
639 | - Benchmark::measureMemory($label, $output_now); |
|
640 | - } |
|
641 | - |
|
642 | - |
|
643 | - |
|
644 | - /** |
|
645 | - * @deprecated 4.9.39.rc.034 |
|
646 | - * @param int $size |
|
647 | - * @return string |
|
648 | - */ |
|
649 | - public function convert($size) |
|
650 | - { |
|
651 | - return Benchmark::convert($size); |
|
652 | - } |
|
653 | - |
|
654 | - |
|
655 | - |
|
656 | - /** |
|
657 | - * @deprecated 4.9.39.rc.034 |
|
658 | - * @param bool $output_now |
|
659 | - * @return string |
|
660 | - */ |
|
661 | - public function show_times($output_now = true) |
|
662 | - { |
|
663 | - return Benchmark::displayResults($output_now); |
|
664 | - } |
|
665 | - |
|
666 | - |
|
667 | - |
|
668 | - /** |
|
669 | - * @deprecated 4.9.39.rc.034 |
|
670 | - * @param string $timer_name |
|
671 | - * @param float $total_time |
|
672 | - * @return string |
|
673 | - */ |
|
674 | - public function format_time($timer_name, $total_time) |
|
675 | - { |
|
676 | - return Benchmark::formatTime($timer_name, $total_time); |
|
677 | - } |
|
14 | + /** |
|
15 | + * instance of the EEH_Autoloader object |
|
16 | + * |
|
17 | + * @var $_instance |
|
18 | + * @access private |
|
19 | + */ |
|
20 | + private static $_instance; |
|
21 | + |
|
22 | + /** |
|
23 | + * @var array |
|
24 | + */ |
|
25 | + protected $_memory_usage_points = array(); |
|
26 | + |
|
27 | + |
|
28 | + |
|
29 | + /** |
|
30 | + * @singleton method used to instantiate class object |
|
31 | + * @access public |
|
32 | + * @return EEH_Debug_Tools |
|
33 | + */ |
|
34 | + public static function instance() |
|
35 | + { |
|
36 | + // check if class object is instantiated, and instantiated properly |
|
37 | + if (! self::$_instance instanceof EEH_Debug_Tools) { |
|
38 | + self::$_instance = new self(); |
|
39 | + } |
|
40 | + return self::$_instance; |
|
41 | + } |
|
42 | + |
|
43 | + |
|
44 | + |
|
45 | + /** |
|
46 | + * private class constructor |
|
47 | + */ |
|
48 | + private function __construct() |
|
49 | + { |
|
50 | + // load Kint PHP debugging library |
|
51 | + if (! class_exists('Kint') && file_exists(EE_PLUGIN_DIR_PATH . 'tests' . DS . 'kint' . DS . 'Kint.class.php')) { |
|
52 | + // despite EE4 having a check for an existing copy of the Kint debugging class, |
|
53 | + // if another plugin was loaded AFTER EE4 and they did NOT perform a similar check, |
|
54 | + // then hilarity would ensue as PHP throws a "Cannot redeclare class Kint" error |
|
55 | + // so we've moved it to our test folder so that it is not included with production releases |
|
56 | + // plz use https://wordpress.org/plugins/kint-debugger/ if testing production versions of EE |
|
57 | + require_once(EE_PLUGIN_DIR_PATH . 'tests' . DS . 'kint' . DS . 'Kint.class.php'); |
|
58 | + } |
|
59 | + // if ( ! defined('DOING_AJAX') || $_REQUEST['noheader'] !== 'true' || ! isset( $_REQUEST['noheader'], $_REQUEST['TB_iframe'] ) ) { |
|
60 | + // add_action( 'shutdown', array($this,'espresso_session_footer_dump') ); |
|
61 | + // } |
|
62 | + $plugin = basename(EE_PLUGIN_DIR_PATH); |
|
63 | + add_action("activate_{$plugin}", array('EEH_Debug_Tools', 'ee_plugin_activation_errors')); |
|
64 | + add_action('activated_plugin', array('EEH_Debug_Tools', 'ee_plugin_activation_errors')); |
|
65 | + add_action('shutdown', array('EEH_Debug_Tools', 'show_db_name')); |
|
66 | + } |
|
67 | + |
|
68 | + |
|
69 | + |
|
70 | + /** |
|
71 | + * show_db_name |
|
72 | + * |
|
73 | + * @return void |
|
74 | + */ |
|
75 | + public static function show_db_name() |
|
76 | + { |
|
77 | + if (! defined('DOING_AJAX') && (defined('EE_ERROR_EMAILS') && EE_ERROR_EMAILS)) { |
|
78 | + echo '<p style="font-size:10px;font-weight:normal;color:#E76700;margin: 1em 2em; text-align: right;">DB_NAME: ' |
|
79 | + . DB_NAME |
|
80 | + . '</p>'; |
|
81 | + } |
|
82 | + if (EE_DEBUG) { |
|
83 | + Benchmark::displayResults(); |
|
84 | + } |
|
85 | + } |
|
86 | + |
|
87 | + |
|
88 | + |
|
89 | + /** |
|
90 | + * dump EE_Session object at bottom of page after everything else has happened |
|
91 | + * |
|
92 | + * @return void |
|
93 | + */ |
|
94 | + public function espresso_session_footer_dump() |
|
95 | + { |
|
96 | + if ((defined('WP_DEBUG') && WP_DEBUG) |
|
97 | + && ! defined('DOING_AJAX') |
|
98 | + && class_exists('Kint') |
|
99 | + && function_exists('wp_get_current_user') |
|
100 | + && current_user_can('update_core') |
|
101 | + && class_exists('EE_Registry') |
|
102 | + ) { |
|
103 | + Kint::dump(EE_Registry::instance()->SSN->id()); |
|
104 | + Kint::dump(EE_Registry::instance()->SSN); |
|
105 | + // Kint::dump( EE_Registry::instance()->SSN->get_session_data('cart')->get_tickets() ); |
|
106 | + $this->espresso_list_hooked_functions(); |
|
107 | + Benchmark::displayResults(); |
|
108 | + } |
|
109 | + } |
|
110 | + |
|
111 | + |
|
112 | + |
|
113 | + /** |
|
114 | + * List All Hooked Functions |
|
115 | + * to list all functions for a specific hook, add ee_list_hooks={hook-name} to URL |
|
116 | + * http://wp.smashingmagazine.com/2009/08/18/10-useful-wordpress-hook-hacks/ |
|
117 | + * |
|
118 | + * @param string $tag |
|
119 | + * @return void |
|
120 | + */ |
|
121 | + public function espresso_list_hooked_functions($tag = '') |
|
122 | + { |
|
123 | + global $wp_filter; |
|
124 | + echo '<br/><br/><br/><h3>Hooked Functions</h3>'; |
|
125 | + if ($tag) { |
|
126 | + $hook[ $tag ] = $wp_filter[ $tag ]; |
|
127 | + if (! is_array($hook[ $tag ])) { |
|
128 | + trigger_error("Nothing found for '$tag' hook", E_USER_WARNING); |
|
129 | + return; |
|
130 | + } |
|
131 | + echo '<h5>For Tag: ' . $tag . '</h5>'; |
|
132 | + } else { |
|
133 | + $hook = is_array($wp_filter) ? $wp_filter : array($wp_filter); |
|
134 | + ksort($hook); |
|
135 | + } |
|
136 | + foreach ($hook as $tag_name => $priorities) { |
|
137 | + echo "<br />>>>>>\t<strong>$tag_name</strong><br />"; |
|
138 | + ksort($priorities); |
|
139 | + foreach ($priorities as $priority => $function) { |
|
140 | + echo $priority; |
|
141 | + foreach ($function as $name => $properties) { |
|
142 | + echo "\t$name<br />"; |
|
143 | + } |
|
144 | + } |
|
145 | + } |
|
146 | + } |
|
147 | + |
|
148 | + |
|
149 | + |
|
150 | + /** |
|
151 | + * registered_filter_callbacks |
|
152 | + * |
|
153 | + * @param string $hook_name |
|
154 | + * @return array |
|
155 | + */ |
|
156 | + public static function registered_filter_callbacks($hook_name = '') |
|
157 | + { |
|
158 | + $filters = array(); |
|
159 | + global $wp_filter; |
|
160 | + if (isset($wp_filter[ $hook_name ])) { |
|
161 | + $filters[ $hook_name ] = array(); |
|
162 | + foreach ($wp_filter[ $hook_name ] as $priority => $callbacks) { |
|
163 | + $filters[ $hook_name ][ $priority ] = array(); |
|
164 | + foreach ($callbacks as $callback) { |
|
165 | + $filters[ $hook_name ][ $priority ][] = $callback['function']; |
|
166 | + } |
|
167 | + } |
|
168 | + } |
|
169 | + return $filters; |
|
170 | + } |
|
171 | + |
|
172 | + |
|
173 | + |
|
174 | + /** |
|
175 | + * captures plugin activation errors for debugging |
|
176 | + * |
|
177 | + * @return void |
|
178 | + * @throws EE_Error |
|
179 | + */ |
|
180 | + public static function ee_plugin_activation_errors() |
|
181 | + { |
|
182 | + if (WP_DEBUG) { |
|
183 | + $activation_errors = ob_get_contents(); |
|
184 | + if (! empty($activation_errors)) { |
|
185 | + $activation_errors = date('Y-m-d H:i:s') . "\n" . $activation_errors; |
|
186 | + } |
|
187 | + espresso_load_required('EEH_File', EE_HELPERS . 'EEH_File.helper.php'); |
|
188 | + if (class_exists('EEH_File')) { |
|
189 | + try { |
|
190 | + EEH_File::ensure_file_exists_and_is_writable( |
|
191 | + EVENT_ESPRESSO_UPLOAD_DIR . 'logs' . DS . 'espresso_plugin_activation_errors.html' |
|
192 | + ); |
|
193 | + EEH_File::write_to_file( |
|
194 | + EVENT_ESPRESSO_UPLOAD_DIR . 'logs' . DS . 'espresso_plugin_activation_errors.html', |
|
195 | + $activation_errors |
|
196 | + ); |
|
197 | + } catch (EE_Error $e) { |
|
198 | + EE_Error::add_error( |
|
199 | + sprintf( |
|
200 | + __( |
|
201 | + 'The Event Espresso activation errors file could not be setup because: %s', |
|
202 | + 'event_espresso' |
|
203 | + ), |
|
204 | + $e->getMessage() |
|
205 | + ), |
|
206 | + __FILE__, |
|
207 | + __FUNCTION__, |
|
208 | + __LINE__ |
|
209 | + ); |
|
210 | + } |
|
211 | + } else { |
|
212 | + // old school attempt |
|
213 | + file_put_contents( |
|
214 | + EVENT_ESPRESSO_UPLOAD_DIR . 'logs' . DS . 'espresso_plugin_activation_errors.html', |
|
215 | + $activation_errors |
|
216 | + ); |
|
217 | + } |
|
218 | + $activation_errors = get_option('ee_plugin_activation_errors', '') . $activation_errors; |
|
219 | + update_option('ee_plugin_activation_errors', $activation_errors); |
|
220 | + } |
|
221 | + } |
|
222 | + |
|
223 | + |
|
224 | + |
|
225 | + /** |
|
226 | + * This basically mimics the WordPress _doing_it_wrong() function except adds our own messaging etc. |
|
227 | + * Very useful for providing helpful messages to developers when the method of doing something has been deprecated, |
|
228 | + * or we want to make sure they use something the right way. |
|
229 | + * |
|
230 | + * @access public |
|
231 | + * @param string $function The function that was called |
|
232 | + * @param string $message A message explaining what has been done incorrectly |
|
233 | + * @param string $version The version of Event Espresso where the error was added |
|
234 | + * @param string $applies_when a version string for when you want the doing_it_wrong notice to begin appearing |
|
235 | + * for a deprecated function. This allows deprecation to occur during one version, |
|
236 | + * but not have any notices appear until a later version. This allows developers |
|
237 | + * extra time to update their code before notices appear. |
|
238 | + * @param int $error_type |
|
239 | + * @uses trigger_error() |
|
240 | + */ |
|
241 | + public function doing_it_wrong( |
|
242 | + $function, |
|
243 | + $message, |
|
244 | + $version, |
|
245 | + $applies_when = '', |
|
246 | + $error_type = null |
|
247 | + ) { |
|
248 | + $applies_when = ! empty($applies_when) ? $applies_when : espresso_version(); |
|
249 | + $error_type = $error_type !== null ? $error_type : E_USER_NOTICE; |
|
250 | + // because we swapped the parameter order around for the last two params, |
|
251 | + // let's verify that some third party isn't still passing an error type value for the third param |
|
252 | + if (is_int($applies_when)) { |
|
253 | + $error_type = $applies_when; |
|
254 | + $applies_when = espresso_version(); |
|
255 | + } |
|
256 | + // if not displaying notices yet, then just leave |
|
257 | + if (version_compare(espresso_version(), $applies_when, '<')) { |
|
258 | + return; |
|
259 | + } |
|
260 | + do_action('AHEE__EEH_Debug_Tools__doing_it_wrong_run', $function, $message, $version); |
|
261 | + $version = $version === null |
|
262 | + ? '' |
|
263 | + : sprintf( |
|
264 | + __('(This message was added in version %s of Event Espresso)', 'event_espresso'), |
|
265 | + $version |
|
266 | + ); |
|
267 | + $error_message = sprintf( |
|
268 | + esc_html__('%1$s was called %2$sincorrectly%3$s. %4$s %5$s', 'event_espresso'), |
|
269 | + $function, |
|
270 | + '<strong>', |
|
271 | + '</strong>', |
|
272 | + $message, |
|
273 | + $version |
|
274 | + ); |
|
275 | + // don't trigger error if doing ajax, |
|
276 | + // instead we'll add a transient EE_Error notice that in theory should show on the next request. |
|
277 | + if (defined('DOING_AJAX') && DOING_AJAX) { |
|
278 | + $error_message .= ' ' . esc_html__( |
|
279 | + 'This is a doing_it_wrong message that was triggered during an ajax request. The request params on this request were: ', |
|
280 | + 'event_espresso' |
|
281 | + ); |
|
282 | + $error_message .= '<ul><li>'; |
|
283 | + $error_message .= implode('</li><li>', EE_Registry::instance()->REQ->params()); |
|
284 | + $error_message .= '</ul>'; |
|
285 | + EE_Error::add_error($error_message, 'debug::doing_it_wrong', $function, '42'); |
|
286 | + // now we set this on the transient so it shows up on the next request. |
|
287 | + EE_Error::get_notices(false, true); |
|
288 | + } else { |
|
289 | + trigger_error($error_message, $error_type); |
|
290 | + } |
|
291 | + } |
|
292 | + |
|
293 | + |
|
294 | + |
|
295 | + |
|
296 | + /** |
|
297 | + * Logger helpers |
|
298 | + */ |
|
299 | + /** |
|
300 | + * debug |
|
301 | + * |
|
302 | + * @param string $class |
|
303 | + * @param string $func |
|
304 | + * @param string $line |
|
305 | + * @param array $info |
|
306 | + * @param bool $display_request |
|
307 | + * @param string $debug_index |
|
308 | + * @param string $debug_key |
|
309 | + * @throws EE_Error |
|
310 | + * @throws \EventEspresso\core\exceptions\InvalidSessionDataException |
|
311 | + */ |
|
312 | + public static function log( |
|
313 | + $class = '', |
|
314 | + $func = '', |
|
315 | + $line = '', |
|
316 | + $info = array(), |
|
317 | + $display_request = false, |
|
318 | + $debug_index = '', |
|
319 | + $debug_key = 'EE_DEBUG_SPCO' |
|
320 | + ) { |
|
321 | + if (WP_DEBUG) { |
|
322 | + $debug_key = $debug_key . '_' . EE_Session::instance()->id(); |
|
323 | + $debug_data = get_option($debug_key, array()); |
|
324 | + $default_data = array( |
|
325 | + $class => $func . '() : ' . $line, |
|
326 | + 'REQ' => $display_request ? $_REQUEST : '', |
|
327 | + ); |
|
328 | + // don't serialize objects |
|
329 | + $info = self::strip_objects($info); |
|
330 | + $index = ! empty($debug_index) ? $debug_index : 0; |
|
331 | + if (! isset($debug_data[ $index ])) { |
|
332 | + $debug_data[ $index ] = array(); |
|
333 | + } |
|
334 | + $debug_data[ $index ][ microtime() ] = array_merge($default_data, $info); |
|
335 | + update_option($debug_key, $debug_data); |
|
336 | + } |
|
337 | + } |
|
338 | + |
|
339 | + |
|
340 | + |
|
341 | + /** |
|
342 | + * strip_objects |
|
343 | + * |
|
344 | + * @param array $info |
|
345 | + * @return array |
|
346 | + */ |
|
347 | + public static function strip_objects($info = array()) |
|
348 | + { |
|
349 | + foreach ($info as $key => $value) { |
|
350 | + if (is_array($value)) { |
|
351 | + $info[ $key ] = self::strip_objects($value); |
|
352 | + } elseif (is_object($value)) { |
|
353 | + $object_class = get_class($value); |
|
354 | + $info[ $object_class ] = array(); |
|
355 | + $info[ $object_class ]['ID'] = method_exists($value, 'ID') ? $value->ID() : spl_object_hash($value); |
|
356 | + if (method_exists($value, 'ID')) { |
|
357 | + $info[ $object_class ]['ID'] = $value->ID(); |
|
358 | + } |
|
359 | + if (method_exists($value, 'status')) { |
|
360 | + $info[ $object_class ]['status'] = $value->status(); |
|
361 | + } elseif (method_exists($value, 'status_ID')) { |
|
362 | + $info[ $object_class ]['status'] = $value->status_ID(); |
|
363 | + } |
|
364 | + unset($info[ $key ]); |
|
365 | + } |
|
366 | + } |
|
367 | + return (array) $info; |
|
368 | + } |
|
369 | + |
|
370 | + |
|
371 | + |
|
372 | + /** |
|
373 | + * @param mixed $var |
|
374 | + * @param string $var_name |
|
375 | + * @param string $file |
|
376 | + * @param int|string $line |
|
377 | + * @param int|string $heading_tag |
|
378 | + * @param bool $die |
|
379 | + * @param string $margin |
|
380 | + */ |
|
381 | + public static function printv( |
|
382 | + $var, |
|
383 | + $var_name = '', |
|
384 | + $file = '', |
|
385 | + $line = '', |
|
386 | + $heading_tag = 5, |
|
387 | + $die = false, |
|
388 | + $margin = '' |
|
389 | + ) { |
|
390 | + $var_name = ! $var_name ? 'string' : $var_name; |
|
391 | + $var_name = ucwords(str_replace('$', '', $var_name)); |
|
392 | + $is_method = method_exists($var_name, $var); |
|
393 | + $var_name = ucwords(str_replace('_', ' ', $var_name)); |
|
394 | + $heading_tag = EEH_Debug_Tools::headingTag($heading_tag); |
|
395 | + $result = EEH_Debug_Tools::headingSpacer($heading_tag); |
|
396 | + $result .= EEH_Debug_Tools::heading($var_name, $heading_tag, $margin, $line); |
|
397 | + $result .= $is_method |
|
398 | + ? EEH_Debug_Tools::grey_span('::') . EEH_Debug_Tools::orange_span($var . '()') |
|
399 | + : EEH_Debug_Tools::grey_span(' : ') . EEH_Debug_Tools::orange_span($var); |
|
400 | + $result .= EEH_Debug_Tools::file_and_line($file, $line, $heading_tag); |
|
401 | + $result .= EEH_Debug_Tools::headingX($heading_tag); |
|
402 | + if ($die) { |
|
403 | + die($result); |
|
404 | + } |
|
405 | + echo $result; |
|
406 | + } |
|
407 | + |
|
408 | + |
|
409 | + protected static function headingTag($heading_tag) |
|
410 | + { |
|
411 | + $heading_tag = absint($heading_tag); |
|
412 | + return $heading_tag > 0 && $heading_tag < 7 ? "h{$heading_tag}" : 'h5'; |
|
413 | + } |
|
414 | + |
|
415 | + |
|
416 | + protected static function headingSpacer($heading_tag) |
|
417 | + { |
|
418 | + return EEH_Debug_Tools::plainOutput() && ($heading_tag === 'h1' || $heading_tag === 'h2') |
|
419 | + ? "\n" |
|
420 | + : ''; |
|
421 | + } |
|
422 | + |
|
423 | + |
|
424 | + protected static function plainOutput() |
|
425 | + { |
|
426 | + return defined('EE_TESTS_DIR') |
|
427 | + || (defined('DOING_AJAX') && DOING_AJAX) |
|
428 | + || ( |
|
429 | + isset($_SERVER['REQUEST_URI']) |
|
430 | + && strpos(parse_url($_SERVER['REQUEST_URI'], PHP_URL_PATH), 'wp-json') !== false |
|
431 | + ); |
|
432 | + } |
|
433 | + |
|
434 | + |
|
435 | + /** |
|
436 | + * @param string $var_name |
|
437 | + * @param string $heading_tag |
|
438 | + * @param string $margin |
|
439 | + * @param int $line |
|
440 | + * @return string |
|
441 | + */ |
|
442 | + protected static function heading($var_name = '', $heading_tag = 'h5', $margin = '', $line = 0) |
|
443 | + { |
|
444 | + if (EEH_Debug_Tools::plainOutput()) { |
|
445 | + $heading = ''; |
|
446 | + if ($heading_tag === 'h1' || $heading_tag === 'h2') { |
|
447 | + $heading .= "\n"; |
|
448 | + } |
|
449 | + $heading .= "\n{$line}) {$var_name}"; |
|
450 | + return $heading; |
|
451 | + } |
|
452 | + $margin = "25px 0 0 {$margin}"; |
|
453 | + return '<' . $heading_tag . ' style="color:#2EA2CC; margin:' . $margin . ';"><b>' . $var_name . '</b>'; |
|
454 | + } |
|
455 | + |
|
456 | + |
|
457 | + |
|
458 | + /** |
|
459 | + * @param string $heading_tag |
|
460 | + * @return string |
|
461 | + */ |
|
462 | + protected static function headingX($heading_tag = 'h5') |
|
463 | + { |
|
464 | + if (EEH_Debug_Tools::plainOutput()) { |
|
465 | + return ''; |
|
466 | + } |
|
467 | + return '</' . $heading_tag . '>'; |
|
468 | + } |
|
469 | + |
|
470 | + |
|
471 | + |
|
472 | + /** |
|
473 | + * @param string $content |
|
474 | + * @return string |
|
475 | + */ |
|
476 | + protected static function grey_span($content = '') |
|
477 | + { |
|
478 | + if (EEH_Debug_Tools::plainOutput()) { |
|
479 | + return $content; |
|
480 | + } |
|
481 | + return '<span style="color:#999">' . $content . '</span>'; |
|
482 | + } |
|
483 | + |
|
484 | + |
|
485 | + |
|
486 | + /** |
|
487 | + * @param string $file |
|
488 | + * @param int $line |
|
489 | + * @return string |
|
490 | + */ |
|
491 | + protected static function file_and_line($file, $line, $heading_tag) |
|
492 | + { |
|
493 | + if ($file === '' || $line === '') { |
|
494 | + return ''; |
|
495 | + } |
|
496 | + $file = str_replace(EE_PLUGIN_DIR_PATH, '/', $file); |
|
497 | + if (EEH_Debug_Tools::plainOutput()) { |
|
498 | + if ($heading_tag === 'h1' || $heading_tag === 'h2') { |
|
499 | + return " ({$file})"; |
|
500 | + } |
|
501 | + return ''; |
|
502 | + } |
|
503 | + return '<br /><span style="font-size:9px;font-weight:normal;color:#666;line-height: 12px;">' |
|
504 | + . $file |
|
505 | + . '<br />line no: ' |
|
506 | + . $line |
|
507 | + . '</span>'; |
|
508 | + } |
|
509 | + |
|
510 | + |
|
511 | + |
|
512 | + /** |
|
513 | + * @param string $content |
|
514 | + * @return string |
|
515 | + */ |
|
516 | + protected static function orange_span($content = '') |
|
517 | + { |
|
518 | + if (EEH_Debug_Tools::plainOutput()) { |
|
519 | + return $content; |
|
520 | + } |
|
521 | + return '<span style="color:#E76700">' . $content . '</span>'; |
|
522 | + } |
|
523 | + |
|
524 | + |
|
525 | + |
|
526 | + /** |
|
527 | + * @param mixed $var |
|
528 | + * @return string |
|
529 | + */ |
|
530 | + protected static function pre_span($var) |
|
531 | + { |
|
532 | + ob_start(); |
|
533 | + var_dump($var); |
|
534 | + $var = ob_get_clean(); |
|
535 | + if (EEH_Debug_Tools::plainOutput()) { |
|
536 | + return $var; |
|
537 | + } |
|
538 | + return '<pre style="color:#999; padding:1em; background: #fff">' . $var . '</pre>'; |
|
539 | + } |
|
540 | + |
|
541 | + |
|
542 | + |
|
543 | + /** |
|
544 | + * @param mixed $var |
|
545 | + * @param string $var_name |
|
546 | + * @param string $file |
|
547 | + * @param int|string $line |
|
548 | + * @param int|string $heading_tag |
|
549 | + * @param bool $die |
|
550 | + */ |
|
551 | + public static function printr( |
|
552 | + $var, |
|
553 | + $var_name = '', |
|
554 | + $file = '', |
|
555 | + $line = '', |
|
556 | + $heading_tag = 5, |
|
557 | + $die = false |
|
558 | + ) { |
|
559 | + // return; |
|
560 | + $file = str_replace(rtrim(ABSPATH, '\\/'), '', $file); |
|
561 | + $margin = is_admin() ? ' 180px' : '0'; |
|
562 | + // $print_r = false; |
|
563 | + if (is_string($var)) { |
|
564 | + EEH_Debug_Tools::printv($var, $var_name, $file, $line, $heading_tag, $die, $margin); |
|
565 | + return; |
|
566 | + } |
|
567 | + if (is_object($var)) { |
|
568 | + $var_name = ! $var_name ? 'object' : $var_name; |
|
569 | + // $print_r = true; |
|
570 | + } elseif (is_array($var)) { |
|
571 | + $var_name = ! $var_name ? 'array' : $var_name; |
|
572 | + // $print_r = true; |
|
573 | + } elseif (is_numeric($var)) { |
|
574 | + $var_name = ! $var_name ? 'numeric' : $var_name; |
|
575 | + } elseif ($var === null) { |
|
576 | + $var_name = ! $var_name ? 'null' : $var_name; |
|
577 | + } |
|
578 | + $var_name = ucwords(str_replace(array('$', '_'), array('', ' '), $var_name)); |
|
579 | + $heading_tag = EEH_Debug_Tools::headingTag($heading_tag); |
|
580 | + $result = EEH_Debug_Tools::headingSpacer($heading_tag); |
|
581 | + $result .= EEH_Debug_Tools::heading($var_name, $heading_tag, $margin, $line); |
|
582 | + $result .= EEH_Debug_Tools::grey_span(' : ') . EEH_Debug_Tools::orange_span( |
|
583 | + EEH_Debug_Tools::pre_span($var) |
|
584 | + ); |
|
585 | + $result .= EEH_Debug_Tools::file_and_line($file, $line, $heading_tag); |
|
586 | + $result .= EEH_Debug_Tools::headingX($heading_tag); |
|
587 | + if ($die) { |
|
588 | + die($result); |
|
589 | + } |
|
590 | + echo $result; |
|
591 | + } |
|
592 | + |
|
593 | + |
|
594 | + |
|
595 | + /******************** deprecated ********************/ |
|
596 | + |
|
597 | + |
|
598 | + |
|
599 | + /** |
|
600 | + * @deprecated 4.9.39.rc.034 |
|
601 | + */ |
|
602 | + public function reset_times() |
|
603 | + { |
|
604 | + Benchmark::resetTimes(); |
|
605 | + } |
|
606 | + |
|
607 | + |
|
608 | + |
|
609 | + /** |
|
610 | + * @deprecated 4.9.39.rc.034 |
|
611 | + * @param null $timer_name |
|
612 | + */ |
|
613 | + public function start_timer($timer_name = null) |
|
614 | + { |
|
615 | + Benchmark::startTimer($timer_name); |
|
616 | + } |
|
617 | + |
|
618 | + |
|
619 | + |
|
620 | + /** |
|
621 | + * @deprecated 4.9.39.rc.034 |
|
622 | + * @param string $timer_name |
|
623 | + */ |
|
624 | + public function stop_timer($timer_name = '') |
|
625 | + { |
|
626 | + Benchmark::stopTimer($timer_name); |
|
627 | + } |
|
628 | + |
|
629 | + |
|
630 | + |
|
631 | + /** |
|
632 | + * @deprecated 4.9.39.rc.034 |
|
633 | + * @param string $label The label to show for this time eg "Start of calling Some_Class::some_function" |
|
634 | + * @param boolean $output_now whether to echo now, or wait until EEH_Debug_Tools::show_times() is called |
|
635 | + * @return void |
|
636 | + */ |
|
637 | + public function measure_memory($label, $output_now = false) |
|
638 | + { |
|
639 | + Benchmark::measureMemory($label, $output_now); |
|
640 | + } |
|
641 | + |
|
642 | + |
|
643 | + |
|
644 | + /** |
|
645 | + * @deprecated 4.9.39.rc.034 |
|
646 | + * @param int $size |
|
647 | + * @return string |
|
648 | + */ |
|
649 | + public function convert($size) |
|
650 | + { |
|
651 | + return Benchmark::convert($size); |
|
652 | + } |
|
653 | + |
|
654 | + |
|
655 | + |
|
656 | + /** |
|
657 | + * @deprecated 4.9.39.rc.034 |
|
658 | + * @param bool $output_now |
|
659 | + * @return string |
|
660 | + */ |
|
661 | + public function show_times($output_now = true) |
|
662 | + { |
|
663 | + return Benchmark::displayResults($output_now); |
|
664 | + } |
|
665 | + |
|
666 | + |
|
667 | + |
|
668 | + /** |
|
669 | + * @deprecated 4.9.39.rc.034 |
|
670 | + * @param string $timer_name |
|
671 | + * @param float $total_time |
|
672 | + * @return string |
|
673 | + */ |
|
674 | + public function format_time($timer_name, $total_time) |
|
675 | + { |
|
676 | + return Benchmark::formatTime($timer_name, $total_time); |
|
677 | + } |
|
678 | 678 | } |
679 | 679 | |
680 | 680 | |
@@ -684,31 +684,31 @@ discard block |
||
684 | 684 | * Plugin URI: http://upthemes.com/plugins/kint-debugger/ |
685 | 685 | */ |
686 | 686 | if (class_exists('Kint') && ! function_exists('dump_wp_query')) { |
687 | - function dump_wp_query() |
|
688 | - { |
|
689 | - global $wp_query; |
|
690 | - d($wp_query); |
|
691 | - } |
|
687 | + function dump_wp_query() |
|
688 | + { |
|
689 | + global $wp_query; |
|
690 | + d($wp_query); |
|
691 | + } |
|
692 | 692 | } |
693 | 693 | /** |
694 | 694 | * borrowed from Kint Debugger |
695 | 695 | * Plugin URI: http://upthemes.com/plugins/kint-debugger/ |
696 | 696 | */ |
697 | 697 | if (class_exists('Kint') && ! function_exists('dump_wp')) { |
698 | - function dump_wp() |
|
699 | - { |
|
700 | - global $wp; |
|
701 | - d($wp); |
|
702 | - } |
|
698 | + function dump_wp() |
|
699 | + { |
|
700 | + global $wp; |
|
701 | + d($wp); |
|
702 | + } |
|
703 | 703 | } |
704 | 704 | /** |
705 | 705 | * borrowed from Kint Debugger |
706 | 706 | * Plugin URI: http://upthemes.com/plugins/kint-debugger/ |
707 | 707 | */ |
708 | 708 | if (class_exists('Kint') && ! function_exists('dump_post')) { |
709 | - function dump_post() |
|
710 | - { |
|
711 | - global $post; |
|
712 | - d($post); |
|
713 | - } |
|
709 | + function dump_post() |
|
710 | + { |
|
711 | + global $post; |
|
712 | + d($post); |
|
713 | + } |
|
714 | 714 | } |
@@ -51,16 +51,16 @@ discard block |
||
51 | 51 | { |
52 | 52 | $fqn = $this->getFqn($fqn); |
53 | 53 | // have we already seen this FQCN ? |
54 | - if (! array_key_exists($fqn, $this->interfaces)) { |
|
55 | - $this->interfaces[ $fqn ] = array(); |
|
54 | + if ( ! array_key_exists($fqn, $this->interfaces)) { |
|
55 | + $this->interfaces[$fqn] = array(); |
|
56 | 56 | if (class_exists($fqn)) { |
57 | - $this->interfaces[ $fqn ] = class_implements($fqn, false); |
|
58 | - $this->interfaces[ $fqn ] = $this->interfaces[ $fqn ] !== false |
|
59 | - ? $this->interfaces[ $fqn ] |
|
57 | + $this->interfaces[$fqn] = class_implements($fqn, false); |
|
58 | + $this->interfaces[$fqn] = $this->interfaces[$fqn] !== false |
|
59 | + ? $this->interfaces[$fqn] |
|
60 | 60 | : array(); |
61 | 61 | } |
62 | 62 | } |
63 | - return $this->interfaces[ $fqn ]; |
|
63 | + return $this->interfaces[$fqn]; |
|
64 | 64 | } |
65 | 65 | |
66 | 66 | |
@@ -91,13 +91,13 @@ discard block |
||
91 | 91 | // are we adding an alias for a specific class? |
92 | 92 | if ($for_class !== '') { |
93 | 93 | // make sure it's set up as an array |
94 | - if (! isset($this->aliases[ $for_class ])) { |
|
95 | - $this->aliases[ $for_class ] = array(); |
|
94 | + if ( ! isset($this->aliases[$for_class])) { |
|
95 | + $this->aliases[$for_class] = array(); |
|
96 | 96 | } |
97 | - $this->aliases[ $for_class ][ $alias ] = $fqn; |
|
97 | + $this->aliases[$for_class][$alias] = $fqn; |
|
98 | 98 | return; |
99 | 99 | } |
100 | - $this->aliases[ $alias ] = $fqn; |
|
100 | + $this->aliases[$alias] = $fqn; |
|
101 | 101 | } |
102 | 102 | |
103 | 103 | |
@@ -129,7 +129,7 @@ discard block |
||
129 | 129 | */ |
130 | 130 | protected function isDirectAlias($fqn = '') |
131 | 131 | { |
132 | - return isset($this->aliases[ (string) $fqn ]) && ! is_array($this->aliases[ (string) $fqn ]); |
|
132 | + return isset($this->aliases[(string) $fqn]) && ! is_array($this->aliases[(string) $fqn]); |
|
133 | 133 | } |
134 | 134 | |
135 | 135 | |
@@ -144,7 +144,7 @@ discard block |
||
144 | 144 | { |
145 | 145 | return ( |
146 | 146 | $for_class !== '' |
147 | - && isset($this->aliases[ (string) $for_class ][ (string) $fqn ]) |
|
147 | + && isset($this->aliases[(string) $for_class][(string) $fqn]) |
|
148 | 148 | ); |
149 | 149 | } |
150 | 150 | |
@@ -169,10 +169,10 @@ discard block |
||
169 | 169 | { |
170 | 170 | $alias = $this->getFqn($alias); |
171 | 171 | if ($this->isAliasForClass($alias, $for_class)) { |
172 | - return $this->getFqnForAlias($this->aliases[ (string) $for_class ][ (string) $alias ], $for_class); |
|
172 | + return $this->getFqnForAlias($this->aliases[(string) $for_class][(string) $alias], $for_class); |
|
173 | 173 | } |
174 | 174 | if ($this->isDirectAlias($alias)) { |
175 | - return $this->getFqnForAlias($this->aliases[ (string) $alias ], ''); |
|
175 | + return $this->getFqnForAlias($this->aliases[(string) $alias], ''); |
|
176 | 176 | } |
177 | 177 | return $alias; |
178 | 178 | } |
@@ -17,165 +17,165 @@ |
||
17 | 17 | class ClassInterfaceCache |
18 | 18 | { |
19 | 19 | |
20 | - /** |
|
21 | - * array of interfaces indexed by FQCNs where values are arrays of interface FQNs |
|
22 | - * |
|
23 | - * @var string[][] $interfaces |
|
24 | - */ |
|
25 | - private $interfaces = array(); |
|
26 | - |
|
27 | - /** |
|
28 | - * @type string[][] $aliases |
|
29 | - */ |
|
30 | - protected $aliases = array(); |
|
31 | - |
|
32 | - |
|
33 | - /** |
|
34 | - * @param string $fqn |
|
35 | - * @return string |
|
36 | - */ |
|
37 | - public function getFqn($fqn) |
|
38 | - { |
|
39 | - $fqn = $fqn instanceof FullyQualifiedName ? $fqn->string() : $fqn; |
|
40 | - return ltrim($fqn, '\\'); |
|
41 | - } |
|
42 | - |
|
43 | - |
|
44 | - /** |
|
45 | - * @param string $fqn |
|
46 | - * @return array |
|
47 | - */ |
|
48 | - public function getInterfaces($fqn) |
|
49 | - { |
|
50 | - $fqn = $this->getFqn($fqn); |
|
51 | - // have we already seen this FQCN ? |
|
52 | - if (! array_key_exists($fqn, $this->interfaces)) { |
|
53 | - $this->interfaces[ $fqn ] = array(); |
|
54 | - if (class_exists($fqn)) { |
|
55 | - $this->interfaces[ $fqn ] = class_implements($fqn, false); |
|
56 | - $this->interfaces[ $fqn ] = $this->interfaces[ $fqn ] !== false |
|
57 | - ? $this->interfaces[ $fqn ] |
|
58 | - : array(); |
|
59 | - } |
|
60 | - } |
|
61 | - return $this->interfaces[ $fqn ]; |
|
62 | - } |
|
63 | - |
|
64 | - |
|
65 | - /** |
|
66 | - * @param string $fqn |
|
67 | - * @param string $interface |
|
68 | - * @return bool |
|
69 | - */ |
|
70 | - public function hasInterface($fqn, $interface) |
|
71 | - { |
|
72 | - $fqn = $this->getFqn($fqn); |
|
73 | - $interfaces = $this->getInterfaces($fqn); |
|
74 | - return in_array($interface, $interfaces, true); |
|
75 | - } |
|
76 | - |
|
77 | - |
|
78 | - /** |
|
79 | - * adds an alias for a classname |
|
80 | - * |
|
81 | - * @param string $fqn the class name that should be used (concrete class to replace interface) |
|
82 | - * @param string $alias the class name that would be type hinted for (abstract parent or interface) |
|
83 | - * @param string $for_class the class that has the dependency (is type hinting for the interface) |
|
84 | - * @throws InvalidAliasException |
|
85 | - */ |
|
86 | - public function addAlias($fqn, $alias, $for_class = '') |
|
87 | - { |
|
88 | - $fqn = $this->getFqn($fqn); |
|
89 | - $alias = $this->getFqn($alias); |
|
90 | - if (strpos($alias, '\\') !== false && ! is_subclass_of($fqn, $alias)) { |
|
91 | - throw new InvalidAliasException($fqn, $alias); |
|
92 | - } |
|
93 | - // are we adding an alias for a specific class? |
|
94 | - if ($for_class !== '') { |
|
95 | - // make sure it's set up as an array |
|
96 | - if (! isset($this->aliases[ $for_class ])) { |
|
97 | - $this->aliases[ $for_class ] = array(); |
|
98 | - } |
|
99 | - $this->aliases[ $for_class ][ $alias ] = $fqn; |
|
100 | - return; |
|
101 | - } |
|
102 | - $this->aliases[ $alias ] = $fqn; |
|
103 | - } |
|
104 | - |
|
105 | - |
|
106 | - /** |
|
107 | - * returns TRUE if the provided FQN is an alias |
|
108 | - * |
|
109 | - * @param string $fqn |
|
110 | - * @param string $for_class |
|
111 | - * @return bool |
|
112 | - */ |
|
113 | - public function isAlias($fqn = '', $for_class = '') |
|
114 | - { |
|
115 | - $fqn = $this->getFqn($fqn); |
|
116 | - if ($this->isAliasForClass($fqn, $for_class)) { |
|
117 | - return true; |
|
118 | - } |
|
119 | - if ($this->isDirectAlias($fqn)) { |
|
120 | - return true; |
|
121 | - } |
|
122 | - return false; |
|
123 | - } |
|
124 | - |
|
125 | - |
|
126 | - /** |
|
127 | - * returns TRUE if the provided FQN is an alias |
|
128 | - * |
|
129 | - * @param string $fqn |
|
130 | - * @return bool |
|
131 | - */ |
|
132 | - protected function isDirectAlias($fqn = '') |
|
133 | - { |
|
134 | - return isset($this->aliases[ (string) $fqn ]) && ! is_array($this->aliases[ (string) $fqn ]); |
|
135 | - } |
|
136 | - |
|
137 | - |
|
138 | - /** |
|
139 | - * returns TRUE if the provided FQN is an alias for the specified class |
|
140 | - * |
|
141 | - * @param string $fqn |
|
142 | - * @param string $for_class |
|
143 | - * @return bool |
|
144 | - */ |
|
145 | - protected function isAliasForClass($fqn = '', $for_class = '') |
|
146 | - { |
|
147 | - return ( |
|
148 | - $for_class !== '' |
|
149 | - && isset($this->aliases[ (string) $for_class ][ (string) $fqn ]) |
|
150 | - ); |
|
151 | - } |
|
152 | - |
|
153 | - |
|
154 | - /** |
|
155 | - * returns FQN for provided alias if one exists, otherwise returns the original FQN |
|
156 | - * functions recursively, so that multiple aliases can be used to drill down to a FQN |
|
157 | - * for example: |
|
158 | - * if the following two entries were added to the aliases array: |
|
159 | - * array( |
|
160 | - * 'interface_alias' => 'some\namespace\interface' |
|
161 | - * 'some\namespace\interface' => 'some\namespace\classname' |
|
162 | - * ) |
|
163 | - * then one could use Loader::getNew( 'interface_alias' ) |
|
164 | - * to load an instance of 'some\namespace\classname' |
|
165 | - * |
|
166 | - * @param string $alias |
|
167 | - * @param string $for_class |
|
168 | - * @return string |
|
169 | - */ |
|
170 | - public function getFqnForAlias($alias = '', $for_class = '') |
|
171 | - { |
|
172 | - $alias = $this->getFqn($alias); |
|
173 | - if ($this->isAliasForClass($alias, $for_class)) { |
|
174 | - return $this->getFqnForAlias($this->aliases[ (string) $for_class ][ (string) $alias ], $for_class); |
|
175 | - } |
|
176 | - if ($this->isDirectAlias($alias)) { |
|
177 | - return $this->getFqnForAlias($this->aliases[ (string) $alias ], ''); |
|
178 | - } |
|
179 | - return $alias; |
|
180 | - } |
|
20 | + /** |
|
21 | + * array of interfaces indexed by FQCNs where values are arrays of interface FQNs |
|
22 | + * |
|
23 | + * @var string[][] $interfaces |
|
24 | + */ |
|
25 | + private $interfaces = array(); |
|
26 | + |
|
27 | + /** |
|
28 | + * @type string[][] $aliases |
|
29 | + */ |
|
30 | + protected $aliases = array(); |
|
31 | + |
|
32 | + |
|
33 | + /** |
|
34 | + * @param string $fqn |
|
35 | + * @return string |
|
36 | + */ |
|
37 | + public function getFqn($fqn) |
|
38 | + { |
|
39 | + $fqn = $fqn instanceof FullyQualifiedName ? $fqn->string() : $fqn; |
|
40 | + return ltrim($fqn, '\\'); |
|
41 | + } |
|
42 | + |
|
43 | + |
|
44 | + /** |
|
45 | + * @param string $fqn |
|
46 | + * @return array |
|
47 | + */ |
|
48 | + public function getInterfaces($fqn) |
|
49 | + { |
|
50 | + $fqn = $this->getFqn($fqn); |
|
51 | + // have we already seen this FQCN ? |
|
52 | + if (! array_key_exists($fqn, $this->interfaces)) { |
|
53 | + $this->interfaces[ $fqn ] = array(); |
|
54 | + if (class_exists($fqn)) { |
|
55 | + $this->interfaces[ $fqn ] = class_implements($fqn, false); |
|
56 | + $this->interfaces[ $fqn ] = $this->interfaces[ $fqn ] !== false |
|
57 | + ? $this->interfaces[ $fqn ] |
|
58 | + : array(); |
|
59 | + } |
|
60 | + } |
|
61 | + return $this->interfaces[ $fqn ]; |
|
62 | + } |
|
63 | + |
|
64 | + |
|
65 | + /** |
|
66 | + * @param string $fqn |
|
67 | + * @param string $interface |
|
68 | + * @return bool |
|
69 | + */ |
|
70 | + public function hasInterface($fqn, $interface) |
|
71 | + { |
|
72 | + $fqn = $this->getFqn($fqn); |
|
73 | + $interfaces = $this->getInterfaces($fqn); |
|
74 | + return in_array($interface, $interfaces, true); |
|
75 | + } |
|
76 | + |
|
77 | + |
|
78 | + /** |
|
79 | + * adds an alias for a classname |
|
80 | + * |
|
81 | + * @param string $fqn the class name that should be used (concrete class to replace interface) |
|
82 | + * @param string $alias the class name that would be type hinted for (abstract parent or interface) |
|
83 | + * @param string $for_class the class that has the dependency (is type hinting for the interface) |
|
84 | + * @throws InvalidAliasException |
|
85 | + */ |
|
86 | + public function addAlias($fqn, $alias, $for_class = '') |
|
87 | + { |
|
88 | + $fqn = $this->getFqn($fqn); |
|
89 | + $alias = $this->getFqn($alias); |
|
90 | + if (strpos($alias, '\\') !== false && ! is_subclass_of($fqn, $alias)) { |
|
91 | + throw new InvalidAliasException($fqn, $alias); |
|
92 | + } |
|
93 | + // are we adding an alias for a specific class? |
|
94 | + if ($for_class !== '') { |
|
95 | + // make sure it's set up as an array |
|
96 | + if (! isset($this->aliases[ $for_class ])) { |
|
97 | + $this->aliases[ $for_class ] = array(); |
|
98 | + } |
|
99 | + $this->aliases[ $for_class ][ $alias ] = $fqn; |
|
100 | + return; |
|
101 | + } |
|
102 | + $this->aliases[ $alias ] = $fqn; |
|
103 | + } |
|
104 | + |
|
105 | + |
|
106 | + /** |
|
107 | + * returns TRUE if the provided FQN is an alias |
|
108 | + * |
|
109 | + * @param string $fqn |
|
110 | + * @param string $for_class |
|
111 | + * @return bool |
|
112 | + */ |
|
113 | + public function isAlias($fqn = '', $for_class = '') |
|
114 | + { |
|
115 | + $fqn = $this->getFqn($fqn); |
|
116 | + if ($this->isAliasForClass($fqn, $for_class)) { |
|
117 | + return true; |
|
118 | + } |
|
119 | + if ($this->isDirectAlias($fqn)) { |
|
120 | + return true; |
|
121 | + } |
|
122 | + return false; |
|
123 | + } |
|
124 | + |
|
125 | + |
|
126 | + /** |
|
127 | + * returns TRUE if the provided FQN is an alias |
|
128 | + * |
|
129 | + * @param string $fqn |
|
130 | + * @return bool |
|
131 | + */ |
|
132 | + protected function isDirectAlias($fqn = '') |
|
133 | + { |
|
134 | + return isset($this->aliases[ (string) $fqn ]) && ! is_array($this->aliases[ (string) $fqn ]); |
|
135 | + } |
|
136 | + |
|
137 | + |
|
138 | + /** |
|
139 | + * returns TRUE if the provided FQN is an alias for the specified class |
|
140 | + * |
|
141 | + * @param string $fqn |
|
142 | + * @param string $for_class |
|
143 | + * @return bool |
|
144 | + */ |
|
145 | + protected function isAliasForClass($fqn = '', $for_class = '') |
|
146 | + { |
|
147 | + return ( |
|
148 | + $for_class !== '' |
|
149 | + && isset($this->aliases[ (string) $for_class ][ (string) $fqn ]) |
|
150 | + ); |
|
151 | + } |
|
152 | + |
|
153 | + |
|
154 | + /** |
|
155 | + * returns FQN for provided alias if one exists, otherwise returns the original FQN |
|
156 | + * functions recursively, so that multiple aliases can be used to drill down to a FQN |
|
157 | + * for example: |
|
158 | + * if the following two entries were added to the aliases array: |
|
159 | + * array( |
|
160 | + * 'interface_alias' => 'some\namespace\interface' |
|
161 | + * 'some\namespace\interface' => 'some\namespace\classname' |
|
162 | + * ) |
|
163 | + * then one could use Loader::getNew( 'interface_alias' ) |
|
164 | + * to load an instance of 'some\namespace\classname' |
|
165 | + * |
|
166 | + * @param string $alias |
|
167 | + * @param string $for_class |
|
168 | + * @return string |
|
169 | + */ |
|
170 | + public function getFqnForAlias($alias = '', $for_class = '') |
|
171 | + { |
|
172 | + $alias = $this->getFqn($alias); |
|
173 | + if ($this->isAliasForClass($alias, $for_class)) { |
|
174 | + return $this->getFqnForAlias($this->aliases[ (string) $for_class ][ (string) $alias ], $for_class); |
|
175 | + } |
|
176 | + if ($this->isDirectAlias($alias)) { |
|
177 | + return $this->getFqnForAlias($this->aliases[ (string) $alias ], ''); |
|
178 | + } |
|
179 | + return $alias; |
|
180 | + } |
|
181 | 181 | } |