@@ -134,9 +134,9 @@ discard block |
||
134 | 134 | { |
135 | 135 | Capabilities::verifyAtLeastPartialAccessTo($model, EEM_Base::caps_edit, 'create'); |
136 | 136 | $default_cap_to_check_for = EE_Restriction_Generator_Base::get_default_restrictions_cap(); |
137 | - if (! current_user_can($default_cap_to_check_for)) { |
|
137 | + if ( ! current_user_can($default_cap_to_check_for)) { |
|
138 | 138 | throw new RestException( |
139 | - 'rest_cannot_create_' . EEH_Inflector::pluralize_and_lower(($model->get_this_model_name())), |
|
139 | + 'rest_cannot_create_'.EEH_Inflector::pluralize_and_lower(($model->get_this_model_name())), |
|
140 | 140 | sprintf( |
141 | 141 | esc_html__( |
142 | 142 | // @codingStandardsIgnoreStart |
@@ -164,7 +164,7 @@ discard block |
||
164 | 164 | ); |
165 | 165 | $model_obj->save(); |
166 | 166 | $new_id = $model_obj->ID(); |
167 | - if (! $new_id) { |
|
167 | + if ( ! $new_id) { |
|
168 | 168 | throw new RestException( |
169 | 169 | 'rest_insertion_failed', |
170 | 170 | sprintf(esc_html__('Could not insert new %1$s', 'event_espresso'), $model->get_this_model_name()) |
@@ -186,9 +186,9 @@ discard block |
||
186 | 186 | { |
187 | 187 | Capabilities::verifyAtLeastPartialAccessTo($model, EEM_Base::caps_edit, 'edit'); |
188 | 188 | $default_cap_to_check_for = EE_Restriction_Generator_Base::get_default_restrictions_cap(); |
189 | - if (! current_user_can($default_cap_to_check_for)) { |
|
189 | + if ( ! current_user_can($default_cap_to_check_for)) { |
|
190 | 190 | throw new RestException( |
191 | - 'rest_cannot_edit_' . EEH_Inflector::pluralize_and_lower(($model->get_this_model_name())), |
|
191 | + 'rest_cannot_edit_'.EEH_Inflector::pluralize_and_lower(($model->get_this_model_name())), |
|
192 | 192 | sprintf( |
193 | 193 | esc_html__( |
194 | 194 | // @codingStandardsIgnoreStart |
@@ -202,7 +202,7 @@ discard block |
||
202 | 202 | ); |
203 | 203 | } |
204 | 204 | $obj_id = $request->get_param('id'); |
205 | - if (! $obj_id) { |
|
205 | + if ( ! $obj_id) { |
|
206 | 206 | throw new RestException( |
207 | 207 | 'rest_edit_failed', |
208 | 208 | sprintf(esc_html__('Could not edit %1$s', 'event_espresso'), $model->get_this_model_name()) |
@@ -215,7 +215,7 @@ discard block |
||
215 | 215 | true |
216 | 216 | ); |
217 | 217 | $model_obj = $model->get_one_by_ID($obj_id); |
218 | - if (! $model_obj instanceof EE_Base_Class) { |
|
218 | + if ( ! $model_obj instanceof EE_Base_Class) { |
|
219 | 219 | $lowercase_model_name = strtolower($model->get_this_model_name()); |
220 | 220 | throw new RestException( |
221 | 221 | sprintf('rest_%s_invalid_id', $lowercase_model_name), |
@@ -240,9 +240,9 @@ discard block |
||
240 | 240 | { |
241 | 241 | Capabilities::verifyAtLeastPartialAccessTo($model, EEM_Base::caps_delete, 'delete'); |
242 | 242 | $default_cap_to_check_for = EE_Restriction_Generator_Base::get_default_restrictions_cap(); |
243 | - if (! current_user_can($default_cap_to_check_for)) { |
|
243 | + if ( ! current_user_can($default_cap_to_check_for)) { |
|
244 | 244 | throw new RestException( |
245 | - 'rest_cannot_delete_' . EEH_Inflector::pluralize_and_lower(($model->get_this_model_name())), |
|
245 | + 'rest_cannot_delete_'.EEH_Inflector::pluralize_and_lower(($model->get_this_model_name())), |
|
246 | 246 | sprintf( |
247 | 247 | esc_html__( |
248 | 248 | // @codingStandardsIgnoreStart |
@@ -258,7 +258,7 @@ discard block |
||
258 | 258 | $obj_id = $request->get_param('id'); |
259 | 259 | // this is where we would apply more fine-grained caps |
260 | 260 | $model_obj = $model->get_one_by_ID($obj_id); |
261 | - if (! $model_obj instanceof EE_Base_Class) { |
|
261 | + if ( ! $model_obj instanceof EE_Base_Class) { |
|
262 | 262 | $lowercase_model_name = strtolower($model->get_this_model_name()); |
263 | 263 | throw new RestException( |
264 | 264 | sprintf('rest_%s_invalid_id', $lowercase_model_name), |
@@ -316,7 +316,7 @@ discard block |
||
316 | 316 | } else { |
317 | 317 | $raw_value = $model_obj->get_raw($field_name); |
318 | 318 | } |
319 | - $simulated_db_row[ $field_obj->get_qualified_column() ] = $field_obj->prepare_for_use_in_db($raw_value); |
|
319 | + $simulated_db_row[$field_obj->get_qualified_column()] = $field_obj->prepare_for_use_in_db($raw_value); |
|
320 | 320 | } |
321 | 321 | $read_controller = LoaderFactory::getLoader()->getNew('EventEspresso\core\libraries\rest_api\controllers\model\Read'); |
322 | 322 | $read_controller->setRequestedVersion($this->getRequestedVersion()); |
@@ -447,7 +447,7 @@ discard block |
||
447 | 447 | ) |
448 | 448 | ) |
449 | 449 | ); |
450 | - $response['join'][ strtolower($relation->get_join_model()->get_this_model_name()) ] = $this->returnModelObjAsJsonResponse($join_model_obj, $request); |
|
450 | + $response['join'][strtolower($relation->get_join_model()->get_this_model_name())] = $this->returnModelObjAsJsonResponse($join_model_obj, $request); |
|
451 | 451 | } |
452 | 452 | return $response; |
453 | 453 | } |
@@ -495,7 +495,7 @@ discard block |
||
495 | 495 | { |
496 | 496 | // This endpoint doesn't accept body parameters (it's understandable to think it might, so let developers know |
497 | 497 | // up-front that it doesn't.) |
498 | - if (!empty($request->get_body_params())) { |
|
498 | + if ( ! empty($request->get_body_params())) { |
|
499 | 499 | $body_params = $request->get_body_params(); |
500 | 500 | throw new RestException( |
501 | 501 | 'invalid_field', |
@@ -537,9 +537,9 @@ discard block |
||
537 | 537 | ) |
538 | 538 | ); |
539 | 539 | if ($join_model_obj instanceof EE_Base_Class) { |
540 | - $response['join'][ strtolower($relation->get_join_model()->get_this_model_name()) ] = $this->returnModelObjAsJsonResponse($join_model_obj, $request); |
|
540 | + $response['join'][strtolower($relation->get_join_model()->get_this_model_name())] = $this->returnModelObjAsJsonResponse($join_model_obj, $request); |
|
541 | 541 | } else { |
542 | - $response['join'][ strtolower($relation->get_join_model()->get_this_model_name()) ] = null; |
|
542 | + $response['join'][strtolower($relation->get_join_model()->get_this_model_name())] = null; |
|
543 | 543 | } |
544 | 544 | } |
545 | 545 | return $response; |
@@ -564,9 +564,9 @@ discard block |
||
564 | 564 | // Check generic caps. For now, we're only allowing access to this endpoint to full admins. |
565 | 565 | Capabilities::verifyAtLeastPartialAccessTo($model, EEM_Base::caps_edit, 'edit'); |
566 | 566 | $default_cap_to_check_for = EE_Restriction_Generator_Base::get_default_restrictions_cap(); |
567 | - if (! current_user_can($default_cap_to_check_for)) { |
|
567 | + if ( ! current_user_can($default_cap_to_check_for)) { |
|
568 | 568 | throw new RestException( |
569 | - 'rest_cannot_edit_' . EEH_Inflector::pluralize_and_lower(($model->get_this_model_name())), |
|
569 | + 'rest_cannot_edit_'.EEH_Inflector::pluralize_and_lower(($model->get_this_model_name())), |
|
570 | 570 | sprintf( |
571 | 571 | esc_html__( |
572 | 572 | // @codingStandardsIgnoreStart |
@@ -583,7 +583,7 @@ discard block |
||
583 | 583 | $model_obj = $this->getOneOrThrowException($model, $request->get_param('id')); |
584 | 584 | // For now, we require the other model object to exist too. This might be relaxed later. |
585 | 585 | $other_obj = $this->getOneOrThrowException($relation->get_other_model(), $request->get_param('related_id')); |
586 | - return array($model_obj,$other_obj); |
|
586 | + return array($model_obj, $other_obj); |
|
587 | 587 | } |
588 | 588 | |
589 | 589 | /** |
@@ -37,573 +37,573 @@ |
||
37 | 37 | */ |
38 | 38 | class Write extends Base |
39 | 39 | { |
40 | - public function __construct() |
|
41 | - { |
|
42 | - parent::__construct(); |
|
43 | - EE_Registry::instance()->load_helper('Inflector'); |
|
44 | - } |
|
40 | + public function __construct() |
|
41 | + { |
|
42 | + parent::__construct(); |
|
43 | + EE_Registry::instance()->load_helper('Inflector'); |
|
44 | + } |
|
45 | 45 | |
46 | 46 | |
47 | - /** |
|
48 | - * Handles requests to get all (or a filtered subset) of entities for a particular model |
|
49 | - * |
|
50 | - * @param WP_REST_Request $request |
|
51 | - * @param string $version |
|
52 | - * @param string $model_name |
|
53 | - * @return WP_REST_Response|\WP_Error |
|
54 | - */ |
|
55 | - public static function handleRequestInsert(WP_REST_Request $request, $version, $model_name) |
|
56 | - { |
|
57 | - $controller = new Write(); |
|
58 | - try { |
|
59 | - $controller->setRequestedVersion($version); |
|
60 | - return $controller->sendResponse( |
|
61 | - $controller->insert( |
|
62 | - $controller->getModelVersionInfo()->loadModel($model_name), |
|
63 | - $request |
|
64 | - ) |
|
65 | - ); |
|
66 | - } catch (Exception $e) { |
|
67 | - return $controller->sendResponse($e); |
|
68 | - } |
|
69 | - } |
|
47 | + /** |
|
48 | + * Handles requests to get all (or a filtered subset) of entities for a particular model |
|
49 | + * |
|
50 | + * @param WP_REST_Request $request |
|
51 | + * @param string $version |
|
52 | + * @param string $model_name |
|
53 | + * @return WP_REST_Response|\WP_Error |
|
54 | + */ |
|
55 | + public static function handleRequestInsert(WP_REST_Request $request, $version, $model_name) |
|
56 | + { |
|
57 | + $controller = new Write(); |
|
58 | + try { |
|
59 | + $controller->setRequestedVersion($version); |
|
60 | + return $controller->sendResponse( |
|
61 | + $controller->insert( |
|
62 | + $controller->getModelVersionInfo()->loadModel($model_name), |
|
63 | + $request |
|
64 | + ) |
|
65 | + ); |
|
66 | + } catch (Exception $e) { |
|
67 | + return $controller->sendResponse($e); |
|
68 | + } |
|
69 | + } |
|
70 | 70 | |
71 | 71 | |
72 | - /** |
|
73 | - * Handles a request from \WP_REST_Server to update an EE model |
|
74 | - * |
|
75 | - * @param WP_REST_Request $request |
|
76 | - * @param string $version |
|
77 | - * @param string $model_name |
|
78 | - * @return WP_REST_Response|\WP_Error |
|
79 | - */ |
|
80 | - public static function handleRequestUpdate(WP_REST_Request $request, $version, $model_name) |
|
81 | - { |
|
82 | - $controller = new Write(); |
|
83 | - try { |
|
84 | - $controller->setRequestedVersion($version); |
|
85 | - return $controller->sendResponse( |
|
86 | - $controller->update( |
|
87 | - $controller->getModelVersionInfo()->loadModel($model_name), |
|
88 | - $request |
|
89 | - ) |
|
90 | - ); |
|
91 | - } catch (Exception $e) { |
|
92 | - return $controller->sendResponse($e); |
|
93 | - } |
|
94 | - } |
|
72 | + /** |
|
73 | + * Handles a request from \WP_REST_Server to update an EE model |
|
74 | + * |
|
75 | + * @param WP_REST_Request $request |
|
76 | + * @param string $version |
|
77 | + * @param string $model_name |
|
78 | + * @return WP_REST_Response|\WP_Error |
|
79 | + */ |
|
80 | + public static function handleRequestUpdate(WP_REST_Request $request, $version, $model_name) |
|
81 | + { |
|
82 | + $controller = new Write(); |
|
83 | + try { |
|
84 | + $controller->setRequestedVersion($version); |
|
85 | + return $controller->sendResponse( |
|
86 | + $controller->update( |
|
87 | + $controller->getModelVersionInfo()->loadModel($model_name), |
|
88 | + $request |
|
89 | + ) |
|
90 | + ); |
|
91 | + } catch (Exception $e) { |
|
92 | + return $controller->sendResponse($e); |
|
93 | + } |
|
94 | + } |
|
95 | 95 | |
96 | 96 | |
97 | - /** |
|
98 | - * Deletes a single model object and returns it. Unless |
|
99 | - * |
|
100 | - * @param WP_REST_Request $request |
|
101 | - * @param string $version |
|
102 | - * @param string $model_name |
|
103 | - * @return WP_REST_Response|\WP_Error |
|
104 | - */ |
|
105 | - public static function handleRequestDelete(WP_REST_Request $request, $version, $model_name) |
|
106 | - { |
|
107 | - $controller = new Write(); |
|
108 | - try { |
|
109 | - $controller->setRequestedVersion($version); |
|
110 | - return $controller->sendResponse( |
|
111 | - $controller->delete( |
|
112 | - $controller->getModelVersionInfo()->loadModel($model_name), |
|
113 | - $request |
|
114 | - ) |
|
115 | - ); |
|
116 | - } catch (Exception $e) { |
|
117 | - return $controller->sendResponse($e); |
|
118 | - } |
|
119 | - } |
|
97 | + /** |
|
98 | + * Deletes a single model object and returns it. Unless |
|
99 | + * |
|
100 | + * @param WP_REST_Request $request |
|
101 | + * @param string $version |
|
102 | + * @param string $model_name |
|
103 | + * @return WP_REST_Response|\WP_Error |
|
104 | + */ |
|
105 | + public static function handleRequestDelete(WP_REST_Request $request, $version, $model_name) |
|
106 | + { |
|
107 | + $controller = new Write(); |
|
108 | + try { |
|
109 | + $controller->setRequestedVersion($version); |
|
110 | + return $controller->sendResponse( |
|
111 | + $controller->delete( |
|
112 | + $controller->getModelVersionInfo()->loadModel($model_name), |
|
113 | + $request |
|
114 | + ) |
|
115 | + ); |
|
116 | + } catch (Exception $e) { |
|
117 | + return $controller->sendResponse($e); |
|
118 | + } |
|
119 | + } |
|
120 | 120 | |
121 | 121 | |
122 | - /** |
|
123 | - * Inserts a new model object according to the $request |
|
124 | - * |
|
125 | - * @param EEM_Base $model |
|
126 | - * @param WP_REST_Request $request |
|
127 | - * @return array |
|
128 | - * @throws EE_Error |
|
129 | - * @throws RestException |
|
130 | - */ |
|
131 | - public function insert(EEM_Base $model, WP_REST_Request $request) |
|
132 | - { |
|
133 | - Capabilities::verifyAtLeastPartialAccessTo($model, EEM_Base::caps_edit, 'create'); |
|
134 | - $default_cap_to_check_for = EE_Restriction_Generator_Base::get_default_restrictions_cap(); |
|
135 | - if (! current_user_can($default_cap_to_check_for)) { |
|
136 | - throw new RestException( |
|
137 | - 'rest_cannot_create_' . EEH_Inflector::pluralize_and_lower(($model->get_this_model_name())), |
|
138 | - sprintf( |
|
139 | - esc_html__( |
|
140 | - // @codingStandardsIgnoreStart |
|
141 | - 'For now, only those with the admin capability to "%1$s" are allowed to use the REST API to insert data into Event Espresso.', |
|
142 | - // @codingStandardsIgnoreEnd |
|
143 | - 'event_espresso' |
|
144 | - ), |
|
145 | - $default_cap_to_check_for |
|
146 | - ), |
|
147 | - array('status' => 403) |
|
148 | - ); |
|
149 | - } |
|
150 | - $submitted_json_data = array_merge((array) $request->get_body_params(), (array) $request->get_json_params()); |
|
151 | - $model_data = ModelDataTranslator::prepareConditionsQueryParamsForModels( |
|
152 | - $submitted_json_data, |
|
153 | - $model, |
|
154 | - $this->getModelVersionInfo()->requestedVersion(), |
|
155 | - true |
|
156 | - ); |
|
157 | - $model_obj = EE_Registry::instance()->load_class( |
|
158 | - $model->get_this_model_name(), |
|
159 | - array($model_data, $model->get_timezone()), |
|
160 | - false, |
|
161 | - false |
|
162 | - ); |
|
163 | - $model_obj->save(); |
|
164 | - $new_id = $model_obj->ID(); |
|
165 | - if (! $new_id) { |
|
166 | - throw new RestException( |
|
167 | - 'rest_insertion_failed', |
|
168 | - sprintf(esc_html__('Could not insert new %1$s', 'event_espresso'), $model->get_this_model_name()) |
|
169 | - ); |
|
170 | - } |
|
171 | - return $this->returnModelObjAsJsonResponse($model_obj, $request); |
|
172 | - } |
|
122 | + /** |
|
123 | + * Inserts a new model object according to the $request |
|
124 | + * |
|
125 | + * @param EEM_Base $model |
|
126 | + * @param WP_REST_Request $request |
|
127 | + * @return array |
|
128 | + * @throws EE_Error |
|
129 | + * @throws RestException |
|
130 | + */ |
|
131 | + public function insert(EEM_Base $model, WP_REST_Request $request) |
|
132 | + { |
|
133 | + Capabilities::verifyAtLeastPartialAccessTo($model, EEM_Base::caps_edit, 'create'); |
|
134 | + $default_cap_to_check_for = EE_Restriction_Generator_Base::get_default_restrictions_cap(); |
|
135 | + if (! current_user_can($default_cap_to_check_for)) { |
|
136 | + throw new RestException( |
|
137 | + 'rest_cannot_create_' . EEH_Inflector::pluralize_and_lower(($model->get_this_model_name())), |
|
138 | + sprintf( |
|
139 | + esc_html__( |
|
140 | + // @codingStandardsIgnoreStart |
|
141 | + 'For now, only those with the admin capability to "%1$s" are allowed to use the REST API to insert data into Event Espresso.', |
|
142 | + // @codingStandardsIgnoreEnd |
|
143 | + 'event_espresso' |
|
144 | + ), |
|
145 | + $default_cap_to_check_for |
|
146 | + ), |
|
147 | + array('status' => 403) |
|
148 | + ); |
|
149 | + } |
|
150 | + $submitted_json_data = array_merge((array) $request->get_body_params(), (array) $request->get_json_params()); |
|
151 | + $model_data = ModelDataTranslator::prepareConditionsQueryParamsForModels( |
|
152 | + $submitted_json_data, |
|
153 | + $model, |
|
154 | + $this->getModelVersionInfo()->requestedVersion(), |
|
155 | + true |
|
156 | + ); |
|
157 | + $model_obj = EE_Registry::instance()->load_class( |
|
158 | + $model->get_this_model_name(), |
|
159 | + array($model_data, $model->get_timezone()), |
|
160 | + false, |
|
161 | + false |
|
162 | + ); |
|
163 | + $model_obj->save(); |
|
164 | + $new_id = $model_obj->ID(); |
|
165 | + if (! $new_id) { |
|
166 | + throw new RestException( |
|
167 | + 'rest_insertion_failed', |
|
168 | + sprintf(esc_html__('Could not insert new %1$s', 'event_espresso'), $model->get_this_model_name()) |
|
169 | + ); |
|
170 | + } |
|
171 | + return $this->returnModelObjAsJsonResponse($model_obj, $request); |
|
172 | + } |
|
173 | 173 | |
174 | 174 | |
175 | - /** |
|
176 | - * Updates an existing model object according to the $request |
|
177 | - * |
|
178 | - * @param EEM_Base $model |
|
179 | - * @param WP_REST_Request $request |
|
180 | - * @return array |
|
181 | - * @throws EE_Error |
|
182 | - */ |
|
183 | - public function update(EEM_Base $model, WP_REST_Request $request) |
|
184 | - { |
|
185 | - Capabilities::verifyAtLeastPartialAccessTo($model, EEM_Base::caps_edit, 'edit'); |
|
186 | - $default_cap_to_check_for = EE_Restriction_Generator_Base::get_default_restrictions_cap(); |
|
187 | - if (! current_user_can($default_cap_to_check_for)) { |
|
188 | - throw new RestException( |
|
189 | - 'rest_cannot_edit_' . EEH_Inflector::pluralize_and_lower(($model->get_this_model_name())), |
|
190 | - sprintf( |
|
191 | - esc_html__( |
|
192 | - // @codingStandardsIgnoreStart |
|
193 | - 'For now, only those with the admin capability to "%1$s" are allowed to use the REST API to update data into Event Espresso.', |
|
194 | - // @codingStandardsIgnoreEnd |
|
195 | - 'event_espresso' |
|
196 | - ), |
|
197 | - $default_cap_to_check_for |
|
198 | - ), |
|
199 | - array('status' => 403) |
|
200 | - ); |
|
201 | - } |
|
202 | - $obj_id = $request->get_param('id'); |
|
203 | - if (! $obj_id) { |
|
204 | - throw new RestException( |
|
205 | - 'rest_edit_failed', |
|
206 | - sprintf(esc_html__('Could not edit %1$s', 'event_espresso'), $model->get_this_model_name()) |
|
207 | - ); |
|
208 | - } |
|
209 | - $model_data = ModelDataTranslator::prepareConditionsQueryParamsForModels( |
|
210 | - $this->getBodyParams($request), |
|
211 | - $model, |
|
212 | - $this->getModelVersionInfo()->requestedVersion(), |
|
213 | - true |
|
214 | - ); |
|
215 | - $model_obj = $model->get_one_by_ID($obj_id); |
|
216 | - if (! $model_obj instanceof EE_Base_Class) { |
|
217 | - $lowercase_model_name = strtolower($model->get_this_model_name()); |
|
218 | - throw new RestException( |
|
219 | - sprintf('rest_%s_invalid_id', $lowercase_model_name), |
|
220 | - sprintf(esc_html__('Invalid %s ID.', 'event_espresso'), $lowercase_model_name), |
|
221 | - array('status' => 404) |
|
222 | - ); |
|
223 | - } |
|
224 | - $model_obj->save($model_data); |
|
225 | - return $this->returnModelObjAsJsonResponse($model_obj, $request); |
|
226 | - } |
|
175 | + /** |
|
176 | + * Updates an existing model object according to the $request |
|
177 | + * |
|
178 | + * @param EEM_Base $model |
|
179 | + * @param WP_REST_Request $request |
|
180 | + * @return array |
|
181 | + * @throws EE_Error |
|
182 | + */ |
|
183 | + public function update(EEM_Base $model, WP_REST_Request $request) |
|
184 | + { |
|
185 | + Capabilities::verifyAtLeastPartialAccessTo($model, EEM_Base::caps_edit, 'edit'); |
|
186 | + $default_cap_to_check_for = EE_Restriction_Generator_Base::get_default_restrictions_cap(); |
|
187 | + if (! current_user_can($default_cap_to_check_for)) { |
|
188 | + throw new RestException( |
|
189 | + 'rest_cannot_edit_' . EEH_Inflector::pluralize_and_lower(($model->get_this_model_name())), |
|
190 | + sprintf( |
|
191 | + esc_html__( |
|
192 | + // @codingStandardsIgnoreStart |
|
193 | + 'For now, only those with the admin capability to "%1$s" are allowed to use the REST API to update data into Event Espresso.', |
|
194 | + // @codingStandardsIgnoreEnd |
|
195 | + 'event_espresso' |
|
196 | + ), |
|
197 | + $default_cap_to_check_for |
|
198 | + ), |
|
199 | + array('status' => 403) |
|
200 | + ); |
|
201 | + } |
|
202 | + $obj_id = $request->get_param('id'); |
|
203 | + if (! $obj_id) { |
|
204 | + throw new RestException( |
|
205 | + 'rest_edit_failed', |
|
206 | + sprintf(esc_html__('Could not edit %1$s', 'event_espresso'), $model->get_this_model_name()) |
|
207 | + ); |
|
208 | + } |
|
209 | + $model_data = ModelDataTranslator::prepareConditionsQueryParamsForModels( |
|
210 | + $this->getBodyParams($request), |
|
211 | + $model, |
|
212 | + $this->getModelVersionInfo()->requestedVersion(), |
|
213 | + true |
|
214 | + ); |
|
215 | + $model_obj = $model->get_one_by_ID($obj_id); |
|
216 | + if (! $model_obj instanceof EE_Base_Class) { |
|
217 | + $lowercase_model_name = strtolower($model->get_this_model_name()); |
|
218 | + throw new RestException( |
|
219 | + sprintf('rest_%s_invalid_id', $lowercase_model_name), |
|
220 | + sprintf(esc_html__('Invalid %s ID.', 'event_espresso'), $lowercase_model_name), |
|
221 | + array('status' => 404) |
|
222 | + ); |
|
223 | + } |
|
224 | + $model_obj->save($model_data); |
|
225 | + return $this->returnModelObjAsJsonResponse($model_obj, $request); |
|
226 | + } |
|
227 | 227 | |
228 | 228 | |
229 | - /** |
|
230 | - * Updates an existing model object according to the $request |
|
231 | - * |
|
232 | - * @param EEM_Base $model |
|
233 | - * @param WP_REST_Request $request |
|
234 | - * @return array of either the soft-deleted item, or |
|
235 | - * @throws EE_Error |
|
236 | - */ |
|
237 | - public function delete(EEM_Base $model, WP_REST_Request $request) |
|
238 | - { |
|
239 | - Capabilities::verifyAtLeastPartialAccessTo($model, EEM_Base::caps_delete, 'delete'); |
|
240 | - $default_cap_to_check_for = EE_Restriction_Generator_Base::get_default_restrictions_cap(); |
|
241 | - if (! current_user_can($default_cap_to_check_for)) { |
|
242 | - throw new RestException( |
|
243 | - 'rest_cannot_delete_' . EEH_Inflector::pluralize_and_lower(($model->get_this_model_name())), |
|
244 | - sprintf( |
|
245 | - esc_html__( |
|
246 | - // @codingStandardsIgnoreStart |
|
247 | - 'For now, only those with the admin capability to "%1$s" are allowed to use the REST API to delete data into Event Espresso.', |
|
248 | - // @codingStandardsIgnoreEnd |
|
249 | - 'event_espresso' |
|
250 | - ), |
|
251 | - $default_cap_to_check_for |
|
252 | - ), |
|
253 | - array('status' => 403) |
|
254 | - ); |
|
255 | - } |
|
256 | - $obj_id = $request->get_param('id'); |
|
257 | - // this is where we would apply more fine-grained caps |
|
258 | - $model_obj = $model->get_one_by_ID($obj_id); |
|
259 | - if (! $model_obj instanceof EE_Base_Class) { |
|
260 | - $lowercase_model_name = strtolower($model->get_this_model_name()); |
|
261 | - throw new RestException( |
|
262 | - sprintf('rest_%s_invalid_id', $lowercase_model_name), |
|
263 | - sprintf(esc_html__('Invalid %s ID.', 'event_espresso'), $lowercase_model_name), |
|
264 | - array('status' => 404) |
|
265 | - ); |
|
266 | - } |
|
267 | - $requested_permanent_delete = filter_var($request->get_param('force'), FILTER_VALIDATE_BOOLEAN); |
|
268 | - $requested_allow_blocking = filter_var($request->get_param('allow_blocking'), FILTER_VALIDATE_BOOLEAN); |
|
269 | - if ($requested_permanent_delete) { |
|
270 | - $previous = $this->returnModelObjAsJsonResponse($model_obj, $request); |
|
271 | - $deleted = (bool) $model->delete_permanently_by_ID($obj_id, $requested_allow_blocking); |
|
272 | - return array( |
|
273 | - 'deleted' => $deleted, |
|
274 | - 'previous' => $previous, |
|
275 | - ); |
|
276 | - } else { |
|
277 | - if ($model instanceof EEM_Soft_Delete_Base) { |
|
278 | - $model->delete_by_ID($obj_id, $requested_allow_blocking); |
|
279 | - return $this->returnModelObjAsJsonResponse($model_obj, $request); |
|
280 | - } else { |
|
281 | - throw new RestException( |
|
282 | - 'rest_trash_not_supported', |
|
283 | - 501, |
|
284 | - sprintf( |
|
285 | - esc_html__('%1$s do not support trashing. Set force=1 to delete.', 'event_espresso'), |
|
286 | - EEH_Inflector::pluralize($model->get_this_model_name()) |
|
287 | - ) |
|
288 | - ); |
|
289 | - } |
|
290 | - } |
|
291 | - } |
|
229 | + /** |
|
230 | + * Updates an existing model object according to the $request |
|
231 | + * |
|
232 | + * @param EEM_Base $model |
|
233 | + * @param WP_REST_Request $request |
|
234 | + * @return array of either the soft-deleted item, or |
|
235 | + * @throws EE_Error |
|
236 | + */ |
|
237 | + public function delete(EEM_Base $model, WP_REST_Request $request) |
|
238 | + { |
|
239 | + Capabilities::verifyAtLeastPartialAccessTo($model, EEM_Base::caps_delete, 'delete'); |
|
240 | + $default_cap_to_check_for = EE_Restriction_Generator_Base::get_default_restrictions_cap(); |
|
241 | + if (! current_user_can($default_cap_to_check_for)) { |
|
242 | + throw new RestException( |
|
243 | + 'rest_cannot_delete_' . EEH_Inflector::pluralize_and_lower(($model->get_this_model_name())), |
|
244 | + sprintf( |
|
245 | + esc_html__( |
|
246 | + // @codingStandardsIgnoreStart |
|
247 | + 'For now, only those with the admin capability to "%1$s" are allowed to use the REST API to delete data into Event Espresso.', |
|
248 | + // @codingStandardsIgnoreEnd |
|
249 | + 'event_espresso' |
|
250 | + ), |
|
251 | + $default_cap_to_check_for |
|
252 | + ), |
|
253 | + array('status' => 403) |
|
254 | + ); |
|
255 | + } |
|
256 | + $obj_id = $request->get_param('id'); |
|
257 | + // this is where we would apply more fine-grained caps |
|
258 | + $model_obj = $model->get_one_by_ID($obj_id); |
|
259 | + if (! $model_obj instanceof EE_Base_Class) { |
|
260 | + $lowercase_model_name = strtolower($model->get_this_model_name()); |
|
261 | + throw new RestException( |
|
262 | + sprintf('rest_%s_invalid_id', $lowercase_model_name), |
|
263 | + sprintf(esc_html__('Invalid %s ID.', 'event_espresso'), $lowercase_model_name), |
|
264 | + array('status' => 404) |
|
265 | + ); |
|
266 | + } |
|
267 | + $requested_permanent_delete = filter_var($request->get_param('force'), FILTER_VALIDATE_BOOLEAN); |
|
268 | + $requested_allow_blocking = filter_var($request->get_param('allow_blocking'), FILTER_VALIDATE_BOOLEAN); |
|
269 | + if ($requested_permanent_delete) { |
|
270 | + $previous = $this->returnModelObjAsJsonResponse($model_obj, $request); |
|
271 | + $deleted = (bool) $model->delete_permanently_by_ID($obj_id, $requested_allow_blocking); |
|
272 | + return array( |
|
273 | + 'deleted' => $deleted, |
|
274 | + 'previous' => $previous, |
|
275 | + ); |
|
276 | + } else { |
|
277 | + if ($model instanceof EEM_Soft_Delete_Base) { |
|
278 | + $model->delete_by_ID($obj_id, $requested_allow_blocking); |
|
279 | + return $this->returnModelObjAsJsonResponse($model_obj, $request); |
|
280 | + } else { |
|
281 | + throw new RestException( |
|
282 | + 'rest_trash_not_supported', |
|
283 | + 501, |
|
284 | + sprintf( |
|
285 | + esc_html__('%1$s do not support trashing. Set force=1 to delete.', 'event_espresso'), |
|
286 | + EEH_Inflector::pluralize($model->get_this_model_name()) |
|
287 | + ) |
|
288 | + ); |
|
289 | + } |
|
290 | + } |
|
291 | + } |
|
292 | 292 | |
293 | 293 | |
294 | - /** |
|
295 | - * Returns an array ready to be converted into a JSON response, based solely on the model object |
|
296 | - * |
|
297 | - * @param EE_Base_Class $model_obj |
|
298 | - * @param WP_REST_Request $request |
|
299 | - * @return array ready for a response |
|
300 | - */ |
|
301 | - protected function returnModelObjAsJsonResponse(EE_Base_Class $model_obj, WP_REST_Request $request) |
|
302 | - { |
|
303 | - $model = $model_obj->get_model(); |
|
304 | - // create an array exactly like the wpdb results row, |
|
305 | - // so we can pass it to controllers/model/Read::create_entity_from_wpdb_result() |
|
306 | - $simulated_db_row = array(); |
|
307 | - foreach ($model->field_settings(true) as $field_name => $field_obj) { |
|
308 | - // we need to reconstruct the normal wpdb results, including the db-only fields |
|
309 | - // like a secondary table's primary key. The models expect those (but don't care what value they have) |
|
310 | - if ($field_obj instanceof EE_DB_Only_Field_Base) { |
|
311 | - $raw_value = true; |
|
312 | - } elseif ($field_obj instanceof EE_Datetime_Field) { |
|
313 | - $raw_value = $model_obj->get_DateTime_object($field_name); |
|
314 | - } else { |
|
315 | - $raw_value = $model_obj->get_raw($field_name); |
|
316 | - } |
|
317 | - $simulated_db_row[ $field_obj->get_qualified_column() ] = $field_obj->prepare_for_use_in_db($raw_value); |
|
318 | - } |
|
319 | - $read_controller = LoaderFactory::getLoader()->getNew('EventEspresso\core\libraries\rest_api\controllers\model\Read'); |
|
320 | - $read_controller->setRequestedVersion($this->getRequestedVersion()); |
|
321 | - // the simulates request really doesn't need any info downstream |
|
322 | - $simulated_request = new WP_REST_Request('GET'); |
|
323 | - // set the caps context on the simulated according to the original request. |
|
324 | - switch ($request->get_method()) { |
|
325 | - case 'POST': |
|
326 | - case 'PUT': |
|
327 | - $caps_context = EEM_Base::caps_edit; |
|
328 | - break; |
|
329 | - case 'DELETE': |
|
330 | - $caps_context = EEM_Base::caps_delete; |
|
331 | - break; |
|
332 | - default: |
|
333 | - $caps_context = EEM_Base::caps_read_admin; |
|
334 | - } |
|
335 | - $simulated_request->set_param('caps', $caps_context); |
|
336 | - return $read_controller->createEntityFromWpdbResult( |
|
337 | - $model_obj->get_model(), |
|
338 | - $simulated_db_row, |
|
339 | - $simulated_request |
|
340 | - ); |
|
341 | - } |
|
294 | + /** |
|
295 | + * Returns an array ready to be converted into a JSON response, based solely on the model object |
|
296 | + * |
|
297 | + * @param EE_Base_Class $model_obj |
|
298 | + * @param WP_REST_Request $request |
|
299 | + * @return array ready for a response |
|
300 | + */ |
|
301 | + protected function returnModelObjAsJsonResponse(EE_Base_Class $model_obj, WP_REST_Request $request) |
|
302 | + { |
|
303 | + $model = $model_obj->get_model(); |
|
304 | + // create an array exactly like the wpdb results row, |
|
305 | + // so we can pass it to controllers/model/Read::create_entity_from_wpdb_result() |
|
306 | + $simulated_db_row = array(); |
|
307 | + foreach ($model->field_settings(true) as $field_name => $field_obj) { |
|
308 | + // we need to reconstruct the normal wpdb results, including the db-only fields |
|
309 | + // like a secondary table's primary key. The models expect those (but don't care what value they have) |
|
310 | + if ($field_obj instanceof EE_DB_Only_Field_Base) { |
|
311 | + $raw_value = true; |
|
312 | + } elseif ($field_obj instanceof EE_Datetime_Field) { |
|
313 | + $raw_value = $model_obj->get_DateTime_object($field_name); |
|
314 | + } else { |
|
315 | + $raw_value = $model_obj->get_raw($field_name); |
|
316 | + } |
|
317 | + $simulated_db_row[ $field_obj->get_qualified_column() ] = $field_obj->prepare_for_use_in_db($raw_value); |
|
318 | + } |
|
319 | + $read_controller = LoaderFactory::getLoader()->getNew('EventEspresso\core\libraries\rest_api\controllers\model\Read'); |
|
320 | + $read_controller->setRequestedVersion($this->getRequestedVersion()); |
|
321 | + // the simulates request really doesn't need any info downstream |
|
322 | + $simulated_request = new WP_REST_Request('GET'); |
|
323 | + // set the caps context on the simulated according to the original request. |
|
324 | + switch ($request->get_method()) { |
|
325 | + case 'POST': |
|
326 | + case 'PUT': |
|
327 | + $caps_context = EEM_Base::caps_edit; |
|
328 | + break; |
|
329 | + case 'DELETE': |
|
330 | + $caps_context = EEM_Base::caps_delete; |
|
331 | + break; |
|
332 | + default: |
|
333 | + $caps_context = EEM_Base::caps_read_admin; |
|
334 | + } |
|
335 | + $simulated_request->set_param('caps', $caps_context); |
|
336 | + return $read_controller->createEntityFromWpdbResult( |
|
337 | + $model_obj->get_model(), |
|
338 | + $simulated_db_row, |
|
339 | + $simulated_request |
|
340 | + ); |
|
341 | + } |
|
342 | 342 | |
343 | 343 | |
344 | - /** |
|
345 | - * Gets the item affected by this request |
|
346 | - * |
|
347 | - * @param EEM_Base $model |
|
348 | - * @param WP_REST_Request $request |
|
349 | - * @param int|string $obj_id |
|
350 | - * @return \WP_Error|array |
|
351 | - */ |
|
352 | - protected function getOneBasedOnRequest(EEM_Base $model, WP_REST_Request $request, $obj_id) |
|
353 | - { |
|
354 | - $requested_version = $this->getRequestedVersion($request->get_route()); |
|
355 | - $get_request = new WP_REST_Request( |
|
356 | - 'GET', |
|
357 | - EED_Core_Rest_Api::ee_api_namespace |
|
358 | - . $requested_version |
|
359 | - . '/' |
|
360 | - . EEH_Inflector::pluralize_and_lower($model->get_this_model_name()) |
|
361 | - . '/' |
|
362 | - . $obj_id |
|
363 | - ); |
|
364 | - $get_request->set_url_params( |
|
365 | - array( |
|
366 | - 'id' => $obj_id, |
|
367 | - 'include' => $request->get_param('include'), |
|
368 | - ) |
|
369 | - ); |
|
370 | - $read_controller = new Read(); |
|
371 | - $read_controller->setRequestedVersion($this->getRequestedVersion()); |
|
372 | - return $read_controller->getEntityFromModel($model, $get_request); |
|
373 | - } |
|
344 | + /** |
|
345 | + * Gets the item affected by this request |
|
346 | + * |
|
347 | + * @param EEM_Base $model |
|
348 | + * @param WP_REST_Request $request |
|
349 | + * @param int|string $obj_id |
|
350 | + * @return \WP_Error|array |
|
351 | + */ |
|
352 | + protected function getOneBasedOnRequest(EEM_Base $model, WP_REST_Request $request, $obj_id) |
|
353 | + { |
|
354 | + $requested_version = $this->getRequestedVersion($request->get_route()); |
|
355 | + $get_request = new WP_REST_Request( |
|
356 | + 'GET', |
|
357 | + EED_Core_Rest_Api::ee_api_namespace |
|
358 | + . $requested_version |
|
359 | + . '/' |
|
360 | + . EEH_Inflector::pluralize_and_lower($model->get_this_model_name()) |
|
361 | + . '/' |
|
362 | + . $obj_id |
|
363 | + ); |
|
364 | + $get_request->set_url_params( |
|
365 | + array( |
|
366 | + 'id' => $obj_id, |
|
367 | + 'include' => $request->get_param('include'), |
|
368 | + ) |
|
369 | + ); |
|
370 | + $read_controller = new Read(); |
|
371 | + $read_controller->setRequestedVersion($this->getRequestedVersion()); |
|
372 | + return $read_controller->getEntityFromModel($model, $get_request); |
|
373 | + } |
|
374 | 374 | |
375 | - /** |
|
376 | - * Adds a relation between the specified models (if it doesn't already exist.) |
|
377 | - * @since 4.9.76.p |
|
378 | - * @param WP_REST_Request $request |
|
379 | - * @return WP_REST_Response |
|
380 | - */ |
|
381 | - public static function handleRequestAddRelation(WP_REST_Request $request, $version, $model_name, $related_model_name) |
|
382 | - { |
|
383 | - $controller = new Write(); |
|
384 | - try { |
|
385 | - $controller->setRequestedVersion($version); |
|
386 | - $main_model = $controller->validateModel($model_name); |
|
387 | - $controller->validateModel($related_model_name); |
|
388 | - return $controller->sendResponse( |
|
389 | - $controller->addRelation( |
|
390 | - $main_model, |
|
391 | - $main_model->related_settings_for($related_model_name), |
|
392 | - $request |
|
393 | - ) |
|
394 | - ); |
|
395 | - } catch (Exception $e) { |
|
396 | - return $controller->sendResponse($e); |
|
397 | - } |
|
398 | - } |
|
375 | + /** |
|
376 | + * Adds a relation between the specified models (if it doesn't already exist.) |
|
377 | + * @since 4.9.76.p |
|
378 | + * @param WP_REST_Request $request |
|
379 | + * @return WP_REST_Response |
|
380 | + */ |
|
381 | + public static function handleRequestAddRelation(WP_REST_Request $request, $version, $model_name, $related_model_name) |
|
382 | + { |
|
383 | + $controller = new Write(); |
|
384 | + try { |
|
385 | + $controller->setRequestedVersion($version); |
|
386 | + $main_model = $controller->validateModel($model_name); |
|
387 | + $controller->validateModel($related_model_name); |
|
388 | + return $controller->sendResponse( |
|
389 | + $controller->addRelation( |
|
390 | + $main_model, |
|
391 | + $main_model->related_settings_for($related_model_name), |
|
392 | + $request |
|
393 | + ) |
|
394 | + ); |
|
395 | + } catch (Exception $e) { |
|
396 | + return $controller->sendResponse($e); |
|
397 | + } |
|
398 | + } |
|
399 | 399 | |
400 | - /** |
|
401 | - * Adds a relation between the two model specified model objects. |
|
402 | - * @since 4.9.76.p |
|
403 | - * @param EEM_Base $model |
|
404 | - * @param EE_Model_Relation_Base $relation |
|
405 | - * @param WP_REST_Request $request |
|
406 | - * @return array |
|
407 | - * @throws EE_Error |
|
408 | - * @throws InvalidArgumentException |
|
409 | - * @throws InvalidDataTypeException |
|
410 | - * @throws InvalidInterfaceException |
|
411 | - * @throws RestException |
|
412 | - * @throws DomainException |
|
413 | - */ |
|
414 | - public function addRelation(EEM_Base $model, EE_Model_Relation_Base $relation, WP_REST_Request $request) |
|
415 | - { |
|
416 | - list($model_obj, $other_obj) = $this->getBothModelObjects($model, $relation, $request); |
|
417 | - $extra_params = array(); |
|
418 | - if ($relation instanceof EE_HABTM_Relation) { |
|
419 | - $extra_params = array_intersect_key( |
|
420 | - ModelDataTranslator::prepareConditionsQueryParamsForModels( |
|
421 | - $request->get_body_params(), |
|
422 | - $relation->get_join_model(), |
|
423 | - $this->getModelVersionInfo()->requestedVersion(), |
|
424 | - true |
|
425 | - ), |
|
426 | - $relation->getNonKeyFields() |
|
427 | - ); |
|
428 | - } |
|
429 | - // Add a relation. |
|
430 | - $related_obj = $model_obj->_add_relation_to( |
|
431 | - $other_obj, |
|
432 | - $relation->get_other_model()->get_this_model_name(), |
|
433 | - $extra_params |
|
434 | - ); |
|
435 | - $response = array( |
|
436 | - strtolower($model->get_this_model_name()) => $this->returnModelObjAsJsonResponse($model_obj, $request), |
|
437 | - strtolower($relation->get_other_model()->get_this_model_name()) => $this->returnModelObjAsJsonResponse($related_obj, $request), |
|
438 | - ); |
|
439 | - if ($relation instanceof EE_HABTM_Relation) { |
|
440 | - $join_model_obj = $relation->get_join_model()->get_one( |
|
441 | - array( |
|
442 | - array( |
|
443 | - $relation->get_join_model()->get_foreign_key_to($model->get_this_model_name())->get_name() => $model_obj->ID(), |
|
444 | - $relation->get_join_model()->get_foreign_key_to($relation->get_other_model()->get_this_model_name())->get_name() => $related_obj->ID() |
|
445 | - ) |
|
446 | - ) |
|
447 | - ); |
|
448 | - $response['join'][ strtolower($relation->get_join_model()->get_this_model_name()) ] = $this->returnModelObjAsJsonResponse($join_model_obj, $request); |
|
449 | - } |
|
450 | - return $response; |
|
451 | - } |
|
400 | + /** |
|
401 | + * Adds a relation between the two model specified model objects. |
|
402 | + * @since 4.9.76.p |
|
403 | + * @param EEM_Base $model |
|
404 | + * @param EE_Model_Relation_Base $relation |
|
405 | + * @param WP_REST_Request $request |
|
406 | + * @return array |
|
407 | + * @throws EE_Error |
|
408 | + * @throws InvalidArgumentException |
|
409 | + * @throws InvalidDataTypeException |
|
410 | + * @throws InvalidInterfaceException |
|
411 | + * @throws RestException |
|
412 | + * @throws DomainException |
|
413 | + */ |
|
414 | + public function addRelation(EEM_Base $model, EE_Model_Relation_Base $relation, WP_REST_Request $request) |
|
415 | + { |
|
416 | + list($model_obj, $other_obj) = $this->getBothModelObjects($model, $relation, $request); |
|
417 | + $extra_params = array(); |
|
418 | + if ($relation instanceof EE_HABTM_Relation) { |
|
419 | + $extra_params = array_intersect_key( |
|
420 | + ModelDataTranslator::prepareConditionsQueryParamsForModels( |
|
421 | + $request->get_body_params(), |
|
422 | + $relation->get_join_model(), |
|
423 | + $this->getModelVersionInfo()->requestedVersion(), |
|
424 | + true |
|
425 | + ), |
|
426 | + $relation->getNonKeyFields() |
|
427 | + ); |
|
428 | + } |
|
429 | + // Add a relation. |
|
430 | + $related_obj = $model_obj->_add_relation_to( |
|
431 | + $other_obj, |
|
432 | + $relation->get_other_model()->get_this_model_name(), |
|
433 | + $extra_params |
|
434 | + ); |
|
435 | + $response = array( |
|
436 | + strtolower($model->get_this_model_name()) => $this->returnModelObjAsJsonResponse($model_obj, $request), |
|
437 | + strtolower($relation->get_other_model()->get_this_model_name()) => $this->returnModelObjAsJsonResponse($related_obj, $request), |
|
438 | + ); |
|
439 | + if ($relation instanceof EE_HABTM_Relation) { |
|
440 | + $join_model_obj = $relation->get_join_model()->get_one( |
|
441 | + array( |
|
442 | + array( |
|
443 | + $relation->get_join_model()->get_foreign_key_to($model->get_this_model_name())->get_name() => $model_obj->ID(), |
|
444 | + $relation->get_join_model()->get_foreign_key_to($relation->get_other_model()->get_this_model_name())->get_name() => $related_obj->ID() |
|
445 | + ) |
|
446 | + ) |
|
447 | + ); |
|
448 | + $response['join'][ strtolower($relation->get_join_model()->get_this_model_name()) ] = $this->returnModelObjAsJsonResponse($join_model_obj, $request); |
|
449 | + } |
|
450 | + return $response; |
|
451 | + } |
|
452 | 452 | |
453 | 453 | |
454 | - /** |
|
455 | - * Removes the relation between the specified models (if it exists). |
|
456 | - * @since 4.9.76.p |
|
457 | - * @param WP_REST_Request $request |
|
458 | - * @return WP_REST_Response |
|
459 | - */ |
|
460 | - public static function handleRequestRemoveRelation(WP_REST_Request $request, $version, $model_name, $related_model_name) |
|
461 | - { |
|
462 | - $controller = new Write(); |
|
463 | - try { |
|
464 | - $controller->setRequestedVersion($version); |
|
465 | - $main_model = $controller->getModelVersionInfo()->loadModel($model_name); |
|
466 | - return $controller->sendResponse( |
|
467 | - $controller->removeRelation( |
|
468 | - $main_model, |
|
469 | - $main_model->related_settings_for($related_model_name), |
|
470 | - $request |
|
471 | - ) |
|
472 | - ); |
|
473 | - } catch (Exception $e) { |
|
474 | - return $controller->sendResponse($e); |
|
475 | - } |
|
476 | - } |
|
454 | + /** |
|
455 | + * Removes the relation between the specified models (if it exists). |
|
456 | + * @since 4.9.76.p |
|
457 | + * @param WP_REST_Request $request |
|
458 | + * @return WP_REST_Response |
|
459 | + */ |
|
460 | + public static function handleRequestRemoveRelation(WP_REST_Request $request, $version, $model_name, $related_model_name) |
|
461 | + { |
|
462 | + $controller = new Write(); |
|
463 | + try { |
|
464 | + $controller->setRequestedVersion($version); |
|
465 | + $main_model = $controller->getModelVersionInfo()->loadModel($model_name); |
|
466 | + return $controller->sendResponse( |
|
467 | + $controller->removeRelation( |
|
468 | + $main_model, |
|
469 | + $main_model->related_settings_for($related_model_name), |
|
470 | + $request |
|
471 | + ) |
|
472 | + ); |
|
473 | + } catch (Exception $e) { |
|
474 | + return $controller->sendResponse($e); |
|
475 | + } |
|
476 | + } |
|
477 | 477 | |
478 | - /** |
|
479 | - * Adds a relation between the two model specified model objects. |
|
480 | - * @since 4.9.76.p |
|
481 | - * @param EEM_Base $model |
|
482 | - * @param EE_Model_Relation_Base $relation |
|
483 | - * @param WP_REST_Request $request |
|
484 | - * @return array |
|
485 | - * @throws DomainException |
|
486 | - * @throws EE_Error |
|
487 | - * @throws InvalidArgumentException |
|
488 | - * @throws InvalidDataTypeException |
|
489 | - * @throws InvalidInterfaceException |
|
490 | - * @throws RestException |
|
491 | - */ |
|
492 | - public function removeRelation(EEM_Base $model, EE_Model_Relation_Base $relation, WP_REST_Request $request) |
|
493 | - { |
|
494 | - // This endpoint doesn't accept body parameters (it's understandable to think it might, so let developers know |
|
495 | - // up-front that it doesn't.) |
|
496 | - if (!empty($request->get_body_params())) { |
|
497 | - $body_params = $request->get_body_params(); |
|
498 | - throw new RestException( |
|
499 | - 'invalid_field', |
|
500 | - sprintf( |
|
501 | - esc_html__('This endpoint doesn\'t accept post body arguments, you sent in %1$s', 'event_espresso'), |
|
502 | - implode(array_keys($body_params)) |
|
503 | - ) |
|
504 | - ); |
|
505 | - } |
|
506 | - list($model_obj, $other_obj) = $this->getBothModelObjects($model, $relation, $request); |
|
507 | - // Remember the old relation, if it used a join entry. |
|
508 | - $join_model_obj = null; |
|
509 | - if ($relation instanceof EE_HABTM_Relation) { |
|
510 | - $join_model_obj = $relation->get_join_model()->get_one( |
|
511 | - array( |
|
512 | - array( |
|
513 | - $model->primary_key_name() => $model_obj->ID(), |
|
514 | - $relation->get_other_model()->primary_key_name() => $other_obj->ID() |
|
515 | - ) |
|
516 | - ) |
|
517 | - ); |
|
518 | - } |
|
519 | - // Remove the relation. |
|
520 | - $related_obj = $model_obj->_remove_relation_to( |
|
521 | - $other_obj, |
|
522 | - $relation->get_other_model()->get_this_model_name() |
|
523 | - ); |
|
524 | - $response = array( |
|
525 | - strtolower($model->get_this_model_name()) => $this->returnModelObjAsJsonResponse($model_obj, $request), |
|
526 | - strtolower($relation->get_other_model()->get_this_model_name()) => $this->returnModelObjAsJsonResponse($related_obj, $request), |
|
527 | - ); |
|
528 | - if ($relation instanceof EE_HABTM_Relation) { |
|
529 | - $join_model_obj_after_removal = $relation->get_join_model()->get_one( |
|
530 | - array( |
|
531 | - array( |
|
532 | - $model->primary_key_name() => $model_obj->ID(), |
|
533 | - $relation->get_other_model()->primary_key_name() => $other_obj->ID() |
|
534 | - ) |
|
535 | - ) |
|
536 | - ); |
|
537 | - if ($join_model_obj instanceof EE_Base_Class) { |
|
538 | - $response['join'][ strtolower($relation->get_join_model()->get_this_model_name()) ] = $this->returnModelObjAsJsonResponse($join_model_obj, $request); |
|
539 | - } else { |
|
540 | - $response['join'][ strtolower($relation->get_join_model()->get_this_model_name()) ] = null; |
|
541 | - } |
|
542 | - } |
|
543 | - return $response; |
|
544 | - } |
|
478 | + /** |
|
479 | + * Adds a relation between the two model specified model objects. |
|
480 | + * @since 4.9.76.p |
|
481 | + * @param EEM_Base $model |
|
482 | + * @param EE_Model_Relation_Base $relation |
|
483 | + * @param WP_REST_Request $request |
|
484 | + * @return array |
|
485 | + * @throws DomainException |
|
486 | + * @throws EE_Error |
|
487 | + * @throws InvalidArgumentException |
|
488 | + * @throws InvalidDataTypeException |
|
489 | + * @throws InvalidInterfaceException |
|
490 | + * @throws RestException |
|
491 | + */ |
|
492 | + public function removeRelation(EEM_Base $model, EE_Model_Relation_Base $relation, WP_REST_Request $request) |
|
493 | + { |
|
494 | + // This endpoint doesn't accept body parameters (it's understandable to think it might, so let developers know |
|
495 | + // up-front that it doesn't.) |
|
496 | + if (!empty($request->get_body_params())) { |
|
497 | + $body_params = $request->get_body_params(); |
|
498 | + throw new RestException( |
|
499 | + 'invalid_field', |
|
500 | + sprintf( |
|
501 | + esc_html__('This endpoint doesn\'t accept post body arguments, you sent in %1$s', 'event_espresso'), |
|
502 | + implode(array_keys($body_params)) |
|
503 | + ) |
|
504 | + ); |
|
505 | + } |
|
506 | + list($model_obj, $other_obj) = $this->getBothModelObjects($model, $relation, $request); |
|
507 | + // Remember the old relation, if it used a join entry. |
|
508 | + $join_model_obj = null; |
|
509 | + if ($relation instanceof EE_HABTM_Relation) { |
|
510 | + $join_model_obj = $relation->get_join_model()->get_one( |
|
511 | + array( |
|
512 | + array( |
|
513 | + $model->primary_key_name() => $model_obj->ID(), |
|
514 | + $relation->get_other_model()->primary_key_name() => $other_obj->ID() |
|
515 | + ) |
|
516 | + ) |
|
517 | + ); |
|
518 | + } |
|
519 | + // Remove the relation. |
|
520 | + $related_obj = $model_obj->_remove_relation_to( |
|
521 | + $other_obj, |
|
522 | + $relation->get_other_model()->get_this_model_name() |
|
523 | + ); |
|
524 | + $response = array( |
|
525 | + strtolower($model->get_this_model_name()) => $this->returnModelObjAsJsonResponse($model_obj, $request), |
|
526 | + strtolower($relation->get_other_model()->get_this_model_name()) => $this->returnModelObjAsJsonResponse($related_obj, $request), |
|
527 | + ); |
|
528 | + if ($relation instanceof EE_HABTM_Relation) { |
|
529 | + $join_model_obj_after_removal = $relation->get_join_model()->get_one( |
|
530 | + array( |
|
531 | + array( |
|
532 | + $model->primary_key_name() => $model_obj->ID(), |
|
533 | + $relation->get_other_model()->primary_key_name() => $other_obj->ID() |
|
534 | + ) |
|
535 | + ) |
|
536 | + ); |
|
537 | + if ($join_model_obj instanceof EE_Base_Class) { |
|
538 | + $response['join'][ strtolower($relation->get_join_model()->get_this_model_name()) ] = $this->returnModelObjAsJsonResponse($join_model_obj, $request); |
|
539 | + } else { |
|
540 | + $response['join'][ strtolower($relation->get_join_model()->get_this_model_name()) ] = null; |
|
541 | + } |
|
542 | + } |
|
543 | + return $response; |
|
544 | + } |
|
545 | 545 | |
546 | - /** |
|
547 | - * Gets the model objects indicated by the model, relation object, and request. |
|
548 | - * Throws an exception if the first object doesn't exist, and currently if the related object also doesn't exist. |
|
549 | - * However, this behaviour may change, as we may add support for simultaneously creating and relating data. |
|
550 | - * @since 4.9.76.p |
|
551 | - * @param EEM_Base $model |
|
552 | - * @param EE_Model_Relation_Base $relation |
|
553 | - * @param WP_REST_Request $request |
|
554 | - * @return array { |
|
555 | - * @type EE_Base_Class $model_obj |
|
556 | - * @type EE_Base_Class|null $other_model_obj |
|
557 | - * } |
|
558 | - * @throws RestException |
|
559 | - */ |
|
560 | - protected function getBothModelObjects(EEM_Base $model, EE_Model_Relation_Base $relation, WP_REST_Request $request) |
|
561 | - { |
|
562 | - // Check generic caps. For now, we're only allowing access to this endpoint to full admins. |
|
563 | - Capabilities::verifyAtLeastPartialAccessTo($model, EEM_Base::caps_edit, 'edit'); |
|
564 | - $default_cap_to_check_for = EE_Restriction_Generator_Base::get_default_restrictions_cap(); |
|
565 | - if (! current_user_can($default_cap_to_check_for)) { |
|
566 | - throw new RestException( |
|
567 | - 'rest_cannot_edit_' . EEH_Inflector::pluralize_and_lower(($model->get_this_model_name())), |
|
568 | - sprintf( |
|
569 | - esc_html__( |
|
570 | - // @codingStandardsIgnoreStart |
|
571 | - 'For now, only those with the admin capability to "%1$s" are allowed to use the REST API to add relations in Event Espresso.', |
|
572 | - // @codingStandardsIgnoreEnd |
|
573 | - 'event_espresso' |
|
574 | - ), |
|
575 | - $default_cap_to_check_for |
|
576 | - ), |
|
577 | - array('status' => 403) |
|
578 | - ); |
|
579 | - } |
|
580 | - // Get the main model object. |
|
581 | - $model_obj = $this->getOneOrThrowException($model, $request->get_param('id')); |
|
582 | - // For now, we require the other model object to exist too. This might be relaxed later. |
|
583 | - $other_obj = $this->getOneOrThrowException($relation->get_other_model(), $request->get_param('related_id')); |
|
584 | - return array($model_obj,$other_obj); |
|
585 | - } |
|
546 | + /** |
|
547 | + * Gets the model objects indicated by the model, relation object, and request. |
|
548 | + * Throws an exception if the first object doesn't exist, and currently if the related object also doesn't exist. |
|
549 | + * However, this behaviour may change, as we may add support for simultaneously creating and relating data. |
|
550 | + * @since 4.9.76.p |
|
551 | + * @param EEM_Base $model |
|
552 | + * @param EE_Model_Relation_Base $relation |
|
553 | + * @param WP_REST_Request $request |
|
554 | + * @return array { |
|
555 | + * @type EE_Base_Class $model_obj |
|
556 | + * @type EE_Base_Class|null $other_model_obj |
|
557 | + * } |
|
558 | + * @throws RestException |
|
559 | + */ |
|
560 | + protected function getBothModelObjects(EEM_Base $model, EE_Model_Relation_Base $relation, WP_REST_Request $request) |
|
561 | + { |
|
562 | + // Check generic caps. For now, we're only allowing access to this endpoint to full admins. |
|
563 | + Capabilities::verifyAtLeastPartialAccessTo($model, EEM_Base::caps_edit, 'edit'); |
|
564 | + $default_cap_to_check_for = EE_Restriction_Generator_Base::get_default_restrictions_cap(); |
|
565 | + if (! current_user_can($default_cap_to_check_for)) { |
|
566 | + throw new RestException( |
|
567 | + 'rest_cannot_edit_' . EEH_Inflector::pluralize_and_lower(($model->get_this_model_name())), |
|
568 | + sprintf( |
|
569 | + esc_html__( |
|
570 | + // @codingStandardsIgnoreStart |
|
571 | + 'For now, only those with the admin capability to "%1$s" are allowed to use the REST API to add relations in Event Espresso.', |
|
572 | + // @codingStandardsIgnoreEnd |
|
573 | + 'event_espresso' |
|
574 | + ), |
|
575 | + $default_cap_to_check_for |
|
576 | + ), |
|
577 | + array('status' => 403) |
|
578 | + ); |
|
579 | + } |
|
580 | + // Get the main model object. |
|
581 | + $model_obj = $this->getOneOrThrowException($model, $request->get_param('id')); |
|
582 | + // For now, we require the other model object to exist too. This might be relaxed later. |
|
583 | + $other_obj = $this->getOneOrThrowException($relation->get_other_model(), $request->get_param('related_id')); |
|
584 | + return array($model_obj,$other_obj); |
|
585 | + } |
|
586 | 586 | |
587 | - /** |
|
588 | - * Gets the model with that ID or throws a REST exception. |
|
589 | - * @since 4.9.76.p |
|
590 | - * @param EEM_Base $model |
|
591 | - * @param $id |
|
592 | - * @return EE_Base_Class |
|
593 | - * @throws RestException |
|
594 | - */ |
|
595 | - protected function getOneOrThrowException(EEM_Base $model, $id) |
|
596 | - { |
|
597 | - $model_obj = $model->get_one_by_ID($id); |
|
598 | - // @todo: check they can permission for it. For now unnecessary because only full admins can use this endpoint. |
|
599 | - if ($model_obj instanceof EE_Base_Class) { |
|
600 | - return $model_obj; |
|
601 | - } |
|
602 | - $lowercase_model_name = strtolower($model->get_this_model_name()); |
|
603 | - throw new RestException( |
|
604 | - sprintf('rest_%s_invalid_id', $lowercase_model_name), |
|
605 | - sprintf(esc_html__('Invalid %s ID.', 'event_espresso'), $lowercase_model_name), |
|
606 | - array('status' => 404) |
|
607 | - ); |
|
608 | - } |
|
587 | + /** |
|
588 | + * Gets the model with that ID or throws a REST exception. |
|
589 | + * @since 4.9.76.p |
|
590 | + * @param EEM_Base $model |
|
591 | + * @param $id |
|
592 | + * @return EE_Base_Class |
|
593 | + * @throws RestException |
|
594 | + */ |
|
595 | + protected function getOneOrThrowException(EEM_Base $model, $id) |
|
596 | + { |
|
597 | + $model_obj = $model->get_one_by_ID($id); |
|
598 | + // @todo: check they can permission for it. For now unnecessary because only full admins can use this endpoint. |
|
599 | + if ($model_obj instanceof EE_Base_Class) { |
|
600 | + return $model_obj; |
|
601 | + } |
|
602 | + $lowercase_model_name = strtolower($model->get_this_model_name()); |
|
603 | + throw new RestException( |
|
604 | + sprintf('rest_%s_invalid_id', $lowercase_model_name), |
|
605 | + sprintf(esc_html__('Invalid %s ID.', 'event_espresso'), $lowercase_model_name), |
|
606 | + array('status' => 404) |
|
607 | + ); |
|
608 | + } |
|
609 | 609 | } |
@@ -37,74 +37,74 @@ |
||
37 | 37 | abstract class ChangesInBase |
38 | 38 | { |
39 | 39 | |
40 | - /** |
|
41 | - * The version that these changes happened |
|
42 | - * |
|
43 | - * @var string |
|
44 | - */ |
|
45 | - protected $version = null; |
|
40 | + /** |
|
41 | + * The version that these changes happened |
|
42 | + * |
|
43 | + * @var string |
|
44 | + */ |
|
45 | + protected $version = null; |
|
46 | 46 | |
47 | 47 | |
48 | - /** |
|
49 | - * Called when an EE4 REST API request is made to an earlier version than |
|
50 | - * what is indicated in this class' name. |
|
51 | - * Uses WordPress' add_filter and add_action to modify the EE4 REST API's response |
|
52 | - * so that regardless of what version of EE4 core is running, API clients |
|
53 | - * will have a consistent response |
|
54 | - * |
|
55 | - * @return void |
|
56 | - */ |
|
57 | - abstract public function setHooks(); |
|
48 | + /** |
|
49 | + * Called when an EE4 REST API request is made to an earlier version than |
|
50 | + * what is indicated in this class' name. |
|
51 | + * Uses WordPress' add_filter and add_action to modify the EE4 REST API's response |
|
52 | + * so that regardless of what version of EE4 core is running, API clients |
|
53 | + * will have a consistent response |
|
54 | + * |
|
55 | + * @return void |
|
56 | + */ |
|
57 | + abstract public function setHooks(); |
|
58 | 58 | |
59 | 59 | |
60 | - /** |
|
61 | - * Returns whether or not this class' name indicates its hooks should |
|
62 | - * apply when a request comes in for $requested_version. A class can use |
|
63 | - * other conditions when determining whether to perform their callbacks or not, |
|
64 | - * but this will typically be enough |
|
65 | - * |
|
66 | - * @param string $requested_version eg "4.8.33" |
|
67 | - * @return boolean true: this class' name indicates its filters and actions |
|
68 | - * should take effect. False: this class' name indicates it shouldn't do anything |
|
69 | - */ |
|
70 | - public function appliesToVersion($requested_version) |
|
71 | - { |
|
72 | - if ($this->version() > $requested_version) { |
|
73 | - return true; |
|
74 | - } |
|
75 | - return false; |
|
76 | - } |
|
60 | + /** |
|
61 | + * Returns whether or not this class' name indicates its hooks should |
|
62 | + * apply when a request comes in for $requested_version. A class can use |
|
63 | + * other conditions when determining whether to perform their callbacks or not, |
|
64 | + * but this will typically be enough |
|
65 | + * |
|
66 | + * @param string $requested_version eg "4.8.33" |
|
67 | + * @return boolean true: this class' name indicates its filters and actions |
|
68 | + * should take effect. False: this class' name indicates it shouldn't do anything |
|
69 | + */ |
|
70 | + public function appliesToVersion($requested_version) |
|
71 | + { |
|
72 | + if ($this->version() > $requested_version) { |
|
73 | + return true; |
|
74 | + } |
|
75 | + return false; |
|
76 | + } |
|
77 | 77 | |
78 | 78 | |
79 | - /** |
|
80 | - * Gets the EE core version when this changes were made to the rest api. |
|
81 | - * Any requests to earlier versions should have modifications made to them |
|
82 | - * by the callbacks of this class. |
|
83 | - * |
|
84 | - * @return string eg "4.8.33" |
|
85 | - * @throws EE_Error |
|
86 | - */ |
|
87 | - public function version() |
|
88 | - { |
|
89 | - if ($this->version === null) { |
|
90 | - $matches = array(); |
|
91 | - $regex = '~ChangesIn(\d)(\d\d)(\d\d)$~'; |
|
92 | - $success = preg_match( |
|
93 | - $regex, |
|
94 | - get_class($this), |
|
95 | - $matches |
|
96 | - ); |
|
97 | - if (! $success) { |
|
98 | - throw new EE_Error( |
|
99 | - sprintf( |
|
100 | - esc_html__('The class %1$s was misnamed. It name should match the regex "%2$s"', 'event_espresso'), |
|
101 | - get_class($this), |
|
102 | - $regex |
|
103 | - ) |
|
104 | - ); |
|
105 | - } |
|
106 | - $this->version = (int) $matches[1] . '.' . (int) $matches[2] . '.' . (int) $matches[3]; |
|
107 | - } |
|
108 | - return $this->version; |
|
109 | - } |
|
79 | + /** |
|
80 | + * Gets the EE core version when this changes were made to the rest api. |
|
81 | + * Any requests to earlier versions should have modifications made to them |
|
82 | + * by the callbacks of this class. |
|
83 | + * |
|
84 | + * @return string eg "4.8.33" |
|
85 | + * @throws EE_Error |
|
86 | + */ |
|
87 | + public function version() |
|
88 | + { |
|
89 | + if ($this->version === null) { |
|
90 | + $matches = array(); |
|
91 | + $regex = '~ChangesIn(\d)(\d\d)(\d\d)$~'; |
|
92 | + $success = preg_match( |
|
93 | + $regex, |
|
94 | + get_class($this), |
|
95 | + $matches |
|
96 | + ); |
|
97 | + if (! $success) { |
|
98 | + throw new EE_Error( |
|
99 | + sprintf( |
|
100 | + esc_html__('The class %1$s was misnamed. It name should match the regex "%2$s"', 'event_espresso'), |
|
101 | + get_class($this), |
|
102 | + $regex |
|
103 | + ) |
|
104 | + ); |
|
105 | + } |
|
106 | + $this->version = (int) $matches[1] . '.' . (int) $matches[2] . '.' . (int) $matches[3]; |
|
107 | + } |
|
108 | + return $this->version; |
|
109 | + } |
|
110 | 110 | } |
@@ -94,7 +94,7 @@ discard block |
||
94 | 94 | get_class($this), |
95 | 95 | $matches |
96 | 96 | ); |
97 | - if (! $success) { |
|
97 | + if ( ! $success) { |
|
98 | 98 | throw new EE_Error( |
99 | 99 | sprintf( |
100 | 100 | esc_html__('The class %1$s was misnamed. It name should match the regex "%2$s"', 'event_espresso'), |
@@ -103,7 +103,7 @@ discard block |
||
103 | 103 | ) |
104 | 104 | ); |
105 | 105 | } |
106 | - $this->version = (int) $matches[1] . '.' . (int) $matches[2] . '.' . (int) $matches[3]; |
|
106 | + $this->version = (int) $matches[1].'.'.(int) $matches[2].'.'.(int) $matches[3]; |
|
107 | 107 | } |
108 | 108 | return $this->version; |
109 | 109 | } |
@@ -17,214 +17,214 @@ |
||
17 | 17 | |
18 | 18 | class Datetime extends DatetimeCalculationBase |
19 | 19 | { |
20 | - /** |
|
21 | - * @var EEM_Datetime |
|
22 | - */ |
|
23 | - protected $datetime_model; |
|
20 | + /** |
|
21 | + * @var EEM_Datetime |
|
22 | + */ |
|
23 | + protected $datetime_model; |
|
24 | 24 | |
25 | - /** |
|
26 | - * @var EEM_Registration |
|
27 | - */ |
|
28 | - protected $registration_model; |
|
29 | - public function __construct(EEM_Datetime $datetime_model, EEM_Registration $registration_model) |
|
30 | - { |
|
31 | - $this->datetime_model = $datetime_model; |
|
32 | - $this->registration_model = $registration_model; |
|
33 | - } |
|
25 | + /** |
|
26 | + * @var EEM_Registration |
|
27 | + */ |
|
28 | + protected $registration_model; |
|
29 | + public function __construct(EEM_Datetime $datetime_model, EEM_Registration $registration_model) |
|
30 | + { |
|
31 | + $this->datetime_model = $datetime_model; |
|
32 | + $this->registration_model = $registration_model; |
|
33 | + } |
|
34 | 34 | |
35 | - /** |
|
36 | - * Calculates the total spaces available on the datetime, taking into account |
|
37 | - * ticket limits too. |
|
38 | - * |
|
39 | - * @see EE_Datetime::spaces_remaining( true ) |
|
40 | - * @param array $wpdb_row |
|
41 | - * @param WP_REST_Request $request |
|
42 | - * @param DatetimeControllerBase $controller |
|
43 | - * @return int |
|
44 | - * @throws EE_Error |
|
45 | - * @throws InvalidDataTypeException |
|
46 | - * @throws InvalidInterfaceException |
|
47 | - * @throws InvalidArgumentException |
|
48 | - * @throws ReflectionException |
|
49 | - */ |
|
50 | - public function spacesRemainingConsideringTickets($wpdb_row, $request, $controller) |
|
51 | - { |
|
52 | - if (is_array($wpdb_row) && isset($wpdb_row['Datetime.DTT_ID'])) { |
|
53 | - $dtt_obj = $this->datetime_model->get_one_by_ID($wpdb_row['Datetime.DTT_ID']); |
|
54 | - } else { |
|
55 | - $dtt_obj = null; |
|
56 | - } |
|
57 | - if ($dtt_obj instanceof EE_Datetime) { |
|
58 | - return $dtt_obj->spaces_remaining(true); |
|
59 | - } |
|
60 | - throw new EE_Error( |
|
61 | - sprintf( |
|
62 | - esc_html__( |
|
63 | - // @codingStandardsIgnoreStart |
|
64 | - 'Cannot calculate spaces_remaining_considering_tickets because the datetime with ID %1$s (from database row %2$s) was not found', |
|
65 | - // @codingStandardsIgnoreEnd |
|
66 | - 'event_espresso' |
|
67 | - ), |
|
68 | - $wpdb_row['Datetime.DTT_ID'], |
|
69 | - print_r($wpdb_row, true) |
|
70 | - ) |
|
71 | - ); |
|
72 | - } |
|
35 | + /** |
|
36 | + * Calculates the total spaces available on the datetime, taking into account |
|
37 | + * ticket limits too. |
|
38 | + * |
|
39 | + * @see EE_Datetime::spaces_remaining( true ) |
|
40 | + * @param array $wpdb_row |
|
41 | + * @param WP_REST_Request $request |
|
42 | + * @param DatetimeControllerBase $controller |
|
43 | + * @return int |
|
44 | + * @throws EE_Error |
|
45 | + * @throws InvalidDataTypeException |
|
46 | + * @throws InvalidInterfaceException |
|
47 | + * @throws InvalidArgumentException |
|
48 | + * @throws ReflectionException |
|
49 | + */ |
|
50 | + public function spacesRemainingConsideringTickets($wpdb_row, $request, $controller) |
|
51 | + { |
|
52 | + if (is_array($wpdb_row) && isset($wpdb_row['Datetime.DTT_ID'])) { |
|
53 | + $dtt_obj = $this->datetime_model->get_one_by_ID($wpdb_row['Datetime.DTT_ID']); |
|
54 | + } else { |
|
55 | + $dtt_obj = null; |
|
56 | + } |
|
57 | + if ($dtt_obj instanceof EE_Datetime) { |
|
58 | + return $dtt_obj->spaces_remaining(true); |
|
59 | + } |
|
60 | + throw new EE_Error( |
|
61 | + sprintf( |
|
62 | + esc_html__( |
|
63 | + // @codingStandardsIgnoreStart |
|
64 | + 'Cannot calculate spaces_remaining_considering_tickets because the datetime with ID %1$s (from database row %2$s) was not found', |
|
65 | + // @codingStandardsIgnoreEnd |
|
66 | + 'event_espresso' |
|
67 | + ), |
|
68 | + $wpdb_row['Datetime.DTT_ID'], |
|
69 | + print_r($wpdb_row, true) |
|
70 | + ) |
|
71 | + ); |
|
72 | + } |
|
73 | 73 | |
74 | 74 | |
75 | - /** |
|
76 | - * Counts registrations who have checked into this datetime |
|
77 | - * |
|
78 | - * @param array $wpdb_row |
|
79 | - * @param WP_REST_Request $request |
|
80 | - * @param DatetimeControllerBase $controller |
|
81 | - * @return int |
|
82 | - * @throws EE_Error |
|
83 | - * @throws InvalidArgumentException |
|
84 | - * @throws InvalidDataTypeException |
|
85 | - * @throws InvalidInterfaceException |
|
86 | - * @throws RestException |
|
87 | - */ |
|
88 | - public function registrationsCheckedInCount($wpdb_row, $request, $controller) |
|
89 | - { |
|
90 | - if (! is_array($wpdb_row) || ! isset($wpdb_row['Datetime.DTT_ID'])) { |
|
91 | - throw new EE_Error( |
|
92 | - sprintf( |
|
93 | - esc_html__( |
|
94 | - // @codingStandardsIgnoreStart |
|
95 | - 'Cannot calculate registrations_checked_in_count because the database row %1$s does not have an entry for "Datetime.DTT_ID"', |
|
96 | - // @codingStandardsIgnoreEnd |
|
97 | - 'event_espresso' |
|
98 | - ), |
|
99 | - print_r($wpdb_row, true) |
|
100 | - ) |
|
101 | - ); |
|
102 | - } |
|
103 | - $this->verifyCurrentUserCan('ee_read_checkins', 'registrations_checked_in_count'); |
|
104 | - return $this->registration_model |
|
105 | - ->count_registrations_checked_into_datetime($wpdb_row['Datetime.DTT_ID'], true); |
|
106 | - } |
|
75 | + /** |
|
76 | + * Counts registrations who have checked into this datetime |
|
77 | + * |
|
78 | + * @param array $wpdb_row |
|
79 | + * @param WP_REST_Request $request |
|
80 | + * @param DatetimeControllerBase $controller |
|
81 | + * @return int |
|
82 | + * @throws EE_Error |
|
83 | + * @throws InvalidArgumentException |
|
84 | + * @throws InvalidDataTypeException |
|
85 | + * @throws InvalidInterfaceException |
|
86 | + * @throws RestException |
|
87 | + */ |
|
88 | + public function registrationsCheckedInCount($wpdb_row, $request, $controller) |
|
89 | + { |
|
90 | + if (! is_array($wpdb_row) || ! isset($wpdb_row['Datetime.DTT_ID'])) { |
|
91 | + throw new EE_Error( |
|
92 | + sprintf( |
|
93 | + esc_html__( |
|
94 | + // @codingStandardsIgnoreStart |
|
95 | + 'Cannot calculate registrations_checked_in_count because the database row %1$s does not have an entry for "Datetime.DTT_ID"', |
|
96 | + // @codingStandardsIgnoreEnd |
|
97 | + 'event_espresso' |
|
98 | + ), |
|
99 | + print_r($wpdb_row, true) |
|
100 | + ) |
|
101 | + ); |
|
102 | + } |
|
103 | + $this->verifyCurrentUserCan('ee_read_checkins', 'registrations_checked_in_count'); |
|
104 | + return $this->registration_model |
|
105 | + ->count_registrations_checked_into_datetime($wpdb_row['Datetime.DTT_ID'], true); |
|
106 | + } |
|
107 | 107 | |
108 | 108 | |
109 | - /** |
|
110 | - * Counts registrations who have checked out of this datetime |
|
111 | - * |
|
112 | - * @param array $wpdb_row |
|
113 | - * @param WP_REST_Request $request |
|
114 | - * @param DatetimeControllerBase $controller |
|
115 | - * @return int |
|
116 | - * @throws EE_Error |
|
117 | - * @throws InvalidArgumentException |
|
118 | - * @throws InvalidDataTypeException |
|
119 | - * @throws InvalidInterfaceException |
|
120 | - * @throws RestException |
|
121 | - */ |
|
122 | - public function registrationsCheckedOutCount($wpdb_row, $request, $controller) |
|
123 | - { |
|
124 | - if (! is_array($wpdb_row) || ! isset($wpdb_row['Datetime.DTT_ID'])) { |
|
125 | - throw new EE_Error( |
|
126 | - sprintf( |
|
127 | - esc_html__( |
|
128 | - // @codingStandardsIgnoreStart |
|
129 | - 'Cannot calculate registrations_checked_out_count because the database row %1$s does not have an entry for "Datetime.DTT_ID"', |
|
130 | - // @codingStandardsIgnoreEnd |
|
131 | - 'event_espresso' |
|
132 | - ), |
|
133 | - print_r($wpdb_row, true) |
|
134 | - ) |
|
135 | - ); |
|
136 | - } |
|
137 | - $this->verifyCurrentUserCan('ee_read_checkins', 'registrations_checked_out_count'); |
|
138 | - return $this->registration_model |
|
139 | - ->count_registrations_checked_into_datetime($wpdb_row['Datetime.DTT_ID'], false); |
|
140 | - } |
|
109 | + /** |
|
110 | + * Counts registrations who have checked out of this datetime |
|
111 | + * |
|
112 | + * @param array $wpdb_row |
|
113 | + * @param WP_REST_Request $request |
|
114 | + * @param DatetimeControllerBase $controller |
|
115 | + * @return int |
|
116 | + * @throws EE_Error |
|
117 | + * @throws InvalidArgumentException |
|
118 | + * @throws InvalidDataTypeException |
|
119 | + * @throws InvalidInterfaceException |
|
120 | + * @throws RestException |
|
121 | + */ |
|
122 | + public function registrationsCheckedOutCount($wpdb_row, $request, $controller) |
|
123 | + { |
|
124 | + if (! is_array($wpdb_row) || ! isset($wpdb_row['Datetime.DTT_ID'])) { |
|
125 | + throw new EE_Error( |
|
126 | + sprintf( |
|
127 | + esc_html__( |
|
128 | + // @codingStandardsIgnoreStart |
|
129 | + 'Cannot calculate registrations_checked_out_count because the database row %1$s does not have an entry for "Datetime.DTT_ID"', |
|
130 | + // @codingStandardsIgnoreEnd |
|
131 | + 'event_espresso' |
|
132 | + ), |
|
133 | + print_r($wpdb_row, true) |
|
134 | + ) |
|
135 | + ); |
|
136 | + } |
|
137 | + $this->verifyCurrentUserCan('ee_read_checkins', 'registrations_checked_out_count'); |
|
138 | + return $this->registration_model |
|
139 | + ->count_registrations_checked_into_datetime($wpdb_row['Datetime.DTT_ID'], false); |
|
140 | + } |
|
141 | 141 | |
142 | 142 | |
143 | - /** |
|
144 | - * Counts the number of pending-payment registrations for this event (regardless |
|
145 | - * of how many datetimes each registrations' ticket purchase is for) |
|
146 | - * |
|
147 | - * @param array $wpdb_row |
|
148 | - * @param WP_REST_Request $request |
|
149 | - * @param DatetimeControllerBase $controller |
|
150 | - * @return int |
|
151 | - * @throws EE_Error |
|
152 | - * @throws InvalidArgumentException |
|
153 | - * @throws InvalidDataTypeException |
|
154 | - * @throws InvalidInterfaceException |
|
155 | - * @throws RestException |
|
156 | - */ |
|
157 | - public function spotsTakenPendingPayment($wpdb_row, $request, $controller) |
|
158 | - { |
|
159 | - if (! is_array($wpdb_row) || ! isset($wpdb_row['Datetime.DTT_ID'])) { |
|
160 | - throw new EE_Error( |
|
161 | - sprintf( |
|
162 | - esc_html__( |
|
163 | - // @codingStandardsIgnoreStart |
|
164 | - 'Cannot calculate spots_taken_pending_payment because the database row %1$s does not have an entry for "Datetime.DTT_ID"', |
|
165 | - // @codingStandardsIgnoreEnd |
|
166 | - 'event_espresso' |
|
167 | - ), |
|
168 | - print_r($wpdb_row, true) |
|
169 | - ) |
|
170 | - ); |
|
171 | - } |
|
172 | - $this->verifyCurrentUserCan('ee_read_registrations', 'spots_taken_pending_payment'); |
|
173 | - return $this->registration_model->count( |
|
174 | - array( |
|
175 | - array( |
|
176 | - 'Ticket.Datetime.DTT_ID' => $wpdb_row['Datetime.DTT_ID'], |
|
177 | - 'STS_ID' => EEM_Registration::status_id_pending_payment, |
|
178 | - ), |
|
179 | - ), |
|
180 | - 'REG_ID', |
|
181 | - true |
|
182 | - ); |
|
183 | - } |
|
143 | + /** |
|
144 | + * Counts the number of pending-payment registrations for this event (regardless |
|
145 | + * of how many datetimes each registrations' ticket purchase is for) |
|
146 | + * |
|
147 | + * @param array $wpdb_row |
|
148 | + * @param WP_REST_Request $request |
|
149 | + * @param DatetimeControllerBase $controller |
|
150 | + * @return int |
|
151 | + * @throws EE_Error |
|
152 | + * @throws InvalidArgumentException |
|
153 | + * @throws InvalidDataTypeException |
|
154 | + * @throws InvalidInterfaceException |
|
155 | + * @throws RestException |
|
156 | + */ |
|
157 | + public function spotsTakenPendingPayment($wpdb_row, $request, $controller) |
|
158 | + { |
|
159 | + if (! is_array($wpdb_row) || ! isset($wpdb_row['Datetime.DTT_ID'])) { |
|
160 | + throw new EE_Error( |
|
161 | + sprintf( |
|
162 | + esc_html__( |
|
163 | + // @codingStandardsIgnoreStart |
|
164 | + 'Cannot calculate spots_taken_pending_payment because the database row %1$s does not have an entry for "Datetime.DTT_ID"', |
|
165 | + // @codingStandardsIgnoreEnd |
|
166 | + 'event_espresso' |
|
167 | + ), |
|
168 | + print_r($wpdb_row, true) |
|
169 | + ) |
|
170 | + ); |
|
171 | + } |
|
172 | + $this->verifyCurrentUserCan('ee_read_registrations', 'spots_taken_pending_payment'); |
|
173 | + return $this->registration_model->count( |
|
174 | + array( |
|
175 | + array( |
|
176 | + 'Ticket.Datetime.DTT_ID' => $wpdb_row['Datetime.DTT_ID'], |
|
177 | + 'STS_ID' => EEM_Registration::status_id_pending_payment, |
|
178 | + ), |
|
179 | + ), |
|
180 | + 'REG_ID', |
|
181 | + true |
|
182 | + ); |
|
183 | + } |
|
184 | 184 | |
185 | 185 | |
186 | - /** |
|
187 | - * Provides an array for all the calculations possible that outlines a json schema for those calculations. |
|
188 | - * Array is indexed by calculation (snake case) and value is the schema for that calculation. |
|
189 | - * |
|
190 | - * @since 4.9.68.p |
|
191 | - * @return array |
|
192 | - */ |
|
193 | - public function schemaForCalculations() |
|
194 | - { |
|
195 | - return array( |
|
196 | - 'spaces_remaining_considering_tickets' => array( |
|
197 | - 'description' => esc_html__( |
|
198 | - 'Calculates the total spaces available on the datetime, taking into account ticket limits too.', |
|
199 | - 'event_espresso' |
|
200 | - ), |
|
201 | - 'type' => 'number', |
|
202 | - 'protected' => true, |
|
203 | - ), |
|
204 | - 'registrations_checked_in_count' => array( |
|
205 | - 'description' => esc_html__( |
|
206 | - 'Counts registrations who have checked into this datetime.', |
|
207 | - 'event_espresso' |
|
208 | - ), |
|
209 | - 'type' => 'number', |
|
210 | - 'protected' => true, |
|
211 | - ), |
|
212 | - 'registrations_checked_out_count' => array( |
|
213 | - 'description' => esc_html__( |
|
214 | - 'Counts registrations who have checked out of this datetime.', |
|
215 | - 'event_espresso' |
|
216 | - ), |
|
217 | - 'type' => 'number', |
|
218 | - 'protected' => true, |
|
219 | - ), |
|
220 | - 'spots_taken_pending_payment' => array( |
|
221 | - 'description' => esc_html__( |
|
222 | - 'The count of pending-payment registrations for this event (regardless of how many datetimes each registration\'s ticket purchase is for', |
|
223 | - 'event_espresso' |
|
224 | - ), |
|
225 | - 'type' => 'number', |
|
226 | - 'protected' => true, |
|
227 | - ), |
|
228 | - ); |
|
229 | - } |
|
186 | + /** |
|
187 | + * Provides an array for all the calculations possible that outlines a json schema for those calculations. |
|
188 | + * Array is indexed by calculation (snake case) and value is the schema for that calculation. |
|
189 | + * |
|
190 | + * @since 4.9.68.p |
|
191 | + * @return array |
|
192 | + */ |
|
193 | + public function schemaForCalculations() |
|
194 | + { |
|
195 | + return array( |
|
196 | + 'spaces_remaining_considering_tickets' => array( |
|
197 | + 'description' => esc_html__( |
|
198 | + 'Calculates the total spaces available on the datetime, taking into account ticket limits too.', |
|
199 | + 'event_espresso' |
|
200 | + ), |
|
201 | + 'type' => 'number', |
|
202 | + 'protected' => true, |
|
203 | + ), |
|
204 | + 'registrations_checked_in_count' => array( |
|
205 | + 'description' => esc_html__( |
|
206 | + 'Counts registrations who have checked into this datetime.', |
|
207 | + 'event_espresso' |
|
208 | + ), |
|
209 | + 'type' => 'number', |
|
210 | + 'protected' => true, |
|
211 | + ), |
|
212 | + 'registrations_checked_out_count' => array( |
|
213 | + 'description' => esc_html__( |
|
214 | + 'Counts registrations who have checked out of this datetime.', |
|
215 | + 'event_espresso' |
|
216 | + ), |
|
217 | + 'type' => 'number', |
|
218 | + 'protected' => true, |
|
219 | + ), |
|
220 | + 'spots_taken_pending_payment' => array( |
|
221 | + 'description' => esc_html__( |
|
222 | + 'The count of pending-payment registrations for this event (regardless of how many datetimes each registration\'s ticket purchase is for', |
|
223 | + 'event_espresso' |
|
224 | + ), |
|
225 | + 'type' => 'number', |
|
226 | + 'protected' => true, |
|
227 | + ), |
|
228 | + ); |
|
229 | + } |
|
230 | 230 | } |
@@ -87,7 +87,7 @@ discard block |
||
87 | 87 | */ |
88 | 88 | public function registrationsCheckedInCount($wpdb_row, $request, $controller) |
89 | 89 | { |
90 | - if (! is_array($wpdb_row) || ! isset($wpdb_row['Datetime.DTT_ID'])) { |
|
90 | + if ( ! is_array($wpdb_row) || ! isset($wpdb_row['Datetime.DTT_ID'])) { |
|
91 | 91 | throw new EE_Error( |
92 | 92 | sprintf( |
93 | 93 | esc_html__( |
@@ -121,7 +121,7 @@ discard block |
||
121 | 121 | */ |
122 | 122 | public function registrationsCheckedOutCount($wpdb_row, $request, $controller) |
123 | 123 | { |
124 | - if (! is_array($wpdb_row) || ! isset($wpdb_row['Datetime.DTT_ID'])) { |
|
124 | + if ( ! is_array($wpdb_row) || ! isset($wpdb_row['Datetime.DTT_ID'])) { |
|
125 | 125 | throw new EE_Error( |
126 | 126 | sprintf( |
127 | 127 | esc_html__( |
@@ -156,7 +156,7 @@ discard block |
||
156 | 156 | */ |
157 | 157 | public function spotsTakenPendingPayment($wpdb_row, $request, $controller) |
158 | 158 | { |
159 | - if (! is_array($wpdb_row) || ! isset($wpdb_row['Datetime.DTT_ID'])) { |
|
159 | + if ( ! is_array($wpdb_row) || ! isset($wpdb_row['Datetime.DTT_ID'])) { |
|
160 | 160 | throw new EE_Error( |
161 | 161 | sprintf( |
162 | 162 | esc_html__( |
@@ -26,571 +26,571 @@ |
||
26 | 26 | */ |
27 | 27 | class Event extends EventCalculationBase |
28 | 28 | { |
29 | - /** |
|
30 | - * @var EEM_Event |
|
31 | - */ |
|
32 | - protected $event_model; |
|
33 | - |
|
34 | - /** |
|
35 | - * @var EEM_Registration |
|
36 | - */ |
|
37 | - protected $registration_model; |
|
38 | - public function __construct(EEM_Event $event_model, EEM_Registration $registration_model) |
|
39 | - { |
|
40 | - $this->event_model = $event_model; |
|
41 | - $this->registration_model = $registration_model; |
|
42 | - } |
|
43 | - |
|
44 | - /** |
|
45 | - * Calculates the total spaces on the event (not subtracting sales, but taking |
|
46 | - * sales into account; so this is the optimum sales that CAN still be achieved) |
|
47 | - * See EE_Event::total_available_spaces( true ); |
|
48 | - * |
|
49 | - * @param array $wpdb_row |
|
50 | - * @param WP_REST_Request $request |
|
51 | - * @param EventControllerBase $controller |
|
52 | - * @return int |
|
53 | - * @throws EE_Error |
|
54 | - * @throws DomainException |
|
55 | - * @throws InvalidDataTypeException |
|
56 | - * @throws InvalidInterfaceException |
|
57 | - * @throws UnexpectedEntityException |
|
58 | - * @throws InvalidArgumentException |
|
59 | - */ |
|
60 | - public function optimumSalesAtStart($wpdb_row, $request, $controller) |
|
61 | - { |
|
62 | - $event_obj = null; |
|
63 | - if (Event::wpdbRowHasEventId($wpdb_row)) { |
|
64 | - $event_obj = $this->event_model->get_one_by_ID($wpdb_row['Event_CPT.ID']); |
|
65 | - } |
|
66 | - if ($event_obj instanceof EE_Event) { |
|
67 | - return $event_obj->total_available_spaces(); |
|
68 | - } |
|
69 | - throw new EE_Error( |
|
70 | - sprintf( |
|
71 | - esc_html__( |
|
72 | - // @codingStandardsIgnoreStart |
|
73 | - 'Cannot calculate optimum_sales_at_start because the event with ID %1$s (from database row %2$s) was not found', |
|
74 | - // @codingStandardsIgnoreEnd |
|
75 | - 'event_espresso' |
|
76 | - ), |
|
77 | - $wpdb_row['Event_CPT.ID'], |
|
78 | - print_r($wpdb_row, true) |
|
79 | - ) |
|
80 | - ); |
|
81 | - } |
|
82 | - |
|
83 | - |
|
84 | - /** |
|
85 | - * Calculates the total spaces on the event (ignoring all sales; so this is the optimum |
|
86 | - * sales that COULD have been achieved) |
|
87 | - * See EE_Event::total_available_spaces( true ); |
|
88 | - * |
|
89 | - * @param array $wpdb_row |
|
90 | - * @param WP_REST_Request $request |
|
91 | - * @param EventControllerBase $controller |
|
92 | - * @return int |
|
93 | - * @throws DomainException |
|
94 | - * @throws EE_Error |
|
95 | - * @throws InvalidArgumentException |
|
96 | - * @throws InvalidDataTypeException |
|
97 | - * @throws InvalidInterfaceException |
|
98 | - * @throws UnexpectedEntityException |
|
99 | - */ |
|
100 | - public function optimumSalesNow($wpdb_row, $request, $controller) |
|
101 | - { |
|
102 | - $event_obj = null; |
|
103 | - if (Event::wpdbRowHasEventId($wpdb_row)) { |
|
104 | - $event_obj = $this->event_model->get_one_by_ID($wpdb_row['Event_CPT.ID']); |
|
105 | - } |
|
106 | - if ($event_obj instanceof EE_Event) { |
|
107 | - return $event_obj->total_available_spaces(true); |
|
108 | - } |
|
109 | - throw new EE_Error( |
|
110 | - sprintf( |
|
111 | - esc_html__( |
|
112 | - // @codingStandardsIgnoreStart |
|
113 | - 'Cannot calculate optimum_sales_now because the event with ID %1$s (from database row %2$s) was not found', |
|
114 | - // @codingStandardsIgnoreEnd |
|
115 | - 'event_espresso' |
|
116 | - ), |
|
117 | - $wpdb_row['Event_CPT.ID'], |
|
118 | - print_r($wpdb_row, true) |
|
119 | - ) |
|
120 | - ); |
|
121 | - } |
|
122 | - |
|
123 | - |
|
124 | - /** |
|
125 | - * Like optimum_sales_now, but minus total sales so far. |
|
126 | - * See EE_Event::spaces_remaining_for_sale( true ); |
|
127 | - * |
|
128 | - * @param array $wpdb_row |
|
129 | - * @param WP_REST_Request $request |
|
130 | - * @param EventControllerBase $controller |
|
131 | - * @return int |
|
132 | - * @throws DomainException |
|
133 | - * @throws EE_Error |
|
134 | - * @throws InvalidArgumentException |
|
135 | - * @throws InvalidDataTypeException |
|
136 | - * @throws InvalidInterfaceException |
|
137 | - * @throws UnexpectedEntityException |
|
138 | - */ |
|
139 | - public function spacesRemaining($wpdb_row, $request, $controller) |
|
140 | - { |
|
141 | - $event_obj = null; |
|
142 | - if (Event::wpdbRowHasEventId($wpdb_row)) { |
|
143 | - $event_obj = $this->event_model->get_one_by_ID($wpdb_row['Event_CPT.ID']); |
|
144 | - } |
|
145 | - if ($event_obj instanceof EE_Event) { |
|
146 | - return $event_obj->spaces_remaining_for_sale(); |
|
147 | - } |
|
148 | - throw new EE_Error( |
|
149 | - sprintf( |
|
150 | - esc_html__( |
|
151 | - // @codingStandardsIgnoreStart |
|
152 | - 'Cannot calculate spaces_remaining because the event with ID %1$s (from database row %2$s) was not found', |
|
153 | - // @codingStandardsIgnoreEnd |
|
154 | - 'event_espresso' |
|
155 | - ), |
|
156 | - $wpdb_row['Event_CPT.ID'], |
|
157 | - print_r($wpdb_row, true) |
|
158 | - ) |
|
159 | - ); |
|
160 | - } |
|
161 | - |
|
162 | - |
|
163 | - /** |
|
164 | - * Counts the number of approved registrations for this event (regardless |
|
165 | - * of how many datetimes each registrations' ticket purchase is for) |
|
166 | - * |
|
167 | - * @param array $wpdb_row |
|
168 | - * @param WP_REST_Request $request |
|
169 | - * @param EventControllerBase $controller |
|
170 | - * @return int |
|
171 | - * @throws EE_Error |
|
172 | - * @throws InvalidArgumentException |
|
173 | - * @throws InvalidDataTypeException |
|
174 | - * @throws InvalidInterfaceException |
|
175 | - */ |
|
176 | - public function spotsTaken($wpdb_row, $request, $controller) |
|
177 | - { |
|
178 | - if (! Event::wpdbRowHasEventId($wpdb_row)) { |
|
179 | - throw new EE_Error( |
|
180 | - sprintf( |
|
181 | - esc_html__( |
|
182 | - // @codingStandardsIgnoreStart |
|
183 | - 'Cannot calculate spots_taken because the database row %1$s does not have a valid entry for "Event_CPT.ID"', |
|
184 | - // @codingStandardsIgnoreEnd |
|
185 | - 'event_espresso' |
|
186 | - ), |
|
187 | - print_r($wpdb_row, true) |
|
188 | - ) |
|
189 | - ); |
|
190 | - } |
|
191 | - return $this->registration_model->count( |
|
192 | - array( |
|
193 | - array( |
|
194 | - 'EVT_ID' => $wpdb_row['Event_CPT.ID'], |
|
195 | - 'STS_ID' => EEM_Registration::status_id_approved, |
|
196 | - ), |
|
197 | - ), |
|
198 | - 'REG_ID', |
|
199 | - true |
|
200 | - ); |
|
201 | - } |
|
202 | - |
|
203 | - |
|
204 | - /** |
|
205 | - * Counts the number of pending-payment registrations for this event (regardless |
|
206 | - * of how many datetimes each registrations' ticket purchase is for) |
|
207 | - * |
|
208 | - * @param array $wpdb_row |
|
209 | - * @param WP_REST_Request $request |
|
210 | - * @param EventControllerBase $controller |
|
211 | - * @return int |
|
212 | - * @throws EE_Error |
|
213 | - * @throws InvalidArgumentException |
|
214 | - * @throws InvalidDataTypeException |
|
215 | - * @throws InvalidInterfaceException |
|
216 | - * @throws RestException |
|
217 | - */ |
|
218 | - public function spotsTakenPendingPayment($wpdb_row, $request, $controller) |
|
219 | - { |
|
220 | - if (! Event::wpdbRowHasEventId($wpdb_row)) { |
|
221 | - throw new EE_Error( |
|
222 | - sprintf( |
|
223 | - esc_html__( |
|
224 | - // @codingStandardsIgnoreStart |
|
225 | - 'Cannot calculate spots_taken_pending_payment because the database row %1$s does not have an entry for "Event_CPT.ID"', |
|
226 | - // @codingStandardsIgnoreEnd |
|
227 | - 'event_espresso' |
|
228 | - ), |
|
229 | - print_r($wpdb_row, true) |
|
230 | - ) |
|
231 | - ); |
|
232 | - } |
|
233 | - $this->verifyCurrentUserCan('ee_read_registrations', 'spots_taken_pending_payment'); |
|
234 | - return $this->registration_model->count( |
|
235 | - array( |
|
236 | - array( |
|
237 | - 'EVT_ID' => $wpdb_row['Event_CPT.ID'], |
|
238 | - 'STS_ID' => EEM_Registration::status_id_pending_payment, |
|
239 | - ), |
|
240 | - ), |
|
241 | - 'REG_ID', |
|
242 | - true |
|
243 | - ); |
|
244 | - } |
|
245 | - |
|
246 | - |
|
247 | - /** |
|
248 | - * Counts all the registrations who have checked into one of this events' datetimes |
|
249 | - * See EE_Event::total_available_spaces( false ); |
|
250 | - * |
|
251 | - * @param array $wpdb_row |
|
252 | - * @param WP_REST_Request $request |
|
253 | - * @param EventControllerBase $controller |
|
254 | - * @return int|null if permission denied |
|
255 | - * @throws EE_Error |
|
256 | - * @throws InvalidArgumentException |
|
257 | - * @throws InvalidDataTypeException |
|
258 | - * @throws InvalidInterfaceException |
|
259 | - * @throws RestException |
|
260 | - */ |
|
261 | - public function registrationsCheckedInCount($wpdb_row, $request, $controller) |
|
262 | - { |
|
263 | - if (! Event::wpdbRowHasEventId($wpdb_row)) { |
|
264 | - throw new EE_Error( |
|
265 | - sprintf( |
|
266 | - esc_html__( |
|
267 | - // @codingStandardsIgnoreStart |
|
268 | - 'Cannot calculate registrations_checked_in_count because the database row %1$s does not have an entry for "Event_CPT.ID"', |
|
269 | - // @codingStandardsIgnoreEnd |
|
270 | - 'event_espresso' |
|
271 | - ), |
|
272 | - print_r($wpdb_row, true) |
|
273 | - ) |
|
274 | - ); |
|
275 | - } |
|
276 | - $this->verifyCurrentUserCan('ee_read_checkins', 'registrations_checked_in_count'); |
|
277 | - return $this->registration_model->count_registrations_checked_into_event($wpdb_row['Event_CPT.ID'], true); |
|
278 | - } |
|
279 | - |
|
280 | - |
|
281 | - /** |
|
282 | - * Counts all the registrations who have checked out of one of this events' datetimes |
|
283 | - * See EE_Event::total_available_spaces( false ); |
|
284 | - * |
|
285 | - * @param array $wpdb_row |
|
286 | - * @param WP_REST_Request $request |
|
287 | - * @param EventControllerBase $controller |
|
288 | - * @return int |
|
289 | - * @throws EE_Error |
|
290 | - * @throws InvalidArgumentException |
|
291 | - * @throws InvalidDataTypeException |
|
292 | - * @throws InvalidInterfaceException |
|
293 | - * @throws RestException |
|
294 | - */ |
|
295 | - public function registrationsCheckedOutCount($wpdb_row, $request, $controller) |
|
296 | - { |
|
297 | - if (! Event::wpdbRowHasEventId($wpdb_row)) { |
|
298 | - throw new EE_Error( |
|
299 | - sprintf( |
|
300 | - esc_html__( |
|
301 | - // @codingStandardsIgnoreStart |
|
302 | - 'Cannot calculate registrations_checked_out_count because the database row %1$s does not have an entry for "Event_CPT.ID"', |
|
303 | - // @codingStandardsIgnoreEnd |
|
304 | - 'event_espresso' |
|
305 | - ), |
|
306 | - print_r($wpdb_row, true) |
|
307 | - ) |
|
308 | - ); |
|
309 | - } |
|
310 | - $this->verifyCurrentUserCan('ee_read_checkins', 'registrations_checked_out_count'); |
|
311 | - return $this->registration_model->count_registrations_checked_into_event($wpdb_row['Event_CPT.ID'], false); |
|
312 | - } |
|
313 | - |
|
314 | - |
|
315 | - /** |
|
316 | - * Gets the thumbnail image |
|
317 | - * |
|
318 | - * @param array $wpdb_row |
|
319 | - * @param WP_REST_Request $request |
|
320 | - * @param EventControllerBase $controller |
|
321 | - * @return array |
|
322 | - * @throws EE_Error |
|
323 | - */ |
|
324 | - public function imageThumbnail($wpdb_row, $request, $controller) |
|
325 | - { |
|
326 | - return self::calculateImageData($wpdb_row, 'thumbnail'); |
|
327 | - } |
|
328 | - |
|
329 | - |
|
330 | - /** |
|
331 | - * Gets the medium image |
|
332 | - * |
|
333 | - * @param array $wpdb_row |
|
334 | - * @param WP_REST_Request $request |
|
335 | - * @param EventControllerBase $controller |
|
336 | - * @return array |
|
337 | - * @throws EE_Error |
|
338 | - */ |
|
339 | - public function imageMedium($wpdb_row, $request, $controller) |
|
340 | - { |
|
341 | - return self::calculateImageData($wpdb_row, 'medium'); |
|
342 | - } |
|
343 | - |
|
344 | - |
|
345 | - /** |
|
346 | - * Gets the medium-large image |
|
347 | - * |
|
348 | - * @param array $wpdb_row |
|
349 | - * @param WP_REST_Request $request |
|
350 | - * @param EventControllerBase $controller |
|
351 | - * @return array |
|
352 | - * @throws EE_Error |
|
353 | - */ |
|
354 | - public function imageMediumLarge($wpdb_row, $request, $controller) |
|
355 | - { |
|
356 | - return self::calculateImageData($wpdb_row, 'medium_large'); |
|
357 | - } |
|
358 | - |
|
359 | - |
|
360 | - /** |
|
361 | - * Gets the large image |
|
362 | - * |
|
363 | - * @param array $wpdb_row |
|
364 | - * @param WP_REST_Request $request |
|
365 | - * @param EventControllerBase $controller |
|
366 | - * @return array |
|
367 | - * @throws EE_Error |
|
368 | - */ |
|
369 | - public function imageLarge($wpdb_row, $request, $controller) |
|
370 | - { |
|
371 | - return self::calculateImageData($wpdb_row, 'large'); |
|
372 | - } |
|
373 | - |
|
374 | - |
|
375 | - /** |
|
376 | - * Gets the post-thumbnail image |
|
377 | - * |
|
378 | - * @param array $wpdb_row |
|
379 | - * @param WP_REST_Request $request |
|
380 | - * @param EventControllerBase $controller |
|
381 | - * @return array |
|
382 | - * @throws EE_Error |
|
383 | - */ |
|
384 | - public function imagePostThumbnail($wpdb_row, $request, $controller) |
|
385 | - { |
|
386 | - return self::calculateImageData($wpdb_row, 'post-thumbnail'); |
|
387 | - } |
|
388 | - |
|
389 | - |
|
390 | - /** |
|
391 | - * Gets the full size image |
|
392 | - * |
|
393 | - * @param array $wpdb_row |
|
394 | - * @param WP_REST_Request $request |
|
395 | - * @param EventControllerBase $controller |
|
396 | - * @return array |
|
397 | - * @throws EE_Error |
|
398 | - */ |
|
399 | - public function imageFull($wpdb_row, $request, $controller) |
|
400 | - { |
|
401 | - return self::calculateImageData($wpdb_row, 'full'); |
|
402 | - } |
|
403 | - |
|
404 | - |
|
405 | - /** |
|
406 | - * Gets image specs and formats them for the display in the API, |
|
407 | - * according to the image size requested |
|
408 | - * |
|
409 | - * @param array $wpdb_row |
|
410 | - * @param string $image_size one of these: thumbnail, medium, medium_large, large, post-thumbnail, full |
|
411 | - * @return array|false if no such image exists. If array it will have keys 'url', 'width', 'height' and 'original' |
|
412 | - * @throws EE_Error |
|
413 | - */ |
|
414 | - protected function calculateImageData($wpdb_row, $image_size) |
|
415 | - { |
|
416 | - if (! Event::wpdbRowHasEventId($wpdb_row)) { |
|
417 | - throw new EE_Error( |
|
418 | - sprintf( |
|
419 | - esc_html__( |
|
420 | - // @codingStandardsIgnoreStart |
|
421 | - 'Cannot calculate image because the database row %1$s does not have an entry for "Event_CPT.ID"', |
|
422 | - // @codingStandardsIgnoreEnd |
|
423 | - 'event_espresso' |
|
424 | - ), |
|
425 | - print_r($wpdb_row, true) |
|
426 | - ) |
|
427 | - ); |
|
428 | - } |
|
429 | - $EVT_ID = $wpdb_row['Event_CPT.ID']; |
|
430 | - $attachment_id = get_post_thumbnail_id($EVT_ID); |
|
431 | - $data = wp_get_attachment_image_src($attachment_id, $image_size); |
|
432 | - if (! $data) { |
|
433 | - return null; |
|
434 | - } |
|
435 | - $generated = true; |
|
436 | - if (isset($data[3])) { |
|
437 | - $generated = $data[3]; |
|
438 | - } |
|
439 | - return array( |
|
440 | - 'url' => $data[0], |
|
441 | - 'width' => $data[1], |
|
442 | - 'height' => $data[2], |
|
443 | - 'generated' => $generated, |
|
444 | - ); |
|
445 | - } |
|
446 | - |
|
447 | - |
|
448 | - /** |
|
449 | - * Returns true if the array of data contains 'Event_CPT.ID'. False otherwise |
|
450 | - * |
|
451 | - * @param array $wpdb_row |
|
452 | - * @return bool |
|
453 | - */ |
|
454 | - protected function wpdbRowHasEventId($wpdb_row) |
|
455 | - { |
|
456 | - return (is_array($wpdb_row) && isset($wpdb_row['Event_CPT.ID']) && absint($wpdb_row['Event_CPT.ID'])); |
|
457 | - } |
|
458 | - |
|
459 | - |
|
460 | - /** |
|
461 | - * Provides an array for all the calculations possible that outlines a json schema for those calculations. |
|
462 | - * Array is indexed by calculation (snake case) and value is the schema for that calculation. |
|
463 | - * |
|
464 | - * @since 4.9.68.p |
|
465 | - * @return array |
|
466 | - */ |
|
467 | - public function schemaForCalculations() |
|
468 | - { |
|
469 | - $image_object_properties = array( |
|
470 | - 'url' => array( |
|
471 | - 'type' => 'string', |
|
472 | - ), |
|
473 | - 'width' => array( |
|
474 | - 'type' => 'number', |
|
475 | - ), |
|
476 | - 'height' => array( |
|
477 | - 'type' => 'number', |
|
478 | - ), |
|
479 | - 'generated' => array( |
|
480 | - 'type' => 'boolean', |
|
481 | - ), |
|
482 | - ); |
|
483 | - return array( |
|
484 | - 'optimum_sales_at_start' => array( |
|
485 | - 'description' => esc_html__( |
|
486 | - 'The total spaces on the event (not subtracting sales, but taking sales into account; so this is the optimum sales that CAN still be achieved.', |
|
487 | - 'event_espresso' |
|
488 | - ), |
|
489 | - 'type' => 'number', |
|
490 | - 'protected' => true, |
|
491 | - ), |
|
492 | - 'optimum_sales_now' => array( |
|
493 | - 'description' => esc_html__( |
|
494 | - 'The total spaces on the event (ignoring all sales; so this is the optimum sales that could have been achieved.', |
|
495 | - 'event_espresso' |
|
496 | - ), |
|
497 | - 'type' => 'number', |
|
498 | - 'protected' => true, |
|
499 | - ), |
|
500 | - 'spaces_remaining' => array( |
|
501 | - 'description' => esc_html__( |
|
502 | - 'The optimum_sales_number result, minus total sales so far.', |
|
503 | - 'event_espresso' |
|
504 | - ), |
|
505 | - 'type' => 'number', |
|
506 | - 'protected' => true, |
|
507 | - ), |
|
508 | - 'spots_taken' => array( |
|
509 | - 'description' => esc_html__( |
|
510 | - 'The number of approved registrations for this event (regardless of how many datetimes each registration\'s ticket purchase is for)', |
|
511 | - 'event_espresso' |
|
512 | - ), |
|
513 | - 'type' => 'number', |
|
514 | - 'protected' => true, |
|
515 | - ), |
|
516 | - 'spots_taken_pending_payment' => array( |
|
517 | - 'description' => esc_html__( |
|
518 | - 'The number of pending-payment registrations for this event (regardless of how many datetimes each registration\'s ticket purchase is for)', |
|
519 | - 'event_espresso' |
|
520 | - ), |
|
521 | - 'type' => 'number', |
|
522 | - 'protected' => true, |
|
523 | - ), |
|
524 | - 'registrations_checked_in_count' => array( |
|
525 | - 'description' => esc_html__( |
|
526 | - 'The count of all the registrations who have checked into one of this event\'s datetimes.', |
|
527 | - 'event_espresso' |
|
528 | - ), |
|
529 | - 'type' => 'number', |
|
530 | - 'protected' => true, |
|
531 | - ), |
|
532 | - 'registrations_checked_out_count' => array( |
|
533 | - 'description' => esc_html__( |
|
534 | - 'The count of all registrations who have checked out of one of this event\'s datetimes.', |
|
535 | - 'event_espresso' |
|
536 | - ), |
|
537 | - 'type' => 'number', |
|
538 | - 'protected' => true, |
|
539 | - ), |
|
540 | - 'image_thumbnail' => array( |
|
541 | - 'description' => esc_html__( |
|
542 | - 'The thumbnail image data.', |
|
543 | - 'event_espresso' |
|
544 | - ), |
|
545 | - 'type' => 'object', |
|
546 | - 'properties' => $image_object_properties, |
|
547 | - 'additionalProperties' => false, |
|
548 | - ), |
|
549 | - 'image_medium' => array( |
|
550 | - 'description' => esc_html__( |
|
551 | - 'The medium image data.', |
|
552 | - 'event_espresso' |
|
553 | - ), |
|
554 | - 'type' => 'object', |
|
555 | - 'properties' => $image_object_properties, |
|
556 | - 'additionalProperties' => false, |
|
557 | - ), |
|
558 | - 'image_medium_large' => array( |
|
559 | - 'description' => esc_html__( |
|
560 | - 'The medium-large image data.', |
|
561 | - 'event_espresso' |
|
562 | - ), |
|
563 | - 'type' => 'object', |
|
564 | - 'properties' => $image_object_properties, |
|
565 | - 'additionalProperties' => false, |
|
566 | - ), |
|
567 | - 'image_large' => array( |
|
568 | - 'description' => esc_html__( |
|
569 | - 'The large image data.', |
|
570 | - 'event_espresso' |
|
571 | - ), |
|
572 | - 'type' => 'object', |
|
573 | - 'properties' => $image_object_properties, |
|
574 | - 'additionalProperties' => false, |
|
575 | - ), |
|
576 | - 'image_post_thumbnail' => array( |
|
577 | - 'description' => esc_html__( |
|
578 | - 'The post-thumbnail image data.', |
|
579 | - 'event_espresso' |
|
580 | - ), |
|
581 | - 'type' => 'object', |
|
582 | - 'properties' => $image_object_properties, |
|
583 | - 'additionalProperties' => false, |
|
584 | - ), |
|
585 | - 'image_full' => array( |
|
586 | - 'description' => esc_html__( |
|
587 | - 'The full size image data', |
|
588 | - 'event_espresso' |
|
589 | - ), |
|
590 | - 'type' => 'object', |
|
591 | - 'properties' => $image_object_properties, |
|
592 | - 'additionalProperties' => false, |
|
593 | - ), |
|
594 | - ); |
|
595 | - } |
|
29 | + /** |
|
30 | + * @var EEM_Event |
|
31 | + */ |
|
32 | + protected $event_model; |
|
33 | + |
|
34 | + /** |
|
35 | + * @var EEM_Registration |
|
36 | + */ |
|
37 | + protected $registration_model; |
|
38 | + public function __construct(EEM_Event $event_model, EEM_Registration $registration_model) |
|
39 | + { |
|
40 | + $this->event_model = $event_model; |
|
41 | + $this->registration_model = $registration_model; |
|
42 | + } |
|
43 | + |
|
44 | + /** |
|
45 | + * Calculates the total spaces on the event (not subtracting sales, but taking |
|
46 | + * sales into account; so this is the optimum sales that CAN still be achieved) |
|
47 | + * See EE_Event::total_available_spaces( true ); |
|
48 | + * |
|
49 | + * @param array $wpdb_row |
|
50 | + * @param WP_REST_Request $request |
|
51 | + * @param EventControllerBase $controller |
|
52 | + * @return int |
|
53 | + * @throws EE_Error |
|
54 | + * @throws DomainException |
|
55 | + * @throws InvalidDataTypeException |
|
56 | + * @throws InvalidInterfaceException |
|
57 | + * @throws UnexpectedEntityException |
|
58 | + * @throws InvalidArgumentException |
|
59 | + */ |
|
60 | + public function optimumSalesAtStart($wpdb_row, $request, $controller) |
|
61 | + { |
|
62 | + $event_obj = null; |
|
63 | + if (Event::wpdbRowHasEventId($wpdb_row)) { |
|
64 | + $event_obj = $this->event_model->get_one_by_ID($wpdb_row['Event_CPT.ID']); |
|
65 | + } |
|
66 | + if ($event_obj instanceof EE_Event) { |
|
67 | + return $event_obj->total_available_spaces(); |
|
68 | + } |
|
69 | + throw new EE_Error( |
|
70 | + sprintf( |
|
71 | + esc_html__( |
|
72 | + // @codingStandardsIgnoreStart |
|
73 | + 'Cannot calculate optimum_sales_at_start because the event with ID %1$s (from database row %2$s) was not found', |
|
74 | + // @codingStandardsIgnoreEnd |
|
75 | + 'event_espresso' |
|
76 | + ), |
|
77 | + $wpdb_row['Event_CPT.ID'], |
|
78 | + print_r($wpdb_row, true) |
|
79 | + ) |
|
80 | + ); |
|
81 | + } |
|
82 | + |
|
83 | + |
|
84 | + /** |
|
85 | + * Calculates the total spaces on the event (ignoring all sales; so this is the optimum |
|
86 | + * sales that COULD have been achieved) |
|
87 | + * See EE_Event::total_available_spaces( true ); |
|
88 | + * |
|
89 | + * @param array $wpdb_row |
|
90 | + * @param WP_REST_Request $request |
|
91 | + * @param EventControllerBase $controller |
|
92 | + * @return int |
|
93 | + * @throws DomainException |
|
94 | + * @throws EE_Error |
|
95 | + * @throws InvalidArgumentException |
|
96 | + * @throws InvalidDataTypeException |
|
97 | + * @throws InvalidInterfaceException |
|
98 | + * @throws UnexpectedEntityException |
|
99 | + */ |
|
100 | + public function optimumSalesNow($wpdb_row, $request, $controller) |
|
101 | + { |
|
102 | + $event_obj = null; |
|
103 | + if (Event::wpdbRowHasEventId($wpdb_row)) { |
|
104 | + $event_obj = $this->event_model->get_one_by_ID($wpdb_row['Event_CPT.ID']); |
|
105 | + } |
|
106 | + if ($event_obj instanceof EE_Event) { |
|
107 | + return $event_obj->total_available_spaces(true); |
|
108 | + } |
|
109 | + throw new EE_Error( |
|
110 | + sprintf( |
|
111 | + esc_html__( |
|
112 | + // @codingStandardsIgnoreStart |
|
113 | + 'Cannot calculate optimum_sales_now because the event with ID %1$s (from database row %2$s) was not found', |
|
114 | + // @codingStandardsIgnoreEnd |
|
115 | + 'event_espresso' |
|
116 | + ), |
|
117 | + $wpdb_row['Event_CPT.ID'], |
|
118 | + print_r($wpdb_row, true) |
|
119 | + ) |
|
120 | + ); |
|
121 | + } |
|
122 | + |
|
123 | + |
|
124 | + /** |
|
125 | + * Like optimum_sales_now, but minus total sales so far. |
|
126 | + * See EE_Event::spaces_remaining_for_sale( true ); |
|
127 | + * |
|
128 | + * @param array $wpdb_row |
|
129 | + * @param WP_REST_Request $request |
|
130 | + * @param EventControllerBase $controller |
|
131 | + * @return int |
|
132 | + * @throws DomainException |
|
133 | + * @throws EE_Error |
|
134 | + * @throws InvalidArgumentException |
|
135 | + * @throws InvalidDataTypeException |
|
136 | + * @throws InvalidInterfaceException |
|
137 | + * @throws UnexpectedEntityException |
|
138 | + */ |
|
139 | + public function spacesRemaining($wpdb_row, $request, $controller) |
|
140 | + { |
|
141 | + $event_obj = null; |
|
142 | + if (Event::wpdbRowHasEventId($wpdb_row)) { |
|
143 | + $event_obj = $this->event_model->get_one_by_ID($wpdb_row['Event_CPT.ID']); |
|
144 | + } |
|
145 | + if ($event_obj instanceof EE_Event) { |
|
146 | + return $event_obj->spaces_remaining_for_sale(); |
|
147 | + } |
|
148 | + throw new EE_Error( |
|
149 | + sprintf( |
|
150 | + esc_html__( |
|
151 | + // @codingStandardsIgnoreStart |
|
152 | + 'Cannot calculate spaces_remaining because the event with ID %1$s (from database row %2$s) was not found', |
|
153 | + // @codingStandardsIgnoreEnd |
|
154 | + 'event_espresso' |
|
155 | + ), |
|
156 | + $wpdb_row['Event_CPT.ID'], |
|
157 | + print_r($wpdb_row, true) |
|
158 | + ) |
|
159 | + ); |
|
160 | + } |
|
161 | + |
|
162 | + |
|
163 | + /** |
|
164 | + * Counts the number of approved registrations for this event (regardless |
|
165 | + * of how many datetimes each registrations' ticket purchase is for) |
|
166 | + * |
|
167 | + * @param array $wpdb_row |
|
168 | + * @param WP_REST_Request $request |
|
169 | + * @param EventControllerBase $controller |
|
170 | + * @return int |
|
171 | + * @throws EE_Error |
|
172 | + * @throws InvalidArgumentException |
|
173 | + * @throws InvalidDataTypeException |
|
174 | + * @throws InvalidInterfaceException |
|
175 | + */ |
|
176 | + public function spotsTaken($wpdb_row, $request, $controller) |
|
177 | + { |
|
178 | + if (! Event::wpdbRowHasEventId($wpdb_row)) { |
|
179 | + throw new EE_Error( |
|
180 | + sprintf( |
|
181 | + esc_html__( |
|
182 | + // @codingStandardsIgnoreStart |
|
183 | + 'Cannot calculate spots_taken because the database row %1$s does not have a valid entry for "Event_CPT.ID"', |
|
184 | + // @codingStandardsIgnoreEnd |
|
185 | + 'event_espresso' |
|
186 | + ), |
|
187 | + print_r($wpdb_row, true) |
|
188 | + ) |
|
189 | + ); |
|
190 | + } |
|
191 | + return $this->registration_model->count( |
|
192 | + array( |
|
193 | + array( |
|
194 | + 'EVT_ID' => $wpdb_row['Event_CPT.ID'], |
|
195 | + 'STS_ID' => EEM_Registration::status_id_approved, |
|
196 | + ), |
|
197 | + ), |
|
198 | + 'REG_ID', |
|
199 | + true |
|
200 | + ); |
|
201 | + } |
|
202 | + |
|
203 | + |
|
204 | + /** |
|
205 | + * Counts the number of pending-payment registrations for this event (regardless |
|
206 | + * of how many datetimes each registrations' ticket purchase is for) |
|
207 | + * |
|
208 | + * @param array $wpdb_row |
|
209 | + * @param WP_REST_Request $request |
|
210 | + * @param EventControllerBase $controller |
|
211 | + * @return int |
|
212 | + * @throws EE_Error |
|
213 | + * @throws InvalidArgumentException |
|
214 | + * @throws InvalidDataTypeException |
|
215 | + * @throws InvalidInterfaceException |
|
216 | + * @throws RestException |
|
217 | + */ |
|
218 | + public function spotsTakenPendingPayment($wpdb_row, $request, $controller) |
|
219 | + { |
|
220 | + if (! Event::wpdbRowHasEventId($wpdb_row)) { |
|
221 | + throw new EE_Error( |
|
222 | + sprintf( |
|
223 | + esc_html__( |
|
224 | + // @codingStandardsIgnoreStart |
|
225 | + 'Cannot calculate spots_taken_pending_payment because the database row %1$s does not have an entry for "Event_CPT.ID"', |
|
226 | + // @codingStandardsIgnoreEnd |
|
227 | + 'event_espresso' |
|
228 | + ), |
|
229 | + print_r($wpdb_row, true) |
|
230 | + ) |
|
231 | + ); |
|
232 | + } |
|
233 | + $this->verifyCurrentUserCan('ee_read_registrations', 'spots_taken_pending_payment'); |
|
234 | + return $this->registration_model->count( |
|
235 | + array( |
|
236 | + array( |
|
237 | + 'EVT_ID' => $wpdb_row['Event_CPT.ID'], |
|
238 | + 'STS_ID' => EEM_Registration::status_id_pending_payment, |
|
239 | + ), |
|
240 | + ), |
|
241 | + 'REG_ID', |
|
242 | + true |
|
243 | + ); |
|
244 | + } |
|
245 | + |
|
246 | + |
|
247 | + /** |
|
248 | + * Counts all the registrations who have checked into one of this events' datetimes |
|
249 | + * See EE_Event::total_available_spaces( false ); |
|
250 | + * |
|
251 | + * @param array $wpdb_row |
|
252 | + * @param WP_REST_Request $request |
|
253 | + * @param EventControllerBase $controller |
|
254 | + * @return int|null if permission denied |
|
255 | + * @throws EE_Error |
|
256 | + * @throws InvalidArgumentException |
|
257 | + * @throws InvalidDataTypeException |
|
258 | + * @throws InvalidInterfaceException |
|
259 | + * @throws RestException |
|
260 | + */ |
|
261 | + public function registrationsCheckedInCount($wpdb_row, $request, $controller) |
|
262 | + { |
|
263 | + if (! Event::wpdbRowHasEventId($wpdb_row)) { |
|
264 | + throw new EE_Error( |
|
265 | + sprintf( |
|
266 | + esc_html__( |
|
267 | + // @codingStandardsIgnoreStart |
|
268 | + 'Cannot calculate registrations_checked_in_count because the database row %1$s does not have an entry for "Event_CPT.ID"', |
|
269 | + // @codingStandardsIgnoreEnd |
|
270 | + 'event_espresso' |
|
271 | + ), |
|
272 | + print_r($wpdb_row, true) |
|
273 | + ) |
|
274 | + ); |
|
275 | + } |
|
276 | + $this->verifyCurrentUserCan('ee_read_checkins', 'registrations_checked_in_count'); |
|
277 | + return $this->registration_model->count_registrations_checked_into_event($wpdb_row['Event_CPT.ID'], true); |
|
278 | + } |
|
279 | + |
|
280 | + |
|
281 | + /** |
|
282 | + * Counts all the registrations who have checked out of one of this events' datetimes |
|
283 | + * See EE_Event::total_available_spaces( false ); |
|
284 | + * |
|
285 | + * @param array $wpdb_row |
|
286 | + * @param WP_REST_Request $request |
|
287 | + * @param EventControllerBase $controller |
|
288 | + * @return int |
|
289 | + * @throws EE_Error |
|
290 | + * @throws InvalidArgumentException |
|
291 | + * @throws InvalidDataTypeException |
|
292 | + * @throws InvalidInterfaceException |
|
293 | + * @throws RestException |
|
294 | + */ |
|
295 | + public function registrationsCheckedOutCount($wpdb_row, $request, $controller) |
|
296 | + { |
|
297 | + if (! Event::wpdbRowHasEventId($wpdb_row)) { |
|
298 | + throw new EE_Error( |
|
299 | + sprintf( |
|
300 | + esc_html__( |
|
301 | + // @codingStandardsIgnoreStart |
|
302 | + 'Cannot calculate registrations_checked_out_count because the database row %1$s does not have an entry for "Event_CPT.ID"', |
|
303 | + // @codingStandardsIgnoreEnd |
|
304 | + 'event_espresso' |
|
305 | + ), |
|
306 | + print_r($wpdb_row, true) |
|
307 | + ) |
|
308 | + ); |
|
309 | + } |
|
310 | + $this->verifyCurrentUserCan('ee_read_checkins', 'registrations_checked_out_count'); |
|
311 | + return $this->registration_model->count_registrations_checked_into_event($wpdb_row['Event_CPT.ID'], false); |
|
312 | + } |
|
313 | + |
|
314 | + |
|
315 | + /** |
|
316 | + * Gets the thumbnail image |
|
317 | + * |
|
318 | + * @param array $wpdb_row |
|
319 | + * @param WP_REST_Request $request |
|
320 | + * @param EventControllerBase $controller |
|
321 | + * @return array |
|
322 | + * @throws EE_Error |
|
323 | + */ |
|
324 | + public function imageThumbnail($wpdb_row, $request, $controller) |
|
325 | + { |
|
326 | + return self::calculateImageData($wpdb_row, 'thumbnail'); |
|
327 | + } |
|
328 | + |
|
329 | + |
|
330 | + /** |
|
331 | + * Gets the medium image |
|
332 | + * |
|
333 | + * @param array $wpdb_row |
|
334 | + * @param WP_REST_Request $request |
|
335 | + * @param EventControllerBase $controller |
|
336 | + * @return array |
|
337 | + * @throws EE_Error |
|
338 | + */ |
|
339 | + public function imageMedium($wpdb_row, $request, $controller) |
|
340 | + { |
|
341 | + return self::calculateImageData($wpdb_row, 'medium'); |
|
342 | + } |
|
343 | + |
|
344 | + |
|
345 | + /** |
|
346 | + * Gets the medium-large image |
|
347 | + * |
|
348 | + * @param array $wpdb_row |
|
349 | + * @param WP_REST_Request $request |
|
350 | + * @param EventControllerBase $controller |
|
351 | + * @return array |
|
352 | + * @throws EE_Error |
|
353 | + */ |
|
354 | + public function imageMediumLarge($wpdb_row, $request, $controller) |
|
355 | + { |
|
356 | + return self::calculateImageData($wpdb_row, 'medium_large'); |
|
357 | + } |
|
358 | + |
|
359 | + |
|
360 | + /** |
|
361 | + * Gets the large image |
|
362 | + * |
|
363 | + * @param array $wpdb_row |
|
364 | + * @param WP_REST_Request $request |
|
365 | + * @param EventControllerBase $controller |
|
366 | + * @return array |
|
367 | + * @throws EE_Error |
|
368 | + */ |
|
369 | + public function imageLarge($wpdb_row, $request, $controller) |
|
370 | + { |
|
371 | + return self::calculateImageData($wpdb_row, 'large'); |
|
372 | + } |
|
373 | + |
|
374 | + |
|
375 | + /** |
|
376 | + * Gets the post-thumbnail image |
|
377 | + * |
|
378 | + * @param array $wpdb_row |
|
379 | + * @param WP_REST_Request $request |
|
380 | + * @param EventControllerBase $controller |
|
381 | + * @return array |
|
382 | + * @throws EE_Error |
|
383 | + */ |
|
384 | + public function imagePostThumbnail($wpdb_row, $request, $controller) |
|
385 | + { |
|
386 | + return self::calculateImageData($wpdb_row, 'post-thumbnail'); |
|
387 | + } |
|
388 | + |
|
389 | + |
|
390 | + /** |
|
391 | + * Gets the full size image |
|
392 | + * |
|
393 | + * @param array $wpdb_row |
|
394 | + * @param WP_REST_Request $request |
|
395 | + * @param EventControllerBase $controller |
|
396 | + * @return array |
|
397 | + * @throws EE_Error |
|
398 | + */ |
|
399 | + public function imageFull($wpdb_row, $request, $controller) |
|
400 | + { |
|
401 | + return self::calculateImageData($wpdb_row, 'full'); |
|
402 | + } |
|
403 | + |
|
404 | + |
|
405 | + /** |
|
406 | + * Gets image specs and formats them for the display in the API, |
|
407 | + * according to the image size requested |
|
408 | + * |
|
409 | + * @param array $wpdb_row |
|
410 | + * @param string $image_size one of these: thumbnail, medium, medium_large, large, post-thumbnail, full |
|
411 | + * @return array|false if no such image exists. If array it will have keys 'url', 'width', 'height' and 'original' |
|
412 | + * @throws EE_Error |
|
413 | + */ |
|
414 | + protected function calculateImageData($wpdb_row, $image_size) |
|
415 | + { |
|
416 | + if (! Event::wpdbRowHasEventId($wpdb_row)) { |
|
417 | + throw new EE_Error( |
|
418 | + sprintf( |
|
419 | + esc_html__( |
|
420 | + // @codingStandardsIgnoreStart |
|
421 | + 'Cannot calculate image because the database row %1$s does not have an entry for "Event_CPT.ID"', |
|
422 | + // @codingStandardsIgnoreEnd |
|
423 | + 'event_espresso' |
|
424 | + ), |
|
425 | + print_r($wpdb_row, true) |
|
426 | + ) |
|
427 | + ); |
|
428 | + } |
|
429 | + $EVT_ID = $wpdb_row['Event_CPT.ID']; |
|
430 | + $attachment_id = get_post_thumbnail_id($EVT_ID); |
|
431 | + $data = wp_get_attachment_image_src($attachment_id, $image_size); |
|
432 | + if (! $data) { |
|
433 | + return null; |
|
434 | + } |
|
435 | + $generated = true; |
|
436 | + if (isset($data[3])) { |
|
437 | + $generated = $data[3]; |
|
438 | + } |
|
439 | + return array( |
|
440 | + 'url' => $data[0], |
|
441 | + 'width' => $data[1], |
|
442 | + 'height' => $data[2], |
|
443 | + 'generated' => $generated, |
|
444 | + ); |
|
445 | + } |
|
446 | + |
|
447 | + |
|
448 | + /** |
|
449 | + * Returns true if the array of data contains 'Event_CPT.ID'. False otherwise |
|
450 | + * |
|
451 | + * @param array $wpdb_row |
|
452 | + * @return bool |
|
453 | + */ |
|
454 | + protected function wpdbRowHasEventId($wpdb_row) |
|
455 | + { |
|
456 | + return (is_array($wpdb_row) && isset($wpdb_row['Event_CPT.ID']) && absint($wpdb_row['Event_CPT.ID'])); |
|
457 | + } |
|
458 | + |
|
459 | + |
|
460 | + /** |
|
461 | + * Provides an array for all the calculations possible that outlines a json schema for those calculations. |
|
462 | + * Array is indexed by calculation (snake case) and value is the schema for that calculation. |
|
463 | + * |
|
464 | + * @since 4.9.68.p |
|
465 | + * @return array |
|
466 | + */ |
|
467 | + public function schemaForCalculations() |
|
468 | + { |
|
469 | + $image_object_properties = array( |
|
470 | + 'url' => array( |
|
471 | + 'type' => 'string', |
|
472 | + ), |
|
473 | + 'width' => array( |
|
474 | + 'type' => 'number', |
|
475 | + ), |
|
476 | + 'height' => array( |
|
477 | + 'type' => 'number', |
|
478 | + ), |
|
479 | + 'generated' => array( |
|
480 | + 'type' => 'boolean', |
|
481 | + ), |
|
482 | + ); |
|
483 | + return array( |
|
484 | + 'optimum_sales_at_start' => array( |
|
485 | + 'description' => esc_html__( |
|
486 | + 'The total spaces on the event (not subtracting sales, but taking sales into account; so this is the optimum sales that CAN still be achieved.', |
|
487 | + 'event_espresso' |
|
488 | + ), |
|
489 | + 'type' => 'number', |
|
490 | + 'protected' => true, |
|
491 | + ), |
|
492 | + 'optimum_sales_now' => array( |
|
493 | + 'description' => esc_html__( |
|
494 | + 'The total spaces on the event (ignoring all sales; so this is the optimum sales that could have been achieved.', |
|
495 | + 'event_espresso' |
|
496 | + ), |
|
497 | + 'type' => 'number', |
|
498 | + 'protected' => true, |
|
499 | + ), |
|
500 | + 'spaces_remaining' => array( |
|
501 | + 'description' => esc_html__( |
|
502 | + 'The optimum_sales_number result, minus total sales so far.', |
|
503 | + 'event_espresso' |
|
504 | + ), |
|
505 | + 'type' => 'number', |
|
506 | + 'protected' => true, |
|
507 | + ), |
|
508 | + 'spots_taken' => array( |
|
509 | + 'description' => esc_html__( |
|
510 | + 'The number of approved registrations for this event (regardless of how many datetimes each registration\'s ticket purchase is for)', |
|
511 | + 'event_espresso' |
|
512 | + ), |
|
513 | + 'type' => 'number', |
|
514 | + 'protected' => true, |
|
515 | + ), |
|
516 | + 'spots_taken_pending_payment' => array( |
|
517 | + 'description' => esc_html__( |
|
518 | + 'The number of pending-payment registrations for this event (regardless of how many datetimes each registration\'s ticket purchase is for)', |
|
519 | + 'event_espresso' |
|
520 | + ), |
|
521 | + 'type' => 'number', |
|
522 | + 'protected' => true, |
|
523 | + ), |
|
524 | + 'registrations_checked_in_count' => array( |
|
525 | + 'description' => esc_html__( |
|
526 | + 'The count of all the registrations who have checked into one of this event\'s datetimes.', |
|
527 | + 'event_espresso' |
|
528 | + ), |
|
529 | + 'type' => 'number', |
|
530 | + 'protected' => true, |
|
531 | + ), |
|
532 | + 'registrations_checked_out_count' => array( |
|
533 | + 'description' => esc_html__( |
|
534 | + 'The count of all registrations who have checked out of one of this event\'s datetimes.', |
|
535 | + 'event_espresso' |
|
536 | + ), |
|
537 | + 'type' => 'number', |
|
538 | + 'protected' => true, |
|
539 | + ), |
|
540 | + 'image_thumbnail' => array( |
|
541 | + 'description' => esc_html__( |
|
542 | + 'The thumbnail image data.', |
|
543 | + 'event_espresso' |
|
544 | + ), |
|
545 | + 'type' => 'object', |
|
546 | + 'properties' => $image_object_properties, |
|
547 | + 'additionalProperties' => false, |
|
548 | + ), |
|
549 | + 'image_medium' => array( |
|
550 | + 'description' => esc_html__( |
|
551 | + 'The medium image data.', |
|
552 | + 'event_espresso' |
|
553 | + ), |
|
554 | + 'type' => 'object', |
|
555 | + 'properties' => $image_object_properties, |
|
556 | + 'additionalProperties' => false, |
|
557 | + ), |
|
558 | + 'image_medium_large' => array( |
|
559 | + 'description' => esc_html__( |
|
560 | + 'The medium-large image data.', |
|
561 | + 'event_espresso' |
|
562 | + ), |
|
563 | + 'type' => 'object', |
|
564 | + 'properties' => $image_object_properties, |
|
565 | + 'additionalProperties' => false, |
|
566 | + ), |
|
567 | + 'image_large' => array( |
|
568 | + 'description' => esc_html__( |
|
569 | + 'The large image data.', |
|
570 | + 'event_espresso' |
|
571 | + ), |
|
572 | + 'type' => 'object', |
|
573 | + 'properties' => $image_object_properties, |
|
574 | + 'additionalProperties' => false, |
|
575 | + ), |
|
576 | + 'image_post_thumbnail' => array( |
|
577 | + 'description' => esc_html__( |
|
578 | + 'The post-thumbnail image data.', |
|
579 | + 'event_espresso' |
|
580 | + ), |
|
581 | + 'type' => 'object', |
|
582 | + 'properties' => $image_object_properties, |
|
583 | + 'additionalProperties' => false, |
|
584 | + ), |
|
585 | + 'image_full' => array( |
|
586 | + 'description' => esc_html__( |
|
587 | + 'The full size image data', |
|
588 | + 'event_espresso' |
|
589 | + ), |
|
590 | + 'type' => 'object', |
|
591 | + 'properties' => $image_object_properties, |
|
592 | + 'additionalProperties' => false, |
|
593 | + ), |
|
594 | + ); |
|
595 | + } |
|
596 | 596 | } |
@@ -175,7 +175,7 @@ discard block |
||
175 | 175 | */ |
176 | 176 | public function spotsTaken($wpdb_row, $request, $controller) |
177 | 177 | { |
178 | - if (! Event::wpdbRowHasEventId($wpdb_row)) { |
|
178 | + if ( ! Event::wpdbRowHasEventId($wpdb_row)) { |
|
179 | 179 | throw new EE_Error( |
180 | 180 | sprintf( |
181 | 181 | esc_html__( |
@@ -217,7 +217,7 @@ discard block |
||
217 | 217 | */ |
218 | 218 | public function spotsTakenPendingPayment($wpdb_row, $request, $controller) |
219 | 219 | { |
220 | - if (! Event::wpdbRowHasEventId($wpdb_row)) { |
|
220 | + if ( ! Event::wpdbRowHasEventId($wpdb_row)) { |
|
221 | 221 | throw new EE_Error( |
222 | 222 | sprintf( |
223 | 223 | esc_html__( |
@@ -260,7 +260,7 @@ discard block |
||
260 | 260 | */ |
261 | 261 | public function registrationsCheckedInCount($wpdb_row, $request, $controller) |
262 | 262 | { |
263 | - if (! Event::wpdbRowHasEventId($wpdb_row)) { |
|
263 | + if ( ! Event::wpdbRowHasEventId($wpdb_row)) { |
|
264 | 264 | throw new EE_Error( |
265 | 265 | sprintf( |
266 | 266 | esc_html__( |
@@ -294,7 +294,7 @@ discard block |
||
294 | 294 | */ |
295 | 295 | public function registrationsCheckedOutCount($wpdb_row, $request, $controller) |
296 | 296 | { |
297 | - if (! Event::wpdbRowHasEventId($wpdb_row)) { |
|
297 | + if ( ! Event::wpdbRowHasEventId($wpdb_row)) { |
|
298 | 298 | throw new EE_Error( |
299 | 299 | sprintf( |
300 | 300 | esc_html__( |
@@ -413,7 +413,7 @@ discard block |
||
413 | 413 | */ |
414 | 414 | protected function calculateImageData($wpdb_row, $image_size) |
415 | 415 | { |
416 | - if (! Event::wpdbRowHasEventId($wpdb_row)) { |
|
416 | + if ( ! Event::wpdbRowHasEventId($wpdb_row)) { |
|
417 | 417 | throw new EE_Error( |
418 | 418 | sprintf( |
419 | 419 | esc_html__( |
@@ -429,7 +429,7 @@ discard block |
||
429 | 429 | $EVT_ID = $wpdb_row['Event_CPT.ID']; |
430 | 430 | $attachment_id = get_post_thumbnail_id($EVT_ID); |
431 | 431 | $data = wp_get_attachment_image_src($attachment_id, $image_size); |
432 | - if (! $data) { |
|
432 | + if ( ! $data) { |
|
433 | 433 | return null; |
434 | 434 | } |
435 | 435 | $generated = true; |
@@ -15,88 +15,88 @@ |
||
15 | 15 | * ------------------------------------------------------------------------ |
16 | 16 | */ |
17 | 17 | /** |
18 | - * |
|
19 | - * Class EE_Receipt_Line_Item_Display_Strategy |
|
20 | - * |
|
21 | - * Description |
|
22 | - * |
|
23 | - * @package Event Espresso |
|
24 | - * @subpackage core |
|
25 | - * @author Brent Christensen |
|
26 | - * |
|
27 | - * |
|
28 | - */ |
|
18 | + * |
|
19 | + * Class EE_Receipt_Line_Item_Display_Strategy |
|
20 | + * |
|
21 | + * Description |
|
22 | + * |
|
23 | + * @package Event Espresso |
|
24 | + * @subpackage core |
|
25 | + * @author Brent Christensen |
|
26 | + * |
|
27 | + * |
|
28 | + */ |
|
29 | 29 | |
30 | 30 | class EE_Receipt_Line_Item_Display_Strategy implements EEI_Line_Item_Display |
31 | 31 | { |
32 | 32 | |
33 | - /** |
|
34 | - * @param EE_Line_Item $line_item |
|
35 | - * @param array $options |
|
36 | - * @return mixed |
|
37 | - */ |
|
38 | - public function display_line_item(EE_Line_Item $line_item, $options = array()) |
|
39 | - { |
|
33 | + /** |
|
34 | + * @param EE_Line_Item $line_item |
|
35 | + * @param array $options |
|
36 | + * @return mixed |
|
37 | + */ |
|
38 | + public function display_line_item(EE_Line_Item $line_item, $options = array()) |
|
39 | + { |
|
40 | 40 | |
41 | - $html = ''; |
|
42 | - // set some default options and merge with incoming |
|
43 | - $default_options = array( |
|
44 | - 'show_desc' => true, |
|
45 | - 'odd' => false |
|
46 | - ); |
|
47 | - $options = array_merge($default_options, (array) $options); |
|
48 | - switch ($line_item->type()) { |
|
49 | - case EEM_Line_Item::type_total: |
|
50 | - // loop thru children |
|
51 | - foreach ($line_item->children() as $child_line_item) { |
|
52 | - // recursively feed children back into this method |
|
41 | + $html = ''; |
|
42 | + // set some default options and merge with incoming |
|
43 | + $default_options = array( |
|
44 | + 'show_desc' => true, |
|
45 | + 'odd' => false |
|
46 | + ); |
|
47 | + $options = array_merge($default_options, (array) $options); |
|
48 | + switch ($line_item->type()) { |
|
49 | + case EEM_Line_Item::type_total: |
|
50 | + // loop thru children |
|
51 | + foreach ($line_item->children() as $child_line_item) { |
|
52 | + // recursively feed children back into this method |
|
53 | 53 | // $html .= $this->display_line_item( $child_line_item, $options ); |
54 | - } |
|
54 | + } |
|
55 | 55 | // $html .= $this->_separator_row( $options ); |
56 | 56 | // $html .= $this->_total_row( $line_item, esc_html__('Total', 'event_espresso'), $options ); |
57 | - break; |
|
57 | + break; |
|
58 | 58 | |
59 | 59 | |
60 | - case EEM_Line_Item::type_sub_total: |
|
61 | - // loop thru children |
|
62 | - foreach ($line_item->children() as $child_line_item) { |
|
63 | - // recursively feed children back into this method |
|
60 | + case EEM_Line_Item::type_sub_total: |
|
61 | + // loop thru children |
|
62 | + foreach ($line_item->children() as $child_line_item) { |
|
63 | + // recursively feed children back into this method |
|
64 | 64 | // $html .= $this->display_line_item( $child_line_item, $options ); |
65 | - } |
|
65 | + } |
|
66 | 66 | // $html .= $this->_total_row( $line_item, esc_html__('Sub-Total', 'event_espresso'), $options ); |
67 | - break; |
|
67 | + break; |
|
68 | 68 | |
69 | 69 | |
70 | - case EEM_Line_Item::type_tax_sub_total: |
|
71 | - // loop thru children |
|
72 | - foreach ($line_item->children() as $child_line_item) { |
|
73 | - // recursively feed children back into this method |
|
70 | + case EEM_Line_Item::type_tax_sub_total: |
|
71 | + // loop thru children |
|
72 | + foreach ($line_item->children() as $child_line_item) { |
|
73 | + // recursively feed children back into this method |
|
74 | 74 | // $html .= $this->display_line_item( $child_line_item, $options ); |
75 | - } |
|
75 | + } |
|
76 | 76 | // $html .= $this->_total_row( $line_item, esc_html__('Tax Total', 'event_espresso'), $options ); |
77 | - break; |
|
77 | + break; |
|
78 | 78 | |
79 | 79 | |
80 | - case EEM_Line_Item::type_line_item: |
|
81 | - // item row |
|
80 | + case EEM_Line_Item::type_line_item: |
|
81 | + // item row |
|
82 | 82 | // $html .= $this->_item_row( $line_item, $options ); |
83 | - // got any kids? |
|
84 | - foreach ($line_item->children() as $child_line_item) { |
|
83 | + // got any kids? |
|
84 | + foreach ($line_item->children() as $child_line_item) { |
|
85 | 85 | // $this->display_line_item( $child_line_item, $options ); |
86 | - } |
|
87 | - break; |
|
86 | + } |
|
87 | + break; |
|
88 | 88 | |
89 | 89 | |
90 | - case EEM_Line_Item::type_sub_line_item: |
|
90 | + case EEM_Line_Item::type_sub_line_item: |
|
91 | 91 | // $html .= $this->_sub_item_row( $line_item, $options ); |
92 | - break; |
|
92 | + break; |
|
93 | 93 | |
94 | 94 | |
95 | - case EEM_Line_Item::type_tax: |
|
95 | + case EEM_Line_Item::type_tax: |
|
96 | 96 | // $html .= $this->_tax_row( $line_item, $options ); |
97 | - break; |
|
98 | - } |
|
97 | + break; |
|
98 | + } |
|
99 | 99 | |
100 | - return $html; |
|
101 | - } |
|
100 | + return $html; |
|
101 | + } |
|
102 | 102 | } |
@@ -118,7 +118,7 @@ discard block |
||
118 | 118 | $html .= $this->_taxes_html; |
119 | 119 | $html .= $this->_total_row($line_item, $options); |
120 | 120 | if ($options['use_table_wrapper']) { |
121 | - $html = $this->_table_header($options) . $html . $this->_table_footer($options); |
|
121 | + $html = $this->_table_header($options).$html.$this->_table_footer($options); |
|
122 | 122 | } |
123 | 123 | break; |
124 | 124 | } |
@@ -157,7 +157,7 @@ discard block |
||
157 | 157 | */ |
158 | 158 | protected function _table_footer($options) |
159 | 159 | { |
160 | - return EEH_HTML::tbodyx() . EEH_HTML::tablex(); |
|
160 | + return EEH_HTML::tbodyx().EEH_HTML::tablex(); |
|
161 | 161 | } |
162 | 162 | |
163 | 163 | |
@@ -188,16 +188,16 @@ discard block |
||
188 | 188 | |
189 | 189 | |
190 | 190 | $name_html = $line_item_related_object instanceof EEI_Line_Item_Object ? $line_item_related_object->name() : $line_item->name(); |
191 | - $name_html = $name_link ? '<a href="' . $name_link . '">' . $name_html . '</a>' : $name_html; |
|
191 | + $name_html = $name_link ? '<a href="'.$name_link.'">'.$name_html.'</a>' : $name_html; |
|
192 | 192 | $name_html .= $line_item->is_taxable() ? ' *' : ''; |
193 | 193 | // maybe preface with icon? |
194 | - $name_html = $line_item_related_object instanceof EEI_Has_Icon ? $line_item_related_object->get_icon() . $name_html : $name_html; |
|
195 | - $name_html = '<span class="ee-line-item-name linked">' . $name_html . '</span><br>'; |
|
196 | - $name_html .= sprintf( |
|
194 | + $name_html = $line_item_related_object instanceof EEI_Has_Icon ? $line_item_related_object->get_icon().$name_html : $name_html; |
|
195 | + $name_html = '<span class="ee-line-item-name linked">'.$name_html.'</span><br>'; |
|
196 | + $name_html .= sprintf( |
|
197 | 197 | _x('%1$sfor the %2$s: %3$s%4$s', 'eg. "for the Event: My Cool Event"', 'event_espresso'), |
198 | 198 | '<span class="ee-line-item-related-parent-object">', |
199 | 199 | $line_item->parent() instanceof EE_Line_Item ? $line_item->parent()->OBJ_type_i18n() : esc_html__('Item:', 'event_espresso'), |
200 | - $parent_related_object_link ? '<a href="' . $parent_related_object_link . '">' . $parent_related_object_name . '</a>' : $parent_related_object_name, |
|
200 | + $parent_related_object_link ? '<a href="'.$parent_related_object_link.'">'.$parent_related_object_name.'</a>' : $parent_related_object_name, |
|
201 | 201 | '</span>' |
202 | 202 | ); |
203 | 203 | |
@@ -214,13 +214,13 @@ discard block |
||
214 | 214 | $type_html .= $this->_get_cancellations($line_item); |
215 | 215 | $type_html .= $line_item->OBJ_type() ? '<br />' : ''; |
216 | 216 | $code = $line_item_related_object instanceof EEI_Has_Code ? $line_item_related_object->code() : ''; |
217 | - $type_html .= ! empty($code) ? '<span class="ee-line-item-id">' . sprintf(esc_html__('Code: %s', 'event_espresso'), $code) . '</span>' : ''; |
|
217 | + $type_html .= ! empty($code) ? '<span class="ee-line-item-id">'.sprintf(esc_html__('Code: %s', 'event_espresso'), $code).'</span>' : ''; |
|
218 | 218 | $html .= EEH_HTML::td($type_html, '', 'jst-left'); |
219 | 219 | |
220 | 220 | |
221 | 221 | // Amount Column |
222 | 222 | if ($line_item->is_percent()) { |
223 | - $html .= EEH_HTML::td($line_item->percent() . '%', '', 'jst-rght'); |
|
223 | + $html .= EEH_HTML::td($line_item->percent().'%', '', 'jst-rght'); |
|
224 | 224 | } else { |
225 | 225 | $html .= EEH_HTML::td($line_item->unit_price_no_code(), '', 'jst-rght'); |
226 | 226 | } |
@@ -295,7 +295,7 @@ discard block |
||
295 | 295 | // start of row |
296 | 296 | $html = EEH_HTML::tr('', 'admin-primary-mbox-taxes-tr'); |
297 | 297 | // name th |
298 | - $html .= EEH_HTML::th($line_item->name() . '(' . $line_item->get_pretty('LIN_percent') . '%)', '', 'jst-rght', '', ' colspan="4"'); |
|
298 | + $html .= EEH_HTML::th($line_item->name().'('.$line_item->get_pretty('LIN_percent').'%)', '', 'jst-rght', '', ' colspan="4"'); |
|
299 | 299 | // total th |
300 | 300 | $html .= EEH_HTML::th(EEH_Template::format_currency($line_item->total(), false, false), '', 'jst-rght'); |
301 | 301 | // end of row |
@@ -334,7 +334,7 @@ discard block |
||
334 | 334 | // start of row |
335 | 335 | $html = EEH_HTML::tr('', '', 'admin-primary-mbox-total-tr'); |
336 | 336 | // Total th label |
337 | - $total_label = sprintf(esc_html__('Transaction Total %s', 'event_espresso'), '(' . EE_Registry::instance()->CFG->currency->code . ')'); |
|
337 | + $total_label = sprintf(esc_html__('Transaction Total %s', 'event_espresso'), '('.EE_Registry::instance()->CFG->currency->code.')'); |
|
338 | 338 | $html .= EEH_HTML::th($total_label, '', 'jst-rght', '', ' colspan="4"'); |
339 | 339 | // total th |
340 | 340 |
@@ -13,332 +13,332 @@ |
||
13 | 13 | |
14 | 14 | class EE_Admin_Table_Line_Item_Display_Strategy implements EEI_Line_Item_Display |
15 | 15 | { |
16 | - /** |
|
17 | - * whether to display the taxes row or not |
|
18 | - * @type bool $_show_taxes |
|
19 | - */ |
|
20 | - protected $_show_taxes = false; |
|
21 | - |
|
22 | - /** |
|
23 | - * html for any tax rows |
|
24 | - * @type string $_show_taxes |
|
25 | - */ |
|
26 | - protected $_taxes_html = ''; |
|
27 | - |
|
28 | - |
|
29 | - /** |
|
30 | - * total amount including tax we can bill for at this time |
|
31 | - * @type float $_grand_total |
|
32 | - */ |
|
33 | - protected $_grand_total = 0.00; |
|
34 | - |
|
35 | - |
|
36 | - |
|
37 | - /** |
|
38 | - * @return float |
|
39 | - */ |
|
40 | - public function grand_total() |
|
41 | - { |
|
42 | - return $this->_grand_total; |
|
43 | - } |
|
44 | - |
|
45 | - |
|
46 | - |
|
47 | - /** |
|
48 | - * This is used to output a single |
|
49 | - * @param EE_Line_Item $line_item |
|
50 | - * @param array $options |
|
51 | - * @return mixed |
|
52 | - */ |
|
53 | - public function display_line_item(EE_Line_Item $line_item, $options = array()) |
|
54 | - { |
|
55 | - |
|
56 | - $html = ''; |
|
57 | - // set some default options and merge with incoming |
|
58 | - $default_options = array( |
|
59 | - 'odd' => true, |
|
60 | - 'use_table_wrapper' => true, |
|
61 | - 'table_css_class' => 'admin-primary-mbox-tbl', |
|
62 | - 'taxes_tr_css_class' => 'admin-primary-mbox-taxes-tr', |
|
63 | - 'total_tr_css_class' => 'admin-primary-mbox-total-tr' |
|
64 | - ); |
|
65 | - $options = array_merge($default_options, (array) $options); |
|
66 | - |
|
67 | - switch ($line_item->type()) { |
|
68 | - case EEM_Line_Item::type_line_item: |
|
69 | - // item row |
|
70 | - $html .= $this->_item_row($line_item, $options); |
|
71 | - break; |
|
72 | - |
|
73 | - case EEM_Line_Item::type_sub_line_item: |
|
74 | - $html .= $this->_sub_item_row($line_item, $options); |
|
75 | - break; |
|
76 | - |
|
77 | - case EEM_Line_Item::type_sub_total: |
|
78 | - if ($line_item->quantity() === 0) { |
|
79 | - return $html; |
|
80 | - } |
|
81 | - // loop through children |
|
82 | - $child_line_items = $line_item->children(); |
|
83 | - // loop through children |
|
84 | - foreach ($child_line_items as $child_line_item) { |
|
85 | - // recursively feed children back into this method |
|
86 | - $html .= $this->display_line_item($child_line_item, $options); |
|
87 | - } |
|
88 | - $html .= $this->_sub_total_row($line_item, $options); |
|
89 | - break; |
|
90 | - |
|
91 | - case EEM_Line_Item::type_tax: |
|
92 | - if ($this->_show_taxes) { |
|
93 | - $this->_taxes_html .= $this->_tax_row($line_item, $options); |
|
94 | - } |
|
95 | - break; |
|
96 | - |
|
97 | - case EEM_Line_Item::type_tax_sub_total: |
|
98 | - foreach ($line_item->children() as $child_line_item) { |
|
99 | - if ($child_line_item->type() == EEM_Line_Item::type_tax) { |
|
100 | - $this->display_line_item($child_line_item, $options); |
|
101 | - } |
|
102 | - } |
|
103 | - break; |
|
104 | - |
|
105 | - case EEM_Line_Item::type_total: |
|
106 | - // determine whether to display taxes or not |
|
107 | - $this->_show_taxes = $line_item->get_total_tax() > 0 ? true : false; |
|
108 | - // get all child line items |
|
109 | - $children = $line_item->children(); |
|
110 | - |
|
111 | - // loop thru all non-tax child line items |
|
112 | - foreach ($children as $child_line_item) { |
|
113 | - $html .= $this->display_line_item($child_line_item, $options); |
|
114 | - } |
|
115 | - |
|
116 | - $html .= $this->_taxes_html; |
|
117 | - $html .= $this->_total_row($line_item, $options); |
|
118 | - if ($options['use_table_wrapper']) { |
|
119 | - $html = $this->_table_header($options) . $html . $this->_table_footer($options); |
|
120 | - } |
|
121 | - break; |
|
122 | - } |
|
123 | - |
|
124 | - return $html; |
|
125 | - } |
|
126 | - |
|
127 | - |
|
128 | - |
|
129 | - /** |
|
130 | - * Table header for display. |
|
131 | - * @since 4.8 |
|
132 | - * @param array $options |
|
133 | - * @return string |
|
134 | - */ |
|
135 | - protected function _table_header($options) |
|
136 | - { |
|
137 | - $html = EEH_HTML::table('', '', $options['table_css_class']); |
|
138 | - $html .= EEH_HTML::thead(); |
|
139 | - $html .= EEH_HTML::tr(); |
|
140 | - $html .= EEH_HTML::th(esc_html__('Name', 'event_espresso'), '', 'jst-left'); |
|
141 | - $html .= EEH_HTML::th(esc_html__('Type', 'event_espresso'), '', 'jst-left'); |
|
142 | - $html .= EEH_HTML::th(esc_html__('Amount', 'event_espresso'), '', 'jst-cntr'); |
|
143 | - $html .= EEH_HTML::th(esc_html__('Qty', 'event_espresso'), '', 'jst-cntr'); |
|
144 | - $html .= EEH_HTML::th(esc_html__('Line Total', 'event_espresso'), '', 'jst-cntr'); |
|
145 | - $html .= EEH_HTML::tbody(); |
|
146 | - return $html; |
|
147 | - } |
|
148 | - |
|
149 | - |
|
150 | - /** |
|
151 | - * Table footer for display |
|
152 | - * @since 4.8 |
|
153 | - * @param array $options array of options for the table. |
|
154 | - * @return string |
|
155 | - */ |
|
156 | - protected function _table_footer($options) |
|
157 | - { |
|
158 | - return EEH_HTML::tbodyx() . EEH_HTML::tablex(); |
|
159 | - } |
|
160 | - |
|
161 | - |
|
162 | - |
|
163 | - /** |
|
164 | - * _item_row |
|
165 | - * |
|
166 | - * @param EE_Line_Item $line_item |
|
167 | - * @param array $options |
|
168 | - * @return mixed |
|
169 | - */ |
|
170 | - protected function _item_row(EE_Line_Item $line_item, $options = array()) |
|
171 | - { |
|
172 | - $line_item_related_object = $line_item->get_object(); |
|
173 | - $parent_line_item_related_object = $line_item->parent() instanceof EE_Line_Item ? $line_item->parent()->get_object() : null; |
|
174 | - // start of row |
|
175 | - $row_class = $options['odd'] ? 'item odd' : 'item'; |
|
176 | - $html = EEH_HTML::tr('', '', $row_class); |
|
177 | - |
|
178 | - |
|
179 | - // Name Column |
|
180 | - $name_link = $line_item_related_object instanceof EEI_Admin_Links ? $line_item_related_object->get_admin_details_link() : ''; |
|
181 | - |
|
182 | - // related object scope. |
|
183 | - $parent_related_object_name = $parent_line_item_related_object instanceof EEI_Line_Item_Object ? $parent_line_item_related_object->name() : ''; |
|
184 | - $parent_related_object_name = empty($parent_related_object_name) && $line_item->parent() instanceof EE_Line_Item ? $line_item->parent()->name() : $parent_related_object_name; |
|
185 | - $parent_related_object_link = $parent_line_item_related_object instanceof EEI_Admin_Links ? $parent_line_item_related_object->get_admin_details_link() : ''; |
|
186 | - |
|
187 | - |
|
188 | - $name_html = $line_item_related_object instanceof EEI_Line_Item_Object ? $line_item_related_object->name() : $line_item->name(); |
|
189 | - $name_html = $name_link ? '<a href="' . $name_link . '">' . $name_html . '</a>' : $name_html; |
|
190 | - $name_html .= $line_item->is_taxable() ? ' *' : ''; |
|
191 | - // maybe preface with icon? |
|
192 | - $name_html = $line_item_related_object instanceof EEI_Has_Icon ? $line_item_related_object->get_icon() . $name_html : $name_html; |
|
193 | - $name_html = '<span class="ee-line-item-name linked">' . $name_html . '</span><br>'; |
|
194 | - $name_html .= sprintf( |
|
195 | - _x('%1$sfor the %2$s: %3$s%4$s', 'eg. "for the Event: My Cool Event"', 'event_espresso'), |
|
196 | - '<span class="ee-line-item-related-parent-object">', |
|
197 | - $line_item->parent() instanceof EE_Line_Item ? $line_item->parent()->OBJ_type_i18n() : esc_html__('Item:', 'event_espresso'), |
|
198 | - $parent_related_object_link ? '<a href="' . $parent_related_object_link . '">' . $parent_related_object_name . '</a>' : $parent_related_object_name, |
|
199 | - '</span>' |
|
200 | - ); |
|
201 | - |
|
202 | - $name_html = apply_filters( |
|
203 | - 'FHEE__EE_Admin_Table_Line_Item_Display_Strategy___item_row__name_html', |
|
204 | - $name_html, |
|
205 | - $line_item, |
|
206 | - $options |
|
207 | - ); |
|
208 | - |
|
209 | - $html .= EEH_HTML::td($name_html, '', 'jst-left'); |
|
210 | - // Type Column |
|
211 | - $type_html = $line_item->OBJ_type() ? $line_item->OBJ_type_i18n() : ''; |
|
212 | - $type_html .= $this->_get_cancellations($line_item); |
|
213 | - $type_html .= $line_item->OBJ_type() ? '<br />' : ''; |
|
214 | - $code = $line_item_related_object instanceof EEI_Has_Code ? $line_item_related_object->code() : ''; |
|
215 | - $type_html .= ! empty($code) ? '<span class="ee-line-item-id">' . sprintf(esc_html__('Code: %s', 'event_espresso'), $code) . '</span>' : ''; |
|
216 | - $html .= EEH_HTML::td($type_html, '', 'jst-left'); |
|
217 | - |
|
218 | - |
|
219 | - // Amount Column |
|
220 | - if ($line_item->is_percent()) { |
|
221 | - $html .= EEH_HTML::td($line_item->percent() . '%', '', 'jst-rght'); |
|
222 | - } else { |
|
223 | - $html .= EEH_HTML::td($line_item->unit_price_no_code(), '', 'jst-rght'); |
|
224 | - } |
|
225 | - |
|
226 | - // QTY column |
|
227 | - $html .= EEH_HTML::td($line_item->quantity(), '', 'jst-rght'); |
|
228 | - |
|
229 | - // total column |
|
230 | - $html .= EEH_HTML::td(EEH_Template::format_currency($line_item->total(), false, false), '', 'jst-rght'); |
|
231 | - |
|
232 | - // finish things off and return |
|
233 | - $html .= EEH_HTML::trx(); |
|
234 | - return $html; |
|
235 | - } |
|
236 | - |
|
237 | - |
|
238 | - |
|
239 | - /** |
|
240 | - * _get_cancellations |
|
241 | - * |
|
242 | - * @param EE_Line_Item $line_item |
|
243 | - * @return string |
|
244 | - */ |
|
245 | - protected function _get_cancellations(EE_Line_Item $line_item) |
|
246 | - { |
|
247 | - $html = ''; |
|
248 | - $cancellations = $line_item->get_cancellations(); |
|
249 | - $cancellation = reset($cancellations); |
|
250 | - // \EEH_Debug_Tools::printr( $cancellation, '$cancellation', __FILE__, __LINE__ ); |
|
251 | - if ($cancellation instanceof EE_Line_Item) { |
|
252 | - $html .= ' <span class="ee-line-item-id">'; |
|
253 | - $html .= sprintf( |
|
254 | - _n( |
|
255 | - '(%1$s Cancellation)', |
|
256 | - '(%1$s Cancellations)', |
|
257 | - $cancellation->quantity(), |
|
258 | - 'event_espresso' |
|
259 | - ), |
|
260 | - $cancellation->quantity() |
|
261 | - ); |
|
262 | - $html .= '</span>'; |
|
263 | - } |
|
264 | - return $html; |
|
265 | - } |
|
266 | - |
|
267 | - |
|
268 | - |
|
269 | - /** |
|
270 | - * _sub_item_row |
|
271 | - * |
|
272 | - * @param EE_Line_Item $line_item |
|
273 | - * @param array $options |
|
274 | - * @return mixed |
|
275 | - */ |
|
276 | - protected function _sub_item_row(EE_Line_Item $line_item, $options = array()) |
|
277 | - { |
|
278 | - // for now we're not showing sub-items |
|
279 | - return ''; |
|
280 | - } |
|
281 | - |
|
282 | - |
|
283 | - |
|
284 | - /** |
|
285 | - * _tax_row |
|
286 | - * |
|
287 | - * @param EE_Line_Item $line_item |
|
288 | - * @param array $options |
|
289 | - * @return mixed |
|
290 | - */ |
|
291 | - protected function _tax_row(EE_Line_Item $line_item, $options = array()) |
|
292 | - { |
|
293 | - // start of row |
|
294 | - $html = EEH_HTML::tr('', 'admin-primary-mbox-taxes-tr'); |
|
295 | - // name th |
|
296 | - $html .= EEH_HTML::th($line_item->name() . '(' . $line_item->get_pretty('LIN_percent') . '%)', '', 'jst-rght', '', ' colspan="4"'); |
|
297 | - // total th |
|
298 | - $html .= EEH_HTML::th(EEH_Template::format_currency($line_item->total(), false, false), '', 'jst-rght'); |
|
299 | - // end of row |
|
300 | - $html .= EEH_HTML::trx(); |
|
301 | - return $html; |
|
302 | - } |
|
303 | - |
|
304 | - |
|
305 | - |
|
306 | - |
|
307 | - /** |
|
308 | - * _total_row |
|
309 | - * |
|
310 | - * @param EE_Line_Item $line_item |
|
311 | - * @param string $text |
|
312 | - * @param array $options |
|
313 | - * @return mixed |
|
314 | - */ |
|
315 | - protected function _sub_total_row(EE_Line_Item $line_item, $text = '', $options = array()) |
|
316 | - { |
|
317 | - // currently not showing subtotal row |
|
318 | - return ''; |
|
319 | - } |
|
320 | - |
|
321 | - |
|
322 | - |
|
323 | - /** |
|
324 | - * _total_row |
|
325 | - * |
|
326 | - * @param EE_Line_Item $line_item |
|
327 | - * @param array $options |
|
328 | - * @return mixed |
|
329 | - */ |
|
330 | - protected function _total_row(EE_Line_Item $line_item, $options = array()) |
|
331 | - { |
|
332 | - // start of row |
|
333 | - $html = EEH_HTML::tr('', '', 'admin-primary-mbox-total-tr'); |
|
334 | - // Total th label |
|
335 | - $total_label = sprintf(esc_html__('Transaction Total %s', 'event_espresso'), '(' . EE_Registry::instance()->CFG->currency->code . ')'); |
|
336 | - $html .= EEH_HTML::th($total_label, '', 'jst-rght', '', ' colspan="4"'); |
|
337 | - // total th |
|
338 | - |
|
339 | - $html .= EEH_HTML::th(EEH_Template::format_currency($line_item->total(), false, false), '', 'jst-rght'); |
|
340 | - // end of row |
|
341 | - $html .= EEH_HTML::trx(); |
|
342 | - return $html; |
|
343 | - } |
|
16 | + /** |
|
17 | + * whether to display the taxes row or not |
|
18 | + * @type bool $_show_taxes |
|
19 | + */ |
|
20 | + protected $_show_taxes = false; |
|
21 | + |
|
22 | + /** |
|
23 | + * html for any tax rows |
|
24 | + * @type string $_show_taxes |
|
25 | + */ |
|
26 | + protected $_taxes_html = ''; |
|
27 | + |
|
28 | + |
|
29 | + /** |
|
30 | + * total amount including tax we can bill for at this time |
|
31 | + * @type float $_grand_total |
|
32 | + */ |
|
33 | + protected $_grand_total = 0.00; |
|
34 | + |
|
35 | + |
|
36 | + |
|
37 | + /** |
|
38 | + * @return float |
|
39 | + */ |
|
40 | + public function grand_total() |
|
41 | + { |
|
42 | + return $this->_grand_total; |
|
43 | + } |
|
44 | + |
|
45 | + |
|
46 | + |
|
47 | + /** |
|
48 | + * This is used to output a single |
|
49 | + * @param EE_Line_Item $line_item |
|
50 | + * @param array $options |
|
51 | + * @return mixed |
|
52 | + */ |
|
53 | + public function display_line_item(EE_Line_Item $line_item, $options = array()) |
|
54 | + { |
|
55 | + |
|
56 | + $html = ''; |
|
57 | + // set some default options and merge with incoming |
|
58 | + $default_options = array( |
|
59 | + 'odd' => true, |
|
60 | + 'use_table_wrapper' => true, |
|
61 | + 'table_css_class' => 'admin-primary-mbox-tbl', |
|
62 | + 'taxes_tr_css_class' => 'admin-primary-mbox-taxes-tr', |
|
63 | + 'total_tr_css_class' => 'admin-primary-mbox-total-tr' |
|
64 | + ); |
|
65 | + $options = array_merge($default_options, (array) $options); |
|
66 | + |
|
67 | + switch ($line_item->type()) { |
|
68 | + case EEM_Line_Item::type_line_item: |
|
69 | + // item row |
|
70 | + $html .= $this->_item_row($line_item, $options); |
|
71 | + break; |
|
72 | + |
|
73 | + case EEM_Line_Item::type_sub_line_item: |
|
74 | + $html .= $this->_sub_item_row($line_item, $options); |
|
75 | + break; |
|
76 | + |
|
77 | + case EEM_Line_Item::type_sub_total: |
|
78 | + if ($line_item->quantity() === 0) { |
|
79 | + return $html; |
|
80 | + } |
|
81 | + // loop through children |
|
82 | + $child_line_items = $line_item->children(); |
|
83 | + // loop through children |
|
84 | + foreach ($child_line_items as $child_line_item) { |
|
85 | + // recursively feed children back into this method |
|
86 | + $html .= $this->display_line_item($child_line_item, $options); |
|
87 | + } |
|
88 | + $html .= $this->_sub_total_row($line_item, $options); |
|
89 | + break; |
|
90 | + |
|
91 | + case EEM_Line_Item::type_tax: |
|
92 | + if ($this->_show_taxes) { |
|
93 | + $this->_taxes_html .= $this->_tax_row($line_item, $options); |
|
94 | + } |
|
95 | + break; |
|
96 | + |
|
97 | + case EEM_Line_Item::type_tax_sub_total: |
|
98 | + foreach ($line_item->children() as $child_line_item) { |
|
99 | + if ($child_line_item->type() == EEM_Line_Item::type_tax) { |
|
100 | + $this->display_line_item($child_line_item, $options); |
|
101 | + } |
|
102 | + } |
|
103 | + break; |
|
104 | + |
|
105 | + case EEM_Line_Item::type_total: |
|
106 | + // determine whether to display taxes or not |
|
107 | + $this->_show_taxes = $line_item->get_total_tax() > 0 ? true : false; |
|
108 | + // get all child line items |
|
109 | + $children = $line_item->children(); |
|
110 | + |
|
111 | + // loop thru all non-tax child line items |
|
112 | + foreach ($children as $child_line_item) { |
|
113 | + $html .= $this->display_line_item($child_line_item, $options); |
|
114 | + } |
|
115 | + |
|
116 | + $html .= $this->_taxes_html; |
|
117 | + $html .= $this->_total_row($line_item, $options); |
|
118 | + if ($options['use_table_wrapper']) { |
|
119 | + $html = $this->_table_header($options) . $html . $this->_table_footer($options); |
|
120 | + } |
|
121 | + break; |
|
122 | + } |
|
123 | + |
|
124 | + return $html; |
|
125 | + } |
|
126 | + |
|
127 | + |
|
128 | + |
|
129 | + /** |
|
130 | + * Table header for display. |
|
131 | + * @since 4.8 |
|
132 | + * @param array $options |
|
133 | + * @return string |
|
134 | + */ |
|
135 | + protected function _table_header($options) |
|
136 | + { |
|
137 | + $html = EEH_HTML::table('', '', $options['table_css_class']); |
|
138 | + $html .= EEH_HTML::thead(); |
|
139 | + $html .= EEH_HTML::tr(); |
|
140 | + $html .= EEH_HTML::th(esc_html__('Name', 'event_espresso'), '', 'jst-left'); |
|
141 | + $html .= EEH_HTML::th(esc_html__('Type', 'event_espresso'), '', 'jst-left'); |
|
142 | + $html .= EEH_HTML::th(esc_html__('Amount', 'event_espresso'), '', 'jst-cntr'); |
|
143 | + $html .= EEH_HTML::th(esc_html__('Qty', 'event_espresso'), '', 'jst-cntr'); |
|
144 | + $html .= EEH_HTML::th(esc_html__('Line Total', 'event_espresso'), '', 'jst-cntr'); |
|
145 | + $html .= EEH_HTML::tbody(); |
|
146 | + return $html; |
|
147 | + } |
|
148 | + |
|
149 | + |
|
150 | + /** |
|
151 | + * Table footer for display |
|
152 | + * @since 4.8 |
|
153 | + * @param array $options array of options for the table. |
|
154 | + * @return string |
|
155 | + */ |
|
156 | + protected function _table_footer($options) |
|
157 | + { |
|
158 | + return EEH_HTML::tbodyx() . EEH_HTML::tablex(); |
|
159 | + } |
|
160 | + |
|
161 | + |
|
162 | + |
|
163 | + /** |
|
164 | + * _item_row |
|
165 | + * |
|
166 | + * @param EE_Line_Item $line_item |
|
167 | + * @param array $options |
|
168 | + * @return mixed |
|
169 | + */ |
|
170 | + protected function _item_row(EE_Line_Item $line_item, $options = array()) |
|
171 | + { |
|
172 | + $line_item_related_object = $line_item->get_object(); |
|
173 | + $parent_line_item_related_object = $line_item->parent() instanceof EE_Line_Item ? $line_item->parent()->get_object() : null; |
|
174 | + // start of row |
|
175 | + $row_class = $options['odd'] ? 'item odd' : 'item'; |
|
176 | + $html = EEH_HTML::tr('', '', $row_class); |
|
177 | + |
|
178 | + |
|
179 | + // Name Column |
|
180 | + $name_link = $line_item_related_object instanceof EEI_Admin_Links ? $line_item_related_object->get_admin_details_link() : ''; |
|
181 | + |
|
182 | + // related object scope. |
|
183 | + $parent_related_object_name = $parent_line_item_related_object instanceof EEI_Line_Item_Object ? $parent_line_item_related_object->name() : ''; |
|
184 | + $parent_related_object_name = empty($parent_related_object_name) && $line_item->parent() instanceof EE_Line_Item ? $line_item->parent()->name() : $parent_related_object_name; |
|
185 | + $parent_related_object_link = $parent_line_item_related_object instanceof EEI_Admin_Links ? $parent_line_item_related_object->get_admin_details_link() : ''; |
|
186 | + |
|
187 | + |
|
188 | + $name_html = $line_item_related_object instanceof EEI_Line_Item_Object ? $line_item_related_object->name() : $line_item->name(); |
|
189 | + $name_html = $name_link ? '<a href="' . $name_link . '">' . $name_html . '</a>' : $name_html; |
|
190 | + $name_html .= $line_item->is_taxable() ? ' *' : ''; |
|
191 | + // maybe preface with icon? |
|
192 | + $name_html = $line_item_related_object instanceof EEI_Has_Icon ? $line_item_related_object->get_icon() . $name_html : $name_html; |
|
193 | + $name_html = '<span class="ee-line-item-name linked">' . $name_html . '</span><br>'; |
|
194 | + $name_html .= sprintf( |
|
195 | + _x('%1$sfor the %2$s: %3$s%4$s', 'eg. "for the Event: My Cool Event"', 'event_espresso'), |
|
196 | + '<span class="ee-line-item-related-parent-object">', |
|
197 | + $line_item->parent() instanceof EE_Line_Item ? $line_item->parent()->OBJ_type_i18n() : esc_html__('Item:', 'event_espresso'), |
|
198 | + $parent_related_object_link ? '<a href="' . $parent_related_object_link . '">' . $parent_related_object_name . '</a>' : $parent_related_object_name, |
|
199 | + '</span>' |
|
200 | + ); |
|
201 | + |
|
202 | + $name_html = apply_filters( |
|
203 | + 'FHEE__EE_Admin_Table_Line_Item_Display_Strategy___item_row__name_html', |
|
204 | + $name_html, |
|
205 | + $line_item, |
|
206 | + $options |
|
207 | + ); |
|
208 | + |
|
209 | + $html .= EEH_HTML::td($name_html, '', 'jst-left'); |
|
210 | + // Type Column |
|
211 | + $type_html = $line_item->OBJ_type() ? $line_item->OBJ_type_i18n() : ''; |
|
212 | + $type_html .= $this->_get_cancellations($line_item); |
|
213 | + $type_html .= $line_item->OBJ_type() ? '<br />' : ''; |
|
214 | + $code = $line_item_related_object instanceof EEI_Has_Code ? $line_item_related_object->code() : ''; |
|
215 | + $type_html .= ! empty($code) ? '<span class="ee-line-item-id">' . sprintf(esc_html__('Code: %s', 'event_espresso'), $code) . '</span>' : ''; |
|
216 | + $html .= EEH_HTML::td($type_html, '', 'jst-left'); |
|
217 | + |
|
218 | + |
|
219 | + // Amount Column |
|
220 | + if ($line_item->is_percent()) { |
|
221 | + $html .= EEH_HTML::td($line_item->percent() . '%', '', 'jst-rght'); |
|
222 | + } else { |
|
223 | + $html .= EEH_HTML::td($line_item->unit_price_no_code(), '', 'jst-rght'); |
|
224 | + } |
|
225 | + |
|
226 | + // QTY column |
|
227 | + $html .= EEH_HTML::td($line_item->quantity(), '', 'jst-rght'); |
|
228 | + |
|
229 | + // total column |
|
230 | + $html .= EEH_HTML::td(EEH_Template::format_currency($line_item->total(), false, false), '', 'jst-rght'); |
|
231 | + |
|
232 | + // finish things off and return |
|
233 | + $html .= EEH_HTML::trx(); |
|
234 | + return $html; |
|
235 | + } |
|
236 | + |
|
237 | + |
|
238 | + |
|
239 | + /** |
|
240 | + * _get_cancellations |
|
241 | + * |
|
242 | + * @param EE_Line_Item $line_item |
|
243 | + * @return string |
|
244 | + */ |
|
245 | + protected function _get_cancellations(EE_Line_Item $line_item) |
|
246 | + { |
|
247 | + $html = ''; |
|
248 | + $cancellations = $line_item->get_cancellations(); |
|
249 | + $cancellation = reset($cancellations); |
|
250 | + // \EEH_Debug_Tools::printr( $cancellation, '$cancellation', __FILE__, __LINE__ ); |
|
251 | + if ($cancellation instanceof EE_Line_Item) { |
|
252 | + $html .= ' <span class="ee-line-item-id">'; |
|
253 | + $html .= sprintf( |
|
254 | + _n( |
|
255 | + '(%1$s Cancellation)', |
|
256 | + '(%1$s Cancellations)', |
|
257 | + $cancellation->quantity(), |
|
258 | + 'event_espresso' |
|
259 | + ), |
|
260 | + $cancellation->quantity() |
|
261 | + ); |
|
262 | + $html .= '</span>'; |
|
263 | + } |
|
264 | + return $html; |
|
265 | + } |
|
266 | + |
|
267 | + |
|
268 | + |
|
269 | + /** |
|
270 | + * _sub_item_row |
|
271 | + * |
|
272 | + * @param EE_Line_Item $line_item |
|
273 | + * @param array $options |
|
274 | + * @return mixed |
|
275 | + */ |
|
276 | + protected function _sub_item_row(EE_Line_Item $line_item, $options = array()) |
|
277 | + { |
|
278 | + // for now we're not showing sub-items |
|
279 | + return ''; |
|
280 | + } |
|
281 | + |
|
282 | + |
|
283 | + |
|
284 | + /** |
|
285 | + * _tax_row |
|
286 | + * |
|
287 | + * @param EE_Line_Item $line_item |
|
288 | + * @param array $options |
|
289 | + * @return mixed |
|
290 | + */ |
|
291 | + protected function _tax_row(EE_Line_Item $line_item, $options = array()) |
|
292 | + { |
|
293 | + // start of row |
|
294 | + $html = EEH_HTML::tr('', 'admin-primary-mbox-taxes-tr'); |
|
295 | + // name th |
|
296 | + $html .= EEH_HTML::th($line_item->name() . '(' . $line_item->get_pretty('LIN_percent') . '%)', '', 'jst-rght', '', ' colspan="4"'); |
|
297 | + // total th |
|
298 | + $html .= EEH_HTML::th(EEH_Template::format_currency($line_item->total(), false, false), '', 'jst-rght'); |
|
299 | + // end of row |
|
300 | + $html .= EEH_HTML::trx(); |
|
301 | + return $html; |
|
302 | + } |
|
303 | + |
|
304 | + |
|
305 | + |
|
306 | + |
|
307 | + /** |
|
308 | + * _total_row |
|
309 | + * |
|
310 | + * @param EE_Line_Item $line_item |
|
311 | + * @param string $text |
|
312 | + * @param array $options |
|
313 | + * @return mixed |
|
314 | + */ |
|
315 | + protected function _sub_total_row(EE_Line_Item $line_item, $text = '', $options = array()) |
|
316 | + { |
|
317 | + // currently not showing subtotal row |
|
318 | + return ''; |
|
319 | + } |
|
320 | + |
|
321 | + |
|
322 | + |
|
323 | + /** |
|
324 | + * _total_row |
|
325 | + * |
|
326 | + * @param EE_Line_Item $line_item |
|
327 | + * @param array $options |
|
328 | + * @return mixed |
|
329 | + */ |
|
330 | + protected function _total_row(EE_Line_Item $line_item, $options = array()) |
|
331 | + { |
|
332 | + // start of row |
|
333 | + $html = EEH_HTML::tr('', '', 'admin-primary-mbox-total-tr'); |
|
334 | + // Total th label |
|
335 | + $total_label = sprintf(esc_html__('Transaction Total %s', 'event_espresso'), '(' . EE_Registry::instance()->CFG->currency->code . ')'); |
|
336 | + $html .= EEH_HTML::th($total_label, '', 'jst-rght', '', ' colspan="4"'); |
|
337 | + // total th |
|
338 | + |
|
339 | + $html .= EEH_HTML::th(EEH_Template::format_currency($line_item->total(), false, false), '', 'jst-rght'); |
|
340 | + // end of row |
|
341 | + $html .= EEH_HTML::trx(); |
|
342 | + return $html; |
|
343 | + } |
|
344 | 344 | } |
@@ -14,191 +14,191 @@ |
||
14 | 14 | class EE_Admin_Table_Registration_Line_Item_Display_Strategy extends EE_Admin_Table_Line_Item_Display_Strategy |
15 | 15 | { |
16 | 16 | |
17 | - /** |
|
18 | - * Table header for display. |
|
19 | - * @since 4.8 |
|
20 | - * @param array $options |
|
21 | - * @return string |
|
22 | - */ |
|
23 | - protected function _table_header($options) |
|
24 | - { |
|
25 | - $html = EEH_HTML::table('', '', $options['table_css_class']); |
|
26 | - $html .= EEH_HTML::thead(); |
|
27 | - $html .= EEH_HTML::tr(); |
|
28 | - $html .= EEH_HTML::th(esc_html__('Name', 'event_espresso'), '', 'jst-left'); |
|
29 | - $html .= EEH_HTML::th(esc_html__('Type', 'event_espresso'), '', 'jst-left'); |
|
30 | - $html .= EEH_HTML::th(esc_html__('Date(s)', 'event_espresso'), '', 'jst-left'); |
|
31 | - $html .= EEH_HTML::th(esc_html__('Amount', 'event_espresso'), '', 'jst-cntr'); |
|
32 | - $html .= EEH_HTML::tbody(); |
|
33 | - return $html; |
|
34 | - } |
|
35 | - |
|
36 | - |
|
37 | - |
|
38 | - |
|
39 | - |
|
40 | - /** |
|
41 | - * _item_row |
|
42 | - * |
|
43 | - * @param EE_Line_Item $line_item |
|
44 | - * @param array $options |
|
45 | - * @return mixed |
|
46 | - */ |
|
47 | - protected function _item_row(EE_Line_Item $line_item, $options = array()) |
|
48 | - { |
|
49 | - $line_item_related_object = $line_item->get_object(); |
|
50 | - $parent_line_item_related_object = $line_item->parent() instanceof EE_Line_Item |
|
51 | - ? $line_item->parent()->get_object() |
|
52 | - : null; |
|
53 | - // start of row |
|
54 | - $row_class = $options['odd'] ? 'item odd' : 'item'; |
|
55 | - $html = EEH_HTML::tr('', '', $row_class); |
|
56 | - |
|
57 | - |
|
58 | - // Name Column |
|
59 | - $name_link = $line_item_related_object instanceof EEI_Admin_Links ? $line_item_related_object->get_admin_details_link() : ''; |
|
60 | - |
|
61 | - // related object scope. |
|
62 | - $parent_related_object_name = $parent_line_item_related_object instanceof EEI_Line_Item_Object |
|
63 | - ? $parent_line_item_related_object->name() |
|
64 | - : ''; |
|
65 | - $parent_related_object_name = empty($parent_related_object_name) && $line_item->parent() instanceof EE_Line_Item |
|
66 | - ? $line_item->parent()->name() |
|
67 | - : $parent_related_object_name; |
|
68 | - $parent_related_object_link = $parent_line_item_related_object instanceof EEI_Admin_Links |
|
69 | - ? $parent_line_item_related_object->get_admin_details_link() |
|
70 | - : ''; |
|
71 | - |
|
72 | - |
|
73 | - $name_html = $line_item_related_object instanceof EEI_Line_Item_Object |
|
74 | - ? $line_item_related_object->name() : $line_item->name(); |
|
75 | - $name_html = $name_link ? '<a href="' . $name_link . '">' . $name_html . '</a>' |
|
76 | - : $name_html; |
|
77 | - $name_html .= $line_item->is_taxable() ? ' *' : ''; |
|
78 | - // maybe preface with icon? |
|
79 | - $name_html = $line_item_related_object instanceof EEI_Has_Icon |
|
80 | - ? $line_item_related_object->get_icon() . $name_html |
|
81 | - : $name_html; |
|
82 | - $name_html = '<span class="ee-line-item-name linked">' . $name_html . '</span><br>'; |
|
83 | - $name_html .= sprintf( |
|
84 | - _x('%1$sfor the %2$s: %3$s%4$s', 'eg. "for the Event: My Cool Event"', 'event_espresso'), |
|
85 | - '<span class="ee-line-item-related-parent-object">', |
|
86 | - $line_item->parent() instanceof EE_Line_Item |
|
87 | - ? $line_item->parent()->OBJ_type_i18n() |
|
88 | - : esc_html__('Item:', 'event_espresso'), |
|
89 | - $parent_related_object_link |
|
90 | - ? '<a href="' . $parent_related_object_link . '">' . $parent_related_object_name . '</a>' |
|
91 | - : $parent_related_object_name, |
|
92 | - '</span>' |
|
93 | - ); |
|
94 | - |
|
95 | - $name_html = apply_filters( |
|
96 | - 'FHEE__EE_Admin_Table_Registration_Line_Item_Display_Strategy___item_row__name_html', |
|
97 | - $name_html, |
|
98 | - $line_item, |
|
99 | - $options |
|
100 | - ); |
|
101 | - |
|
102 | - $html .= EEH_HTML::td($name_html, '', 'jst-left'); |
|
103 | - // Type Column |
|
104 | - $type_html = $line_item->OBJ_type() ? $line_item->OBJ_type_i18n() : ''; |
|
105 | - $type_html .= $this->_get_cancellations($line_item); |
|
106 | - $type_html .= $line_item->OBJ_type() ? '<br />' : ''; |
|
107 | - $code = $line_item_related_object instanceof EEI_Has_Code ? $line_item_related_object->code() : ''; |
|
108 | - $type_html .= ! empty($code) ? '<span class="ee-line-item-id">' . sprintf(esc_html__('Code: %s', 'event_espresso'), $code) . '</span>' : ''; |
|
109 | - $html .= EEH_HTML::td($type_html, '', 'jst-left'); |
|
110 | - |
|
111 | - // Date column |
|
112 | - $datetime_content = ''; |
|
113 | - if ($line_item_related_object instanceof EE_Ticket) { |
|
114 | - $datetimes = $line_item_related_object->datetimes(); |
|
115 | - foreach ($datetimes as $datetime) { |
|
116 | - if ($datetime instanceof EE_Datetime) { |
|
117 | - $datetime_content .= $datetime->get_dtt_display_name() . '<br>'; |
|
118 | - } |
|
119 | - } |
|
120 | - } |
|
121 | - $html .= EEH_HTML::td($datetime_content, '', 'jst-left'); |
|
122 | - |
|
123 | - // Amount Column |
|
124 | - if ($line_item->is_percent()) { |
|
125 | - $html .= EEH_HTML::td($line_item->percent() . '%', '', 'jst-rght'); |
|
126 | - } else { |
|
127 | - $html .= EEH_HTML::td($line_item->unit_price_no_code(), '', 'jst-rght'); |
|
128 | - } |
|
129 | - |
|
130 | - |
|
131 | - // finish things off and return |
|
132 | - $html .= EEH_HTML::trx(); |
|
133 | - return $html; |
|
134 | - } |
|
135 | - |
|
136 | - |
|
137 | - |
|
138 | - /** |
|
139 | - * _tax_row |
|
140 | - * |
|
141 | - * @param EE_Line_Item $line_item |
|
142 | - * @param array $options |
|
143 | - * @return mixed |
|
144 | - */ |
|
145 | - protected function _tax_row(EE_Line_Item $line_item, $options = array()) |
|
146 | - { |
|
147 | - // start of row |
|
148 | - $html = EEH_HTML::tr('', 'admin-primary-mbox-taxes-tr'); |
|
149 | - // name th |
|
150 | - $html .= EEH_HTML::th($line_item->name() . '(' . $line_item->get_pretty('LIN_percent') . '%)', '', 'jst-rght', '', ' colspan="3"'); |
|
151 | - // total th |
|
152 | - $html .= EEH_HTML::th(EEH_Template::format_currency($line_item->total(), false, false), '', 'jst-rght'); |
|
153 | - // end of row |
|
154 | - $html .= EEH_HTML::trx(); |
|
155 | - return $html; |
|
156 | - } |
|
157 | - |
|
158 | - |
|
159 | - |
|
160 | - |
|
161 | - |
|
162 | - /** |
|
163 | - * _total_row |
|
164 | - * |
|
165 | - * @param EE_Line_Item $line_item |
|
166 | - * @param array $options |
|
167 | - * @return mixed |
|
168 | - */ |
|
169 | - protected function _total_row(EE_Line_Item $line_item, $options = array()) |
|
170 | - { |
|
171 | - |
|
172 | - $registration = isset($options['EE_Registration']) ? $options['EE_Registration'] : null; |
|
173 | - $registration_total = $registration instanceof EE_Registration ? $registration->pretty_final_price() : 0; |
|
174 | - // if no valid registration object then we're not going to show the approximate text. |
|
175 | - $total_match = $registration instanceof EE_Registration |
|
176 | - ? $registration->final_price() === $line_item->total() |
|
177 | - : true; |
|
178 | - |
|
179 | - // start of row |
|
180 | - $html = EEH_HTML::tr('', '', 'admin-primary-mbox-total-tr'); |
|
181 | - // Total th label |
|
182 | - if ($total_match) { |
|
183 | - $total_label = sprintf(esc_html__('This registration\'s total %s:', 'event_espresso'), '(' . EE_Registry::instance()->CFG->currency->code . ')'); |
|
184 | - } else { |
|
185 | - $total_label = sprintf(esc_html__('This registration\'s approximate total %s', 'event_espresso'), '(' . EE_Registry::instance()->CFG->currency->code . ')'); |
|
186 | - $total_label .= '<br>'; |
|
187 | - $total_label .= '<p class="ee-footnote-text">' |
|
188 | - . sprintf( |
|
189 | - esc_html__('The registrations\' share of the transaction total is approximate because it might not be possible to evenly divide the transaction total among each registration, and so some registrations may need to pay a penny more than others. This registration\'s final share is actually %1$s%2$s%3$s.', 'event_espresso'), |
|
190 | - '<strong>', |
|
191 | - $registration_total, |
|
192 | - '</strong>' |
|
193 | - ) |
|
194 | - . '</p>'; |
|
195 | - } |
|
196 | - $html .= EEH_HTML::th($total_label, '', 'jst-rght', '', ' colspan="3"'); |
|
197 | - // total th |
|
198 | - |
|
199 | - $html .= EEH_HTML::th(EEH_Template::format_currency($line_item->total(), false, false), '', 'jst-rght'); |
|
200 | - // end of row |
|
201 | - $html .= EEH_HTML::trx(); |
|
202 | - return $html; |
|
203 | - } |
|
17 | + /** |
|
18 | + * Table header for display. |
|
19 | + * @since 4.8 |
|
20 | + * @param array $options |
|
21 | + * @return string |
|
22 | + */ |
|
23 | + protected function _table_header($options) |
|
24 | + { |
|
25 | + $html = EEH_HTML::table('', '', $options['table_css_class']); |
|
26 | + $html .= EEH_HTML::thead(); |
|
27 | + $html .= EEH_HTML::tr(); |
|
28 | + $html .= EEH_HTML::th(esc_html__('Name', 'event_espresso'), '', 'jst-left'); |
|
29 | + $html .= EEH_HTML::th(esc_html__('Type', 'event_espresso'), '', 'jst-left'); |
|
30 | + $html .= EEH_HTML::th(esc_html__('Date(s)', 'event_espresso'), '', 'jst-left'); |
|
31 | + $html .= EEH_HTML::th(esc_html__('Amount', 'event_espresso'), '', 'jst-cntr'); |
|
32 | + $html .= EEH_HTML::tbody(); |
|
33 | + return $html; |
|
34 | + } |
|
35 | + |
|
36 | + |
|
37 | + |
|
38 | + |
|
39 | + |
|
40 | + /** |
|
41 | + * _item_row |
|
42 | + * |
|
43 | + * @param EE_Line_Item $line_item |
|
44 | + * @param array $options |
|
45 | + * @return mixed |
|
46 | + */ |
|
47 | + protected function _item_row(EE_Line_Item $line_item, $options = array()) |
|
48 | + { |
|
49 | + $line_item_related_object = $line_item->get_object(); |
|
50 | + $parent_line_item_related_object = $line_item->parent() instanceof EE_Line_Item |
|
51 | + ? $line_item->parent()->get_object() |
|
52 | + : null; |
|
53 | + // start of row |
|
54 | + $row_class = $options['odd'] ? 'item odd' : 'item'; |
|
55 | + $html = EEH_HTML::tr('', '', $row_class); |
|
56 | + |
|
57 | + |
|
58 | + // Name Column |
|
59 | + $name_link = $line_item_related_object instanceof EEI_Admin_Links ? $line_item_related_object->get_admin_details_link() : ''; |
|
60 | + |
|
61 | + // related object scope. |
|
62 | + $parent_related_object_name = $parent_line_item_related_object instanceof EEI_Line_Item_Object |
|
63 | + ? $parent_line_item_related_object->name() |
|
64 | + : ''; |
|
65 | + $parent_related_object_name = empty($parent_related_object_name) && $line_item->parent() instanceof EE_Line_Item |
|
66 | + ? $line_item->parent()->name() |
|
67 | + : $parent_related_object_name; |
|
68 | + $parent_related_object_link = $parent_line_item_related_object instanceof EEI_Admin_Links |
|
69 | + ? $parent_line_item_related_object->get_admin_details_link() |
|
70 | + : ''; |
|
71 | + |
|
72 | + |
|
73 | + $name_html = $line_item_related_object instanceof EEI_Line_Item_Object |
|
74 | + ? $line_item_related_object->name() : $line_item->name(); |
|
75 | + $name_html = $name_link ? '<a href="' . $name_link . '">' . $name_html . '</a>' |
|
76 | + : $name_html; |
|
77 | + $name_html .= $line_item->is_taxable() ? ' *' : ''; |
|
78 | + // maybe preface with icon? |
|
79 | + $name_html = $line_item_related_object instanceof EEI_Has_Icon |
|
80 | + ? $line_item_related_object->get_icon() . $name_html |
|
81 | + : $name_html; |
|
82 | + $name_html = '<span class="ee-line-item-name linked">' . $name_html . '</span><br>'; |
|
83 | + $name_html .= sprintf( |
|
84 | + _x('%1$sfor the %2$s: %3$s%4$s', 'eg. "for the Event: My Cool Event"', 'event_espresso'), |
|
85 | + '<span class="ee-line-item-related-parent-object">', |
|
86 | + $line_item->parent() instanceof EE_Line_Item |
|
87 | + ? $line_item->parent()->OBJ_type_i18n() |
|
88 | + : esc_html__('Item:', 'event_espresso'), |
|
89 | + $parent_related_object_link |
|
90 | + ? '<a href="' . $parent_related_object_link . '">' . $parent_related_object_name . '</a>' |
|
91 | + : $parent_related_object_name, |
|
92 | + '</span>' |
|
93 | + ); |
|
94 | + |
|
95 | + $name_html = apply_filters( |
|
96 | + 'FHEE__EE_Admin_Table_Registration_Line_Item_Display_Strategy___item_row__name_html', |
|
97 | + $name_html, |
|
98 | + $line_item, |
|
99 | + $options |
|
100 | + ); |
|
101 | + |
|
102 | + $html .= EEH_HTML::td($name_html, '', 'jst-left'); |
|
103 | + // Type Column |
|
104 | + $type_html = $line_item->OBJ_type() ? $line_item->OBJ_type_i18n() : ''; |
|
105 | + $type_html .= $this->_get_cancellations($line_item); |
|
106 | + $type_html .= $line_item->OBJ_type() ? '<br />' : ''; |
|
107 | + $code = $line_item_related_object instanceof EEI_Has_Code ? $line_item_related_object->code() : ''; |
|
108 | + $type_html .= ! empty($code) ? '<span class="ee-line-item-id">' . sprintf(esc_html__('Code: %s', 'event_espresso'), $code) . '</span>' : ''; |
|
109 | + $html .= EEH_HTML::td($type_html, '', 'jst-left'); |
|
110 | + |
|
111 | + // Date column |
|
112 | + $datetime_content = ''; |
|
113 | + if ($line_item_related_object instanceof EE_Ticket) { |
|
114 | + $datetimes = $line_item_related_object->datetimes(); |
|
115 | + foreach ($datetimes as $datetime) { |
|
116 | + if ($datetime instanceof EE_Datetime) { |
|
117 | + $datetime_content .= $datetime->get_dtt_display_name() . '<br>'; |
|
118 | + } |
|
119 | + } |
|
120 | + } |
|
121 | + $html .= EEH_HTML::td($datetime_content, '', 'jst-left'); |
|
122 | + |
|
123 | + // Amount Column |
|
124 | + if ($line_item->is_percent()) { |
|
125 | + $html .= EEH_HTML::td($line_item->percent() . '%', '', 'jst-rght'); |
|
126 | + } else { |
|
127 | + $html .= EEH_HTML::td($line_item->unit_price_no_code(), '', 'jst-rght'); |
|
128 | + } |
|
129 | + |
|
130 | + |
|
131 | + // finish things off and return |
|
132 | + $html .= EEH_HTML::trx(); |
|
133 | + return $html; |
|
134 | + } |
|
135 | + |
|
136 | + |
|
137 | + |
|
138 | + /** |
|
139 | + * _tax_row |
|
140 | + * |
|
141 | + * @param EE_Line_Item $line_item |
|
142 | + * @param array $options |
|
143 | + * @return mixed |
|
144 | + */ |
|
145 | + protected function _tax_row(EE_Line_Item $line_item, $options = array()) |
|
146 | + { |
|
147 | + // start of row |
|
148 | + $html = EEH_HTML::tr('', 'admin-primary-mbox-taxes-tr'); |
|
149 | + // name th |
|
150 | + $html .= EEH_HTML::th($line_item->name() . '(' . $line_item->get_pretty('LIN_percent') . '%)', '', 'jst-rght', '', ' colspan="3"'); |
|
151 | + // total th |
|
152 | + $html .= EEH_HTML::th(EEH_Template::format_currency($line_item->total(), false, false), '', 'jst-rght'); |
|
153 | + // end of row |
|
154 | + $html .= EEH_HTML::trx(); |
|
155 | + return $html; |
|
156 | + } |
|
157 | + |
|
158 | + |
|
159 | + |
|
160 | + |
|
161 | + |
|
162 | + /** |
|
163 | + * _total_row |
|
164 | + * |
|
165 | + * @param EE_Line_Item $line_item |
|
166 | + * @param array $options |
|
167 | + * @return mixed |
|
168 | + */ |
|
169 | + protected function _total_row(EE_Line_Item $line_item, $options = array()) |
|
170 | + { |
|
171 | + |
|
172 | + $registration = isset($options['EE_Registration']) ? $options['EE_Registration'] : null; |
|
173 | + $registration_total = $registration instanceof EE_Registration ? $registration->pretty_final_price() : 0; |
|
174 | + // if no valid registration object then we're not going to show the approximate text. |
|
175 | + $total_match = $registration instanceof EE_Registration |
|
176 | + ? $registration->final_price() === $line_item->total() |
|
177 | + : true; |
|
178 | + |
|
179 | + // start of row |
|
180 | + $html = EEH_HTML::tr('', '', 'admin-primary-mbox-total-tr'); |
|
181 | + // Total th label |
|
182 | + if ($total_match) { |
|
183 | + $total_label = sprintf(esc_html__('This registration\'s total %s:', 'event_espresso'), '(' . EE_Registry::instance()->CFG->currency->code . ')'); |
|
184 | + } else { |
|
185 | + $total_label = sprintf(esc_html__('This registration\'s approximate total %s', 'event_espresso'), '(' . EE_Registry::instance()->CFG->currency->code . ')'); |
|
186 | + $total_label .= '<br>'; |
|
187 | + $total_label .= '<p class="ee-footnote-text">' |
|
188 | + . sprintf( |
|
189 | + esc_html__('The registrations\' share of the transaction total is approximate because it might not be possible to evenly divide the transaction total among each registration, and so some registrations may need to pay a penny more than others. This registration\'s final share is actually %1$s%2$s%3$s.', 'event_espresso'), |
|
190 | + '<strong>', |
|
191 | + $registration_total, |
|
192 | + '</strong>' |
|
193 | + ) |
|
194 | + . '</p>'; |
|
195 | + } |
|
196 | + $html .= EEH_HTML::th($total_label, '', 'jst-rght', '', ' colspan="3"'); |
|
197 | + // total th |
|
198 | + |
|
199 | + $html .= EEH_HTML::th(EEH_Template::format_currency($line_item->total(), false, false), '', 'jst-rght'); |
|
200 | + // end of row |
|
201 | + $html .= EEH_HTML::trx(); |
|
202 | + return $html; |
|
203 | + } |
|
204 | 204 | } |
@@ -72,22 +72,22 @@ discard block |
||
72 | 72 | |
73 | 73 | $name_html = $line_item_related_object instanceof EEI_Line_Item_Object |
74 | 74 | ? $line_item_related_object->name() : $line_item->name(); |
75 | - $name_html = $name_link ? '<a href="' . $name_link . '">' . $name_html . '</a>' |
|
75 | + $name_html = $name_link ? '<a href="'.$name_link.'">'.$name_html.'</a>' |
|
76 | 76 | : $name_html; |
77 | 77 | $name_html .= $line_item->is_taxable() ? ' *' : ''; |
78 | 78 | // maybe preface with icon? |
79 | 79 | $name_html = $line_item_related_object instanceof EEI_Has_Icon |
80 | - ? $line_item_related_object->get_icon() . $name_html |
|
80 | + ? $line_item_related_object->get_icon().$name_html |
|
81 | 81 | : $name_html; |
82 | - $name_html = '<span class="ee-line-item-name linked">' . $name_html . '</span><br>'; |
|
83 | - $name_html .= sprintf( |
|
82 | + $name_html = '<span class="ee-line-item-name linked">'.$name_html.'</span><br>'; |
|
83 | + $name_html .= sprintf( |
|
84 | 84 | _x('%1$sfor the %2$s: %3$s%4$s', 'eg. "for the Event: My Cool Event"', 'event_espresso'), |
85 | 85 | '<span class="ee-line-item-related-parent-object">', |
86 | 86 | $line_item->parent() instanceof EE_Line_Item |
87 | 87 | ? $line_item->parent()->OBJ_type_i18n() |
88 | 88 | : esc_html__('Item:', 'event_espresso'), |
89 | 89 | $parent_related_object_link |
90 | - ? '<a href="' . $parent_related_object_link . '">' . $parent_related_object_name . '</a>' |
|
90 | + ? '<a href="'.$parent_related_object_link.'">'.$parent_related_object_name.'</a>' |
|
91 | 91 | : $parent_related_object_name, |
92 | 92 | '</span>' |
93 | 93 | ); |
@@ -105,7 +105,7 @@ discard block |
||
105 | 105 | $type_html .= $this->_get_cancellations($line_item); |
106 | 106 | $type_html .= $line_item->OBJ_type() ? '<br />' : ''; |
107 | 107 | $code = $line_item_related_object instanceof EEI_Has_Code ? $line_item_related_object->code() : ''; |
108 | - $type_html .= ! empty($code) ? '<span class="ee-line-item-id">' . sprintf(esc_html__('Code: %s', 'event_espresso'), $code) . '</span>' : ''; |
|
108 | + $type_html .= ! empty($code) ? '<span class="ee-line-item-id">'.sprintf(esc_html__('Code: %s', 'event_espresso'), $code).'</span>' : ''; |
|
109 | 109 | $html .= EEH_HTML::td($type_html, '', 'jst-left'); |
110 | 110 | |
111 | 111 | // Date column |
@@ -114,7 +114,7 @@ discard block |
||
114 | 114 | $datetimes = $line_item_related_object->datetimes(); |
115 | 115 | foreach ($datetimes as $datetime) { |
116 | 116 | if ($datetime instanceof EE_Datetime) { |
117 | - $datetime_content .= $datetime->get_dtt_display_name() . '<br>'; |
|
117 | + $datetime_content .= $datetime->get_dtt_display_name().'<br>'; |
|
118 | 118 | } |
119 | 119 | } |
120 | 120 | } |
@@ -122,7 +122,7 @@ discard block |
||
122 | 122 | |
123 | 123 | // Amount Column |
124 | 124 | if ($line_item->is_percent()) { |
125 | - $html .= EEH_HTML::td($line_item->percent() . '%', '', 'jst-rght'); |
|
125 | + $html .= EEH_HTML::td($line_item->percent().'%', '', 'jst-rght'); |
|
126 | 126 | } else { |
127 | 127 | $html .= EEH_HTML::td($line_item->unit_price_no_code(), '', 'jst-rght'); |
128 | 128 | } |
@@ -147,7 +147,7 @@ discard block |
||
147 | 147 | // start of row |
148 | 148 | $html = EEH_HTML::tr('', 'admin-primary-mbox-taxes-tr'); |
149 | 149 | // name th |
150 | - $html .= EEH_HTML::th($line_item->name() . '(' . $line_item->get_pretty('LIN_percent') . '%)', '', 'jst-rght', '', ' colspan="3"'); |
|
150 | + $html .= EEH_HTML::th($line_item->name().'('.$line_item->get_pretty('LIN_percent').'%)', '', 'jst-rght', '', ' colspan="3"'); |
|
151 | 151 | // total th |
152 | 152 | $html .= EEH_HTML::th(EEH_Template::format_currency($line_item->total(), false, false), '', 'jst-rght'); |
153 | 153 | // end of row |
@@ -180,9 +180,9 @@ discard block |
||
180 | 180 | $html = EEH_HTML::tr('', '', 'admin-primary-mbox-total-tr'); |
181 | 181 | // Total th label |
182 | 182 | if ($total_match) { |
183 | - $total_label = sprintf(esc_html__('This registration\'s total %s:', 'event_espresso'), '(' . EE_Registry::instance()->CFG->currency->code . ')'); |
|
183 | + $total_label = sprintf(esc_html__('This registration\'s total %s:', 'event_espresso'), '('.EE_Registry::instance()->CFG->currency->code.')'); |
|
184 | 184 | } else { |
185 | - $total_label = sprintf(esc_html__('This registration\'s approximate total %s', 'event_espresso'), '(' . EE_Registry::instance()->CFG->currency->code . ')'); |
|
185 | + $total_label = sprintf(esc_html__('This registration\'s approximate total %s', 'event_espresso'), '('.EE_Registry::instance()->CFG->currency->code.')'); |
|
186 | 186 | $total_label .= '<br>'; |
187 | 187 | $total_label .= '<p class="ee-footnote-text">' |
188 | 188 | . sprintf( |
@@ -38,7 +38,7 @@ discard block |
||
38 | 38 | if (isset($options_array['model']) && $options_array['model'] instanceof EEM_Base) { |
39 | 39 | $this->_model = $options_array['model']; |
40 | 40 | } |
41 | - if (! $this->_model || ! $this->_model instanceof EEM_Base) { |
|
41 | + if ( ! $this->_model || ! $this->_model instanceof EEM_Base) { |
|
42 | 42 | throw new EE_Error(sprintf(esc_html__( |
43 | 43 | "Model Form Sections must first specify the _model property to be a subclass of EEM_Base", |
44 | 44 | "event_espresso" |
@@ -103,10 +103,10 @@ discard block |
||
103 | 103 | switch (get_class($relation_obj)) { |
104 | 104 | case 'EE_HABTM_Relation': |
105 | 105 | if ( |
106 | - isset($subsection_args[ $relation_name ]) |
|
107 | - && isset($subsection_args[ $relation_name ]['model_objects']) |
|
106 | + isset($subsection_args[$relation_name]) |
|
107 | + && isset($subsection_args[$relation_name]['model_objects']) |
|
108 | 108 | ) { |
109 | - $model_objects = $subsection_args[ $relation_name ]['model_objects']; |
|
109 | + $model_objects = $subsection_args[$relation_name]['model_objects']; |
|
110 | 110 | } else { |
111 | 111 | $model_objects = $relation_obj->get_other_model()->get_all(); |
112 | 112 | } |
@@ -115,7 +115,7 @@ discard block |
||
115 | 115 | default: |
116 | 116 | } |
117 | 117 | if ($input) { |
118 | - $inputs[ $relation_name ] = $input; |
|
118 | + $inputs[$relation_name] = $input; |
|
119 | 119 | } |
120 | 120 | } |
121 | 121 | return $inputs; |
@@ -265,7 +265,7 @@ discard block |
||
265 | 265 | } |
266 | 266 | $reflection = new ReflectionClass($input_class); |
267 | 267 | $input = $reflection->newInstanceArgs($input_constructor_args); |
268 | - $inputs[ $field_name ] = $input; |
|
268 | + $inputs[$field_name] = $input; |
|
269 | 269 | } |
270 | 270 | } |
271 | 271 | return $inputs; |
@@ -291,14 +291,14 @@ discard block |
||
291 | 291 | if ($relation_obj instanceof EE_Belongs_To_Relation) { |
292 | 292 | // then we only expect there to be one |
293 | 293 | $related_item = $this->_model_object->get_first_related($relation_name); |
294 | - $defaults[ $relation_name ] = $related_item->ID(); |
|
294 | + $defaults[$relation_name] = $related_item->ID(); |
|
295 | 295 | } else { |
296 | 296 | $related_items = $this->_model_object->get_many_related($relation_name); |
297 | 297 | $ids = array(); |
298 | 298 | foreach ($related_items as $related_item) { |
299 | 299 | $ids[] = $related_item->ID(); |
300 | 300 | } |
301 | - $defaults[ $relation_name ] = $ids; |
|
301 | + $defaults[$relation_name] = $ids; |
|
302 | 302 | } |
303 | 303 | } |
304 | 304 | } |
@@ -336,7 +336,7 @@ discard block |
||
336 | 336 | { |
337 | 337 | parent::_normalize($req_data); |
338 | 338 | // create or set the model object, if it isn't already |
339 | - if (! $this->_model_object) { |
|
339 | + if ( ! $this->_model_object) { |
|
340 | 340 | // check to see if the form indicates a PK, in which case we want to only retrieve it and update it |
341 | 341 | $pk_name = $this->_model->primary_key_name(); |
342 | 342 | $model_obj = $this->_model->get_one_by_ID($this->get_input_value($pk_name)); |
@@ -361,7 +361,7 @@ discard block |
||
361 | 361 | */ |
362 | 362 | public function save() |
363 | 363 | { |
364 | - if (! $this->_model_object) { |
|
364 | + if ( ! $this->_model_object) { |
|
365 | 365 | throw new EE_Error(sprintf(esc_html__( |
366 | 366 | "Cannot save the model form's model object (model is '%s') because there is no model object set. You must either set it, or call receive_form_submission where it is set automatically", |
367 | 367 | "event_espresso" |
@@ -376,7 +376,7 @@ discard block |
||
376 | 376 | } |
377 | 377 | $success = $this->_model_object->save(); |
378 | 378 | foreach ($this->_model->relation_settings() as $relation_name => $relation_obj) { |
379 | - if (isset($this->_subsections[ $relation_name ])) { |
|
379 | + if (isset($this->_subsections[$relation_name])) { |
|
380 | 380 | $success = $this->_save_related_info($relation_name); |
381 | 381 | } |
382 | 382 | } |
@@ -463,8 +463,8 @@ discard block |
||
463 | 463 | */ |
464 | 464 | protected function _set_default_name_if_empty() |
465 | 465 | { |
466 | - if (! $this->_name) { |
|
467 | - $default_name = str_replace("EEM_", "", get_class($this->_model)) . "_Model_Form"; |
|
466 | + if ( ! $this->_name) { |
|
467 | + $default_name = str_replace("EEM_", "", get_class($this->_model))."_Model_Form"; |
|
468 | 468 | $this->_name = $default_name; |
469 | 469 | } |
470 | 470 | } |
@@ -11,460 +11,460 @@ |
||
11 | 11 | */ |
12 | 12 | class EE_Model_Form_Section extends EE_Form_Section_Proper |
13 | 13 | { |
14 | - /** |
|
15 | - * @var EEM_Base |
|
16 | - */ |
|
17 | - protected $_model = null; |
|
18 | - |
|
19 | - /** |
|
20 | - * @var EE_Base_Class |
|
21 | - */ |
|
22 | - protected $_model_object = null; |
|
23 | - |
|
24 | - |
|
25 | - |
|
26 | - /** |
|
27 | - * @param array $options_array keys: { |
|
28 | - * @type EEM_Base $model |
|
29 | - * @type EE_Base_Class $model_object |
|
30 | - * @type array $subsection_args array keys should be subsection names (that either do or will exist), and |
|
31 | - * values are the arrays as you would pass them to that subsection |
|
32 | - * } |
|
33 | - * @throws EE_Error |
|
34 | - */ |
|
35 | - public function __construct($options_array = array()) |
|
36 | - { |
|
37 | - if (isset($options_array['model']) && $options_array['model'] instanceof EEM_Base) { |
|
38 | - $this->_model = $options_array['model']; |
|
39 | - } |
|
40 | - if (! $this->_model || ! $this->_model instanceof EEM_Base) { |
|
41 | - throw new EE_Error(sprintf(esc_html__( |
|
42 | - "Model Form Sections must first specify the _model property to be a subclass of EEM_Base", |
|
43 | - "event_espresso" |
|
44 | - ))); |
|
45 | - } |
|
46 | - if (isset($options_array['subsection_args'])) { |
|
47 | - $subsection_args = $options_array['subsection_args']; |
|
48 | - } else { |
|
49 | - $subsection_args = array(); |
|
50 | - } |
|
51 | - // gather fields and relations to convert to inputs |
|
52 | - // but if they're just going to exclude a field anyways, don't bother converting it to an input |
|
53 | - $exclude = $this->_subsections; |
|
54 | - if (isset($options_array['exclude'])) { |
|
55 | - $exclude = array_merge($exclude, array_flip($options_array['exclude'])); |
|
56 | - } |
|
57 | - $model_fields = array_diff_key($this->_model->field_settings(), $exclude); |
|
58 | - $model_relations = array_diff_key($this->_model->relation_settings(), $exclude); |
|
59 | - // convert fields and relations to inputs |
|
60 | - $this->_subsections = array_merge( |
|
61 | - $this->_convert_model_fields_to_inputs($model_fields), |
|
62 | - $this->_convert_model_relations_to_inputs($model_relations, $subsection_args), |
|
63 | - $this->_subsections |
|
64 | - ); |
|
65 | - parent::__construct($options_array); |
|
66 | - if (isset($options_array['model_object']) && $options_array['model_object'] instanceof EE_Base_Class) { |
|
67 | - $this->populate_model_obj($options_array['model_object']); |
|
68 | - } |
|
69 | - } |
|
70 | - |
|
71 | - |
|
72 | - |
|
73 | - /** |
|
74 | - * For now, just makes inputs for only HABTM relations |
|
75 | - * |
|
76 | - * @param EE_Model_Relation_Base[] $relations |
|
77 | - * @param array $subsection_args keys should be existing or soon-to-be-existing input names, and |
|
78 | - * their values are { |
|
79 | - * @type array { |
|
80 | - * @type EE_Base_Class[] $model_objects if the subsection is an EE_Select_Multi_Model_Input |
|
81 | - * } |
|
82 | - * } |
|
83 | - * @return array |
|
84 | - */ |
|
85 | - protected function _convert_model_relations_to_inputs($relations, $subsection_args = array()) |
|
86 | - { |
|
87 | - $inputs = array(); |
|
88 | - foreach ($relations as $relation_name => $relation_obj) { |
|
89 | - $input_constructor_args = array( |
|
90 | - array_merge( |
|
91 | - array( |
|
92 | - 'required' => $relation_obj instanceof EE_Belongs_To_Relation, |
|
93 | - 'html_label_text' => $relation_obj instanceof EE_Belongs_To_Relation |
|
94 | - ? $relation_obj->get_other_model()->item_name(1) |
|
95 | - : $relation_obj->get_other_model() |
|
96 | - ->item_name(2), |
|
97 | - ), |
|
98 | - $subsection_args |
|
99 | - ), |
|
100 | - ); |
|
101 | - $input = null; |
|
102 | - switch (get_class($relation_obj)) { |
|
103 | - case 'EE_HABTM_Relation': |
|
104 | - if ( |
|
105 | - isset($subsection_args[ $relation_name ]) |
|
106 | - && isset($subsection_args[ $relation_name ]['model_objects']) |
|
107 | - ) { |
|
108 | - $model_objects = $subsection_args[ $relation_name ]['model_objects']; |
|
109 | - } else { |
|
110 | - $model_objects = $relation_obj->get_other_model()->get_all(); |
|
111 | - } |
|
112 | - $input = new EE_Select_Multi_Model_Input($model_objects, $input_constructor_args); |
|
113 | - break; |
|
114 | - default: |
|
115 | - } |
|
116 | - if ($input) { |
|
117 | - $inputs[ $relation_name ] = $input; |
|
118 | - } |
|
119 | - } |
|
120 | - return $inputs; |
|
121 | - } |
|
122 | - |
|
123 | - |
|
124 | - |
|
125 | - /** |
|
126 | - * Changes model fields into form section inputs |
|
127 | - * |
|
128 | - * @param EE_Model_Field_Base[] $model_fields keys are the model's name |
|
129 | - * @throws EE_Error |
|
130 | - * @return EE_Form_Input_Base[] |
|
131 | - */ |
|
132 | - protected function _convert_model_fields_to_inputs($model_fields = array()) |
|
133 | - { |
|
134 | - $inputs = array(); |
|
135 | - foreach ($model_fields as $field_name => $model_field) { |
|
136 | - if ($model_field instanceof EE_Model_Field_Base) { |
|
137 | - $input_constructor_args = array( |
|
138 | - array( |
|
139 | - 'required' => ! $model_field->is_nullable() |
|
140 | - && $model_field->get_default_value() |
|
141 | - === null, |
|
142 | - 'html_label_text' => $model_field->get_nicename(), |
|
143 | - 'default' => $model_field->get_default_value(), |
|
144 | - ), |
|
145 | - ); |
|
146 | - switch (get_class($model_field)) { |
|
147 | - case 'EE_All_Caps_Text_Field': |
|
148 | - case 'EE_Any_Foreign_Model_Name_Field': |
|
149 | - $input_class = 'EE_Text_Input'; |
|
150 | - break; |
|
151 | - case 'EE_Boolean_Field': |
|
152 | - $input_class = 'EE_Yes_No_Input'; |
|
153 | - break; |
|
154 | - case 'EE_Datetime_Field': |
|
155 | - throw new EE_Error(sprintf(esc_html__( |
|
156 | - "Model field '%s' does not yet have a known conversion to form input", |
|
157 | - "event_espresso" |
|
158 | - ), get_class($model_field))); |
|
159 | - break; |
|
160 | - case 'EE_Email_Field': |
|
161 | - $input_class = 'EE_Email_Input'; |
|
162 | - break; |
|
163 | - case 'EE_Enum_Integer_Field': |
|
164 | - throw new EE_Error(sprintf(esc_html__( |
|
165 | - "Model field '%s' does not yet have a known conversion to form input", |
|
166 | - "event_espresso" |
|
167 | - ), get_class($model_field))); |
|
168 | - break; |
|
169 | - case 'EE_Enum_Text_Field': |
|
170 | - throw new EE_Error(sprintf(esc_html__( |
|
171 | - "Model field '%s' does not yet have a known conversion to form input", |
|
172 | - "event_espresso" |
|
173 | - ), get_class($model_field))); |
|
174 | - break; |
|
175 | - case 'EE_Float_Field': |
|
176 | - $input_class = 'EE_Float_Input'; |
|
177 | - break; |
|
178 | - case 'EE_Foreign_Key_Int_Field': |
|
179 | - case 'EE_Foreign_Key_String_Field': |
|
180 | - case 'EE_WP_User_Field': |
|
181 | - $models_pointed_to = $model_field instanceof EE_Field_With_Model_Name |
|
182 | - ? $model_field->get_model_class_names_pointed_to() : array(); |
|
183 | - if (true || is_array($models_pointed_to) && count($models_pointed_to) > 1) { |
|
184 | - $input_class = 'EE_Text_Input'; |
|
185 | - } else { |
|
186 | - // so its just one model |
|
187 | - $model_name = is_array($models_pointed_to) ? reset($models_pointed_to) : $models_pointed_to; |
|
188 | - $model = EE_Registry::instance()->load_model($model_name); |
|
189 | - $model_names = $model->get_all_names(array('limit' => 10)); |
|
190 | - if ($model_field->is_nullable()) { |
|
191 | - array_unshift($model_names, esc_html__("Please Select", 'event_espresso')); |
|
192 | - } |
|
193 | - $input_constructor_args[1] = $input_constructor_args[0]; |
|
194 | - $input_constructor_args[0] = $model_names; |
|
195 | - $input_class = 'EE_Select_Input'; |
|
196 | - } |
|
197 | - break; |
|
198 | - case 'EE_Full_HTML_Field': |
|
199 | - $input_class = 'EE_Text_Area_Input'; |
|
200 | - $input_constructor_args[0]['validation_strategies'] = array(new EE_Full_HTML_Validation_Strategy()); |
|
201 | - break; |
|
202 | - case 'EE_Infinite_Integer': |
|
203 | - throw new EE_Error(sprintf(esc_html__( |
|
204 | - "Model field '%s' does not yet have a known conversion to form input", |
|
205 | - "event_espresso" |
|
206 | - ), get_class($model_field))); |
|
207 | - break; |
|
208 | - case 'EE_Integer_Field': |
|
209 | - $input_class = 'EE_Text_Input'; |
|
210 | - break; |
|
211 | - case 'EE_Maybe_Serialized_Text_Field': |
|
212 | - $input_class = 'EE_Text_Area_Input'; |
|
213 | - break; |
|
214 | - case 'EE_Money_Field': |
|
215 | - throw new EE_Error(sprintf(esc_html__( |
|
216 | - "Model field '%s' does not yet have a known conversion to form input", |
|
217 | - "event_espresso" |
|
218 | - ), get_class($model_field))); |
|
219 | - break; |
|
220 | - case 'EE_Post_Content_Field': |
|
221 | - $input_class = 'EE_Text_Area_Input'; |
|
222 | - $input_constructor_args[0]['validation_strategies'] = array(new EE_Full_HTML_Validation_Strategy()); |
|
223 | - break; |
|
224 | - case 'EE_Plain_Text_Field': |
|
225 | - $input_class = 'EE_Text_Input'; |
|
226 | - break; |
|
227 | - case 'EE_Primary_Key_Int_Field': |
|
228 | - $input_class = 'EE_Hidden_Input'; |
|
229 | - $input_constructor_args[0]['normalization_strategy'] = new EE_Int_Normalization(); |
|
230 | - break; |
|
231 | - case 'EE_Primary_Key_String_Field': |
|
232 | - $input_class = 'EE_Hidden_Input'; |
|
233 | - break; |
|
234 | - case 'EE_Serialized_Text_Field': |
|
235 | - $input_class = 'EE_Text_Area_Input'; |
|
236 | - break; |
|
237 | - case 'EE_Simple_HTML_Field': |
|
238 | - $input_class = 'EE_Text_Area_Input'; |
|
239 | - $input_constructor_args[0]['validation_strategies'] = array(new EE_Simple_HTML_Validation_Strategy()); |
|
240 | - break; |
|
241 | - case 'EE_Slug_Field': |
|
242 | - $input_class = 'EE_Text_Input'; |
|
243 | - break; |
|
244 | - case 'EE_Trashed_Flag_Field': |
|
245 | - $input_class = 'EE_Yes_No_Input'; |
|
246 | - break; |
|
247 | - case 'EE_WP_Post_Status_Field': |
|
248 | - throw new EE_Error(sprintf(esc_html__( |
|
249 | - "Model field '%s' does not yet have a known conversion to form input", |
|
250 | - "event_espresso" |
|
251 | - ), get_class($model_field))); |
|
252 | - break; |
|
253 | - case 'EE_WP_Post_Type_Field': |
|
254 | - throw new EE_Error(sprintf(esc_html__( |
|
255 | - "Model field '%s' does not yet have a known conversion to form input", |
|
256 | - "event_espresso" |
|
257 | - ), get_class($model_field))); |
|
258 | - break; |
|
259 | - default: |
|
260 | - throw new EE_Error(sprintf(esc_html__( |
|
261 | - "Model field of type '%s' does not convert to any known Form Input. Please add a case to EE_Model_Form_section's _convert_model_fields_to_inputs switch statement", |
|
262 | - "event_espresso" |
|
263 | - ), get_class($model_field))); |
|
264 | - } |
|
265 | - $reflection = new ReflectionClass($input_class); |
|
266 | - $input = $reflection->newInstanceArgs($input_constructor_args); |
|
267 | - $inputs[ $field_name ] = $input; |
|
268 | - } |
|
269 | - } |
|
270 | - return $inputs; |
|
271 | - } |
|
272 | - |
|
273 | - |
|
274 | - |
|
275 | - /** |
|
276 | - * Mostly the same as populate_defaults , except takes a model object as input, not an array, |
|
277 | - * and also sets the form's _model_object |
|
278 | - * |
|
279 | - * @param EE_Base_Class $model_obj |
|
280 | - * @return void |
|
281 | - */ |
|
282 | - public function populate_model_obj($model_obj) |
|
283 | - { |
|
284 | - $model_obj = $this->_model->ensure_is_obj($model_obj); |
|
285 | - $this->_model_object = $model_obj; |
|
286 | - $defaults = $model_obj->model_field_array(); |
|
287 | - foreach ($this->_model->relation_settings() as $relation_name => $relation_obj) { |
|
288 | - $subsection = $this->get_subsection($relation_name, false); |
|
289 | - if ($subsection instanceof EE_Form_Input_Base) { |
|
290 | - if ($relation_obj instanceof EE_Belongs_To_Relation) { |
|
291 | - // then we only expect there to be one |
|
292 | - $related_item = $this->_model_object->get_first_related($relation_name); |
|
293 | - $defaults[ $relation_name ] = $related_item->ID(); |
|
294 | - } else { |
|
295 | - $related_items = $this->_model_object->get_many_related($relation_name); |
|
296 | - $ids = array(); |
|
297 | - foreach ($related_items as $related_item) { |
|
298 | - $ids[] = $related_item->ID(); |
|
299 | - } |
|
300 | - $defaults[ $relation_name ] = $ids; |
|
301 | - } |
|
302 | - } |
|
303 | - } |
|
304 | - $defaults = apply_filters( |
|
305 | - 'FHEE__EE_Model_Form_Section__populate_model_obj', |
|
306 | - $defaults, |
|
307 | - $this |
|
308 | - ); |
|
309 | - $this->populate_defaults($defaults); |
|
310 | - } |
|
311 | - |
|
312 | - |
|
313 | - |
|
314 | - /** |
|
315 | - * Gets all the input values that correspond to model fields. Keys are the input/field names, |
|
316 | - * values are their normalized values |
|
317 | - * |
|
318 | - * @return array |
|
319 | - */ |
|
320 | - public function inputs_values_corresponding_to_model_fields() |
|
321 | - { |
|
322 | - return array_intersect_key($this->input_values(), $this->_model->field_settings()); |
|
323 | - } |
|
324 | - |
|
325 | - |
|
326 | - |
|
327 | - /** |
|
328 | - * After we've normalized the data as normal, set the corresponding model object |
|
329 | - * on the form. |
|
330 | - * |
|
331 | - * @param array $req_data should usually be the form post/request data (the default). |
|
332 | - * @return void |
|
333 | - */ |
|
334 | - public function _normalize($req_data) |
|
335 | - { |
|
336 | - parent::_normalize($req_data); |
|
337 | - // create or set the model object, if it isn't already |
|
338 | - if (! $this->_model_object) { |
|
339 | - // check to see if the form indicates a PK, in which case we want to only retrieve it and update it |
|
340 | - $pk_name = $this->_model->primary_key_name(); |
|
341 | - $model_obj = $this->_model->get_one_by_ID($this->get_input_value($pk_name)); |
|
342 | - if ($model_obj) { |
|
343 | - $this->_model_object = $model_obj; |
|
344 | - } else { |
|
345 | - $this->_model_object = EE_Registry::instance()->load_class($this->_model->get_this_model_name()); |
|
346 | - } |
|
347 | - } |
|
348 | - } |
|
349 | - |
|
350 | - |
|
351 | - |
|
352 | - /** |
|
353 | - * After this form has been initialized and is verified to be valid, |
|
354 | - * either creates a model object from its data and saves it, or updates |
|
355 | - * the model object its data represents |
|
356 | - * |
|
357 | - * @throws EE_Error |
|
358 | - * @return int, 1 on a successful update, the ID of |
|
359 | - * the new entry on insert; 0 on failure |
|
360 | - */ |
|
361 | - public function save() |
|
362 | - { |
|
363 | - if (! $this->_model_object) { |
|
364 | - throw new EE_Error(sprintf(esc_html__( |
|
365 | - "Cannot save the model form's model object (model is '%s') because there is no model object set. You must either set it, or call receive_form_submission where it is set automatically", |
|
366 | - "event_espresso" |
|
367 | - ), get_class($this->_model))); |
|
368 | - } |
|
369 | - // ok so the model object is set. Just set it with the submitted form data |
|
370 | - foreach ($this->inputs_values_corresponding_to_model_fields() as $field_name => $field_value) { |
|
371 | - // only set the non-primary key |
|
372 | - if ($field_name != $this->_model->primary_key_name()) { |
|
373 | - $this->_model_object->set($field_name, $field_value); |
|
374 | - } |
|
375 | - } |
|
376 | - $success = $this->_model_object->save(); |
|
377 | - foreach ($this->_model->relation_settings() as $relation_name => $relation_obj) { |
|
378 | - if (isset($this->_subsections[ $relation_name ])) { |
|
379 | - $success = $this->_save_related_info($relation_name); |
|
380 | - } |
|
381 | - } |
|
382 | - do_action('AHEE__EE_Model_Form_Section__save__done', $this, $success); |
|
383 | - return $success; |
|
384 | - } |
|
385 | - |
|
386 | - |
|
387 | - |
|
388 | - /** |
|
389 | - * Automatically finds the related model info from the form, if present, and |
|
390 | - * save the relations indicated |
|
391 | - * |
|
392 | - * @type string $relation_name |
|
393 | - * @return bool |
|
394 | - * @throws EE_Error |
|
395 | - */ |
|
396 | - protected function _save_related_info($relation_name) |
|
397 | - { |
|
398 | - $relation_obj = $this->_model->related_settings_for($relation_name); |
|
399 | - if ($relation_obj instanceof EE_Belongs_To_Relation) { |
|
400 | - // there is just a foreign key on this model pointing to that one |
|
401 | - $this->_model_object->_add_relation_to($this->get_input_value($relation_name), $relation_name); |
|
402 | - } elseif ($relation_obj instanceof EE_Has_Many_Relation) { |
|
403 | - // then we want to consider all of its currently-related things. |
|
404 | - // if they're in this list, keep them |
|
405 | - // if they're not in this list, remove them |
|
406 | - // and lastly add all the new items |
|
407 | - throw new EE_Error(sprintf(esc_html__( |
|
408 | - 'Automatic saving of related info across a "has many" relation is not yet supported', |
|
409 | - "event_espresso" |
|
410 | - ))); |
|
411 | - } elseif ($relation_obj instanceof EE_HABTM_Relation) { |
|
412 | - // delete everything NOT in this list |
|
413 | - $normalized_input_value = $this->get_input_value($relation_name); |
|
414 | - if ($normalized_input_value && is_array($normalized_input_value)) { |
|
415 | - $where_query_params = array( |
|
416 | - $relation_obj->get_other_model()->primary_key_name() => array('NOT_IN', $normalized_input_value), |
|
417 | - ); |
|
418 | - } else { |
|
419 | - $where_query_params = array(); |
|
420 | - } |
|
421 | - $this->_model_object->_remove_relations($relation_name, $where_query_params); |
|
422 | - foreach ($normalized_input_value as $id) { |
|
423 | - $this->_model_object->_add_relation_to($id, $relation_name); |
|
424 | - } |
|
425 | - } |
|
426 | - return true; |
|
427 | - } |
|
428 | - |
|
429 | - |
|
430 | - |
|
431 | - /** |
|
432 | - * Gets the model of this model form |
|
433 | - * |
|
434 | - * @return EEM_Base |
|
435 | - */ |
|
436 | - public function get_model() |
|
437 | - { |
|
438 | - return $this->_model; |
|
439 | - } |
|
440 | - |
|
441 | - |
|
442 | - |
|
443 | - /** |
|
444 | - * Gets the model object for this model form, which was either set |
|
445 | - * upon construction (using the $options_array arg 'model_object'), by using |
|
446 | - * set_model_object($model_obj), or implicitly |
|
447 | - * when receive_form_submission($req_data) was called. |
|
448 | - * |
|
449 | - * @return EE_Base_Class |
|
450 | - */ |
|
451 | - public function get_model_object() |
|
452 | - { |
|
453 | - return $this->_model_object; |
|
454 | - } |
|
455 | - |
|
456 | - |
|
457 | - |
|
458 | - /** |
|
459 | - * gets teh default name of this form section if none is specified |
|
460 | - * |
|
461 | - * @return string |
|
462 | - */ |
|
463 | - protected function _set_default_name_if_empty() |
|
464 | - { |
|
465 | - if (! $this->_name) { |
|
466 | - $default_name = str_replace("EEM_", "", get_class($this->_model)) . "_Model_Form"; |
|
467 | - $this->_name = $default_name; |
|
468 | - } |
|
469 | - } |
|
14 | + /** |
|
15 | + * @var EEM_Base |
|
16 | + */ |
|
17 | + protected $_model = null; |
|
18 | + |
|
19 | + /** |
|
20 | + * @var EE_Base_Class |
|
21 | + */ |
|
22 | + protected $_model_object = null; |
|
23 | + |
|
24 | + |
|
25 | + |
|
26 | + /** |
|
27 | + * @param array $options_array keys: { |
|
28 | + * @type EEM_Base $model |
|
29 | + * @type EE_Base_Class $model_object |
|
30 | + * @type array $subsection_args array keys should be subsection names (that either do or will exist), and |
|
31 | + * values are the arrays as you would pass them to that subsection |
|
32 | + * } |
|
33 | + * @throws EE_Error |
|
34 | + */ |
|
35 | + public function __construct($options_array = array()) |
|
36 | + { |
|
37 | + if (isset($options_array['model']) && $options_array['model'] instanceof EEM_Base) { |
|
38 | + $this->_model = $options_array['model']; |
|
39 | + } |
|
40 | + if (! $this->_model || ! $this->_model instanceof EEM_Base) { |
|
41 | + throw new EE_Error(sprintf(esc_html__( |
|
42 | + "Model Form Sections must first specify the _model property to be a subclass of EEM_Base", |
|
43 | + "event_espresso" |
|
44 | + ))); |
|
45 | + } |
|
46 | + if (isset($options_array['subsection_args'])) { |
|
47 | + $subsection_args = $options_array['subsection_args']; |
|
48 | + } else { |
|
49 | + $subsection_args = array(); |
|
50 | + } |
|
51 | + // gather fields and relations to convert to inputs |
|
52 | + // but if they're just going to exclude a field anyways, don't bother converting it to an input |
|
53 | + $exclude = $this->_subsections; |
|
54 | + if (isset($options_array['exclude'])) { |
|
55 | + $exclude = array_merge($exclude, array_flip($options_array['exclude'])); |
|
56 | + } |
|
57 | + $model_fields = array_diff_key($this->_model->field_settings(), $exclude); |
|
58 | + $model_relations = array_diff_key($this->_model->relation_settings(), $exclude); |
|
59 | + // convert fields and relations to inputs |
|
60 | + $this->_subsections = array_merge( |
|
61 | + $this->_convert_model_fields_to_inputs($model_fields), |
|
62 | + $this->_convert_model_relations_to_inputs($model_relations, $subsection_args), |
|
63 | + $this->_subsections |
|
64 | + ); |
|
65 | + parent::__construct($options_array); |
|
66 | + if (isset($options_array['model_object']) && $options_array['model_object'] instanceof EE_Base_Class) { |
|
67 | + $this->populate_model_obj($options_array['model_object']); |
|
68 | + } |
|
69 | + } |
|
70 | + |
|
71 | + |
|
72 | + |
|
73 | + /** |
|
74 | + * For now, just makes inputs for only HABTM relations |
|
75 | + * |
|
76 | + * @param EE_Model_Relation_Base[] $relations |
|
77 | + * @param array $subsection_args keys should be existing or soon-to-be-existing input names, and |
|
78 | + * their values are { |
|
79 | + * @type array { |
|
80 | + * @type EE_Base_Class[] $model_objects if the subsection is an EE_Select_Multi_Model_Input |
|
81 | + * } |
|
82 | + * } |
|
83 | + * @return array |
|
84 | + */ |
|
85 | + protected function _convert_model_relations_to_inputs($relations, $subsection_args = array()) |
|
86 | + { |
|
87 | + $inputs = array(); |
|
88 | + foreach ($relations as $relation_name => $relation_obj) { |
|
89 | + $input_constructor_args = array( |
|
90 | + array_merge( |
|
91 | + array( |
|
92 | + 'required' => $relation_obj instanceof EE_Belongs_To_Relation, |
|
93 | + 'html_label_text' => $relation_obj instanceof EE_Belongs_To_Relation |
|
94 | + ? $relation_obj->get_other_model()->item_name(1) |
|
95 | + : $relation_obj->get_other_model() |
|
96 | + ->item_name(2), |
|
97 | + ), |
|
98 | + $subsection_args |
|
99 | + ), |
|
100 | + ); |
|
101 | + $input = null; |
|
102 | + switch (get_class($relation_obj)) { |
|
103 | + case 'EE_HABTM_Relation': |
|
104 | + if ( |
|
105 | + isset($subsection_args[ $relation_name ]) |
|
106 | + && isset($subsection_args[ $relation_name ]['model_objects']) |
|
107 | + ) { |
|
108 | + $model_objects = $subsection_args[ $relation_name ]['model_objects']; |
|
109 | + } else { |
|
110 | + $model_objects = $relation_obj->get_other_model()->get_all(); |
|
111 | + } |
|
112 | + $input = new EE_Select_Multi_Model_Input($model_objects, $input_constructor_args); |
|
113 | + break; |
|
114 | + default: |
|
115 | + } |
|
116 | + if ($input) { |
|
117 | + $inputs[ $relation_name ] = $input; |
|
118 | + } |
|
119 | + } |
|
120 | + return $inputs; |
|
121 | + } |
|
122 | + |
|
123 | + |
|
124 | + |
|
125 | + /** |
|
126 | + * Changes model fields into form section inputs |
|
127 | + * |
|
128 | + * @param EE_Model_Field_Base[] $model_fields keys are the model's name |
|
129 | + * @throws EE_Error |
|
130 | + * @return EE_Form_Input_Base[] |
|
131 | + */ |
|
132 | + protected function _convert_model_fields_to_inputs($model_fields = array()) |
|
133 | + { |
|
134 | + $inputs = array(); |
|
135 | + foreach ($model_fields as $field_name => $model_field) { |
|
136 | + if ($model_field instanceof EE_Model_Field_Base) { |
|
137 | + $input_constructor_args = array( |
|
138 | + array( |
|
139 | + 'required' => ! $model_field->is_nullable() |
|
140 | + && $model_field->get_default_value() |
|
141 | + === null, |
|
142 | + 'html_label_text' => $model_field->get_nicename(), |
|
143 | + 'default' => $model_field->get_default_value(), |
|
144 | + ), |
|
145 | + ); |
|
146 | + switch (get_class($model_field)) { |
|
147 | + case 'EE_All_Caps_Text_Field': |
|
148 | + case 'EE_Any_Foreign_Model_Name_Field': |
|
149 | + $input_class = 'EE_Text_Input'; |
|
150 | + break; |
|
151 | + case 'EE_Boolean_Field': |
|
152 | + $input_class = 'EE_Yes_No_Input'; |
|
153 | + break; |
|
154 | + case 'EE_Datetime_Field': |
|
155 | + throw new EE_Error(sprintf(esc_html__( |
|
156 | + "Model field '%s' does not yet have a known conversion to form input", |
|
157 | + "event_espresso" |
|
158 | + ), get_class($model_field))); |
|
159 | + break; |
|
160 | + case 'EE_Email_Field': |
|
161 | + $input_class = 'EE_Email_Input'; |
|
162 | + break; |
|
163 | + case 'EE_Enum_Integer_Field': |
|
164 | + throw new EE_Error(sprintf(esc_html__( |
|
165 | + "Model field '%s' does not yet have a known conversion to form input", |
|
166 | + "event_espresso" |
|
167 | + ), get_class($model_field))); |
|
168 | + break; |
|
169 | + case 'EE_Enum_Text_Field': |
|
170 | + throw new EE_Error(sprintf(esc_html__( |
|
171 | + "Model field '%s' does not yet have a known conversion to form input", |
|
172 | + "event_espresso" |
|
173 | + ), get_class($model_field))); |
|
174 | + break; |
|
175 | + case 'EE_Float_Field': |
|
176 | + $input_class = 'EE_Float_Input'; |
|
177 | + break; |
|
178 | + case 'EE_Foreign_Key_Int_Field': |
|
179 | + case 'EE_Foreign_Key_String_Field': |
|
180 | + case 'EE_WP_User_Field': |
|
181 | + $models_pointed_to = $model_field instanceof EE_Field_With_Model_Name |
|
182 | + ? $model_field->get_model_class_names_pointed_to() : array(); |
|
183 | + if (true || is_array($models_pointed_to) && count($models_pointed_to) > 1) { |
|
184 | + $input_class = 'EE_Text_Input'; |
|
185 | + } else { |
|
186 | + // so its just one model |
|
187 | + $model_name = is_array($models_pointed_to) ? reset($models_pointed_to) : $models_pointed_to; |
|
188 | + $model = EE_Registry::instance()->load_model($model_name); |
|
189 | + $model_names = $model->get_all_names(array('limit' => 10)); |
|
190 | + if ($model_field->is_nullable()) { |
|
191 | + array_unshift($model_names, esc_html__("Please Select", 'event_espresso')); |
|
192 | + } |
|
193 | + $input_constructor_args[1] = $input_constructor_args[0]; |
|
194 | + $input_constructor_args[0] = $model_names; |
|
195 | + $input_class = 'EE_Select_Input'; |
|
196 | + } |
|
197 | + break; |
|
198 | + case 'EE_Full_HTML_Field': |
|
199 | + $input_class = 'EE_Text_Area_Input'; |
|
200 | + $input_constructor_args[0]['validation_strategies'] = array(new EE_Full_HTML_Validation_Strategy()); |
|
201 | + break; |
|
202 | + case 'EE_Infinite_Integer': |
|
203 | + throw new EE_Error(sprintf(esc_html__( |
|
204 | + "Model field '%s' does not yet have a known conversion to form input", |
|
205 | + "event_espresso" |
|
206 | + ), get_class($model_field))); |
|
207 | + break; |
|
208 | + case 'EE_Integer_Field': |
|
209 | + $input_class = 'EE_Text_Input'; |
|
210 | + break; |
|
211 | + case 'EE_Maybe_Serialized_Text_Field': |
|
212 | + $input_class = 'EE_Text_Area_Input'; |
|
213 | + break; |
|
214 | + case 'EE_Money_Field': |
|
215 | + throw new EE_Error(sprintf(esc_html__( |
|
216 | + "Model field '%s' does not yet have a known conversion to form input", |
|
217 | + "event_espresso" |
|
218 | + ), get_class($model_field))); |
|
219 | + break; |
|
220 | + case 'EE_Post_Content_Field': |
|
221 | + $input_class = 'EE_Text_Area_Input'; |
|
222 | + $input_constructor_args[0]['validation_strategies'] = array(new EE_Full_HTML_Validation_Strategy()); |
|
223 | + break; |
|
224 | + case 'EE_Plain_Text_Field': |
|
225 | + $input_class = 'EE_Text_Input'; |
|
226 | + break; |
|
227 | + case 'EE_Primary_Key_Int_Field': |
|
228 | + $input_class = 'EE_Hidden_Input'; |
|
229 | + $input_constructor_args[0]['normalization_strategy'] = new EE_Int_Normalization(); |
|
230 | + break; |
|
231 | + case 'EE_Primary_Key_String_Field': |
|
232 | + $input_class = 'EE_Hidden_Input'; |
|
233 | + break; |
|
234 | + case 'EE_Serialized_Text_Field': |
|
235 | + $input_class = 'EE_Text_Area_Input'; |
|
236 | + break; |
|
237 | + case 'EE_Simple_HTML_Field': |
|
238 | + $input_class = 'EE_Text_Area_Input'; |
|
239 | + $input_constructor_args[0]['validation_strategies'] = array(new EE_Simple_HTML_Validation_Strategy()); |
|
240 | + break; |
|
241 | + case 'EE_Slug_Field': |
|
242 | + $input_class = 'EE_Text_Input'; |
|
243 | + break; |
|
244 | + case 'EE_Trashed_Flag_Field': |
|
245 | + $input_class = 'EE_Yes_No_Input'; |
|
246 | + break; |
|
247 | + case 'EE_WP_Post_Status_Field': |
|
248 | + throw new EE_Error(sprintf(esc_html__( |
|
249 | + "Model field '%s' does not yet have a known conversion to form input", |
|
250 | + "event_espresso" |
|
251 | + ), get_class($model_field))); |
|
252 | + break; |
|
253 | + case 'EE_WP_Post_Type_Field': |
|
254 | + throw new EE_Error(sprintf(esc_html__( |
|
255 | + "Model field '%s' does not yet have a known conversion to form input", |
|
256 | + "event_espresso" |
|
257 | + ), get_class($model_field))); |
|
258 | + break; |
|
259 | + default: |
|
260 | + throw new EE_Error(sprintf(esc_html__( |
|
261 | + "Model field of type '%s' does not convert to any known Form Input. Please add a case to EE_Model_Form_section's _convert_model_fields_to_inputs switch statement", |
|
262 | + "event_espresso" |
|
263 | + ), get_class($model_field))); |
|
264 | + } |
|
265 | + $reflection = new ReflectionClass($input_class); |
|
266 | + $input = $reflection->newInstanceArgs($input_constructor_args); |
|
267 | + $inputs[ $field_name ] = $input; |
|
268 | + } |
|
269 | + } |
|
270 | + return $inputs; |
|
271 | + } |
|
272 | + |
|
273 | + |
|
274 | + |
|
275 | + /** |
|
276 | + * Mostly the same as populate_defaults , except takes a model object as input, not an array, |
|
277 | + * and also sets the form's _model_object |
|
278 | + * |
|
279 | + * @param EE_Base_Class $model_obj |
|
280 | + * @return void |
|
281 | + */ |
|
282 | + public function populate_model_obj($model_obj) |
|
283 | + { |
|
284 | + $model_obj = $this->_model->ensure_is_obj($model_obj); |
|
285 | + $this->_model_object = $model_obj; |
|
286 | + $defaults = $model_obj->model_field_array(); |
|
287 | + foreach ($this->_model->relation_settings() as $relation_name => $relation_obj) { |
|
288 | + $subsection = $this->get_subsection($relation_name, false); |
|
289 | + if ($subsection instanceof EE_Form_Input_Base) { |
|
290 | + if ($relation_obj instanceof EE_Belongs_To_Relation) { |
|
291 | + // then we only expect there to be one |
|
292 | + $related_item = $this->_model_object->get_first_related($relation_name); |
|
293 | + $defaults[ $relation_name ] = $related_item->ID(); |
|
294 | + } else { |
|
295 | + $related_items = $this->_model_object->get_many_related($relation_name); |
|
296 | + $ids = array(); |
|
297 | + foreach ($related_items as $related_item) { |
|
298 | + $ids[] = $related_item->ID(); |
|
299 | + } |
|
300 | + $defaults[ $relation_name ] = $ids; |
|
301 | + } |
|
302 | + } |
|
303 | + } |
|
304 | + $defaults = apply_filters( |
|
305 | + 'FHEE__EE_Model_Form_Section__populate_model_obj', |
|
306 | + $defaults, |
|
307 | + $this |
|
308 | + ); |
|
309 | + $this->populate_defaults($defaults); |
|
310 | + } |
|
311 | + |
|
312 | + |
|
313 | + |
|
314 | + /** |
|
315 | + * Gets all the input values that correspond to model fields. Keys are the input/field names, |
|
316 | + * values are their normalized values |
|
317 | + * |
|
318 | + * @return array |
|
319 | + */ |
|
320 | + public function inputs_values_corresponding_to_model_fields() |
|
321 | + { |
|
322 | + return array_intersect_key($this->input_values(), $this->_model->field_settings()); |
|
323 | + } |
|
324 | + |
|
325 | + |
|
326 | + |
|
327 | + /** |
|
328 | + * After we've normalized the data as normal, set the corresponding model object |
|
329 | + * on the form. |
|
330 | + * |
|
331 | + * @param array $req_data should usually be the form post/request data (the default). |
|
332 | + * @return void |
|
333 | + */ |
|
334 | + public function _normalize($req_data) |
|
335 | + { |
|
336 | + parent::_normalize($req_data); |
|
337 | + // create or set the model object, if it isn't already |
|
338 | + if (! $this->_model_object) { |
|
339 | + // check to see if the form indicates a PK, in which case we want to only retrieve it and update it |
|
340 | + $pk_name = $this->_model->primary_key_name(); |
|
341 | + $model_obj = $this->_model->get_one_by_ID($this->get_input_value($pk_name)); |
|
342 | + if ($model_obj) { |
|
343 | + $this->_model_object = $model_obj; |
|
344 | + } else { |
|
345 | + $this->_model_object = EE_Registry::instance()->load_class($this->_model->get_this_model_name()); |
|
346 | + } |
|
347 | + } |
|
348 | + } |
|
349 | + |
|
350 | + |
|
351 | + |
|
352 | + /** |
|
353 | + * After this form has been initialized and is verified to be valid, |
|
354 | + * either creates a model object from its data and saves it, or updates |
|
355 | + * the model object its data represents |
|
356 | + * |
|
357 | + * @throws EE_Error |
|
358 | + * @return int, 1 on a successful update, the ID of |
|
359 | + * the new entry on insert; 0 on failure |
|
360 | + */ |
|
361 | + public function save() |
|
362 | + { |
|
363 | + if (! $this->_model_object) { |
|
364 | + throw new EE_Error(sprintf(esc_html__( |
|
365 | + "Cannot save the model form's model object (model is '%s') because there is no model object set. You must either set it, or call receive_form_submission where it is set automatically", |
|
366 | + "event_espresso" |
|
367 | + ), get_class($this->_model))); |
|
368 | + } |
|
369 | + // ok so the model object is set. Just set it with the submitted form data |
|
370 | + foreach ($this->inputs_values_corresponding_to_model_fields() as $field_name => $field_value) { |
|
371 | + // only set the non-primary key |
|
372 | + if ($field_name != $this->_model->primary_key_name()) { |
|
373 | + $this->_model_object->set($field_name, $field_value); |
|
374 | + } |
|
375 | + } |
|
376 | + $success = $this->_model_object->save(); |
|
377 | + foreach ($this->_model->relation_settings() as $relation_name => $relation_obj) { |
|
378 | + if (isset($this->_subsections[ $relation_name ])) { |
|
379 | + $success = $this->_save_related_info($relation_name); |
|
380 | + } |
|
381 | + } |
|
382 | + do_action('AHEE__EE_Model_Form_Section__save__done', $this, $success); |
|
383 | + return $success; |
|
384 | + } |
|
385 | + |
|
386 | + |
|
387 | + |
|
388 | + /** |
|
389 | + * Automatically finds the related model info from the form, if present, and |
|
390 | + * save the relations indicated |
|
391 | + * |
|
392 | + * @type string $relation_name |
|
393 | + * @return bool |
|
394 | + * @throws EE_Error |
|
395 | + */ |
|
396 | + protected function _save_related_info($relation_name) |
|
397 | + { |
|
398 | + $relation_obj = $this->_model->related_settings_for($relation_name); |
|
399 | + if ($relation_obj instanceof EE_Belongs_To_Relation) { |
|
400 | + // there is just a foreign key on this model pointing to that one |
|
401 | + $this->_model_object->_add_relation_to($this->get_input_value($relation_name), $relation_name); |
|
402 | + } elseif ($relation_obj instanceof EE_Has_Many_Relation) { |
|
403 | + // then we want to consider all of its currently-related things. |
|
404 | + // if they're in this list, keep them |
|
405 | + // if they're not in this list, remove them |
|
406 | + // and lastly add all the new items |
|
407 | + throw new EE_Error(sprintf(esc_html__( |
|
408 | + 'Automatic saving of related info across a "has many" relation is not yet supported', |
|
409 | + "event_espresso" |
|
410 | + ))); |
|
411 | + } elseif ($relation_obj instanceof EE_HABTM_Relation) { |
|
412 | + // delete everything NOT in this list |
|
413 | + $normalized_input_value = $this->get_input_value($relation_name); |
|
414 | + if ($normalized_input_value && is_array($normalized_input_value)) { |
|
415 | + $where_query_params = array( |
|
416 | + $relation_obj->get_other_model()->primary_key_name() => array('NOT_IN', $normalized_input_value), |
|
417 | + ); |
|
418 | + } else { |
|
419 | + $where_query_params = array(); |
|
420 | + } |
|
421 | + $this->_model_object->_remove_relations($relation_name, $where_query_params); |
|
422 | + foreach ($normalized_input_value as $id) { |
|
423 | + $this->_model_object->_add_relation_to($id, $relation_name); |
|
424 | + } |
|
425 | + } |
|
426 | + return true; |
|
427 | + } |
|
428 | + |
|
429 | + |
|
430 | + |
|
431 | + /** |
|
432 | + * Gets the model of this model form |
|
433 | + * |
|
434 | + * @return EEM_Base |
|
435 | + */ |
|
436 | + public function get_model() |
|
437 | + { |
|
438 | + return $this->_model; |
|
439 | + } |
|
440 | + |
|
441 | + |
|
442 | + |
|
443 | + /** |
|
444 | + * Gets the model object for this model form, which was either set |
|
445 | + * upon construction (using the $options_array arg 'model_object'), by using |
|
446 | + * set_model_object($model_obj), or implicitly |
|
447 | + * when receive_form_submission($req_data) was called. |
|
448 | + * |
|
449 | + * @return EE_Base_Class |
|
450 | + */ |
|
451 | + public function get_model_object() |
|
452 | + { |
|
453 | + return $this->_model_object; |
|
454 | + } |
|
455 | + |
|
456 | + |
|
457 | + |
|
458 | + /** |
|
459 | + * gets teh default name of this form section if none is specified |
|
460 | + * |
|
461 | + * @return string |
|
462 | + */ |
|
463 | + protected function _set_default_name_if_empty() |
|
464 | + { |
|
465 | + if (! $this->_name) { |
|
466 | + $default_name = str_replace("EEM_", "", get_class($this->_model)) . "_Model_Form"; |
|
467 | + $this->_name = $default_name; |
|
468 | + } |
|
469 | + } |
|
470 | 470 | } |
@@ -2,62 +2,62 @@ |
||
2 | 2 | |
3 | 3 | class EE_Sample_Form extends EE_Form_Section_Proper |
4 | 4 | { |
5 | - public function __construct() |
|
6 | - { |
|
7 | - $this->_subsections = array( |
|
8 | - 'h1' => new EE_Form_Section_HTML('hello wordl'), |
|
9 | - 'name' => new EE_Text_Input(array('required' => true,'default' => 'your name here')), |
|
10 | - 'email' => new EE_Email_Input(array('required' => false)), |
|
11 | - 'shirt_size' => new EE_Select_Input(array('' => 'Please select...', 's' => esc_html__("Small", "event_espresso"),'m' => esc_html__("Medium", "event_espresso"),'l' => esc_html__("Large", "event_espresso")), array('required' => true,'default' => 's')), |
|
12 | - 'month_normal' => new EE_Month_Input(), |
|
13 | - 'month_leading_zero' => new EE_Month_Input(true), |
|
14 | - 'year_2' => new EE_Year_Input(false, 1, 1), |
|
15 | - 'year_4' => new EE_Year_Input(true, 0, 10, array('default' => '2017')), |
|
16 | - 'yes_no' => new EE_Yes_No_Input(array('html_label_text' => esc_html__("Yes or No", "event_espresso"))), |
|
17 | - 'credit_card' => new EE_Credit_Card_Input(), |
|
18 | - 'image_1' => new EE_Admin_File_Uploader_Input(), |
|
19 | - 'image_2' => new EE_Admin_File_Uploader_Input(), |
|
20 | - 'skillz' => new EE_Checkbox_Multi_Input(array('php' => 'PHP','mysql' => 'MYSQL'), array('default' => array('php'))), |
|
21 | - 'float' => new EE_Float_Input(), |
|
22 | - 'essay' => new EE_Text_Area_Input(), |
|
23 | - 'amenities' => new EE_Select_Multiple_Input( |
|
24 | - array( |
|
25 | - 'hottub' => 'Hot Tub', |
|
26 | - 'balcony' => "Balcony", |
|
27 | - 'skylight' => 'SkyLight', |
|
28 | - 'no_axe' => 'No Axe Murderers' |
|
29 | - ), |
|
30 | - array( |
|
31 | - 'default' => array( |
|
32 | - 'hottub', |
|
33 | - 'no_axe' ), |
|
34 | - ) |
|
35 | - ), |
|
36 | - 'payment_methods' => new EE_Select_Multi_Model_Input(EEM_Payment_Method::instance()->get_all()), |
|
37 | - ); |
|
38 | - $this->_layout_strategy = new EE_Div_Per_Section_Layout(); |
|
39 | - parent::__construct(); |
|
40 | - } |
|
5 | + public function __construct() |
|
6 | + { |
|
7 | + $this->_subsections = array( |
|
8 | + 'h1' => new EE_Form_Section_HTML('hello wordl'), |
|
9 | + 'name' => new EE_Text_Input(array('required' => true,'default' => 'your name here')), |
|
10 | + 'email' => new EE_Email_Input(array('required' => false)), |
|
11 | + 'shirt_size' => new EE_Select_Input(array('' => 'Please select...', 's' => esc_html__("Small", "event_espresso"),'m' => esc_html__("Medium", "event_espresso"),'l' => esc_html__("Large", "event_espresso")), array('required' => true,'default' => 's')), |
|
12 | + 'month_normal' => new EE_Month_Input(), |
|
13 | + 'month_leading_zero' => new EE_Month_Input(true), |
|
14 | + 'year_2' => new EE_Year_Input(false, 1, 1), |
|
15 | + 'year_4' => new EE_Year_Input(true, 0, 10, array('default' => '2017')), |
|
16 | + 'yes_no' => new EE_Yes_No_Input(array('html_label_text' => esc_html__("Yes or No", "event_espresso"))), |
|
17 | + 'credit_card' => new EE_Credit_Card_Input(), |
|
18 | + 'image_1' => new EE_Admin_File_Uploader_Input(), |
|
19 | + 'image_2' => new EE_Admin_File_Uploader_Input(), |
|
20 | + 'skillz' => new EE_Checkbox_Multi_Input(array('php' => 'PHP','mysql' => 'MYSQL'), array('default' => array('php'))), |
|
21 | + 'float' => new EE_Float_Input(), |
|
22 | + 'essay' => new EE_Text_Area_Input(), |
|
23 | + 'amenities' => new EE_Select_Multiple_Input( |
|
24 | + array( |
|
25 | + 'hottub' => 'Hot Tub', |
|
26 | + 'balcony' => "Balcony", |
|
27 | + 'skylight' => 'SkyLight', |
|
28 | + 'no_axe' => 'No Axe Murderers' |
|
29 | + ), |
|
30 | + array( |
|
31 | + 'default' => array( |
|
32 | + 'hottub', |
|
33 | + 'no_axe' ), |
|
34 | + ) |
|
35 | + ), |
|
36 | + 'payment_methods' => new EE_Select_Multi_Model_Input(EEM_Payment_Method::instance()->get_all()), |
|
37 | + ); |
|
38 | + $this->_layout_strategy = new EE_Div_Per_Section_Layout(); |
|
39 | + parent::__construct(); |
|
40 | + } |
|
41 | 41 | |
42 | - /** |
|
43 | - * Extra validation for the 'name' input. |
|
44 | - * @param EE_Text_Input $form_input |
|
45 | - */ |
|
46 | - public function _validate_name($form_input) |
|
47 | - { |
|
48 | - if ($form_input->raw_value() != 'Mike') { |
|
49 | - $form_input->add_validation_error(esc_html__("You are not mike. You must be brent or darren. Thats ok, I guess", 'event_espresso'), 'not-mike'); |
|
50 | - } |
|
51 | - } |
|
42 | + /** |
|
43 | + * Extra validation for the 'name' input. |
|
44 | + * @param EE_Text_Input $form_input |
|
45 | + */ |
|
46 | + public function _validate_name($form_input) |
|
47 | + { |
|
48 | + if ($form_input->raw_value() != 'Mike') { |
|
49 | + $form_input->add_validation_error(esc_html__("You are not mike. You must be brent or darren. Thats ok, I guess", 'event_espresso'), 'not-mike'); |
|
50 | + } |
|
51 | + } |
|
52 | 52 | |
53 | - public function _validate() |
|
54 | - { |
|
55 | - parent::_validate(); |
|
56 | - if ( |
|
57 | - $this->_subsections['shirt_size']->normalized_value() == 's' |
|
58 | - && $this->_subsections['year_4']->normalized_value() < 2010 |
|
59 | - ) { |
|
60 | - $this->add_validation_error(esc_html__("If you want a small shirt, you should be born after 2010. Otherwise theyre just too big", 'event_espresso'), 'too-old'); |
|
61 | - } |
|
62 | - } |
|
53 | + public function _validate() |
|
54 | + { |
|
55 | + parent::_validate(); |
|
56 | + if ( |
|
57 | + $this->_subsections['shirt_size']->normalized_value() == 's' |
|
58 | + && $this->_subsections['year_4']->normalized_value() < 2010 |
|
59 | + ) { |
|
60 | + $this->add_validation_error(esc_html__("If you want a small shirt, you should be born after 2010. Otherwise theyre just too big", 'event_espresso'), 'too-old'); |
|
61 | + } |
|
62 | + } |
|
63 | 63 | } |
@@ -6,9 +6,9 @@ discard block |
||
6 | 6 | { |
7 | 7 | $this->_subsections = array( |
8 | 8 | 'h1' => new EE_Form_Section_HTML('hello wordl'), |
9 | - 'name' => new EE_Text_Input(array('required' => true,'default' => 'your name here')), |
|
9 | + 'name' => new EE_Text_Input(array('required' => true, 'default' => 'your name here')), |
|
10 | 10 | 'email' => new EE_Email_Input(array('required' => false)), |
11 | - 'shirt_size' => new EE_Select_Input(array('' => 'Please select...', 's' => esc_html__("Small", "event_espresso"),'m' => esc_html__("Medium", "event_espresso"),'l' => esc_html__("Large", "event_espresso")), array('required' => true,'default' => 's')), |
|
11 | + 'shirt_size' => new EE_Select_Input(array('' => 'Please select...', 's' => esc_html__("Small", "event_espresso"), 'm' => esc_html__("Medium", "event_espresso"), 'l' => esc_html__("Large", "event_espresso")), array('required' => true, 'default' => 's')), |
|
12 | 12 | 'month_normal' => new EE_Month_Input(), |
13 | 13 | 'month_leading_zero' => new EE_Month_Input(true), |
14 | 14 | 'year_2' => new EE_Year_Input(false, 1, 1), |
@@ -17,7 +17,7 @@ discard block |
||
17 | 17 | 'credit_card' => new EE_Credit_Card_Input(), |
18 | 18 | 'image_1' => new EE_Admin_File_Uploader_Input(), |
19 | 19 | 'image_2' => new EE_Admin_File_Uploader_Input(), |
20 | - 'skillz' => new EE_Checkbox_Multi_Input(array('php' => 'PHP','mysql' => 'MYSQL'), array('default' => array('php'))), |
|
20 | + 'skillz' => new EE_Checkbox_Multi_Input(array('php' => 'PHP', 'mysql' => 'MYSQL'), array('default' => array('php'))), |
|
21 | 21 | 'float' => new EE_Float_Input(), |
22 | 22 | 'essay' => new EE_Text_Area_Input(), |
23 | 23 | 'amenities' => new EE_Select_Multiple_Input( |