@@ -55,7 +55,7 @@ discard block |
||
55 | 55 | */ |
56 | 56 | public function create(EE_Base_Class $entity): array |
57 | 57 | { |
58 | - if (! $entity instanceof EE_Event) { |
|
58 | + if ( ! $entity instanceof EE_Event) { |
|
59 | 59 | throw new InvalidEntityException($entity, 'EE_Event'); |
60 | 60 | } |
61 | 61 | /** @var EE_Form_Section[] $new_form_sections */ |
@@ -63,7 +63,7 @@ discard block |
||
63 | 63 | $default_form_sections = $this->form_section_model->getDefaultFormSections(); |
64 | 64 | if (is_array($default_form_sections)) { |
65 | 65 | foreach ($default_form_sections as $default_form_section) { |
66 | - if (! $default_form_section instanceof EE_Form_Section) { |
|
66 | + if ( ! $default_form_section instanceof EE_Form_Section) { |
|
67 | 67 | throw new InvalidEntityException($default_form_section, 'EE_Form_Section'); |
68 | 68 | } |
69 | 69 | // we're calling this inside the loop, because this might get set the first time around |
@@ -80,7 +80,7 @@ discard block |
||
80 | 80 | $new_form_section->setBelongsTo($top_level_form_section); |
81 | 81 | } |
82 | 82 | $new_form_section->save(); |
83 | - $new_form_sections[ $UUID ] = $new_form_section; |
|
83 | + $new_form_sections[$UUID] = $new_form_section; |
|
84 | 84 | // now retrieve, clone, and save all of the form elements |
85 | 85 | $this->createDefaultFormElements($new_form_section, $default_form_elements); |
86 | 86 | // save form section UUID on event if it is the top-level form section |
@@ -103,7 +103,7 @@ discard block |
||
103 | 103 | /** @var EE_Form_Element[] $new_form_sections */ |
104 | 104 | $new_form_elements = []; |
105 | 105 | foreach ($default_form_elements as $default_form_element) { |
106 | - if (! $default_form_element instanceof EE_Form_Element) { |
|
106 | + if ( ! $default_form_element instanceof EE_Form_Element) { |
|
107 | 107 | throw new InvalidEntityException($default_form_element, 'EE_Form_Element'); |
108 | 108 | } |
109 | 109 | // clone form_element, generate a new UUID, reset the status, then save it |
@@ -114,7 +114,7 @@ discard block |
||
114 | 114 | $new_form_element->setBelongsTo($new_form_section->UUID()); |
115 | 115 | $new_form_element->setStatus(FormStatus::ACTIVE); |
116 | 116 | $new_form_element->save(); |
117 | - $new_form_elements[ $UUID ] = $new_form_element; |
|
117 | + $new_form_elements[$UUID] = $new_form_element; |
|
118 | 118 | } |
119 | 119 | $new_form_section->setFormElements($new_form_elements); |
120 | 120 | } |
@@ -24,97 +24,97 @@ |
||
24 | 24 | */ |
25 | 25 | class DefaultFormSections implements DefaultEntityGeneratorInterface |
26 | 26 | { |
27 | - /** |
|
28 | - * @var EEM_Form_Element $form_element_model |
|
29 | - */ |
|
30 | - protected $form_element_model; |
|
27 | + /** |
|
28 | + * @var EEM_Form_Element $form_element_model |
|
29 | + */ |
|
30 | + protected $form_element_model; |
|
31 | 31 | |
32 | - /** |
|
33 | - * @var EEM_Form_Section $form_section_model |
|
34 | - */ |
|
35 | - protected $form_section_model; |
|
32 | + /** |
|
33 | + * @var EEM_Form_Section $form_section_model |
|
34 | + */ |
|
35 | + protected $form_section_model; |
|
36 | 36 | |
37 | - /** |
|
38 | - * @param EEM_Form_Element $form_element_model |
|
39 | - * @param EEM_Form_Section $form_section_model |
|
40 | - */ |
|
41 | - public function __construct(EEM_Form_Element $form_element_model, EEM_Form_Section $form_section_model) |
|
42 | - { |
|
43 | - $this->form_element_model = $form_element_model; |
|
44 | - $this->form_section_model = $form_section_model; |
|
45 | - } |
|
37 | + /** |
|
38 | + * @param EEM_Form_Element $form_element_model |
|
39 | + * @param EEM_Form_Section $form_section_model |
|
40 | + */ |
|
41 | + public function __construct(EEM_Form_Element $form_element_model, EEM_Form_Section $form_section_model) |
|
42 | + { |
|
43 | + $this->form_element_model = $form_element_model; |
|
44 | + $this->form_section_model = $form_section_model; |
|
45 | + } |
|
46 | 46 | |
47 | 47 | |
48 | - /** |
|
49 | - * @param EE_Event|EE_Base_Class $entity |
|
50 | - * @return EE_Form_Section[] |
|
51 | - * @throws EE_Error |
|
52 | - * @throws InvalidEntityException |
|
53 | - * @throws ReflectionException |
|
54 | - */ |
|
55 | - public function create(EE_Base_Class $entity): array |
|
56 | - { |
|
57 | - if (! $entity instanceof EE_Event) { |
|
58 | - throw new InvalidEntityException($entity, 'EE_Event'); |
|
59 | - } |
|
60 | - /** @var EE_Form_Section[] $new_form_sections */ |
|
61 | - $new_form_sections = []; |
|
62 | - $default_form_sections = $this->form_section_model->getDefaultFormSections(); |
|
63 | - if (is_array($default_form_sections)) { |
|
64 | - foreach ($default_form_sections as $default_form_section) { |
|
65 | - if (! $default_form_section instanceof EE_Form_Section) { |
|
66 | - throw new InvalidEntityException($default_form_section, 'EE_Form_Section'); |
|
67 | - } |
|
68 | - // we're calling this inside the loop, because this might get set the first time around |
|
69 | - // and it would always be blank for a new event if we were to call it before the loop, |
|
70 | - // and then we couldn't set the "BelongsTo" for any child form sections |
|
71 | - $top_level_form_section = $entity->registrationFormUuid(); |
|
72 | - $default_form_elements = $default_form_section->formElements(); |
|
73 | - // clone form_section, generate a new UUID, reset the status, then save it |
|
74 | - $new_form_section = clone $default_form_section; |
|
75 | - $UUID = Cuid::cuid(); |
|
76 | - $new_form_section->setUUID($UUID); |
|
77 | - $new_form_section->setStatus(FormStatus::ACTIVE); |
|
78 | - if ($top_level_form_section) { |
|
79 | - $new_form_section->setBelongsTo($top_level_form_section); |
|
80 | - } |
|
81 | - $new_form_section->save(); |
|
82 | - $new_form_sections[ $UUID ] = $new_form_section; |
|
83 | - // now retrieve, clone, and save all of the form elements |
|
84 | - $this->createDefaultFormElements($new_form_section, $default_form_elements); |
|
85 | - // save form section UUID on event if it is the top-level form section |
|
86 | - if ($new_form_section->isTopLevelFormSection()) { |
|
87 | - $entity->setRegistrationFormUuid($UUID); |
|
88 | - $entity->save(); |
|
89 | - } |
|
90 | - } |
|
91 | - } |
|
92 | - return $new_form_sections; |
|
93 | - } |
|
48 | + /** |
|
49 | + * @param EE_Event|EE_Base_Class $entity |
|
50 | + * @return EE_Form_Section[] |
|
51 | + * @throws EE_Error |
|
52 | + * @throws InvalidEntityException |
|
53 | + * @throws ReflectionException |
|
54 | + */ |
|
55 | + public function create(EE_Base_Class $entity): array |
|
56 | + { |
|
57 | + if (! $entity instanceof EE_Event) { |
|
58 | + throw new InvalidEntityException($entity, 'EE_Event'); |
|
59 | + } |
|
60 | + /** @var EE_Form_Section[] $new_form_sections */ |
|
61 | + $new_form_sections = []; |
|
62 | + $default_form_sections = $this->form_section_model->getDefaultFormSections(); |
|
63 | + if (is_array($default_form_sections)) { |
|
64 | + foreach ($default_form_sections as $default_form_section) { |
|
65 | + if (! $default_form_section instanceof EE_Form_Section) { |
|
66 | + throw new InvalidEntityException($default_form_section, 'EE_Form_Section'); |
|
67 | + } |
|
68 | + // we're calling this inside the loop, because this might get set the first time around |
|
69 | + // and it would always be blank for a new event if we were to call it before the loop, |
|
70 | + // and then we couldn't set the "BelongsTo" for any child form sections |
|
71 | + $top_level_form_section = $entity->registrationFormUuid(); |
|
72 | + $default_form_elements = $default_form_section->formElements(); |
|
73 | + // clone form_section, generate a new UUID, reset the status, then save it |
|
74 | + $new_form_section = clone $default_form_section; |
|
75 | + $UUID = Cuid::cuid(); |
|
76 | + $new_form_section->setUUID($UUID); |
|
77 | + $new_form_section->setStatus(FormStatus::ACTIVE); |
|
78 | + if ($top_level_form_section) { |
|
79 | + $new_form_section->setBelongsTo($top_level_form_section); |
|
80 | + } |
|
81 | + $new_form_section->save(); |
|
82 | + $new_form_sections[ $UUID ] = $new_form_section; |
|
83 | + // now retrieve, clone, and save all of the form elements |
|
84 | + $this->createDefaultFormElements($new_form_section, $default_form_elements); |
|
85 | + // save form section UUID on event if it is the top-level form section |
|
86 | + if ($new_form_section->isTopLevelFormSection()) { |
|
87 | + $entity->setRegistrationFormUuid($UUID); |
|
88 | + $entity->save(); |
|
89 | + } |
|
90 | + } |
|
91 | + } |
|
92 | + return $new_form_sections; |
|
93 | + } |
|
94 | 94 | |
95 | 95 | |
96 | - /** |
|
97 | - * @throws EE_Error |
|
98 | - * @throws ReflectionException |
|
99 | - */ |
|
100 | - private function createDefaultFormElements(EE_Form_Section $new_form_section, array $default_form_elements) |
|
101 | - { |
|
102 | - /** @var EE_Form_Element[] $new_form_sections */ |
|
103 | - $new_form_elements = []; |
|
104 | - foreach ($default_form_elements as $default_form_element) { |
|
105 | - if (! $default_form_element instanceof EE_Form_Element) { |
|
106 | - throw new InvalidEntityException($default_form_element, 'EE_Form_Element'); |
|
107 | - } |
|
108 | - // clone form_element, generate a new UUID, reset the status, then save it |
|
109 | - $new_form_element = clone $default_form_element; |
|
110 | - // generate a new UUID for this form section then save it |
|
111 | - $UUID = Cuid::cuid(); |
|
112 | - $new_form_element->setUUID($UUID); |
|
113 | - $new_form_element->setBelongsTo($new_form_section->UUID()); |
|
114 | - $new_form_element->setStatus(FormStatus::ACTIVE); |
|
115 | - $new_form_element->save(); |
|
116 | - $new_form_elements[ $UUID ] = $new_form_element; |
|
117 | - } |
|
118 | - $new_form_section->setFormElements($new_form_elements); |
|
119 | - } |
|
96 | + /** |
|
97 | + * @throws EE_Error |
|
98 | + * @throws ReflectionException |
|
99 | + */ |
|
100 | + private function createDefaultFormElements(EE_Form_Section $new_form_section, array $default_form_elements) |
|
101 | + { |
|
102 | + /** @var EE_Form_Element[] $new_form_sections */ |
|
103 | + $new_form_elements = []; |
|
104 | + foreach ($default_form_elements as $default_form_element) { |
|
105 | + if (! $default_form_element instanceof EE_Form_Element) { |
|
106 | + throw new InvalidEntityException($default_form_element, 'EE_Form_Element'); |
|
107 | + } |
|
108 | + // clone form_element, generate a new UUID, reset the status, then save it |
|
109 | + $new_form_element = clone $default_form_element; |
|
110 | + // generate a new UUID for this form section then save it |
|
111 | + $UUID = Cuid::cuid(); |
|
112 | + $new_form_element->setUUID($UUID); |
|
113 | + $new_form_element->setBelongsTo($new_form_section->UUID()); |
|
114 | + $new_form_element->setStatus(FormStatus::ACTIVE); |
|
115 | + $new_form_element->save(); |
|
116 | + $new_form_elements[ $UUID ] = $new_form_element; |
|
117 | + } |
|
118 | + $new_form_section->setFormElements($new_form_elements); |
|
119 | + } |
|
120 | 120 | } |
@@ -69,13 +69,13 @@ discard block |
||
69 | 69 | } |
70 | 70 | |
71 | 71 | // make sure we don't register twice |
72 | - if (isset(self::$_registry[ $addon_name ])) { |
|
72 | + if (isset(self::$_registry[$addon_name])) { |
|
73 | 73 | return true; |
74 | 74 | } |
75 | 75 | |
76 | 76 | // check that incoming $addon_name doesn't already exist. If it does then we'll create a unique reference for this template pack. |
77 | - if (isset(self::$_registry[ $addon_name ])) { |
|
78 | - $addon_name = uniqid() . '_' . $addon_name; |
|
77 | + if (isset(self::$_registry[$addon_name])) { |
|
78 | + $addon_name = uniqid().'_'.$addon_name; |
|
79 | 79 | } |
80 | 80 | |
81 | 81 | |
@@ -98,7 +98,7 @@ discard block |
||
98 | 98 | } |
99 | 99 | |
100 | 100 | if (self::_verify_class_not_exist($setup_args['classname'])) { |
101 | - self::$_registry[ $addon_name ] = [ |
|
101 | + self::$_registry[$addon_name] = [ |
|
102 | 102 | 'path' => (string) $setup_args['path'], |
103 | 103 | 'classname' => (string) $setup_args['classname'], |
104 | 104 | ]; |
@@ -151,14 +151,14 @@ discard block |
||
151 | 151 | { |
152 | 152 | foreach (self::$_registry as $args) { |
153 | 153 | // verify class_exists |
154 | - if (! class_exists($args['classname'])) { |
|
155 | - require_once($args['path'] . '/' . $args['classname'] . '.class.php'); |
|
154 | + if ( ! class_exists($args['classname'])) { |
|
155 | + require_once($args['path'].'/'.$args['classname'].'.class.php'); |
|
156 | 156 | } |
157 | 157 | |
158 | 158 | // check again! |
159 | 159 | if (class_exists($args['classname'])) { |
160 | 160 | $template_pack = new $args['classname'](); |
161 | - $template_packs[ $template_pack->dbref ] = $template_pack; |
|
161 | + $template_packs[$template_pack->dbref] = $template_pack; |
|
162 | 162 | } |
163 | 163 | } |
164 | 164 | |
@@ -208,6 +208,6 @@ discard block |
||
208 | 208 | */ |
209 | 209 | public static function deregister(string $addon_name = '') |
210 | 210 | { |
211 | - unset(self::$_registry[ $addon_name ]); |
|
211 | + unset(self::$_registry[$addon_name]); |
|
212 | 212 | } |
213 | 213 | } |
@@ -10,202 +10,202 @@ |
||
10 | 10 | */ |
11 | 11 | class EE_Register_Messages_Template_Pack implements EEI_Plugin_API |
12 | 12 | { |
13 | - /** |
|
14 | - * Holds values for registered template pack |
|
15 | - * |
|
16 | - * @since 4.5.0 |
|
17 | - * |
|
18 | - * @var array |
|
19 | - */ |
|
20 | - protected static $_registry = []; |
|
21 | - |
|
22 | - |
|
23 | - /** |
|
24 | - * Used to register a new template pack with the messages system. |
|
25 | - * |
|
26 | - * Template packs are primarily defined via class extending EE_Messages_Template_Pack and are typically used to |
|
27 | - * change entire layouts for a set of message templates. This method is used to register the new template pack and |
|
28 | - * automatically have it loaded in the appropriate places. |
|
29 | - * |
|
30 | - * This registry also verifies that there isn't already a template pack registered with the same name and if there |
|
31 | - * is then it will add an EE_Error notice. |
|
32 | - * |
|
33 | - * Note that this only handles registering the your Template Pack class with the message template pack system. |
|
34 | - * However, there is also a naming schema you must follow for templates you are providing with your template pack. |
|
35 | - * |
|
36 | - * @param string $addon_name The internal reference used to refer to this template pack. Note, this is first come, |
|
37 | - * first serve. If there is already a template pack registered with this name then the |
|
38 | - * registry will assign a unique reference for it so it can still be activated (but this |
|
39 | - * makes it harder to deregister as it will be unique per load - so its best to try to |
|
40 | - * make this a unique string!) |
|
41 | - * @param array $setup_args array { |
|
42 | - * An array of required values for registering the template pack. |
|
43 | - * @type string $path The path for the new template pack class. |
|
44 | - * @type string $classname The name of the new Template Pack Class. |
|
45 | - * } |
|
46 | - * @return bool |
|
47 | - * @throws EE_Error |
|
48 | - * |
|
49 | - * @see core/libraries/messages/defaults/default/* for all the example templates the default template pack |
|
50 | - * supports. |
|
51 | - * |
|
52 | - * |
|
53 | - * @since 4.5.0 |
|
54 | - * @see EE_Messages_Template_Pack_Default for an example class |
|
55 | - */ |
|
56 | - public static function register(string $addon_name = '', array $setup_args = []): bool |
|
57 | - { |
|
58 | - |
|
59 | - // check for required params |
|
60 | - if (empty($addon_name) || empty($setup_args['path']) || empty($setup_args['classname'])) { |
|
61 | - throw new EE_Error( |
|
62 | - esc_html__( |
|
63 | - 'In order to register a new template pack for the EE Messages system, you must include a value to reference the template pack being registered and the setup_args must have the path for the new template pack class as well as the classname for the new Template Pack Class. ', |
|
64 | - 'event_espresso' |
|
65 | - ) |
|
66 | - ); |
|
67 | - } |
|
68 | - |
|
69 | - // make sure we don't register twice |
|
70 | - if (isset(self::$_registry[ $addon_name ])) { |
|
71 | - return true; |
|
72 | - } |
|
73 | - |
|
74 | - // check that incoming $addon_name doesn't already exist. If it does then we'll create a unique reference for this template pack. |
|
75 | - if (isset(self::$_registry[ $addon_name ])) { |
|
76 | - $addon_name = uniqid() . '_' . $addon_name; |
|
77 | - } |
|
78 | - |
|
79 | - |
|
80 | - // make sure this was called in the right place! |
|
81 | - if ( |
|
82 | - ! did_action('EE_Brewing_Regular___messages_caf') |
|
83 | - || did_action('AHEE__EE_System__perform_activations_upgrades_and_migrations') |
|
84 | - ) { |
|
85 | - EE_Error::doing_it_wrong( |
|
86 | - __METHOD__, |
|
87 | - sprintf( |
|
88 | - esc_html__( |
|
89 | - 'A EE Messages Template Pack given the reference "%s" has been attempted to be registered with the EE Messages System. It may or may not work because it should be only called on the "EE_Brewing_Regular__messages_caf" hook.', |
|
90 | - 'event_espresso' |
|
91 | - ), |
|
92 | - $addon_name |
|
93 | - ), |
|
94 | - '4.5.0' |
|
95 | - ); |
|
96 | - } |
|
97 | - |
|
98 | - if (self::_verify_class_not_exist($setup_args['classname'])) { |
|
99 | - self::$_registry[ $addon_name ] = [ |
|
100 | - 'path' => (string) $setup_args['path'], |
|
101 | - 'classname' => (string) $setup_args['classname'], |
|
102 | - ]; |
|
103 | - } |
|
104 | - |
|
105 | - // hook into the system |
|
106 | - add_filter( |
|
107 | - 'FHEE__EED_Messages___set_messages_paths___MSG_PATHS', |
|
108 | - ['EE_Register_Messages_Template_Pack', 'set_template_pack_path'], |
|
109 | - 10 |
|
110 | - ); |
|
111 | - add_filter( |
|
112 | - 'FHEE__EED_Messages__get_template_packs__template_packs', |
|
113 | - ['EE_Register_Messages_Template_Pack', 'set_template_pack'], |
|
114 | - 10 |
|
115 | - ); |
|
116 | - return true; |
|
117 | - } |
|
118 | - |
|
119 | - |
|
120 | - /** |
|
121 | - * Callback for the FHEE__EED_Messages___set_messages_paths___MSG_PATHS filter. This adds this template packs path |
|
122 | - * to the messages autoloader paths. |
|
123 | - * |
|
124 | - * @param array $paths Array of paths already registered with the messages autoloader |
|
125 | - * |
|
126 | - * @return array |
|
127 | - * @since 4.5.0 |
|
128 | - * |
|
129 | - */ |
|
130 | - public static function set_template_pack_path(array $paths): array |
|
131 | - { |
|
132 | - foreach (self::$_registry as $args) { |
|
133 | - $paths[] = $args['path']; |
|
134 | - } |
|
135 | - return $paths; |
|
136 | - } |
|
137 | - |
|
138 | - |
|
139 | - /** |
|
140 | - * Callback for the FHEE__EED_Messages__get_template_packs__template_packs filter. This adds the instantiated, |
|
141 | - * registered template pack to the template packs array when requested by client code. |
|
142 | - * |
|
143 | - * @param EE_Messages_Template_Pack[] $template_packs |
|
144 | - * @return EE_Messages_Template_Pack[] |
|
145 | - * @since 4.5.0 |
|
146 | - * |
|
147 | - */ |
|
148 | - public static function set_template_pack(array $template_packs): array |
|
149 | - { |
|
150 | - foreach (self::$_registry as $args) { |
|
151 | - // verify class_exists |
|
152 | - if (! class_exists($args['classname'])) { |
|
153 | - require_once($args['path'] . '/' . $args['classname'] . '.class.php'); |
|
154 | - } |
|
155 | - |
|
156 | - // check again! |
|
157 | - if (class_exists($args['classname'])) { |
|
158 | - $template_pack = new $args['classname'](); |
|
159 | - $template_packs[ $template_pack->dbref ] = $template_pack; |
|
160 | - } |
|
161 | - } |
|
162 | - |
|
163 | - return $template_packs; |
|
164 | - } |
|
165 | - |
|
166 | - |
|
167 | - /** |
|
168 | - * This verifies that the classes for each registered template pack are unique names. |
|
169 | - * |
|
170 | - * @param string $classname The classname being checked |
|
171 | - * |
|
172 | - * @return bool |
|
173 | - */ |
|
174 | - private static function _verify_class_not_exist(string $classname): bool |
|
175 | - { |
|
176 | - // loop through the existing registry and see if the classname is already present. |
|
177 | - foreach (self::$_registry as $args) { |
|
178 | - if ($args['classname'] == $classname) { |
|
179 | - EE_Error::add_error( |
|
180 | - sprintf( |
|
181 | - esc_html__( |
|
182 | - 'The %s template pack that you just activated cannot be registered with the messages system because there is already a template pack active using the same classname. Contact the author of this template pack to let them know of the conflict. To stop seeing this message you will need to deactivate this template pack.', |
|
183 | - 'event_espresso' |
|
184 | - ), |
|
185 | - $classname |
|
186 | - ), |
|
187 | - __FILE__, |
|
188 | - __LINE__, |
|
189 | - __FUNCTION__ |
|
190 | - ); |
|
191 | - return false; |
|
192 | - } |
|
193 | - } |
|
194 | - return true; |
|
195 | - } |
|
196 | - |
|
197 | - |
|
198 | - /** |
|
199 | - * This deregisters a variation set that was previously registered with the given slug. |
|
200 | - * |
|
201 | - * @param string $addon_name The name for the variation set that was previously registered. |
|
202 | - * |
|
203 | - * @return void |
|
204 | - * @since 4.5.0 |
|
205 | - * |
|
206 | - */ |
|
207 | - public static function deregister(string $addon_name = '') |
|
208 | - { |
|
209 | - unset(self::$_registry[ $addon_name ]); |
|
210 | - } |
|
13 | + /** |
|
14 | + * Holds values for registered template pack |
|
15 | + * |
|
16 | + * @since 4.5.0 |
|
17 | + * |
|
18 | + * @var array |
|
19 | + */ |
|
20 | + protected static $_registry = []; |
|
21 | + |
|
22 | + |
|
23 | + /** |
|
24 | + * Used to register a new template pack with the messages system. |
|
25 | + * |
|
26 | + * Template packs are primarily defined via class extending EE_Messages_Template_Pack and are typically used to |
|
27 | + * change entire layouts for a set of message templates. This method is used to register the new template pack and |
|
28 | + * automatically have it loaded in the appropriate places. |
|
29 | + * |
|
30 | + * This registry also verifies that there isn't already a template pack registered with the same name and if there |
|
31 | + * is then it will add an EE_Error notice. |
|
32 | + * |
|
33 | + * Note that this only handles registering the your Template Pack class with the message template pack system. |
|
34 | + * However, there is also a naming schema you must follow for templates you are providing with your template pack. |
|
35 | + * |
|
36 | + * @param string $addon_name The internal reference used to refer to this template pack. Note, this is first come, |
|
37 | + * first serve. If there is already a template pack registered with this name then the |
|
38 | + * registry will assign a unique reference for it so it can still be activated (but this |
|
39 | + * makes it harder to deregister as it will be unique per load - so its best to try to |
|
40 | + * make this a unique string!) |
|
41 | + * @param array $setup_args array { |
|
42 | + * An array of required values for registering the template pack. |
|
43 | + * @type string $path The path for the new template pack class. |
|
44 | + * @type string $classname The name of the new Template Pack Class. |
|
45 | + * } |
|
46 | + * @return bool |
|
47 | + * @throws EE_Error |
|
48 | + * |
|
49 | + * @see core/libraries/messages/defaults/default/* for all the example templates the default template pack |
|
50 | + * supports. |
|
51 | + * |
|
52 | + * |
|
53 | + * @since 4.5.0 |
|
54 | + * @see EE_Messages_Template_Pack_Default for an example class |
|
55 | + */ |
|
56 | + public static function register(string $addon_name = '', array $setup_args = []): bool |
|
57 | + { |
|
58 | + |
|
59 | + // check for required params |
|
60 | + if (empty($addon_name) || empty($setup_args['path']) || empty($setup_args['classname'])) { |
|
61 | + throw new EE_Error( |
|
62 | + esc_html__( |
|
63 | + 'In order to register a new template pack for the EE Messages system, you must include a value to reference the template pack being registered and the setup_args must have the path for the new template pack class as well as the classname for the new Template Pack Class. ', |
|
64 | + 'event_espresso' |
|
65 | + ) |
|
66 | + ); |
|
67 | + } |
|
68 | + |
|
69 | + // make sure we don't register twice |
|
70 | + if (isset(self::$_registry[ $addon_name ])) { |
|
71 | + return true; |
|
72 | + } |
|
73 | + |
|
74 | + // check that incoming $addon_name doesn't already exist. If it does then we'll create a unique reference for this template pack. |
|
75 | + if (isset(self::$_registry[ $addon_name ])) { |
|
76 | + $addon_name = uniqid() . '_' . $addon_name; |
|
77 | + } |
|
78 | + |
|
79 | + |
|
80 | + // make sure this was called in the right place! |
|
81 | + if ( |
|
82 | + ! did_action('EE_Brewing_Regular___messages_caf') |
|
83 | + || did_action('AHEE__EE_System__perform_activations_upgrades_and_migrations') |
|
84 | + ) { |
|
85 | + EE_Error::doing_it_wrong( |
|
86 | + __METHOD__, |
|
87 | + sprintf( |
|
88 | + esc_html__( |
|
89 | + 'A EE Messages Template Pack given the reference "%s" has been attempted to be registered with the EE Messages System. It may or may not work because it should be only called on the "EE_Brewing_Regular__messages_caf" hook.', |
|
90 | + 'event_espresso' |
|
91 | + ), |
|
92 | + $addon_name |
|
93 | + ), |
|
94 | + '4.5.0' |
|
95 | + ); |
|
96 | + } |
|
97 | + |
|
98 | + if (self::_verify_class_not_exist($setup_args['classname'])) { |
|
99 | + self::$_registry[ $addon_name ] = [ |
|
100 | + 'path' => (string) $setup_args['path'], |
|
101 | + 'classname' => (string) $setup_args['classname'], |
|
102 | + ]; |
|
103 | + } |
|
104 | + |
|
105 | + // hook into the system |
|
106 | + add_filter( |
|
107 | + 'FHEE__EED_Messages___set_messages_paths___MSG_PATHS', |
|
108 | + ['EE_Register_Messages_Template_Pack', 'set_template_pack_path'], |
|
109 | + 10 |
|
110 | + ); |
|
111 | + add_filter( |
|
112 | + 'FHEE__EED_Messages__get_template_packs__template_packs', |
|
113 | + ['EE_Register_Messages_Template_Pack', 'set_template_pack'], |
|
114 | + 10 |
|
115 | + ); |
|
116 | + return true; |
|
117 | + } |
|
118 | + |
|
119 | + |
|
120 | + /** |
|
121 | + * Callback for the FHEE__EED_Messages___set_messages_paths___MSG_PATHS filter. This adds this template packs path |
|
122 | + * to the messages autoloader paths. |
|
123 | + * |
|
124 | + * @param array $paths Array of paths already registered with the messages autoloader |
|
125 | + * |
|
126 | + * @return array |
|
127 | + * @since 4.5.0 |
|
128 | + * |
|
129 | + */ |
|
130 | + public static function set_template_pack_path(array $paths): array |
|
131 | + { |
|
132 | + foreach (self::$_registry as $args) { |
|
133 | + $paths[] = $args['path']; |
|
134 | + } |
|
135 | + return $paths; |
|
136 | + } |
|
137 | + |
|
138 | + |
|
139 | + /** |
|
140 | + * Callback for the FHEE__EED_Messages__get_template_packs__template_packs filter. This adds the instantiated, |
|
141 | + * registered template pack to the template packs array when requested by client code. |
|
142 | + * |
|
143 | + * @param EE_Messages_Template_Pack[] $template_packs |
|
144 | + * @return EE_Messages_Template_Pack[] |
|
145 | + * @since 4.5.0 |
|
146 | + * |
|
147 | + */ |
|
148 | + public static function set_template_pack(array $template_packs): array |
|
149 | + { |
|
150 | + foreach (self::$_registry as $args) { |
|
151 | + // verify class_exists |
|
152 | + if (! class_exists($args['classname'])) { |
|
153 | + require_once($args['path'] . '/' . $args['classname'] . '.class.php'); |
|
154 | + } |
|
155 | + |
|
156 | + // check again! |
|
157 | + if (class_exists($args['classname'])) { |
|
158 | + $template_pack = new $args['classname'](); |
|
159 | + $template_packs[ $template_pack->dbref ] = $template_pack; |
|
160 | + } |
|
161 | + } |
|
162 | + |
|
163 | + return $template_packs; |
|
164 | + } |
|
165 | + |
|
166 | + |
|
167 | + /** |
|
168 | + * This verifies that the classes for each registered template pack are unique names. |
|
169 | + * |
|
170 | + * @param string $classname The classname being checked |
|
171 | + * |
|
172 | + * @return bool |
|
173 | + */ |
|
174 | + private static function _verify_class_not_exist(string $classname): bool |
|
175 | + { |
|
176 | + // loop through the existing registry and see if the classname is already present. |
|
177 | + foreach (self::$_registry as $args) { |
|
178 | + if ($args['classname'] == $classname) { |
|
179 | + EE_Error::add_error( |
|
180 | + sprintf( |
|
181 | + esc_html__( |
|
182 | + 'The %s template pack that you just activated cannot be registered with the messages system because there is already a template pack active using the same classname. Contact the author of this template pack to let them know of the conflict. To stop seeing this message you will need to deactivate this template pack.', |
|
183 | + 'event_espresso' |
|
184 | + ), |
|
185 | + $classname |
|
186 | + ), |
|
187 | + __FILE__, |
|
188 | + __LINE__, |
|
189 | + __FUNCTION__ |
|
190 | + ); |
|
191 | + return false; |
|
192 | + } |
|
193 | + } |
|
194 | + return true; |
|
195 | + } |
|
196 | + |
|
197 | + |
|
198 | + /** |
|
199 | + * This deregisters a variation set that was previously registered with the given slug. |
|
200 | + * |
|
201 | + * @param string $addon_name The name for the variation set that was previously registered. |
|
202 | + * |
|
203 | + * @return void |
|
204 | + * @since 4.5.0 |
|
205 | + * |
|
206 | + */ |
|
207 | + public static function deregister(string $addon_name = '') |
|
208 | + { |
|
209 | + unset(self::$_registry[ $addon_name ]); |
|
210 | + } |
|
211 | 211 | } |
@@ -55,7 +55,7 @@ discard block |
||
55 | 55 | $UUID = $section->UUID(); |
56 | 56 | |
57 | 57 | // Avoid duplicates, if any |
58 | - $sections[ $UUID ] = [ |
|
58 | + $sections[$UUID] = [ |
|
59 | 59 | 'id' => $UUID, |
60 | 60 | 'appliesTo' => GQLUtils::formatEnumKey($section->appliesTo()), |
61 | 61 | 'attributes' => $section->attributes()->toJson(), |
@@ -85,7 +85,7 @@ discard block |
||
85 | 85 | $UUID = $element->UUID(); |
86 | 86 | |
87 | 87 | // Avoid duplicates |
88 | - $elements[ $UUID ] = [ |
|
88 | + $elements[$UUID] = [ |
|
89 | 89 | 'id' => $UUID, |
90 | 90 | 'adminOnly' => $element->adminOnly(), |
91 | 91 | 'attributes' => $element->attributes()->toJson(), |
@@ -23,87 +23,87 @@ |
||
23 | 23 | */ |
24 | 24 | class FormBuilder implements EventEditorDataInterface |
25 | 25 | { |
26 | - /** |
|
27 | - * @param int $eventId |
|
28 | - * @return array |
|
29 | - * @throws EE_Error |
|
30 | - * @throws ReflectionException |
|
31 | - */ |
|
32 | - public function getData(int $eventId): array |
|
33 | - { |
|
34 | - /** @var EE_Event $event */ |
|
35 | - $event = EEM_Event::instance()->get_one_by_ID($eventId); |
|
36 | - $topLevelSectionId = $event->registrationFormUuid(); |
|
26 | + /** |
|
27 | + * @param int $eventId |
|
28 | + * @return array |
|
29 | + * @throws EE_Error |
|
30 | + * @throws ReflectionException |
|
31 | + */ |
|
32 | + public function getData(int $eventId): array |
|
33 | + { |
|
34 | + /** @var EE_Event $event */ |
|
35 | + $event = EEM_Event::instance()->get_one_by_ID($eventId); |
|
36 | + $topLevelSectionId = $event->registrationFormUuid(); |
|
37 | 37 | |
38 | - /** @var EE_Form_Section[] $form_sections */ |
|
39 | - $form_sections = EEM_Form_Section::instance()->get_all([ |
|
40 | - [ |
|
41 | - 'OR' => [ |
|
42 | - 'FSC_UUID' => $topLevelSectionId, // top level form |
|
43 | - 'FSC_belongsTo' => $topLevelSectionId, // child form sections |
|
44 | - 'FSC_status' => FormStatus::SHARED, // shared form sections |
|
45 | - ] |
|
46 | - ], |
|
47 | - 'order_by' => ['FSC_order' => 'ASC'], |
|
48 | - ]); |
|
38 | + /** @var EE_Form_Section[] $form_sections */ |
|
39 | + $form_sections = EEM_Form_Section::instance()->get_all([ |
|
40 | + [ |
|
41 | + 'OR' => [ |
|
42 | + 'FSC_UUID' => $topLevelSectionId, // top level form |
|
43 | + 'FSC_belongsTo' => $topLevelSectionId, // child form sections |
|
44 | + 'FSC_status' => FormStatus::SHARED, // shared form sections |
|
45 | + ] |
|
46 | + ], |
|
47 | + 'order_by' => ['FSC_order' => 'ASC'], |
|
48 | + ]); |
|
49 | 49 | |
50 | - $sections = []; |
|
51 | - foreach ($form_sections as $section) { |
|
52 | - if ($section instanceof EE_Form_Section) { |
|
53 | - $UUID = $section->UUID(); |
|
50 | + $sections = []; |
|
51 | + foreach ($form_sections as $section) { |
|
52 | + if ($section instanceof EE_Form_Section) { |
|
53 | + $UUID = $section->UUID(); |
|
54 | 54 | |
55 | - // Avoid duplicates, if any |
|
56 | - $sections[ $UUID ] = [ |
|
57 | - 'id' => $UUID, |
|
58 | - 'appliesTo' => GQLUtils::formatEnumKey($section->appliesTo()), |
|
59 | - 'attributes' => $section->attributes()->toJson(), |
|
60 | - 'belongsTo' => $section->belongsTo(), |
|
61 | - 'isActive' => $section->isActive(), |
|
62 | - 'isArchived' => $section->isArchived(), |
|
63 | - 'isDefault' => $section->isDefault(), |
|
64 | - 'isShared' => $section->isShared(), |
|
65 | - 'isTrashed' => $section->isTrashed(), |
|
66 | - 'label' => $section->label()->toJson(), |
|
67 | - 'order' => $section->order(), |
|
68 | - 'status' => GQLUtils::formatEnumKey($section->status()), |
|
69 | - ]; |
|
70 | - } |
|
71 | - } |
|
55 | + // Avoid duplicates, if any |
|
56 | + $sections[ $UUID ] = [ |
|
57 | + 'id' => $UUID, |
|
58 | + 'appliesTo' => GQLUtils::formatEnumKey($section->appliesTo()), |
|
59 | + 'attributes' => $section->attributes()->toJson(), |
|
60 | + 'belongsTo' => $section->belongsTo(), |
|
61 | + 'isActive' => $section->isActive(), |
|
62 | + 'isArchived' => $section->isArchived(), |
|
63 | + 'isDefault' => $section->isDefault(), |
|
64 | + 'isShared' => $section->isShared(), |
|
65 | + 'isTrashed' => $section->isTrashed(), |
|
66 | + 'label' => $section->label()->toJson(), |
|
67 | + 'order' => $section->order(), |
|
68 | + 'status' => GQLUtils::formatEnumKey($section->status()), |
|
69 | + ]; |
|
70 | + } |
|
71 | + } |
|
72 | 72 | |
73 | - /** @var EE_Form_Element[] $form_elements */ |
|
74 | - $form_elements = EEM_Form_Element::instance()->get_all([ |
|
75 | - [ |
|
76 | - 'FSC_UUID' => ['IN', array_keys($sections)] |
|
77 | - ] |
|
78 | - ]); |
|
73 | + /** @var EE_Form_Element[] $form_elements */ |
|
74 | + $form_elements = EEM_Form_Element::instance()->get_all([ |
|
75 | + [ |
|
76 | + 'FSC_UUID' => ['IN', array_keys($sections)] |
|
77 | + ] |
|
78 | + ]); |
|
79 | 79 | |
80 | - $elements = []; |
|
81 | - foreach ($form_elements as $element) { |
|
82 | - if ($element instanceof EE_Form_Element) { |
|
83 | - $UUID = $element->UUID(); |
|
80 | + $elements = []; |
|
81 | + foreach ($form_elements as $element) { |
|
82 | + if ($element instanceof EE_Form_Element) { |
|
83 | + $UUID = $element->UUID(); |
|
84 | 84 | |
85 | - // Avoid duplicates |
|
86 | - $elements[ $UUID ] = [ |
|
87 | - 'id' => $UUID, |
|
88 | - 'adminOnly' => $element->adminOnly(), |
|
89 | - 'attributes' => $element->attributes()->toJson(), |
|
90 | - 'belongsTo' => $element->belongsTo(), |
|
91 | - 'helpText' => $element->helpText()->toJson(), |
|
92 | - 'label' => $element->label()->toJson(), |
|
93 | - 'mapsTo' => $element->mapsTo(), |
|
94 | - 'options' => $element->options()->toJson(), |
|
95 | - 'order' => $element->order(), |
|
96 | - 'required' => $element->required()->toJson(), |
|
97 | - 'status' => GQLUtils::formatEnumKey($element->status()), |
|
98 | - 'type' => GQLUtils::formatEnumKey($element->type()), |
|
99 | - ]; |
|
100 | - } |
|
101 | - } |
|
85 | + // Avoid duplicates |
|
86 | + $elements[ $UUID ] = [ |
|
87 | + 'id' => $UUID, |
|
88 | + 'adminOnly' => $element->adminOnly(), |
|
89 | + 'attributes' => $element->attributes()->toJson(), |
|
90 | + 'belongsTo' => $element->belongsTo(), |
|
91 | + 'helpText' => $element->helpText()->toJson(), |
|
92 | + 'label' => $element->label()->toJson(), |
|
93 | + 'mapsTo' => $element->mapsTo(), |
|
94 | + 'options' => $element->options()->toJson(), |
|
95 | + 'order' => $element->order(), |
|
96 | + 'required' => $element->required()->toJson(), |
|
97 | + 'status' => GQLUtils::formatEnumKey($element->status()), |
|
98 | + 'type' => GQLUtils::formatEnumKey($element->type()), |
|
99 | + ]; |
|
100 | + } |
|
101 | + } |
|
102 | 102 | |
103 | - return [ |
|
104 | - 'elements' => array_values($elements), |
|
105 | - 'sections' => array_values($sections), |
|
106 | - 'topLevelSectionId' => $event->registrationFormUuid() |
|
107 | - ]; |
|
108 | - } |
|
103 | + return [ |
|
104 | + 'elements' => array_values($elements), |
|
105 | + 'sections' => array_values($sections), |
|
106 | + 'topLevelSectionId' => $event->registrationFormUuid() |
|
107 | + ]; |
|
108 | + } |
|
109 | 109 | } |
@@ -4,61 +4,61 @@ |
||
4 | 4 | |
5 | 5 | class Text |
6 | 6 | { |
7 | - /** |
|
8 | - * indicates that the HTML input type is 'email' |
|
9 | - */ |
|
10 | - public const TYPE_EMAIL = 'email'; |
|
7 | + /** |
|
8 | + * indicates that the HTML input type is 'email' |
|
9 | + */ |
|
10 | + public const TYPE_EMAIL = 'email'; |
|
11 | 11 | |
12 | - /** |
|
13 | - * indicates that the input is used to confirm an email address |
|
14 | - */ |
|
15 | - public const TYPE_EMAIL_CONFIRMATION = 'email-confirmation'; |
|
12 | + /** |
|
13 | + * indicates that the input is used to confirm an email address |
|
14 | + */ |
|
15 | + public const TYPE_EMAIL_CONFIRMATION = 'email-confirmation'; |
|
16 | 16 | |
17 | - /** |
|
18 | - * indicates that the HTML input type is 'text' |
|
19 | - */ |
|
20 | - public const TYPE_TEXT = 'text'; |
|
17 | + /** |
|
18 | + * indicates that the HTML input type is 'text' |
|
19 | + */ |
|
20 | + public const TYPE_TEXT = 'text'; |
|
21 | 21 | |
22 | - /** |
|
23 | - * indicates that the input is a TEXTAREA that only allows plain text |
|
24 | - */ |
|
25 | - public const TYPE_TEXTAREA = 'textarea'; |
|
22 | + /** |
|
23 | + * indicates that the input is a TEXTAREA that only allows plain text |
|
24 | + */ |
|
25 | + public const TYPE_TEXTAREA = 'textarea'; |
|
26 | 26 | |
27 | - /** |
|
28 | - * indicates that the input is a TEXTAREA that allows simple html |
|
29 | - */ |
|
30 | - public const TYPE_TEXTAREA_HTML = 'textarea-html'; |
|
27 | + /** |
|
28 | + * indicates that the input is a TEXTAREA that allows simple html |
|
29 | + */ |
|
30 | + public const TYPE_TEXTAREA_HTML = 'textarea-html'; |
|
31 | 31 | |
32 | 32 | |
33 | - /** |
|
34 | - * @var array |
|
35 | - */ |
|
36 | - private $valid_type_options; |
|
33 | + /** |
|
34 | + * @var array |
|
35 | + */ |
|
36 | + private $valid_type_options; |
|
37 | 37 | |
38 | 38 | |
39 | - public function __construct() |
|
40 | - { |
|
41 | - $this->valid_type_options = apply_filters( |
|
42 | - 'FHEE__EventEspresso_core_services_form_meta_inputs_Text__valid_type_options', |
|
43 | - [ |
|
44 | - Text::TYPE_EMAIL => esc_html__('Email', 'event_espresso'), |
|
45 | - Text::TYPE_EMAIL_CONFIRMATION => esc_html__('Email Confirmation', 'event_espresso'), |
|
46 | - Text::TYPE_TEXT => esc_html__('Plain Text', 'event_espresso'), |
|
47 | - Text::TYPE_TEXTAREA => esc_html__('Plain Textarea', 'event_espresso'), |
|
48 | - Text::TYPE_TEXTAREA_HTML => esc_html__('Simple HTML Textarea', 'event_espresso'), |
|
49 | - ] |
|
50 | - ); |
|
51 | - } |
|
39 | + public function __construct() |
|
40 | + { |
|
41 | + $this->valid_type_options = apply_filters( |
|
42 | + 'FHEE__EventEspresso_core_services_form_meta_inputs_Text__valid_type_options', |
|
43 | + [ |
|
44 | + Text::TYPE_EMAIL => esc_html__('Email', 'event_espresso'), |
|
45 | + Text::TYPE_EMAIL_CONFIRMATION => esc_html__('Email Confirmation', 'event_espresso'), |
|
46 | + Text::TYPE_TEXT => esc_html__('Plain Text', 'event_espresso'), |
|
47 | + Text::TYPE_TEXTAREA => esc_html__('Plain Textarea', 'event_espresso'), |
|
48 | + Text::TYPE_TEXTAREA_HTML => esc_html__('Simple HTML Textarea', 'event_espresso'), |
|
49 | + ] |
|
50 | + ); |
|
51 | + } |
|
52 | 52 | |
53 | 53 | |
54 | - /** |
|
55 | - * @param bool $constants_only |
|
56 | - * @return array |
|
57 | - */ |
|
58 | - public function validTypeOptions(bool $constants_only = false): array |
|
59 | - { |
|
60 | - return $constants_only |
|
61 | - ? array_keys($this->valid_type_options) |
|
62 | - : $this->valid_type_options; |
|
63 | - } |
|
54 | + /** |
|
55 | + * @param bool $constants_only |
|
56 | + * @return array |
|
57 | + */ |
|
58 | + public function validTypeOptions(bool $constants_only = false): array |
|
59 | + { |
|
60 | + return $constants_only |
|
61 | + ? array_keys($this->valid_type_options) |
|
62 | + : $this->valid_type_options; |
|
63 | + } |
|
64 | 64 | } |
@@ -5,90 +5,90 @@ |
||
5 | 5 | class Input |
6 | 6 | { |
7 | 7 | |
8 | - /** |
|
9 | - * indicates that the HTML input type is 'checkbox' |
|
10 | - */ |
|
11 | - public const TYPE_CHECKBOX = 'checkbox'; |
|
12 | - |
|
13 | - /** |
|
14 | - * indicates that the HTML input type is 'multi checkbox' |
|
15 | - */ |
|
16 | - public const TYPE_CHECKBOX_MULTI = 'checkbox-multi'; |
|
17 | - |
|
18 | - /** |
|
19 | - * indicates that the HTML input type is 'color' |
|
20 | - */ |
|
21 | - public const TYPE_COLOR = 'color'; |
|
22 | - |
|
23 | - /** |
|
24 | - * indicates that the HTML input type is 'file' |
|
25 | - */ |
|
26 | - public const TYPE_FILE = 'file'; |
|
27 | - |
|
28 | - /** |
|
29 | - * indicates that the HTML input type is 'hidden' |
|
30 | - */ |
|
31 | - public const TYPE_HIDDEN = 'hidden'; |
|
32 | - |
|
33 | - /** |
|
34 | - * indicates that the HTML input type is 'image' |
|
35 | - */ |
|
36 | - public const TYPE_IMAGE = 'image'; |
|
37 | - |
|
38 | - /** |
|
39 | - * indicates that the HTML input type is 'password' |
|
40 | - */ |
|
41 | - public const TYPE_PASSWORD = 'password'; |
|
42 | - |
|
43 | - /** |
|
44 | - * indicates that the input is used to confirm a password |
|
45 | - */ |
|
46 | - public const TYPE_PASSWORD_CONFIRMATION = 'password-confirmation'; |
|
47 | - |
|
48 | - /** |
|
49 | - * indicates that the HTML input type is 'radio' |
|
50 | - */ |
|
51 | - public const TYPE_RADIO = 'radio'; |
|
52 | - |
|
53 | - /** |
|
54 | - * indicates that the HTML input type is 'url' |
|
55 | - */ |
|
56 | - public const TYPE_URL = 'url'; |
|
57 | - |
|
58 | - /** |
|
59 | - * @var array |
|
60 | - */ |
|
61 | - private $valid_type_options; |
|
62 | - |
|
63 | - |
|
64 | - public function __construct() |
|
65 | - { |
|
66 | - $this->valid_type_options = apply_filters( |
|
67 | - 'FHEE__EventEspresso_core_services_form_meta_inputs_Input__valid_type_options', |
|
68 | - [ |
|
69 | - Input::TYPE_CHECKBOX => esc_html__('Checkbox', 'event_espresso'), |
|
70 | - Input::TYPE_CHECKBOX_MULTI => esc_html__('Multi Checkbox', 'event_espresso'), |
|
71 | - Input::TYPE_COLOR => esc_html__('Color Picker', 'event_espresso'), |
|
72 | - Input::TYPE_FILE => esc_html__('File Upload', 'event_espresso'), |
|
73 | - Input::TYPE_HIDDEN => esc_html__('Hidden', 'event_espresso'), |
|
74 | - Input::TYPE_IMAGE => esc_html__('Image Upload', 'event_espresso'), |
|
75 | - Input::TYPE_PASSWORD => esc_html__('Password', 'event_espresso'), |
|
76 | - Input::TYPE_PASSWORD_CONFIRMATION => esc_html__('Password Confirmation', 'event_espresso'), |
|
77 | - Input::TYPE_RADIO => esc_html__('Radio Button', 'event_espresso'), |
|
78 | - Input::TYPE_URL => esc_html__('URL', 'event_espresso'), |
|
79 | - ] |
|
80 | - ); |
|
81 | - } |
|
82 | - |
|
83 | - |
|
84 | - /** |
|
85 | - * @param bool $constants_only |
|
86 | - * @return array |
|
87 | - */ |
|
88 | - public function validTypeOptions(bool $constants_only = false): array |
|
89 | - { |
|
90 | - return $constants_only |
|
91 | - ? array_keys($this->valid_type_options) |
|
92 | - : $this->valid_type_options; |
|
93 | - } |
|
8 | + /** |
|
9 | + * indicates that the HTML input type is 'checkbox' |
|
10 | + */ |
|
11 | + public const TYPE_CHECKBOX = 'checkbox'; |
|
12 | + |
|
13 | + /** |
|
14 | + * indicates that the HTML input type is 'multi checkbox' |
|
15 | + */ |
|
16 | + public const TYPE_CHECKBOX_MULTI = 'checkbox-multi'; |
|
17 | + |
|
18 | + /** |
|
19 | + * indicates that the HTML input type is 'color' |
|
20 | + */ |
|
21 | + public const TYPE_COLOR = 'color'; |
|
22 | + |
|
23 | + /** |
|
24 | + * indicates that the HTML input type is 'file' |
|
25 | + */ |
|
26 | + public const TYPE_FILE = 'file'; |
|
27 | + |
|
28 | + /** |
|
29 | + * indicates that the HTML input type is 'hidden' |
|
30 | + */ |
|
31 | + public const TYPE_HIDDEN = 'hidden'; |
|
32 | + |
|
33 | + /** |
|
34 | + * indicates that the HTML input type is 'image' |
|
35 | + */ |
|
36 | + public const TYPE_IMAGE = 'image'; |
|
37 | + |
|
38 | + /** |
|
39 | + * indicates that the HTML input type is 'password' |
|
40 | + */ |
|
41 | + public const TYPE_PASSWORD = 'password'; |
|
42 | + |
|
43 | + /** |
|
44 | + * indicates that the input is used to confirm a password |
|
45 | + */ |
|
46 | + public const TYPE_PASSWORD_CONFIRMATION = 'password-confirmation'; |
|
47 | + |
|
48 | + /** |
|
49 | + * indicates that the HTML input type is 'radio' |
|
50 | + */ |
|
51 | + public const TYPE_RADIO = 'radio'; |
|
52 | + |
|
53 | + /** |
|
54 | + * indicates that the HTML input type is 'url' |
|
55 | + */ |
|
56 | + public const TYPE_URL = 'url'; |
|
57 | + |
|
58 | + /** |
|
59 | + * @var array |
|
60 | + */ |
|
61 | + private $valid_type_options; |
|
62 | + |
|
63 | + |
|
64 | + public function __construct() |
|
65 | + { |
|
66 | + $this->valid_type_options = apply_filters( |
|
67 | + 'FHEE__EventEspresso_core_services_form_meta_inputs_Input__valid_type_options', |
|
68 | + [ |
|
69 | + Input::TYPE_CHECKBOX => esc_html__('Checkbox', 'event_espresso'), |
|
70 | + Input::TYPE_CHECKBOX_MULTI => esc_html__('Multi Checkbox', 'event_espresso'), |
|
71 | + Input::TYPE_COLOR => esc_html__('Color Picker', 'event_espresso'), |
|
72 | + Input::TYPE_FILE => esc_html__('File Upload', 'event_espresso'), |
|
73 | + Input::TYPE_HIDDEN => esc_html__('Hidden', 'event_espresso'), |
|
74 | + Input::TYPE_IMAGE => esc_html__('Image Upload', 'event_espresso'), |
|
75 | + Input::TYPE_PASSWORD => esc_html__('Password', 'event_espresso'), |
|
76 | + Input::TYPE_PASSWORD_CONFIRMATION => esc_html__('Password Confirmation', 'event_espresso'), |
|
77 | + Input::TYPE_RADIO => esc_html__('Radio Button', 'event_espresso'), |
|
78 | + Input::TYPE_URL => esc_html__('URL', 'event_espresso'), |
|
79 | + ] |
|
80 | + ); |
|
81 | + } |
|
82 | + |
|
83 | + |
|
84 | + /** |
|
85 | + * @param bool $constants_only |
|
86 | + * @return array |
|
87 | + */ |
|
88 | + public function validTypeOptions(bool $constants_only = false): array |
|
89 | + { |
|
90 | + return $constants_only |
|
91 | + ? array_keys($this->valid_type_options) |
|
92 | + : $this->valid_type_options; |
|
93 | + } |
|
94 | 94 | } |
@@ -75,11 +75,11 @@ discard block |
||
75 | 75 | $this->setDisplayStrategy($display_strategy_name); |
76 | 76 | $this->setDefaultStep($default_step); |
77 | 77 | $this->setFormStepUrlKey($form_step_url_key); |
78 | - if (! $collection instanceof CollectionInterface) { |
|
78 | + if ( ! $collection instanceof CollectionInterface) { |
|
79 | 79 | $collection = new Collection('\EventEspresso\core\services\progress_steps\ProgressStepInterface'); |
80 | 80 | } |
81 | 81 | $this->collection = $collection; |
82 | - if (! $request instanceof RequestInterface) { |
|
82 | + if ( ! $request instanceof RequestInterface) { |
|
83 | 83 | /** @var RequestInterface $request */ |
84 | 84 | $request = LoaderFactory::getLoader()->getShared('EventEspresso\core\services\request\Request'); |
85 | 85 | } |
@@ -94,23 +94,23 @@ discard block |
||
94 | 94 | */ |
95 | 95 | protected function setDisplayStrategy($display_strategy_name = 'number_bubbles') |
96 | 96 | { |
97 | - if (! is_string($display_strategy_name)) { |
|
97 | + if ( ! is_string($display_strategy_name)) { |
|
98 | 98 | throw new InvalidDataTypeException('$display_strategy_name', $display_strategy_name, 'string'); |
99 | 99 | } |
100 | 100 | // build up FQCN from incoming display strategy folder name |
101 | 101 | $display_strategy_class = 'EventEspresso\core\services\progress_steps\display_strategies\\'; |
102 | - $display_strategy_class .= $display_strategy_name . '\\'; |
|
102 | + $display_strategy_class .= $display_strategy_name.'\\'; |
|
103 | 103 | $display_strategy_class .= str_replace(' ', '', ucwords(str_replace('_', ' ', $display_strategy_name))); |
104 | 104 | $display_strategy_class .= 'ProgressStepsDisplay'; |
105 | 105 | $display_strategy_class = apply_filters( |
106 | 106 | 'FHEE__ProgressStepManager__setDisplayStrategy__display_strategy_class', |
107 | 107 | $display_strategy_class |
108 | 108 | ); |
109 | - if (! class_exists($display_strategy_class)) { |
|
109 | + if ( ! class_exists($display_strategy_class)) { |
|
110 | 110 | throw new InvalidClassException($display_strategy_class); |
111 | 111 | } |
112 | 112 | $display_strategy = new $display_strategy_class(); |
113 | - if (! $display_strategy instanceof ProgressStepsDisplayInterface) { |
|
113 | + if ( ! $display_strategy instanceof ProgressStepsDisplayInterface) { |
|
114 | 114 | throw new InvalidClassException( |
115 | 115 | $display_strategy_class, |
116 | 116 | sprintf( |
@@ -130,7 +130,7 @@ discard block |
||
130 | 130 | */ |
131 | 131 | public function setDefaultStep($default_step) |
132 | 132 | { |
133 | - if (! is_string($default_step)) { |
|
133 | + if ( ! is_string($default_step)) { |
|
134 | 134 | throw new InvalidDataTypeException('$default_step', $default_step, 'string'); |
135 | 135 | } |
136 | 136 | $this->default_step = $default_step; |
@@ -143,7 +143,7 @@ discard block |
||
143 | 143 | */ |
144 | 144 | public function setFormStepUrlKey($form_step_url_key = 'ee-form-step') |
145 | 145 | { |
146 | - if (! is_string($form_step_url_key)) { |
|
146 | + if ( ! is_string($form_step_url_key)) { |
|
147 | 147 | throw new InvalidDataTypeException('$form_step_key', $form_step_url_key, 'string'); |
148 | 148 | } |
149 | 149 | $this->form_step_url_key = ! empty($form_step_url_key) ? $form_step_url_key : 'ee-form-step'; |
@@ -163,7 +163,7 @@ discard block |
||
163 | 163 | // grab the step previously known as current, in case we need to revert |
164 | 164 | $current_current_step = $this->collection->current(); |
165 | 165 | // verify that requested step exists |
166 | - if (! $this->collection->has($step)) { |
|
166 | + if ( ! $this->collection->has($step)) { |
|
167 | 167 | throw new InvalidIdentifierException($step, $this->default_step); |
168 | 168 | } |
169 | 169 | if ($this->collection->setCurrent($step)) { |
@@ -26,225 +26,225 @@ |
||
26 | 26 | */ |
27 | 27 | class ProgressStepManager |
28 | 28 | { |
29 | - /** |
|
30 | - * @var ProgressStepInterface[] |
|
31 | - */ |
|
32 | - private $collection; |
|
33 | - |
|
34 | - /** |
|
35 | - * @var string |
|
36 | - */ |
|
37 | - private $default_step; |
|
38 | - |
|
39 | - /** |
|
40 | - * the key used for the URL param that denotes the current form step |
|
41 | - * defaults to 'ee-form-step' |
|
42 | - * |
|
43 | - * @var string |
|
44 | - */ |
|
45 | - private $form_step_url_key = ''; |
|
46 | - |
|
47 | - /** |
|
48 | - * @var ProgressStepsDisplayInterface |
|
49 | - */ |
|
50 | - private $display_strategy; |
|
51 | - |
|
52 | - /** |
|
53 | - * @var RequestInterface |
|
54 | - */ |
|
55 | - private $request; |
|
56 | - |
|
57 | - |
|
58 | - /** |
|
59 | - * ProgressStepManager constructor |
|
60 | - * |
|
61 | - * @param string $display_strategy_name |
|
62 | - * @param string $default_step |
|
63 | - * @param string $form_step_url_key |
|
64 | - * @param CollectionInterface $collection |
|
65 | - * @param RequestInterface $request |
|
66 | - */ |
|
67 | - public function __construct( |
|
68 | - $display_strategy_name = 'number_bubbles', |
|
69 | - $default_step = '', |
|
70 | - $form_step_url_key = '', |
|
71 | - CollectionInterface $collection = null, |
|
72 | - RequestInterface $request = null |
|
73 | - ) { |
|
74 | - $this->setDisplayStrategy($display_strategy_name); |
|
75 | - $this->setDefaultStep($default_step); |
|
76 | - $this->setFormStepUrlKey($form_step_url_key); |
|
77 | - if (! $collection instanceof CollectionInterface) { |
|
78 | - $collection = new Collection('\EventEspresso\core\services\progress_steps\ProgressStepInterface'); |
|
79 | - } |
|
80 | - $this->collection = $collection; |
|
81 | - if (! $request instanceof RequestInterface) { |
|
82 | - /** @var RequestInterface $request */ |
|
83 | - $request = LoaderFactory::getLoader()->getShared('EventEspresso\core\services\request\Request'); |
|
84 | - } |
|
85 | - $this->request = $request; |
|
86 | - } |
|
87 | - |
|
88 | - |
|
89 | - /** |
|
90 | - * @param string $display_strategy_name |
|
91 | - * @throws InvalidDataTypeException |
|
92 | - * @throws InvalidClassException |
|
93 | - */ |
|
94 | - protected function setDisplayStrategy($display_strategy_name = 'number_bubbles') |
|
95 | - { |
|
96 | - if (! is_string($display_strategy_name)) { |
|
97 | - throw new InvalidDataTypeException('$display_strategy_name', $display_strategy_name, 'string'); |
|
98 | - } |
|
99 | - // build up FQCN from incoming display strategy folder name |
|
100 | - $display_strategy_class = 'EventEspresso\core\services\progress_steps\display_strategies\\'; |
|
101 | - $display_strategy_class .= $display_strategy_name . '\\'; |
|
102 | - $display_strategy_class .= str_replace(' ', '', ucwords(str_replace('_', ' ', $display_strategy_name))); |
|
103 | - $display_strategy_class .= 'ProgressStepsDisplay'; |
|
104 | - $display_strategy_class = apply_filters( |
|
105 | - 'FHEE__ProgressStepManager__setDisplayStrategy__display_strategy_class', |
|
106 | - $display_strategy_class |
|
107 | - ); |
|
108 | - if (! class_exists($display_strategy_class)) { |
|
109 | - throw new InvalidClassException($display_strategy_class); |
|
110 | - } |
|
111 | - $display_strategy = new $display_strategy_class(); |
|
112 | - if (! $display_strategy instanceof ProgressStepsDisplayInterface) { |
|
113 | - throw new InvalidClassException( |
|
114 | - $display_strategy_class, |
|
115 | - sprintf( |
|
116 | - esc_html__('The "%1$s" Class needs to be an implementation of the "%1$s" Interface.', 'event_espresso'), |
|
117 | - $display_strategy_class, |
|
118 | - '\EventEspresso\core\services\progress_steps\display_strategies\ProgressStepsDisplayInterface' |
|
119 | - ) |
|
120 | - ); |
|
121 | - } |
|
122 | - $this->display_strategy = $display_strategy; |
|
123 | - } |
|
124 | - |
|
125 | - |
|
126 | - /** |
|
127 | - * @param string $default_step |
|
128 | - * @throws InvalidDataTypeException |
|
129 | - */ |
|
130 | - public function setDefaultStep($default_step) |
|
131 | - { |
|
132 | - if (! is_string($default_step)) { |
|
133 | - throw new InvalidDataTypeException('$default_step', $default_step, 'string'); |
|
134 | - } |
|
135 | - $this->default_step = $default_step; |
|
136 | - } |
|
137 | - |
|
138 | - |
|
139 | - /** |
|
140 | - * @param string $form_step_url_key |
|
141 | - * @throws InvalidDataTypeException |
|
142 | - */ |
|
143 | - public function setFormStepUrlKey($form_step_url_key = 'ee-form-step') |
|
144 | - { |
|
145 | - if (! is_string($form_step_url_key)) { |
|
146 | - throw new InvalidDataTypeException('$form_step_key', $form_step_url_key, 'string'); |
|
147 | - } |
|
148 | - $this->form_step_url_key = ! empty($form_step_url_key) ? $form_step_url_key : 'ee-form-step'; |
|
149 | - } |
|
150 | - |
|
151 | - |
|
152 | - /** |
|
153 | - * @param string $step |
|
154 | - * @throws InvalidIdentifierException |
|
155 | - */ |
|
156 | - public function setCurrentStep($step = '') |
|
157 | - { |
|
158 | - // use incoming value if it's set, otherwise use request param if it's set, otherwise use default |
|
159 | - $step = ! empty($step) |
|
160 | - ? $step |
|
161 | - : $this->request->getRequestParam($this->form_step_url_key, $this->default_step); |
|
162 | - // grab the step previously known as current, in case we need to revert |
|
163 | - $current_current_step = $this->collection->current(); |
|
164 | - // verify that requested step exists |
|
165 | - if (! $this->collection->has($step)) { |
|
166 | - throw new InvalidIdentifierException($step, $this->default_step); |
|
167 | - } |
|
168 | - if ($this->collection->setCurrent($step)) { |
|
169 | - // if the old boss is the same as the new boss, then nothing changes |
|
170 | - if ($this->collection->current() !== $current_current_step) { |
|
171 | - $current_current_step->setIsCurrent(false); |
|
172 | - } |
|
173 | - $this->collection->current()->setIsCurrent(); |
|
174 | - } else { |
|
175 | - $this->collection->setCurrent($current_current_step->id()); |
|
176 | - $current_current_step->setIsCurrent(true); |
|
177 | - } |
|
178 | - } |
|
179 | - |
|
180 | - |
|
181 | - /** |
|
182 | - * setPreviousStepsCompleted |
|
183 | - */ |
|
184 | - public function setPreviousStepsCompleted() |
|
185 | - { |
|
186 | - $current_current_step = $this->collection->current(); |
|
187 | - $this->collection->rewind(); |
|
188 | - while ($this->collection->valid()) { |
|
189 | - if ($this->collection->current() === $current_current_step) { |
|
190 | - break; |
|
191 | - } |
|
192 | - $this->setCurrentStepCompleted(); |
|
193 | - $this->collection->next(); |
|
194 | - } |
|
195 | - $this->collection->setCurrentUsingObject($current_current_step); |
|
196 | - return false; |
|
197 | - } |
|
198 | - |
|
199 | - |
|
200 | - /** |
|
201 | - * @return ProgressStepInterface |
|
202 | - */ |
|
203 | - public function currentStep() |
|
204 | - { |
|
205 | - return $this->collection->current(); |
|
206 | - } |
|
207 | - |
|
208 | - |
|
209 | - /** |
|
210 | - * @return ProgressStepInterface |
|
211 | - */ |
|
212 | - public function nextStep() |
|
213 | - { |
|
214 | - return $this->collection->next(); |
|
215 | - } |
|
216 | - |
|
217 | - |
|
218 | - /** |
|
219 | - * @return void |
|
220 | - */ |
|
221 | - public function enqueueStylesAndScripts() |
|
222 | - { |
|
223 | - $this->display_strategy->enqueueStylesAndScripts(); |
|
224 | - } |
|
225 | - |
|
226 | - |
|
227 | - /** |
|
228 | - * echos out HTML |
|
229 | - * |
|
230 | - * @return string |
|
231 | - */ |
|
232 | - public function displaySteps() |
|
233 | - { |
|
234 | - return EEH_Template::display_template( |
|
235 | - $this->display_strategy->getTemplate(), |
|
236 | - array('progress_steps' => $this->collection), |
|
237 | - true |
|
238 | - ); |
|
239 | - } |
|
240 | - |
|
241 | - |
|
242 | - /** |
|
243 | - * @param bool $completed |
|
244 | - * @return ProgressStepInterface |
|
245 | - */ |
|
246 | - public function setCurrentStepCompleted($completed = true) |
|
247 | - { |
|
248 | - return $this->collection->current()->setIsCompleted($completed); |
|
249 | - } |
|
29 | + /** |
|
30 | + * @var ProgressStepInterface[] |
|
31 | + */ |
|
32 | + private $collection; |
|
33 | + |
|
34 | + /** |
|
35 | + * @var string |
|
36 | + */ |
|
37 | + private $default_step; |
|
38 | + |
|
39 | + /** |
|
40 | + * the key used for the URL param that denotes the current form step |
|
41 | + * defaults to 'ee-form-step' |
|
42 | + * |
|
43 | + * @var string |
|
44 | + */ |
|
45 | + private $form_step_url_key = ''; |
|
46 | + |
|
47 | + /** |
|
48 | + * @var ProgressStepsDisplayInterface |
|
49 | + */ |
|
50 | + private $display_strategy; |
|
51 | + |
|
52 | + /** |
|
53 | + * @var RequestInterface |
|
54 | + */ |
|
55 | + private $request; |
|
56 | + |
|
57 | + |
|
58 | + /** |
|
59 | + * ProgressStepManager constructor |
|
60 | + * |
|
61 | + * @param string $display_strategy_name |
|
62 | + * @param string $default_step |
|
63 | + * @param string $form_step_url_key |
|
64 | + * @param CollectionInterface $collection |
|
65 | + * @param RequestInterface $request |
|
66 | + */ |
|
67 | + public function __construct( |
|
68 | + $display_strategy_name = 'number_bubbles', |
|
69 | + $default_step = '', |
|
70 | + $form_step_url_key = '', |
|
71 | + CollectionInterface $collection = null, |
|
72 | + RequestInterface $request = null |
|
73 | + ) { |
|
74 | + $this->setDisplayStrategy($display_strategy_name); |
|
75 | + $this->setDefaultStep($default_step); |
|
76 | + $this->setFormStepUrlKey($form_step_url_key); |
|
77 | + if (! $collection instanceof CollectionInterface) { |
|
78 | + $collection = new Collection('\EventEspresso\core\services\progress_steps\ProgressStepInterface'); |
|
79 | + } |
|
80 | + $this->collection = $collection; |
|
81 | + if (! $request instanceof RequestInterface) { |
|
82 | + /** @var RequestInterface $request */ |
|
83 | + $request = LoaderFactory::getLoader()->getShared('EventEspresso\core\services\request\Request'); |
|
84 | + } |
|
85 | + $this->request = $request; |
|
86 | + } |
|
87 | + |
|
88 | + |
|
89 | + /** |
|
90 | + * @param string $display_strategy_name |
|
91 | + * @throws InvalidDataTypeException |
|
92 | + * @throws InvalidClassException |
|
93 | + */ |
|
94 | + protected function setDisplayStrategy($display_strategy_name = 'number_bubbles') |
|
95 | + { |
|
96 | + if (! is_string($display_strategy_name)) { |
|
97 | + throw new InvalidDataTypeException('$display_strategy_name', $display_strategy_name, 'string'); |
|
98 | + } |
|
99 | + // build up FQCN from incoming display strategy folder name |
|
100 | + $display_strategy_class = 'EventEspresso\core\services\progress_steps\display_strategies\\'; |
|
101 | + $display_strategy_class .= $display_strategy_name . '\\'; |
|
102 | + $display_strategy_class .= str_replace(' ', '', ucwords(str_replace('_', ' ', $display_strategy_name))); |
|
103 | + $display_strategy_class .= 'ProgressStepsDisplay'; |
|
104 | + $display_strategy_class = apply_filters( |
|
105 | + 'FHEE__ProgressStepManager__setDisplayStrategy__display_strategy_class', |
|
106 | + $display_strategy_class |
|
107 | + ); |
|
108 | + if (! class_exists($display_strategy_class)) { |
|
109 | + throw new InvalidClassException($display_strategy_class); |
|
110 | + } |
|
111 | + $display_strategy = new $display_strategy_class(); |
|
112 | + if (! $display_strategy instanceof ProgressStepsDisplayInterface) { |
|
113 | + throw new InvalidClassException( |
|
114 | + $display_strategy_class, |
|
115 | + sprintf( |
|
116 | + esc_html__('The "%1$s" Class needs to be an implementation of the "%1$s" Interface.', 'event_espresso'), |
|
117 | + $display_strategy_class, |
|
118 | + '\EventEspresso\core\services\progress_steps\display_strategies\ProgressStepsDisplayInterface' |
|
119 | + ) |
|
120 | + ); |
|
121 | + } |
|
122 | + $this->display_strategy = $display_strategy; |
|
123 | + } |
|
124 | + |
|
125 | + |
|
126 | + /** |
|
127 | + * @param string $default_step |
|
128 | + * @throws InvalidDataTypeException |
|
129 | + */ |
|
130 | + public function setDefaultStep($default_step) |
|
131 | + { |
|
132 | + if (! is_string($default_step)) { |
|
133 | + throw new InvalidDataTypeException('$default_step', $default_step, 'string'); |
|
134 | + } |
|
135 | + $this->default_step = $default_step; |
|
136 | + } |
|
137 | + |
|
138 | + |
|
139 | + /** |
|
140 | + * @param string $form_step_url_key |
|
141 | + * @throws InvalidDataTypeException |
|
142 | + */ |
|
143 | + public function setFormStepUrlKey($form_step_url_key = 'ee-form-step') |
|
144 | + { |
|
145 | + if (! is_string($form_step_url_key)) { |
|
146 | + throw new InvalidDataTypeException('$form_step_key', $form_step_url_key, 'string'); |
|
147 | + } |
|
148 | + $this->form_step_url_key = ! empty($form_step_url_key) ? $form_step_url_key : 'ee-form-step'; |
|
149 | + } |
|
150 | + |
|
151 | + |
|
152 | + /** |
|
153 | + * @param string $step |
|
154 | + * @throws InvalidIdentifierException |
|
155 | + */ |
|
156 | + public function setCurrentStep($step = '') |
|
157 | + { |
|
158 | + // use incoming value if it's set, otherwise use request param if it's set, otherwise use default |
|
159 | + $step = ! empty($step) |
|
160 | + ? $step |
|
161 | + : $this->request->getRequestParam($this->form_step_url_key, $this->default_step); |
|
162 | + // grab the step previously known as current, in case we need to revert |
|
163 | + $current_current_step = $this->collection->current(); |
|
164 | + // verify that requested step exists |
|
165 | + if (! $this->collection->has($step)) { |
|
166 | + throw new InvalidIdentifierException($step, $this->default_step); |
|
167 | + } |
|
168 | + if ($this->collection->setCurrent($step)) { |
|
169 | + // if the old boss is the same as the new boss, then nothing changes |
|
170 | + if ($this->collection->current() !== $current_current_step) { |
|
171 | + $current_current_step->setIsCurrent(false); |
|
172 | + } |
|
173 | + $this->collection->current()->setIsCurrent(); |
|
174 | + } else { |
|
175 | + $this->collection->setCurrent($current_current_step->id()); |
|
176 | + $current_current_step->setIsCurrent(true); |
|
177 | + } |
|
178 | + } |
|
179 | + |
|
180 | + |
|
181 | + /** |
|
182 | + * setPreviousStepsCompleted |
|
183 | + */ |
|
184 | + public function setPreviousStepsCompleted() |
|
185 | + { |
|
186 | + $current_current_step = $this->collection->current(); |
|
187 | + $this->collection->rewind(); |
|
188 | + while ($this->collection->valid()) { |
|
189 | + if ($this->collection->current() === $current_current_step) { |
|
190 | + break; |
|
191 | + } |
|
192 | + $this->setCurrentStepCompleted(); |
|
193 | + $this->collection->next(); |
|
194 | + } |
|
195 | + $this->collection->setCurrentUsingObject($current_current_step); |
|
196 | + return false; |
|
197 | + } |
|
198 | + |
|
199 | + |
|
200 | + /** |
|
201 | + * @return ProgressStepInterface |
|
202 | + */ |
|
203 | + public function currentStep() |
|
204 | + { |
|
205 | + return $this->collection->current(); |
|
206 | + } |
|
207 | + |
|
208 | + |
|
209 | + /** |
|
210 | + * @return ProgressStepInterface |
|
211 | + */ |
|
212 | + public function nextStep() |
|
213 | + { |
|
214 | + return $this->collection->next(); |
|
215 | + } |
|
216 | + |
|
217 | + |
|
218 | + /** |
|
219 | + * @return void |
|
220 | + */ |
|
221 | + public function enqueueStylesAndScripts() |
|
222 | + { |
|
223 | + $this->display_strategy->enqueueStylesAndScripts(); |
|
224 | + } |
|
225 | + |
|
226 | + |
|
227 | + /** |
|
228 | + * echos out HTML |
|
229 | + * |
|
230 | + * @return string |
|
231 | + */ |
|
232 | + public function displaySteps() |
|
233 | + { |
|
234 | + return EEH_Template::display_template( |
|
235 | + $this->display_strategy->getTemplate(), |
|
236 | + array('progress_steps' => $this->collection), |
|
237 | + true |
|
238 | + ); |
|
239 | + } |
|
240 | + |
|
241 | + |
|
242 | + /** |
|
243 | + * @param bool $completed |
|
244 | + * @return ProgressStepInterface |
|
245 | + */ |
|
246 | + public function setCurrentStepCompleted($completed = true) |
|
247 | + { |
|
248 | + return $this->collection->current()->setIsCompleted($completed); |
|
249 | + } |
|
250 | 250 | } |
@@ -140,7 +140,7 @@ discard block |
||
140 | 140 | */ |
141 | 141 | protected function setBaseUrl($base_url) |
142 | 142 | { |
143 | - if (! is_string($base_url)) { |
|
143 | + if ( ! is_string($base_url)) { |
|
144 | 144 | throw new InvalidDataTypeException('$base_url', $base_url, 'string'); |
145 | 145 | } |
146 | 146 | if (empty($base_url)) { |
@@ -171,7 +171,7 @@ discard block |
||
171 | 171 | */ |
172 | 172 | public function setFormStepUrlKey($form_step_url_key = 'ee-form-step') |
173 | 173 | { |
174 | - if (! is_string($form_step_url_key)) { |
|
174 | + if ( ! is_string($form_step_url_key)) { |
|
175 | 175 | throw new InvalidDataTypeException('$form_step_key', $form_step_url_key, 'string'); |
176 | 176 | } |
177 | 177 | $this->form_step_url_key = ! empty($form_step_url_key) ? $form_step_url_key : 'ee-form-step'; |
@@ -193,7 +193,7 @@ discard block |
||
193 | 193 | */ |
194 | 194 | protected function setDefaultFormStep($default_form_step) |
195 | 195 | { |
196 | - if (! is_string($default_form_step)) { |
|
196 | + if ( ! is_string($default_form_step)) { |
|
197 | 197 | throw new InvalidDataTypeException('$default_form_step', $default_form_step, 'string'); |
198 | 198 | } |
199 | 199 | $this->default_form_step = $default_form_step; |
@@ -208,7 +208,7 @@ discard block |
||
208 | 208 | protected function setCurrentStepFromRequest() |
209 | 209 | { |
210 | 210 | $current_step_slug = $this->request()->getRequestParam($this->formStepUrlKey(), $this->defaultFormStep()); |
211 | - if (! $this->form_steps->setCurrent($current_step_slug)) { |
|
211 | + if ( ! $this->form_steps->setCurrent($current_step_slug)) { |
|
212 | 212 | throw new InvalidIdentifierException( |
213 | 213 | $current_step_slug, |
214 | 214 | $this->defaultFormStep(), |
@@ -227,7 +227,7 @@ discard block |
||
227 | 227 | */ |
228 | 228 | public function getCurrentStep() |
229 | 229 | { |
230 | - if (! $this->form_steps->current() instanceof SequentialStepForm) { |
|
230 | + if ( ! $this->form_steps->current() instanceof SequentialStepForm) { |
|
231 | 231 | throw new InvalidFormHandlerException($this->form_steps->current()); |
232 | 232 | } |
233 | 233 | return $this->form_steps->current(); |
@@ -240,7 +240,7 @@ discard block |
||
240 | 240 | */ |
241 | 241 | public function formAction() |
242 | 242 | { |
243 | - if (! is_string($this->form_action) || empty($this->form_action)) { |
|
243 | + if ( ! is_string($this->form_action) || empty($this->form_action)) { |
|
244 | 244 | $this->form_action = $this->baseUrl(); |
245 | 245 | } |
246 | 246 | return $this->form_action; |
@@ -253,7 +253,7 @@ discard block |
||
253 | 253 | */ |
254 | 254 | public function setFormAction($form_action) |
255 | 255 | { |
256 | - if (! is_string($form_action)) { |
|
256 | + if ( ! is_string($form_action)) { |
|
257 | 257 | throw new InvalidDataTypeException('$form_action', $form_action, 'string'); |
258 | 258 | } |
259 | 259 | $this->form_action = $form_action; |
@@ -267,7 +267,7 @@ discard block |
||
267 | 267 | */ |
268 | 268 | public function addFormActionArgs($form_action_args = array()) |
269 | 269 | { |
270 | - if (! is_array($form_action_args)) { |
|
270 | + if ( ! is_array($form_action_args)) { |
|
271 | 271 | throw new InvalidDataTypeException('$form_action_args', $form_action_args, 'array'); |
272 | 272 | } |
273 | 273 | $form_action_args = ! empty($form_action_args) |
@@ -332,7 +332,7 @@ discard block |
||
332 | 332 | protected function getProgressStepsCollection() |
333 | 333 | { |
334 | 334 | static $collection = null; |
335 | - if (! $collection instanceof ProgressStepCollection) { |
|
335 | + if ( ! $collection instanceof ProgressStepCollection) { |
|
336 | 336 | $collection = new ProgressStepCollection(); |
337 | 337 | } |
338 | 338 | return $collection; |
@@ -354,7 +354,7 @@ discard block |
||
354 | 354 | /** @var SequentialStepForm $form_step */ |
355 | 355 | foreach ($this->form_steps as $form_step) { |
356 | 356 | // is this step active ? |
357 | - if (! $form_step->initialize()) { |
|
357 | + if ( ! $form_step->initialize()) { |
|
358 | 358 | continue; |
359 | 359 | } |
360 | 360 | $progress_steps_collection->add( |
@@ -423,7 +423,7 @@ discard block |
||
423 | 423 | { |
424 | 424 | $form_step = $this->buildCurrentStepForm(); |
425 | 425 | // no displayable content ? then skip straight to processing |
426 | - if (! $form_step->displayable()) { |
|
426 | + if ( ! $form_step->displayable()) { |
|
427 | 427 | $this->addFormActionArgs(); |
428 | 428 | $form_step->setFormAction($this->formAction()); |
429 | 429 | wp_safe_redirect($form_step->formAction()); |
@@ -499,7 +499,7 @@ discard block |
||
499 | 499 | public function displayProgressSteps($return_as_string = true) |
500 | 500 | { |
501 | 501 | $form_step = $this->getCurrentStep(); |
502 | - if (! $form_step->displayable()) { |
|
502 | + if ( ! $form_step->displayable()) { |
|
503 | 503 | return ''; |
504 | 504 | } |
505 | 505 | $progress_steps = apply_filters( |
@@ -30,583 +30,583 @@ |
||
30 | 30 | */ |
31 | 31 | abstract class SequentialStepFormManager |
32 | 32 | { |
33 | - /** |
|
34 | - * a simplified URL with no form related parameters |
|
35 | - * that will be used to build the form's redirect URLs |
|
36 | - * |
|
37 | - * @var string $base_url |
|
38 | - */ |
|
39 | - private $base_url = ''; |
|
40 | - |
|
41 | - /** |
|
42 | - * the key used for the URL param that denotes the current form step |
|
43 | - * defaults to 'ee-form-step' |
|
44 | - * |
|
45 | - * @var string $form_step_url_key |
|
46 | - */ |
|
47 | - private $form_step_url_key = ''; |
|
48 | - |
|
49 | - /** |
|
50 | - * @var string $default_form_step |
|
51 | - */ |
|
52 | - private $default_form_step = ''; |
|
53 | - |
|
54 | - /** |
|
55 | - * @var string $form_action |
|
56 | - */ |
|
57 | - private $form_action; |
|
58 | - |
|
59 | - /** |
|
60 | - * value of one of the string constant above |
|
61 | - * |
|
62 | - * @var string $form_config |
|
63 | - */ |
|
64 | - private $form_config; |
|
65 | - |
|
66 | - /** |
|
67 | - * @var string $progress_step_style |
|
68 | - */ |
|
69 | - private $progress_step_style = ''; |
|
70 | - |
|
71 | - /** |
|
72 | - * @var RequestInterface $request |
|
73 | - */ |
|
74 | - private $request; |
|
75 | - |
|
76 | - /** |
|
77 | - * @var Collection $form_steps |
|
78 | - */ |
|
79 | - protected $form_steps; |
|
80 | - |
|
81 | - /** |
|
82 | - * @var ProgressStepManager $progress_step_manager |
|
83 | - */ |
|
84 | - protected $progress_step_manager; |
|
85 | - |
|
86 | - |
|
87 | - /** |
|
88 | - * @return Collection|null |
|
89 | - */ |
|
90 | - abstract protected function getFormStepsCollection(); |
|
91 | - |
|
92 | - // phpcs:disable PEAR.Functions.ValidDefaultValue.NotAtEnd |
|
93 | - /** |
|
94 | - * StepsManager constructor |
|
95 | - * |
|
96 | - * @param string $base_url |
|
97 | - * @param string $default_form_step |
|
98 | - * @param string $form_action |
|
99 | - * @param string $form_config |
|
100 | - * @param EE_Request|RequestInterface|null $request |
|
101 | - * @param string $progress_step_style |
|
102 | - * @throws InvalidDataTypeException |
|
103 | - * @throws InvalidArgumentException |
|
104 | - */ |
|
105 | - public function __construct( |
|
106 | - $base_url, |
|
107 | - $default_form_step, |
|
108 | - $form_action = '', |
|
109 | - $form_config = FormHandler::ADD_FORM_TAGS_AND_SUBMIT, |
|
110 | - $progress_step_style = 'number_bubbles', |
|
111 | - $request = null |
|
112 | - ) { |
|
113 | - $this->setBaseUrl($base_url); |
|
114 | - $this->setDefaultFormStep($default_form_step); |
|
115 | - $this->setFormAction($form_action); |
|
116 | - $this->setFormConfig($form_config); |
|
117 | - $this->setProgressStepStyle($progress_step_style); |
|
118 | - $this->request = $request instanceof RequestInterface |
|
119 | - ? $request |
|
120 | - : LoaderFactory::getLoader()->getShared('EventEspresso\core\services\request\RequestInterface'); |
|
121 | - } |
|
122 | - |
|
123 | - |
|
124 | - /** |
|
125 | - * @return string |
|
126 | - * @throws InvalidFormHandlerException |
|
127 | - */ |
|
128 | - public function baseUrl() |
|
129 | - { |
|
130 | - if (strpos($this->base_url, $this->getCurrentStep()->slug()) === false) { |
|
131 | - add_query_arg( |
|
132 | - array($this->form_step_url_key => $this->getCurrentStep()->slug()), |
|
133 | - $this->base_url |
|
134 | - ); |
|
135 | - } |
|
136 | - return $this->base_url; |
|
137 | - } |
|
138 | - |
|
139 | - |
|
140 | - /** |
|
141 | - * @param string $base_url |
|
142 | - * @throws InvalidDataTypeException |
|
143 | - * @throws InvalidArgumentException |
|
144 | - */ |
|
145 | - protected function setBaseUrl($base_url) |
|
146 | - { |
|
147 | - if (! is_string($base_url)) { |
|
148 | - throw new InvalidDataTypeException('$base_url', $base_url, 'string'); |
|
149 | - } |
|
150 | - if (empty($base_url)) { |
|
151 | - throw new InvalidArgumentException( |
|
152 | - esc_html__('The base URL can not be an empty string.', 'event_espresso') |
|
153 | - ); |
|
154 | - } |
|
155 | - $this->base_url = $base_url; |
|
156 | - } |
|
157 | - |
|
158 | - |
|
159 | - /** |
|
160 | - * @return string |
|
161 | - * @throws InvalidDataTypeException |
|
162 | - */ |
|
163 | - public function formStepUrlKey() |
|
164 | - { |
|
165 | - if (empty($this->form_step_url_key)) { |
|
166 | - $this->setFormStepUrlKey(); |
|
167 | - } |
|
168 | - return $this->form_step_url_key; |
|
169 | - } |
|
170 | - |
|
171 | - |
|
172 | - /** |
|
173 | - * @param string $form_step_url_key |
|
174 | - * @throws InvalidDataTypeException |
|
175 | - */ |
|
176 | - public function setFormStepUrlKey($form_step_url_key = 'ee-form-step') |
|
177 | - { |
|
178 | - if (! is_string($form_step_url_key)) { |
|
179 | - throw new InvalidDataTypeException('$form_step_key', $form_step_url_key, 'string'); |
|
180 | - } |
|
181 | - $this->form_step_url_key = ! empty($form_step_url_key) ? $form_step_url_key : 'ee-form-step'; |
|
182 | - } |
|
183 | - |
|
184 | - |
|
185 | - /** |
|
186 | - * @return string |
|
187 | - */ |
|
188 | - public function defaultFormStep() |
|
189 | - { |
|
190 | - return $this->default_form_step; |
|
191 | - } |
|
192 | - |
|
193 | - |
|
194 | - /** |
|
195 | - * @param $default_form_step |
|
196 | - * @throws InvalidDataTypeException |
|
197 | - */ |
|
198 | - protected function setDefaultFormStep($default_form_step) |
|
199 | - { |
|
200 | - if (! is_string($default_form_step)) { |
|
201 | - throw new InvalidDataTypeException('$default_form_step', $default_form_step, 'string'); |
|
202 | - } |
|
203 | - $this->default_form_step = $default_form_step; |
|
204 | - } |
|
205 | - |
|
206 | - |
|
207 | - /** |
|
208 | - * @return void |
|
209 | - * @throws InvalidIdentifierException |
|
210 | - * @throws InvalidDataTypeException |
|
211 | - */ |
|
212 | - protected function setCurrentStepFromRequest() |
|
213 | - { |
|
214 | - $current_step_slug = $this->request()->getRequestParam($this->formStepUrlKey(), $this->defaultFormStep()); |
|
215 | - if (! $this->form_steps->setCurrent($current_step_slug)) { |
|
216 | - throw new InvalidIdentifierException( |
|
217 | - $current_step_slug, |
|
218 | - $this->defaultFormStep(), |
|
219 | - sprintf( |
|
220 | - esc_html__('The "%1$s" form step could not be set.', 'event_espresso'), |
|
221 | - $current_step_slug |
|
222 | - ) |
|
223 | - ); |
|
224 | - } |
|
225 | - } |
|
226 | - |
|
227 | - |
|
228 | - /** |
|
229 | - * @return SequentialStepFormInterface|object |
|
230 | - * @throws InvalidFormHandlerException |
|
231 | - */ |
|
232 | - public function getCurrentStep() |
|
233 | - { |
|
234 | - if (! $this->form_steps->current() instanceof SequentialStepForm) { |
|
235 | - throw new InvalidFormHandlerException($this->form_steps->current()); |
|
236 | - } |
|
237 | - return $this->form_steps->current(); |
|
238 | - } |
|
239 | - |
|
240 | - |
|
241 | - /** |
|
242 | - * @return string |
|
243 | - * @throws InvalidFormHandlerException |
|
244 | - */ |
|
245 | - public function formAction() |
|
246 | - { |
|
247 | - if (! is_string($this->form_action) || empty($this->form_action)) { |
|
248 | - $this->form_action = $this->baseUrl(); |
|
249 | - } |
|
250 | - return $this->form_action; |
|
251 | - } |
|
252 | - |
|
253 | - |
|
254 | - /** |
|
255 | - * @param string $form_action |
|
256 | - * @throws InvalidDataTypeException |
|
257 | - */ |
|
258 | - public function setFormAction($form_action) |
|
259 | - { |
|
260 | - if (! is_string($form_action)) { |
|
261 | - throw new InvalidDataTypeException('$form_action', $form_action, 'string'); |
|
262 | - } |
|
263 | - $this->form_action = $form_action; |
|
264 | - } |
|
265 | - |
|
266 | - |
|
267 | - /** |
|
268 | - * @param array $form_action_args |
|
269 | - * @throws InvalidDataTypeException |
|
270 | - * @throws InvalidFormHandlerException |
|
271 | - */ |
|
272 | - public function addFormActionArgs($form_action_args = array()) |
|
273 | - { |
|
274 | - if (! is_array($form_action_args)) { |
|
275 | - throw new InvalidDataTypeException('$form_action_args', $form_action_args, 'array'); |
|
276 | - } |
|
277 | - $form_action_args = ! empty($form_action_args) |
|
278 | - ? $form_action_args |
|
279 | - : array($this->formStepUrlKey() => $this->form_steps->current()->slug()); |
|
280 | - $this->getCurrentStep()->setFormAction( |
|
281 | - add_query_arg($form_action_args, $this->formAction()) |
|
282 | - ); |
|
283 | - $this->form_action = $this->getCurrentStep()->formAction(); |
|
284 | - } |
|
285 | - |
|
286 | - |
|
287 | - /** |
|
288 | - * @return string |
|
289 | - */ |
|
290 | - public function formConfig() |
|
291 | - { |
|
292 | - return $this->form_config; |
|
293 | - } |
|
294 | - |
|
295 | - |
|
296 | - /** |
|
297 | - * @param string $form_config |
|
298 | - */ |
|
299 | - public function setFormConfig($form_config) |
|
300 | - { |
|
301 | - $this->form_config = $form_config; |
|
302 | - } |
|
303 | - |
|
304 | - |
|
305 | - /** |
|
306 | - * @return string |
|
307 | - */ |
|
308 | - public function progressStepStyle() |
|
309 | - { |
|
310 | - return $this->progress_step_style; |
|
311 | - } |
|
312 | - |
|
313 | - |
|
314 | - /** |
|
315 | - * @param string $progress_step_style |
|
316 | - */ |
|
317 | - public function setProgressStepStyle($progress_step_style) |
|
318 | - { |
|
319 | - $this->progress_step_style = $progress_step_style; |
|
320 | - } |
|
321 | - |
|
322 | - |
|
323 | - /** |
|
324 | - * @return RequestInterface |
|
325 | - */ |
|
326 | - public function request() |
|
327 | - { |
|
328 | - return $this->request; |
|
329 | - } |
|
330 | - |
|
331 | - |
|
332 | - /** |
|
333 | - * @return Collection|null |
|
334 | - * @throws InvalidInterfaceException |
|
335 | - */ |
|
336 | - protected function getProgressStepsCollection() |
|
337 | - { |
|
338 | - static $collection = null; |
|
339 | - if (! $collection instanceof ProgressStepCollection) { |
|
340 | - $collection = new ProgressStepCollection(); |
|
341 | - } |
|
342 | - return $collection; |
|
343 | - } |
|
344 | - |
|
345 | - |
|
346 | - /** |
|
347 | - * @param Collection $progress_steps_collection |
|
348 | - * @return ProgressStepManager |
|
349 | - * @throws InvalidInterfaceException |
|
350 | - * @throws InvalidClassException |
|
351 | - * @throws InvalidDataTypeException |
|
352 | - * @throws InvalidEntityException |
|
353 | - * @throws InvalidFormHandlerException |
|
354 | - */ |
|
355 | - protected function generateProgressSteps(Collection $progress_steps_collection) |
|
356 | - { |
|
357 | - $current_step = $this->getCurrentStep(); |
|
358 | - /** @var SequentialStepForm $form_step */ |
|
359 | - foreach ($this->form_steps as $form_step) { |
|
360 | - // is this step active ? |
|
361 | - if (! $form_step->initialize()) { |
|
362 | - continue; |
|
363 | - } |
|
364 | - $progress_steps_collection->add( |
|
365 | - new ProgressStep( |
|
366 | - $form_step->order(), |
|
367 | - $form_step->slug(), |
|
368 | - $form_step->slug(), |
|
369 | - $form_step->formName() |
|
370 | - ), |
|
371 | - $form_step->slug() |
|
372 | - ); |
|
373 | - } |
|
374 | - // set collection pointer back to current step |
|
375 | - $this->form_steps->setCurrentUsingObject($current_step); |
|
376 | - return new ProgressStepManager( |
|
377 | - $this->progressStepStyle(), |
|
378 | - $this->defaultFormStep(), |
|
379 | - $this->formStepUrlKey(), |
|
380 | - $progress_steps_collection |
|
381 | - ); |
|
382 | - } |
|
383 | - |
|
384 | - |
|
385 | - /** |
|
386 | - * @throws InvalidClassException |
|
387 | - * @throws InvalidDataTypeException |
|
388 | - * @throws InvalidEntityException |
|
389 | - * @throws InvalidIdentifierException |
|
390 | - * @throws InvalidInterfaceException |
|
391 | - * @throws InvalidArgumentException |
|
392 | - * @throws InvalidFormHandlerException |
|
393 | - */ |
|
394 | - public function buildForm() |
|
395 | - { |
|
396 | - $this->buildCurrentStepFormForDisplay(); |
|
397 | - } |
|
398 | - |
|
399 | - |
|
400 | - /** |
|
401 | - * @param array $form_data |
|
402 | - * @throws InvalidArgumentException |
|
403 | - * @throws InvalidClassException |
|
404 | - * @throws InvalidDataTypeException |
|
405 | - * @throws InvalidEntityException |
|
406 | - * @throws InvalidFormHandlerException |
|
407 | - * @throws InvalidIdentifierException |
|
408 | - * @throws InvalidInterfaceException |
|
409 | - */ |
|
410 | - public function processForm($form_data = array()) |
|
411 | - { |
|
412 | - $this->buildCurrentStepFormForProcessing(); |
|
413 | - $this->processCurrentStepForm($form_data); |
|
414 | - } |
|
415 | - |
|
416 | - |
|
417 | - /** |
|
418 | - * @throws InvalidClassException |
|
419 | - * @throws InvalidDataTypeException |
|
420 | - * @throws InvalidEntityException |
|
421 | - * @throws InvalidInterfaceException |
|
422 | - * @throws InvalidIdentifierException |
|
423 | - * @throws InvalidArgumentException |
|
424 | - * @throws InvalidFormHandlerException |
|
425 | - */ |
|
426 | - public function buildCurrentStepFormForDisplay() |
|
427 | - { |
|
428 | - $form_step = $this->buildCurrentStepForm(); |
|
429 | - // no displayable content ? then skip straight to processing |
|
430 | - if (! $form_step->displayable()) { |
|
431 | - $this->addFormActionArgs(); |
|
432 | - $form_step->setFormAction($this->formAction()); |
|
433 | - wp_safe_redirect($form_step->formAction()); |
|
434 | - } |
|
435 | - } |
|
436 | - |
|
437 | - |
|
438 | - /** |
|
439 | - * @throws InvalidClassException |
|
440 | - * @throws InvalidDataTypeException |
|
441 | - * @throws InvalidEntityException |
|
442 | - * @throws InvalidInterfaceException |
|
443 | - * @throws InvalidIdentifierException |
|
444 | - * @throws InvalidArgumentException |
|
445 | - * @throws InvalidFormHandlerException |
|
446 | - */ |
|
447 | - public function buildCurrentStepFormForProcessing() |
|
448 | - { |
|
449 | - $this->buildCurrentStepForm(false); |
|
450 | - } |
|
451 | - |
|
452 | - |
|
453 | - /** |
|
454 | - * @param bool $for_display |
|
455 | - * @return SequentialStepFormInterface |
|
456 | - * @throws InvalidArgumentException |
|
457 | - * @throws InvalidClassException |
|
458 | - * @throws InvalidDataTypeException |
|
459 | - * @throws InvalidEntityException |
|
460 | - * @throws InvalidFormHandlerException |
|
461 | - * @throws InvalidIdentifierException |
|
462 | - * @throws InvalidInterfaceException |
|
463 | - */ |
|
464 | - private function buildCurrentStepForm($for_display = true) |
|
465 | - { |
|
466 | - $this->form_steps = $this->getFormStepsCollection(); |
|
467 | - $this->setCurrentStepFromRequest(); |
|
468 | - $form_step = $this->getCurrentStep(); |
|
469 | - if ($form_step->submitBtnText() === esc_html__('Submit', 'event_espresso')) { |
|
470 | - $form_step->setSubmitBtnText(esc_html__('Next Step', 'event_espresso')); |
|
471 | - } |
|
472 | - if ($for_display && $form_step->displayable()) { |
|
473 | - $this->progress_step_manager = $this->generateProgressSteps( |
|
474 | - $this->getProgressStepsCollection() |
|
475 | - ); |
|
476 | - $this->progress_step_manager->setCurrentStep( |
|
477 | - $form_step->slug() |
|
478 | - ); |
|
479 | - // mark all previous progress steps as completed |
|
480 | - $this->progress_step_manager->setPreviousStepsCompleted(); |
|
481 | - $this->progress_step_manager->enqueueStylesAndScripts(); |
|
482 | - $this->addFormActionArgs(); |
|
483 | - $form_step->setFormAction($this->formAction()); |
|
484 | - } else { |
|
485 | - $form_step->setRedirectUrl($this->baseUrl()); |
|
486 | - $form_step->addRedirectArgs( |
|
487 | - array($this->formStepUrlKey() => $this->form_steps->current()->slug()) |
|
488 | - ); |
|
489 | - } |
|
490 | - $form_step->generate(); |
|
491 | - if ($for_display) { |
|
492 | - $form_step->enqueueStylesAndScripts(); |
|
493 | - } |
|
494 | - return $form_step; |
|
495 | - } |
|
496 | - |
|
497 | - |
|
498 | - /** |
|
499 | - * @param bool $return_as_string |
|
500 | - * @return string |
|
501 | - * @throws InvalidFormHandlerException |
|
502 | - */ |
|
503 | - public function displayProgressSteps($return_as_string = true) |
|
504 | - { |
|
505 | - $form_step = $this->getCurrentStep(); |
|
506 | - if (! $form_step->displayable()) { |
|
507 | - return ''; |
|
508 | - } |
|
509 | - $progress_steps = apply_filters( |
|
510 | - 'FHEE__EventEspresso_core_libraries_form_sections_form_handlers_SequentialStepFormManager__displayProgressSteps__before_steps', |
|
511 | - '' |
|
512 | - ); |
|
513 | - $progress_steps .= $this->progress_step_manager->displaySteps(); |
|
514 | - $progress_steps .= apply_filters( |
|
515 | - 'FHEE__EventEspresso_core_libraries_form_sections_form_handlers_SequentialStepFormManager__displayProgressSteps__after_steps', |
|
516 | - '' |
|
517 | - ); |
|
518 | - if ($return_as_string) { |
|
519 | - return $progress_steps; |
|
520 | - } |
|
521 | - echo wp_kses($progress_steps, AllowedTags::getWithFormTags()); |
|
522 | - return ''; |
|
523 | - } |
|
524 | - |
|
525 | - |
|
526 | - /** |
|
527 | - * @param bool $return_as_string |
|
528 | - * @return string |
|
529 | - * @throws InvalidFormHandlerException |
|
530 | - */ |
|
531 | - public function displayCurrentStepForm($return_as_string = true) |
|
532 | - { |
|
533 | - if ($return_as_string) { |
|
534 | - return $this->getCurrentStep()->display(); |
|
535 | - } |
|
536 | - echo wp_kses($this->getCurrentStep()->display(), AllowedTags::getWithFormTags()); |
|
537 | - return ''; |
|
538 | - } |
|
539 | - |
|
540 | - |
|
541 | - /** |
|
542 | - * @param array $form_data |
|
543 | - * @return void |
|
544 | - * @throws InvalidArgumentException |
|
545 | - * @throws InvalidDataTypeException |
|
546 | - * @throws InvalidFormHandlerException |
|
547 | - */ |
|
548 | - public function processCurrentStepForm($form_data = array()) |
|
549 | - { |
|
550 | - // grab instance of current step because after calling next() below, |
|
551 | - // any calls to getCurrentStep() will return the "next" step because we advanced |
|
552 | - $current_step = $this->getCurrentStep(); |
|
553 | - try { |
|
554 | - // form processing should either throw exceptions or return true |
|
555 | - $current_step->process($form_data); |
|
556 | - } catch (Exception $e) { |
|
557 | - // something went wrong, convert the Exception to an EE_Error |
|
558 | - EE_Error::add_error($e->getMessage(), __FILE__, __FUNCTION__, __LINE__); |
|
559 | - // prevent redirect to next step or other if exception was thrown |
|
560 | - if ( |
|
561 | - $current_step->redirectTo() === SequentialStepForm::REDIRECT_TO_NEXT_STEP |
|
562 | - || $current_step->redirectTo() === SequentialStepForm::REDIRECT_TO_OTHER |
|
563 | - ) { |
|
564 | - $current_step->setRedirectTo(SequentialStepForm::REDIRECT_TO_CURRENT_STEP); |
|
565 | - } |
|
566 | - } |
|
567 | - // save notices to a transient so that when we redirect back |
|
568 | - // to the display portion for this step |
|
569 | - // those notices can be displayed |
|
570 | - EE_Error::get_notices(false, true); |
|
571 | - $this->redirectForm($current_step); |
|
572 | - } |
|
573 | - |
|
574 | - |
|
575 | - /** |
|
576 | - * handles where to go to next |
|
577 | - * |
|
578 | - * @param SequentialStepFormInterface $current_step |
|
579 | - * @throws InvalidArgumentException |
|
580 | - * @throws InvalidDataTypeException |
|
581 | - * @throws InvalidFormHandlerException |
|
582 | - */ |
|
583 | - public function redirectForm(SequentialStepFormInterface $current_step) |
|
584 | - { |
|
585 | - $redirect_step = $current_step; |
|
586 | - switch ($current_step->redirectTo()) { |
|
587 | - case SequentialStepForm::REDIRECT_TO_OTHER: |
|
588 | - // going somewhere else, so just check out now |
|
589 | - wp_safe_redirect($redirect_step->redirectUrl()); |
|
590 | - exit(); |
|
591 | - case SequentialStepForm::REDIRECT_TO_PREV_STEP: |
|
592 | - $redirect_step = $this->form_steps->previous(); |
|
593 | - break; |
|
594 | - case SequentialStepForm::REDIRECT_TO_NEXT_STEP: |
|
595 | - $this->form_steps->next(); |
|
596 | - if ($this->form_steps->valid()) { |
|
597 | - $redirect_step = $this->form_steps->current(); |
|
598 | - } |
|
599 | - break; |
|
600 | - case SequentialStepForm::REDIRECT_TO_CURRENT_STEP: |
|
601 | - default: |
|
602 | - // $redirect_step is already set |
|
603 | - } |
|
604 | - $current_step->setRedirectUrl($this->baseUrl()); |
|
605 | - $current_step->addRedirectArgs( |
|
606 | - // use the slug for whatever step we are redirecting too |
|
607 | - array($this->formStepUrlKey() => $redirect_step->slug()) |
|
608 | - ); |
|
609 | - wp_safe_redirect($current_step->redirectUrl()); |
|
610 | - exit(); |
|
611 | - } |
|
33 | + /** |
|
34 | + * a simplified URL with no form related parameters |
|
35 | + * that will be used to build the form's redirect URLs |
|
36 | + * |
|
37 | + * @var string $base_url |
|
38 | + */ |
|
39 | + private $base_url = ''; |
|
40 | + |
|
41 | + /** |
|
42 | + * the key used for the URL param that denotes the current form step |
|
43 | + * defaults to 'ee-form-step' |
|
44 | + * |
|
45 | + * @var string $form_step_url_key |
|
46 | + */ |
|
47 | + private $form_step_url_key = ''; |
|
48 | + |
|
49 | + /** |
|
50 | + * @var string $default_form_step |
|
51 | + */ |
|
52 | + private $default_form_step = ''; |
|
53 | + |
|
54 | + /** |
|
55 | + * @var string $form_action |
|
56 | + */ |
|
57 | + private $form_action; |
|
58 | + |
|
59 | + /** |
|
60 | + * value of one of the string constant above |
|
61 | + * |
|
62 | + * @var string $form_config |
|
63 | + */ |
|
64 | + private $form_config; |
|
65 | + |
|
66 | + /** |
|
67 | + * @var string $progress_step_style |
|
68 | + */ |
|
69 | + private $progress_step_style = ''; |
|
70 | + |
|
71 | + /** |
|
72 | + * @var RequestInterface $request |
|
73 | + */ |
|
74 | + private $request; |
|
75 | + |
|
76 | + /** |
|
77 | + * @var Collection $form_steps |
|
78 | + */ |
|
79 | + protected $form_steps; |
|
80 | + |
|
81 | + /** |
|
82 | + * @var ProgressStepManager $progress_step_manager |
|
83 | + */ |
|
84 | + protected $progress_step_manager; |
|
85 | + |
|
86 | + |
|
87 | + /** |
|
88 | + * @return Collection|null |
|
89 | + */ |
|
90 | + abstract protected function getFormStepsCollection(); |
|
91 | + |
|
92 | + // phpcs:disable PEAR.Functions.ValidDefaultValue.NotAtEnd |
|
93 | + /** |
|
94 | + * StepsManager constructor |
|
95 | + * |
|
96 | + * @param string $base_url |
|
97 | + * @param string $default_form_step |
|
98 | + * @param string $form_action |
|
99 | + * @param string $form_config |
|
100 | + * @param EE_Request|RequestInterface|null $request |
|
101 | + * @param string $progress_step_style |
|
102 | + * @throws InvalidDataTypeException |
|
103 | + * @throws InvalidArgumentException |
|
104 | + */ |
|
105 | + public function __construct( |
|
106 | + $base_url, |
|
107 | + $default_form_step, |
|
108 | + $form_action = '', |
|
109 | + $form_config = FormHandler::ADD_FORM_TAGS_AND_SUBMIT, |
|
110 | + $progress_step_style = 'number_bubbles', |
|
111 | + $request = null |
|
112 | + ) { |
|
113 | + $this->setBaseUrl($base_url); |
|
114 | + $this->setDefaultFormStep($default_form_step); |
|
115 | + $this->setFormAction($form_action); |
|
116 | + $this->setFormConfig($form_config); |
|
117 | + $this->setProgressStepStyle($progress_step_style); |
|
118 | + $this->request = $request instanceof RequestInterface |
|
119 | + ? $request |
|
120 | + : LoaderFactory::getLoader()->getShared('EventEspresso\core\services\request\RequestInterface'); |
|
121 | + } |
|
122 | + |
|
123 | + |
|
124 | + /** |
|
125 | + * @return string |
|
126 | + * @throws InvalidFormHandlerException |
|
127 | + */ |
|
128 | + public function baseUrl() |
|
129 | + { |
|
130 | + if (strpos($this->base_url, $this->getCurrentStep()->slug()) === false) { |
|
131 | + add_query_arg( |
|
132 | + array($this->form_step_url_key => $this->getCurrentStep()->slug()), |
|
133 | + $this->base_url |
|
134 | + ); |
|
135 | + } |
|
136 | + return $this->base_url; |
|
137 | + } |
|
138 | + |
|
139 | + |
|
140 | + /** |
|
141 | + * @param string $base_url |
|
142 | + * @throws InvalidDataTypeException |
|
143 | + * @throws InvalidArgumentException |
|
144 | + */ |
|
145 | + protected function setBaseUrl($base_url) |
|
146 | + { |
|
147 | + if (! is_string($base_url)) { |
|
148 | + throw new InvalidDataTypeException('$base_url', $base_url, 'string'); |
|
149 | + } |
|
150 | + if (empty($base_url)) { |
|
151 | + throw new InvalidArgumentException( |
|
152 | + esc_html__('The base URL can not be an empty string.', 'event_espresso') |
|
153 | + ); |
|
154 | + } |
|
155 | + $this->base_url = $base_url; |
|
156 | + } |
|
157 | + |
|
158 | + |
|
159 | + /** |
|
160 | + * @return string |
|
161 | + * @throws InvalidDataTypeException |
|
162 | + */ |
|
163 | + public function formStepUrlKey() |
|
164 | + { |
|
165 | + if (empty($this->form_step_url_key)) { |
|
166 | + $this->setFormStepUrlKey(); |
|
167 | + } |
|
168 | + return $this->form_step_url_key; |
|
169 | + } |
|
170 | + |
|
171 | + |
|
172 | + /** |
|
173 | + * @param string $form_step_url_key |
|
174 | + * @throws InvalidDataTypeException |
|
175 | + */ |
|
176 | + public function setFormStepUrlKey($form_step_url_key = 'ee-form-step') |
|
177 | + { |
|
178 | + if (! is_string($form_step_url_key)) { |
|
179 | + throw new InvalidDataTypeException('$form_step_key', $form_step_url_key, 'string'); |
|
180 | + } |
|
181 | + $this->form_step_url_key = ! empty($form_step_url_key) ? $form_step_url_key : 'ee-form-step'; |
|
182 | + } |
|
183 | + |
|
184 | + |
|
185 | + /** |
|
186 | + * @return string |
|
187 | + */ |
|
188 | + public function defaultFormStep() |
|
189 | + { |
|
190 | + return $this->default_form_step; |
|
191 | + } |
|
192 | + |
|
193 | + |
|
194 | + /** |
|
195 | + * @param $default_form_step |
|
196 | + * @throws InvalidDataTypeException |
|
197 | + */ |
|
198 | + protected function setDefaultFormStep($default_form_step) |
|
199 | + { |
|
200 | + if (! is_string($default_form_step)) { |
|
201 | + throw new InvalidDataTypeException('$default_form_step', $default_form_step, 'string'); |
|
202 | + } |
|
203 | + $this->default_form_step = $default_form_step; |
|
204 | + } |
|
205 | + |
|
206 | + |
|
207 | + /** |
|
208 | + * @return void |
|
209 | + * @throws InvalidIdentifierException |
|
210 | + * @throws InvalidDataTypeException |
|
211 | + */ |
|
212 | + protected function setCurrentStepFromRequest() |
|
213 | + { |
|
214 | + $current_step_slug = $this->request()->getRequestParam($this->formStepUrlKey(), $this->defaultFormStep()); |
|
215 | + if (! $this->form_steps->setCurrent($current_step_slug)) { |
|
216 | + throw new InvalidIdentifierException( |
|
217 | + $current_step_slug, |
|
218 | + $this->defaultFormStep(), |
|
219 | + sprintf( |
|
220 | + esc_html__('The "%1$s" form step could not be set.', 'event_espresso'), |
|
221 | + $current_step_slug |
|
222 | + ) |
|
223 | + ); |
|
224 | + } |
|
225 | + } |
|
226 | + |
|
227 | + |
|
228 | + /** |
|
229 | + * @return SequentialStepFormInterface|object |
|
230 | + * @throws InvalidFormHandlerException |
|
231 | + */ |
|
232 | + public function getCurrentStep() |
|
233 | + { |
|
234 | + if (! $this->form_steps->current() instanceof SequentialStepForm) { |
|
235 | + throw new InvalidFormHandlerException($this->form_steps->current()); |
|
236 | + } |
|
237 | + return $this->form_steps->current(); |
|
238 | + } |
|
239 | + |
|
240 | + |
|
241 | + /** |
|
242 | + * @return string |
|
243 | + * @throws InvalidFormHandlerException |
|
244 | + */ |
|
245 | + public function formAction() |
|
246 | + { |
|
247 | + if (! is_string($this->form_action) || empty($this->form_action)) { |
|
248 | + $this->form_action = $this->baseUrl(); |
|
249 | + } |
|
250 | + return $this->form_action; |
|
251 | + } |
|
252 | + |
|
253 | + |
|
254 | + /** |
|
255 | + * @param string $form_action |
|
256 | + * @throws InvalidDataTypeException |
|
257 | + */ |
|
258 | + public function setFormAction($form_action) |
|
259 | + { |
|
260 | + if (! is_string($form_action)) { |
|
261 | + throw new InvalidDataTypeException('$form_action', $form_action, 'string'); |
|
262 | + } |
|
263 | + $this->form_action = $form_action; |
|
264 | + } |
|
265 | + |
|
266 | + |
|
267 | + /** |
|
268 | + * @param array $form_action_args |
|
269 | + * @throws InvalidDataTypeException |
|
270 | + * @throws InvalidFormHandlerException |
|
271 | + */ |
|
272 | + public function addFormActionArgs($form_action_args = array()) |
|
273 | + { |
|
274 | + if (! is_array($form_action_args)) { |
|
275 | + throw new InvalidDataTypeException('$form_action_args', $form_action_args, 'array'); |
|
276 | + } |
|
277 | + $form_action_args = ! empty($form_action_args) |
|
278 | + ? $form_action_args |
|
279 | + : array($this->formStepUrlKey() => $this->form_steps->current()->slug()); |
|
280 | + $this->getCurrentStep()->setFormAction( |
|
281 | + add_query_arg($form_action_args, $this->formAction()) |
|
282 | + ); |
|
283 | + $this->form_action = $this->getCurrentStep()->formAction(); |
|
284 | + } |
|
285 | + |
|
286 | + |
|
287 | + /** |
|
288 | + * @return string |
|
289 | + */ |
|
290 | + public function formConfig() |
|
291 | + { |
|
292 | + return $this->form_config; |
|
293 | + } |
|
294 | + |
|
295 | + |
|
296 | + /** |
|
297 | + * @param string $form_config |
|
298 | + */ |
|
299 | + public function setFormConfig($form_config) |
|
300 | + { |
|
301 | + $this->form_config = $form_config; |
|
302 | + } |
|
303 | + |
|
304 | + |
|
305 | + /** |
|
306 | + * @return string |
|
307 | + */ |
|
308 | + public function progressStepStyle() |
|
309 | + { |
|
310 | + return $this->progress_step_style; |
|
311 | + } |
|
312 | + |
|
313 | + |
|
314 | + /** |
|
315 | + * @param string $progress_step_style |
|
316 | + */ |
|
317 | + public function setProgressStepStyle($progress_step_style) |
|
318 | + { |
|
319 | + $this->progress_step_style = $progress_step_style; |
|
320 | + } |
|
321 | + |
|
322 | + |
|
323 | + /** |
|
324 | + * @return RequestInterface |
|
325 | + */ |
|
326 | + public function request() |
|
327 | + { |
|
328 | + return $this->request; |
|
329 | + } |
|
330 | + |
|
331 | + |
|
332 | + /** |
|
333 | + * @return Collection|null |
|
334 | + * @throws InvalidInterfaceException |
|
335 | + */ |
|
336 | + protected function getProgressStepsCollection() |
|
337 | + { |
|
338 | + static $collection = null; |
|
339 | + if (! $collection instanceof ProgressStepCollection) { |
|
340 | + $collection = new ProgressStepCollection(); |
|
341 | + } |
|
342 | + return $collection; |
|
343 | + } |
|
344 | + |
|
345 | + |
|
346 | + /** |
|
347 | + * @param Collection $progress_steps_collection |
|
348 | + * @return ProgressStepManager |
|
349 | + * @throws InvalidInterfaceException |
|
350 | + * @throws InvalidClassException |
|
351 | + * @throws InvalidDataTypeException |
|
352 | + * @throws InvalidEntityException |
|
353 | + * @throws InvalidFormHandlerException |
|
354 | + */ |
|
355 | + protected function generateProgressSteps(Collection $progress_steps_collection) |
|
356 | + { |
|
357 | + $current_step = $this->getCurrentStep(); |
|
358 | + /** @var SequentialStepForm $form_step */ |
|
359 | + foreach ($this->form_steps as $form_step) { |
|
360 | + // is this step active ? |
|
361 | + if (! $form_step->initialize()) { |
|
362 | + continue; |
|
363 | + } |
|
364 | + $progress_steps_collection->add( |
|
365 | + new ProgressStep( |
|
366 | + $form_step->order(), |
|
367 | + $form_step->slug(), |
|
368 | + $form_step->slug(), |
|
369 | + $form_step->formName() |
|
370 | + ), |
|
371 | + $form_step->slug() |
|
372 | + ); |
|
373 | + } |
|
374 | + // set collection pointer back to current step |
|
375 | + $this->form_steps->setCurrentUsingObject($current_step); |
|
376 | + return new ProgressStepManager( |
|
377 | + $this->progressStepStyle(), |
|
378 | + $this->defaultFormStep(), |
|
379 | + $this->formStepUrlKey(), |
|
380 | + $progress_steps_collection |
|
381 | + ); |
|
382 | + } |
|
383 | + |
|
384 | + |
|
385 | + /** |
|
386 | + * @throws InvalidClassException |
|
387 | + * @throws InvalidDataTypeException |
|
388 | + * @throws InvalidEntityException |
|
389 | + * @throws InvalidIdentifierException |
|
390 | + * @throws InvalidInterfaceException |
|
391 | + * @throws InvalidArgumentException |
|
392 | + * @throws InvalidFormHandlerException |
|
393 | + */ |
|
394 | + public function buildForm() |
|
395 | + { |
|
396 | + $this->buildCurrentStepFormForDisplay(); |
|
397 | + } |
|
398 | + |
|
399 | + |
|
400 | + /** |
|
401 | + * @param array $form_data |
|
402 | + * @throws InvalidArgumentException |
|
403 | + * @throws InvalidClassException |
|
404 | + * @throws InvalidDataTypeException |
|
405 | + * @throws InvalidEntityException |
|
406 | + * @throws InvalidFormHandlerException |
|
407 | + * @throws InvalidIdentifierException |
|
408 | + * @throws InvalidInterfaceException |
|
409 | + */ |
|
410 | + public function processForm($form_data = array()) |
|
411 | + { |
|
412 | + $this->buildCurrentStepFormForProcessing(); |
|
413 | + $this->processCurrentStepForm($form_data); |
|
414 | + } |
|
415 | + |
|
416 | + |
|
417 | + /** |
|
418 | + * @throws InvalidClassException |
|
419 | + * @throws InvalidDataTypeException |
|
420 | + * @throws InvalidEntityException |
|
421 | + * @throws InvalidInterfaceException |
|
422 | + * @throws InvalidIdentifierException |
|
423 | + * @throws InvalidArgumentException |
|
424 | + * @throws InvalidFormHandlerException |
|
425 | + */ |
|
426 | + public function buildCurrentStepFormForDisplay() |
|
427 | + { |
|
428 | + $form_step = $this->buildCurrentStepForm(); |
|
429 | + // no displayable content ? then skip straight to processing |
|
430 | + if (! $form_step->displayable()) { |
|
431 | + $this->addFormActionArgs(); |
|
432 | + $form_step->setFormAction($this->formAction()); |
|
433 | + wp_safe_redirect($form_step->formAction()); |
|
434 | + } |
|
435 | + } |
|
436 | + |
|
437 | + |
|
438 | + /** |
|
439 | + * @throws InvalidClassException |
|
440 | + * @throws InvalidDataTypeException |
|
441 | + * @throws InvalidEntityException |
|
442 | + * @throws InvalidInterfaceException |
|
443 | + * @throws InvalidIdentifierException |
|
444 | + * @throws InvalidArgumentException |
|
445 | + * @throws InvalidFormHandlerException |
|
446 | + */ |
|
447 | + public function buildCurrentStepFormForProcessing() |
|
448 | + { |
|
449 | + $this->buildCurrentStepForm(false); |
|
450 | + } |
|
451 | + |
|
452 | + |
|
453 | + /** |
|
454 | + * @param bool $for_display |
|
455 | + * @return SequentialStepFormInterface |
|
456 | + * @throws InvalidArgumentException |
|
457 | + * @throws InvalidClassException |
|
458 | + * @throws InvalidDataTypeException |
|
459 | + * @throws InvalidEntityException |
|
460 | + * @throws InvalidFormHandlerException |
|
461 | + * @throws InvalidIdentifierException |
|
462 | + * @throws InvalidInterfaceException |
|
463 | + */ |
|
464 | + private function buildCurrentStepForm($for_display = true) |
|
465 | + { |
|
466 | + $this->form_steps = $this->getFormStepsCollection(); |
|
467 | + $this->setCurrentStepFromRequest(); |
|
468 | + $form_step = $this->getCurrentStep(); |
|
469 | + if ($form_step->submitBtnText() === esc_html__('Submit', 'event_espresso')) { |
|
470 | + $form_step->setSubmitBtnText(esc_html__('Next Step', 'event_espresso')); |
|
471 | + } |
|
472 | + if ($for_display && $form_step->displayable()) { |
|
473 | + $this->progress_step_manager = $this->generateProgressSteps( |
|
474 | + $this->getProgressStepsCollection() |
|
475 | + ); |
|
476 | + $this->progress_step_manager->setCurrentStep( |
|
477 | + $form_step->slug() |
|
478 | + ); |
|
479 | + // mark all previous progress steps as completed |
|
480 | + $this->progress_step_manager->setPreviousStepsCompleted(); |
|
481 | + $this->progress_step_manager->enqueueStylesAndScripts(); |
|
482 | + $this->addFormActionArgs(); |
|
483 | + $form_step->setFormAction($this->formAction()); |
|
484 | + } else { |
|
485 | + $form_step->setRedirectUrl($this->baseUrl()); |
|
486 | + $form_step->addRedirectArgs( |
|
487 | + array($this->formStepUrlKey() => $this->form_steps->current()->slug()) |
|
488 | + ); |
|
489 | + } |
|
490 | + $form_step->generate(); |
|
491 | + if ($for_display) { |
|
492 | + $form_step->enqueueStylesAndScripts(); |
|
493 | + } |
|
494 | + return $form_step; |
|
495 | + } |
|
496 | + |
|
497 | + |
|
498 | + /** |
|
499 | + * @param bool $return_as_string |
|
500 | + * @return string |
|
501 | + * @throws InvalidFormHandlerException |
|
502 | + */ |
|
503 | + public function displayProgressSteps($return_as_string = true) |
|
504 | + { |
|
505 | + $form_step = $this->getCurrentStep(); |
|
506 | + if (! $form_step->displayable()) { |
|
507 | + return ''; |
|
508 | + } |
|
509 | + $progress_steps = apply_filters( |
|
510 | + 'FHEE__EventEspresso_core_libraries_form_sections_form_handlers_SequentialStepFormManager__displayProgressSteps__before_steps', |
|
511 | + '' |
|
512 | + ); |
|
513 | + $progress_steps .= $this->progress_step_manager->displaySteps(); |
|
514 | + $progress_steps .= apply_filters( |
|
515 | + 'FHEE__EventEspresso_core_libraries_form_sections_form_handlers_SequentialStepFormManager__displayProgressSteps__after_steps', |
|
516 | + '' |
|
517 | + ); |
|
518 | + if ($return_as_string) { |
|
519 | + return $progress_steps; |
|
520 | + } |
|
521 | + echo wp_kses($progress_steps, AllowedTags::getWithFormTags()); |
|
522 | + return ''; |
|
523 | + } |
|
524 | + |
|
525 | + |
|
526 | + /** |
|
527 | + * @param bool $return_as_string |
|
528 | + * @return string |
|
529 | + * @throws InvalidFormHandlerException |
|
530 | + */ |
|
531 | + public function displayCurrentStepForm($return_as_string = true) |
|
532 | + { |
|
533 | + if ($return_as_string) { |
|
534 | + return $this->getCurrentStep()->display(); |
|
535 | + } |
|
536 | + echo wp_kses($this->getCurrentStep()->display(), AllowedTags::getWithFormTags()); |
|
537 | + return ''; |
|
538 | + } |
|
539 | + |
|
540 | + |
|
541 | + /** |
|
542 | + * @param array $form_data |
|
543 | + * @return void |
|
544 | + * @throws InvalidArgumentException |
|
545 | + * @throws InvalidDataTypeException |
|
546 | + * @throws InvalidFormHandlerException |
|
547 | + */ |
|
548 | + public function processCurrentStepForm($form_data = array()) |
|
549 | + { |
|
550 | + // grab instance of current step because after calling next() below, |
|
551 | + // any calls to getCurrentStep() will return the "next" step because we advanced |
|
552 | + $current_step = $this->getCurrentStep(); |
|
553 | + try { |
|
554 | + // form processing should either throw exceptions or return true |
|
555 | + $current_step->process($form_data); |
|
556 | + } catch (Exception $e) { |
|
557 | + // something went wrong, convert the Exception to an EE_Error |
|
558 | + EE_Error::add_error($e->getMessage(), __FILE__, __FUNCTION__, __LINE__); |
|
559 | + // prevent redirect to next step or other if exception was thrown |
|
560 | + if ( |
|
561 | + $current_step->redirectTo() === SequentialStepForm::REDIRECT_TO_NEXT_STEP |
|
562 | + || $current_step->redirectTo() === SequentialStepForm::REDIRECT_TO_OTHER |
|
563 | + ) { |
|
564 | + $current_step->setRedirectTo(SequentialStepForm::REDIRECT_TO_CURRENT_STEP); |
|
565 | + } |
|
566 | + } |
|
567 | + // save notices to a transient so that when we redirect back |
|
568 | + // to the display portion for this step |
|
569 | + // those notices can be displayed |
|
570 | + EE_Error::get_notices(false, true); |
|
571 | + $this->redirectForm($current_step); |
|
572 | + } |
|
573 | + |
|
574 | + |
|
575 | + /** |
|
576 | + * handles where to go to next |
|
577 | + * |
|
578 | + * @param SequentialStepFormInterface $current_step |
|
579 | + * @throws InvalidArgumentException |
|
580 | + * @throws InvalidDataTypeException |
|
581 | + * @throws InvalidFormHandlerException |
|
582 | + */ |
|
583 | + public function redirectForm(SequentialStepFormInterface $current_step) |
|
584 | + { |
|
585 | + $redirect_step = $current_step; |
|
586 | + switch ($current_step->redirectTo()) { |
|
587 | + case SequentialStepForm::REDIRECT_TO_OTHER: |
|
588 | + // going somewhere else, so just check out now |
|
589 | + wp_safe_redirect($redirect_step->redirectUrl()); |
|
590 | + exit(); |
|
591 | + case SequentialStepForm::REDIRECT_TO_PREV_STEP: |
|
592 | + $redirect_step = $this->form_steps->previous(); |
|
593 | + break; |
|
594 | + case SequentialStepForm::REDIRECT_TO_NEXT_STEP: |
|
595 | + $this->form_steps->next(); |
|
596 | + if ($this->form_steps->valid()) { |
|
597 | + $redirect_step = $this->form_steps->current(); |
|
598 | + } |
|
599 | + break; |
|
600 | + case SequentialStepForm::REDIRECT_TO_CURRENT_STEP: |
|
601 | + default: |
|
602 | + // $redirect_step is already set |
|
603 | + } |
|
604 | + $current_step->setRedirectUrl($this->baseUrl()); |
|
605 | + $current_step->addRedirectArgs( |
|
606 | + // use the slug for whatever step we are redirecting too |
|
607 | + array($this->formStepUrlKey() => $redirect_step->slug()) |
|
608 | + ); |
|
609 | + wp_safe_redirect($current_step->redirectUrl()); |
|
610 | + exit(); |
|
611 | + } |
|
612 | 612 | } |
@@ -49,16 +49,16 @@ discard block |
||
49 | 49 | { |
50 | 50 | $fqn = $this->getFqn($fqn); |
51 | 51 | // have we already seen this FQCN ? |
52 | - if (! array_key_exists($fqn, $this->interfaces)) { |
|
53 | - $this->interfaces[ $fqn ] = array(); |
|
52 | + if ( ! array_key_exists($fqn, $this->interfaces)) { |
|
53 | + $this->interfaces[$fqn] = array(); |
|
54 | 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 ] |
|
55 | + $this->interfaces[$fqn] = class_implements($fqn, false); |
|
56 | + $this->interfaces[$fqn] = $this->interfaces[$fqn] !== false |
|
57 | + ? $this->interfaces[$fqn] |
|
58 | 58 | : array(); |
59 | 59 | } |
60 | 60 | } |
61 | - return $this->interfaces[ $fqn ]; |
|
61 | + return $this->interfaces[$fqn]; |
|
62 | 62 | } |
63 | 63 | |
64 | 64 | |
@@ -93,13 +93,13 @@ discard block |
||
93 | 93 | // are we adding an alias for a specific class? |
94 | 94 | if ($for_class !== '') { |
95 | 95 | // make sure it's set up as an array |
96 | - if (! isset($this->aliases[ $for_class ])) { |
|
97 | - $this->aliases[ $for_class ] = array(); |
|
96 | + if ( ! isset($this->aliases[$for_class])) { |
|
97 | + $this->aliases[$for_class] = array(); |
|
98 | 98 | } |
99 | - $this->aliases[ $for_class ][ $alias ] = $fqn; |
|
99 | + $this->aliases[$for_class][$alias] = $fqn; |
|
100 | 100 | return; |
101 | 101 | } |
102 | - $this->aliases[ $alias ] = $fqn; |
|
102 | + $this->aliases[$alias] = $fqn; |
|
103 | 103 | } |
104 | 104 | |
105 | 105 | |
@@ -131,7 +131,7 @@ discard block |
||
131 | 131 | */ |
132 | 132 | protected function isDirectAlias($fqn = '') |
133 | 133 | { |
134 | - return isset($this->aliases[ (string) $fqn ]) && ! is_array($this->aliases[ (string) $fqn ]); |
|
134 | + return isset($this->aliases[(string) $fqn]) && ! is_array($this->aliases[(string) $fqn]); |
|
135 | 135 | } |
136 | 136 | |
137 | 137 | |
@@ -146,7 +146,7 @@ discard block |
||
146 | 146 | { |
147 | 147 | return ( |
148 | 148 | $for_class !== '' |
149 | - && isset($this->aliases[ (string) $for_class ][ (string) $fqn ]) |
|
149 | + && isset($this->aliases[(string) $for_class][(string) $fqn]) |
|
150 | 150 | ); |
151 | 151 | } |
152 | 152 | |
@@ -171,11 +171,11 @@ discard block |
||
171 | 171 | { |
172 | 172 | $alias = $this->getFqn($alias); |
173 | 173 | if ($this->isAliasForClass($alias, $for_class)) { |
174 | - return $this->getFqnForAlias($this->aliases[ (string) $for_class ][ (string) $alias ], $for_class); |
|
174 | + return $this->getFqnForAlias($this->aliases[(string) $for_class][(string) $alias], $for_class); |
|
175 | 175 | } |
176 | 176 | if ($this->isDirectAlias($alias)) { |
177 | 177 | // note: changed '' to $for_class |
178 | - return $this->getFqnForAlias($this->aliases[ (string) $alias ], $for_class); |
|
178 | + return $this->getFqnForAlias($this->aliases[(string) $alias], $for_class); |
|
179 | 179 | } |
180 | 180 | return $alias; |
181 | 181 | } |
@@ -16,188 +16,188 @@ |
||
16 | 16 | */ |
17 | 17 | class ClassInterfaceCache |
18 | 18 | { |
19 | - /** |
|
20 | - * array of interfaces indexed by FQCNs where values are arrays of interface FQNs |
|
21 | - * |
|
22 | - * @var string[][] $interfaces |
|
23 | - */ |
|
24 | - private $interfaces = array(); |
|
25 | - |
|
26 | - /** |
|
27 | - * @type string[][] $aliases |
|
28 | - */ |
|
29 | - protected $aliases = array(); |
|
30 | - |
|
31 | - |
|
32 | - /** |
|
33 | - * @return string[][] |
|
34 | - */ |
|
35 | - public function getAliases() |
|
36 | - { |
|
37 | - return $this->aliases; |
|
38 | - } |
|
39 | - |
|
40 | - /** |
|
41 | - * @param string $fqn |
|
42 | - * @return string |
|
43 | - */ |
|
44 | - public function getFqn($fqn) |
|
45 | - { |
|
46 | - $fqn = $fqn instanceof FullyQualifiedName ? $fqn->string() : $fqn; |
|
47 | - return ltrim((string) $fqn, '\\'); |
|
48 | - } |
|
49 | - |
|
50 | - |
|
51 | - /** |
|
52 | - * @param string $fqn |
|
53 | - * @return array |
|
54 | - */ |
|
55 | - public function getInterfaces($fqn) |
|
56 | - { |
|
57 | - $fqn = $this->getFqn($fqn); |
|
58 | - // have we already seen this FQCN ? |
|
59 | - if (! array_key_exists($fqn, $this->interfaces)) { |
|
60 | - $this->interfaces[ $fqn ] = array(); |
|
61 | - if (class_exists($fqn)) { |
|
62 | - $this->interfaces[ $fqn ] = class_implements($fqn, false); |
|
63 | - $this->interfaces[ $fqn ] = $this->interfaces[ $fqn ] !== false |
|
64 | - ? $this->interfaces[ $fqn ] |
|
65 | - : array(); |
|
66 | - } |
|
67 | - } |
|
68 | - return $this->interfaces[ $fqn ]; |
|
69 | - } |
|
70 | - |
|
71 | - |
|
72 | - /** |
|
73 | - * @param string $fqn |
|
74 | - * @param string $interface |
|
75 | - * @return bool |
|
76 | - */ |
|
77 | - public function hasInterface($fqn, $interface) |
|
78 | - { |
|
79 | - $fqn = $this->getFqn($fqn); |
|
80 | - $interfaces = $this->getInterfaces($fqn); |
|
81 | - return in_array($interface, $interfaces, true); |
|
82 | - } |
|
83 | - |
|
84 | - |
|
85 | - /** |
|
86 | - * adds an alias for a classname |
|
87 | - * |
|
88 | - * @param string $fqn the class name that should be used (concrete class to replace interface) |
|
89 | - * @param string $alias the class name that would be type hinted for (abstract parent or interface) |
|
90 | - * @param string $for_class the class that has the dependency (is type hinting for the interface) |
|
91 | - * @throws InvalidAliasException |
|
92 | - */ |
|
93 | - public function addAlias($fqn, $alias, $for_class = '') |
|
94 | - { |
|
95 | - $fqn = $this->getFqn($fqn); |
|
96 | - $alias = $this->getFqn($alias); |
|
97 | - if (strpos($alias, '\\') !== false && ! is_subclass_of($fqn, $alias)) { |
|
98 | - throw new InvalidAliasException($fqn, $alias); |
|
99 | - } |
|
100 | - // are we adding an alias for a specific class? |
|
101 | - if ($for_class !== '') { |
|
102 | - // make sure it's set up as an array |
|
103 | - if (! isset($this->aliases[ $for_class ])) { |
|
104 | - $this->aliases[ $for_class ] = array(); |
|
105 | - } |
|
106 | - $this->aliases[ $for_class ][ $alias ] = $fqn; |
|
107 | - return; |
|
108 | - } |
|
109 | - $this->aliases[ $alias ] = $fqn; |
|
110 | - } |
|
111 | - |
|
112 | - |
|
113 | - /** |
|
114 | - * returns TRUE if the provided FQN is an alias |
|
115 | - * |
|
116 | - * @param string $fqn |
|
117 | - * @param string $for_class |
|
118 | - * @return bool |
|
119 | - */ |
|
120 | - public function isAlias($fqn = '', $for_class = '') |
|
121 | - { |
|
122 | - $fqn = $this->getFqn($fqn); |
|
123 | - if ($this->isAliasForClass($fqn, $for_class)) { |
|
124 | - return true; |
|
125 | - } |
|
126 | - if ($this->isDirectAlias($fqn)) { |
|
127 | - return true; |
|
128 | - } |
|
129 | - return false; |
|
130 | - } |
|
131 | - |
|
132 | - |
|
133 | - /** |
|
134 | - * returns TRUE if the provided FQN is an alias |
|
135 | - * |
|
136 | - * @param string $fqn |
|
137 | - * @return bool |
|
138 | - */ |
|
139 | - protected function isDirectAlias($fqn = '') |
|
140 | - { |
|
141 | - return isset($this->aliases[ (string) $fqn ]) && ! is_array($this->aliases[ (string) $fqn ]); |
|
142 | - } |
|
143 | - |
|
144 | - |
|
145 | - /** |
|
146 | - * returns TRUE if the provided FQN is an alias for the specified class |
|
147 | - * |
|
148 | - * @param string $fqn |
|
149 | - * @param string $for_class |
|
150 | - * @return bool |
|
151 | - */ |
|
152 | - protected function isAliasForClass($fqn = '', $for_class = '') |
|
153 | - { |
|
154 | - return ( |
|
155 | - $for_class !== '' |
|
156 | - && isset($this->aliases[ (string) $for_class ][ (string) $fqn ]) |
|
157 | - ); |
|
158 | - } |
|
159 | - |
|
160 | - |
|
161 | - /** |
|
162 | - * returns FQN for provided alias if one exists, otherwise returns the original FQN |
|
163 | - * functions recursively, so that multiple aliases can be used to drill down to a FQN |
|
164 | - * for example: |
|
165 | - * if the following two entries were added to the aliases array: |
|
166 | - * array( |
|
167 | - * 'interface_alias' => 'some\namespace\interface' |
|
168 | - * 'some\namespace\interface' => 'some\namespace\classname' |
|
169 | - * ) |
|
170 | - * then one could use Loader::getNew( 'interface_alias' ) |
|
171 | - * to load an instance of 'some\namespace\classname' |
|
172 | - * |
|
173 | - * @param string $alias |
|
174 | - * @param string $for_class |
|
175 | - * @return string |
|
176 | - */ |
|
177 | - public function getFqnForAlias($alias = '', $for_class = '') |
|
178 | - { |
|
179 | - $alias = $this->getFqn($alias); |
|
180 | - if ($this->isAliasForClass($alias, $for_class)) { |
|
181 | - return $this->getFqnForAlias($this->aliases[ (string) $for_class ][ (string) $alias ], $for_class); |
|
182 | - } |
|
183 | - if ($this->isDirectAlias($alias)) { |
|
184 | - // note: changed '' to $for_class |
|
185 | - return $this->getFqnForAlias($this->aliases[ (string) $alias ], $for_class); |
|
186 | - } |
|
187 | - return $alias; |
|
188 | - } |
|
189 | - |
|
190 | - |
|
191 | - // public function debug($for_class = '') |
|
192 | - // { |
|
193 | - // if ($for_class !== '') { |
|
194 | - // if ( ! isset($this->aliases[ $for_class ])) { |
|
195 | - // \EEH_Debug_Tools::printr('NOT FOUND', "aliases[ $for_class ]", __FILE__, __LINE__); |
|
196 | - // return; |
|
197 | - // } |
|
198 | - // \EEH_Debug_Tools::printr($this->aliases[ $for_class ], "aliases[ $for_class ]", __FILE__, __LINE__); |
|
199 | - // return; |
|
200 | - // } |
|
201 | - // \EEH_Debug_Tools::printr($this->aliases, '$this->aliases', __FILE__, __LINE__); |
|
202 | - // } |
|
19 | + /** |
|
20 | + * array of interfaces indexed by FQCNs where values are arrays of interface FQNs |
|
21 | + * |
|
22 | + * @var string[][] $interfaces |
|
23 | + */ |
|
24 | + private $interfaces = array(); |
|
25 | + |
|
26 | + /** |
|
27 | + * @type string[][] $aliases |
|
28 | + */ |
|
29 | + protected $aliases = array(); |
|
30 | + |
|
31 | + |
|
32 | + /** |
|
33 | + * @return string[][] |
|
34 | + */ |
|
35 | + public function getAliases() |
|
36 | + { |
|
37 | + return $this->aliases; |
|
38 | + } |
|
39 | + |
|
40 | + /** |
|
41 | + * @param string $fqn |
|
42 | + * @return string |
|
43 | + */ |
|
44 | + public function getFqn($fqn) |
|
45 | + { |
|
46 | + $fqn = $fqn instanceof FullyQualifiedName ? $fqn->string() : $fqn; |
|
47 | + return ltrim((string) $fqn, '\\'); |
|
48 | + } |
|
49 | + |
|
50 | + |
|
51 | + /** |
|
52 | + * @param string $fqn |
|
53 | + * @return array |
|
54 | + */ |
|
55 | + public function getInterfaces($fqn) |
|
56 | + { |
|
57 | + $fqn = $this->getFqn($fqn); |
|
58 | + // have we already seen this FQCN ? |
|
59 | + if (! array_key_exists($fqn, $this->interfaces)) { |
|
60 | + $this->interfaces[ $fqn ] = array(); |
|
61 | + if (class_exists($fqn)) { |
|
62 | + $this->interfaces[ $fqn ] = class_implements($fqn, false); |
|
63 | + $this->interfaces[ $fqn ] = $this->interfaces[ $fqn ] !== false |
|
64 | + ? $this->interfaces[ $fqn ] |
|
65 | + : array(); |
|
66 | + } |
|
67 | + } |
|
68 | + return $this->interfaces[ $fqn ]; |
|
69 | + } |
|
70 | + |
|
71 | + |
|
72 | + /** |
|
73 | + * @param string $fqn |
|
74 | + * @param string $interface |
|
75 | + * @return bool |
|
76 | + */ |
|
77 | + public function hasInterface($fqn, $interface) |
|
78 | + { |
|
79 | + $fqn = $this->getFqn($fqn); |
|
80 | + $interfaces = $this->getInterfaces($fqn); |
|
81 | + return in_array($interface, $interfaces, true); |
|
82 | + } |
|
83 | + |
|
84 | + |
|
85 | + /** |
|
86 | + * adds an alias for a classname |
|
87 | + * |
|
88 | + * @param string $fqn the class name that should be used (concrete class to replace interface) |
|
89 | + * @param string $alias the class name that would be type hinted for (abstract parent or interface) |
|
90 | + * @param string $for_class the class that has the dependency (is type hinting for the interface) |
|
91 | + * @throws InvalidAliasException |
|
92 | + */ |
|
93 | + public function addAlias($fqn, $alias, $for_class = '') |
|
94 | + { |
|
95 | + $fqn = $this->getFqn($fqn); |
|
96 | + $alias = $this->getFqn($alias); |
|
97 | + if (strpos($alias, '\\') !== false && ! is_subclass_of($fqn, $alias)) { |
|
98 | + throw new InvalidAliasException($fqn, $alias); |
|
99 | + } |
|
100 | + // are we adding an alias for a specific class? |
|
101 | + if ($for_class !== '') { |
|
102 | + // make sure it's set up as an array |
|
103 | + if (! isset($this->aliases[ $for_class ])) { |
|
104 | + $this->aliases[ $for_class ] = array(); |
|
105 | + } |
|
106 | + $this->aliases[ $for_class ][ $alias ] = $fqn; |
|
107 | + return; |
|
108 | + } |
|
109 | + $this->aliases[ $alias ] = $fqn; |
|
110 | + } |
|
111 | + |
|
112 | + |
|
113 | + /** |
|
114 | + * returns TRUE if the provided FQN is an alias |
|
115 | + * |
|
116 | + * @param string $fqn |
|
117 | + * @param string $for_class |
|
118 | + * @return bool |
|
119 | + */ |
|
120 | + public function isAlias($fqn = '', $for_class = '') |
|
121 | + { |
|
122 | + $fqn = $this->getFqn($fqn); |
|
123 | + if ($this->isAliasForClass($fqn, $for_class)) { |
|
124 | + return true; |
|
125 | + } |
|
126 | + if ($this->isDirectAlias($fqn)) { |
|
127 | + return true; |
|
128 | + } |
|
129 | + return false; |
|
130 | + } |
|
131 | + |
|
132 | + |
|
133 | + /** |
|
134 | + * returns TRUE if the provided FQN is an alias |
|
135 | + * |
|
136 | + * @param string $fqn |
|
137 | + * @return bool |
|
138 | + */ |
|
139 | + protected function isDirectAlias($fqn = '') |
|
140 | + { |
|
141 | + return isset($this->aliases[ (string) $fqn ]) && ! is_array($this->aliases[ (string) $fqn ]); |
|
142 | + } |
|
143 | + |
|
144 | + |
|
145 | + /** |
|
146 | + * returns TRUE if the provided FQN is an alias for the specified class |
|
147 | + * |
|
148 | + * @param string $fqn |
|
149 | + * @param string $for_class |
|
150 | + * @return bool |
|
151 | + */ |
|
152 | + protected function isAliasForClass($fqn = '', $for_class = '') |
|
153 | + { |
|
154 | + return ( |
|
155 | + $for_class !== '' |
|
156 | + && isset($this->aliases[ (string) $for_class ][ (string) $fqn ]) |
|
157 | + ); |
|
158 | + } |
|
159 | + |
|
160 | + |
|
161 | + /** |
|
162 | + * returns FQN for provided alias if one exists, otherwise returns the original FQN |
|
163 | + * functions recursively, so that multiple aliases can be used to drill down to a FQN |
|
164 | + * for example: |
|
165 | + * if the following two entries were added to the aliases array: |
|
166 | + * array( |
|
167 | + * 'interface_alias' => 'some\namespace\interface' |
|
168 | + * 'some\namespace\interface' => 'some\namespace\classname' |
|
169 | + * ) |
|
170 | + * then one could use Loader::getNew( 'interface_alias' ) |
|
171 | + * to load an instance of 'some\namespace\classname' |
|
172 | + * |
|
173 | + * @param string $alias |
|
174 | + * @param string $for_class |
|
175 | + * @return string |
|
176 | + */ |
|
177 | + public function getFqnForAlias($alias = '', $for_class = '') |
|
178 | + { |
|
179 | + $alias = $this->getFqn($alias); |
|
180 | + if ($this->isAliasForClass($alias, $for_class)) { |
|
181 | + return $this->getFqnForAlias($this->aliases[ (string) $for_class ][ (string) $alias ], $for_class); |
|
182 | + } |
|
183 | + if ($this->isDirectAlias($alias)) { |
|
184 | + // note: changed '' to $for_class |
|
185 | + return $this->getFqnForAlias($this->aliases[ (string) $alias ], $for_class); |
|
186 | + } |
|
187 | + return $alias; |
|
188 | + } |
|
189 | + |
|
190 | + |
|
191 | + // public function debug($for_class = '') |
|
192 | + // { |
|
193 | + // if ($for_class !== '') { |
|
194 | + // if ( ! isset($this->aliases[ $for_class ])) { |
|
195 | + // \EEH_Debug_Tools::printr('NOT FOUND', "aliases[ $for_class ]", __FILE__, __LINE__); |
|
196 | + // return; |
|
197 | + // } |
|
198 | + // \EEH_Debug_Tools::printr($this->aliases[ $for_class ], "aliases[ $for_class ]", __FILE__, __LINE__); |
|
199 | + // return; |
|
200 | + // } |
|
201 | + // \EEH_Debug_Tools::printr($this->aliases, '$this->aliases', __FILE__, __LINE__); |
|
202 | + // } |
|
203 | 203 | } |
@@ -81,7 +81,7 @@ discard block |
||
81 | 81 | */ |
82 | 82 | public function getShortcodes() |
83 | 83 | { |
84 | - if (! $this->shortcodes instanceof CollectionInterface) { |
|
84 | + if ( ! $this->shortcodes instanceof CollectionInterface) { |
|
85 | 85 | $this->shortcodes = $this->loadShortcodesCollection(); |
86 | 86 | } |
87 | 87 | return $this->shortcodes; |
@@ -138,7 +138,7 @@ discard block |
||
138 | 138 | 'FHEE__EventEspresso_core_services_shortcodes_ShortcodesManager__registerShortcodes__shortcode_collection', |
139 | 139 | $this->getShortcodes() |
140 | 140 | ); |
141 | - if (! $this->shortcodes instanceof CollectionInterface) { |
|
141 | + if ( ! $this->shortcodes instanceof CollectionInterface) { |
|
142 | 142 | throw new InvalidEntityException( |
143 | 143 | $this->shortcodes, |
144 | 144 | 'CollectionInterface', |
@@ -172,7 +172,7 @@ discard block |
||
172 | 172 | add_action('wp_enqueue_scripts', [$shortcode, 'enqueueStylesheets'], 11); |
173 | 173 | } |
174 | 174 | // add_shortcode() if it has not already been added |
175 | - if (! shortcode_exists($shortcode->getTag())) { |
|
175 | + if ( ! shortcode_exists($shortcode->getTag())) { |
|
176 | 176 | add_shortcode($shortcode->getTag(), [$shortcode, 'processShortcodeCallback']); |
177 | 177 | } |
178 | 178 | } |
@@ -30,219 +30,219 @@ |
||
30 | 30 | */ |
31 | 31 | class ShortcodesManager |
32 | 32 | { |
33 | - /** |
|
34 | - * @type CurrentPage |
|
35 | - */ |
|
36 | - protected $current_page; |
|
37 | - |
|
38 | - /** |
|
39 | - * @var LegacyShortcodesManager $legacy_shortcodes_manager |
|
40 | - */ |
|
41 | - private $legacy_shortcodes_manager; |
|
42 | - |
|
43 | - /** |
|
44 | - * @var CollectionInterface|ShortcodeInterface[] $shortcodes |
|
45 | - */ |
|
46 | - private $shortcodes; |
|
47 | - |
|
48 | - |
|
49 | - /** |
|
50 | - * ShortcodesManager constructor |
|
51 | - * |
|
52 | - * @param LegacyShortcodesManager $legacy_shortcodes_manager |
|
53 | - * @param CurrentPage $current_page |
|
54 | - */ |
|
55 | - public function __construct(LegacyShortcodesManager $legacy_shortcodes_manager, CurrentPage $current_page) |
|
56 | - { |
|
57 | - $this->legacy_shortcodes_manager = $legacy_shortcodes_manager; |
|
58 | - $this->current_page = $current_page; |
|
59 | - // assemble a list of installed and active shortcodes |
|
60 | - add_action( |
|
61 | - 'AHEE__EE_System__register_shortcodes_modules_and_widgets', |
|
62 | - [$this, 'registerShortcodes'], |
|
63 | - 999 |
|
64 | - ); |
|
65 | - // call add_shortcode() for all installed shortcodes |
|
66 | - add_action('AHEE__EE_System__core_loaded_and_ready', [$this, 'addShortcodes']); |
|
67 | - // check content for shortcodes the old way |
|
68 | - add_action('parse_query', [$this->legacy_shortcodes_manager, 'initializeShortcodes'], 5); |
|
69 | - // check content for shortcodes the NEW more efficient way |
|
70 | - add_action('template_redirect', [$this, 'templateRedirect'], 999); |
|
71 | - } |
|
72 | - |
|
73 | - |
|
74 | - /** |
|
75 | - * @return CollectionInterface|ShortcodeInterface[] |
|
76 | - * @throws InvalidIdentifierException |
|
77 | - * @throws InvalidInterfaceException |
|
78 | - * @throws InvalidFilePathException |
|
79 | - * @throws InvalidEntityException |
|
80 | - * @throws InvalidDataTypeException |
|
81 | - * @throws InvalidClassException |
|
82 | - */ |
|
83 | - public function getShortcodes() |
|
84 | - { |
|
85 | - if (! $this->shortcodes instanceof CollectionInterface) { |
|
86 | - $this->shortcodes = $this->loadShortcodesCollection(); |
|
87 | - } |
|
88 | - return $this->shortcodes; |
|
89 | - } |
|
90 | - |
|
91 | - |
|
92 | - /** |
|
93 | - * @return CollectionInterface|ShortcodeInterface[] |
|
94 | - * @throws InvalidIdentifierException |
|
95 | - * @throws InvalidInterfaceException |
|
96 | - * @throws InvalidFilePathException |
|
97 | - * @throws InvalidEntityException |
|
98 | - * @throws InvalidDataTypeException |
|
99 | - * @throws InvalidClassException |
|
100 | - */ |
|
101 | - protected function loadShortcodesCollection() |
|
102 | - { |
|
103 | - $loader = new CollectionLoader( |
|
104 | - new CollectionDetails( |
|
105 | - // collection name |
|
106 | - 'shortcodes', |
|
107 | - // collection interface |
|
108 | - 'EventEspresso\core\services\shortcodes\ShortcodeInterface', |
|
109 | - // FQCNs for classes to add (all classes within that namespace will be loaded) |
|
110 | - ['EventEspresso\core\domain\entities\shortcodes'], |
|
111 | - // filepaths to classes to add |
|
112 | - [], |
|
113 | - // file mask to use if parsing folder for files to add |
|
114 | - '', |
|
115 | - // what to use as identifier for collection entities |
|
116 | - // using CLASS NAME prevents duplicates (works like a singleton) |
|
117 | - CollectionDetails::ID_CLASS_NAME |
|
118 | - ) |
|
119 | - ); |
|
120 | - return $loader->getCollection(); |
|
121 | - } |
|
122 | - |
|
123 | - |
|
124 | - /** |
|
125 | - * @return void |
|
126 | - * @throws DomainException |
|
127 | - * @throws InvalidInterfaceException |
|
128 | - * @throws InvalidIdentifierException |
|
129 | - * @throws InvalidFilePathException |
|
130 | - * @throws InvalidEntityException |
|
131 | - * @throws InvalidDataTypeException |
|
132 | - * @throws InvalidClassException |
|
133 | - * @throws Exception |
|
134 | - */ |
|
135 | - public function registerShortcodes() |
|
136 | - { |
|
137 | - try { |
|
138 | - $this->shortcodes = apply_filters( |
|
139 | - 'FHEE__EventEspresso_core_services_shortcodes_ShortcodesManager__registerShortcodes__shortcode_collection', |
|
140 | - $this->getShortcodes() |
|
141 | - ); |
|
142 | - if (! $this->shortcodes instanceof CollectionInterface) { |
|
143 | - throw new InvalidEntityException( |
|
144 | - $this->shortcodes, |
|
145 | - 'CollectionInterface', |
|
146 | - sprintf( |
|
147 | - esc_html__( |
|
148 | - 'The "FHEE__EventEspresso_core_services_shortcodes_ShortcodesManager__registerShortcodes__shortcode_collection" filter must return a Collection of EspressoShortcode objects. "%1$s" was received instead.', |
|
149 | - 'event_espresso' |
|
150 | - ), |
|
151 | - is_object($this->shortcodes) ? get_class($this->shortcodes) : gettype($this->shortcodes) |
|
152 | - ) |
|
153 | - ); |
|
154 | - } |
|
155 | - $this->legacy_shortcodes_manager->registerShortcodes(); |
|
156 | - } catch (Exception $exception) { |
|
157 | - new ExceptionStackTraceDisplay($exception); |
|
158 | - } |
|
159 | - } |
|
160 | - |
|
161 | - |
|
162 | - /** |
|
163 | - * @return void |
|
164 | - * @throws Exception |
|
165 | - */ |
|
166 | - public function addShortcodes() |
|
167 | - { |
|
168 | - try { |
|
169 | - // cycle thru shortcode folders |
|
170 | - foreach ($this->shortcodes as $shortcode) { |
|
171 | - if ($shortcode instanceof EnqueueAssetsInterface) { |
|
172 | - add_action('wp_enqueue_scripts', [$shortcode, 'registerScriptsAndStylesheets'], 10); |
|
173 | - add_action('wp_enqueue_scripts', [$shortcode, 'enqueueStylesheets'], 11); |
|
174 | - } |
|
175 | - // add_shortcode() if it has not already been added |
|
176 | - if (! shortcode_exists($shortcode->getTag())) { |
|
177 | - add_shortcode($shortcode->getTag(), [$shortcode, 'processShortcodeCallback']); |
|
178 | - } |
|
179 | - } |
|
180 | - $this->legacy_shortcodes_manager->addShortcodes(); |
|
181 | - } catch (Exception $exception) { |
|
182 | - new ExceptionStackTraceDisplay($exception); |
|
183 | - } |
|
184 | - } |
|
185 | - |
|
186 | - |
|
187 | - /** |
|
188 | - * callback for the "template_redirect" hook point |
|
189 | - * checks posts for EE shortcodes, and initializes them, |
|
190 | - * then toggles filter switch that loads core default assets |
|
191 | - * |
|
192 | - * @return void |
|
193 | - */ |
|
194 | - public function templateRedirect() |
|
195 | - { |
|
196 | - global $wp_query; |
|
197 | - if (empty($wp_query->posts)) { |
|
198 | - return; |
|
199 | - } |
|
200 | - $load_assets = false; |
|
201 | - // array of posts displayed in current request |
|
202 | - $posts = is_array($wp_query->posts) ? $wp_query->posts : [$wp_query->posts]; |
|
203 | - foreach ($posts as $post) { |
|
204 | - // now check post content and excerpt for EE shortcodes |
|
205 | - $load_assets = $this->parseContentForShortcodes($post->post_content, $post) |
|
206 | - ? true |
|
207 | - : $load_assets; |
|
208 | - } |
|
209 | - if ($load_assets) { |
|
210 | - $this->current_page->setEspressoPage(true); |
|
211 | - add_filter('FHEE_load_css', '__return_true'); |
|
212 | - add_filter('FHEE_load_js', '__return_true'); |
|
213 | - } |
|
214 | - } |
|
215 | - |
|
216 | - |
|
217 | - /** |
|
218 | - * checks supplied content against list of shortcodes, |
|
219 | - * then initializes any found shortcodes, and returns true. |
|
220 | - * returns false if no shortcodes found. |
|
221 | - * |
|
222 | - * @param string $content |
|
223 | - * @param WP_Post $post |
|
224 | - * @return bool |
|
225 | - */ |
|
226 | - public function parseContentForShortcodes(string $content, WP_Post $post): bool |
|
227 | - { |
|
228 | - if (empty($this->shortcodes)) { |
|
229 | - return false; |
|
230 | - } |
|
231 | - $has_shortcode = false; |
|
232 | - foreach ($this->shortcodes as $shortcode) { |
|
233 | - if ( |
|
234 | - apply_filters( |
|
235 | - 'FHEE__EventEspresso_core_services_shortcodes_ShortcodesManager__parseContentForShortcodes__has_shortcode', |
|
236 | - has_shortcode($content, $shortcode->getTag()), |
|
237 | - $content, |
|
238 | - $post, |
|
239 | - $shortcode |
|
240 | - ) |
|
241 | - ) { |
|
242 | - $shortcode->initializeShortcode(); |
|
243 | - $has_shortcode = true; |
|
244 | - } |
|
245 | - } |
|
246 | - return $has_shortcode; |
|
247 | - } |
|
33 | + /** |
|
34 | + * @type CurrentPage |
|
35 | + */ |
|
36 | + protected $current_page; |
|
37 | + |
|
38 | + /** |
|
39 | + * @var LegacyShortcodesManager $legacy_shortcodes_manager |
|
40 | + */ |
|
41 | + private $legacy_shortcodes_manager; |
|
42 | + |
|
43 | + /** |
|
44 | + * @var CollectionInterface|ShortcodeInterface[] $shortcodes |
|
45 | + */ |
|
46 | + private $shortcodes; |
|
47 | + |
|
48 | + |
|
49 | + /** |
|
50 | + * ShortcodesManager constructor |
|
51 | + * |
|
52 | + * @param LegacyShortcodesManager $legacy_shortcodes_manager |
|
53 | + * @param CurrentPage $current_page |
|
54 | + */ |
|
55 | + public function __construct(LegacyShortcodesManager $legacy_shortcodes_manager, CurrentPage $current_page) |
|
56 | + { |
|
57 | + $this->legacy_shortcodes_manager = $legacy_shortcodes_manager; |
|
58 | + $this->current_page = $current_page; |
|
59 | + // assemble a list of installed and active shortcodes |
|
60 | + add_action( |
|
61 | + 'AHEE__EE_System__register_shortcodes_modules_and_widgets', |
|
62 | + [$this, 'registerShortcodes'], |
|
63 | + 999 |
|
64 | + ); |
|
65 | + // call add_shortcode() for all installed shortcodes |
|
66 | + add_action('AHEE__EE_System__core_loaded_and_ready', [$this, 'addShortcodes']); |
|
67 | + // check content for shortcodes the old way |
|
68 | + add_action('parse_query', [$this->legacy_shortcodes_manager, 'initializeShortcodes'], 5); |
|
69 | + // check content for shortcodes the NEW more efficient way |
|
70 | + add_action('template_redirect', [$this, 'templateRedirect'], 999); |
|
71 | + } |
|
72 | + |
|
73 | + |
|
74 | + /** |
|
75 | + * @return CollectionInterface|ShortcodeInterface[] |
|
76 | + * @throws InvalidIdentifierException |
|
77 | + * @throws InvalidInterfaceException |
|
78 | + * @throws InvalidFilePathException |
|
79 | + * @throws InvalidEntityException |
|
80 | + * @throws InvalidDataTypeException |
|
81 | + * @throws InvalidClassException |
|
82 | + */ |
|
83 | + public function getShortcodes() |
|
84 | + { |
|
85 | + if (! $this->shortcodes instanceof CollectionInterface) { |
|
86 | + $this->shortcodes = $this->loadShortcodesCollection(); |
|
87 | + } |
|
88 | + return $this->shortcodes; |
|
89 | + } |
|
90 | + |
|
91 | + |
|
92 | + /** |
|
93 | + * @return CollectionInterface|ShortcodeInterface[] |
|
94 | + * @throws InvalidIdentifierException |
|
95 | + * @throws InvalidInterfaceException |
|
96 | + * @throws InvalidFilePathException |
|
97 | + * @throws InvalidEntityException |
|
98 | + * @throws InvalidDataTypeException |
|
99 | + * @throws InvalidClassException |
|
100 | + */ |
|
101 | + protected function loadShortcodesCollection() |
|
102 | + { |
|
103 | + $loader = new CollectionLoader( |
|
104 | + new CollectionDetails( |
|
105 | + // collection name |
|
106 | + 'shortcodes', |
|
107 | + // collection interface |
|
108 | + 'EventEspresso\core\services\shortcodes\ShortcodeInterface', |
|
109 | + // FQCNs for classes to add (all classes within that namespace will be loaded) |
|
110 | + ['EventEspresso\core\domain\entities\shortcodes'], |
|
111 | + // filepaths to classes to add |
|
112 | + [], |
|
113 | + // file mask to use if parsing folder for files to add |
|
114 | + '', |
|
115 | + // what to use as identifier for collection entities |
|
116 | + // using CLASS NAME prevents duplicates (works like a singleton) |
|
117 | + CollectionDetails::ID_CLASS_NAME |
|
118 | + ) |
|
119 | + ); |
|
120 | + return $loader->getCollection(); |
|
121 | + } |
|
122 | + |
|
123 | + |
|
124 | + /** |
|
125 | + * @return void |
|
126 | + * @throws DomainException |
|
127 | + * @throws InvalidInterfaceException |
|
128 | + * @throws InvalidIdentifierException |
|
129 | + * @throws InvalidFilePathException |
|
130 | + * @throws InvalidEntityException |
|
131 | + * @throws InvalidDataTypeException |
|
132 | + * @throws InvalidClassException |
|
133 | + * @throws Exception |
|
134 | + */ |
|
135 | + public function registerShortcodes() |
|
136 | + { |
|
137 | + try { |
|
138 | + $this->shortcodes = apply_filters( |
|
139 | + 'FHEE__EventEspresso_core_services_shortcodes_ShortcodesManager__registerShortcodes__shortcode_collection', |
|
140 | + $this->getShortcodes() |
|
141 | + ); |
|
142 | + if (! $this->shortcodes instanceof CollectionInterface) { |
|
143 | + throw new InvalidEntityException( |
|
144 | + $this->shortcodes, |
|
145 | + 'CollectionInterface', |
|
146 | + sprintf( |
|
147 | + esc_html__( |
|
148 | + 'The "FHEE__EventEspresso_core_services_shortcodes_ShortcodesManager__registerShortcodes__shortcode_collection" filter must return a Collection of EspressoShortcode objects. "%1$s" was received instead.', |
|
149 | + 'event_espresso' |
|
150 | + ), |
|
151 | + is_object($this->shortcodes) ? get_class($this->shortcodes) : gettype($this->shortcodes) |
|
152 | + ) |
|
153 | + ); |
|
154 | + } |
|
155 | + $this->legacy_shortcodes_manager->registerShortcodes(); |
|
156 | + } catch (Exception $exception) { |
|
157 | + new ExceptionStackTraceDisplay($exception); |
|
158 | + } |
|
159 | + } |
|
160 | + |
|
161 | + |
|
162 | + /** |
|
163 | + * @return void |
|
164 | + * @throws Exception |
|
165 | + */ |
|
166 | + public function addShortcodes() |
|
167 | + { |
|
168 | + try { |
|
169 | + // cycle thru shortcode folders |
|
170 | + foreach ($this->shortcodes as $shortcode) { |
|
171 | + if ($shortcode instanceof EnqueueAssetsInterface) { |
|
172 | + add_action('wp_enqueue_scripts', [$shortcode, 'registerScriptsAndStylesheets'], 10); |
|
173 | + add_action('wp_enqueue_scripts', [$shortcode, 'enqueueStylesheets'], 11); |
|
174 | + } |
|
175 | + // add_shortcode() if it has not already been added |
|
176 | + if (! shortcode_exists($shortcode->getTag())) { |
|
177 | + add_shortcode($shortcode->getTag(), [$shortcode, 'processShortcodeCallback']); |
|
178 | + } |
|
179 | + } |
|
180 | + $this->legacy_shortcodes_manager->addShortcodes(); |
|
181 | + } catch (Exception $exception) { |
|
182 | + new ExceptionStackTraceDisplay($exception); |
|
183 | + } |
|
184 | + } |
|
185 | + |
|
186 | + |
|
187 | + /** |
|
188 | + * callback for the "template_redirect" hook point |
|
189 | + * checks posts for EE shortcodes, and initializes them, |
|
190 | + * then toggles filter switch that loads core default assets |
|
191 | + * |
|
192 | + * @return void |
|
193 | + */ |
|
194 | + public function templateRedirect() |
|
195 | + { |
|
196 | + global $wp_query; |
|
197 | + if (empty($wp_query->posts)) { |
|
198 | + return; |
|
199 | + } |
|
200 | + $load_assets = false; |
|
201 | + // array of posts displayed in current request |
|
202 | + $posts = is_array($wp_query->posts) ? $wp_query->posts : [$wp_query->posts]; |
|
203 | + foreach ($posts as $post) { |
|
204 | + // now check post content and excerpt for EE shortcodes |
|
205 | + $load_assets = $this->parseContentForShortcodes($post->post_content, $post) |
|
206 | + ? true |
|
207 | + : $load_assets; |
|
208 | + } |
|
209 | + if ($load_assets) { |
|
210 | + $this->current_page->setEspressoPage(true); |
|
211 | + add_filter('FHEE_load_css', '__return_true'); |
|
212 | + add_filter('FHEE_load_js', '__return_true'); |
|
213 | + } |
|
214 | + } |
|
215 | + |
|
216 | + |
|
217 | + /** |
|
218 | + * checks supplied content against list of shortcodes, |
|
219 | + * then initializes any found shortcodes, and returns true. |
|
220 | + * returns false if no shortcodes found. |
|
221 | + * |
|
222 | + * @param string $content |
|
223 | + * @param WP_Post $post |
|
224 | + * @return bool |
|
225 | + */ |
|
226 | + public function parseContentForShortcodes(string $content, WP_Post $post): bool |
|
227 | + { |
|
228 | + if (empty($this->shortcodes)) { |
|
229 | + return false; |
|
230 | + } |
|
231 | + $has_shortcode = false; |
|
232 | + foreach ($this->shortcodes as $shortcode) { |
|
233 | + if ( |
|
234 | + apply_filters( |
|
235 | + 'FHEE__EventEspresso_core_services_shortcodes_ShortcodesManager__parseContentForShortcodes__has_shortcode', |
|
236 | + has_shortcode($content, $shortcode->getTag()), |
|
237 | + $content, |
|
238 | + $post, |
|
239 | + $shortcode |
|
240 | + ) |
|
241 | + ) { |
|
242 | + $shortcode->initializeShortcode(); |
|
243 | + $has_shortcode = true; |
|
244 | + } |
|
245 | + } |
|
246 | + return $has_shortcode; |
|
247 | + } |
|
248 | 248 | } |