@@ -33,7 +33,7 @@ discard block |
||
33 | 33 | if (is_int($value_to_normalize) || is_float($value_to_normalize)) { |
34 | 34 | return (int) $value_to_normalize; |
35 | 35 | } |
36 | - if (! is_string($value_to_normalize)) { |
|
36 | + if ( ! is_string($value_to_normalize)) { |
|
37 | 37 | throw new EE_Validation_Error( |
38 | 38 | sprintf( |
39 | 39 | esc_html__('The value "%s" must be a string submitted for normalization, it was %s', 'event_espresso'), |
@@ -70,7 +70,7 @@ discard block |
||
70 | 70 | } |
71 | 71 | // this really shouldn't ever happen because fields with a int normalization strategy |
72 | 72 | // should also have a int validation strategy, but in case it doesn't use the default |
73 | - if (! $validation_error_message) { |
|
73 | + if ( ! $validation_error_message) { |
|
74 | 74 | $default_validation_strategy = new EE_Int_Validation_Strategy(); |
75 | 75 | $validation_error_message = $default_validation_strategy->get_validation_error_message(); |
76 | 76 | } |
@@ -10,88 +10,88 @@ |
||
10 | 10 | */ |
11 | 11 | class EE_Int_Normalization extends EE_Normalization_Strategy_Base |
12 | 12 | { |
13 | - /* |
|
13 | + /* |
|
14 | 14 | * regex pattern that matches for the following: |
15 | 15 | * * optional negative sign |
16 | 16 | * * one or more digits |
17 | 17 | */ |
18 | - const REGEX = '/^(-?)(\d+)(?:\.0+)?$/'; |
|
18 | + const REGEX = '/^(-?)(\d+)(?:\.0+)?$/'; |
|
19 | 19 | |
20 | 20 | |
21 | 21 | |
22 | - /** |
|
23 | - * @param string $value_to_normalize |
|
24 | - * @return int|mixed|string |
|
25 | - * @throws \EE_Validation_Error |
|
26 | - */ |
|
27 | - public function normalize($value_to_normalize) |
|
28 | - { |
|
29 | - if ($value_to_normalize === null) { |
|
30 | - return null; |
|
31 | - } |
|
32 | - if (is_int($value_to_normalize) || is_float($value_to_normalize)) { |
|
33 | - return (int) $value_to_normalize; |
|
34 | - } |
|
35 | - if (! is_string($value_to_normalize)) { |
|
36 | - throw new EE_Validation_Error( |
|
37 | - sprintf( |
|
38 | - esc_html__('The value "%s" must be a string submitted for normalization, it was %s', 'event_espresso'), |
|
39 | - print_r($value_to_normalize, true), |
|
40 | - gettype($value_to_normalize) |
|
41 | - ) |
|
42 | - ); |
|
43 | - } |
|
44 | - $value_to_normalize = filter_var( |
|
45 | - $value_to_normalize, |
|
46 | - FILTER_SANITIZE_NUMBER_FLOAT, |
|
47 | - FILTER_FLAG_ALLOW_FRACTION |
|
48 | - ); |
|
49 | - if ($value_to_normalize === '') { |
|
50 | - return null; |
|
51 | - } |
|
52 | - $matches = array(); |
|
53 | - if (preg_match(EE_Int_Normalization::REGEX, $value_to_normalize, $matches)) { |
|
54 | - if (count($matches) === 3) { |
|
55 | - // if first match is the negative sign, |
|
56 | - // then the number needs to be multiplied by -1 to remain negative |
|
57 | - return $matches[1] === '-' |
|
58 | - ? (int) $matches[2] * -1 |
|
59 | - : (int) $matches[2]; |
|
60 | - } |
|
61 | - } |
|
62 | - // find if this input has a int validation strategy |
|
63 | - // in which case, use its message |
|
64 | - $validation_error_message = null; |
|
65 | - foreach ($this->_input->get_validation_strategies() as $validation_strategy) { |
|
66 | - if ($validation_strategy instanceof EE_Int_Validation_Strategy) { |
|
67 | - $validation_error_message = $validation_strategy->get_validation_error_message(); |
|
68 | - } |
|
69 | - } |
|
70 | - // this really shouldn't ever happen because fields with a int normalization strategy |
|
71 | - // should also have a int validation strategy, but in case it doesn't use the default |
|
72 | - if (! $validation_error_message) { |
|
73 | - $default_validation_strategy = new EE_Int_Validation_Strategy(); |
|
74 | - $validation_error_message = $default_validation_strategy->get_validation_error_message(); |
|
75 | - } |
|
76 | - throw new EE_Validation_Error($validation_error_message, 'numeric_only'); |
|
77 | - } |
|
22 | + /** |
|
23 | + * @param string $value_to_normalize |
|
24 | + * @return int|mixed|string |
|
25 | + * @throws \EE_Validation_Error |
|
26 | + */ |
|
27 | + public function normalize($value_to_normalize) |
|
28 | + { |
|
29 | + if ($value_to_normalize === null) { |
|
30 | + return null; |
|
31 | + } |
|
32 | + if (is_int($value_to_normalize) || is_float($value_to_normalize)) { |
|
33 | + return (int) $value_to_normalize; |
|
34 | + } |
|
35 | + if (! is_string($value_to_normalize)) { |
|
36 | + throw new EE_Validation_Error( |
|
37 | + sprintf( |
|
38 | + esc_html__('The value "%s" must be a string submitted for normalization, it was %s', 'event_espresso'), |
|
39 | + print_r($value_to_normalize, true), |
|
40 | + gettype($value_to_normalize) |
|
41 | + ) |
|
42 | + ); |
|
43 | + } |
|
44 | + $value_to_normalize = filter_var( |
|
45 | + $value_to_normalize, |
|
46 | + FILTER_SANITIZE_NUMBER_FLOAT, |
|
47 | + FILTER_FLAG_ALLOW_FRACTION |
|
48 | + ); |
|
49 | + if ($value_to_normalize === '') { |
|
50 | + return null; |
|
51 | + } |
|
52 | + $matches = array(); |
|
53 | + if (preg_match(EE_Int_Normalization::REGEX, $value_to_normalize, $matches)) { |
|
54 | + if (count($matches) === 3) { |
|
55 | + // if first match is the negative sign, |
|
56 | + // then the number needs to be multiplied by -1 to remain negative |
|
57 | + return $matches[1] === '-' |
|
58 | + ? (int) $matches[2] * -1 |
|
59 | + : (int) $matches[2]; |
|
60 | + } |
|
61 | + } |
|
62 | + // find if this input has a int validation strategy |
|
63 | + // in which case, use its message |
|
64 | + $validation_error_message = null; |
|
65 | + foreach ($this->_input->get_validation_strategies() as $validation_strategy) { |
|
66 | + if ($validation_strategy instanceof EE_Int_Validation_Strategy) { |
|
67 | + $validation_error_message = $validation_strategy->get_validation_error_message(); |
|
68 | + } |
|
69 | + } |
|
70 | + // this really shouldn't ever happen because fields with a int normalization strategy |
|
71 | + // should also have a int validation strategy, but in case it doesn't use the default |
|
72 | + if (! $validation_error_message) { |
|
73 | + $default_validation_strategy = new EE_Int_Validation_Strategy(); |
|
74 | + $validation_error_message = $default_validation_strategy->get_validation_error_message(); |
|
75 | + } |
|
76 | + throw new EE_Validation_Error($validation_error_message, 'numeric_only'); |
|
77 | + } |
|
78 | 78 | |
79 | 79 | |
80 | 80 | |
81 | - /** |
|
82 | - * Converts the int into a string for use in teh html form |
|
83 | - * |
|
84 | - * @param int $normalized_value |
|
85 | - * @return string |
|
86 | - */ |
|
87 | - public function unnormalize($normalized_value) |
|
88 | - { |
|
89 | - if ($normalized_value === null || $normalized_value === '') { |
|
90 | - return ''; |
|
91 | - } |
|
92 | - if (empty($normalized_value)) { |
|
93 | - return '0'; |
|
94 | - } |
|
95 | - return "$normalized_value"; |
|
96 | - } |
|
81 | + /** |
|
82 | + * Converts the int into a string for use in teh html form |
|
83 | + * |
|
84 | + * @param int $normalized_value |
|
85 | + * @return string |
|
86 | + */ |
|
87 | + public function unnormalize($normalized_value) |
|
88 | + { |
|
89 | + if ($normalized_value === null || $normalized_value === '') { |
|
90 | + return ''; |
|
91 | + } |
|
92 | + if (empty($normalized_value)) { |
|
93 | + return '0'; |
|
94 | + } |
|
95 | + return "$normalized_value"; |
|
96 | + } |
|
97 | 97 | } |
@@ -199,7 +199,7 @@ discard block |
||
199 | 199 | if (isset($input_args['validation_strategies'])) { |
200 | 200 | foreach ((array) $input_args['validation_strategies'] as $validation_strategy) { |
201 | 201 | if ($validation_strategy instanceof EE_Validation_Strategy_Base && empty($input_args['ignore_input'])) { |
202 | - $this->_validation_strategies[ get_class($validation_strategy) ] = $validation_strategy; |
|
202 | + $this->_validation_strategies[get_class($validation_strategy)] = $validation_strategy; |
|
203 | 203 | } |
204 | 204 | } |
205 | 205 | unset($input_args['validation_strategies']); |
@@ -210,7 +210,7 @@ discard block |
||
210 | 210 | // loop thru incoming options |
211 | 211 | foreach ($input_args as $key => $value) { |
212 | 212 | // add underscore to $key to match property names |
213 | - $_key = '_' . $key; |
|
213 | + $_key = '_'.$key; |
|
214 | 214 | if (property_exists($this, $_key)) { |
215 | 215 | $this->{$_key} = $value; |
216 | 216 | } |
@@ -230,7 +230,7 @@ discard block |
||
230 | 230 | if (isset($input_args['ignore_input'])) { |
231 | 231 | $this->_normalization_strategy = new EE_Null_Normalization(); |
232 | 232 | } |
233 | - if (! $this->_normalization_strategy) { |
|
233 | + if ( ! $this->_normalization_strategy) { |
|
234 | 234 | $this->_normalization_strategy = new EE_Text_Normalization(); |
235 | 235 | } |
236 | 236 | $this->_normalization_strategy->_construct_finalize($this); |
@@ -239,7 +239,7 @@ discard block |
||
239 | 239 | $this->set_default($input_args['default']); |
240 | 240 | unset($input_args['default']); |
241 | 241 | } |
242 | - if (! $this->_sensitive_data_removal_strategy) { |
|
242 | + if ( ! $this->_sensitive_data_removal_strategy) { |
|
243 | 243 | $this->_sensitive_data_removal_strategy = new EE_No_Sensitive_Data_Removal(); |
244 | 244 | } |
245 | 245 | $this->_sensitive_data_removal_strategy->_construct_finalize($this); |
@@ -256,10 +256,10 @@ discard block |
||
256 | 256 | */ |
257 | 257 | protected function _set_default_html_name_if_empty() |
258 | 258 | { |
259 | - if (! $this->_html_name) { |
|
259 | + if ( ! $this->_html_name) { |
|
260 | 260 | $this->_html_name = $this->name(); |
261 | 261 | if ($this->_parent_section && $this->_parent_section instanceof EE_Form_Section_Proper) { |
262 | - $this->_html_name = $this->_parent_section->html_name_prefix() . "[{$this->name()}]"; |
|
262 | + $this->_html_name = $this->_parent_section->html_name_prefix()."[{$this->name()}]"; |
|
263 | 263 | } |
264 | 264 | } |
265 | 265 | } |
@@ -291,7 +291,7 @@ discard block |
||
291 | 291 | protected function _get_display_strategy() |
292 | 292 | { |
293 | 293 | $this->ensure_construct_finalized_called(); |
294 | - if (! $this->_display_strategy || ! $this->_display_strategy instanceof EE_Display_Strategy_Base) { |
|
294 | + if ( ! $this->_display_strategy || ! $this->_display_strategy instanceof EE_Display_Strategy_Base) { |
|
295 | 295 | throw new EE_Error( |
296 | 296 | sprintf( |
297 | 297 | esc_html__( |
@@ -459,7 +459,7 @@ discard block |
||
459 | 459 | $validation_strategy instanceof $validation_strategy_classname |
460 | 460 | || is_subclass_of($validation_strategy, $validation_strategy_classname) |
461 | 461 | ) { |
462 | - unset($this->_validation_strategies[ $key ]); |
|
462 | + unset($this->_validation_strategies[$key]); |
|
463 | 463 | } |
464 | 464 | } |
465 | 465 | } |
@@ -670,7 +670,7 @@ discard block |
||
670 | 670 | if (is_array($raw_input)) { |
671 | 671 | $raw_value = array(); |
672 | 672 | foreach ($raw_input as $key => $value) { |
673 | - $raw_value[ $key ] = $this->_sanitize($value); |
|
673 | + $raw_value[$key] = $this->_sanitize($value); |
|
674 | 674 | } |
675 | 675 | $this->_set_raw_value($raw_value); |
676 | 676 | } else { |
@@ -703,7 +703,7 @@ discard block |
||
703 | 703 | */ |
704 | 704 | public function html_label_id() |
705 | 705 | { |
706 | - return ! empty($this->_html_label_id) ? $this->_html_label_id : $this->html_id() . '-lbl'; |
|
706 | + return ! empty($this->_html_label_id) ? $this->_html_label_id : $this->html_id().'-lbl'; |
|
707 | 707 | } |
708 | 708 | |
709 | 709 | |
@@ -853,9 +853,9 @@ discard block |
||
853 | 853 | $validation_strategy->get_jquery_validation_rule_array() |
854 | 854 | ); |
855 | 855 | } |
856 | - if (! empty($jquery_validation_rules)) { |
|
856 | + if ( ! empty($jquery_validation_rules)) { |
|
857 | 857 | foreach ($this->get_display_strategy()->get_html_input_ids(true) as $html_id_with_pound_sign) { |
858 | - $jquery_validation_js[ $html_id_with_pound_sign ] = $jquery_validation_rules; |
|
858 | + $jquery_validation_js[$html_id_with_pound_sign] = $jquery_validation_rules; |
|
859 | 859 | } |
860 | 860 | } |
861 | 861 | return $jquery_validation_js; |
@@ -977,7 +977,7 @@ discard block |
||
977 | 977 | public function html_class($add_required = false) |
978 | 978 | { |
979 | 979 | return $add_required && $this->required() |
980 | - ? $this->required_css_class() . ' ' . $this->_html_class |
|
980 | + ? $this->required_css_class().' '.$this->_html_class |
|
981 | 981 | : $this->_html_class; |
982 | 982 | } |
983 | 983 | |
@@ -1052,7 +1052,7 @@ discard block |
||
1052 | 1052 | $button_css_attributes .= ''; |
1053 | 1053 | } |
1054 | 1054 | $this->_button_css_attributes .= ! empty($other_attributes) |
1055 | - ? $button_css_attributes . ' ' . $other_attributes |
|
1055 | + ? $button_css_attributes.' '.$other_attributes |
|
1056 | 1056 | : $button_css_attributes; |
1057 | 1057 | } |
1058 | 1058 | |
@@ -1090,8 +1090,8 @@ discard block |
||
1090 | 1090 | // now get the value for the input |
1091 | 1091 | $value = $this->findRequestForSectionUsingNameParts($name_parts, $req_data); |
1092 | 1092 | // check if this thing's name is at the TOP level of the request data |
1093 | - if ($value === null && isset($req_data[ $this->name() ])) { |
|
1094 | - $value = $req_data[ $this->name() ]; |
|
1093 | + if ($value === null && isset($req_data[$this->name()])) { |
|
1094 | + $value = $req_data[$this->name()]; |
|
1095 | 1095 | } |
1096 | 1096 | return $value; |
1097 | 1097 | } |
@@ -1133,13 +1133,13 @@ discard block |
||
1133 | 1133 | public function findRequestForSectionUsingNameParts($html_name_parts, $req_data) |
1134 | 1134 | { |
1135 | 1135 | $first_part_to_consider = array_shift($html_name_parts); |
1136 | - if (isset($req_data[ $first_part_to_consider ])) { |
|
1136 | + if (isset($req_data[$first_part_to_consider])) { |
|
1137 | 1137 | if (empty($html_name_parts)) { |
1138 | - return $req_data[ $first_part_to_consider ]; |
|
1138 | + return $req_data[$first_part_to_consider]; |
|
1139 | 1139 | } else { |
1140 | 1140 | return $this->findRequestForSectionUsingNameParts( |
1141 | 1141 | $html_name_parts, |
1142 | - $req_data[ $first_part_to_consider ] |
|
1142 | + $req_data[$first_part_to_consider] |
|
1143 | 1143 | ); |
1144 | 1144 | } |
1145 | 1145 | } else { |
@@ -14,1261 +14,1261 @@ |
||
14 | 14 | */ |
15 | 15 | abstract class EE_Form_Input_Base extends EE_Form_Section_Validatable |
16 | 16 | { |
17 | - /** |
|
18 | - * the input's name attribute |
|
19 | - * |
|
20 | - * @var string |
|
21 | - */ |
|
22 | - protected $_html_name; |
|
23 | - |
|
24 | - /** |
|
25 | - * id for the html label tag |
|
26 | - * |
|
27 | - * @var string |
|
28 | - */ |
|
29 | - protected $_html_label_id; |
|
30 | - |
|
31 | - /** |
|
32 | - * class for teh html label tag |
|
33 | - * |
|
34 | - * @var string |
|
35 | - */ |
|
36 | - protected $_html_label_class; |
|
37 | - |
|
38 | - /** |
|
39 | - * style for teh html label tag |
|
40 | - * |
|
41 | - * @var string |
|
42 | - */ |
|
43 | - protected $_html_label_style; |
|
44 | - |
|
45 | - /** |
|
46 | - * text to be placed in the html label |
|
47 | - * |
|
48 | - * @var string |
|
49 | - */ |
|
50 | - protected $_html_label_text; |
|
51 | - |
|
52 | - /** |
|
53 | - * the full html label. If used, all other html_label_* properties are invalid |
|
54 | - * |
|
55 | - * @var string |
|
56 | - */ |
|
57 | - protected $_html_label; |
|
58 | - |
|
59 | - /** |
|
60 | - * HTML to use for help text (normally placed below form input), in a span which normally |
|
61 | - * has a class of 'description' |
|
62 | - * |
|
63 | - * @var string |
|
64 | - */ |
|
65 | - protected $_html_help_text; |
|
66 | - |
|
67 | - /** |
|
68 | - * CSS classes for displaying the help span |
|
69 | - * |
|
70 | - * @var string |
|
71 | - */ |
|
72 | - protected $_html_help_class = 'description'; |
|
73 | - |
|
74 | - /** |
|
75 | - * CSS to put in the style attribute on the help span |
|
76 | - * |
|
77 | - * @var string |
|
78 | - */ |
|
79 | - protected $_html_help_style; |
|
80 | - |
|
81 | - /** |
|
82 | - * Stores whether or not this input's response is required. |
|
83 | - * Because certain styling elements may also want to know that this |
|
84 | - * input is required etc. |
|
85 | - * |
|
86 | - * @var boolean |
|
87 | - */ |
|
88 | - protected $_required; |
|
89 | - |
|
90 | - /** |
|
91 | - * css class added to required inputs |
|
92 | - * |
|
93 | - * @var string |
|
94 | - */ |
|
95 | - protected $_required_css_class = 'ee-required'; |
|
96 | - |
|
97 | - /** |
|
98 | - * css styles applied to button type inputs |
|
99 | - * |
|
100 | - * @var string |
|
101 | - */ |
|
102 | - protected $_button_css_attributes; |
|
103 | - |
|
104 | - /** |
|
105 | - * The raw post data submitted for this |
|
106 | - * Generally unsafe for usage in client code |
|
107 | - * |
|
108 | - * @var mixed string or array |
|
109 | - */ |
|
110 | - protected $_raw_value; |
|
111 | - |
|
112 | - /** |
|
113 | - * Value normalized according to the input's normalization strategy. |
|
114 | - * The normalization strategy dictates whether this is a string, int, float, |
|
115 | - * boolean, or array of any of those. |
|
116 | - * |
|
117 | - * @var mixed |
|
118 | - */ |
|
119 | - protected $_normalized_value; |
|
120 | - |
|
121 | - |
|
122 | - /** |
|
123 | - * Normalized default value either initially set on the input, or provided by calling |
|
124 | - * set_default(). |
|
125 | - * @var mixed |
|
126 | - */ |
|
127 | - protected $_default; |
|
128 | - |
|
129 | - /** |
|
130 | - * Strategy used for displaying this field. |
|
131 | - * Child classes must use _get_display_strategy to access it. |
|
132 | - * |
|
133 | - * @var EE_Display_Strategy_Base |
|
134 | - */ |
|
135 | - private $_display_strategy; |
|
136 | - |
|
137 | - /** |
|
138 | - * Gets all the validation strategies used on this field |
|
139 | - * |
|
140 | - * @var EE_Validation_Strategy_Base[] |
|
141 | - */ |
|
142 | - private $_validation_strategies = array(); |
|
143 | - |
|
144 | - /** |
|
145 | - * The normalization strategy for this field |
|
146 | - * |
|
147 | - * @var EE_Normalization_Strategy_Base |
|
148 | - */ |
|
149 | - private $_normalization_strategy; |
|
150 | - |
|
151 | - /** |
|
152 | - * Strategy for removing sensitive data after we're done with the form input |
|
153 | - * |
|
154 | - * @var EE_Sensitive_Data_Removal_Base |
|
155 | - */ |
|
156 | - protected $_sensitive_data_removal_strategy; |
|
157 | - |
|
158 | - /** |
|
159 | - * Whether this input has been disabled or not. |
|
160 | - * If it's disabled while rendering, an extra hidden input is added that indicates it has been knowingly disabled. |
|
161 | - * (Client-side code that wants to dynamically disable it must also add this hidden input). |
|
162 | - * When the form is submitted, if the input is disabled in the PHP form section, then input is ignored. |
|
163 | - * If the input is missing from the request data but the hidden input indicating the input is disabled, then the input is again ignored. |
|
164 | - * |
|
165 | - * @var boolean |
|
166 | - */ |
|
167 | - protected $disabled = false; |
|
168 | - |
|
169 | - |
|
170 | - |
|
171 | - /** |
|
172 | - * @param array $input_args { |
|
173 | - * @type string $html_name the html name for the input |
|
174 | - * @type string $html_label_id the id attribute to give to the html label tag |
|
175 | - * @type string $html_label_class the class attribute to give to the html label tag |
|
176 | - * @type string $html_label_style the style attribute to give ot teh label tag |
|
177 | - * @type string $html_label_text the text to put in the label tag |
|
178 | - * @type string $html_label the full html label. If used, |
|
179 | - * all other html_label_* args are invalid |
|
180 | - * @type string $html_help_text text to put in help element |
|
181 | - * @type string $html_help_style style attribute to give to teh help element |
|
182 | - * @type string $html_help_class class attribute to give to the help element |
|
183 | - * @type string $default default value NORMALIZED (eg, if providing the default |
|
184 | - * for a Yes_No_Input, you should provide TRUE or FALSE, not '1' or '0') |
|
185 | - * @type EE_Display_Strategy_Base $display strategy |
|
186 | - * @type EE_Normalization_Strategy_Base $normalization_strategy |
|
187 | - * @type EE_Validation_Strategy_Base[] $validation_strategies |
|
188 | - * @type boolean $ignore_input special argument which can be used to avoid adding any validation strategies, |
|
189 | - * and sets the normalization strategy to the Null normalization. This is good |
|
190 | - * when you want the input to be totally ignored server-side (like when using |
|
191 | - * React.js form inputs) |
|
192 | - * } |
|
193 | - */ |
|
194 | - public function __construct($input_args = array()) |
|
195 | - { |
|
196 | - $input_args = (array) apply_filters('FHEE__EE_Form_Input_Base___construct__input_args', $input_args, $this); |
|
197 | - // the following properties must be cast as arrays |
|
198 | - if (isset($input_args['validation_strategies'])) { |
|
199 | - foreach ((array) $input_args['validation_strategies'] as $validation_strategy) { |
|
200 | - if ($validation_strategy instanceof EE_Validation_Strategy_Base && empty($input_args['ignore_input'])) { |
|
201 | - $this->_validation_strategies[ get_class($validation_strategy) ] = $validation_strategy; |
|
202 | - } |
|
203 | - } |
|
204 | - unset($input_args['validation_strategies']); |
|
205 | - } |
|
206 | - if (isset($input_args['ignore_input'])) { |
|
207 | - $this->_validation_strategies = array(); |
|
208 | - } |
|
209 | - // loop thru incoming options |
|
210 | - foreach ($input_args as $key => $value) { |
|
211 | - // add underscore to $key to match property names |
|
212 | - $_key = '_' . $key; |
|
213 | - if (property_exists($this, $_key)) { |
|
214 | - $this->{$_key} = $value; |
|
215 | - } |
|
216 | - } |
|
217 | - // ensure that "required" is set correctly |
|
218 | - $this->set_required( |
|
219 | - $this->_required, |
|
220 | - isset($input_args['required_validation_error_message']) |
|
221 | - ? $input_args['required_validation_error_message'] |
|
222 | - : null |
|
223 | - ); |
|
224 | - // $this->_html_name_specified = isset( $input_args['html_name'] ) ? TRUE : FALSE; |
|
225 | - $this->_display_strategy->_construct_finalize($this); |
|
226 | - foreach ($this->_validation_strategies as $validation_strategy) { |
|
227 | - $validation_strategy->_construct_finalize($this); |
|
228 | - } |
|
229 | - if (isset($input_args['ignore_input'])) { |
|
230 | - $this->_normalization_strategy = new EE_Null_Normalization(); |
|
231 | - } |
|
232 | - if (! $this->_normalization_strategy) { |
|
233 | - $this->_normalization_strategy = new EE_Text_Normalization(); |
|
234 | - } |
|
235 | - $this->_normalization_strategy->_construct_finalize($this); |
|
236 | - // at least we can use the normalization strategy to populate the default |
|
237 | - if (isset($input_args['default'])) { |
|
238 | - $this->set_default($input_args['default']); |
|
239 | - unset($input_args['default']); |
|
240 | - } |
|
241 | - if (! $this->_sensitive_data_removal_strategy) { |
|
242 | - $this->_sensitive_data_removal_strategy = new EE_No_Sensitive_Data_Removal(); |
|
243 | - } |
|
244 | - $this->_sensitive_data_removal_strategy->_construct_finalize($this); |
|
245 | - parent::__construct($input_args); |
|
246 | - } |
|
247 | - |
|
248 | - |
|
249 | - |
|
250 | - /** |
|
251 | - * Sets the html_name to its default value, if none was specified in teh constructor. |
|
252 | - * Calculation involves using the name and the parent's html_name |
|
253 | - * |
|
254 | - * @throws EE_Error |
|
255 | - */ |
|
256 | - protected function _set_default_html_name_if_empty() |
|
257 | - { |
|
258 | - if (! $this->_html_name) { |
|
259 | - $this->_html_name = $this->name(); |
|
260 | - if ($this->_parent_section && $this->_parent_section instanceof EE_Form_Section_Proper) { |
|
261 | - $this->_html_name = $this->_parent_section->html_name_prefix() . "[{$this->name()}]"; |
|
262 | - } |
|
263 | - } |
|
264 | - } |
|
265 | - |
|
266 | - |
|
267 | - |
|
268 | - /** |
|
269 | - * @param $parent_form_section |
|
270 | - * @param $name |
|
271 | - * @throws EE_Error |
|
272 | - */ |
|
273 | - public function _construct_finalize($parent_form_section, $name) |
|
274 | - { |
|
275 | - parent::_construct_finalize($parent_form_section, $name); |
|
276 | - if ($this->_html_label === null && $this->_html_label_text === null) { |
|
277 | - $this->_html_label_text = ucwords(str_replace("_", " ", $name)); |
|
278 | - } |
|
279 | - do_action('AHEE__EE_Form_Input_Base___construct_finalize__end', $this, $parent_form_section, $name); |
|
280 | - } |
|
281 | - |
|
282 | - |
|
283 | - |
|
284 | - /** |
|
285 | - * Returns the strategy for displaying this form input. If none is set, throws an exception. |
|
286 | - * |
|
287 | - * @return EE_Display_Strategy_Base |
|
288 | - * @throws EE_Error |
|
289 | - */ |
|
290 | - protected function _get_display_strategy() |
|
291 | - { |
|
292 | - $this->ensure_construct_finalized_called(); |
|
293 | - if (! $this->_display_strategy || ! $this->_display_strategy instanceof EE_Display_Strategy_Base) { |
|
294 | - throw new EE_Error( |
|
295 | - sprintf( |
|
296 | - esc_html__( |
|
297 | - "Cannot get display strategy for form input with name %s and id %s, because it has not been set in the constructor", |
|
298 | - "event_espresso" |
|
299 | - ), |
|
300 | - $this->html_name(), |
|
301 | - $this->html_id() |
|
302 | - ) |
|
303 | - ); |
|
304 | - } else { |
|
305 | - return $this->_display_strategy; |
|
306 | - } |
|
307 | - } |
|
308 | - |
|
309 | - |
|
310 | - |
|
311 | - /** |
|
312 | - * Sets the display strategy. |
|
313 | - * |
|
314 | - * @param EE_Display_Strategy_Base $strategy |
|
315 | - */ |
|
316 | - protected function _set_display_strategy(EE_Display_Strategy_Base $strategy) |
|
317 | - { |
|
318 | - $this->_display_strategy = $strategy; |
|
319 | - } |
|
320 | - |
|
321 | - |
|
322 | - |
|
323 | - /** |
|
324 | - * Sets the sanitization strategy |
|
325 | - * |
|
326 | - * @param EE_Normalization_Strategy_Base $strategy |
|
327 | - */ |
|
328 | - protected function _set_normalization_strategy(EE_Normalization_Strategy_Base $strategy) |
|
329 | - { |
|
330 | - $this->_normalization_strategy = $strategy; |
|
331 | - } |
|
332 | - |
|
333 | - |
|
334 | - |
|
335 | - /** |
|
336 | - * Gets sensitive_data_removal_strategy |
|
337 | - * |
|
338 | - * @return EE_Sensitive_Data_Removal_Base |
|
339 | - */ |
|
340 | - public function get_sensitive_data_removal_strategy() |
|
341 | - { |
|
342 | - return $this->_sensitive_data_removal_strategy; |
|
343 | - } |
|
344 | - |
|
345 | - |
|
346 | - |
|
347 | - /** |
|
348 | - * Sets sensitive_data_removal_strategy |
|
349 | - * |
|
350 | - * @param EE_Sensitive_Data_Removal_Base $sensitive_data_removal_strategy |
|
351 | - * @return void |
|
352 | - */ |
|
353 | - public function set_sensitive_data_removal_strategy($sensitive_data_removal_strategy) |
|
354 | - { |
|
355 | - $this->_sensitive_data_removal_strategy = $sensitive_data_removal_strategy; |
|
356 | - } |
|
357 | - |
|
358 | - |
|
359 | - |
|
360 | - /** |
|
361 | - * Gets the display strategy for this input |
|
362 | - * |
|
363 | - * @return EE_Display_Strategy_Base |
|
364 | - */ |
|
365 | - public function get_display_strategy() |
|
366 | - { |
|
367 | - return $this->_display_strategy; |
|
368 | - } |
|
369 | - |
|
370 | - |
|
371 | - |
|
372 | - /** |
|
373 | - * Overwrites the display strategy |
|
374 | - * |
|
375 | - * @param EE_Display_Strategy_Base $display_strategy |
|
376 | - */ |
|
377 | - public function set_display_strategy($display_strategy) |
|
378 | - { |
|
379 | - $this->_display_strategy = $display_strategy; |
|
380 | - $this->_display_strategy->_construct_finalize($this); |
|
381 | - } |
|
382 | - |
|
383 | - |
|
384 | - |
|
385 | - /** |
|
386 | - * Gets the normalization strategy set on this input |
|
387 | - * |
|
388 | - * @return EE_Normalization_Strategy_Base |
|
389 | - */ |
|
390 | - public function get_normalization_strategy() |
|
391 | - { |
|
392 | - return $this->_normalization_strategy; |
|
393 | - } |
|
394 | - |
|
395 | - |
|
396 | - |
|
397 | - /** |
|
398 | - * Overwrites the normalization strategy |
|
399 | - * |
|
400 | - * @param EE_Normalization_Strategy_Base $normalization_strategy |
|
401 | - */ |
|
402 | - public function set_normalization_strategy($normalization_strategy) |
|
403 | - { |
|
404 | - $this->_normalization_strategy = $normalization_strategy; |
|
405 | - $this->_normalization_strategy->_construct_finalize($this); |
|
406 | - } |
|
407 | - |
|
408 | - |
|
409 | - |
|
410 | - /** |
|
411 | - * Returns all teh validation strategies which apply to this field, numerically indexed |
|
412 | - * |
|
413 | - * @return EE_Validation_Strategy_Base[] |
|
414 | - */ |
|
415 | - public function get_validation_strategies() |
|
416 | - { |
|
417 | - return $this->_validation_strategies; |
|
418 | - } |
|
419 | - |
|
420 | - |
|
421 | - |
|
422 | - /** |
|
423 | - * Adds this strategy to the field so it will be used in both JS validation and server-side validation |
|
424 | - * |
|
425 | - * @param EE_Validation_Strategy_Base $validation_strategy |
|
426 | - * @return void |
|
427 | - */ |
|
428 | - protected function _add_validation_strategy(EE_Validation_Strategy_Base $validation_strategy) |
|
429 | - { |
|
430 | - $validation_strategy->_construct_finalize($this); |
|
431 | - $this->_validation_strategies[] = $validation_strategy; |
|
432 | - } |
|
433 | - |
|
434 | - |
|
435 | - |
|
436 | - /** |
|
437 | - * Adds a new validation strategy onto the form input |
|
438 | - * |
|
439 | - * @param EE_Validation_Strategy_Base $validation_strategy |
|
440 | - * @return void |
|
441 | - */ |
|
442 | - public function add_validation_strategy(EE_Validation_Strategy_Base $validation_strategy) |
|
443 | - { |
|
444 | - $this->_add_validation_strategy($validation_strategy); |
|
445 | - } |
|
446 | - |
|
447 | - |
|
448 | - |
|
449 | - /** |
|
450 | - * The classname of the validation strategy to remove |
|
451 | - * |
|
452 | - * @param string $validation_strategy_classname |
|
453 | - */ |
|
454 | - public function remove_validation_strategy($validation_strategy_classname) |
|
455 | - { |
|
456 | - foreach ($this->_validation_strategies as $key => $validation_strategy) { |
|
457 | - if ( |
|
458 | - $validation_strategy instanceof $validation_strategy_classname |
|
459 | - || is_subclass_of($validation_strategy, $validation_strategy_classname) |
|
460 | - ) { |
|
461 | - unset($this->_validation_strategies[ $key ]); |
|
462 | - } |
|
463 | - } |
|
464 | - } |
|
465 | - |
|
466 | - |
|
467 | - |
|
468 | - /** |
|
469 | - * returns true if input employs any of the validation strategy defined by the supplied array of classnames |
|
470 | - * |
|
471 | - * @param array $validation_strategy_classnames |
|
472 | - * @return bool |
|
473 | - */ |
|
474 | - public function has_validation_strategy($validation_strategy_classnames) |
|
475 | - { |
|
476 | - $validation_strategy_classnames = is_array($validation_strategy_classnames) |
|
477 | - ? $validation_strategy_classnames |
|
478 | - : array($validation_strategy_classnames); |
|
479 | - foreach ($this->_validation_strategies as $key => $validation_strategy) { |
|
480 | - if (in_array($key, $validation_strategy_classnames)) { |
|
481 | - return true; |
|
482 | - } |
|
483 | - } |
|
484 | - return false; |
|
485 | - } |
|
486 | - |
|
487 | - |
|
488 | - |
|
489 | - /** |
|
490 | - * Gets the HTML |
|
491 | - * |
|
492 | - * @return string |
|
493 | - */ |
|
494 | - public function get_html() |
|
495 | - { |
|
496 | - return $this->_parent_section->get_html_for_input($this); |
|
497 | - } |
|
498 | - |
|
499 | - |
|
500 | - |
|
501 | - /** |
|
502 | - * Gets the HTML for the input itself (no label or errors) according to the |
|
503 | - * input's display strategy |
|
504 | - * Makes sure the JS and CSS are enqueued for it |
|
505 | - * |
|
506 | - * @return string |
|
507 | - * @throws EE_Error |
|
508 | - */ |
|
509 | - public function get_html_for_input() |
|
510 | - { |
|
511 | - return $this->_form_html_filter |
|
512 | - ? $this->_form_html_filter->filterHtml( |
|
513 | - $this->_get_display_strategy()->display(), |
|
514 | - $this |
|
515 | - ) |
|
516 | - : $this->_get_display_strategy()->display(); |
|
517 | - } |
|
518 | - |
|
519 | - |
|
520 | - |
|
521 | - /** |
|
522 | - * @return string |
|
523 | - */ |
|
524 | - public function html_other_attributes() |
|
525 | - { |
|
526 | - EE_Error::doing_it_wrong( |
|
527 | - __METHOD__, |
|
528 | - sprintf( |
|
529 | - esc_html__( |
|
530 | - 'This method is no longer in use. You should replace it by %s', |
|
531 | - 'event_espresso' |
|
532 | - ), |
|
533 | - 'EE_Form_Section_Base::other_html_attributes()' |
|
534 | - ), |
|
535 | - '4.10.2.p' |
|
536 | - ); |
|
537 | - |
|
538 | - return $this->other_html_attributes(); |
|
539 | - } |
|
540 | - |
|
541 | - |
|
542 | - |
|
543 | - /** |
|
544 | - * @param string $html_other_attributes |
|
545 | - */ |
|
546 | - public function set_html_other_attributes($html_other_attributes) |
|
547 | - { |
|
548 | - EE_Error::doing_it_wrong( |
|
549 | - __METHOD__, |
|
550 | - sprintf( |
|
551 | - esc_html__( |
|
552 | - 'This method is no longer in use. You should replace it by %s', |
|
553 | - 'event_espresso' |
|
554 | - ), |
|
555 | - 'EE_Form_Section_Base::set_other_html_attributes()' |
|
556 | - ), |
|
557 | - '4.10.2.p' |
|
558 | - ); |
|
559 | - |
|
560 | - $this->set_other_html_attributes($html_other_attributes); |
|
561 | - } |
|
562 | - |
|
563 | - |
|
564 | - |
|
565 | - /** |
|
566 | - * Gets the HTML for displaying the label for this form input |
|
567 | - * according to the form section's layout strategy |
|
568 | - * |
|
569 | - * @return string |
|
570 | - */ |
|
571 | - public function get_html_for_label() |
|
572 | - { |
|
573 | - return $this->_parent_section->get_layout_strategy()->display_label($this); |
|
574 | - } |
|
575 | - |
|
576 | - |
|
577 | - |
|
578 | - /** |
|
579 | - * Gets the HTML for displaying the errors section for this form input |
|
580 | - * according to the form section's layout strategy |
|
581 | - * |
|
582 | - * @return string |
|
583 | - */ |
|
584 | - public function get_html_for_errors() |
|
585 | - { |
|
586 | - return $this->_parent_section->get_layout_strategy()->display_errors($this); |
|
587 | - } |
|
588 | - |
|
589 | - |
|
590 | - |
|
591 | - /** |
|
592 | - * Gets the HTML for displaying the help text for this form input |
|
593 | - * according to the form section's layout strategy |
|
594 | - * |
|
595 | - * @return string |
|
596 | - */ |
|
597 | - public function get_html_for_help() |
|
598 | - { |
|
599 | - return $this->_parent_section->get_layout_strategy()->display_help_text($this); |
|
600 | - } |
|
601 | - |
|
602 | - |
|
603 | - |
|
604 | - /** |
|
605 | - * Validates the input's sanitized value (assumes _sanitize() has already been called) |
|
606 | - * and returns whether or not the form input's submitted value is value |
|
607 | - * |
|
608 | - * @return boolean |
|
609 | - */ |
|
610 | - protected function _validate() |
|
611 | - { |
|
612 | - if ($this->isDisabled()) { |
|
613 | - return true; |
|
614 | - } |
|
615 | - foreach ($this->_validation_strategies as $validation_strategy) { |
|
616 | - if ($validation_strategy instanceof EE_Validation_Strategy_Base) { |
|
617 | - try { |
|
618 | - $validation_strategy->validate($this->normalized_value()); |
|
619 | - } catch (EE_Validation_Error $e) { |
|
620 | - $this->add_validation_error($e); |
|
621 | - } |
|
622 | - } |
|
623 | - } |
|
624 | - if ($this->get_validation_errors()) { |
|
625 | - return false; |
|
626 | - } else { |
|
627 | - return true; |
|
628 | - } |
|
629 | - } |
|
630 | - |
|
631 | - |
|
632 | - |
|
633 | - /** |
|
634 | - * Performs basic sanitization on this value. But what sanitization can be performed anyways? |
|
635 | - * This value MIGHT be allowed to have tags, so we can't really remove them. |
|
636 | - * |
|
637 | - * @param string $value |
|
638 | - * @return null|string |
|
639 | - */ |
|
640 | - protected function _sanitize($value) |
|
641 | - { |
|
642 | - return $value !== null ? stripslashes(html_entity_decode(trim($value))) : null; |
|
643 | - } |
|
644 | - |
|
645 | - |
|
646 | - |
|
647 | - /** |
|
648 | - * Picks out the form value that relates to this form input, |
|
649 | - * and stores it as the sanitized value on the form input, and sets the normalized value. |
|
650 | - * Returns whether or not any validation errors occurred |
|
651 | - * |
|
652 | - * @param array $req_data |
|
653 | - * @return boolean whether or not there was an error |
|
654 | - * @throws EE_Error |
|
655 | - */ |
|
656 | - protected function _normalize($req_data) |
|
657 | - { |
|
658 | - // any existing validation errors don't apply so clear them |
|
659 | - $this->_validation_errors = array(); |
|
660 | - // if the input is disabled, ignore whatever input was sent in |
|
661 | - if ($this->isDisabled()) { |
|
662 | - $this->_set_raw_value(null); |
|
663 | - $this->_set_normalized_value($this->get_default()); |
|
664 | - return false; |
|
665 | - } |
|
666 | - try { |
|
667 | - $raw_input = $this->find_form_data_for_this_section($req_data); |
|
668 | - // super simple sanitization for now |
|
669 | - if (is_array($raw_input)) { |
|
670 | - $raw_value = array(); |
|
671 | - foreach ($raw_input as $key => $value) { |
|
672 | - $raw_value[ $key ] = $this->_sanitize($value); |
|
673 | - } |
|
674 | - $this->_set_raw_value($raw_value); |
|
675 | - } else { |
|
676 | - $this->_set_raw_value($this->_sanitize($raw_input)); |
|
677 | - } |
|
678 | - // we want to mostly leave the input alone in case we need to re-display it to the user |
|
679 | - $this->_set_normalized_value($this->_normalization_strategy->normalize($this->raw_value())); |
|
680 | - return false; |
|
681 | - } catch (EE_Validation_Error $e) { |
|
682 | - $this->add_validation_error($e); |
|
683 | - return true; |
|
684 | - } |
|
685 | - } |
|
686 | - |
|
687 | - |
|
688 | - /** |
|
689 | - * @return string |
|
690 | - * @throws EE_Error |
|
691 | - */ |
|
692 | - public function html_name() |
|
693 | - { |
|
694 | - $this->_set_default_html_name_if_empty(); |
|
695 | - return $this->_html_name; |
|
696 | - } |
|
697 | - |
|
698 | - |
|
699 | - /** |
|
700 | - * @return string |
|
701 | - * @throws EE_Error |
|
702 | - */ |
|
703 | - public function html_label_id() |
|
704 | - { |
|
705 | - return ! empty($this->_html_label_id) ? $this->_html_label_id : $this->html_id() . '-lbl'; |
|
706 | - } |
|
707 | - |
|
708 | - |
|
709 | - |
|
710 | - /** |
|
711 | - * @return string |
|
712 | - */ |
|
713 | - public function html_label_class() |
|
714 | - { |
|
715 | - return $this->_html_label_class; |
|
716 | - } |
|
717 | - |
|
718 | - |
|
719 | - |
|
720 | - /** |
|
721 | - * @return string |
|
722 | - */ |
|
723 | - public function html_label_style() |
|
724 | - { |
|
725 | - return $this->_html_label_style; |
|
726 | - } |
|
727 | - |
|
728 | - |
|
729 | - |
|
730 | - /** |
|
731 | - * @return string |
|
732 | - */ |
|
733 | - public function html_label_text() |
|
734 | - { |
|
735 | - return $this->_html_label_text; |
|
736 | - } |
|
737 | - |
|
738 | - |
|
739 | - |
|
740 | - /** |
|
741 | - * @return string |
|
742 | - */ |
|
743 | - public function html_help_text() |
|
744 | - { |
|
745 | - return $this->_html_help_text; |
|
746 | - } |
|
747 | - |
|
748 | - |
|
749 | - |
|
750 | - /** |
|
751 | - * @return string |
|
752 | - */ |
|
753 | - public function html_help_class() |
|
754 | - { |
|
755 | - return $this->_html_help_class; |
|
756 | - } |
|
757 | - |
|
758 | - |
|
759 | - |
|
760 | - /** |
|
761 | - * @return string |
|
762 | - */ |
|
763 | - public function html_help_style() |
|
764 | - { |
|
765 | - return $this->_html_style; |
|
766 | - } |
|
767 | - |
|
768 | - |
|
769 | - |
|
770 | - /** |
|
771 | - * returns the raw, UNSAFE, input, almost exactly as the user submitted it. |
|
772 | - * Please note that almost all client code should instead use the normalized_value; |
|
773 | - * or possibly raw_value_in_form (which prepares the string for displaying in an HTML attribute on a tag, |
|
774 | - * mostly by escaping quotes) |
|
775 | - * Note, we do not store the exact original value sent in the user's request because |
|
776 | - * it may have malicious content, and we MIGHT want to store the form input in a transient or something... |
|
777 | - * in which case, we would have stored the malicious content to our database. |
|
778 | - * |
|
779 | - * @return string |
|
780 | - */ |
|
781 | - public function raw_value() |
|
782 | - { |
|
783 | - return $this->_raw_value; |
|
784 | - } |
|
785 | - |
|
786 | - |
|
787 | - |
|
788 | - /** |
|
789 | - * Returns a string safe to usage in form inputs when displaying, because |
|
790 | - * it escapes all html entities |
|
791 | - * |
|
792 | - * @return string |
|
793 | - */ |
|
794 | - public function raw_value_in_form() |
|
795 | - { |
|
796 | - return htmlentities($this->raw_value(), ENT_QUOTES, 'UTF-8'); |
|
797 | - } |
|
798 | - |
|
799 | - |
|
800 | - |
|
801 | - /** |
|
802 | - * returns the value after it's been sanitized, and then converted into it's proper type |
|
803 | - * in PHP. Eg, a string, an int, an array, |
|
804 | - * |
|
805 | - * @return mixed |
|
806 | - */ |
|
807 | - public function normalized_value() |
|
808 | - { |
|
809 | - return $this->_normalized_value; |
|
810 | - } |
|
811 | - |
|
812 | - |
|
813 | - |
|
814 | - /** |
|
815 | - * Returns the normalized value is a presentable way. By default this is just |
|
816 | - * the normalized value by itself, but it can be overridden for when that's not |
|
817 | - * the best thing to display |
|
818 | - * |
|
819 | - * @return string |
|
820 | - */ |
|
821 | - public function pretty_value() |
|
822 | - { |
|
823 | - return $this->_normalized_value; |
|
824 | - } |
|
825 | - |
|
826 | - |
|
827 | - |
|
828 | - /** |
|
829 | - * When generating the JS for the jquery validation rules like<br> |
|
830 | - * <code>$( "#myform" ).validate({ |
|
831 | - * rules: { |
|
832 | - * password: "required", |
|
833 | - * password_again: { |
|
834 | - * equalTo: "#password" |
|
835 | - * } |
|
836 | - * } |
|
837 | - * });</code> |
|
838 | - * if this field had the name 'password_again', it should return |
|
839 | - * <br><code>password_again: { |
|
840 | - * equalTo: "#password" |
|
841 | - * }</code> |
|
842 | - * |
|
843 | - * @return array |
|
844 | - */ |
|
845 | - public function get_jquery_validation_rules() |
|
846 | - { |
|
847 | - $jquery_validation_js = array(); |
|
848 | - $jquery_validation_rules = array(); |
|
849 | - foreach ($this->get_validation_strategies() as $validation_strategy) { |
|
850 | - $jquery_validation_rules = array_replace_recursive( |
|
851 | - $jquery_validation_rules, |
|
852 | - $validation_strategy->get_jquery_validation_rule_array() |
|
853 | - ); |
|
854 | - } |
|
855 | - if (! empty($jquery_validation_rules)) { |
|
856 | - foreach ($this->get_display_strategy()->get_html_input_ids(true) as $html_id_with_pound_sign) { |
|
857 | - $jquery_validation_js[ $html_id_with_pound_sign ] = $jquery_validation_rules; |
|
858 | - } |
|
859 | - } |
|
860 | - return $jquery_validation_js; |
|
861 | - } |
|
862 | - |
|
863 | - |
|
864 | - |
|
865 | - /** |
|
866 | - * Sets the input's default value for use in displaying in the form. Note: value should be |
|
867 | - * normalized (Eg, if providing a default of ra Yes_NO_Input you would provide TRUE or FALSE, not '1' or '0') |
|
868 | - * |
|
869 | - * @param mixed $value |
|
870 | - * @return void |
|
871 | - */ |
|
872 | - public function set_default($value) |
|
873 | - { |
|
874 | - $this->_default = $value; |
|
875 | - $this->_set_normalized_value($value); |
|
876 | - $this->_set_raw_value($value); |
|
877 | - } |
|
878 | - |
|
879 | - |
|
880 | - |
|
881 | - /** |
|
882 | - * Sets the normalized value on this input |
|
883 | - * |
|
884 | - * @param mixed $value |
|
885 | - */ |
|
886 | - protected function _set_normalized_value($value) |
|
887 | - { |
|
888 | - $this->_normalized_value = $value; |
|
889 | - } |
|
890 | - |
|
891 | - |
|
892 | - |
|
893 | - /** |
|
894 | - * Sets the raw value on this input (ie, exactly as the user submitted it) |
|
895 | - * |
|
896 | - * @param mixed $value |
|
897 | - */ |
|
898 | - protected function _set_raw_value($value) |
|
899 | - { |
|
900 | - $this->_raw_value = $this->_normalization_strategy->unnormalize($value); |
|
901 | - } |
|
902 | - |
|
903 | - |
|
904 | - |
|
905 | - /** |
|
906 | - * Sets the HTML label text after it has already been defined |
|
907 | - * |
|
908 | - * @param string $label |
|
909 | - * @return void |
|
910 | - */ |
|
911 | - public function set_html_label_text($label) |
|
912 | - { |
|
913 | - $this->_html_label_text = $label; |
|
914 | - } |
|
915 | - |
|
916 | - |
|
917 | - |
|
918 | - /** |
|
919 | - * Sets whether or not this field is required, and adjusts the validation strategy. |
|
920 | - * If you want to use the EE_Conditionally_Required_Validation_Strategy, |
|
921 | - * please add it as a validation strategy using add_validation_strategy as normal |
|
922 | - * |
|
923 | - * @param boolean $required boolean |
|
924 | - * @param null $required_text |
|
925 | - */ |
|
926 | - public function set_required($required = true, $required_text = null) |
|
927 | - { |
|
928 | - $required = filter_var($required, FILTER_VALIDATE_BOOLEAN); |
|
929 | - // whether $required is a string or a boolean, we want to add a required validation strategy |
|
930 | - if ($required) { |
|
931 | - $this->_add_validation_strategy(new EE_Required_Validation_Strategy($required_text)); |
|
932 | - } else { |
|
933 | - $this->remove_validation_strategy('EE_Required_Validation_Strategy'); |
|
934 | - } |
|
935 | - $this->_required = $required; |
|
936 | - } |
|
937 | - |
|
938 | - |
|
939 | - |
|
940 | - /** |
|
941 | - * Returns whether or not this field is required |
|
942 | - * |
|
943 | - * @return boolean |
|
944 | - */ |
|
945 | - public function required() |
|
946 | - { |
|
947 | - return $this->_required; |
|
948 | - } |
|
949 | - |
|
950 | - |
|
951 | - |
|
952 | - /** |
|
953 | - * @param string $required_css_class |
|
954 | - */ |
|
955 | - public function set_required_css_class($required_css_class) |
|
956 | - { |
|
957 | - $this->_required_css_class = $required_css_class; |
|
958 | - } |
|
959 | - |
|
960 | - |
|
961 | - |
|
962 | - /** |
|
963 | - * @return string |
|
964 | - */ |
|
965 | - public function required_css_class() |
|
966 | - { |
|
967 | - return $this->_required_css_class; |
|
968 | - } |
|
969 | - |
|
970 | - |
|
971 | - |
|
972 | - /** |
|
973 | - * @param bool $add_required |
|
974 | - * @return string |
|
975 | - */ |
|
976 | - public function html_class($add_required = false) |
|
977 | - { |
|
978 | - return $add_required && $this->required() |
|
979 | - ? $this->required_css_class() . ' ' . $this->_html_class |
|
980 | - : $this->_html_class; |
|
981 | - } |
|
982 | - |
|
983 | - |
|
984 | - /** |
|
985 | - * Sets the help text, in case |
|
986 | - * |
|
987 | - * @param string $text |
|
988 | - */ |
|
989 | - public function set_html_help_text($text) |
|
990 | - { |
|
991 | - $this->_html_help_text = $text; |
|
992 | - } |
|
993 | - |
|
994 | - |
|
995 | - |
|
996 | - /** |
|
997 | - * Uses the sensitive data removal strategy to remove the sensitive data from this |
|
998 | - * input. If there is any kind of sensitive data removal on this input, we clear |
|
999 | - * out the raw value completely |
|
1000 | - * |
|
1001 | - * @return void |
|
1002 | - */ |
|
1003 | - public function clean_sensitive_data() |
|
1004 | - { |
|
1005 | - // if we do ANY kind of sensitive data removal on this, then just clear out the raw value |
|
1006 | - // if we need more logic than this we'll make a strategy for it |
|
1007 | - if ( |
|
1008 | - $this->_sensitive_data_removal_strategy |
|
1009 | - && ! $this->_sensitive_data_removal_strategy instanceof EE_No_Sensitive_Data_Removal |
|
1010 | - ) { |
|
1011 | - $this->_set_raw_value(null); |
|
1012 | - } |
|
1013 | - // and clean the normalized value according to the appropriate strategy |
|
1014 | - $this->_set_normalized_value( |
|
1015 | - $this->get_sensitive_data_removal_strategy()->remove_sensitive_data( |
|
1016 | - $this->_normalized_value |
|
1017 | - ) |
|
1018 | - ); |
|
1019 | - } |
|
1020 | - |
|
1021 | - |
|
1022 | - |
|
1023 | - /** |
|
1024 | - * @param bool $primary |
|
1025 | - * @param string $button_size |
|
1026 | - * @param string $other_attributes |
|
1027 | - */ |
|
1028 | - public function set_button_css_attributes($primary = true, $button_size = '', $other_attributes = '') |
|
1029 | - { |
|
1030 | - $button_css_attributes = 'button'; |
|
1031 | - $button_css_attributes .= $primary === true ? ' button-primary' : ' button-secondary'; |
|
1032 | - switch ($button_size) { |
|
1033 | - case 'xs': |
|
1034 | - case 'extra-small': |
|
1035 | - $button_css_attributes .= ' button-xs'; |
|
1036 | - break; |
|
1037 | - case 'sm': |
|
1038 | - case 'small': |
|
1039 | - $button_css_attributes .= ' button-sm'; |
|
1040 | - break; |
|
1041 | - case 'lg': |
|
1042 | - case 'large': |
|
1043 | - $button_css_attributes .= ' button-lg'; |
|
1044 | - break; |
|
1045 | - case 'block': |
|
1046 | - $button_css_attributes .= ' button-block'; |
|
1047 | - break; |
|
1048 | - case 'md': |
|
1049 | - case 'medium': |
|
1050 | - default: |
|
1051 | - $button_css_attributes .= ''; |
|
1052 | - } |
|
1053 | - $this->_button_css_attributes .= ! empty($other_attributes) |
|
1054 | - ? $button_css_attributes . ' ' . $other_attributes |
|
1055 | - : $button_css_attributes; |
|
1056 | - } |
|
1057 | - |
|
1058 | - |
|
1059 | - |
|
1060 | - /** |
|
1061 | - * @return string |
|
1062 | - */ |
|
1063 | - public function button_css_attributes() |
|
1064 | - { |
|
1065 | - if (empty($this->_button_css_attributes)) { |
|
1066 | - $this->set_button_css_attributes(); |
|
1067 | - } |
|
1068 | - return $this->_button_css_attributes; |
|
1069 | - } |
|
1070 | - |
|
1071 | - |
|
1072 | - |
|
1073 | - /** |
|
1074 | - * find_form_data_for_this_section |
|
1075 | - * using this section's name and its parents, finds the value of the form data that corresponds to it. |
|
1076 | - * For example, if this form section's HTML name is my_form[subform][form_input_1], |
|
1077 | - * then it's value should be in request at request['my_form']['subform']['form_input_1']. |
|
1078 | - * (If that doesn't exist, we also check for this subsection's name |
|
1079 | - * at the TOP LEVEL of the request data. Eg request['form_input_1'].) |
|
1080 | - * This function finds its value in the form. |
|
1081 | - * |
|
1082 | - * @param array $req_data |
|
1083 | - * @return mixed whatever the raw value of this form section is in the request data |
|
1084 | - * @throws EE_Error |
|
1085 | - */ |
|
1086 | - public function find_form_data_for_this_section($req_data) |
|
1087 | - { |
|
1088 | - $name_parts = $this->getInputNameParts(); |
|
1089 | - // now get the value for the input |
|
1090 | - $value = $this->findRequestForSectionUsingNameParts($name_parts, $req_data); |
|
1091 | - // check if this thing's name is at the TOP level of the request data |
|
1092 | - if ($value === null && isset($req_data[ $this->name() ])) { |
|
1093 | - $value = $req_data[ $this->name() ]; |
|
1094 | - } |
|
1095 | - return $value; |
|
1096 | - } |
|
1097 | - |
|
1098 | - |
|
1099 | - /** |
|
1100 | - * If this input's name is something like "foo[bar][baz]" |
|
1101 | - * returns an array like `array('foo','bar',baz')` |
|
1102 | - * |
|
1103 | - * @return array |
|
1104 | - * @throws EE_Error |
|
1105 | - */ |
|
1106 | - protected function getInputNameParts() |
|
1107 | - { |
|
1108 | - // break up the html name by "[]" |
|
1109 | - if (strpos($this->html_name(), '[') !== false) { |
|
1110 | - $before_any_brackets = substr($this->html_name(), 0, strpos($this->html_name(), '[')); |
|
1111 | - } else { |
|
1112 | - $before_any_brackets = $this->html_name(); |
|
1113 | - } |
|
1114 | - // grab all of the segments |
|
1115 | - preg_match_all('~\[([^]]*)\]~', $this->html_name(), $matches); |
|
1116 | - if (isset($matches[1]) && is_array($matches[1])) { |
|
1117 | - $name_parts = $matches[1]; |
|
1118 | - array_unshift($name_parts, $before_any_brackets); |
|
1119 | - } else { |
|
1120 | - $name_parts = array($before_any_brackets); |
|
1121 | - } |
|
1122 | - return $name_parts; |
|
1123 | - } |
|
1124 | - |
|
1125 | - |
|
1126 | - |
|
1127 | - /** |
|
1128 | - * @param array $html_name_parts |
|
1129 | - * @param array $req_data |
|
1130 | - * @return array | NULL |
|
1131 | - */ |
|
1132 | - public function findRequestForSectionUsingNameParts($html_name_parts, $req_data) |
|
1133 | - { |
|
1134 | - $first_part_to_consider = array_shift($html_name_parts); |
|
1135 | - if (isset($req_data[ $first_part_to_consider ])) { |
|
1136 | - if (empty($html_name_parts)) { |
|
1137 | - return $req_data[ $first_part_to_consider ]; |
|
1138 | - } else { |
|
1139 | - return $this->findRequestForSectionUsingNameParts( |
|
1140 | - $html_name_parts, |
|
1141 | - $req_data[ $first_part_to_consider ] |
|
1142 | - ); |
|
1143 | - } |
|
1144 | - } else { |
|
1145 | - return null; |
|
1146 | - } |
|
1147 | - } |
|
1148 | - |
|
1149 | - |
|
1150 | - |
|
1151 | - /** |
|
1152 | - * Checks if this form input's data is in the request data |
|
1153 | - * |
|
1154 | - * @param array $req_data |
|
1155 | - * @return boolean |
|
1156 | - * @throws EE_Error |
|
1157 | - */ |
|
1158 | - public function form_data_present_in($req_data = null) |
|
1159 | - { |
|
1160 | - if ($req_data === null) { |
|
1161 | - /** @var RequestInterface $request */ |
|
1162 | - $request = LoaderFactory::getLoader()->getShared(RequestInterface::class); |
|
1163 | - $req_data = $request->postParams(); |
|
1164 | - } |
|
1165 | - $checked_value = $this->find_form_data_for_this_section($req_data); |
|
1166 | - if ($checked_value !== null) { |
|
1167 | - return true; |
|
1168 | - } else { |
|
1169 | - return false; |
|
1170 | - } |
|
1171 | - } |
|
1172 | - |
|
1173 | - |
|
1174 | - |
|
1175 | - /** |
|
1176 | - * Overrides parent to add js data from validation and display strategies |
|
1177 | - * |
|
1178 | - * @param array $form_other_js_data |
|
1179 | - * @return array |
|
1180 | - */ |
|
1181 | - public function get_other_js_data($form_other_js_data = array()) |
|
1182 | - { |
|
1183 | - return $this->get_other_js_data_from_strategies($form_other_js_data); |
|
1184 | - } |
|
1185 | - |
|
1186 | - |
|
1187 | - |
|
1188 | - /** |
|
1189 | - * Gets other JS data for localization from this input's strategies, like |
|
1190 | - * the validation strategies and the display strategy |
|
1191 | - * |
|
1192 | - * @param array $form_other_js_data |
|
1193 | - * @return array |
|
1194 | - */ |
|
1195 | - public function get_other_js_data_from_strategies($form_other_js_data = array()) |
|
1196 | - { |
|
1197 | - $form_other_js_data = $this->get_display_strategy()->get_other_js_data($form_other_js_data); |
|
1198 | - foreach ($this->get_validation_strategies() as $validation_strategy) { |
|
1199 | - $form_other_js_data = $validation_strategy->get_other_js_data($form_other_js_data); |
|
1200 | - } |
|
1201 | - return $form_other_js_data; |
|
1202 | - } |
|
1203 | - |
|
1204 | - |
|
1205 | - |
|
1206 | - /** |
|
1207 | - * Override parent because we want to give our strategies an opportunity to enqueue some js and css |
|
1208 | - * |
|
1209 | - * @return void |
|
1210 | - */ |
|
1211 | - public function enqueue_js() |
|
1212 | - { |
|
1213 | - // ask our display strategy and validation strategies if they have js to enqueue |
|
1214 | - $this->enqueue_js_from_strategies(); |
|
1215 | - } |
|
1216 | - |
|
1217 | - |
|
1218 | - |
|
1219 | - /** |
|
1220 | - * Tells strategies when its ok to enqueue their js and css |
|
1221 | - * |
|
1222 | - * @return void |
|
1223 | - */ |
|
1224 | - public function enqueue_js_from_strategies() |
|
1225 | - { |
|
1226 | - $this->get_display_strategy()->enqueue_js(); |
|
1227 | - foreach ($this->get_validation_strategies() as $validation_strategy) { |
|
1228 | - $validation_strategy->enqueue_js(); |
|
1229 | - } |
|
1230 | - } |
|
1231 | - |
|
1232 | - |
|
1233 | - |
|
1234 | - /** |
|
1235 | - * Gets the default value set on the input (not the current value, which may have been |
|
1236 | - * changed because of a form submission). If no default was set, this us null. |
|
1237 | - * @return mixed |
|
1238 | - */ |
|
1239 | - public function get_default() |
|
1240 | - { |
|
1241 | - return $this->_default; |
|
1242 | - } |
|
1243 | - |
|
1244 | - |
|
1245 | - |
|
1246 | - /** |
|
1247 | - * Makes this input disabled. That means it will have the HTML attribute 'disabled="disabled"', |
|
1248 | - * and server-side if any input was received it will be ignored |
|
1249 | - */ |
|
1250 | - public function disable($disable = true) |
|
1251 | - { |
|
1252 | - $disabled_attribute = ' disabled="disabled"'; |
|
1253 | - $this->disabled = filter_var($disable, FILTER_VALIDATE_BOOLEAN); |
|
1254 | - if ($this->disabled) { |
|
1255 | - if (strpos($this->_other_html_attributes, $disabled_attribute) === false) { |
|
1256 | - $this->_other_html_attributes .= $disabled_attribute; |
|
1257 | - } |
|
1258 | - $this->_set_normalized_value($this->get_default()); |
|
1259 | - } else { |
|
1260 | - $this->_other_html_attributes = str_replace($disabled_attribute, '', $this->_other_html_attributes); |
|
1261 | - } |
|
1262 | - } |
|
1263 | - |
|
1264 | - |
|
1265 | - |
|
1266 | - /** |
|
1267 | - * Returns whether or not this input is currently disabled. |
|
1268 | - * @return bool |
|
1269 | - */ |
|
1270 | - public function isDisabled() |
|
1271 | - { |
|
1272 | - return $this->disabled; |
|
1273 | - } |
|
17 | + /** |
|
18 | + * the input's name attribute |
|
19 | + * |
|
20 | + * @var string |
|
21 | + */ |
|
22 | + protected $_html_name; |
|
23 | + |
|
24 | + /** |
|
25 | + * id for the html label tag |
|
26 | + * |
|
27 | + * @var string |
|
28 | + */ |
|
29 | + protected $_html_label_id; |
|
30 | + |
|
31 | + /** |
|
32 | + * class for teh html label tag |
|
33 | + * |
|
34 | + * @var string |
|
35 | + */ |
|
36 | + protected $_html_label_class; |
|
37 | + |
|
38 | + /** |
|
39 | + * style for teh html label tag |
|
40 | + * |
|
41 | + * @var string |
|
42 | + */ |
|
43 | + protected $_html_label_style; |
|
44 | + |
|
45 | + /** |
|
46 | + * text to be placed in the html label |
|
47 | + * |
|
48 | + * @var string |
|
49 | + */ |
|
50 | + protected $_html_label_text; |
|
51 | + |
|
52 | + /** |
|
53 | + * the full html label. If used, all other html_label_* properties are invalid |
|
54 | + * |
|
55 | + * @var string |
|
56 | + */ |
|
57 | + protected $_html_label; |
|
58 | + |
|
59 | + /** |
|
60 | + * HTML to use for help text (normally placed below form input), in a span which normally |
|
61 | + * has a class of 'description' |
|
62 | + * |
|
63 | + * @var string |
|
64 | + */ |
|
65 | + protected $_html_help_text; |
|
66 | + |
|
67 | + /** |
|
68 | + * CSS classes for displaying the help span |
|
69 | + * |
|
70 | + * @var string |
|
71 | + */ |
|
72 | + protected $_html_help_class = 'description'; |
|
73 | + |
|
74 | + /** |
|
75 | + * CSS to put in the style attribute on the help span |
|
76 | + * |
|
77 | + * @var string |
|
78 | + */ |
|
79 | + protected $_html_help_style; |
|
80 | + |
|
81 | + /** |
|
82 | + * Stores whether or not this input's response is required. |
|
83 | + * Because certain styling elements may also want to know that this |
|
84 | + * input is required etc. |
|
85 | + * |
|
86 | + * @var boolean |
|
87 | + */ |
|
88 | + protected $_required; |
|
89 | + |
|
90 | + /** |
|
91 | + * css class added to required inputs |
|
92 | + * |
|
93 | + * @var string |
|
94 | + */ |
|
95 | + protected $_required_css_class = 'ee-required'; |
|
96 | + |
|
97 | + /** |
|
98 | + * css styles applied to button type inputs |
|
99 | + * |
|
100 | + * @var string |
|
101 | + */ |
|
102 | + protected $_button_css_attributes; |
|
103 | + |
|
104 | + /** |
|
105 | + * The raw post data submitted for this |
|
106 | + * Generally unsafe for usage in client code |
|
107 | + * |
|
108 | + * @var mixed string or array |
|
109 | + */ |
|
110 | + protected $_raw_value; |
|
111 | + |
|
112 | + /** |
|
113 | + * Value normalized according to the input's normalization strategy. |
|
114 | + * The normalization strategy dictates whether this is a string, int, float, |
|
115 | + * boolean, or array of any of those. |
|
116 | + * |
|
117 | + * @var mixed |
|
118 | + */ |
|
119 | + protected $_normalized_value; |
|
120 | + |
|
121 | + |
|
122 | + /** |
|
123 | + * Normalized default value either initially set on the input, or provided by calling |
|
124 | + * set_default(). |
|
125 | + * @var mixed |
|
126 | + */ |
|
127 | + protected $_default; |
|
128 | + |
|
129 | + /** |
|
130 | + * Strategy used for displaying this field. |
|
131 | + * Child classes must use _get_display_strategy to access it. |
|
132 | + * |
|
133 | + * @var EE_Display_Strategy_Base |
|
134 | + */ |
|
135 | + private $_display_strategy; |
|
136 | + |
|
137 | + /** |
|
138 | + * Gets all the validation strategies used on this field |
|
139 | + * |
|
140 | + * @var EE_Validation_Strategy_Base[] |
|
141 | + */ |
|
142 | + private $_validation_strategies = array(); |
|
143 | + |
|
144 | + /** |
|
145 | + * The normalization strategy for this field |
|
146 | + * |
|
147 | + * @var EE_Normalization_Strategy_Base |
|
148 | + */ |
|
149 | + private $_normalization_strategy; |
|
150 | + |
|
151 | + /** |
|
152 | + * Strategy for removing sensitive data after we're done with the form input |
|
153 | + * |
|
154 | + * @var EE_Sensitive_Data_Removal_Base |
|
155 | + */ |
|
156 | + protected $_sensitive_data_removal_strategy; |
|
157 | + |
|
158 | + /** |
|
159 | + * Whether this input has been disabled or not. |
|
160 | + * If it's disabled while rendering, an extra hidden input is added that indicates it has been knowingly disabled. |
|
161 | + * (Client-side code that wants to dynamically disable it must also add this hidden input). |
|
162 | + * When the form is submitted, if the input is disabled in the PHP form section, then input is ignored. |
|
163 | + * If the input is missing from the request data but the hidden input indicating the input is disabled, then the input is again ignored. |
|
164 | + * |
|
165 | + * @var boolean |
|
166 | + */ |
|
167 | + protected $disabled = false; |
|
168 | + |
|
169 | + |
|
170 | + |
|
171 | + /** |
|
172 | + * @param array $input_args { |
|
173 | + * @type string $html_name the html name for the input |
|
174 | + * @type string $html_label_id the id attribute to give to the html label tag |
|
175 | + * @type string $html_label_class the class attribute to give to the html label tag |
|
176 | + * @type string $html_label_style the style attribute to give ot teh label tag |
|
177 | + * @type string $html_label_text the text to put in the label tag |
|
178 | + * @type string $html_label the full html label. If used, |
|
179 | + * all other html_label_* args are invalid |
|
180 | + * @type string $html_help_text text to put in help element |
|
181 | + * @type string $html_help_style style attribute to give to teh help element |
|
182 | + * @type string $html_help_class class attribute to give to the help element |
|
183 | + * @type string $default default value NORMALIZED (eg, if providing the default |
|
184 | + * for a Yes_No_Input, you should provide TRUE or FALSE, not '1' or '0') |
|
185 | + * @type EE_Display_Strategy_Base $display strategy |
|
186 | + * @type EE_Normalization_Strategy_Base $normalization_strategy |
|
187 | + * @type EE_Validation_Strategy_Base[] $validation_strategies |
|
188 | + * @type boolean $ignore_input special argument which can be used to avoid adding any validation strategies, |
|
189 | + * and sets the normalization strategy to the Null normalization. This is good |
|
190 | + * when you want the input to be totally ignored server-side (like when using |
|
191 | + * React.js form inputs) |
|
192 | + * } |
|
193 | + */ |
|
194 | + public function __construct($input_args = array()) |
|
195 | + { |
|
196 | + $input_args = (array) apply_filters('FHEE__EE_Form_Input_Base___construct__input_args', $input_args, $this); |
|
197 | + // the following properties must be cast as arrays |
|
198 | + if (isset($input_args['validation_strategies'])) { |
|
199 | + foreach ((array) $input_args['validation_strategies'] as $validation_strategy) { |
|
200 | + if ($validation_strategy instanceof EE_Validation_Strategy_Base && empty($input_args['ignore_input'])) { |
|
201 | + $this->_validation_strategies[ get_class($validation_strategy) ] = $validation_strategy; |
|
202 | + } |
|
203 | + } |
|
204 | + unset($input_args['validation_strategies']); |
|
205 | + } |
|
206 | + if (isset($input_args['ignore_input'])) { |
|
207 | + $this->_validation_strategies = array(); |
|
208 | + } |
|
209 | + // loop thru incoming options |
|
210 | + foreach ($input_args as $key => $value) { |
|
211 | + // add underscore to $key to match property names |
|
212 | + $_key = '_' . $key; |
|
213 | + if (property_exists($this, $_key)) { |
|
214 | + $this->{$_key} = $value; |
|
215 | + } |
|
216 | + } |
|
217 | + // ensure that "required" is set correctly |
|
218 | + $this->set_required( |
|
219 | + $this->_required, |
|
220 | + isset($input_args['required_validation_error_message']) |
|
221 | + ? $input_args['required_validation_error_message'] |
|
222 | + : null |
|
223 | + ); |
|
224 | + // $this->_html_name_specified = isset( $input_args['html_name'] ) ? TRUE : FALSE; |
|
225 | + $this->_display_strategy->_construct_finalize($this); |
|
226 | + foreach ($this->_validation_strategies as $validation_strategy) { |
|
227 | + $validation_strategy->_construct_finalize($this); |
|
228 | + } |
|
229 | + if (isset($input_args['ignore_input'])) { |
|
230 | + $this->_normalization_strategy = new EE_Null_Normalization(); |
|
231 | + } |
|
232 | + if (! $this->_normalization_strategy) { |
|
233 | + $this->_normalization_strategy = new EE_Text_Normalization(); |
|
234 | + } |
|
235 | + $this->_normalization_strategy->_construct_finalize($this); |
|
236 | + // at least we can use the normalization strategy to populate the default |
|
237 | + if (isset($input_args['default'])) { |
|
238 | + $this->set_default($input_args['default']); |
|
239 | + unset($input_args['default']); |
|
240 | + } |
|
241 | + if (! $this->_sensitive_data_removal_strategy) { |
|
242 | + $this->_sensitive_data_removal_strategy = new EE_No_Sensitive_Data_Removal(); |
|
243 | + } |
|
244 | + $this->_sensitive_data_removal_strategy->_construct_finalize($this); |
|
245 | + parent::__construct($input_args); |
|
246 | + } |
|
247 | + |
|
248 | + |
|
249 | + |
|
250 | + /** |
|
251 | + * Sets the html_name to its default value, if none was specified in teh constructor. |
|
252 | + * Calculation involves using the name and the parent's html_name |
|
253 | + * |
|
254 | + * @throws EE_Error |
|
255 | + */ |
|
256 | + protected function _set_default_html_name_if_empty() |
|
257 | + { |
|
258 | + if (! $this->_html_name) { |
|
259 | + $this->_html_name = $this->name(); |
|
260 | + if ($this->_parent_section && $this->_parent_section instanceof EE_Form_Section_Proper) { |
|
261 | + $this->_html_name = $this->_parent_section->html_name_prefix() . "[{$this->name()}]"; |
|
262 | + } |
|
263 | + } |
|
264 | + } |
|
265 | + |
|
266 | + |
|
267 | + |
|
268 | + /** |
|
269 | + * @param $parent_form_section |
|
270 | + * @param $name |
|
271 | + * @throws EE_Error |
|
272 | + */ |
|
273 | + public function _construct_finalize($parent_form_section, $name) |
|
274 | + { |
|
275 | + parent::_construct_finalize($parent_form_section, $name); |
|
276 | + if ($this->_html_label === null && $this->_html_label_text === null) { |
|
277 | + $this->_html_label_text = ucwords(str_replace("_", " ", $name)); |
|
278 | + } |
|
279 | + do_action('AHEE__EE_Form_Input_Base___construct_finalize__end', $this, $parent_form_section, $name); |
|
280 | + } |
|
281 | + |
|
282 | + |
|
283 | + |
|
284 | + /** |
|
285 | + * Returns the strategy for displaying this form input. If none is set, throws an exception. |
|
286 | + * |
|
287 | + * @return EE_Display_Strategy_Base |
|
288 | + * @throws EE_Error |
|
289 | + */ |
|
290 | + protected function _get_display_strategy() |
|
291 | + { |
|
292 | + $this->ensure_construct_finalized_called(); |
|
293 | + if (! $this->_display_strategy || ! $this->_display_strategy instanceof EE_Display_Strategy_Base) { |
|
294 | + throw new EE_Error( |
|
295 | + sprintf( |
|
296 | + esc_html__( |
|
297 | + "Cannot get display strategy for form input with name %s and id %s, because it has not been set in the constructor", |
|
298 | + "event_espresso" |
|
299 | + ), |
|
300 | + $this->html_name(), |
|
301 | + $this->html_id() |
|
302 | + ) |
|
303 | + ); |
|
304 | + } else { |
|
305 | + return $this->_display_strategy; |
|
306 | + } |
|
307 | + } |
|
308 | + |
|
309 | + |
|
310 | + |
|
311 | + /** |
|
312 | + * Sets the display strategy. |
|
313 | + * |
|
314 | + * @param EE_Display_Strategy_Base $strategy |
|
315 | + */ |
|
316 | + protected function _set_display_strategy(EE_Display_Strategy_Base $strategy) |
|
317 | + { |
|
318 | + $this->_display_strategy = $strategy; |
|
319 | + } |
|
320 | + |
|
321 | + |
|
322 | + |
|
323 | + /** |
|
324 | + * Sets the sanitization strategy |
|
325 | + * |
|
326 | + * @param EE_Normalization_Strategy_Base $strategy |
|
327 | + */ |
|
328 | + protected function _set_normalization_strategy(EE_Normalization_Strategy_Base $strategy) |
|
329 | + { |
|
330 | + $this->_normalization_strategy = $strategy; |
|
331 | + } |
|
332 | + |
|
333 | + |
|
334 | + |
|
335 | + /** |
|
336 | + * Gets sensitive_data_removal_strategy |
|
337 | + * |
|
338 | + * @return EE_Sensitive_Data_Removal_Base |
|
339 | + */ |
|
340 | + public function get_sensitive_data_removal_strategy() |
|
341 | + { |
|
342 | + return $this->_sensitive_data_removal_strategy; |
|
343 | + } |
|
344 | + |
|
345 | + |
|
346 | + |
|
347 | + /** |
|
348 | + * Sets sensitive_data_removal_strategy |
|
349 | + * |
|
350 | + * @param EE_Sensitive_Data_Removal_Base $sensitive_data_removal_strategy |
|
351 | + * @return void |
|
352 | + */ |
|
353 | + public function set_sensitive_data_removal_strategy($sensitive_data_removal_strategy) |
|
354 | + { |
|
355 | + $this->_sensitive_data_removal_strategy = $sensitive_data_removal_strategy; |
|
356 | + } |
|
357 | + |
|
358 | + |
|
359 | + |
|
360 | + /** |
|
361 | + * Gets the display strategy for this input |
|
362 | + * |
|
363 | + * @return EE_Display_Strategy_Base |
|
364 | + */ |
|
365 | + public function get_display_strategy() |
|
366 | + { |
|
367 | + return $this->_display_strategy; |
|
368 | + } |
|
369 | + |
|
370 | + |
|
371 | + |
|
372 | + /** |
|
373 | + * Overwrites the display strategy |
|
374 | + * |
|
375 | + * @param EE_Display_Strategy_Base $display_strategy |
|
376 | + */ |
|
377 | + public function set_display_strategy($display_strategy) |
|
378 | + { |
|
379 | + $this->_display_strategy = $display_strategy; |
|
380 | + $this->_display_strategy->_construct_finalize($this); |
|
381 | + } |
|
382 | + |
|
383 | + |
|
384 | + |
|
385 | + /** |
|
386 | + * Gets the normalization strategy set on this input |
|
387 | + * |
|
388 | + * @return EE_Normalization_Strategy_Base |
|
389 | + */ |
|
390 | + public function get_normalization_strategy() |
|
391 | + { |
|
392 | + return $this->_normalization_strategy; |
|
393 | + } |
|
394 | + |
|
395 | + |
|
396 | + |
|
397 | + /** |
|
398 | + * Overwrites the normalization strategy |
|
399 | + * |
|
400 | + * @param EE_Normalization_Strategy_Base $normalization_strategy |
|
401 | + */ |
|
402 | + public function set_normalization_strategy($normalization_strategy) |
|
403 | + { |
|
404 | + $this->_normalization_strategy = $normalization_strategy; |
|
405 | + $this->_normalization_strategy->_construct_finalize($this); |
|
406 | + } |
|
407 | + |
|
408 | + |
|
409 | + |
|
410 | + /** |
|
411 | + * Returns all teh validation strategies which apply to this field, numerically indexed |
|
412 | + * |
|
413 | + * @return EE_Validation_Strategy_Base[] |
|
414 | + */ |
|
415 | + public function get_validation_strategies() |
|
416 | + { |
|
417 | + return $this->_validation_strategies; |
|
418 | + } |
|
419 | + |
|
420 | + |
|
421 | + |
|
422 | + /** |
|
423 | + * Adds this strategy to the field so it will be used in both JS validation and server-side validation |
|
424 | + * |
|
425 | + * @param EE_Validation_Strategy_Base $validation_strategy |
|
426 | + * @return void |
|
427 | + */ |
|
428 | + protected function _add_validation_strategy(EE_Validation_Strategy_Base $validation_strategy) |
|
429 | + { |
|
430 | + $validation_strategy->_construct_finalize($this); |
|
431 | + $this->_validation_strategies[] = $validation_strategy; |
|
432 | + } |
|
433 | + |
|
434 | + |
|
435 | + |
|
436 | + /** |
|
437 | + * Adds a new validation strategy onto the form input |
|
438 | + * |
|
439 | + * @param EE_Validation_Strategy_Base $validation_strategy |
|
440 | + * @return void |
|
441 | + */ |
|
442 | + public function add_validation_strategy(EE_Validation_Strategy_Base $validation_strategy) |
|
443 | + { |
|
444 | + $this->_add_validation_strategy($validation_strategy); |
|
445 | + } |
|
446 | + |
|
447 | + |
|
448 | + |
|
449 | + /** |
|
450 | + * The classname of the validation strategy to remove |
|
451 | + * |
|
452 | + * @param string $validation_strategy_classname |
|
453 | + */ |
|
454 | + public function remove_validation_strategy($validation_strategy_classname) |
|
455 | + { |
|
456 | + foreach ($this->_validation_strategies as $key => $validation_strategy) { |
|
457 | + if ( |
|
458 | + $validation_strategy instanceof $validation_strategy_classname |
|
459 | + || is_subclass_of($validation_strategy, $validation_strategy_classname) |
|
460 | + ) { |
|
461 | + unset($this->_validation_strategies[ $key ]); |
|
462 | + } |
|
463 | + } |
|
464 | + } |
|
465 | + |
|
466 | + |
|
467 | + |
|
468 | + /** |
|
469 | + * returns true if input employs any of the validation strategy defined by the supplied array of classnames |
|
470 | + * |
|
471 | + * @param array $validation_strategy_classnames |
|
472 | + * @return bool |
|
473 | + */ |
|
474 | + public function has_validation_strategy($validation_strategy_classnames) |
|
475 | + { |
|
476 | + $validation_strategy_classnames = is_array($validation_strategy_classnames) |
|
477 | + ? $validation_strategy_classnames |
|
478 | + : array($validation_strategy_classnames); |
|
479 | + foreach ($this->_validation_strategies as $key => $validation_strategy) { |
|
480 | + if (in_array($key, $validation_strategy_classnames)) { |
|
481 | + return true; |
|
482 | + } |
|
483 | + } |
|
484 | + return false; |
|
485 | + } |
|
486 | + |
|
487 | + |
|
488 | + |
|
489 | + /** |
|
490 | + * Gets the HTML |
|
491 | + * |
|
492 | + * @return string |
|
493 | + */ |
|
494 | + public function get_html() |
|
495 | + { |
|
496 | + return $this->_parent_section->get_html_for_input($this); |
|
497 | + } |
|
498 | + |
|
499 | + |
|
500 | + |
|
501 | + /** |
|
502 | + * Gets the HTML for the input itself (no label or errors) according to the |
|
503 | + * input's display strategy |
|
504 | + * Makes sure the JS and CSS are enqueued for it |
|
505 | + * |
|
506 | + * @return string |
|
507 | + * @throws EE_Error |
|
508 | + */ |
|
509 | + public function get_html_for_input() |
|
510 | + { |
|
511 | + return $this->_form_html_filter |
|
512 | + ? $this->_form_html_filter->filterHtml( |
|
513 | + $this->_get_display_strategy()->display(), |
|
514 | + $this |
|
515 | + ) |
|
516 | + : $this->_get_display_strategy()->display(); |
|
517 | + } |
|
518 | + |
|
519 | + |
|
520 | + |
|
521 | + /** |
|
522 | + * @return string |
|
523 | + */ |
|
524 | + public function html_other_attributes() |
|
525 | + { |
|
526 | + EE_Error::doing_it_wrong( |
|
527 | + __METHOD__, |
|
528 | + sprintf( |
|
529 | + esc_html__( |
|
530 | + 'This method is no longer in use. You should replace it by %s', |
|
531 | + 'event_espresso' |
|
532 | + ), |
|
533 | + 'EE_Form_Section_Base::other_html_attributes()' |
|
534 | + ), |
|
535 | + '4.10.2.p' |
|
536 | + ); |
|
537 | + |
|
538 | + return $this->other_html_attributes(); |
|
539 | + } |
|
540 | + |
|
541 | + |
|
542 | + |
|
543 | + /** |
|
544 | + * @param string $html_other_attributes |
|
545 | + */ |
|
546 | + public function set_html_other_attributes($html_other_attributes) |
|
547 | + { |
|
548 | + EE_Error::doing_it_wrong( |
|
549 | + __METHOD__, |
|
550 | + sprintf( |
|
551 | + esc_html__( |
|
552 | + 'This method is no longer in use. You should replace it by %s', |
|
553 | + 'event_espresso' |
|
554 | + ), |
|
555 | + 'EE_Form_Section_Base::set_other_html_attributes()' |
|
556 | + ), |
|
557 | + '4.10.2.p' |
|
558 | + ); |
|
559 | + |
|
560 | + $this->set_other_html_attributes($html_other_attributes); |
|
561 | + } |
|
562 | + |
|
563 | + |
|
564 | + |
|
565 | + /** |
|
566 | + * Gets the HTML for displaying the label for this form input |
|
567 | + * according to the form section's layout strategy |
|
568 | + * |
|
569 | + * @return string |
|
570 | + */ |
|
571 | + public function get_html_for_label() |
|
572 | + { |
|
573 | + return $this->_parent_section->get_layout_strategy()->display_label($this); |
|
574 | + } |
|
575 | + |
|
576 | + |
|
577 | + |
|
578 | + /** |
|
579 | + * Gets the HTML for displaying the errors section for this form input |
|
580 | + * according to the form section's layout strategy |
|
581 | + * |
|
582 | + * @return string |
|
583 | + */ |
|
584 | + public function get_html_for_errors() |
|
585 | + { |
|
586 | + return $this->_parent_section->get_layout_strategy()->display_errors($this); |
|
587 | + } |
|
588 | + |
|
589 | + |
|
590 | + |
|
591 | + /** |
|
592 | + * Gets the HTML for displaying the help text for this form input |
|
593 | + * according to the form section's layout strategy |
|
594 | + * |
|
595 | + * @return string |
|
596 | + */ |
|
597 | + public function get_html_for_help() |
|
598 | + { |
|
599 | + return $this->_parent_section->get_layout_strategy()->display_help_text($this); |
|
600 | + } |
|
601 | + |
|
602 | + |
|
603 | + |
|
604 | + /** |
|
605 | + * Validates the input's sanitized value (assumes _sanitize() has already been called) |
|
606 | + * and returns whether or not the form input's submitted value is value |
|
607 | + * |
|
608 | + * @return boolean |
|
609 | + */ |
|
610 | + protected function _validate() |
|
611 | + { |
|
612 | + if ($this->isDisabled()) { |
|
613 | + return true; |
|
614 | + } |
|
615 | + foreach ($this->_validation_strategies as $validation_strategy) { |
|
616 | + if ($validation_strategy instanceof EE_Validation_Strategy_Base) { |
|
617 | + try { |
|
618 | + $validation_strategy->validate($this->normalized_value()); |
|
619 | + } catch (EE_Validation_Error $e) { |
|
620 | + $this->add_validation_error($e); |
|
621 | + } |
|
622 | + } |
|
623 | + } |
|
624 | + if ($this->get_validation_errors()) { |
|
625 | + return false; |
|
626 | + } else { |
|
627 | + return true; |
|
628 | + } |
|
629 | + } |
|
630 | + |
|
631 | + |
|
632 | + |
|
633 | + /** |
|
634 | + * Performs basic sanitization on this value. But what sanitization can be performed anyways? |
|
635 | + * This value MIGHT be allowed to have tags, so we can't really remove them. |
|
636 | + * |
|
637 | + * @param string $value |
|
638 | + * @return null|string |
|
639 | + */ |
|
640 | + protected function _sanitize($value) |
|
641 | + { |
|
642 | + return $value !== null ? stripslashes(html_entity_decode(trim($value))) : null; |
|
643 | + } |
|
644 | + |
|
645 | + |
|
646 | + |
|
647 | + /** |
|
648 | + * Picks out the form value that relates to this form input, |
|
649 | + * and stores it as the sanitized value on the form input, and sets the normalized value. |
|
650 | + * Returns whether or not any validation errors occurred |
|
651 | + * |
|
652 | + * @param array $req_data |
|
653 | + * @return boolean whether or not there was an error |
|
654 | + * @throws EE_Error |
|
655 | + */ |
|
656 | + protected function _normalize($req_data) |
|
657 | + { |
|
658 | + // any existing validation errors don't apply so clear them |
|
659 | + $this->_validation_errors = array(); |
|
660 | + // if the input is disabled, ignore whatever input was sent in |
|
661 | + if ($this->isDisabled()) { |
|
662 | + $this->_set_raw_value(null); |
|
663 | + $this->_set_normalized_value($this->get_default()); |
|
664 | + return false; |
|
665 | + } |
|
666 | + try { |
|
667 | + $raw_input = $this->find_form_data_for_this_section($req_data); |
|
668 | + // super simple sanitization for now |
|
669 | + if (is_array($raw_input)) { |
|
670 | + $raw_value = array(); |
|
671 | + foreach ($raw_input as $key => $value) { |
|
672 | + $raw_value[ $key ] = $this->_sanitize($value); |
|
673 | + } |
|
674 | + $this->_set_raw_value($raw_value); |
|
675 | + } else { |
|
676 | + $this->_set_raw_value($this->_sanitize($raw_input)); |
|
677 | + } |
|
678 | + // we want to mostly leave the input alone in case we need to re-display it to the user |
|
679 | + $this->_set_normalized_value($this->_normalization_strategy->normalize($this->raw_value())); |
|
680 | + return false; |
|
681 | + } catch (EE_Validation_Error $e) { |
|
682 | + $this->add_validation_error($e); |
|
683 | + return true; |
|
684 | + } |
|
685 | + } |
|
686 | + |
|
687 | + |
|
688 | + /** |
|
689 | + * @return string |
|
690 | + * @throws EE_Error |
|
691 | + */ |
|
692 | + public function html_name() |
|
693 | + { |
|
694 | + $this->_set_default_html_name_if_empty(); |
|
695 | + return $this->_html_name; |
|
696 | + } |
|
697 | + |
|
698 | + |
|
699 | + /** |
|
700 | + * @return string |
|
701 | + * @throws EE_Error |
|
702 | + */ |
|
703 | + public function html_label_id() |
|
704 | + { |
|
705 | + return ! empty($this->_html_label_id) ? $this->_html_label_id : $this->html_id() . '-lbl'; |
|
706 | + } |
|
707 | + |
|
708 | + |
|
709 | + |
|
710 | + /** |
|
711 | + * @return string |
|
712 | + */ |
|
713 | + public function html_label_class() |
|
714 | + { |
|
715 | + return $this->_html_label_class; |
|
716 | + } |
|
717 | + |
|
718 | + |
|
719 | + |
|
720 | + /** |
|
721 | + * @return string |
|
722 | + */ |
|
723 | + public function html_label_style() |
|
724 | + { |
|
725 | + return $this->_html_label_style; |
|
726 | + } |
|
727 | + |
|
728 | + |
|
729 | + |
|
730 | + /** |
|
731 | + * @return string |
|
732 | + */ |
|
733 | + public function html_label_text() |
|
734 | + { |
|
735 | + return $this->_html_label_text; |
|
736 | + } |
|
737 | + |
|
738 | + |
|
739 | + |
|
740 | + /** |
|
741 | + * @return string |
|
742 | + */ |
|
743 | + public function html_help_text() |
|
744 | + { |
|
745 | + return $this->_html_help_text; |
|
746 | + } |
|
747 | + |
|
748 | + |
|
749 | + |
|
750 | + /** |
|
751 | + * @return string |
|
752 | + */ |
|
753 | + public function html_help_class() |
|
754 | + { |
|
755 | + return $this->_html_help_class; |
|
756 | + } |
|
757 | + |
|
758 | + |
|
759 | + |
|
760 | + /** |
|
761 | + * @return string |
|
762 | + */ |
|
763 | + public function html_help_style() |
|
764 | + { |
|
765 | + return $this->_html_style; |
|
766 | + } |
|
767 | + |
|
768 | + |
|
769 | + |
|
770 | + /** |
|
771 | + * returns the raw, UNSAFE, input, almost exactly as the user submitted it. |
|
772 | + * Please note that almost all client code should instead use the normalized_value; |
|
773 | + * or possibly raw_value_in_form (which prepares the string for displaying in an HTML attribute on a tag, |
|
774 | + * mostly by escaping quotes) |
|
775 | + * Note, we do not store the exact original value sent in the user's request because |
|
776 | + * it may have malicious content, and we MIGHT want to store the form input in a transient or something... |
|
777 | + * in which case, we would have stored the malicious content to our database. |
|
778 | + * |
|
779 | + * @return string |
|
780 | + */ |
|
781 | + public function raw_value() |
|
782 | + { |
|
783 | + return $this->_raw_value; |
|
784 | + } |
|
785 | + |
|
786 | + |
|
787 | + |
|
788 | + /** |
|
789 | + * Returns a string safe to usage in form inputs when displaying, because |
|
790 | + * it escapes all html entities |
|
791 | + * |
|
792 | + * @return string |
|
793 | + */ |
|
794 | + public function raw_value_in_form() |
|
795 | + { |
|
796 | + return htmlentities($this->raw_value(), ENT_QUOTES, 'UTF-8'); |
|
797 | + } |
|
798 | + |
|
799 | + |
|
800 | + |
|
801 | + /** |
|
802 | + * returns the value after it's been sanitized, and then converted into it's proper type |
|
803 | + * in PHP. Eg, a string, an int, an array, |
|
804 | + * |
|
805 | + * @return mixed |
|
806 | + */ |
|
807 | + public function normalized_value() |
|
808 | + { |
|
809 | + return $this->_normalized_value; |
|
810 | + } |
|
811 | + |
|
812 | + |
|
813 | + |
|
814 | + /** |
|
815 | + * Returns the normalized value is a presentable way. By default this is just |
|
816 | + * the normalized value by itself, but it can be overridden for when that's not |
|
817 | + * the best thing to display |
|
818 | + * |
|
819 | + * @return string |
|
820 | + */ |
|
821 | + public function pretty_value() |
|
822 | + { |
|
823 | + return $this->_normalized_value; |
|
824 | + } |
|
825 | + |
|
826 | + |
|
827 | + |
|
828 | + /** |
|
829 | + * When generating the JS for the jquery validation rules like<br> |
|
830 | + * <code>$( "#myform" ).validate({ |
|
831 | + * rules: { |
|
832 | + * password: "required", |
|
833 | + * password_again: { |
|
834 | + * equalTo: "#password" |
|
835 | + * } |
|
836 | + * } |
|
837 | + * });</code> |
|
838 | + * if this field had the name 'password_again', it should return |
|
839 | + * <br><code>password_again: { |
|
840 | + * equalTo: "#password" |
|
841 | + * }</code> |
|
842 | + * |
|
843 | + * @return array |
|
844 | + */ |
|
845 | + public function get_jquery_validation_rules() |
|
846 | + { |
|
847 | + $jquery_validation_js = array(); |
|
848 | + $jquery_validation_rules = array(); |
|
849 | + foreach ($this->get_validation_strategies() as $validation_strategy) { |
|
850 | + $jquery_validation_rules = array_replace_recursive( |
|
851 | + $jquery_validation_rules, |
|
852 | + $validation_strategy->get_jquery_validation_rule_array() |
|
853 | + ); |
|
854 | + } |
|
855 | + if (! empty($jquery_validation_rules)) { |
|
856 | + foreach ($this->get_display_strategy()->get_html_input_ids(true) as $html_id_with_pound_sign) { |
|
857 | + $jquery_validation_js[ $html_id_with_pound_sign ] = $jquery_validation_rules; |
|
858 | + } |
|
859 | + } |
|
860 | + return $jquery_validation_js; |
|
861 | + } |
|
862 | + |
|
863 | + |
|
864 | + |
|
865 | + /** |
|
866 | + * Sets the input's default value for use in displaying in the form. Note: value should be |
|
867 | + * normalized (Eg, if providing a default of ra Yes_NO_Input you would provide TRUE or FALSE, not '1' or '0') |
|
868 | + * |
|
869 | + * @param mixed $value |
|
870 | + * @return void |
|
871 | + */ |
|
872 | + public function set_default($value) |
|
873 | + { |
|
874 | + $this->_default = $value; |
|
875 | + $this->_set_normalized_value($value); |
|
876 | + $this->_set_raw_value($value); |
|
877 | + } |
|
878 | + |
|
879 | + |
|
880 | + |
|
881 | + /** |
|
882 | + * Sets the normalized value on this input |
|
883 | + * |
|
884 | + * @param mixed $value |
|
885 | + */ |
|
886 | + protected function _set_normalized_value($value) |
|
887 | + { |
|
888 | + $this->_normalized_value = $value; |
|
889 | + } |
|
890 | + |
|
891 | + |
|
892 | + |
|
893 | + /** |
|
894 | + * Sets the raw value on this input (ie, exactly as the user submitted it) |
|
895 | + * |
|
896 | + * @param mixed $value |
|
897 | + */ |
|
898 | + protected function _set_raw_value($value) |
|
899 | + { |
|
900 | + $this->_raw_value = $this->_normalization_strategy->unnormalize($value); |
|
901 | + } |
|
902 | + |
|
903 | + |
|
904 | + |
|
905 | + /** |
|
906 | + * Sets the HTML label text after it has already been defined |
|
907 | + * |
|
908 | + * @param string $label |
|
909 | + * @return void |
|
910 | + */ |
|
911 | + public function set_html_label_text($label) |
|
912 | + { |
|
913 | + $this->_html_label_text = $label; |
|
914 | + } |
|
915 | + |
|
916 | + |
|
917 | + |
|
918 | + /** |
|
919 | + * Sets whether or not this field is required, and adjusts the validation strategy. |
|
920 | + * If you want to use the EE_Conditionally_Required_Validation_Strategy, |
|
921 | + * please add it as a validation strategy using add_validation_strategy as normal |
|
922 | + * |
|
923 | + * @param boolean $required boolean |
|
924 | + * @param null $required_text |
|
925 | + */ |
|
926 | + public function set_required($required = true, $required_text = null) |
|
927 | + { |
|
928 | + $required = filter_var($required, FILTER_VALIDATE_BOOLEAN); |
|
929 | + // whether $required is a string or a boolean, we want to add a required validation strategy |
|
930 | + if ($required) { |
|
931 | + $this->_add_validation_strategy(new EE_Required_Validation_Strategy($required_text)); |
|
932 | + } else { |
|
933 | + $this->remove_validation_strategy('EE_Required_Validation_Strategy'); |
|
934 | + } |
|
935 | + $this->_required = $required; |
|
936 | + } |
|
937 | + |
|
938 | + |
|
939 | + |
|
940 | + /** |
|
941 | + * Returns whether or not this field is required |
|
942 | + * |
|
943 | + * @return boolean |
|
944 | + */ |
|
945 | + public function required() |
|
946 | + { |
|
947 | + return $this->_required; |
|
948 | + } |
|
949 | + |
|
950 | + |
|
951 | + |
|
952 | + /** |
|
953 | + * @param string $required_css_class |
|
954 | + */ |
|
955 | + public function set_required_css_class($required_css_class) |
|
956 | + { |
|
957 | + $this->_required_css_class = $required_css_class; |
|
958 | + } |
|
959 | + |
|
960 | + |
|
961 | + |
|
962 | + /** |
|
963 | + * @return string |
|
964 | + */ |
|
965 | + public function required_css_class() |
|
966 | + { |
|
967 | + return $this->_required_css_class; |
|
968 | + } |
|
969 | + |
|
970 | + |
|
971 | + |
|
972 | + /** |
|
973 | + * @param bool $add_required |
|
974 | + * @return string |
|
975 | + */ |
|
976 | + public function html_class($add_required = false) |
|
977 | + { |
|
978 | + return $add_required && $this->required() |
|
979 | + ? $this->required_css_class() . ' ' . $this->_html_class |
|
980 | + : $this->_html_class; |
|
981 | + } |
|
982 | + |
|
983 | + |
|
984 | + /** |
|
985 | + * Sets the help text, in case |
|
986 | + * |
|
987 | + * @param string $text |
|
988 | + */ |
|
989 | + public function set_html_help_text($text) |
|
990 | + { |
|
991 | + $this->_html_help_text = $text; |
|
992 | + } |
|
993 | + |
|
994 | + |
|
995 | + |
|
996 | + /** |
|
997 | + * Uses the sensitive data removal strategy to remove the sensitive data from this |
|
998 | + * input. If there is any kind of sensitive data removal on this input, we clear |
|
999 | + * out the raw value completely |
|
1000 | + * |
|
1001 | + * @return void |
|
1002 | + */ |
|
1003 | + public function clean_sensitive_data() |
|
1004 | + { |
|
1005 | + // if we do ANY kind of sensitive data removal on this, then just clear out the raw value |
|
1006 | + // if we need more logic than this we'll make a strategy for it |
|
1007 | + if ( |
|
1008 | + $this->_sensitive_data_removal_strategy |
|
1009 | + && ! $this->_sensitive_data_removal_strategy instanceof EE_No_Sensitive_Data_Removal |
|
1010 | + ) { |
|
1011 | + $this->_set_raw_value(null); |
|
1012 | + } |
|
1013 | + // and clean the normalized value according to the appropriate strategy |
|
1014 | + $this->_set_normalized_value( |
|
1015 | + $this->get_sensitive_data_removal_strategy()->remove_sensitive_data( |
|
1016 | + $this->_normalized_value |
|
1017 | + ) |
|
1018 | + ); |
|
1019 | + } |
|
1020 | + |
|
1021 | + |
|
1022 | + |
|
1023 | + /** |
|
1024 | + * @param bool $primary |
|
1025 | + * @param string $button_size |
|
1026 | + * @param string $other_attributes |
|
1027 | + */ |
|
1028 | + public function set_button_css_attributes($primary = true, $button_size = '', $other_attributes = '') |
|
1029 | + { |
|
1030 | + $button_css_attributes = 'button'; |
|
1031 | + $button_css_attributes .= $primary === true ? ' button-primary' : ' button-secondary'; |
|
1032 | + switch ($button_size) { |
|
1033 | + case 'xs': |
|
1034 | + case 'extra-small': |
|
1035 | + $button_css_attributes .= ' button-xs'; |
|
1036 | + break; |
|
1037 | + case 'sm': |
|
1038 | + case 'small': |
|
1039 | + $button_css_attributes .= ' button-sm'; |
|
1040 | + break; |
|
1041 | + case 'lg': |
|
1042 | + case 'large': |
|
1043 | + $button_css_attributes .= ' button-lg'; |
|
1044 | + break; |
|
1045 | + case 'block': |
|
1046 | + $button_css_attributes .= ' button-block'; |
|
1047 | + break; |
|
1048 | + case 'md': |
|
1049 | + case 'medium': |
|
1050 | + default: |
|
1051 | + $button_css_attributes .= ''; |
|
1052 | + } |
|
1053 | + $this->_button_css_attributes .= ! empty($other_attributes) |
|
1054 | + ? $button_css_attributes . ' ' . $other_attributes |
|
1055 | + : $button_css_attributes; |
|
1056 | + } |
|
1057 | + |
|
1058 | + |
|
1059 | + |
|
1060 | + /** |
|
1061 | + * @return string |
|
1062 | + */ |
|
1063 | + public function button_css_attributes() |
|
1064 | + { |
|
1065 | + if (empty($this->_button_css_attributes)) { |
|
1066 | + $this->set_button_css_attributes(); |
|
1067 | + } |
|
1068 | + return $this->_button_css_attributes; |
|
1069 | + } |
|
1070 | + |
|
1071 | + |
|
1072 | + |
|
1073 | + /** |
|
1074 | + * find_form_data_for_this_section |
|
1075 | + * using this section's name and its parents, finds the value of the form data that corresponds to it. |
|
1076 | + * For example, if this form section's HTML name is my_form[subform][form_input_1], |
|
1077 | + * then it's value should be in request at request['my_form']['subform']['form_input_1']. |
|
1078 | + * (If that doesn't exist, we also check for this subsection's name |
|
1079 | + * at the TOP LEVEL of the request data. Eg request['form_input_1'].) |
|
1080 | + * This function finds its value in the form. |
|
1081 | + * |
|
1082 | + * @param array $req_data |
|
1083 | + * @return mixed whatever the raw value of this form section is in the request data |
|
1084 | + * @throws EE_Error |
|
1085 | + */ |
|
1086 | + public function find_form_data_for_this_section($req_data) |
|
1087 | + { |
|
1088 | + $name_parts = $this->getInputNameParts(); |
|
1089 | + // now get the value for the input |
|
1090 | + $value = $this->findRequestForSectionUsingNameParts($name_parts, $req_data); |
|
1091 | + // check if this thing's name is at the TOP level of the request data |
|
1092 | + if ($value === null && isset($req_data[ $this->name() ])) { |
|
1093 | + $value = $req_data[ $this->name() ]; |
|
1094 | + } |
|
1095 | + return $value; |
|
1096 | + } |
|
1097 | + |
|
1098 | + |
|
1099 | + /** |
|
1100 | + * If this input's name is something like "foo[bar][baz]" |
|
1101 | + * returns an array like `array('foo','bar',baz')` |
|
1102 | + * |
|
1103 | + * @return array |
|
1104 | + * @throws EE_Error |
|
1105 | + */ |
|
1106 | + protected function getInputNameParts() |
|
1107 | + { |
|
1108 | + // break up the html name by "[]" |
|
1109 | + if (strpos($this->html_name(), '[') !== false) { |
|
1110 | + $before_any_brackets = substr($this->html_name(), 0, strpos($this->html_name(), '[')); |
|
1111 | + } else { |
|
1112 | + $before_any_brackets = $this->html_name(); |
|
1113 | + } |
|
1114 | + // grab all of the segments |
|
1115 | + preg_match_all('~\[([^]]*)\]~', $this->html_name(), $matches); |
|
1116 | + if (isset($matches[1]) && is_array($matches[1])) { |
|
1117 | + $name_parts = $matches[1]; |
|
1118 | + array_unshift($name_parts, $before_any_brackets); |
|
1119 | + } else { |
|
1120 | + $name_parts = array($before_any_brackets); |
|
1121 | + } |
|
1122 | + return $name_parts; |
|
1123 | + } |
|
1124 | + |
|
1125 | + |
|
1126 | + |
|
1127 | + /** |
|
1128 | + * @param array $html_name_parts |
|
1129 | + * @param array $req_data |
|
1130 | + * @return array | NULL |
|
1131 | + */ |
|
1132 | + public function findRequestForSectionUsingNameParts($html_name_parts, $req_data) |
|
1133 | + { |
|
1134 | + $first_part_to_consider = array_shift($html_name_parts); |
|
1135 | + if (isset($req_data[ $first_part_to_consider ])) { |
|
1136 | + if (empty($html_name_parts)) { |
|
1137 | + return $req_data[ $first_part_to_consider ]; |
|
1138 | + } else { |
|
1139 | + return $this->findRequestForSectionUsingNameParts( |
|
1140 | + $html_name_parts, |
|
1141 | + $req_data[ $first_part_to_consider ] |
|
1142 | + ); |
|
1143 | + } |
|
1144 | + } else { |
|
1145 | + return null; |
|
1146 | + } |
|
1147 | + } |
|
1148 | + |
|
1149 | + |
|
1150 | + |
|
1151 | + /** |
|
1152 | + * Checks if this form input's data is in the request data |
|
1153 | + * |
|
1154 | + * @param array $req_data |
|
1155 | + * @return boolean |
|
1156 | + * @throws EE_Error |
|
1157 | + */ |
|
1158 | + public function form_data_present_in($req_data = null) |
|
1159 | + { |
|
1160 | + if ($req_data === null) { |
|
1161 | + /** @var RequestInterface $request */ |
|
1162 | + $request = LoaderFactory::getLoader()->getShared(RequestInterface::class); |
|
1163 | + $req_data = $request->postParams(); |
|
1164 | + } |
|
1165 | + $checked_value = $this->find_form_data_for_this_section($req_data); |
|
1166 | + if ($checked_value !== null) { |
|
1167 | + return true; |
|
1168 | + } else { |
|
1169 | + return false; |
|
1170 | + } |
|
1171 | + } |
|
1172 | + |
|
1173 | + |
|
1174 | + |
|
1175 | + /** |
|
1176 | + * Overrides parent to add js data from validation and display strategies |
|
1177 | + * |
|
1178 | + * @param array $form_other_js_data |
|
1179 | + * @return array |
|
1180 | + */ |
|
1181 | + public function get_other_js_data($form_other_js_data = array()) |
|
1182 | + { |
|
1183 | + return $this->get_other_js_data_from_strategies($form_other_js_data); |
|
1184 | + } |
|
1185 | + |
|
1186 | + |
|
1187 | + |
|
1188 | + /** |
|
1189 | + * Gets other JS data for localization from this input's strategies, like |
|
1190 | + * the validation strategies and the display strategy |
|
1191 | + * |
|
1192 | + * @param array $form_other_js_data |
|
1193 | + * @return array |
|
1194 | + */ |
|
1195 | + public function get_other_js_data_from_strategies($form_other_js_data = array()) |
|
1196 | + { |
|
1197 | + $form_other_js_data = $this->get_display_strategy()->get_other_js_data($form_other_js_data); |
|
1198 | + foreach ($this->get_validation_strategies() as $validation_strategy) { |
|
1199 | + $form_other_js_data = $validation_strategy->get_other_js_data($form_other_js_data); |
|
1200 | + } |
|
1201 | + return $form_other_js_data; |
|
1202 | + } |
|
1203 | + |
|
1204 | + |
|
1205 | + |
|
1206 | + /** |
|
1207 | + * Override parent because we want to give our strategies an opportunity to enqueue some js and css |
|
1208 | + * |
|
1209 | + * @return void |
|
1210 | + */ |
|
1211 | + public function enqueue_js() |
|
1212 | + { |
|
1213 | + // ask our display strategy and validation strategies if they have js to enqueue |
|
1214 | + $this->enqueue_js_from_strategies(); |
|
1215 | + } |
|
1216 | + |
|
1217 | + |
|
1218 | + |
|
1219 | + /** |
|
1220 | + * Tells strategies when its ok to enqueue their js and css |
|
1221 | + * |
|
1222 | + * @return void |
|
1223 | + */ |
|
1224 | + public function enqueue_js_from_strategies() |
|
1225 | + { |
|
1226 | + $this->get_display_strategy()->enqueue_js(); |
|
1227 | + foreach ($this->get_validation_strategies() as $validation_strategy) { |
|
1228 | + $validation_strategy->enqueue_js(); |
|
1229 | + } |
|
1230 | + } |
|
1231 | + |
|
1232 | + |
|
1233 | + |
|
1234 | + /** |
|
1235 | + * Gets the default value set on the input (not the current value, which may have been |
|
1236 | + * changed because of a form submission). If no default was set, this us null. |
|
1237 | + * @return mixed |
|
1238 | + */ |
|
1239 | + public function get_default() |
|
1240 | + { |
|
1241 | + return $this->_default; |
|
1242 | + } |
|
1243 | + |
|
1244 | + |
|
1245 | + |
|
1246 | + /** |
|
1247 | + * Makes this input disabled. That means it will have the HTML attribute 'disabled="disabled"', |
|
1248 | + * and server-side if any input was received it will be ignored |
|
1249 | + */ |
|
1250 | + public function disable($disable = true) |
|
1251 | + { |
|
1252 | + $disabled_attribute = ' disabled="disabled"'; |
|
1253 | + $this->disabled = filter_var($disable, FILTER_VALIDATE_BOOLEAN); |
|
1254 | + if ($this->disabled) { |
|
1255 | + if (strpos($this->_other_html_attributes, $disabled_attribute) === false) { |
|
1256 | + $this->_other_html_attributes .= $disabled_attribute; |
|
1257 | + } |
|
1258 | + $this->_set_normalized_value($this->get_default()); |
|
1259 | + } else { |
|
1260 | + $this->_other_html_attributes = str_replace($disabled_attribute, '', $this->_other_html_attributes); |
|
1261 | + } |
|
1262 | + } |
|
1263 | + |
|
1264 | + |
|
1265 | + |
|
1266 | + /** |
|
1267 | + * Returns whether or not this input is currently disabled. |
|
1268 | + * @return bool |
|
1269 | + */ |
|
1270 | + public function isDisabled() |
|
1271 | + { |
|
1272 | + return $this->disabled; |
|
1273 | + } |
|
1274 | 1274 | } |
@@ -15,7 +15,7 @@ |
||
15 | 15 | */ |
16 | 16 | public function __construct($options = array()) |
17 | 17 | { |
18 | - $select_options = array(true => esc_html__("Yes", "event_espresso"),false => esc_html__("No", "event_espresso")); |
|
18 | + $select_options = array(true => esc_html__("Yes", "event_espresso"), false => esc_html__("No", "event_espresso")); |
|
19 | 19 | |
20 | 20 | parent::__construct($select_options, $options); |
21 | 21 | } |
@@ -9,13 +9,13 @@ |
||
9 | 9 | */ |
10 | 10 | class EE_Yes_No_Input extends EE_Select_Input |
11 | 11 | { |
12 | - /** |
|
13 | - * @param array $options |
|
14 | - */ |
|
15 | - public function __construct($options = array()) |
|
16 | - { |
|
17 | - $select_options = array(true => esc_html__("Yes", "event_espresso"),false => esc_html__("No", "event_espresso")); |
|
12 | + /** |
|
13 | + * @param array $options |
|
14 | + */ |
|
15 | + public function __construct($options = array()) |
|
16 | + { |
|
17 | + $select_options = array(true => esc_html__("Yes", "event_espresso"),false => esc_html__("No", "event_espresso")); |
|
18 | 18 | |
19 | - parent::__construct($select_options, $options); |
|
20 | - } |
|
19 | + parent::__construct($select_options, $options); |
|
20 | + } |
|
21 | 21 | } |
@@ -14,17 +14,17 @@ |
||
14 | 14 | */ |
15 | 15 | class EE_Phone_Input extends EE_Text_Input |
16 | 16 | { |
17 | - /** |
|
18 | - * @param array $options |
|
19 | - */ |
|
20 | - public function __construct($options = array()) |
|
21 | - { |
|
22 | - $this->_add_validation_strategy( |
|
23 | - new EE_Text_Validation_Strategy( |
|
24 | - esc_html__('Please enter a valid phone number. Eg 123-456-7890 or 1234567890', 'event_espresso'), |
|
25 | - '~^(([\d]{10})|(^[\d]{3}-[\d]{3}-[\d]{4}))$~' |
|
26 | - ) |
|
27 | - ); |
|
28 | - parent::__construct($options); |
|
29 | - } |
|
17 | + /** |
|
18 | + * @param array $options |
|
19 | + */ |
|
20 | + public function __construct($options = array()) |
|
21 | + { |
|
22 | + $this->_add_validation_strategy( |
|
23 | + new EE_Text_Validation_Strategy( |
|
24 | + esc_html__('Please enter a valid phone number. Eg 123-456-7890 or 1234567890', 'event_espresso'), |
|
25 | + '~^(([\d]{10})|(^[\d]{3}-[\d]{3}-[\d]{4}))$~' |
|
26 | + ) |
|
27 | + ); |
|
28 | + parent::__construct($options); |
|
29 | + } |
|
30 | 30 | } |
@@ -74,7 +74,7 @@ discard block |
||
74 | 74 | ); |
75 | 75 | // make sure limit and caps are always set |
76 | 76 | $query_params = array_merge( |
77 | - array( 'limit' => 10, 'caps' => EEM_Base::caps_read_admin ), |
|
77 | + array('limit' => 10, 'caps' => EEM_Base::caps_read_admin), |
|
78 | 78 | $query_params |
79 | 79 | ); |
80 | 80 | $this->_value_field_name = EEH_Array::is_set( |
@@ -155,12 +155,12 @@ discard block |
||
155 | 155 | $values_for_options = (array) $value; |
156 | 156 | $value_field = $this->_get_model()->field_settings_for($this->_value_field_name); |
157 | 157 | $display_field = $this->_get_model()->field_settings_for($this->_display_field_name); |
158 | - $this->_extra_select_columns[] = $value_field->get_qualified_column() . ' AS ' . $this->_value_field_name; |
|
159 | - $this->_extra_select_columns[] = $display_field->get_qualified_column() . ' AS ' . $this->_display_field_name; |
|
158 | + $this->_extra_select_columns[] = $value_field->get_qualified_column().' AS '.$this->_value_field_name; |
|
159 | + $this->_extra_select_columns[] = $display_field->get_qualified_column().' AS '.$this->_display_field_name; |
|
160 | 160 | $display_values = $this->_get_model()->get_all_wpdb_results( |
161 | 161 | array( |
162 | 162 | array( |
163 | - $this->_value_field_name => array( 'IN', $values_for_options ) |
|
163 | + $this->_value_field_name => array('IN', $values_for_options) |
|
164 | 164 | ) |
165 | 165 | ), |
166 | 166 | ARRAY_A, |
@@ -170,9 +170,9 @@ discard block |
||
170 | 170 | if (is_array($select_options)) { |
171 | 171 | foreach ($display_values as $db_rows) { |
172 | 172 | $db_rows = (array) $db_rows; |
173 | - $select_options[ $db_rows[ $this->_value_field_name ] ] = apply_filters( |
|
173 | + $select_options[$db_rows[$this->_value_field_name]] = apply_filters( |
|
174 | 174 | 'FHEE__EE_Select_Ajax_Model_Rest_Input___set_raw_value__select_option_value', |
175 | - $db_rows[ $this->_display_field_name ], |
|
175 | + $db_rows[$this->_display_field_name], |
|
176 | 176 | $db_rows |
177 | 177 | ); |
178 | 178 | } |
@@ -188,7 +188,7 @@ discard block |
||
188 | 188 | */ |
189 | 189 | protected function _get_model() |
190 | 190 | { |
191 | - if (! EE_Registry::instance()->is_model_name($this->_model_name)) { |
|
191 | + if ( ! EE_Registry::instance()->is_model_name($this->_model_name)) { |
|
192 | 192 | throw new EE_Error( |
193 | 193 | sprintf( |
194 | 194 | esc_html__( |
@@ -16,189 +16,189 @@ |
||
16 | 16 | */ |
17 | 17 | class EE_Select_Ajax_Model_Rest_Input extends EE_Form_Input_With_Options_Base |
18 | 18 | { |
19 | - /** |
|
20 | - * @var string $_model_name |
|
21 | - */ |
|
22 | - protected $_model_name; |
|
19 | + /** |
|
20 | + * @var string $_model_name |
|
21 | + */ |
|
22 | + protected $_model_name; |
|
23 | 23 | |
24 | - /** |
|
25 | - * @var string $_display_field_name |
|
26 | - */ |
|
27 | - protected $_display_field_name; |
|
24 | + /** |
|
25 | + * @var string $_display_field_name |
|
26 | + */ |
|
27 | + protected $_display_field_name; |
|
28 | 28 | |
29 | - /** |
|
30 | - * @var string $_value_field_name |
|
31 | - */ |
|
32 | - protected $_value_field_name; |
|
29 | + /** |
|
30 | + * @var string $_value_field_name |
|
31 | + */ |
|
32 | + protected $_value_field_name; |
|
33 | 33 | |
34 | - /** |
|
35 | - * @var array $_extra_select_columns |
|
36 | - */ |
|
37 | - protected $_extra_select_columns = array(); |
|
34 | + /** |
|
35 | + * @var array $_extra_select_columns |
|
36 | + */ |
|
37 | + protected $_extra_select_columns = array(); |
|
38 | 38 | |
39 | 39 | |
40 | - /** |
|
41 | - * @param array $input_settings { |
|
42 | - * @type string $model_name the name of model to be used for searching, both via the REST API and server-side model queries |
|
43 | - * @type array $query_params default query parameters which will apply to both REST API queries and server-side queries. This should be |
|
44 | - * in the exact format that will be used for server-side model usage (eg use index 0 for where conditions, not |
|
45 | - * the string "where") |
|
46 | - * @type string $value_field_name the name of the model field on this model to |
|
47 | - * be used for the HTML select's option's values |
|
48 | - * @type string $display_field_name the name of the model field on this model |
|
49 | - * to be used for the HTML select's option's display text |
|
50 | - * @type array $select2_args arguments to be passed directly into the select2's JS constructor |
|
51 | - * } |
|
52 | - * And the arguments accepted by EE_Form_Input_With_Options_Base |
|
53 | - * } |
|
54 | - * @throws EE_Error |
|
55 | - * @throws InvalidArgumentException |
|
56 | - * @throws InvalidDataTypeException |
|
57 | - * @throws InvalidInterfaceException |
|
58 | - */ |
|
59 | - public function __construct($input_settings = array()) |
|
60 | - { |
|
61 | - // needed input settings: |
|
62 | - // select2_args |
|
63 | - $this->_model_name = EEH_Array::is_set( |
|
64 | - $input_settings, |
|
65 | - 'model_name', |
|
66 | - null |
|
67 | - ); |
|
68 | - $model = $this->_get_model(); |
|
69 | - $query_params = EEH_Array::is_set( |
|
70 | - $input_settings, |
|
71 | - 'query_params', |
|
72 | - array() |
|
73 | - ); |
|
74 | - // make sure limit and caps are always set |
|
75 | - $query_params = array_merge( |
|
76 | - array( 'limit' => 10, 'caps' => EEM_Base::caps_read_admin ), |
|
77 | - $query_params |
|
78 | - ); |
|
79 | - $this->_value_field_name = EEH_Array::is_set( |
|
80 | - $input_settings, |
|
81 | - 'value_field_name', |
|
82 | - $model->primary_key_name() |
|
83 | - ); |
|
84 | - $this->_display_field_name = EEH_Array::is_set( |
|
85 | - $input_settings, |
|
86 | - 'display_field_name', |
|
87 | - $model->get_a_field_of_type('EE_Text_Field_Base')->get_name() |
|
88 | - ); |
|
89 | - $this->_extra_select_columns = EEH_Array::is_set( |
|
90 | - $input_settings, |
|
91 | - 'extra_select_columns', |
|
92 | - array() |
|
93 | - ); |
|
94 | - $this->_add_validation_strategy( |
|
95 | - new EE_Model_Matching_Query_Validation_Strategy( |
|
96 | - '', |
|
97 | - $this->_model_name, |
|
98 | - $query_params, |
|
99 | - $this->_value_field_name |
|
100 | - ) |
|
101 | - ); |
|
102 | - // get resource endpoint |
|
103 | - $rest_controller = LoaderFactory::getLoader()->getNew( |
|
104 | - 'EventEspresso\core\libraries\rest_api\controllers\model\Read' |
|
105 | - ); |
|
106 | - $rest_controller->setRequestedVersion(EED_Core_Rest_Api::latest_rest_api_version()); |
|
107 | - $default_select2_args = array( |
|
108 | - 'ajax' => array( |
|
109 | - 'url' => $rest_controller->getVersionedLinkTo( |
|
110 | - EEH_Inflector::pluralize_and_lower($this->_model_name) |
|
111 | - ), |
|
112 | - 'dataType' => 'json', |
|
113 | - 'delay' => '250', |
|
114 | - 'data_interface' => 'EE_Select2_REST_API_Interface', |
|
115 | - 'data_interface_args' => array( |
|
116 | - 'default_query_params' => (object) ModelDataTranslator::prepareQueryParamsForRestApi( |
|
117 | - $query_params, |
|
118 | - $model |
|
119 | - ), |
|
120 | - 'display_field' => $this->_display_field_name, |
|
121 | - 'value_field' => $this->_value_field_name, |
|
122 | - 'nonce' => wp_create_nonce('wp_rest'), |
|
123 | - 'locale' => str_replace('_', '-', strtolower(get_locale())) |
|
124 | - ), |
|
125 | - ), |
|
126 | - 'cache' => true, |
|
127 | - 'width' => 'resolve' |
|
128 | - ); |
|
129 | - $select2_args = array_replace_recursive( |
|
130 | - $default_select2_args, |
|
131 | - (array) EEH_Array::is_set($input_settings, 'select2_args', array()) |
|
132 | - ); |
|
133 | - $this->set_display_strategy(new EE_Select2_Display_Strategy($select2_args)); |
|
134 | - parent::__construct(array(), $input_settings); |
|
135 | - } |
|
40 | + /** |
|
41 | + * @param array $input_settings { |
|
42 | + * @type string $model_name the name of model to be used for searching, both via the REST API and server-side model queries |
|
43 | + * @type array $query_params default query parameters which will apply to both REST API queries and server-side queries. This should be |
|
44 | + * in the exact format that will be used for server-side model usage (eg use index 0 for where conditions, not |
|
45 | + * the string "where") |
|
46 | + * @type string $value_field_name the name of the model field on this model to |
|
47 | + * be used for the HTML select's option's values |
|
48 | + * @type string $display_field_name the name of the model field on this model |
|
49 | + * to be used for the HTML select's option's display text |
|
50 | + * @type array $select2_args arguments to be passed directly into the select2's JS constructor |
|
51 | + * } |
|
52 | + * And the arguments accepted by EE_Form_Input_With_Options_Base |
|
53 | + * } |
|
54 | + * @throws EE_Error |
|
55 | + * @throws InvalidArgumentException |
|
56 | + * @throws InvalidDataTypeException |
|
57 | + * @throws InvalidInterfaceException |
|
58 | + */ |
|
59 | + public function __construct($input_settings = array()) |
|
60 | + { |
|
61 | + // needed input settings: |
|
62 | + // select2_args |
|
63 | + $this->_model_name = EEH_Array::is_set( |
|
64 | + $input_settings, |
|
65 | + 'model_name', |
|
66 | + null |
|
67 | + ); |
|
68 | + $model = $this->_get_model(); |
|
69 | + $query_params = EEH_Array::is_set( |
|
70 | + $input_settings, |
|
71 | + 'query_params', |
|
72 | + array() |
|
73 | + ); |
|
74 | + // make sure limit and caps are always set |
|
75 | + $query_params = array_merge( |
|
76 | + array( 'limit' => 10, 'caps' => EEM_Base::caps_read_admin ), |
|
77 | + $query_params |
|
78 | + ); |
|
79 | + $this->_value_field_name = EEH_Array::is_set( |
|
80 | + $input_settings, |
|
81 | + 'value_field_name', |
|
82 | + $model->primary_key_name() |
|
83 | + ); |
|
84 | + $this->_display_field_name = EEH_Array::is_set( |
|
85 | + $input_settings, |
|
86 | + 'display_field_name', |
|
87 | + $model->get_a_field_of_type('EE_Text_Field_Base')->get_name() |
|
88 | + ); |
|
89 | + $this->_extra_select_columns = EEH_Array::is_set( |
|
90 | + $input_settings, |
|
91 | + 'extra_select_columns', |
|
92 | + array() |
|
93 | + ); |
|
94 | + $this->_add_validation_strategy( |
|
95 | + new EE_Model_Matching_Query_Validation_Strategy( |
|
96 | + '', |
|
97 | + $this->_model_name, |
|
98 | + $query_params, |
|
99 | + $this->_value_field_name |
|
100 | + ) |
|
101 | + ); |
|
102 | + // get resource endpoint |
|
103 | + $rest_controller = LoaderFactory::getLoader()->getNew( |
|
104 | + 'EventEspresso\core\libraries\rest_api\controllers\model\Read' |
|
105 | + ); |
|
106 | + $rest_controller->setRequestedVersion(EED_Core_Rest_Api::latest_rest_api_version()); |
|
107 | + $default_select2_args = array( |
|
108 | + 'ajax' => array( |
|
109 | + 'url' => $rest_controller->getVersionedLinkTo( |
|
110 | + EEH_Inflector::pluralize_and_lower($this->_model_name) |
|
111 | + ), |
|
112 | + 'dataType' => 'json', |
|
113 | + 'delay' => '250', |
|
114 | + 'data_interface' => 'EE_Select2_REST_API_Interface', |
|
115 | + 'data_interface_args' => array( |
|
116 | + 'default_query_params' => (object) ModelDataTranslator::prepareQueryParamsForRestApi( |
|
117 | + $query_params, |
|
118 | + $model |
|
119 | + ), |
|
120 | + 'display_field' => $this->_display_field_name, |
|
121 | + 'value_field' => $this->_value_field_name, |
|
122 | + 'nonce' => wp_create_nonce('wp_rest'), |
|
123 | + 'locale' => str_replace('_', '-', strtolower(get_locale())) |
|
124 | + ), |
|
125 | + ), |
|
126 | + 'cache' => true, |
|
127 | + 'width' => 'resolve' |
|
128 | + ); |
|
129 | + $select2_args = array_replace_recursive( |
|
130 | + $default_select2_args, |
|
131 | + (array) EEH_Array::is_set($input_settings, 'select2_args', array()) |
|
132 | + ); |
|
133 | + $this->set_display_strategy(new EE_Select2_Display_Strategy($select2_args)); |
|
134 | + parent::__construct(array(), $input_settings); |
|
135 | + } |
|
136 | 136 | |
137 | 137 | |
138 | 138 | |
139 | - /** |
|
140 | - * Before setting the raw value (usually because we're setting the default, |
|
141 | - * or we've received a form submission and this might be re-displayed to the user), |
|
142 | - * sets the options so that the current selections appear on initial display. |
|
143 | - * |
|
144 | - * Note: because this input uses EE_Model_Matching_Query_Validation_Strategy |
|
145 | - * for validation, this input's options only affect DISPLAY and NOT validation, |
|
146 | - * which is why its ok to just assume the provided $value to be in the list of acceptable values |
|
147 | - * |
|
148 | - * @param mixed $value |
|
149 | - * @return void |
|
150 | - * @throws \EE_Error |
|
151 | - */ |
|
152 | - public function _set_raw_value($value) |
|
153 | - { |
|
154 | - $values_for_options = (array) $value; |
|
155 | - $value_field = $this->_get_model()->field_settings_for($this->_value_field_name); |
|
156 | - $display_field = $this->_get_model()->field_settings_for($this->_display_field_name); |
|
157 | - $this->_extra_select_columns[] = $value_field->get_qualified_column() . ' AS ' . $this->_value_field_name; |
|
158 | - $this->_extra_select_columns[] = $display_field->get_qualified_column() . ' AS ' . $this->_display_field_name; |
|
159 | - $display_values = $this->_get_model()->get_all_wpdb_results( |
|
160 | - array( |
|
161 | - array( |
|
162 | - $this->_value_field_name => array( 'IN', $values_for_options ) |
|
163 | - ) |
|
164 | - ), |
|
165 | - ARRAY_A, |
|
166 | - implode(',', $this->_extra_select_columns) |
|
167 | - ); |
|
168 | - $select_options = array(); |
|
169 | - if (is_array($select_options)) { |
|
170 | - foreach ($display_values as $db_rows) { |
|
171 | - $db_rows = (array) $db_rows; |
|
172 | - $select_options[ $db_rows[ $this->_value_field_name ] ] = apply_filters( |
|
173 | - 'FHEE__EE_Select_Ajax_Model_Rest_Input___set_raw_value__select_option_value', |
|
174 | - $db_rows[ $this->_display_field_name ], |
|
175 | - $db_rows |
|
176 | - ); |
|
177 | - } |
|
178 | - } |
|
179 | - $this->set_select_options($select_options); |
|
180 | - parent::_set_raw_value($value); |
|
181 | - } |
|
139 | + /** |
|
140 | + * Before setting the raw value (usually because we're setting the default, |
|
141 | + * or we've received a form submission and this might be re-displayed to the user), |
|
142 | + * sets the options so that the current selections appear on initial display. |
|
143 | + * |
|
144 | + * Note: because this input uses EE_Model_Matching_Query_Validation_Strategy |
|
145 | + * for validation, this input's options only affect DISPLAY and NOT validation, |
|
146 | + * which is why its ok to just assume the provided $value to be in the list of acceptable values |
|
147 | + * |
|
148 | + * @param mixed $value |
|
149 | + * @return void |
|
150 | + * @throws \EE_Error |
|
151 | + */ |
|
152 | + public function _set_raw_value($value) |
|
153 | + { |
|
154 | + $values_for_options = (array) $value; |
|
155 | + $value_field = $this->_get_model()->field_settings_for($this->_value_field_name); |
|
156 | + $display_field = $this->_get_model()->field_settings_for($this->_display_field_name); |
|
157 | + $this->_extra_select_columns[] = $value_field->get_qualified_column() . ' AS ' . $this->_value_field_name; |
|
158 | + $this->_extra_select_columns[] = $display_field->get_qualified_column() . ' AS ' . $this->_display_field_name; |
|
159 | + $display_values = $this->_get_model()->get_all_wpdb_results( |
|
160 | + array( |
|
161 | + array( |
|
162 | + $this->_value_field_name => array( 'IN', $values_for_options ) |
|
163 | + ) |
|
164 | + ), |
|
165 | + ARRAY_A, |
|
166 | + implode(',', $this->_extra_select_columns) |
|
167 | + ); |
|
168 | + $select_options = array(); |
|
169 | + if (is_array($select_options)) { |
|
170 | + foreach ($display_values as $db_rows) { |
|
171 | + $db_rows = (array) $db_rows; |
|
172 | + $select_options[ $db_rows[ $this->_value_field_name ] ] = apply_filters( |
|
173 | + 'FHEE__EE_Select_Ajax_Model_Rest_Input___set_raw_value__select_option_value', |
|
174 | + $db_rows[ $this->_display_field_name ], |
|
175 | + $db_rows |
|
176 | + ); |
|
177 | + } |
|
178 | + } |
|
179 | + $this->set_select_options($select_options); |
|
180 | + parent::_set_raw_value($value); |
|
181 | + } |
|
182 | 182 | |
183 | - /** |
|
184 | - * Returns the model, or throws an exception if the model name provided in constructor doesn't exist |
|
185 | - * @return EEM_Base |
|
186 | - * @throws EE_Error |
|
187 | - */ |
|
188 | - protected function _get_model() |
|
189 | - { |
|
190 | - if (! EE_Registry::instance()->is_model_name($this->_model_name)) { |
|
191 | - throw new EE_Error( |
|
192 | - sprintf( |
|
193 | - esc_html__( |
|
194 | - '%1$s is not a proper model name. Please provide a model name in the "model_name" form input argument', |
|
195 | - 'event_espresso' |
|
196 | - ), |
|
197 | - $this->_model_name |
|
198 | - ) |
|
199 | - ); |
|
200 | - } else { |
|
201 | - return EE_Registry::instance()->load_model($this->_model_name); |
|
202 | - } |
|
203 | - } |
|
183 | + /** |
|
184 | + * Returns the model, or throws an exception if the model name provided in constructor doesn't exist |
|
185 | + * @return EEM_Base |
|
186 | + * @throws EE_Error |
|
187 | + */ |
|
188 | + protected function _get_model() |
|
189 | + { |
|
190 | + if (! EE_Registry::instance()->is_model_name($this->_model_name)) { |
|
191 | + throw new EE_Error( |
|
192 | + sprintf( |
|
193 | + esc_html__( |
|
194 | + '%1$s is not a proper model name. Please provide a model name in the "model_name" form input argument', |
|
195 | + 'event_espresso' |
|
196 | + ), |
|
197 | + $this->_model_name |
|
198 | + ) |
|
199 | + ); |
|
200 | + } else { |
|
201 | + return EE_Registry::instance()->load_model($this->_model_name); |
|
202 | + } |
|
203 | + } |
|
204 | 204 | } |
@@ -120,7 +120,7 @@ |
||
120 | 120 | public function _update_config(EE_Config_Base $config_obj = null) |
121 | 121 | { |
122 | 122 | $config_class = $this->config_class(); |
123 | - if (! $config_obj instanceof $config_class) { |
|
123 | + if ( ! $config_obj instanceof $config_class) { |
|
124 | 124 | throw new EE_Error( |
125 | 125 | sprintf( |
126 | 126 | esc_html__('The "%1$s" class is not an instance of %2$s.', 'event_espresso'), |
@@ -9,143 +9,143 @@ |
||
9 | 9 | */ |
10 | 10 | abstract class EE_Configurable extends EE_Base |
11 | 11 | { |
12 | - /** |
|
13 | - * @var $_config |
|
14 | - * @type EE_Config_Base |
|
15 | - */ |
|
16 | - protected $_config; |
|
17 | - |
|
18 | - /** |
|
19 | - * @var $_config_section |
|
20 | - * @type string |
|
21 | - */ |
|
22 | - protected $_config_section = ''; |
|
23 | - |
|
24 | - /** |
|
25 | - * @var $_config_class |
|
26 | - * @type string |
|
27 | - */ |
|
28 | - protected $_config_class = ''; |
|
29 | - |
|
30 | - /** |
|
31 | - * @var $_config_name |
|
32 | - * @type string |
|
33 | - */ |
|
34 | - protected $_config_name = ''; |
|
35 | - |
|
36 | - |
|
37 | - /** |
|
38 | - * @param string $config_section |
|
39 | - */ |
|
40 | - public function set_config_section($config_section = '') |
|
41 | - { |
|
42 | - $this->_config_section = ! empty($config_section) ? $config_section : 'modules'; |
|
43 | - } |
|
44 | - |
|
45 | - |
|
46 | - /** |
|
47 | - * @return mixed |
|
48 | - */ |
|
49 | - public function config_section() |
|
50 | - { |
|
51 | - return $this->_config_section; |
|
52 | - } |
|
53 | - |
|
54 | - |
|
55 | - /** |
|
56 | - * @param string $config_class |
|
57 | - */ |
|
58 | - public function set_config_class($config_class = '') |
|
59 | - { |
|
60 | - $this->_config_class = $config_class; |
|
61 | - } |
|
62 | - |
|
63 | - |
|
64 | - /** |
|
65 | - * @return mixed |
|
66 | - */ |
|
67 | - public function config_class() |
|
68 | - { |
|
69 | - return $this->_config_class; |
|
70 | - } |
|
71 | - |
|
72 | - |
|
73 | - /** |
|
74 | - * @param mixed $config_name |
|
75 | - */ |
|
76 | - public function set_config_name($config_name) |
|
77 | - { |
|
78 | - $this->_config_name = ! empty($config_name) ? $config_name : get_called_class(); |
|
79 | - } |
|
80 | - |
|
81 | - |
|
82 | - /** |
|
83 | - * @return mixed |
|
84 | - */ |
|
85 | - public function config_name() |
|
86 | - { |
|
87 | - return $this->_config_name; |
|
88 | - } |
|
89 | - |
|
90 | - |
|
91 | - /** |
|
92 | - * set_config |
|
93 | - * this method integrates directly with EE_Config to set up the config object for this class |
|
94 | - * |
|
95 | - * @access protected |
|
96 | - * @param EE_Config_Base $config_obj |
|
97 | - * @return mixed EE_Config_Base | NULL |
|
98 | - */ |
|
99 | - protected function _set_config(EE_Config_Base $config_obj = null) |
|
100 | - { |
|
101 | - return EE_Config::instance()->set_config( |
|
102 | - $this->config_section(), |
|
103 | - $this->config_name(), |
|
104 | - $this->config_class(), |
|
105 | - $config_obj |
|
106 | - ); |
|
107 | - } |
|
108 | - |
|
109 | - |
|
110 | - /** |
|
111 | - * _update_config |
|
112 | - * this method integrates directly with EE_Config to update an existing config object for this class |
|
113 | - * |
|
114 | - * @access protected |
|
115 | - * @param EE_Config_Base $config_obj |
|
116 | - * @throws \EE_Error |
|
117 | - * @return mixed EE_Config_Base | NULL |
|
118 | - */ |
|
119 | - public function _update_config(EE_Config_Base $config_obj = null) |
|
120 | - { |
|
121 | - $config_class = $this->config_class(); |
|
122 | - if (! $config_obj instanceof $config_class) { |
|
123 | - throw new EE_Error( |
|
124 | - sprintf( |
|
125 | - esc_html__('The "%1$s" class is not an instance of %2$s.', 'event_espresso'), |
|
126 | - print_r($config_obj, true), |
|
127 | - $config_class |
|
128 | - ) |
|
129 | - ); |
|
130 | - } |
|
131 | - return EE_Config::instance()->update_config($this->config_section(), $this->config_name(), $config_obj); |
|
132 | - } |
|
133 | - |
|
134 | - |
|
135 | - /** |
|
136 | - * gets the class's config object |
|
137 | - * |
|
138 | - * @return EE_Config_Base |
|
139 | - */ |
|
140 | - public function config() |
|
141 | - { |
|
142 | - if (empty($this->_config)) { |
|
143 | - $this->_config = EE_Config::instance()->get_config( |
|
144 | - $this->config_section(), |
|
145 | - $this->config_name(), |
|
146 | - $this->config_class() |
|
147 | - ); |
|
148 | - } |
|
149 | - return $this->_config; |
|
150 | - } |
|
12 | + /** |
|
13 | + * @var $_config |
|
14 | + * @type EE_Config_Base |
|
15 | + */ |
|
16 | + protected $_config; |
|
17 | + |
|
18 | + /** |
|
19 | + * @var $_config_section |
|
20 | + * @type string |
|
21 | + */ |
|
22 | + protected $_config_section = ''; |
|
23 | + |
|
24 | + /** |
|
25 | + * @var $_config_class |
|
26 | + * @type string |
|
27 | + */ |
|
28 | + protected $_config_class = ''; |
|
29 | + |
|
30 | + /** |
|
31 | + * @var $_config_name |
|
32 | + * @type string |
|
33 | + */ |
|
34 | + protected $_config_name = ''; |
|
35 | + |
|
36 | + |
|
37 | + /** |
|
38 | + * @param string $config_section |
|
39 | + */ |
|
40 | + public function set_config_section($config_section = '') |
|
41 | + { |
|
42 | + $this->_config_section = ! empty($config_section) ? $config_section : 'modules'; |
|
43 | + } |
|
44 | + |
|
45 | + |
|
46 | + /** |
|
47 | + * @return mixed |
|
48 | + */ |
|
49 | + public function config_section() |
|
50 | + { |
|
51 | + return $this->_config_section; |
|
52 | + } |
|
53 | + |
|
54 | + |
|
55 | + /** |
|
56 | + * @param string $config_class |
|
57 | + */ |
|
58 | + public function set_config_class($config_class = '') |
|
59 | + { |
|
60 | + $this->_config_class = $config_class; |
|
61 | + } |
|
62 | + |
|
63 | + |
|
64 | + /** |
|
65 | + * @return mixed |
|
66 | + */ |
|
67 | + public function config_class() |
|
68 | + { |
|
69 | + return $this->_config_class; |
|
70 | + } |
|
71 | + |
|
72 | + |
|
73 | + /** |
|
74 | + * @param mixed $config_name |
|
75 | + */ |
|
76 | + public function set_config_name($config_name) |
|
77 | + { |
|
78 | + $this->_config_name = ! empty($config_name) ? $config_name : get_called_class(); |
|
79 | + } |
|
80 | + |
|
81 | + |
|
82 | + /** |
|
83 | + * @return mixed |
|
84 | + */ |
|
85 | + public function config_name() |
|
86 | + { |
|
87 | + return $this->_config_name; |
|
88 | + } |
|
89 | + |
|
90 | + |
|
91 | + /** |
|
92 | + * set_config |
|
93 | + * this method integrates directly with EE_Config to set up the config object for this class |
|
94 | + * |
|
95 | + * @access protected |
|
96 | + * @param EE_Config_Base $config_obj |
|
97 | + * @return mixed EE_Config_Base | NULL |
|
98 | + */ |
|
99 | + protected function _set_config(EE_Config_Base $config_obj = null) |
|
100 | + { |
|
101 | + return EE_Config::instance()->set_config( |
|
102 | + $this->config_section(), |
|
103 | + $this->config_name(), |
|
104 | + $this->config_class(), |
|
105 | + $config_obj |
|
106 | + ); |
|
107 | + } |
|
108 | + |
|
109 | + |
|
110 | + /** |
|
111 | + * _update_config |
|
112 | + * this method integrates directly with EE_Config to update an existing config object for this class |
|
113 | + * |
|
114 | + * @access protected |
|
115 | + * @param EE_Config_Base $config_obj |
|
116 | + * @throws \EE_Error |
|
117 | + * @return mixed EE_Config_Base | NULL |
|
118 | + */ |
|
119 | + public function _update_config(EE_Config_Base $config_obj = null) |
|
120 | + { |
|
121 | + $config_class = $this->config_class(); |
|
122 | + if (! $config_obj instanceof $config_class) { |
|
123 | + throw new EE_Error( |
|
124 | + sprintf( |
|
125 | + esc_html__('The "%1$s" class is not an instance of %2$s.', 'event_espresso'), |
|
126 | + print_r($config_obj, true), |
|
127 | + $config_class |
|
128 | + ) |
|
129 | + ); |
|
130 | + } |
|
131 | + return EE_Config::instance()->update_config($this->config_section(), $this->config_name(), $config_obj); |
|
132 | + } |
|
133 | + |
|
134 | + |
|
135 | + /** |
|
136 | + * gets the class's config object |
|
137 | + * |
|
138 | + * @return EE_Config_Base |
|
139 | + */ |
|
140 | + public function config() |
|
141 | + { |
|
142 | + if (empty($this->_config)) { |
|
143 | + $this->_config = EE_Config::instance()->get_config( |
|
144 | + $this->config_section(), |
|
145 | + $this->config_name(), |
|
146 | + $this->config_class() |
|
147 | + ); |
|
148 | + } |
|
149 | + return $this->_config; |
|
150 | + } |
|
151 | 151 | } |
@@ -24,7 +24,7 @@ discard block |
||
24 | 24 | */ |
25 | 25 | protected function __construct($timezone) |
26 | 26 | { |
27 | - require_once(EE_MODELS . 'EEM_Price_Type.model.php'); |
|
27 | + require_once(EE_MODELS.'EEM_Price_Type.model.php'); |
|
28 | 28 | $this->singular_item = esc_html__('Price', 'event_espresso'); |
29 | 29 | $this->plural_item = esc_html__('Prices', 'event_espresso'); |
30 | 30 | |
@@ -52,11 +52,11 @@ discard block |
||
52 | 52 | 'WP_User' => new EE_Belongs_To_Relation(), |
53 | 53 | ); |
54 | 54 | // this model is generally available for reading |
55 | - $this->_cap_restriction_generators[ EEM_Base::caps_read ] = new EE_Restriction_Generator_Default_Public('PRC_is_default', 'Ticket.Datetime.Event'); |
|
55 | + $this->_cap_restriction_generators[EEM_Base::caps_read] = new EE_Restriction_Generator_Default_Public('PRC_is_default', 'Ticket.Datetime.Event'); |
|
56 | 56 | // account for default tickets in the caps |
57 | - $this->_cap_restriction_generators[ EEM_Base::caps_read_admin ] = new EE_Restriction_Generator_Default_Protected('PRC_is_default', 'Ticket.Datetime.Event'); |
|
58 | - $this->_cap_restriction_generators[ EEM_Base::caps_edit ] = new EE_Restriction_Generator_Default_Protected('PRC_is_default', 'Ticket.Datetime.Event'); |
|
59 | - $this->_cap_restriction_generators[ EEM_Base::caps_delete ] = new EE_Restriction_Generator_Default_Protected('PRC_is_default', 'Ticket.Datetime.Event'); |
|
57 | + $this->_cap_restriction_generators[EEM_Base::caps_read_admin] = new EE_Restriction_Generator_Default_Protected('PRC_is_default', 'Ticket.Datetime.Event'); |
|
58 | + $this->_cap_restriction_generators[EEM_Base::caps_edit] = new EE_Restriction_Generator_Default_Protected('PRC_is_default', 'Ticket.Datetime.Event'); |
|
59 | + $this->_cap_restriction_generators[EEM_Base::caps_delete] = new EE_Restriction_Generator_Default_Protected('PRC_is_default', 'Ticket.Datetime.Event'); |
|
60 | 60 | parent::__construct($timezone); |
61 | 61 | } |
62 | 62 | |
@@ -103,7 +103,7 @@ discard block |
||
103 | 103 | return $this->get_all(array( |
104 | 104 | array( |
105 | 105 | 'EVT_ID' => $EVT_ID, |
106 | - 'Price_Type.PBT_ID' => array('!=', EEM_Price_Type::base_type_tax) |
|
106 | + 'Price_Type.PBT_ID' => array('!=', EEM_Price_Type::base_type_tax) |
|
107 | 107 | ), |
108 | 108 | 'order_by' => $this->_order_by_array_for_get_all_method() |
109 | 109 | )); |
@@ -121,7 +121,7 @@ discard block |
||
121 | 121 | public function get_all_default_prices($count = false) |
122 | 122 | { |
123 | 123 | $_where = array( |
124 | - 'Price_Type.PBT_ID' => array('!=',4), |
|
124 | + 'Price_Type.PBT_ID' => array('!=', 4), |
|
125 | 125 | 'PRC_deleted' => 0, |
126 | 126 | 'PRC_is_default' => 1 |
127 | 127 | ); |
@@ -153,12 +153,12 @@ discard block |
||
153 | 153 | { |
154 | 154 | $taxes = array(); |
155 | 155 | $all_taxes = $this->get_all(array( |
156 | - array( 'Price_Type.PBT_ID' => EEM_Price_Type::base_type_tax ), |
|
157 | - 'order_by' => array( 'Price_Type.PRT_order' => 'ASC', 'PRC_order' => 'ASC' ) |
|
156 | + array('Price_Type.PBT_ID' => EEM_Price_Type::base_type_tax), |
|
157 | + 'order_by' => array('Price_Type.PRT_order' => 'ASC', 'PRC_order' => 'ASC') |
|
158 | 158 | )); |
159 | 159 | foreach ($all_taxes as $tax) { |
160 | 160 | if ($tax instanceof EE_Price) { |
161 | - $taxes[ $tax->order() ][ $tax->ID() ] = $tax; |
|
161 | + $taxes[$tax->order()][$tax->ID()] = $tax; |
|
162 | 162 | } |
163 | 163 | } |
164 | 164 | return $taxes; |
@@ -186,7 +186,7 @@ discard block |
||
186 | 186 | if ($default_prices) { |
187 | 187 | foreach ($default_prices as $price) { |
188 | 188 | if ($price instanceof EE_Price) { |
189 | - $array_of_price_objects[ $price->type() ][] = $price; |
|
189 | + $array_of_price_objects[$price->type()][] = $price; |
|
190 | 190 | } |
191 | 191 | } |
192 | 192 | return $array_of_price_objects; |
@@ -203,10 +203,10 @@ discard block |
||
203 | 203 | )); |
204 | 204 | } |
205 | 205 | |
206 | - if (!empty($ticket_prices)) { |
|
206 | + if ( ! empty($ticket_prices)) { |
|
207 | 207 | foreach ($ticket_prices as $price) { |
208 | 208 | if ($price instanceof EE_Price) { |
209 | - $array_of_price_objects[ $price->type() ][] = $price; |
|
209 | + $array_of_price_objects[$price->type()][] = $price; |
|
210 | 210 | } |
211 | 211 | } |
212 | 212 | return $array_of_price_objects; |
@@ -9,279 +9,279 @@ |
||
9 | 9 | */ |
10 | 10 | class EEM_Price extends EEM_Soft_Delete_Base |
11 | 11 | { |
12 | - // private instance of the EEM_Price object |
|
13 | - protected static $_instance = null; |
|
14 | - |
|
15 | - |
|
16 | - |
|
17 | - /** |
|
18 | - * private constructor to prevent direct creation |
|
19 | - * @Constructor |
|
20 | - * @access protected |
|
21 | - * @param string $timezone string representing the timezone we want to set for returned Date Time Strings (and any incoming timezone data that gets saved). Note this just sends the timezone info to the date time model field objects. Default is NULL (and will be assumed using the set timezone in the 'timezone_string' wp option) |
|
22 | - * @return EEM_Price |
|
23 | - */ |
|
24 | - protected function __construct($timezone) |
|
25 | - { |
|
26 | - require_once(EE_MODELS . 'EEM_Price_Type.model.php'); |
|
27 | - $this->singular_item = esc_html__('Price', 'event_espresso'); |
|
28 | - $this->plural_item = esc_html__('Prices', 'event_espresso'); |
|
29 | - |
|
30 | - $this->_tables = array( |
|
31 | - 'Price' => new EE_Primary_Table('esp_price', 'PRC_ID') |
|
32 | - ); |
|
33 | - $this->_fields = array( |
|
34 | - 'Price' => array( |
|
35 | - 'PRC_ID' => new EE_Primary_Key_Int_Field('PRC_ID', 'Price ID'), |
|
36 | - 'PRT_ID' => new EE_Foreign_Key_Int_Field('PRT_ID', 'Price type Id', false, null, 'Price_Type'), |
|
37 | - 'PRC_amount' => new EE_Money_Field('PRC_amount', 'Price Amount', false, 0), |
|
38 | - 'PRC_name' => new EE_Plain_Text_Field('PRC_name', 'Name of Price', false, ''), |
|
39 | - 'PRC_desc' => new EE_Post_Content_Field('PRC_desc', 'Price Description', false, ''), |
|
40 | - 'PRC_is_default' => new EE_Boolean_Field('PRC_is_default', 'Flag indicating whether price is a default price', false, false), |
|
41 | - 'PRC_overrides' => new EE_Integer_Field('PRC_overrides', 'Price ID for a global Price that will be overridden by this Price ( for replacing default prices )', true, 0), |
|
42 | - 'PRC_order' => new EE_Integer_Field('PRC_order', 'Order of Application of Price (lower numbers apply first?)', false, 1), |
|
43 | - 'PRC_deleted' => new EE_Trashed_Flag_Field('PRC_deleted', 'Flag Indicating if this has been deleted or not', false, false), |
|
44 | - 'PRC_parent' => new EE_Integer_Field('PRC_parent', esc_html__('Indicates what PRC_ID is the parent of this PRC_ID', 'event_espresso'), true, 0), |
|
45 | - 'PRC_wp_user' => new EE_WP_User_Field('PRC_wp_user', esc_html__('Price Creator ID', 'event_espresso'), false), |
|
46 | - ) |
|
47 | - ); |
|
48 | - $this->_model_relations = array( |
|
49 | - 'Ticket' => new EE_HABTM_Relation('Ticket_Price'), |
|
50 | - 'Price_Type' => new EE_Belongs_To_Relation(), |
|
51 | - 'WP_User' => new EE_Belongs_To_Relation(), |
|
52 | - ); |
|
53 | - // this model is generally available for reading |
|
54 | - $this->_cap_restriction_generators[ EEM_Base::caps_read ] = new EE_Restriction_Generator_Default_Public('PRC_is_default', 'Ticket.Datetime.Event'); |
|
55 | - // account for default tickets in the caps |
|
56 | - $this->_cap_restriction_generators[ EEM_Base::caps_read_admin ] = new EE_Restriction_Generator_Default_Protected('PRC_is_default', 'Ticket.Datetime.Event'); |
|
57 | - $this->_cap_restriction_generators[ EEM_Base::caps_edit ] = new EE_Restriction_Generator_Default_Protected('PRC_is_default', 'Ticket.Datetime.Event'); |
|
58 | - $this->_cap_restriction_generators[ EEM_Base::caps_delete ] = new EE_Restriction_Generator_Default_Protected('PRC_is_default', 'Ticket.Datetime.Event'); |
|
59 | - parent::__construct($timezone); |
|
60 | - } |
|
61 | - |
|
62 | - |
|
63 | - |
|
64 | - /** |
|
65 | - * instantiate a new price object with blank/empty properties |
|
66 | - * |
|
67 | - * @access public |
|
68 | - * @return mixed array on success, FALSE on fail |
|
69 | - */ |
|
70 | - public function get_new_price() |
|
71 | - { |
|
72 | - return $this->create_default_object(); |
|
73 | - } |
|
74 | - |
|
75 | - |
|
76 | - |
|
77 | - |
|
78 | - |
|
79 | - /** |
|
80 | - * retrieve ALL prices from db |
|
81 | - * |
|
82 | - * @access public |
|
83 | - * @return EE_PRice[] |
|
84 | - */ |
|
85 | - public function get_all_prices() |
|
86 | - { |
|
87 | - // retrieve all prices |
|
88 | - return $this->get_all(array('order_by' => array('PRC_amount' => 'ASC'))); |
|
89 | - } |
|
90 | - |
|
91 | - |
|
92 | - |
|
93 | - /** |
|
94 | - * retrieve all active prices for a particular event |
|
95 | - * |
|
96 | - * @access public |
|
97 | - * @param int $EVT_ID |
|
98 | - * @return array on success |
|
99 | - */ |
|
100 | - public function get_all_event_prices($EVT_ID = 0) |
|
101 | - { |
|
102 | - return $this->get_all(array( |
|
103 | - array( |
|
104 | - 'EVT_ID' => $EVT_ID, |
|
105 | - 'Price_Type.PBT_ID' => array('!=', EEM_Price_Type::base_type_tax) |
|
106 | - ), |
|
107 | - 'order_by' => $this->_order_by_array_for_get_all_method() |
|
108 | - )); |
|
109 | - } |
|
110 | - |
|
111 | - |
|
112 | - /** |
|
113 | - * retrieve all active global prices (that are not taxes (PBT_ID=4)) for a particular event |
|
114 | - * |
|
115 | - * @access public |
|
116 | - * @param boolean $count return count |
|
117 | - * @return array on success |
|
118 | - * @return boolean false on fail |
|
119 | - */ |
|
120 | - public function get_all_default_prices($count = false) |
|
121 | - { |
|
122 | - $_where = array( |
|
123 | - 'Price_Type.PBT_ID' => array('!=',4), |
|
124 | - 'PRC_deleted' => 0, |
|
125 | - 'PRC_is_default' => 1 |
|
126 | - ); |
|
127 | - $_query_params = array( |
|
128 | - $_where, |
|
129 | - 'order_by' => $this->_order_by_array_for_get_all_method() |
|
130 | - ); |
|
131 | - return $count ? $this->count(array($_where)) : $this->get_all($_query_params); |
|
132 | - } |
|
133 | - |
|
134 | - |
|
135 | - |
|
136 | - |
|
137 | - |
|
138 | - |
|
139 | - |
|
140 | - |
|
141 | - |
|
142 | - |
|
143 | - /** |
|
144 | - * retrieve all prices that are taxes |
|
145 | - * |
|
146 | - * @access public |
|
147 | - * @return array on success |
|
148 | - * @return array top-level keys are the price's order and their values are an array, |
|
149 | - * next-level keys are the price's ID, and their values are EE_Price objects |
|
150 | - */ |
|
151 | - public function get_all_prices_that_are_taxes() |
|
152 | - { |
|
153 | - $taxes = array(); |
|
154 | - $all_taxes = $this->get_all(array( |
|
155 | - array( 'Price_Type.PBT_ID' => EEM_Price_Type::base_type_tax ), |
|
156 | - 'order_by' => array( 'Price_Type.PRT_order' => 'ASC', 'PRC_order' => 'ASC' ) |
|
157 | - )); |
|
158 | - foreach ($all_taxes as $tax) { |
|
159 | - if ($tax instanceof EE_Price) { |
|
160 | - $taxes[ $tax->order() ][ $tax->ID() ] = $tax; |
|
161 | - } |
|
162 | - } |
|
163 | - return $taxes; |
|
164 | - } |
|
165 | - |
|
166 | - |
|
167 | - |
|
168 | - |
|
169 | - |
|
170 | - /** |
|
171 | - * retrieve all prices for an ticket plus default global prices, but not taxes |
|
172 | - * |
|
173 | - * @access public |
|
174 | - * @param int $TKT_ID the id of the event. If not included then we assume that this is a new ticket. |
|
175 | - * @return boolean false on fail |
|
176 | - */ |
|
177 | - public function get_all_ticket_prices_for_admin($TKT_ID = 0) |
|
178 | - { |
|
179 | - $array_of_price_objects = array(); |
|
180 | - if (empty($TKT_ID)) { |
|
181 | - // if there is no tkt, get prices with no tkt ID, are global, are not a tax, and are active |
|
182 | - // return that list |
|
183 | - $default_prices = $this->get_all_default_prices(); |
|
184 | - |
|
185 | - if ($default_prices) { |
|
186 | - foreach ($default_prices as $price) { |
|
187 | - if ($price instanceof EE_Price) { |
|
188 | - $array_of_price_objects[ $price->type() ][] = $price; |
|
189 | - } |
|
190 | - } |
|
191 | - return $array_of_price_objects; |
|
192 | - } else { |
|
193 | - return array(); |
|
194 | - } |
|
195 | - } else { |
|
196 | - $ticket_prices = $this->get_all(array( |
|
197 | - array( |
|
198 | - 'TKT_ID' => $TKT_ID, |
|
199 | - 'PRC_deleted' => 0 |
|
200 | - ), |
|
201 | - 'order_by' => array('PRC_order' => 'ASC') |
|
202 | - )); |
|
203 | - } |
|
204 | - |
|
205 | - if (!empty($ticket_prices)) { |
|
206 | - foreach ($ticket_prices as $price) { |
|
207 | - if ($price instanceof EE_Price) { |
|
208 | - $array_of_price_objects[ $price->type() ][] = $price; |
|
209 | - } |
|
210 | - } |
|
211 | - return $array_of_price_objects; |
|
212 | - } else { |
|
213 | - return false; |
|
214 | - } |
|
215 | - } |
|
216 | - |
|
217 | - |
|
218 | - |
|
219 | - /** |
|
220 | - * _sort_event_prices_by_type |
|
221 | - * |
|
222 | - * @access public |
|
223 | - * @param \EE_Price $price_a |
|
224 | - * @param \EE_Price $price_b |
|
225 | - * @return bool false on fail |
|
226 | - */ |
|
227 | - public function _sort_event_prices_by_type(EE_Price $price_a, EE_Price $price_b) |
|
228 | - { |
|
229 | - if ($price_a->type_obj()->order() == $price_b->type_obj()->order()) { |
|
230 | - return $this->_sort_event_prices_by_order($price_a, $price_b); |
|
231 | - } |
|
232 | - return $price_a->type_obj()->order() < $price_b->type_obj()->order() ? -1 : 1; |
|
233 | - } |
|
234 | - |
|
235 | - |
|
236 | - |
|
237 | - /** |
|
238 | - * _sort_event_prices_by_order |
|
239 | - * |
|
240 | - * @access public |
|
241 | - * @param \EE_Price $price_a |
|
242 | - * @param \EE_Price $price_b |
|
243 | - * @return bool false on fail |
|
244 | - */ |
|
245 | - public function _sort_event_prices_by_order(EE_Price $price_a, EE_Price $price_b) |
|
246 | - { |
|
247 | - if ($price_a->order() == $price_b->order()) { |
|
248 | - return 0; |
|
249 | - } |
|
250 | - return $price_a->order() < $price_b->order() ? -1 : 1; |
|
251 | - } |
|
252 | - |
|
253 | - |
|
254 | - |
|
255 | - /** |
|
256 | - * get all prices of a specific type |
|
257 | - * |
|
258 | - * @access public |
|
259 | - * @param int $type - PRT_ID |
|
260 | - * @return boolean false on fail |
|
261 | - */ |
|
262 | - public function get_all_prices_that_are_type($type = 0) |
|
263 | - { |
|
264 | - return $this->get_all(array( |
|
265 | - array( |
|
266 | - 'PRT_ID' => $type |
|
267 | - ), |
|
268 | - 'order_by' => $this->_order_by_array_for_get_all_method() |
|
269 | - )); |
|
270 | - } |
|
271 | - |
|
272 | - |
|
273 | - |
|
274 | - /** |
|
275 | - * Returns an array of the normal 'order_by' query parameter provided to the get_all query. |
|
276 | - * Of course you don't have to use it, but this is the order we usually want to sort prices by |
|
277 | - * @return array which can be used like so: $this->get_all(array(array(...where stuff...),'order_by'=>$this->_order_by_array_for_get_all_method())); |
|
278 | - */ |
|
279 | - public function _order_by_array_for_get_all_method() |
|
280 | - { |
|
281 | - return array( |
|
282 | - 'PRC_order' => 'ASC', |
|
283 | - 'Price_Type.PRT_order' => 'ASC', |
|
284 | - 'PRC_ID' => 'ASC' |
|
285 | - ); |
|
286 | - } |
|
12 | + // private instance of the EEM_Price object |
|
13 | + protected static $_instance = null; |
|
14 | + |
|
15 | + |
|
16 | + |
|
17 | + /** |
|
18 | + * private constructor to prevent direct creation |
|
19 | + * @Constructor |
|
20 | + * @access protected |
|
21 | + * @param string $timezone string representing the timezone we want to set for returned Date Time Strings (and any incoming timezone data that gets saved). Note this just sends the timezone info to the date time model field objects. Default is NULL (and will be assumed using the set timezone in the 'timezone_string' wp option) |
|
22 | + * @return EEM_Price |
|
23 | + */ |
|
24 | + protected function __construct($timezone) |
|
25 | + { |
|
26 | + require_once(EE_MODELS . 'EEM_Price_Type.model.php'); |
|
27 | + $this->singular_item = esc_html__('Price', 'event_espresso'); |
|
28 | + $this->plural_item = esc_html__('Prices', 'event_espresso'); |
|
29 | + |
|
30 | + $this->_tables = array( |
|
31 | + 'Price' => new EE_Primary_Table('esp_price', 'PRC_ID') |
|
32 | + ); |
|
33 | + $this->_fields = array( |
|
34 | + 'Price' => array( |
|
35 | + 'PRC_ID' => new EE_Primary_Key_Int_Field('PRC_ID', 'Price ID'), |
|
36 | + 'PRT_ID' => new EE_Foreign_Key_Int_Field('PRT_ID', 'Price type Id', false, null, 'Price_Type'), |
|
37 | + 'PRC_amount' => new EE_Money_Field('PRC_amount', 'Price Amount', false, 0), |
|
38 | + 'PRC_name' => new EE_Plain_Text_Field('PRC_name', 'Name of Price', false, ''), |
|
39 | + 'PRC_desc' => new EE_Post_Content_Field('PRC_desc', 'Price Description', false, ''), |
|
40 | + 'PRC_is_default' => new EE_Boolean_Field('PRC_is_default', 'Flag indicating whether price is a default price', false, false), |
|
41 | + 'PRC_overrides' => new EE_Integer_Field('PRC_overrides', 'Price ID for a global Price that will be overridden by this Price ( for replacing default prices )', true, 0), |
|
42 | + 'PRC_order' => new EE_Integer_Field('PRC_order', 'Order of Application of Price (lower numbers apply first?)', false, 1), |
|
43 | + 'PRC_deleted' => new EE_Trashed_Flag_Field('PRC_deleted', 'Flag Indicating if this has been deleted or not', false, false), |
|
44 | + 'PRC_parent' => new EE_Integer_Field('PRC_parent', esc_html__('Indicates what PRC_ID is the parent of this PRC_ID', 'event_espresso'), true, 0), |
|
45 | + 'PRC_wp_user' => new EE_WP_User_Field('PRC_wp_user', esc_html__('Price Creator ID', 'event_espresso'), false), |
|
46 | + ) |
|
47 | + ); |
|
48 | + $this->_model_relations = array( |
|
49 | + 'Ticket' => new EE_HABTM_Relation('Ticket_Price'), |
|
50 | + 'Price_Type' => new EE_Belongs_To_Relation(), |
|
51 | + 'WP_User' => new EE_Belongs_To_Relation(), |
|
52 | + ); |
|
53 | + // this model is generally available for reading |
|
54 | + $this->_cap_restriction_generators[ EEM_Base::caps_read ] = new EE_Restriction_Generator_Default_Public('PRC_is_default', 'Ticket.Datetime.Event'); |
|
55 | + // account for default tickets in the caps |
|
56 | + $this->_cap_restriction_generators[ EEM_Base::caps_read_admin ] = new EE_Restriction_Generator_Default_Protected('PRC_is_default', 'Ticket.Datetime.Event'); |
|
57 | + $this->_cap_restriction_generators[ EEM_Base::caps_edit ] = new EE_Restriction_Generator_Default_Protected('PRC_is_default', 'Ticket.Datetime.Event'); |
|
58 | + $this->_cap_restriction_generators[ EEM_Base::caps_delete ] = new EE_Restriction_Generator_Default_Protected('PRC_is_default', 'Ticket.Datetime.Event'); |
|
59 | + parent::__construct($timezone); |
|
60 | + } |
|
61 | + |
|
62 | + |
|
63 | + |
|
64 | + /** |
|
65 | + * instantiate a new price object with blank/empty properties |
|
66 | + * |
|
67 | + * @access public |
|
68 | + * @return mixed array on success, FALSE on fail |
|
69 | + */ |
|
70 | + public function get_new_price() |
|
71 | + { |
|
72 | + return $this->create_default_object(); |
|
73 | + } |
|
74 | + |
|
75 | + |
|
76 | + |
|
77 | + |
|
78 | + |
|
79 | + /** |
|
80 | + * retrieve ALL prices from db |
|
81 | + * |
|
82 | + * @access public |
|
83 | + * @return EE_PRice[] |
|
84 | + */ |
|
85 | + public function get_all_prices() |
|
86 | + { |
|
87 | + // retrieve all prices |
|
88 | + return $this->get_all(array('order_by' => array('PRC_amount' => 'ASC'))); |
|
89 | + } |
|
90 | + |
|
91 | + |
|
92 | + |
|
93 | + /** |
|
94 | + * retrieve all active prices for a particular event |
|
95 | + * |
|
96 | + * @access public |
|
97 | + * @param int $EVT_ID |
|
98 | + * @return array on success |
|
99 | + */ |
|
100 | + public function get_all_event_prices($EVT_ID = 0) |
|
101 | + { |
|
102 | + return $this->get_all(array( |
|
103 | + array( |
|
104 | + 'EVT_ID' => $EVT_ID, |
|
105 | + 'Price_Type.PBT_ID' => array('!=', EEM_Price_Type::base_type_tax) |
|
106 | + ), |
|
107 | + 'order_by' => $this->_order_by_array_for_get_all_method() |
|
108 | + )); |
|
109 | + } |
|
110 | + |
|
111 | + |
|
112 | + /** |
|
113 | + * retrieve all active global prices (that are not taxes (PBT_ID=4)) for a particular event |
|
114 | + * |
|
115 | + * @access public |
|
116 | + * @param boolean $count return count |
|
117 | + * @return array on success |
|
118 | + * @return boolean false on fail |
|
119 | + */ |
|
120 | + public function get_all_default_prices($count = false) |
|
121 | + { |
|
122 | + $_where = array( |
|
123 | + 'Price_Type.PBT_ID' => array('!=',4), |
|
124 | + 'PRC_deleted' => 0, |
|
125 | + 'PRC_is_default' => 1 |
|
126 | + ); |
|
127 | + $_query_params = array( |
|
128 | + $_where, |
|
129 | + 'order_by' => $this->_order_by_array_for_get_all_method() |
|
130 | + ); |
|
131 | + return $count ? $this->count(array($_where)) : $this->get_all($_query_params); |
|
132 | + } |
|
133 | + |
|
134 | + |
|
135 | + |
|
136 | + |
|
137 | + |
|
138 | + |
|
139 | + |
|
140 | + |
|
141 | + |
|
142 | + |
|
143 | + /** |
|
144 | + * retrieve all prices that are taxes |
|
145 | + * |
|
146 | + * @access public |
|
147 | + * @return array on success |
|
148 | + * @return array top-level keys are the price's order and their values are an array, |
|
149 | + * next-level keys are the price's ID, and their values are EE_Price objects |
|
150 | + */ |
|
151 | + public function get_all_prices_that_are_taxes() |
|
152 | + { |
|
153 | + $taxes = array(); |
|
154 | + $all_taxes = $this->get_all(array( |
|
155 | + array( 'Price_Type.PBT_ID' => EEM_Price_Type::base_type_tax ), |
|
156 | + 'order_by' => array( 'Price_Type.PRT_order' => 'ASC', 'PRC_order' => 'ASC' ) |
|
157 | + )); |
|
158 | + foreach ($all_taxes as $tax) { |
|
159 | + if ($tax instanceof EE_Price) { |
|
160 | + $taxes[ $tax->order() ][ $tax->ID() ] = $tax; |
|
161 | + } |
|
162 | + } |
|
163 | + return $taxes; |
|
164 | + } |
|
165 | + |
|
166 | + |
|
167 | + |
|
168 | + |
|
169 | + |
|
170 | + /** |
|
171 | + * retrieve all prices for an ticket plus default global prices, but not taxes |
|
172 | + * |
|
173 | + * @access public |
|
174 | + * @param int $TKT_ID the id of the event. If not included then we assume that this is a new ticket. |
|
175 | + * @return boolean false on fail |
|
176 | + */ |
|
177 | + public function get_all_ticket_prices_for_admin($TKT_ID = 0) |
|
178 | + { |
|
179 | + $array_of_price_objects = array(); |
|
180 | + if (empty($TKT_ID)) { |
|
181 | + // if there is no tkt, get prices with no tkt ID, are global, are not a tax, and are active |
|
182 | + // return that list |
|
183 | + $default_prices = $this->get_all_default_prices(); |
|
184 | + |
|
185 | + if ($default_prices) { |
|
186 | + foreach ($default_prices as $price) { |
|
187 | + if ($price instanceof EE_Price) { |
|
188 | + $array_of_price_objects[ $price->type() ][] = $price; |
|
189 | + } |
|
190 | + } |
|
191 | + return $array_of_price_objects; |
|
192 | + } else { |
|
193 | + return array(); |
|
194 | + } |
|
195 | + } else { |
|
196 | + $ticket_prices = $this->get_all(array( |
|
197 | + array( |
|
198 | + 'TKT_ID' => $TKT_ID, |
|
199 | + 'PRC_deleted' => 0 |
|
200 | + ), |
|
201 | + 'order_by' => array('PRC_order' => 'ASC') |
|
202 | + )); |
|
203 | + } |
|
204 | + |
|
205 | + if (!empty($ticket_prices)) { |
|
206 | + foreach ($ticket_prices as $price) { |
|
207 | + if ($price instanceof EE_Price) { |
|
208 | + $array_of_price_objects[ $price->type() ][] = $price; |
|
209 | + } |
|
210 | + } |
|
211 | + return $array_of_price_objects; |
|
212 | + } else { |
|
213 | + return false; |
|
214 | + } |
|
215 | + } |
|
216 | + |
|
217 | + |
|
218 | + |
|
219 | + /** |
|
220 | + * _sort_event_prices_by_type |
|
221 | + * |
|
222 | + * @access public |
|
223 | + * @param \EE_Price $price_a |
|
224 | + * @param \EE_Price $price_b |
|
225 | + * @return bool false on fail |
|
226 | + */ |
|
227 | + public function _sort_event_prices_by_type(EE_Price $price_a, EE_Price $price_b) |
|
228 | + { |
|
229 | + if ($price_a->type_obj()->order() == $price_b->type_obj()->order()) { |
|
230 | + return $this->_sort_event_prices_by_order($price_a, $price_b); |
|
231 | + } |
|
232 | + return $price_a->type_obj()->order() < $price_b->type_obj()->order() ? -1 : 1; |
|
233 | + } |
|
234 | + |
|
235 | + |
|
236 | + |
|
237 | + /** |
|
238 | + * _sort_event_prices_by_order |
|
239 | + * |
|
240 | + * @access public |
|
241 | + * @param \EE_Price $price_a |
|
242 | + * @param \EE_Price $price_b |
|
243 | + * @return bool false on fail |
|
244 | + */ |
|
245 | + public function _sort_event_prices_by_order(EE_Price $price_a, EE_Price $price_b) |
|
246 | + { |
|
247 | + if ($price_a->order() == $price_b->order()) { |
|
248 | + return 0; |
|
249 | + } |
|
250 | + return $price_a->order() < $price_b->order() ? -1 : 1; |
|
251 | + } |
|
252 | + |
|
253 | + |
|
254 | + |
|
255 | + /** |
|
256 | + * get all prices of a specific type |
|
257 | + * |
|
258 | + * @access public |
|
259 | + * @param int $type - PRT_ID |
|
260 | + * @return boolean false on fail |
|
261 | + */ |
|
262 | + public function get_all_prices_that_are_type($type = 0) |
|
263 | + { |
|
264 | + return $this->get_all(array( |
|
265 | + array( |
|
266 | + 'PRT_ID' => $type |
|
267 | + ), |
|
268 | + 'order_by' => $this->_order_by_array_for_get_all_method() |
|
269 | + )); |
|
270 | + } |
|
271 | + |
|
272 | + |
|
273 | + |
|
274 | + /** |
|
275 | + * Returns an array of the normal 'order_by' query parameter provided to the get_all query. |
|
276 | + * Of course you don't have to use it, but this is the order we usually want to sort prices by |
|
277 | + * @return array which can be used like so: $this->get_all(array(array(...where stuff...),'order_by'=>$this->_order_by_array_for_get_all_method())); |
|
278 | + */ |
|
279 | + public function _order_by_array_for_get_all_method() |
|
280 | + { |
|
281 | + return array( |
|
282 | + 'PRC_order' => 'ASC', |
|
283 | + 'Price_Type.PRT_order' => 'ASC', |
|
284 | + 'PRC_ID' => 'ASC' |
|
285 | + ); |
|
286 | + } |
|
287 | 287 | } |
@@ -143,7 +143,7 @@ discard block |
||
143 | 143 | ), |
144 | 144 | ], |
145 | 145 | ]; |
146 | - $this->_model_relations = [ |
|
146 | + $this->_model_relations = [ |
|
147 | 147 | 'Registration' => new EE_Has_Many_Relation(), |
148 | 148 | 'Payment' => new EE_Has_Many_Relation(), |
149 | 149 | 'Status' => new EE_Belongs_To_Relation(), |
@@ -211,7 +211,7 @@ discard block |
||
211 | 211 | ], |
212 | 212 | OBJECT, |
213 | 213 | [ |
214 | - 'txnDate' => ['DATE(' . $query_interval . ')', '%s'], |
|
214 | + 'txnDate' => ['DATE('.$query_interval.')', '%s'], |
|
215 | 215 | 'revenue' => ['SUM(TransactionTable.TXN_paid)', '%d'], |
216 | 216 | ] |
217 | 217 | ); |
@@ -230,17 +230,17 @@ discard block |
||
230 | 230 | public function get_revenue_per_event_report($period = '-1 month') |
231 | 231 | { |
232 | 232 | global $wpdb; |
233 | - $transaction_table = $wpdb->prefix . 'esp_transaction'; |
|
234 | - $registration_table = $wpdb->prefix . 'esp_registration'; |
|
235 | - $registration_payment_table = $wpdb->prefix . 'esp_registration_payment'; |
|
233 | + $transaction_table = $wpdb->prefix.'esp_transaction'; |
|
234 | + $registration_table = $wpdb->prefix.'esp_registration'; |
|
235 | + $registration_payment_table = $wpdb->prefix.'esp_registration_payment'; |
|
236 | 236 | $event_table = $wpdb->posts; |
237 | - $payment_table = $wpdb->prefix . 'esp_payment'; |
|
237 | + $payment_table = $wpdb->prefix.'esp_payment'; |
|
238 | 238 | $sql_date = date('Y-m-d H:i:s', strtotime($period)); |
239 | 239 | $approved_payment_status = EEM_Payment::status_id_approved; |
240 | 240 | $extra_event_on_join = ''; |
241 | 241 | // exclude events not authored by user if permissions in effect |
242 | - if (! EE_Registry::instance()->CAP->current_user_can('ee_read_others_registrations', 'reg_per_event_report')) { |
|
243 | - $extra_event_on_join = ' AND Event.post_author = ' . get_current_user_id(); |
|
242 | + if ( ! EE_Registry::instance()->CAP->current_user_can('ee_read_others_registrations', 'reg_per_event_report')) { |
|
243 | + $extra_event_on_join = ' AND Event.post_author = '.get_current_user_id(); |
|
244 | 244 | } |
245 | 245 | |
246 | 246 | return $wpdb->get_results( |
@@ -318,7 +318,7 @@ discard block |
||
318 | 318 | public function update_based_on_payments($transaction_obj_or_id, $save_txn = true) |
319 | 319 | { |
320 | 320 | EE_Error::doing_it_wrong( |
321 | - __CLASS__ . '::' . __FUNCTION__, |
|
321 | + __CLASS__.'::'.__FUNCTION__, |
|
322 | 322 | sprintf( |
323 | 323 | esc_html__('This method is deprecated. Please use "%s" instead', 'event_espresso'), |
324 | 324 | 'EE_Transaction_Processor::update_transaction_and_registrations_after_checkout_or_payment()' |
@@ -390,7 +390,7 @@ discard block |
||
390 | 390 | $time_to_leave_alone |
391 | 391 | ); |
392 | 392 | // now that we have the ids to delete |
393 | - if (! empty($txn_ids) && is_array($txn_ids)) { |
|
393 | + if ( ! empty($txn_ids) && is_array($txn_ids)) { |
|
394 | 394 | // first, make sure these TXN's are removed the "ee_locked_transactions" array |
395 | 395 | EEM_Transaction::unset_locked_transactions($txn_ids); |
396 | 396 | |
@@ -403,7 +403,7 @@ discard block |
||
403 | 403 | // let's get deleting... |
404 | 404 | // We got the ids from the original query to get them FROM |
405 | 405 | // the db (which is sanitized) so no need to prepare them again. |
406 | - $query = $wpdb->prepare("DELETE FROM " . $this->table() . " WHERE TXN_ID IN ( $format )", $txn_ids); |
|
406 | + $query = $wpdb->prepare("DELETE FROM ".$this->table()." WHERE TXN_ID IN ( $format )", $txn_ids); |
|
407 | 407 | $deleted = $wpdb->query($query); |
408 | 408 | } |
409 | 409 | if ($deleted) { |
@@ -427,8 +427,8 @@ discard block |
||
427 | 427 | $locked_transactions = get_option('ee_locked_transactions', []); |
428 | 428 | $update = false; |
429 | 429 | foreach ($transaction_IDs as $TXN_ID) { |
430 | - if (isset($locked_transactions[ $TXN_ID ])) { |
|
431 | - unset($locked_transactions[ $TXN_ID ]); |
|
430 | + if (isset($locked_transactions[$TXN_ID])) { |
|
431 | + unset($locked_transactions[$TXN_ID]); |
|
432 | 432 | $update = true; |
433 | 433 | } |
434 | 434 | } |
@@ -19,231 +19,231 @@ discard block |
||
19 | 19 | */ |
20 | 20 | class EEM_Transaction extends EEM_Base |
21 | 21 | { |
22 | - // private instance of the Transaction object |
|
23 | - protected static $_instance; |
|
24 | - |
|
25 | - /** |
|
26 | - * Status ID(STS_ID on esp_status table) to indicate the transaction is complete, |
|
27 | - * but payment is pending. This is the state for transactions where payment is promised |
|
28 | - * from an offline gateway. |
|
29 | - */ |
|
30 | - // const open_status_code = 'TPN'; |
|
31 | - |
|
32 | - /** |
|
33 | - * Status ID(STS_ID on esp_status table) to indicate the transaction failed, |
|
34 | - * either due to a technical reason (server or computer crash during registration), |
|
35 | - * or some other reason that prevent the collection of any useful contact information from any of the registrants |
|
36 | - */ |
|
37 | - const failed_status_code = 'TFL'; |
|
38 | - |
|
39 | - /** |
|
40 | - * Status ID(STS_ID on esp_status table) to indicate the transaction was abandoned, |
|
41 | - * either due to a technical reason (server or computer crash during registration), |
|
42 | - * or due to an abandoned cart after registrant chose not to complete the registration process |
|
43 | - * HOWEVER... |
|
44 | - * an abandoned TXN differs from a failed TXN in that it was able to capture contact information for at least one |
|
45 | - * registrant |
|
46 | - */ |
|
47 | - const abandoned_status_code = 'TAB'; |
|
48 | - |
|
49 | - /** |
|
50 | - * Status ID(STS_ID on esp_status table) to indicate an incomplete transaction, |
|
51 | - * meaning that monies are still owing: TXN_paid < TXN_total |
|
52 | - */ |
|
53 | - const incomplete_status_code = 'TIN'; |
|
54 | - |
|
55 | - /** |
|
56 | - * Status ID (STS_ID on esp_status table) to indicate a complete transaction. |
|
57 | - * meaning that NO monies are owing: TXN_paid == TXN_total |
|
58 | - */ |
|
59 | - const complete_status_code = 'TCM'; |
|
60 | - |
|
61 | - /** |
|
62 | - * Status ID(STS_ID on esp_status table) to indicate the transaction is overpaid. |
|
63 | - * This is the same as complete, but site admins actually owe clients the moneys! TXN_paid > TXN_total |
|
64 | - */ |
|
65 | - const overpaid_status_code = 'TOP'; |
|
66 | - |
|
67 | - |
|
68 | - /** |
|
69 | - * private constructor to prevent direct creation |
|
70 | - * |
|
71 | - * @Constructor |
|
72 | - * @access protected |
|
73 | - * |
|
74 | - * @param string $timezone string representing the timezone we want to set for returned Date Time Strings (and any |
|
75 | - * incoming timezone data that gets saved). Note this just sends the timezone info to the |
|
76 | - * date time model field objects. Default is NULL (and will be assumed using the set |
|
77 | - * timezone in the 'timezone_string' wp option) |
|
78 | - * |
|
79 | - * @throws EE_Error |
|
80 | - */ |
|
81 | - protected function __construct($timezone) |
|
82 | - { |
|
83 | - $this->singular_item = esc_html__('Transaction', 'event_espresso'); |
|
84 | - $this->plural_item = esc_html__('Transactions', 'event_espresso'); |
|
85 | - |
|
86 | - $this->_tables = [ |
|
87 | - 'TransactionTable' => new EE_Primary_Table('esp_transaction', 'TXN_ID'), |
|
88 | - ]; |
|
89 | - $this->_fields = [ |
|
90 | - 'TransactionTable' => [ |
|
91 | - 'TXN_ID' => new EE_Primary_Key_Int_Field('TXN_ID', esc_html__('Transaction ID', 'event_espresso')), |
|
92 | - 'TXN_timestamp' => new EE_Datetime_Field( |
|
93 | - 'TXN_timestamp', |
|
94 | - esc_html__('date when transaction was created', 'event_espresso'), |
|
95 | - false, |
|
96 | - EE_Datetime_Field::now, |
|
97 | - $timezone |
|
98 | - ), |
|
99 | - 'TXN_total' => new EE_Money_Field( |
|
100 | - 'TXN_total', |
|
101 | - esc_html__('Total value of Transaction', 'event_espresso'), |
|
102 | - false, |
|
103 | - 0 |
|
104 | - ), |
|
105 | - 'TXN_paid' => new EE_Money_Field( |
|
106 | - 'TXN_paid', |
|
107 | - esc_html__('Amount paid towards transaction to date', 'event_espresso'), |
|
108 | - false, |
|
109 | - 0 |
|
110 | - ), |
|
111 | - 'STS_ID' => new EE_Foreign_Key_String_Field( |
|
112 | - 'STS_ID', |
|
113 | - esc_html__('Status ID', 'event_espresso'), |
|
114 | - false, |
|
115 | - EEM_Transaction::failed_status_code, |
|
116 | - 'Status' |
|
117 | - ), |
|
118 | - 'TXN_session_data' => new EE_Serialized_Text_Field( |
|
119 | - 'TXN_session_data', |
|
120 | - esc_html__('Serialized session data', 'event_espresso'), |
|
121 | - true, |
|
122 | - '' |
|
123 | - ), |
|
124 | - 'TXN_hash_salt' => new EE_Plain_Text_Field( |
|
125 | - 'TXN_hash_salt', |
|
126 | - esc_html__('Transaction Hash Salt', 'event_espresso'), |
|
127 | - true, |
|
128 | - '' |
|
129 | - ), |
|
130 | - 'PMD_ID' => new EE_Foreign_Key_Int_Field( |
|
131 | - 'PMD_ID', |
|
132 | - esc_html__("Last Used Payment Method", 'event_espresso'), |
|
133 | - true, |
|
134 | - null, |
|
135 | - 'Payment_Method' |
|
136 | - ), |
|
137 | - 'TXN_reg_steps' => new EE_Serialized_Text_Field( |
|
138 | - 'TXN_reg_steps', |
|
139 | - esc_html__('Registration Steps', 'event_espresso'), |
|
140 | - false, |
|
141 | - [] |
|
142 | - ), |
|
143 | - ], |
|
144 | - ]; |
|
145 | - $this->_model_relations = [ |
|
146 | - 'Registration' => new EE_Has_Many_Relation(), |
|
147 | - 'Payment' => new EE_Has_Many_Relation(), |
|
148 | - 'Status' => new EE_Belongs_To_Relation(), |
|
149 | - 'Line_Item' => new EE_Has_Many_Relation(false), |
|
150 | - // you can delete a transaction without needing to delete its line items |
|
151 | - 'Payment_Method' => new EE_Belongs_To_Relation(), |
|
152 | - 'Message' => new EE_Has_Many_Relation(), |
|
153 | - ]; |
|
154 | - $this->_model_chain_to_wp_user = 'Registration.Event'; |
|
155 | - parent::__construct($timezone); |
|
156 | - } |
|
157 | - |
|
158 | - |
|
159 | - /** |
|
160 | - * txn_status_array |
|
161 | - * get list of transaction statuses |
|
162 | - * |
|
163 | - * @access public |
|
164 | - * @return array |
|
165 | - */ |
|
166 | - public static function txn_status_array() |
|
167 | - { |
|
168 | - return apply_filters( |
|
169 | - 'FHEE__EEM_Transaction__txn_status_array', |
|
170 | - [ |
|
171 | - EEM_Transaction::overpaid_status_code, |
|
172 | - EEM_Transaction::complete_status_code, |
|
173 | - EEM_Transaction::incomplete_status_code, |
|
174 | - EEM_Transaction::abandoned_status_code, |
|
175 | - EEM_Transaction::failed_status_code, |
|
176 | - ] |
|
177 | - ); |
|
178 | - } |
|
179 | - |
|
180 | - |
|
181 | - /** |
|
182 | - * get the revenue per day for the Transaction Admin page Reports Tab |
|
183 | - * |
|
184 | - * @access public |
|
185 | - * |
|
186 | - * @param string $period |
|
187 | - * |
|
188 | - * @return stdClass[] |
|
189 | - * @throws EE_Error |
|
190 | - * @throws EE_Error |
|
191 | - */ |
|
192 | - public function get_revenue_per_day_report($period = '-1 month') |
|
193 | - { |
|
194 | - $sql_date = $this->convert_datetime_for_query( |
|
195 | - 'TXN_timestamp', |
|
196 | - date('Y-m-d H:i:s', strtotime($period)), |
|
197 | - 'Y-m-d H:i:s', |
|
198 | - 'UTC' |
|
199 | - ); |
|
200 | - |
|
201 | - $query_interval = EEH_DTT_Helper::get_sql_query_interval_for_offset($this->get_timezone(), 'TXN_timestamp'); |
|
202 | - |
|
203 | - return $this->_get_all_wpdb_results( |
|
204 | - [ |
|
205 | - [ |
|
206 | - 'TXN_timestamp' => ['>=', $sql_date], |
|
207 | - ], |
|
208 | - 'group_by' => 'txnDate', |
|
209 | - 'order_by' => ['TXN_timestamp' => 'ASC'], |
|
210 | - ], |
|
211 | - OBJECT, |
|
212 | - [ |
|
213 | - 'txnDate' => ['DATE(' . $query_interval . ')', '%s'], |
|
214 | - 'revenue' => ['SUM(TransactionTable.TXN_paid)', '%d'], |
|
215 | - ] |
|
216 | - ); |
|
217 | - } |
|
218 | - |
|
219 | - |
|
220 | - /** |
|
221 | - * get the revenue per event for the Transaction Admin page Reports Tab |
|
222 | - * |
|
223 | - * @access public |
|
224 | - * |
|
225 | - * @param string $period |
|
226 | - * |
|
227 | - * @return EE_Transaction[] |
|
228 | - */ |
|
229 | - public function get_revenue_per_event_report($period = '-1 month') |
|
230 | - { |
|
231 | - global $wpdb; |
|
232 | - $transaction_table = $wpdb->prefix . 'esp_transaction'; |
|
233 | - $registration_table = $wpdb->prefix . 'esp_registration'; |
|
234 | - $registration_payment_table = $wpdb->prefix . 'esp_registration_payment'; |
|
235 | - $event_table = $wpdb->posts; |
|
236 | - $payment_table = $wpdb->prefix . 'esp_payment'; |
|
237 | - $sql_date = date('Y-m-d H:i:s', strtotime($period)); |
|
238 | - $approved_payment_status = EEM_Payment::status_id_approved; |
|
239 | - $extra_event_on_join = ''; |
|
240 | - // exclude events not authored by user if permissions in effect |
|
241 | - if (! EE_Registry::instance()->CAP->current_user_can('ee_read_others_registrations', 'reg_per_event_report')) { |
|
242 | - $extra_event_on_join = ' AND Event.post_author = ' . get_current_user_id(); |
|
243 | - } |
|
244 | - |
|
245 | - return $wpdb->get_results( |
|
246 | - "SELECT |
|
22 | + // private instance of the Transaction object |
|
23 | + protected static $_instance; |
|
24 | + |
|
25 | + /** |
|
26 | + * Status ID(STS_ID on esp_status table) to indicate the transaction is complete, |
|
27 | + * but payment is pending. This is the state for transactions where payment is promised |
|
28 | + * from an offline gateway. |
|
29 | + */ |
|
30 | + // const open_status_code = 'TPN'; |
|
31 | + |
|
32 | + /** |
|
33 | + * Status ID(STS_ID on esp_status table) to indicate the transaction failed, |
|
34 | + * either due to a technical reason (server or computer crash during registration), |
|
35 | + * or some other reason that prevent the collection of any useful contact information from any of the registrants |
|
36 | + */ |
|
37 | + const failed_status_code = 'TFL'; |
|
38 | + |
|
39 | + /** |
|
40 | + * Status ID(STS_ID on esp_status table) to indicate the transaction was abandoned, |
|
41 | + * either due to a technical reason (server or computer crash during registration), |
|
42 | + * or due to an abandoned cart after registrant chose not to complete the registration process |
|
43 | + * HOWEVER... |
|
44 | + * an abandoned TXN differs from a failed TXN in that it was able to capture contact information for at least one |
|
45 | + * registrant |
|
46 | + */ |
|
47 | + const abandoned_status_code = 'TAB'; |
|
48 | + |
|
49 | + /** |
|
50 | + * Status ID(STS_ID on esp_status table) to indicate an incomplete transaction, |
|
51 | + * meaning that monies are still owing: TXN_paid < TXN_total |
|
52 | + */ |
|
53 | + const incomplete_status_code = 'TIN'; |
|
54 | + |
|
55 | + /** |
|
56 | + * Status ID (STS_ID on esp_status table) to indicate a complete transaction. |
|
57 | + * meaning that NO monies are owing: TXN_paid == TXN_total |
|
58 | + */ |
|
59 | + const complete_status_code = 'TCM'; |
|
60 | + |
|
61 | + /** |
|
62 | + * Status ID(STS_ID on esp_status table) to indicate the transaction is overpaid. |
|
63 | + * This is the same as complete, but site admins actually owe clients the moneys! TXN_paid > TXN_total |
|
64 | + */ |
|
65 | + const overpaid_status_code = 'TOP'; |
|
66 | + |
|
67 | + |
|
68 | + /** |
|
69 | + * private constructor to prevent direct creation |
|
70 | + * |
|
71 | + * @Constructor |
|
72 | + * @access protected |
|
73 | + * |
|
74 | + * @param string $timezone string representing the timezone we want to set for returned Date Time Strings (and any |
|
75 | + * incoming timezone data that gets saved). Note this just sends the timezone info to the |
|
76 | + * date time model field objects. Default is NULL (and will be assumed using the set |
|
77 | + * timezone in the 'timezone_string' wp option) |
|
78 | + * |
|
79 | + * @throws EE_Error |
|
80 | + */ |
|
81 | + protected function __construct($timezone) |
|
82 | + { |
|
83 | + $this->singular_item = esc_html__('Transaction', 'event_espresso'); |
|
84 | + $this->plural_item = esc_html__('Transactions', 'event_espresso'); |
|
85 | + |
|
86 | + $this->_tables = [ |
|
87 | + 'TransactionTable' => new EE_Primary_Table('esp_transaction', 'TXN_ID'), |
|
88 | + ]; |
|
89 | + $this->_fields = [ |
|
90 | + 'TransactionTable' => [ |
|
91 | + 'TXN_ID' => new EE_Primary_Key_Int_Field('TXN_ID', esc_html__('Transaction ID', 'event_espresso')), |
|
92 | + 'TXN_timestamp' => new EE_Datetime_Field( |
|
93 | + 'TXN_timestamp', |
|
94 | + esc_html__('date when transaction was created', 'event_espresso'), |
|
95 | + false, |
|
96 | + EE_Datetime_Field::now, |
|
97 | + $timezone |
|
98 | + ), |
|
99 | + 'TXN_total' => new EE_Money_Field( |
|
100 | + 'TXN_total', |
|
101 | + esc_html__('Total value of Transaction', 'event_espresso'), |
|
102 | + false, |
|
103 | + 0 |
|
104 | + ), |
|
105 | + 'TXN_paid' => new EE_Money_Field( |
|
106 | + 'TXN_paid', |
|
107 | + esc_html__('Amount paid towards transaction to date', 'event_espresso'), |
|
108 | + false, |
|
109 | + 0 |
|
110 | + ), |
|
111 | + 'STS_ID' => new EE_Foreign_Key_String_Field( |
|
112 | + 'STS_ID', |
|
113 | + esc_html__('Status ID', 'event_espresso'), |
|
114 | + false, |
|
115 | + EEM_Transaction::failed_status_code, |
|
116 | + 'Status' |
|
117 | + ), |
|
118 | + 'TXN_session_data' => new EE_Serialized_Text_Field( |
|
119 | + 'TXN_session_data', |
|
120 | + esc_html__('Serialized session data', 'event_espresso'), |
|
121 | + true, |
|
122 | + '' |
|
123 | + ), |
|
124 | + 'TXN_hash_salt' => new EE_Plain_Text_Field( |
|
125 | + 'TXN_hash_salt', |
|
126 | + esc_html__('Transaction Hash Salt', 'event_espresso'), |
|
127 | + true, |
|
128 | + '' |
|
129 | + ), |
|
130 | + 'PMD_ID' => new EE_Foreign_Key_Int_Field( |
|
131 | + 'PMD_ID', |
|
132 | + esc_html__("Last Used Payment Method", 'event_espresso'), |
|
133 | + true, |
|
134 | + null, |
|
135 | + 'Payment_Method' |
|
136 | + ), |
|
137 | + 'TXN_reg_steps' => new EE_Serialized_Text_Field( |
|
138 | + 'TXN_reg_steps', |
|
139 | + esc_html__('Registration Steps', 'event_espresso'), |
|
140 | + false, |
|
141 | + [] |
|
142 | + ), |
|
143 | + ], |
|
144 | + ]; |
|
145 | + $this->_model_relations = [ |
|
146 | + 'Registration' => new EE_Has_Many_Relation(), |
|
147 | + 'Payment' => new EE_Has_Many_Relation(), |
|
148 | + 'Status' => new EE_Belongs_To_Relation(), |
|
149 | + 'Line_Item' => new EE_Has_Many_Relation(false), |
|
150 | + // you can delete a transaction without needing to delete its line items |
|
151 | + 'Payment_Method' => new EE_Belongs_To_Relation(), |
|
152 | + 'Message' => new EE_Has_Many_Relation(), |
|
153 | + ]; |
|
154 | + $this->_model_chain_to_wp_user = 'Registration.Event'; |
|
155 | + parent::__construct($timezone); |
|
156 | + } |
|
157 | + |
|
158 | + |
|
159 | + /** |
|
160 | + * txn_status_array |
|
161 | + * get list of transaction statuses |
|
162 | + * |
|
163 | + * @access public |
|
164 | + * @return array |
|
165 | + */ |
|
166 | + public static function txn_status_array() |
|
167 | + { |
|
168 | + return apply_filters( |
|
169 | + 'FHEE__EEM_Transaction__txn_status_array', |
|
170 | + [ |
|
171 | + EEM_Transaction::overpaid_status_code, |
|
172 | + EEM_Transaction::complete_status_code, |
|
173 | + EEM_Transaction::incomplete_status_code, |
|
174 | + EEM_Transaction::abandoned_status_code, |
|
175 | + EEM_Transaction::failed_status_code, |
|
176 | + ] |
|
177 | + ); |
|
178 | + } |
|
179 | + |
|
180 | + |
|
181 | + /** |
|
182 | + * get the revenue per day for the Transaction Admin page Reports Tab |
|
183 | + * |
|
184 | + * @access public |
|
185 | + * |
|
186 | + * @param string $period |
|
187 | + * |
|
188 | + * @return stdClass[] |
|
189 | + * @throws EE_Error |
|
190 | + * @throws EE_Error |
|
191 | + */ |
|
192 | + public function get_revenue_per_day_report($period = '-1 month') |
|
193 | + { |
|
194 | + $sql_date = $this->convert_datetime_for_query( |
|
195 | + 'TXN_timestamp', |
|
196 | + date('Y-m-d H:i:s', strtotime($period)), |
|
197 | + 'Y-m-d H:i:s', |
|
198 | + 'UTC' |
|
199 | + ); |
|
200 | + |
|
201 | + $query_interval = EEH_DTT_Helper::get_sql_query_interval_for_offset($this->get_timezone(), 'TXN_timestamp'); |
|
202 | + |
|
203 | + return $this->_get_all_wpdb_results( |
|
204 | + [ |
|
205 | + [ |
|
206 | + 'TXN_timestamp' => ['>=', $sql_date], |
|
207 | + ], |
|
208 | + 'group_by' => 'txnDate', |
|
209 | + 'order_by' => ['TXN_timestamp' => 'ASC'], |
|
210 | + ], |
|
211 | + OBJECT, |
|
212 | + [ |
|
213 | + 'txnDate' => ['DATE(' . $query_interval . ')', '%s'], |
|
214 | + 'revenue' => ['SUM(TransactionTable.TXN_paid)', '%d'], |
|
215 | + ] |
|
216 | + ); |
|
217 | + } |
|
218 | + |
|
219 | + |
|
220 | + /** |
|
221 | + * get the revenue per event for the Transaction Admin page Reports Tab |
|
222 | + * |
|
223 | + * @access public |
|
224 | + * |
|
225 | + * @param string $period |
|
226 | + * |
|
227 | + * @return EE_Transaction[] |
|
228 | + */ |
|
229 | + public function get_revenue_per_event_report($period = '-1 month') |
|
230 | + { |
|
231 | + global $wpdb; |
|
232 | + $transaction_table = $wpdb->prefix . 'esp_transaction'; |
|
233 | + $registration_table = $wpdb->prefix . 'esp_registration'; |
|
234 | + $registration_payment_table = $wpdb->prefix . 'esp_registration_payment'; |
|
235 | + $event_table = $wpdb->posts; |
|
236 | + $payment_table = $wpdb->prefix . 'esp_payment'; |
|
237 | + $sql_date = date('Y-m-d H:i:s', strtotime($period)); |
|
238 | + $approved_payment_status = EEM_Payment::status_id_approved; |
|
239 | + $extra_event_on_join = ''; |
|
240 | + // exclude events not authored by user if permissions in effect |
|
241 | + if (! EE_Registry::instance()->CAP->current_user_can('ee_read_others_registrations', 'reg_per_event_report')) { |
|
242 | + $extra_event_on_join = ' AND Event.post_author = ' . get_current_user_id(); |
|
243 | + } |
|
244 | + |
|
245 | + return $wpdb->get_results( |
|
246 | + "SELECT |
|
247 | 247 | Transaction_Event.event_name AS event_name, |
248 | 248 | SUM(Transaction_Event.paid) AS revenue |
249 | 249 | FROM |
@@ -271,236 +271,236 @@ discard block |
||
271 | 271 | $extra_event_on_join |
272 | 272 | ) AS Transaction_Event |
273 | 273 | GROUP BY event_name" |
274 | - ); |
|
275 | - } |
|
276 | - |
|
277 | - |
|
278 | - /** |
|
279 | - * Gets the current transaction given the reg_url_link, or assumes the reg_url_link is in the |
|
280 | - * request global variable. Either way, tries to find the current transaction (through |
|
281 | - * the registration pointed to by reg_url_link), if not returns null |
|
282 | - * |
|
283 | - * @param string $reg_url_link |
|
284 | - * |
|
285 | - * @return EE_Transaction |
|
286 | - * @throws EE_Error |
|
287 | - */ |
|
288 | - public function get_transaction_from_reg_url_link($reg_url_link = '') |
|
289 | - { |
|
290 | - if (empty($reg_url_link)) { |
|
291 | - $request = LoaderFactory::getLoader()->getShared(RequestInterface::class); |
|
292 | - $reg_url_link = $request->getRequestParam('e_reg_url_link'); |
|
293 | - } |
|
294 | - return $this->get_one( |
|
295 | - [ |
|
296 | - [ |
|
297 | - 'Registration.REG_url_link' => $reg_url_link, |
|
298 | - ], |
|
299 | - ] |
|
300 | - ); |
|
301 | - } |
|
302 | - |
|
303 | - |
|
304 | - /** |
|
305 | - * Updates the provided EE_Transaction with all the applicable payments |
|
306 | - * (or fetch the EE_Transaction from its ID) |
|
307 | - * |
|
308 | - * @param EE_Transaction|int $transaction_obj_or_id |
|
309 | - * @param boolean $save_txn whether or not to save the transaction during this function call |
|
310 | - * |
|
311 | - * @return array |
|
312 | - * @throws EE_Error |
|
313 | - * @throws ReflectionException |
|
314 | - * @deprecated |
|
315 | - * |
|
316 | - */ |
|
317 | - public function update_based_on_payments($transaction_obj_or_id, $save_txn = true) |
|
318 | - { |
|
319 | - EE_Error::doing_it_wrong( |
|
320 | - __CLASS__ . '::' . __FUNCTION__, |
|
321 | - sprintf( |
|
322 | - esc_html__('This method is deprecated. Please use "%s" instead', 'event_espresso'), |
|
323 | - 'EE_Transaction_Processor::update_transaction_and_registrations_after_checkout_or_payment()' |
|
324 | - ), |
|
325 | - '4.6.0' |
|
326 | - ); |
|
327 | - /** @type EE_Transaction_Processor $transaction_processor */ |
|
328 | - $transaction_processor = EE_Registry::instance()->load_class('Transaction_Processor'); |
|
329 | - |
|
330 | - return $transaction_processor->update_transaction_and_registrations_after_checkout_or_payment( |
|
331 | - $this->ensure_is_obj($transaction_obj_or_id) |
|
332 | - ); |
|
333 | - } |
|
334 | - |
|
335 | - |
|
336 | - /** |
|
337 | - * Deletes "junk" transactions that were probably added by bots. There might be TONS |
|
338 | - * of these, so we are very careful to NOT select (which the models do even when deleting), |
|
339 | - * and so we only use wpdb directly and only do minimal joins. |
|
340 | - * Transactions are considered "junk" if they're failed for longer than a week. |
|
341 | - * Also, there is an extra check for payments related to the transaction, because if a transaction has a payment on |
|
342 | - * it, it's probably not junk (regardless of what status it has). |
|
343 | - * The downside to this approach is that is addons are listening for object deletions |
|
344 | - * on EEM_Base::delete() they won't be notified of this. However, there is an action that plugins can hook into |
|
345 | - * to catch these types of deletions. |
|
346 | - * |
|
347 | - * @return int |
|
348 | - * @throws EE_Error |
|
349 | - * @throws EE_Error |
|
350 | - * @global WPDB $wpdb |
|
351 | - */ |
|
352 | - public function delete_junk_transactions() |
|
353 | - { |
|
354 | - global $wpdb; |
|
355 | - $deleted = false; |
|
356 | - $time_to_leave_alone = (int) apply_filters( |
|
357 | - 'FHEE__EEM_Transaction__delete_junk_transactions__time_to_leave_alone', |
|
358 | - WEEK_IN_SECONDS |
|
359 | - ); |
|
360 | - |
|
361 | - |
|
362 | - /** |
|
363 | - * This allows code to filter the query arguments used for retrieving the transaction IDs to delete. |
|
364 | - * Useful for plugins that want to exclude transactions matching certain query parameters. |
|
365 | - * The query parameters should be in the format accepted by the EEM_Base model queries. |
|
366 | - */ |
|
367 | - $ids_query = apply_filters( |
|
368 | - 'FHEE__EEM_Transaction__delete_junk_transactions__initial_query_args', |
|
369 | - [ |
|
370 | - 0 => [ |
|
371 | - 'STS_ID' => EEM_Transaction::failed_status_code, |
|
372 | - 'Payment.PAY_ID' => ['IS NULL'], |
|
373 | - 'TXN_timestamp' => ['<', time() - $time_to_leave_alone], |
|
374 | - ], |
|
375 | - 'order_by' => ['TXN_timestamp' => 'ASC'], |
|
376 | - 'limit' => 1000, |
|
377 | - ], |
|
378 | - $time_to_leave_alone |
|
379 | - ); |
|
380 | - |
|
381 | - |
|
382 | - /** |
|
383 | - * This filter is for when code needs to filter the list of transaction ids that represent transactions |
|
384 | - * about to be deleted based on some other criteria that isn't easily done via the query args filter. |
|
385 | - */ |
|
386 | - $txn_ids = apply_filters( |
|
387 | - 'FHEE__EEM_Transaction__delete_junk_transactions__transaction_ids_to_delete', |
|
388 | - EEM_Transaction::instance()->get_col($ids_query, 'TXN_ID'), |
|
389 | - $time_to_leave_alone |
|
390 | - ); |
|
391 | - // now that we have the ids to delete |
|
392 | - if (! empty($txn_ids) && is_array($txn_ids)) { |
|
393 | - // first, make sure these TXN's are removed the "ee_locked_transactions" array |
|
394 | - EEM_Transaction::unset_locked_transactions($txn_ids); |
|
395 | - |
|
396 | - // Create IDs placeholder. |
|
397 | - $placeholders = array_fill(0, count($txn_ids), '%d'); |
|
398 | - |
|
399 | - // Glue it together to use inside $wpdb->prepare. |
|
400 | - $format = implode(', ', $placeholders); |
|
401 | - |
|
402 | - // let's get deleting... |
|
403 | - // We got the ids from the original query to get them FROM |
|
404 | - // the db (which is sanitized) so no need to prepare them again. |
|
405 | - $query = $wpdb->prepare("DELETE FROM " . $this->table() . " WHERE TXN_ID IN ( $format )", $txn_ids); |
|
406 | - $deleted = $wpdb->query($query); |
|
407 | - } |
|
408 | - if ($deleted) { |
|
409 | - /** |
|
410 | - * Allows code to do something after the transactions have been deleted. |
|
411 | - */ |
|
412 | - do_action('AHEE__EEM_Transaction__delete_junk_transactions__successful_deletion', $txn_ids); |
|
413 | - } |
|
414 | - |
|
415 | - return $deleted; |
|
416 | - } |
|
417 | - |
|
418 | - |
|
419 | - /** |
|
420 | - * @param array $transaction_IDs |
|
421 | - * |
|
422 | - * @return bool |
|
423 | - */ |
|
424 | - public static function unset_locked_transactions(array $transaction_IDs) |
|
425 | - { |
|
426 | - $locked_transactions = get_option('ee_locked_transactions', []); |
|
427 | - $update = false; |
|
428 | - foreach ($transaction_IDs as $TXN_ID) { |
|
429 | - if (isset($locked_transactions[ $TXN_ID ])) { |
|
430 | - unset($locked_transactions[ $TXN_ID ]); |
|
431 | - $update = true; |
|
432 | - } |
|
433 | - } |
|
434 | - if ($update) { |
|
435 | - update_option('ee_locked_transactions', $locked_transactions); |
|
436 | - } |
|
437 | - |
|
438 | - return $update; |
|
439 | - } |
|
440 | - |
|
441 | - |
|
442 | - /** |
|
443 | - * returns an array of EE_Transaction objects whose timestamp is greater than |
|
444 | - * the current time minus the session lifespan, which defaults to 60 minutes |
|
445 | - * |
|
446 | - * @return EE_Base_Class[]|EE_Transaction[] |
|
447 | - * @throws EE_Error |
|
448 | - * @throws InvalidArgumentException |
|
449 | - * @throws InvalidDataTypeException |
|
450 | - * @throws InvalidInterfaceException |
|
451 | - */ |
|
452 | - public function get_transactions_in_progress() |
|
453 | - { |
|
454 | - return $this->_get_transactions_in_progress(); |
|
455 | - } |
|
456 | - |
|
457 | - |
|
458 | - /** |
|
459 | - * returns an array of EE_Transaction objects whose timestamp is less than |
|
460 | - * the current time minus the session lifespan, which defaults to 60 minutes |
|
461 | - * |
|
462 | - * @return EE_Base_Class[]|EE_Transaction[] |
|
463 | - * @throws EE_Error |
|
464 | - * @throws InvalidArgumentException |
|
465 | - * @throws InvalidDataTypeException |
|
466 | - * @throws InvalidInterfaceException |
|
467 | - */ |
|
468 | - public function get_transactions_not_in_progress() |
|
469 | - { |
|
470 | - return $this->_get_transactions_in_progress('<='); |
|
471 | - } |
|
472 | - |
|
473 | - |
|
474 | - /** |
|
475 | - * @param string $comparison |
|
476 | - * @return EE_Transaction[] |
|
477 | - * @throws EE_Error |
|
478 | - * @throws InvalidArgumentException |
|
479 | - * @throws InvalidDataTypeException |
|
480 | - * @throws InvalidInterfaceException |
|
481 | - */ |
|
482 | - private function _get_transactions_in_progress($comparison = '>=') |
|
483 | - { |
|
484 | - $comparison = $comparison === '>=' || $comparison === '<=' |
|
485 | - ? $comparison |
|
486 | - : '>='; |
|
487 | - /** @var EventEspresso\core\domain\values\session\SessionLifespan $session_lifespan */ |
|
488 | - $session_lifespan = LoaderFactory::getLoader()->getShared( |
|
489 | - 'EventEspresso\core\domain\values\session\SessionLifespan' |
|
490 | - ); |
|
491 | - return $this->get_all( |
|
492 | - [ |
|
493 | - [ |
|
494 | - 'TXN_timestamp' => [ |
|
495 | - $comparison, |
|
496 | - $session_lifespan->expiration(), |
|
497 | - ], |
|
498 | - 'STS_ID' => [ |
|
499 | - '!=', |
|
500 | - EEM_Transaction::complete_status_code, |
|
501 | - ], |
|
502 | - ], |
|
503 | - ] |
|
504 | - ); |
|
505 | - } |
|
274 | + ); |
|
275 | + } |
|
276 | + |
|
277 | + |
|
278 | + /** |
|
279 | + * Gets the current transaction given the reg_url_link, or assumes the reg_url_link is in the |
|
280 | + * request global variable. Either way, tries to find the current transaction (through |
|
281 | + * the registration pointed to by reg_url_link), if not returns null |
|
282 | + * |
|
283 | + * @param string $reg_url_link |
|
284 | + * |
|
285 | + * @return EE_Transaction |
|
286 | + * @throws EE_Error |
|
287 | + */ |
|
288 | + public function get_transaction_from_reg_url_link($reg_url_link = '') |
|
289 | + { |
|
290 | + if (empty($reg_url_link)) { |
|
291 | + $request = LoaderFactory::getLoader()->getShared(RequestInterface::class); |
|
292 | + $reg_url_link = $request->getRequestParam('e_reg_url_link'); |
|
293 | + } |
|
294 | + return $this->get_one( |
|
295 | + [ |
|
296 | + [ |
|
297 | + 'Registration.REG_url_link' => $reg_url_link, |
|
298 | + ], |
|
299 | + ] |
|
300 | + ); |
|
301 | + } |
|
302 | + |
|
303 | + |
|
304 | + /** |
|
305 | + * Updates the provided EE_Transaction with all the applicable payments |
|
306 | + * (or fetch the EE_Transaction from its ID) |
|
307 | + * |
|
308 | + * @param EE_Transaction|int $transaction_obj_or_id |
|
309 | + * @param boolean $save_txn whether or not to save the transaction during this function call |
|
310 | + * |
|
311 | + * @return array |
|
312 | + * @throws EE_Error |
|
313 | + * @throws ReflectionException |
|
314 | + * @deprecated |
|
315 | + * |
|
316 | + */ |
|
317 | + public function update_based_on_payments($transaction_obj_or_id, $save_txn = true) |
|
318 | + { |
|
319 | + EE_Error::doing_it_wrong( |
|
320 | + __CLASS__ . '::' . __FUNCTION__, |
|
321 | + sprintf( |
|
322 | + esc_html__('This method is deprecated. Please use "%s" instead', 'event_espresso'), |
|
323 | + 'EE_Transaction_Processor::update_transaction_and_registrations_after_checkout_or_payment()' |
|
324 | + ), |
|
325 | + '4.6.0' |
|
326 | + ); |
|
327 | + /** @type EE_Transaction_Processor $transaction_processor */ |
|
328 | + $transaction_processor = EE_Registry::instance()->load_class('Transaction_Processor'); |
|
329 | + |
|
330 | + return $transaction_processor->update_transaction_and_registrations_after_checkout_or_payment( |
|
331 | + $this->ensure_is_obj($transaction_obj_or_id) |
|
332 | + ); |
|
333 | + } |
|
334 | + |
|
335 | + |
|
336 | + /** |
|
337 | + * Deletes "junk" transactions that were probably added by bots. There might be TONS |
|
338 | + * of these, so we are very careful to NOT select (which the models do even when deleting), |
|
339 | + * and so we only use wpdb directly and only do minimal joins. |
|
340 | + * Transactions are considered "junk" if they're failed for longer than a week. |
|
341 | + * Also, there is an extra check for payments related to the transaction, because if a transaction has a payment on |
|
342 | + * it, it's probably not junk (regardless of what status it has). |
|
343 | + * The downside to this approach is that is addons are listening for object deletions |
|
344 | + * on EEM_Base::delete() they won't be notified of this. However, there is an action that plugins can hook into |
|
345 | + * to catch these types of deletions. |
|
346 | + * |
|
347 | + * @return int |
|
348 | + * @throws EE_Error |
|
349 | + * @throws EE_Error |
|
350 | + * @global WPDB $wpdb |
|
351 | + */ |
|
352 | + public function delete_junk_transactions() |
|
353 | + { |
|
354 | + global $wpdb; |
|
355 | + $deleted = false; |
|
356 | + $time_to_leave_alone = (int) apply_filters( |
|
357 | + 'FHEE__EEM_Transaction__delete_junk_transactions__time_to_leave_alone', |
|
358 | + WEEK_IN_SECONDS |
|
359 | + ); |
|
360 | + |
|
361 | + |
|
362 | + /** |
|
363 | + * This allows code to filter the query arguments used for retrieving the transaction IDs to delete. |
|
364 | + * Useful for plugins that want to exclude transactions matching certain query parameters. |
|
365 | + * The query parameters should be in the format accepted by the EEM_Base model queries. |
|
366 | + */ |
|
367 | + $ids_query = apply_filters( |
|
368 | + 'FHEE__EEM_Transaction__delete_junk_transactions__initial_query_args', |
|
369 | + [ |
|
370 | + 0 => [ |
|
371 | + 'STS_ID' => EEM_Transaction::failed_status_code, |
|
372 | + 'Payment.PAY_ID' => ['IS NULL'], |
|
373 | + 'TXN_timestamp' => ['<', time() - $time_to_leave_alone], |
|
374 | + ], |
|
375 | + 'order_by' => ['TXN_timestamp' => 'ASC'], |
|
376 | + 'limit' => 1000, |
|
377 | + ], |
|
378 | + $time_to_leave_alone |
|
379 | + ); |
|
380 | + |
|
381 | + |
|
382 | + /** |
|
383 | + * This filter is for when code needs to filter the list of transaction ids that represent transactions |
|
384 | + * about to be deleted based on some other criteria that isn't easily done via the query args filter. |
|
385 | + */ |
|
386 | + $txn_ids = apply_filters( |
|
387 | + 'FHEE__EEM_Transaction__delete_junk_transactions__transaction_ids_to_delete', |
|
388 | + EEM_Transaction::instance()->get_col($ids_query, 'TXN_ID'), |
|
389 | + $time_to_leave_alone |
|
390 | + ); |
|
391 | + // now that we have the ids to delete |
|
392 | + if (! empty($txn_ids) && is_array($txn_ids)) { |
|
393 | + // first, make sure these TXN's are removed the "ee_locked_transactions" array |
|
394 | + EEM_Transaction::unset_locked_transactions($txn_ids); |
|
395 | + |
|
396 | + // Create IDs placeholder. |
|
397 | + $placeholders = array_fill(0, count($txn_ids), '%d'); |
|
398 | + |
|
399 | + // Glue it together to use inside $wpdb->prepare. |
|
400 | + $format = implode(', ', $placeholders); |
|
401 | + |
|
402 | + // let's get deleting... |
|
403 | + // We got the ids from the original query to get them FROM |
|
404 | + // the db (which is sanitized) so no need to prepare them again. |
|
405 | + $query = $wpdb->prepare("DELETE FROM " . $this->table() . " WHERE TXN_ID IN ( $format )", $txn_ids); |
|
406 | + $deleted = $wpdb->query($query); |
|
407 | + } |
|
408 | + if ($deleted) { |
|
409 | + /** |
|
410 | + * Allows code to do something after the transactions have been deleted. |
|
411 | + */ |
|
412 | + do_action('AHEE__EEM_Transaction__delete_junk_transactions__successful_deletion', $txn_ids); |
|
413 | + } |
|
414 | + |
|
415 | + return $deleted; |
|
416 | + } |
|
417 | + |
|
418 | + |
|
419 | + /** |
|
420 | + * @param array $transaction_IDs |
|
421 | + * |
|
422 | + * @return bool |
|
423 | + */ |
|
424 | + public static function unset_locked_transactions(array $transaction_IDs) |
|
425 | + { |
|
426 | + $locked_transactions = get_option('ee_locked_transactions', []); |
|
427 | + $update = false; |
|
428 | + foreach ($transaction_IDs as $TXN_ID) { |
|
429 | + if (isset($locked_transactions[ $TXN_ID ])) { |
|
430 | + unset($locked_transactions[ $TXN_ID ]); |
|
431 | + $update = true; |
|
432 | + } |
|
433 | + } |
|
434 | + if ($update) { |
|
435 | + update_option('ee_locked_transactions', $locked_transactions); |
|
436 | + } |
|
437 | + |
|
438 | + return $update; |
|
439 | + } |
|
440 | + |
|
441 | + |
|
442 | + /** |
|
443 | + * returns an array of EE_Transaction objects whose timestamp is greater than |
|
444 | + * the current time minus the session lifespan, which defaults to 60 minutes |
|
445 | + * |
|
446 | + * @return EE_Base_Class[]|EE_Transaction[] |
|
447 | + * @throws EE_Error |
|
448 | + * @throws InvalidArgumentException |
|
449 | + * @throws InvalidDataTypeException |
|
450 | + * @throws InvalidInterfaceException |
|
451 | + */ |
|
452 | + public function get_transactions_in_progress() |
|
453 | + { |
|
454 | + return $this->_get_transactions_in_progress(); |
|
455 | + } |
|
456 | + |
|
457 | + |
|
458 | + /** |
|
459 | + * returns an array of EE_Transaction objects whose timestamp is less than |
|
460 | + * the current time minus the session lifespan, which defaults to 60 minutes |
|
461 | + * |
|
462 | + * @return EE_Base_Class[]|EE_Transaction[] |
|
463 | + * @throws EE_Error |
|
464 | + * @throws InvalidArgumentException |
|
465 | + * @throws InvalidDataTypeException |
|
466 | + * @throws InvalidInterfaceException |
|
467 | + */ |
|
468 | + public function get_transactions_not_in_progress() |
|
469 | + { |
|
470 | + return $this->_get_transactions_in_progress('<='); |
|
471 | + } |
|
472 | + |
|
473 | + |
|
474 | + /** |
|
475 | + * @param string $comparison |
|
476 | + * @return EE_Transaction[] |
|
477 | + * @throws EE_Error |
|
478 | + * @throws InvalidArgumentException |
|
479 | + * @throws InvalidDataTypeException |
|
480 | + * @throws InvalidInterfaceException |
|
481 | + */ |
|
482 | + private function _get_transactions_in_progress($comparison = '>=') |
|
483 | + { |
|
484 | + $comparison = $comparison === '>=' || $comparison === '<=' |
|
485 | + ? $comparison |
|
486 | + : '>='; |
|
487 | + /** @var EventEspresso\core\domain\values\session\SessionLifespan $session_lifespan */ |
|
488 | + $session_lifespan = LoaderFactory::getLoader()->getShared( |
|
489 | + 'EventEspresso\core\domain\values\session\SessionLifespan' |
|
490 | + ); |
|
491 | + return $this->get_all( |
|
492 | + [ |
|
493 | + [ |
|
494 | + 'TXN_timestamp' => [ |
|
495 | + $comparison, |
|
496 | + $session_lifespan->expiration(), |
|
497 | + ], |
|
498 | + 'STS_ID' => [ |
|
499 | + '!=', |
|
500 | + EEM_Transaction::complete_status_code, |
|
501 | + ], |
|
502 | + ], |
|
503 | + ] |
|
504 | + ); |
|
505 | + } |
|
506 | 506 | } |
@@ -23,32 +23,32 @@ |
||
23 | 23 | */ |
24 | 24 | class EEM_Extra_Join extends EEM_Base |
25 | 25 | { |
26 | - // private instance of the Extra Join object |
|
27 | - protected static $_instance = null; |
|
26 | + // private instance of the Extra Join object |
|
27 | + protected static $_instance = null; |
|
28 | 28 | |
29 | - public function __construct($timezone = null) |
|
30 | - { |
|
31 | - $models_this_can_join = array_keys(EE_Registry::instance()->non_abstract_db_models); |
|
32 | - $this->_tables = array( |
|
33 | - 'Extra_Join' => new EE_Primary_Table('esp_extra_join', 'EXJ_ID'), |
|
34 | - ); |
|
35 | - $this->_fields = array( |
|
36 | - 'Extra_Join' => array( |
|
37 | - 'EXJ_ID' => new EE_Primary_Key_Int_Field('EXJ_ID', esc_html__('Extra Join ID', 'event_espresso')), |
|
38 | - 'EXJ_first_model_ID' => new EE_Foreign_Key_String_Field('EXJ_first_model_ID', esc_html__('First Model ID', 'event_espresso'), true, 0, $models_this_can_join), |
|
39 | - 'EXJ_first_model_name' => new EE_Any_Foreign_Model_Name_Field('EXJ_first_model_name', esc_html__('First Model Name', 'event_espresso'), true, '', $models_this_can_join), |
|
40 | - 'EXJ_second_model_ID' => new EE_Foreign_Key_String_Field('EXJ_second_model_ID', esc_html__('Second Model ID', 'event_espresso'), true, 0, $models_this_can_join), |
|
41 | - 'EXJ_second_model_name' => new EE_Any_Foreign_Model_Name_Field('EXJ_second_model_name', esc_html__('Second Model Name', 'event_espresso'), true, '', $models_this_can_join), |
|
29 | + public function __construct($timezone = null) |
|
30 | + { |
|
31 | + $models_this_can_join = array_keys(EE_Registry::instance()->non_abstract_db_models); |
|
32 | + $this->_tables = array( |
|
33 | + 'Extra_Join' => new EE_Primary_Table('esp_extra_join', 'EXJ_ID'), |
|
34 | + ); |
|
35 | + $this->_fields = array( |
|
36 | + 'Extra_Join' => array( |
|
37 | + 'EXJ_ID' => new EE_Primary_Key_Int_Field('EXJ_ID', esc_html__('Extra Join ID', 'event_espresso')), |
|
38 | + 'EXJ_first_model_ID' => new EE_Foreign_Key_String_Field('EXJ_first_model_ID', esc_html__('First Model ID', 'event_espresso'), true, 0, $models_this_can_join), |
|
39 | + 'EXJ_first_model_name' => new EE_Any_Foreign_Model_Name_Field('EXJ_first_model_name', esc_html__('First Model Name', 'event_espresso'), true, '', $models_this_can_join), |
|
40 | + 'EXJ_second_model_ID' => new EE_Foreign_Key_String_Field('EXJ_second_model_ID', esc_html__('Second Model ID', 'event_espresso'), true, 0, $models_this_can_join), |
|
41 | + 'EXJ_second_model_name' => new EE_Any_Foreign_Model_Name_Field('EXJ_second_model_name', esc_html__('Second Model Name', 'event_espresso'), true, '', $models_this_can_join), |
|
42 | 42 | |
43 | - ) |
|
44 | - ); |
|
45 | - // this model is weird in that it has two foreign key columns which can point to any model/table. |
|
46 | - // eg a foreign key to event will be in "EXJ_first_model_ID", provided the other |
|
47 | - // model linked to is alphabetically greater than event (eg venue). |
|
48 | - // but if the model linked to is alphabetically lower (eg attendee), |
|
49 | - // the foreign key to the event will be in "EXJ_second_model_ID" |
|
50 | - // so normal usage of foreign keys is weird. So don't define any |
|
51 | - // relations to other models because they won't work properly with this model |
|
52 | - parent::__construct($timezone); |
|
53 | - } |
|
43 | + ) |
|
44 | + ); |
|
45 | + // this model is weird in that it has two foreign key columns which can point to any model/table. |
|
46 | + // eg a foreign key to event will be in "EXJ_first_model_ID", provided the other |
|
47 | + // model linked to is alphabetically greater than event (eg venue). |
|
48 | + // but if the model linked to is alphabetically lower (eg attendee), |
|
49 | + // the foreign key to the event will be in "EXJ_second_model_ID" |
|
50 | + // so normal usage of foreign keys is weird. So don't define any |
|
51 | + // relations to other models because they won't work properly with this model |
|
52 | + parent::__construct($timezone); |
|
53 | + } |
|
54 | 54 | } |