@@ -105,41 +105,41 @@ discard block |
||
105 | 105 | * @param string $timezone string representing the timezone we want to set for returned Date Time Strings (and any incoming timezone data that gets saved). Note this just sends the timezone info to the date time model field objects. Default is NULL (and will be assumed using the set timezone in the 'timezone_string' wp option) |
106 | 106 | * @return \EEM_Line_Item |
107 | 107 | */ |
108 | - protected function __construct( $timezone ) { |
|
109 | - $this->singular_item = __('Line Item','event_espresso'); |
|
110 | - $this->plural_item = __('Line Items','event_espresso'); |
|
108 | + protected function __construct($timezone) { |
|
109 | + $this->singular_item = __('Line Item', 'event_espresso'); |
|
110 | + $this->plural_item = __('Line Items', 'event_espresso'); |
|
111 | 111 | |
112 | 112 | $this->_tables = array( |
113 | - 'Line_Item'=>new EE_Primary_Table('esp_line_item','LIN_ID') |
|
113 | + 'Line_Item'=>new EE_Primary_Table('esp_line_item', 'LIN_ID') |
|
114 | 114 | ); |
115 | - $line_items_can_be_for = apply_filters( 'FHEE__EEM_Line_Item__line_items_can_be_for', array('Ticket','Price', 'Event' ) ); |
|
115 | + $line_items_can_be_for = apply_filters('FHEE__EEM_Line_Item__line_items_can_be_for', array('Ticket', 'Price', 'Event')); |
|
116 | 116 | $this->_fields = array( |
117 | 117 | 'Line_Item' => array( |
118 | - 'LIN_ID' => new EE_Primary_Key_Int_Field( 'LIN_ID', __( "ID", "event_espresso" ) ), |
|
119 | - 'LIN_code' => new EE_Slug_Field( 'LIN_code', __( "Code for index into Cart", "event_espresso" ), TRUE ), |
|
120 | - 'TXN_ID' => new EE_Foreign_Key_Int_Field( 'TXN_ID', __( "Transaction ID", "event_espresso" ), TRUE, NULL, 'Transaction' ), |
|
121 | - 'LIN_name' => new EE_Full_HTML_Field( 'LIN_name', __( "Line Item Name", "event_espresso" ), FALSE, '' ), |
|
122 | - 'LIN_desc' => new EE_Full_HTML_Field( 'LIN_desc', __( "Line Item Description", "event_espresso" ), TRUE ), |
|
123 | - 'LIN_unit_price' => new EE_Money_Field( 'LIN_unit_price', __( "Unit Price", "event_espresso" ), FALSE, 0 ), |
|
124 | - 'LIN_percent' => new EE_Float_Field( 'LIN_percent', __( "Percent", "event_espresso" ), FALSE, 0 ), |
|
125 | - 'LIN_is_taxable' => new EE_Boolean_Field( 'LIN_is_taxable', __( "Taxable", "event_espresso" ), FALSE, FALSE ), |
|
126 | - 'LIN_order' => new EE_Integer_Field( 'LIN_order', __( "Order of Application towards total of parent", "event_espresso" ), FALSE, 1 ), |
|
127 | - 'LIN_total' => new EE_Money_Field( 'LIN_total', __( "Total (unit price x quantity)", "event_espresso" ), FALSE, 0 ), |
|
128 | - 'LIN_quantity' => new EE_Integer_Field( 'LIN_quantity', __( "Quantity", "event_espresso" ), TRUE, 1 ), |
|
129 | - 'LIN_parent' => new EE_Integer_Field( 'LIN_parent', __( "Parent ID (this item goes towards that Line Item's total)", "event_espresso" ), TRUE, NULL ), |
|
130 | - 'LIN_type' => new EE_Enum_Text_Field( 'LIN_type', __( "Type", "event_espresso" ), FALSE, 'line-item', array( |
|
118 | + 'LIN_ID' => new EE_Primary_Key_Int_Field('LIN_ID', __("ID", "event_espresso")), |
|
119 | + 'LIN_code' => new EE_Slug_Field('LIN_code', __("Code for index into Cart", "event_espresso"), TRUE), |
|
120 | + 'TXN_ID' => new EE_Foreign_Key_Int_Field('TXN_ID', __("Transaction ID", "event_espresso"), TRUE, NULL, 'Transaction'), |
|
121 | + 'LIN_name' => new EE_Full_HTML_Field('LIN_name', __("Line Item Name", "event_espresso"), FALSE, ''), |
|
122 | + 'LIN_desc' => new EE_Full_HTML_Field('LIN_desc', __("Line Item Description", "event_espresso"), TRUE), |
|
123 | + 'LIN_unit_price' => new EE_Money_Field('LIN_unit_price', __("Unit Price", "event_espresso"), FALSE, 0), |
|
124 | + 'LIN_percent' => new EE_Float_Field('LIN_percent', __("Percent", "event_espresso"), FALSE, 0), |
|
125 | + 'LIN_is_taxable' => new EE_Boolean_Field('LIN_is_taxable', __("Taxable", "event_espresso"), FALSE, FALSE), |
|
126 | + 'LIN_order' => new EE_Integer_Field('LIN_order', __("Order of Application towards total of parent", "event_espresso"), FALSE, 1), |
|
127 | + 'LIN_total' => new EE_Money_Field('LIN_total', __("Total (unit price x quantity)", "event_espresso"), FALSE, 0), |
|
128 | + 'LIN_quantity' => new EE_Integer_Field('LIN_quantity', __("Quantity", "event_espresso"), TRUE, 1), |
|
129 | + 'LIN_parent' => new EE_Integer_Field('LIN_parent', __("Parent ID (this item goes towards that Line Item's total)", "event_espresso"), TRUE, NULL), |
|
130 | + 'LIN_type' => new EE_Enum_Text_Field('LIN_type', __("Type", "event_espresso"), FALSE, 'line-item', array( |
|
131 | 131 | self::type_line_item => __("Line Item", "event_espresso"), |
132 | 132 | self::type_sub_line_item => __("Sub-Item", "event_espresso"), |
133 | 133 | self::type_sub_total => __("Subtotal", "event_espresso"), |
134 | 134 | self::type_tax_sub_total => __("Tax Subtotal", "event_espresso"), |
135 | 135 | self::type_tax => __("Tax", "event_espresso"), |
136 | 136 | self::type_total => __("Total", "event_espresso"), |
137 | - self::type_cancellation => __( 'Cancellation', 'event_espresso' ) |
|
137 | + self::type_cancellation => __('Cancellation', 'event_espresso') |
|
138 | 138 | ) |
139 | 139 | ), |
140 | - 'OBJ_ID' => new EE_Foreign_Key_Int_Field( 'OBJ_ID', __( 'ID of Item purchased.', 'event_espresso' ), TRUE, NULL, $line_items_can_be_for ), |
|
141 | - 'OBJ_type' =>new EE_Any_Foreign_Model_Name_Field( 'OBJ_type', __( "Model Name this Line Item is for", "event_espresso" ), TRUE, NULL, $line_items_can_be_for ), |
|
142 | - 'LIN_timestamp' => new EE_Datetime_Field('LIN_timestamp', __('When the line item was created','event_espresso'), false, EE_Datetime_Field::now, $timezone ), |
|
140 | + 'OBJ_ID' => new EE_Foreign_Key_Int_Field('OBJ_ID', __('ID of Item purchased.', 'event_espresso'), TRUE, NULL, $line_items_can_be_for), |
|
141 | + 'OBJ_type' =>new EE_Any_Foreign_Model_Name_Field('OBJ_type', __("Model Name this Line Item is for", "event_espresso"), TRUE, NULL, $line_items_can_be_for), |
|
142 | + 'LIN_timestamp' => new EE_Datetime_Field('LIN_timestamp', __('When the line item was created', 'event_espresso'), false, EE_Datetime_Field::now, $timezone), |
|
143 | 143 | ) |
144 | 144 | ); |
145 | 145 | $this->_model_relations = array( |
@@ -150,7 +150,7 @@ discard block |
||
150 | 150 | ); |
151 | 151 | $this->_model_chain_to_wp_user = 'Transaction.Registration.Event'; |
152 | 152 | $this->_caps_slug = 'transactions'; |
153 | - parent::__construct( $timezone ); |
|
153 | + parent::__construct($timezone); |
|
154 | 154 | } |
155 | 155 | |
156 | 156 | |
@@ -161,9 +161,9 @@ discard block |
||
161 | 161 | * @param EE_Transaction|int $transaction |
162 | 162 | * @return EE_Line_Item[] |
163 | 163 | */ |
164 | - public function get_all_of_type_for_transaction( $line_item_type, $transaction ){ |
|
165 | - $transaction = EEM_Transaction::instance()->ensure_is_ID( $transaction ); |
|
166 | - return $this->get_all( array( array( |
|
164 | + public function get_all_of_type_for_transaction($line_item_type, $transaction) { |
|
165 | + $transaction = EEM_Transaction::instance()->ensure_is_ID($transaction); |
|
166 | + return $this->get_all(array(array( |
|
167 | 167 | 'LIN_type' => $line_item_type, |
168 | 168 | 'TXN_ID' => $transaction |
169 | 169 | ))); |
@@ -177,14 +177,14 @@ discard block |
||
177 | 177 | * @param EE_Transaction|int $transaction |
178 | 178 | * @return EE_Line_Item[] |
179 | 179 | */ |
180 | - public function get_all_non_ticket_line_items_for_transaction( $transaction ) { |
|
181 | - $transaction = EEM_Transaction::instance()->ensure_is_ID( $transaction ); |
|
182 | - return $this->get_all( array( array( |
|
180 | + public function get_all_non_ticket_line_items_for_transaction($transaction) { |
|
181 | + $transaction = EEM_Transaction::instance()->ensure_is_ID($transaction); |
|
182 | + return $this->get_all(array(array( |
|
183 | 183 | 'LIN_type' => self::type_line_item, |
184 | 184 | 'TXN_ID' => $transaction, |
185 | 185 | 'OR' => array( |
186 | - 'OBJ_type*notticket' => array( '!=', 'Ticket'), |
|
187 | - 'OBJ_type*null' => array( 'IS_NULL' )) |
|
186 | + 'OBJ_type*notticket' => array('!=', 'Ticket'), |
|
187 | + 'OBJ_type*null' => array('IS_NULL')) |
|
188 | 188 | ))); |
189 | 189 | } |
190 | 190 | |
@@ -194,7 +194,7 @@ discard block |
||
194 | 194 | * because if there are spam bots afoot there will be LOTS of line items |
195 | 195 | * @return int count of how many deleted |
196 | 196 | */ |
197 | - public function delete_line_items_with_no_transaction(){ |
|
197 | + public function delete_line_items_with_no_transaction() { |
|
198 | 198 | /** @type WPDB $wpdb */ |
199 | 199 | global $wpdb; |
200 | 200 | $time_to_leave_alone = apply_filters( |
@@ -202,13 +202,13 @@ discard block |
||
202 | 202 | ); |
203 | 203 | $query = $wpdb->prepare( |
204 | 204 | 'DELETE li |
205 | - FROM ' . $this->table() . ' li |
|
206 | - LEFT JOIN ' . EEM_Transaction::instance()->table(). ' t ON li.TXN_ID = t.TXN_ID |
|
205 | + FROM ' . $this->table().' li |
|
206 | + LEFT JOIN ' . EEM_Transaction::instance()->table().' t ON li.TXN_ID = t.TXN_ID |
|
207 | 207 | WHERE t.TXN_ID IS NULL AND li.LIN_timestamp < %s', |
208 | 208 | // use GMT time because that's what TXN_timestamps are in |
209 | - date( 'Y-m-d H:i:s', time() - $time_to_leave_alone ) |
|
209 | + date('Y-m-d H:i:s', time() - $time_to_leave_alone) |
|
210 | 210 | ); |
211 | - return $wpdb->query( $query ); |
|
211 | + return $wpdb->query($query); |
|
212 | 212 | } |
213 | 213 | |
214 | 214 | |
@@ -221,10 +221,10 @@ discard block |
||
221 | 221 | * @param \EE_Base_Class $object |
222 | 222 | * @return EE_Line_Item[] |
223 | 223 | */ |
224 | - public function get_line_item_for_transaction_object( $TXN_ID, EE_Base_Class $object ){ |
|
225 | - return $this->get_all( array( array( |
|
224 | + public function get_line_item_for_transaction_object($TXN_ID, EE_Base_Class $object) { |
|
225 | + return $this->get_all(array(array( |
|
226 | 226 | 'TXN_ID' => $TXN_ID, |
227 | - 'OBJ_type' => str_replace( 'EE_', '', get_class( $object )), |
|
227 | + 'OBJ_type' => str_replace('EE_', '', get_class($object)), |
|
228 | 228 | 'OBJ_ID' => $object->ID() |
229 | 229 | ))); |
230 | 230 | } |
@@ -240,16 +240,16 @@ discard block |
||
240 | 240 | * @param array $OBJ_IDs |
241 | 241 | * @return EE_Line_Item[] |
242 | 242 | */ |
243 | - public function get_object_line_items_for_transaction( $TXN_ID, $OBJ_type = 'Event', $OBJ_IDs = array() ){ |
|
243 | + public function get_object_line_items_for_transaction($TXN_ID, $OBJ_type = 'Event', $OBJ_IDs = array()) { |
|
244 | 244 | $query_params = array( |
245 | 245 | 'OBJ_type' => $OBJ_type, |
246 | 246 | // if incoming $OBJ_IDs is an array, then make sure it is formatted correctly for the query |
247 | - 'OBJ_ID' => is_array( $OBJ_IDs ) && ! isset( $OBJ_IDs['IN'] ) ? array( 'IN', $OBJ_IDs ) : $OBJ_IDs |
|
247 | + 'OBJ_ID' => is_array($OBJ_IDs) && ! isset($OBJ_IDs['IN']) ? array('IN', $OBJ_IDs) : $OBJ_IDs |
|
248 | 248 | ); |
249 | - if ( $TXN_ID ) { |
|
249 | + if ($TXN_ID) { |
|
250 | 250 | $query_params['TXN_ID'] = $TXN_ID; |
251 | 251 | } |
252 | - return $this->get_all( array( $query_params )); |
|
252 | + return $this->get_all(array($query_params)); |
|
253 | 253 | } |
254 | 254 | |
255 | 255 | |
@@ -260,13 +260,13 @@ discard block |
||
260 | 260 | * @param EE_Transaction $transaction |
261 | 261 | * @return EE_Line_Item[] |
262 | 262 | */ |
263 | - public function get_all_ticket_line_items_for_transaction( EE_Transaction $transaction ) { |
|
264 | - return $this->get_all( array( |
|
263 | + public function get_all_ticket_line_items_for_transaction(EE_Transaction $transaction) { |
|
264 | + return $this->get_all(array( |
|
265 | 265 | array( |
266 | 266 | 'TXN_ID' => $transaction->ID(), |
267 | 267 | 'OBJ_type' => 'Ticket', |
268 | 268 | ) |
269 | - ) ); |
|
269 | + )); |
|
270 | 270 | } |
271 | 271 | |
272 | 272 | |
@@ -278,14 +278,14 @@ discard block |
||
278 | 278 | * @param int $TKT_ID |
279 | 279 | * @return \EE_Line_Item |
280 | 280 | */ |
281 | - public function get_ticket_line_item_for_transaction( $TXN_ID, $TKT_ID ) { |
|
282 | - return $this->get_one( array( |
|
281 | + public function get_ticket_line_item_for_transaction($TXN_ID, $TKT_ID) { |
|
282 | + return $this->get_one(array( |
|
283 | 283 | array( |
284 | - 'TXN_ID' => EEM_Transaction::instance()->ensure_is_ID( $TXN_ID ), |
|
284 | + 'TXN_ID' => EEM_Transaction::instance()->ensure_is_ID($TXN_ID), |
|
285 | 285 | 'OBJ_ID' => $TKT_ID, |
286 | 286 | 'OBJ_type' => 'Ticket', |
287 | 287 | ) |
288 | - ) ); |
|
288 | + )); |
|
289 | 289 | } |
290 | 290 | |
291 | 291 | |
@@ -300,8 +300,8 @@ discard block |
||
300 | 300 | * @param EE_Promotion $promotion |
301 | 301 | * @return EE_Line_Item |
302 | 302 | */ |
303 | - public function get_existing_promotion_line_item( EE_Line_Item $parent_line_item, EE_Promotion $promotion ) { |
|
304 | - return $this->get_one( array( |
|
303 | + public function get_existing_promotion_line_item(EE_Line_Item $parent_line_item, EE_Promotion $promotion) { |
|
304 | + return $this->get_one(array( |
|
305 | 305 | array( |
306 | 306 | 'TXN_ID' => $parent_line_item->TXN_ID(), |
307 | 307 | 'LIN_parent' => $parent_line_item->ID(), |
@@ -322,8 +322,8 @@ discard block |
||
322 | 322 | * @param EE_Line_Item $parent_line_item |
323 | 323 | * @return EE_Line_Item[] |
324 | 324 | */ |
325 | - public function get_all_promotion_line_items( EE_Line_Item $parent_line_item ) { |
|
326 | - return $this->get_all( array( |
|
325 | + public function get_all_promotion_line_items(EE_Line_Item $parent_line_item) { |
|
326 | + return $this->get_all(array( |
|
327 | 327 | array( |
328 | 328 | 'TXN_ID' => $parent_line_item->TXN_ID(), |
329 | 329 | 'LIN_parent' => $parent_line_item->ID(), |
@@ -340,8 +340,8 @@ discard block |
||
340 | 340 | * @param EE_Registration $registration |
341 | 341 | * @return EE_Line_ITem |
342 | 342 | */ |
343 | - public function get_line_item_for_registration( EE_Registration $registration ) { |
|
344 | - return $this->get_one( $this->line_item_for_registration_query_params( $registration )); |
|
343 | + public function get_line_item_for_registration(EE_Registration $registration) { |
|
344 | + return $this->get_one($this->line_item_for_registration_query_params($registration)); |
|
345 | 345 | } |
346 | 346 | |
347 | 347 | /** |
@@ -350,14 +350,14 @@ discard block |
||
350 | 350 | * @param array $original_query_params any extra query params you'd like to be merged with |
351 | 351 | * @return array like EEM_Base::get_all()'s $query_params |
352 | 352 | */ |
353 | - public function line_item_for_registration_query_params( EE_Registration $registration, $original_query_params = array() ) { |
|
354 | - return array_replace_recursive( $original_query_params, array( |
|
353 | + public function line_item_for_registration_query_params(EE_Registration $registration, $original_query_params = array()) { |
|
354 | + return array_replace_recursive($original_query_params, array( |
|
355 | 355 | array( |
356 | 356 | 'OBJ_ID' => $registration->ticket_ID(), |
357 | 357 | 'OBJ_type' => 'Ticket', |
358 | 358 | 'TXN_ID' => $registration->transaction_ID() |
359 | 359 | ) |
360 | - ) ); |
|
360 | + )); |
|
361 | 361 | } |
362 | 362 | |
363 | 363 |
@@ -362,62 +362,62 @@ |
||
362 | 362 | |
363 | 363 | |
364 | 364 | |
365 | - /** |
|
366 | - * @return EE_Base_Class[]|EE_Line_Item[] |
|
367 | - * @throws \EE_Error |
|
368 | - */ |
|
369 | - public function get_total_line_items_with_no_transaction() |
|
370 | - { |
|
371 | - return $this->get_total_line_items_for_carts(); |
|
372 | - } |
|
373 | - |
|
374 | - |
|
375 | - |
|
376 | - /** |
|
377 | - * @return EE_Base_Class[]|EE_Line_Item[] |
|
378 | - * @throws \EE_Error |
|
379 | - */ |
|
380 | - public function get_total_line_items_for_active_carts() |
|
381 | - { |
|
382 | - return $this->get_total_line_items_for_carts(false); |
|
383 | - } |
|
384 | - |
|
385 | - |
|
386 | - |
|
387 | - /** |
|
388 | - * @return EE_Base_Class[]|EE_Line_Item[] |
|
389 | - * @throws \EE_Error |
|
390 | - */ |
|
391 | - public function get_total_line_items_for_expired_carts() |
|
392 | - { |
|
393 | - return $this->get_total_line_items_for_carts(true); |
|
394 | - } |
|
395 | - |
|
396 | - |
|
397 | - |
|
398 | - /** |
|
399 | - * Returns an array of grand total line items where the TXN_ID is 0. |
|
400 | - * If $expired is set to true, then only line items for expired sessions will be returned. |
|
401 | - * If $expired is set to false, then only line items for active sessions will be returned. |
|
402 | - * |
|
403 | - * @param bool|null $expired |
|
404 | - * @return EE_Base_Class[]|EE_Line_Item[] |
|
405 | - * @throws \EE_Error |
|
406 | - */ |
|
407 | - private function get_total_line_items_for_carts($expired = null) |
|
408 | - { |
|
409 | - $where_params = array( |
|
410 | - 'TXN_ID' => 0, |
|
411 | - 'LIN_type' => 'total', |
|
412 | - ); |
|
413 | - if ($expired !== null) { |
|
414 | - $where_params['LIN_timestamp'] = array( |
|
415 | - $expired ? '<=' : '>', |
|
416 | - time() - EE_Registry::instance()->SSN->lifespan(), |
|
417 | - ); |
|
418 | - } |
|
419 | - return $this->get_all(array($where_params)); |
|
420 | - } |
|
365 | + /** |
|
366 | + * @return EE_Base_Class[]|EE_Line_Item[] |
|
367 | + * @throws \EE_Error |
|
368 | + */ |
|
369 | + public function get_total_line_items_with_no_transaction() |
|
370 | + { |
|
371 | + return $this->get_total_line_items_for_carts(); |
|
372 | + } |
|
373 | + |
|
374 | + |
|
375 | + |
|
376 | + /** |
|
377 | + * @return EE_Base_Class[]|EE_Line_Item[] |
|
378 | + * @throws \EE_Error |
|
379 | + */ |
|
380 | + public function get_total_line_items_for_active_carts() |
|
381 | + { |
|
382 | + return $this->get_total_line_items_for_carts(false); |
|
383 | + } |
|
384 | + |
|
385 | + |
|
386 | + |
|
387 | + /** |
|
388 | + * @return EE_Base_Class[]|EE_Line_Item[] |
|
389 | + * @throws \EE_Error |
|
390 | + */ |
|
391 | + public function get_total_line_items_for_expired_carts() |
|
392 | + { |
|
393 | + return $this->get_total_line_items_for_carts(true); |
|
394 | + } |
|
395 | + |
|
396 | + |
|
397 | + |
|
398 | + /** |
|
399 | + * Returns an array of grand total line items where the TXN_ID is 0. |
|
400 | + * If $expired is set to true, then only line items for expired sessions will be returned. |
|
401 | + * If $expired is set to false, then only line items for active sessions will be returned. |
|
402 | + * |
|
403 | + * @param bool|null $expired |
|
404 | + * @return EE_Base_Class[]|EE_Line_Item[] |
|
405 | + * @throws \EE_Error |
|
406 | + */ |
|
407 | + private function get_total_line_items_for_carts($expired = null) |
|
408 | + { |
|
409 | + $where_params = array( |
|
410 | + 'TXN_ID' => 0, |
|
411 | + 'LIN_type' => 'total', |
|
412 | + ); |
|
413 | + if ($expired !== null) { |
|
414 | + $where_params['LIN_timestamp'] = array( |
|
415 | + $expired ? '<=' : '>', |
|
416 | + time() - EE_Registry::instance()->SSN->lifespan(), |
|
417 | + ); |
|
418 | + } |
|
419 | + return $this->get_all(array($where_params)); |
|
420 | + } |
|
421 | 421 | |
422 | 422 | |
423 | 423 |
@@ -129,13 +129,13 @@ discard block |
||
129 | 129 | |
130 | 130 | |
131 | 131 | |
132 | - /** |
|
133 | - * Updates the TKT_sold quantity on all the tickets matching $query_params |
|
134 | - * |
|
135 | - * @param EE_Ticket[] $tickets |
|
136 | - * @return void |
|
137 | - * @throws \EE_Error |
|
138 | - */ |
|
132 | + /** |
|
133 | + * Updates the TKT_sold quantity on all the tickets matching $query_params |
|
134 | + * |
|
135 | + * @param EE_Ticket[] $tickets |
|
136 | + * @return void |
|
137 | + * @throws \EE_Error |
|
138 | + */ |
|
139 | 139 | public function update_tickets_sold($tickets){ |
140 | 140 | foreach($tickets as $ticket){ |
141 | 141 | /* @var $ticket EE_Ticket */ |
@@ -145,41 +145,41 @@ discard block |
||
145 | 145 | |
146 | 146 | |
147 | 147 | |
148 | - /** |
|
149 | - * returns an array of EE_Ticket objects with a non-zero value for TKT_reserved |
|
150 | - * |
|
151 | - * @return EE_Base_Class[]|EE_Ticket[] |
|
152 | - * @throws \EE_Error |
|
153 | - */ |
|
154 | - public function get_tickets_with_reservations() |
|
155 | - { |
|
156 | - return $this->get_all( |
|
157 | - array( |
|
158 | - array( |
|
159 | - 'TKT_reserved' => array( '>', 0 ) |
|
160 | - ) |
|
161 | - ) |
|
162 | - ); |
|
148 | + /** |
|
149 | + * returns an array of EE_Ticket objects with a non-zero value for TKT_reserved |
|
150 | + * |
|
151 | + * @return EE_Base_Class[]|EE_Ticket[] |
|
152 | + * @throws \EE_Error |
|
153 | + */ |
|
154 | + public function get_tickets_with_reservations() |
|
155 | + { |
|
156 | + return $this->get_all( |
|
157 | + array( |
|
158 | + array( |
|
159 | + 'TKT_reserved' => array( '>', 0 ) |
|
160 | + ) |
|
161 | + ) |
|
162 | + ); |
|
163 | 163 | } |
164 | 164 | |
165 | 165 | |
166 | 166 | |
167 | - /** |
|
168 | - * returns an array of EE_Ticket objects matching the supplied list of IDs |
|
169 | - * |
|
170 | - * @param array $ticket_IDs |
|
171 | - * @return EE_Base_Class[]|EE_Ticket[] |
|
172 | - * @throws \EE_Error |
|
173 | - */ |
|
174 | - public function get_tickets_with_IDs(array $ticket_IDs) |
|
175 | - { |
|
176 | - return $this->get_all( |
|
177 | - array( |
|
178 | - array( |
|
179 | - 'TKT_ID' => array( 'IN', $ticket_IDs ) |
|
180 | - ) |
|
181 | - ) |
|
182 | - ); |
|
167 | + /** |
|
168 | + * returns an array of EE_Ticket objects matching the supplied list of IDs |
|
169 | + * |
|
170 | + * @param array $ticket_IDs |
|
171 | + * @return EE_Base_Class[]|EE_Ticket[] |
|
172 | + * @throws \EE_Error |
|
173 | + */ |
|
174 | + public function get_tickets_with_IDs(array $ticket_IDs) |
|
175 | + { |
|
176 | + return $this->get_all( |
|
177 | + array( |
|
178 | + array( |
|
179 | + 'TKT_ID' => array( 'IN', $ticket_IDs ) |
|
180 | + ) |
|
181 | + ) |
|
182 | + ); |
|
183 | 183 | } |
184 | 184 | |
185 | 185 |
@@ -21,8 +21,8 @@ discard block |
||
21 | 21 | * |
22 | 22 | * ------------------------------------------------------------------------ |
23 | 23 | */ |
24 | -require_once ( EE_MODELS . 'EEM_Soft_Delete_Base.model.php' ); |
|
25 | -require_once ( EE_CLASSES . 'EE_Ticket.class.php' ); |
|
24 | +require_once (EE_MODELS.'EEM_Soft_Delete_Base.model.php'); |
|
25 | +require_once (EE_CLASSES.'EE_Ticket.class.php'); |
|
26 | 26 | |
27 | 27 | class EEM_Ticket extends EEM_Soft_Delete_Base { |
28 | 28 | |
@@ -35,36 +35,36 @@ discard block |
||
35 | 35 | * @access private |
36 | 36 | * @param string $timezone string representing the timezone we want to set for returned Date Time Strings (and any incoming timezone data that gets saved). Note this just sends the timezone info to the date time model field objects. Default is NULL (and will be assumed using the set timezone in the 'timezone_string' wp option) |
37 | 37 | */ |
38 | - protected function __construct( $timezone ) { |
|
39 | - $this->singular_item = __('Ticket','event_espresso'); |
|
40 | - $this->plural_item = __('Tickets','event_espresso'); |
|
38 | + protected function __construct($timezone) { |
|
39 | + $this->singular_item = __('Ticket', 'event_espresso'); |
|
40 | + $this->plural_item = __('Tickets', 'event_espresso'); |
|
41 | 41 | |
42 | 42 | $this->_tables = array( |
43 | 43 | 'Ticket'=> new EE_Primary_Table('esp_ticket', 'TKT_ID') |
44 | 44 | ); |
45 | 45 | $this->_fields = array( |
46 | 46 | 'Ticket'=>array( |
47 | - 'TKT_ID'=> new EE_Primary_Key_Int_Field('TKT_ID', __('Ticket ID','event_espresso')), |
|
48 | - 'TTM_ID'=>new EE_Foreign_Key_Int_Field('TTM_ID', __('Ticket Template ID','event_espresso'), false, 0, 'Ticket_Template'), |
|
47 | + 'TKT_ID'=> new EE_Primary_Key_Int_Field('TKT_ID', __('Ticket ID', 'event_espresso')), |
|
48 | + 'TTM_ID'=>new EE_Foreign_Key_Int_Field('TTM_ID', __('Ticket Template ID', 'event_espresso'), false, 0, 'Ticket_Template'), |
|
49 | 49 | 'TKT_name'=>new EE_Plain_Text_Field('TKT_name', __('Ticket Name', 'event_espresso'), false, ''), |
50 | - 'TKT_description'=>new EE_Post_Content_Field('TKT_description', __('Description of Ticket', 'event_espresso'), false, '' ), |
|
51 | - 'TKT_start_date'=>new EE_Datetime_Field('TKT_start_date', __('Start time/date of Ticket','event_espresso'), false, EE_Datetime_Field::now, $timezone ), |
|
52 | - 'TKT_end_date'=>new EE_Datetime_Field('TKT_end_date', __('End time/date of Ticket','event_espresso'), false, EE_Datetime_Field::now, $timezone ), |
|
53 | - 'TKT_min'=>new EE_Integer_Field('TKT_min', __('Minimum quantity of this ticket that must be purchased', 'event_espresso'), false, 0 ), |
|
54 | - 'TKT_max'=>new EE_Infinite_Integer_Field('TKT_max', __('Maximum quantity of this ticket that can be purchased in one transaction', 'event_espresso'), false, EE_INF ), |
|
50 | + 'TKT_description'=>new EE_Post_Content_Field('TKT_description', __('Description of Ticket', 'event_espresso'), false, ''), |
|
51 | + 'TKT_start_date'=>new EE_Datetime_Field('TKT_start_date', __('Start time/date of Ticket', 'event_espresso'), false, EE_Datetime_Field::now, $timezone), |
|
52 | + 'TKT_end_date'=>new EE_Datetime_Field('TKT_end_date', __('End time/date of Ticket', 'event_espresso'), false, EE_Datetime_Field::now, $timezone), |
|
53 | + 'TKT_min'=>new EE_Integer_Field('TKT_min', __('Minimum quantity of this ticket that must be purchased', 'event_espresso'), false, 0), |
|
54 | + 'TKT_max'=>new EE_Infinite_Integer_Field('TKT_max', __('Maximum quantity of this ticket that can be purchased in one transaction', 'event_espresso'), false, EE_INF), |
|
55 | 55 | 'TKT_price'=> new EE_Money_Field('TKT_price', 'Final calculated price for ticket', false, 0), |
56 | 56 | 'TKT_sold' => new EE_Integer_Field('TKT_sold', __('Number of this ticket sold', 'event_espresso'), false, 0), |
57 | - 'TKT_qty'=>new EE_Infinite_Integer_Field('TKT_qty', __('Quantity of this ticket that is available','event_espresso'), false, EE_INF), |
|
58 | - 'TKT_reserved'=>new EE_Integer_Field('TKT_reserved', __('Quantity of this ticket that is reserved, but not yet fully purchased','event_espresso'), false, 0 ), |
|
59 | - 'TKT_uses'=>new EE_Infinite_Integer_Field('TKT_uses', __('Number of datetimes this ticket can be used at', 'event_espresso'), false, EE_INF ), |
|
60 | - 'TKT_required'=>new EE_Boolean_Field('TKT_required', __("Flag indicating whether this ticket must be purchased with a transaction", "event_espresso"), false, false ), |
|
61 | - 'TKT_taxable'=>new EE_Boolean_Field('TKT_taxable', __("Flag indicating whether there is tax applied on this ticket", "event_espresso"), false,false), |
|
62 | - 'TKT_is_default'=>new EE_Boolean_Field('TKT_is_default', __('Flag indicating that this ticket is a default ticket', 'event_espresso'), false, false ), |
|
57 | + 'TKT_qty'=>new EE_Infinite_Integer_Field('TKT_qty', __('Quantity of this ticket that is available', 'event_espresso'), false, EE_INF), |
|
58 | + 'TKT_reserved'=>new EE_Integer_Field('TKT_reserved', __('Quantity of this ticket that is reserved, but not yet fully purchased', 'event_espresso'), false, 0), |
|
59 | + 'TKT_uses'=>new EE_Infinite_Integer_Field('TKT_uses', __('Number of datetimes this ticket can be used at', 'event_espresso'), false, EE_INF), |
|
60 | + 'TKT_required'=>new EE_Boolean_Field('TKT_required', __("Flag indicating whether this ticket must be purchased with a transaction", "event_espresso"), false, false), |
|
61 | + 'TKT_taxable'=>new EE_Boolean_Field('TKT_taxable', __("Flag indicating whether there is tax applied on this ticket", "event_espresso"), false, false), |
|
62 | + 'TKT_is_default'=>new EE_Boolean_Field('TKT_is_default', __('Flag indicating that this ticket is a default ticket', 'event_espresso'), false, false), |
|
63 | 63 | 'TKT_order' => new EE_Integer_Field('TKT_order', __('The order in which the Ticket is displayed in the editor (used for autosaves when the form doesn\'t have the ticket ID yet)', 'event_espresso'), false, 0), |
64 | - 'TKT_row' => new EE_Integer_Field('TKT_row', __('How tickets are displayed in the ui', 'event_espresso'), false, 0 ), |
|
64 | + 'TKT_row' => new EE_Integer_Field('TKT_row', __('How tickets are displayed in the ui', 'event_espresso'), false, 0), |
|
65 | 65 | 'TKT_deleted' => new EE_Trashed_Flag_Field('TKT_deleted', __('Flag indicating if this has been archived or not', 'event_espresso'), false, false), |
66 | - 'TKT_wp_user' => new EE_WP_User_Field('TKT_wp_user', __('Ticket Creator ID', 'event_espresso'), FALSE ), |
|
67 | - 'TKT_parent' => new EE_Integer_Field('TKT_parent', __('Indicates what TKT_ID is the parent of this TKT_ID (used in autosaves/revisions)'), true, 0 ) |
|
66 | + 'TKT_wp_user' => new EE_WP_User_Field('TKT_wp_user', __('Ticket Creator ID', 'event_espresso'), FALSE), |
|
67 | + 'TKT_parent' => new EE_Integer_Field('TKT_parent', __('Indicates what TKT_ID is the parent of this TKT_ID (used in autosaves/revisions)'), true, 0) |
|
68 | 68 | )); |
69 | 69 | $this->_model_relations = array( |
70 | 70 | 'Datetime'=>new EE_HABTM_Relation('Datetime_Ticket'), |
@@ -76,12 +76,12 @@ discard block |
||
76 | 76 | ); |
77 | 77 | |
78 | 78 | //this model is generally available for reading |
79 | - $this->_cap_restriction_generators[ EEM_Base::caps_read ] = new EE_Restriction_Generator_Default_Public('TKT_is_default', 'Datetime.Event'); |
|
79 | + $this->_cap_restriction_generators[EEM_Base::caps_read] = new EE_Restriction_Generator_Default_Public('TKT_is_default', 'Datetime.Event'); |
|
80 | 80 | //account for default tickets in the caps |
81 | - $this->_cap_restriction_generators[ EEM_Base::caps_read_admin ] = new EE_Restriction_Generator_Default_Protected( 'TKT_is_default', 'Datetime.Event' ); |
|
82 | - $this->_cap_restriction_generators[ EEM_Base::caps_edit ] = new EE_Restriction_Generator_Default_Protected( 'TKT_is_default', 'Datetime.Event' ); |
|
83 | - $this->_cap_restriction_generators[ EEM_Base::caps_delete ] = new EE_Restriction_Generator_Default_Protected( 'TKT_is_default', 'Datetime.Event' ); |
|
84 | - parent::__construct( $timezone ); |
|
81 | + $this->_cap_restriction_generators[EEM_Base::caps_read_admin] = new EE_Restriction_Generator_Default_Protected('TKT_is_default', 'Datetime.Event'); |
|
82 | + $this->_cap_restriction_generators[EEM_Base::caps_edit] = new EE_Restriction_Generator_Default_Protected('TKT_is_default', 'Datetime.Event'); |
|
83 | + $this->_cap_restriction_generators[EEM_Base::caps_delete] = new EE_Restriction_Generator_Default_Protected('TKT_is_default', 'Datetime.Event'); |
|
84 | + parent::__construct($timezone); |
|
85 | 85 | } |
86 | 86 | |
87 | 87 | |
@@ -92,9 +92,9 @@ discard block |
||
92 | 92 | */ |
93 | 93 | public function get_all_default_tickets() { |
94 | 94 | /** @type EE_Ticket[] $tickets */ |
95 | - $tickets = $this->get_all( array( array('TKT_is_default' => 1), 'order_by' => array('TKT_ID' => 'ASC')) ); |
|
95 | + $tickets = $this->get_all(array(array('TKT_is_default' => 1), 'order_by' => array('TKT_ID' => 'ASC'))); |
|
96 | 96 | //we need to set the start date and end date to today's date and the start of the default dtt |
97 | - return $this->_set_default_dates( $tickets ); |
|
97 | + return $this->_set_default_dates($tickets); |
|
98 | 98 | } |
99 | 99 | |
100 | 100 | |
@@ -104,11 +104,11 @@ discard block |
||
104 | 104 | * @param EE_Ticket[] $tickets |
105 | 105 | * @return EE_Ticket[] |
106 | 106 | */ |
107 | - private function _set_default_dates( $tickets ) { |
|
108 | - foreach ( $tickets as $ticket ) { |
|
109 | - $ticket->set('TKT_start_date', (int)$this->current_time_for_query('TKT_start_date', true) ); |
|
110 | - $ticket->set('TKT_end_date', (int)$this->current_time_for_query( 'TKT_end_date', true ) + (60 * 60 * 24 * 30 ) ); |
|
111 | - $ticket->set_end_time( $this->convert_datetime_for_query( 'TKT_end_date', '11:59 pm', 'g:i a', $this->_timezone ) ); |
|
107 | + private function _set_default_dates($tickets) { |
|
108 | + foreach ($tickets as $ticket) { |
|
109 | + $ticket->set('TKT_start_date', (int) $this->current_time_for_query('TKT_start_date', true)); |
|
110 | + $ticket->set('TKT_end_date', (int) $this->current_time_for_query('TKT_end_date', true) + (60 * 60 * 24 * 30)); |
|
111 | + $ticket->set_end_time($this->convert_datetime_for_query('TKT_end_date', '11:59 pm', 'g:i a', $this->_timezone)); |
|
112 | 112 | } |
113 | 113 | |
114 | 114 | return $tickets; |
@@ -123,8 +123,8 @@ discard block |
||
123 | 123 | * @param array $query_params |
124 | 124 | * @return int |
125 | 125 | */ |
126 | - public function sum_tickets_currently_available_at_datetime($DTT_ID, $query_params = array()){ |
|
127 | - return EEM_Datetime::instance()->sum_tickets_currently_available_at_datetime( $DTT_ID, $query_params ); |
|
126 | + public function sum_tickets_currently_available_at_datetime($DTT_ID, $query_params = array()) { |
|
127 | + return EEM_Datetime::instance()->sum_tickets_currently_available_at_datetime($DTT_ID, $query_params); |
|
128 | 128 | } |
129 | 129 | |
130 | 130 | |
@@ -136,8 +136,8 @@ discard block |
||
136 | 136 | * @return void |
137 | 137 | * @throws \EE_Error |
138 | 138 | */ |
139 | - public function update_tickets_sold($tickets){ |
|
140 | - foreach($tickets as $ticket){ |
|
139 | + public function update_tickets_sold($tickets) { |
|
140 | + foreach ($tickets as $ticket) { |
|
141 | 141 | /* @var $ticket EE_Ticket */ |
142 | 142 | $ticket->update_tickets_sold(); |
143 | 143 | } |
@@ -156,7 +156,7 @@ discard block |
||
156 | 156 | return $this->get_all( |
157 | 157 | array( |
158 | 158 | array( |
159 | - 'TKT_reserved' => array( '>', 0 ) |
|
159 | + 'TKT_reserved' => array('>', 0) |
|
160 | 160 | ) |
161 | 161 | ) |
162 | 162 | ); |
@@ -176,7 +176,7 @@ discard block |
||
176 | 176 | return $this->get_all( |
177 | 177 | array( |
178 | 178 | array( |
179 | - 'TKT_ID' => array( 'IN', $ticket_IDs ) |
|
179 | + 'TKT_ID' => array('IN', $ticket_IDs) |
|
180 | 180 | ) |
181 | 181 | ) |
182 | 182 | ); |
@@ -1,5 +1,5 @@ discard block |
||
1 | -<?php if ( !defined( 'EVENT_ESPRESSO_VERSION' ) ) { |
|
2 | - exit( 'No direct script access allowed' ); |
|
1 | +<?php if ( ! defined('EVENT_ESPRESSO_VERSION')) { |
|
2 | + exit('No direct script access allowed'); |
|
3 | 3 | } |
4 | 4 | /** |
5 | 5 | * Event Espresso |
@@ -50,9 +50,9 @@ discard block |
||
50 | 50 | * date_format and the second value is the time format |
51 | 51 | * @return EE_Line_Item |
52 | 52 | */ |
53 | - public static function new_instance( $props_n_values = array(), $timezone = null, $date_formats = array() ) { |
|
54 | - $has_object = parent::_check_for_object( $props_n_values, __CLASS__, $timezone, $date_formats ); |
|
55 | - return $has_object ? $has_object : new self( $props_n_values, false, $timezone, $date_formats ); |
|
53 | + public static function new_instance($props_n_values = array(), $timezone = null, $date_formats = array()) { |
|
54 | + $has_object = parent::_check_for_object($props_n_values, __CLASS__, $timezone, $date_formats); |
|
55 | + return $has_object ? $has_object : new self($props_n_values, false, $timezone, $date_formats); |
|
56 | 56 | } |
57 | 57 | |
58 | 58 | |
@@ -63,8 +63,8 @@ discard block |
||
63 | 63 | * the website will be used. |
64 | 64 | * @return EE_Line_Item |
65 | 65 | */ |
66 | - public static function new_instance_from_db( $props_n_values = array(), $timezone = null ) { |
|
67 | - return new self( $props_n_values, TRUE, $timezone ); |
|
66 | + public static function new_instance_from_db($props_n_values = array(), $timezone = null) { |
|
67 | + return new self($props_n_values, TRUE, $timezone); |
|
68 | 68 | } |
69 | 69 | |
70 | 70 | |
@@ -75,10 +75,10 @@ discard block |
||
75 | 75 | * @param bool $bydb |
76 | 76 | * @param string $timezone |
77 | 77 | */ |
78 | - protected function __construct( $fieldValues = array(), $bydb = FALSE, $timezone = '' ) { |
|
79 | - parent::__construct( $fieldValues, $bydb, $timezone ); |
|
80 | - if ( ! $this->get( 'LIN_code' ) ) { |
|
81 | - $this->set_code( $this->generate_code() ); |
|
78 | + protected function __construct($fieldValues = array(), $bydb = FALSE, $timezone = '') { |
|
79 | + parent::__construct($fieldValues, $bydb, $timezone); |
|
80 | + if ( ! $this->get('LIN_code')) { |
|
81 | + $this->set_code($this->generate_code()); |
|
82 | 82 | } |
83 | 83 | } |
84 | 84 | |
@@ -89,7 +89,7 @@ discard block |
||
89 | 89 | * @return int |
90 | 90 | */ |
91 | 91 | public function ID() { |
92 | - return $this->get( 'LIN_ID' ); |
|
92 | + return $this->get('LIN_ID'); |
|
93 | 93 | } |
94 | 94 | |
95 | 95 | |
@@ -99,7 +99,7 @@ discard block |
||
99 | 99 | * @return int |
100 | 100 | */ |
101 | 101 | public function TXN_ID() { |
102 | - return $this->get( 'TXN_ID' ); |
|
102 | + return $this->get('TXN_ID'); |
|
103 | 103 | } |
104 | 104 | |
105 | 105 | |
@@ -108,8 +108,8 @@ discard block |
||
108 | 108 | * Sets TXN_ID |
109 | 109 | * @param int $TXN_ID |
110 | 110 | */ |
111 | - public function set_TXN_ID( $TXN_ID ) { |
|
112 | - $this->set( 'TXN_ID', $TXN_ID ); |
|
111 | + public function set_TXN_ID($TXN_ID) { |
|
112 | + $this->set('TXN_ID', $TXN_ID); |
|
113 | 113 | } |
114 | 114 | |
115 | 115 | |
@@ -119,9 +119,9 @@ discard block |
||
119 | 119 | * @return string |
120 | 120 | */ |
121 | 121 | public function name() { |
122 | - $name = $this->get( 'LIN_name' ); |
|
123 | - if( ! $name ){ |
|
124 | - $name = ucwords( str_replace( '-', ' ', $this->type() ) ); |
|
122 | + $name = $this->get('LIN_name'); |
|
123 | + if ( ! $name) { |
|
124 | + $name = ucwords(str_replace('-', ' ', $this->type())); |
|
125 | 125 | } |
126 | 126 | return $name; |
127 | 127 | } |
@@ -132,8 +132,8 @@ discard block |
||
132 | 132 | * Sets name |
133 | 133 | * @param string $name |
134 | 134 | */ |
135 | - public function set_name( $name ) { |
|
136 | - $this->set( 'LIN_name', $name ); |
|
135 | + public function set_name($name) { |
|
136 | + $this->set('LIN_name', $name); |
|
137 | 137 | } |
138 | 138 | |
139 | 139 | |
@@ -143,7 +143,7 @@ discard block |
||
143 | 143 | * @return string |
144 | 144 | */ |
145 | 145 | public function desc() { |
146 | - return $this->get( 'LIN_desc' ); |
|
146 | + return $this->get('LIN_desc'); |
|
147 | 147 | } |
148 | 148 | |
149 | 149 | |
@@ -152,8 +152,8 @@ discard block |
||
152 | 152 | * Sets desc |
153 | 153 | * @param string $desc |
154 | 154 | */ |
155 | - public function set_desc( $desc ) { |
|
156 | - $this->set( 'LIN_desc', $desc ); |
|
155 | + public function set_desc($desc) { |
|
156 | + $this->set('LIN_desc', $desc); |
|
157 | 157 | } |
158 | 158 | |
159 | 159 | |
@@ -163,7 +163,7 @@ discard block |
||
163 | 163 | * @return int |
164 | 164 | */ |
165 | 165 | public function quantity() { |
166 | - return $this->get( 'LIN_quantity' ); |
|
166 | + return $this->get('LIN_quantity'); |
|
167 | 167 | } |
168 | 168 | |
169 | 169 | |
@@ -172,8 +172,8 @@ discard block |
||
172 | 172 | * Sets quantity |
173 | 173 | * @param int $quantity |
174 | 174 | */ |
175 | - public function set_quantity( $quantity ) { |
|
176 | - $this->set( 'LIN_quantity', max( $quantity, 0 ) ); |
|
175 | + public function set_quantity($quantity) { |
|
176 | + $this->set('LIN_quantity', max($quantity, 0)); |
|
177 | 177 | } |
178 | 178 | |
179 | 179 | |
@@ -183,7 +183,7 @@ discard block |
||
183 | 183 | * @return string |
184 | 184 | */ |
185 | 185 | public function OBJ_ID() { |
186 | - return $this->get( 'OBJ_ID' ); |
|
186 | + return $this->get('OBJ_ID'); |
|
187 | 187 | } |
188 | 188 | |
189 | 189 | |
@@ -192,8 +192,8 @@ discard block |
||
192 | 192 | * Sets item_id |
193 | 193 | * @param string $item_id |
194 | 194 | */ |
195 | - public function set_OBJ_ID( $item_id ) { |
|
196 | - $this->set( 'OBJ_ID', $item_id ); |
|
195 | + public function set_OBJ_ID($item_id) { |
|
196 | + $this->set('OBJ_ID', $item_id); |
|
197 | 197 | } |
198 | 198 | |
199 | 199 | |
@@ -203,7 +203,7 @@ discard block |
||
203 | 203 | * @return string |
204 | 204 | */ |
205 | 205 | public function OBJ_type() { |
206 | - return $this->get( 'OBJ_type' ); |
|
206 | + return $this->get('OBJ_type'); |
|
207 | 207 | } |
208 | 208 | |
209 | 209 | |
@@ -240,8 +240,8 @@ discard block |
||
240 | 240 | * Sets item_type |
241 | 241 | * @param string $OBJ_type |
242 | 242 | */ |
243 | - public function set_OBJ_type( $OBJ_type ) { |
|
244 | - $this->set( 'OBJ_type', $OBJ_type ); |
|
243 | + public function set_OBJ_type($OBJ_type) { |
|
244 | + $this->set('OBJ_type', $OBJ_type); |
|
245 | 245 | } |
246 | 246 | |
247 | 247 | |
@@ -251,7 +251,7 @@ discard block |
||
251 | 251 | * @return float |
252 | 252 | */ |
253 | 253 | public function unit_price() { |
254 | - return $this->get( 'LIN_unit_price' ); |
|
254 | + return $this->get('LIN_unit_price'); |
|
255 | 255 | } |
256 | 256 | |
257 | 257 | |
@@ -261,8 +261,8 @@ discard block |
||
261 | 261 | * |
262 | 262 | * @param float $unit_price |
263 | 263 | */ |
264 | - public function set_unit_price( $unit_price ) { |
|
265 | - $this->set( 'LIN_unit_price', $unit_price ); |
|
264 | + public function set_unit_price($unit_price) { |
|
265 | + $this->set('LIN_unit_price', $unit_price); |
|
266 | 266 | } |
267 | 267 | |
268 | 268 | |
@@ -273,19 +273,19 @@ discard block |
||
273 | 273 | * @return boolean |
274 | 274 | */ |
275 | 275 | public function is_percent() { |
276 | - if( $this->is_tax_sub_total() ) { |
|
276 | + if ($this->is_tax_sub_total()) { |
|
277 | 277 | //tax subtotals HAVE a percent on them, that percentage only applies |
278 | 278 | //to taxable items, so its' an exception. Treat it like a flat line item |
279 | 279 | return false; |
280 | 280 | } |
281 | - $unit_price = abs( $this->get( 'LIN_unit_price' ) ); |
|
282 | - $percent = abs( $this->get( 'LIN_percent' ) ); |
|
283 | - if ( $unit_price < .001 && $percent ) { |
|
281 | + $unit_price = abs($this->get('LIN_unit_price')); |
|
282 | + $percent = abs($this->get('LIN_percent')); |
|
283 | + if ($unit_price < .001 && $percent) { |
|
284 | 284 | return TRUE; |
285 | - } elseif ( $unit_price >= .001 && !$percent ) { |
|
285 | + } elseif ($unit_price >= .001 && ! $percent) { |
|
286 | 286 | return FALSE; |
287 | - } elseif ( $unit_price >= .001 && $percent ) { |
|
288 | - throw new EE_Error( sprintf( __( "A Line Item can not have a unit price of (%s) AND a percent (%s)!", "event_espresso" ), $unit_price, $percent ) ); |
|
287 | + } elseif ($unit_price >= .001 && $percent) { |
|
288 | + throw new EE_Error(sprintf(__("A Line Item can not have a unit price of (%s) AND a percent (%s)!", "event_espresso"), $unit_price, $percent)); |
|
289 | 289 | } else { |
290 | 290 | // if they're both 0, assume its not a percent item |
291 | 291 | return FALSE; |
@@ -299,7 +299,7 @@ discard block |
||
299 | 299 | * @return float |
300 | 300 | */ |
301 | 301 | public function percent() { |
302 | - return $this->get( 'LIN_percent' ); |
|
302 | + return $this->get('LIN_percent'); |
|
303 | 303 | } |
304 | 304 | |
305 | 305 | |
@@ -308,8 +308,8 @@ discard block |
||
308 | 308 | * Sets percent (between 100-0.01) |
309 | 309 | * @param float $percent |
310 | 310 | */ |
311 | - public function set_percent( $percent ) { |
|
312 | - $this->set( 'LIN_percent', $percent ); |
|
311 | + public function set_percent($percent) { |
|
312 | + $this->set('LIN_percent', $percent); |
|
313 | 313 | } |
314 | 314 | |
315 | 315 | |
@@ -319,7 +319,7 @@ discard block |
||
319 | 319 | * @return float |
320 | 320 | */ |
321 | 321 | public function total() { |
322 | - return $this->get( 'LIN_total' ); |
|
322 | + return $this->get('LIN_total'); |
|
323 | 323 | } |
324 | 324 | |
325 | 325 | |
@@ -328,8 +328,8 @@ discard block |
||
328 | 328 | * Sets total |
329 | 329 | * @param float $total |
330 | 330 | */ |
331 | - public function set_total( $total ) { |
|
332 | - $this->set( 'LIN_total', $total ); |
|
331 | + public function set_total($total) { |
|
332 | + $this->set('LIN_total', $total); |
|
333 | 333 | } |
334 | 334 | |
335 | 335 | |
@@ -339,7 +339,7 @@ discard block |
||
339 | 339 | * @return int |
340 | 340 | */ |
341 | 341 | public function order() { |
342 | - return $this->get( 'LIN_order' ); |
|
342 | + return $this->get('LIN_order'); |
|
343 | 343 | } |
344 | 344 | |
345 | 345 | |
@@ -348,8 +348,8 @@ discard block |
||
348 | 348 | * Sets order |
349 | 349 | * @param int $order |
350 | 350 | */ |
351 | - public function set_order( $order ) { |
|
352 | - $this->set( 'LIN_order', $order ); |
|
351 | + public function set_order($order) { |
|
352 | + $this->set('LIN_order', $order); |
|
353 | 353 | } |
354 | 354 | |
355 | 355 | |
@@ -359,7 +359,7 @@ discard block |
||
359 | 359 | * @return int |
360 | 360 | */ |
361 | 361 | public function parent_ID() { |
362 | - return $this->get( 'LIN_parent' ); |
|
362 | + return $this->get('LIN_parent'); |
|
363 | 363 | } |
364 | 364 | |
365 | 365 | |
@@ -368,8 +368,8 @@ discard block |
||
368 | 368 | * Sets parent |
369 | 369 | * @param int $parent |
370 | 370 | */ |
371 | - public function set_parent_ID( $parent ) { |
|
372 | - $this->set( 'LIN_parent', $parent ); |
|
371 | + public function set_parent_ID($parent) { |
|
372 | + $this->set('LIN_parent', $parent); |
|
373 | 373 | } |
374 | 374 | |
375 | 375 | |
@@ -379,7 +379,7 @@ discard block |
||
379 | 379 | * @return string |
380 | 380 | */ |
381 | 381 | public function type() { |
382 | - return $this->get( 'LIN_type' ); |
|
382 | + return $this->get('LIN_type'); |
|
383 | 383 | } |
384 | 384 | |
385 | 385 | |
@@ -388,8 +388,8 @@ discard block |
||
388 | 388 | * Sets type |
389 | 389 | * @param string $type |
390 | 390 | */ |
391 | - public function set_type( $type ) { |
|
392 | - $this->set( 'LIN_type', $type ); |
|
391 | + public function set_type($type) { |
|
392 | + $this->set('LIN_type', $type); |
|
393 | 393 | } |
394 | 394 | |
395 | 395 | |
@@ -402,8 +402,8 @@ discard block |
||
402 | 402 | * @return EE_Line_Item |
403 | 403 | */ |
404 | 404 | public function parent() { |
405 | - if( $this->ID() ) { |
|
406 | - return $this->get_model()->get_one_by_ID( $this->parent_ID() ); |
|
405 | + if ($this->ID()) { |
|
406 | + return $this->get_model()->get_one_by_ID($this->parent_ID()); |
|
407 | 407 | } else { |
408 | 408 | return $this->_parent; |
409 | 409 | } |
@@ -416,13 +416,13 @@ discard block |
||
416 | 416 | * @return EE_Line_Item[] |
417 | 417 | */ |
418 | 418 | public function children() { |
419 | - if ( $this->ID() ) { |
|
419 | + if ($this->ID()) { |
|
420 | 420 | return $this->get_model()->get_all( |
421 | 421 | array( |
422 | - array( 'LIN_parent' => $this->ID() ), |
|
423 | - 'order_by' => array( 'LIN_order' => 'ASC' ) ) ); |
|
422 | + array('LIN_parent' => $this->ID()), |
|
423 | + 'order_by' => array('LIN_order' => 'ASC') ) ); |
|
424 | 424 | } else { |
425 | - if ( ! is_array( $this->_children ) ) { |
|
425 | + if ( ! is_array($this->_children)) { |
|
426 | 426 | $this->_children = array(); |
427 | 427 | } |
428 | 428 | return $this->_children; |
@@ -436,7 +436,7 @@ discard block |
||
436 | 436 | * @return string |
437 | 437 | */ |
438 | 438 | public function code() { |
439 | - return $this->get( 'LIN_code' ); |
|
439 | + return $this->get('LIN_code'); |
|
440 | 440 | } |
441 | 441 | |
442 | 442 | |
@@ -445,8 +445,8 @@ discard block |
||
445 | 445 | * Sets code |
446 | 446 | * @param string $code |
447 | 447 | */ |
448 | - public function set_code( $code ) { |
|
449 | - $this->set( 'LIN_code', $code ); |
|
448 | + public function set_code($code) { |
|
449 | + $this->set('LIN_code', $code); |
|
450 | 450 | } |
451 | 451 | |
452 | 452 | |
@@ -456,7 +456,7 @@ discard block |
||
456 | 456 | * @return boolean |
457 | 457 | */ |
458 | 458 | public function is_taxable() { |
459 | - return $this->get( 'LIN_is_taxable' ); |
|
459 | + return $this->get('LIN_is_taxable'); |
|
460 | 460 | } |
461 | 461 | |
462 | 462 | |
@@ -465,8 +465,8 @@ discard block |
||
465 | 465 | * Sets is_taxable |
466 | 466 | * @param boolean $is_taxable |
467 | 467 | */ |
468 | - public function set_is_taxable( $is_taxable ) { |
|
469 | - $this->set( 'LIN_is_taxable', $is_taxable ); |
|
468 | + public function set_is_taxable($is_taxable) { |
|
469 | + $this->set('LIN_is_taxable', $is_taxable); |
|
470 | 470 | } |
471 | 471 | |
472 | 472 | |
@@ -481,7 +481,7 @@ discard block |
||
481 | 481 | */ |
482 | 482 | public function get_object() { |
483 | 483 | $model_name_of_related_obj = $this->OBJ_type(); |
484 | - return $this->get_model()->has_relation( $model_name_of_related_obj ) ? $this->get_first_related( $model_name_of_related_obj ) : NULL; |
|
484 | + return $this->get_model()->has_relation($model_name_of_related_obj) ? $this->get_first_related($model_name_of_related_obj) : NULL; |
|
485 | 485 | } |
486 | 486 | |
487 | 487 | |
@@ -492,11 +492,11 @@ discard block |
||
492 | 492 | * @param array $query_params |
493 | 493 | * @return EE_Ticket |
494 | 494 | */ |
495 | - public function ticket( $query_params = array() ) { |
|
495 | + public function ticket($query_params = array()) { |
|
496 | 496 | //we're going to assume that when this method is called we always want to receive the attached ticket EVEN if that ticket is archived. This can be overridden via the incoming $query_params argument |
497 | - $remove_defaults = array( 'default_where_conditions' => 'none' ); |
|
498 | - $query_params = array_merge( $remove_defaults, $query_params ); |
|
499 | - return $this->get_first_related( 'Ticket', $query_params ); |
|
497 | + $remove_defaults = array('default_where_conditions' => 'none'); |
|
498 | + $query_params = array_merge($remove_defaults, $query_params); |
|
499 | + return $this->get_first_related('Ticket', $query_params); |
|
500 | 500 | } |
501 | 501 | |
502 | 502 | |
@@ -506,11 +506,11 @@ discard block |
||
506 | 506 | * @return EE_Datetime | NULL |
507 | 507 | */ |
508 | 508 | public function get_ticket_datetime() { |
509 | - if ( $this->OBJ_type() === 'Ticket' ) { |
|
509 | + if ($this->OBJ_type() === 'Ticket') { |
|
510 | 510 | $ticket = $this->ticket(); |
511 | - if ( $ticket instanceof EE_Ticket ) { |
|
511 | + if ($ticket instanceof EE_Ticket) { |
|
512 | 512 | $datetime = $ticket->first_datetime(); |
513 | - if ( $datetime instanceof EE_Datetime ) { |
|
513 | + if ($datetime instanceof EE_Datetime) { |
|
514 | 514 | return $datetime; |
515 | 515 | } |
516 | 516 | } |
@@ -526,9 +526,9 @@ discard block |
||
526 | 526 | * @return string |
527 | 527 | */ |
528 | 528 | public function ticket_event_name() { |
529 | - $event_name = __( "Unknown", "event_espresso" ); |
|
529 | + $event_name = __("Unknown", "event_espresso"); |
|
530 | 530 | $event = $this->ticket_event(); |
531 | - if ( $event instanceof EE_Event ) { |
|
531 | + if ($event instanceof EE_Event) { |
|
532 | 532 | $event_name = $event->name(); |
533 | 533 | } |
534 | 534 | return $event_name; |
@@ -542,9 +542,9 @@ discard block |
||
542 | 542 | public function ticket_event() { |
543 | 543 | $event = null; |
544 | 544 | $ticket = $this->ticket(); |
545 | - if ( $ticket instanceof EE_Ticket ) { |
|
545 | + if ($ticket instanceof EE_Ticket) { |
|
546 | 546 | $datetime = $ticket->first_datetime(); |
547 | - if ( $datetime instanceof EE_Datetime ) { |
|
547 | + if ($datetime instanceof EE_Datetime) { |
|
548 | 548 | $event = $datetime->event(); |
549 | 549 | } |
550 | 550 | } |
@@ -559,11 +559,11 @@ discard block |
||
559 | 559 | * @param string $time_format |
560 | 560 | * @return string |
561 | 561 | */ |
562 | - public function ticket_datetime_start( $date_format = '', $time_format = '' ) { |
|
563 | - $first_datetime_string = __( "Unknown", "event_espresso" ); |
|
562 | + public function ticket_datetime_start($date_format = '', $time_format = '') { |
|
563 | + $first_datetime_string = __("Unknown", "event_espresso"); |
|
564 | 564 | $datetime = $this->get_ticket_datetime(); |
565 | - if ( $datetime ) { |
|
566 | - $first_datetime_string = $datetime->start_date_and_time( $date_format, $time_format ); |
|
565 | + if ($datetime) { |
|
566 | + $first_datetime_string = $datetime->start_date_and_time($date_format, $time_format); |
|
567 | 567 | } |
568 | 568 | return $first_datetime_string; |
569 | 569 | } |
@@ -578,26 +578,26 @@ discard block |
||
578 | 578 | * @return bool success |
579 | 579 | * @throws \EE_Error |
580 | 580 | */ |
581 | - public function add_child_line_item( EEI_Line_Item $line_item, $set_order = true ) { |
|
581 | + public function add_child_line_item(EEI_Line_Item $line_item, $set_order = true) { |
|
582 | 582 | // should we calculate the LIN_order for this line item ? |
583 | - if ( $set_order || $line_item->order() === null ) { |
|
584 | - $line_item->set_order( count( $this->children() ) ); |
|
583 | + if ($set_order || $line_item->order() === null) { |
|
584 | + $line_item->set_order(count($this->children())); |
|
585 | 585 | } |
586 | - if ( $this->ID() ) { |
|
586 | + if ($this->ID()) { |
|
587 | 587 | //check for any duplicate line items (with the same code), if so, this replaces it |
588 | - $line_item_with_same_code = $this->get_child_line_item( $line_item->code() ); |
|
589 | - if( $line_item_with_same_code instanceof EE_Line_Item && $line_item_with_same_code !== $line_item ) { |
|
590 | - $this->delete_child_line_item( $line_item_with_same_code->code() ); |
|
588 | + $line_item_with_same_code = $this->get_child_line_item($line_item->code()); |
|
589 | + if ($line_item_with_same_code instanceof EE_Line_Item && $line_item_with_same_code !== $line_item) { |
|
590 | + $this->delete_child_line_item($line_item_with_same_code->code()); |
|
591 | 591 | } |
592 | - $line_item->set_parent_ID( $this->ID() ); |
|
593 | - if( $this->TXN_ID() ){ |
|
594 | - $line_item->set_TXN_ID( $this->TXN_ID() ); |
|
592 | + $line_item->set_parent_ID($this->ID()); |
|
593 | + if ($this->TXN_ID()) { |
|
594 | + $line_item->set_TXN_ID($this->TXN_ID()); |
|
595 | 595 | } |
596 | 596 | return $line_item->save(); |
597 | 597 | } else { |
598 | - $this->_children[ $line_item->code() ] = $line_item; |
|
599 | - if( $line_item->parent() != $this ) { |
|
600 | - $line_item->set_parent( $this ); |
|
598 | + $this->_children[$line_item->code()] = $line_item; |
|
599 | + if ($line_item->parent() != $this) { |
|
600 | + $line_item->set_parent($this); |
|
601 | 601 | } |
602 | 602 | return TRUE; |
603 | 603 | } |
@@ -611,16 +611,16 @@ discard block |
||
611 | 611 | * @param EE_Line_Item $line_item |
612 | 612 | * |
613 | 613 | */ |
614 | - public function set_parent( $line_item ) { |
|
615 | - if ( $this->ID() ) { |
|
616 | - if( ! $line_item->ID() ) { |
|
614 | + public function set_parent($line_item) { |
|
615 | + if ($this->ID()) { |
|
616 | + if ( ! $line_item->ID()) { |
|
617 | 617 | $line_item->save(); |
618 | 618 | } |
619 | - $this->set_parent_ID( $line_item->ID() ); |
|
619 | + $this->set_parent_ID($line_item->ID()); |
|
620 | 620 | $this->save(); |
621 | 621 | } else { |
622 | 622 | $this->_parent = $line_item; |
623 | - $this->set_parent_ID( $line_item->ID() ); |
|
623 | + $this->set_parent_ID($line_item->ID()); |
|
624 | 624 | } |
625 | 625 | } |
626 | 626 | |
@@ -633,11 +633,11 @@ discard block |
||
633 | 633 | * @param string $code |
634 | 634 | * @return EE_Line_Item |
635 | 635 | */ |
636 | - public function get_child_line_item( $code ) { |
|
637 | - if ( $this->ID() ) { |
|
638 | - return $this->get_model()->get_one( array( array( 'LIN_parent' => $this->ID(), 'LIN_code' => $code ) ) ); |
|
636 | + public function get_child_line_item($code) { |
|
637 | + if ($this->ID()) { |
|
638 | + return $this->get_model()->get_one(array(array('LIN_parent' => $this->ID(), 'LIN_code' => $code))); |
|
639 | 639 | } else { |
640 | - return isset( $this->_children[ $code ] ) ? $this->_children[ $code ] : null; |
|
640 | + return isset($this->_children[$code]) ? $this->_children[$code] : null; |
|
641 | 641 | } |
642 | 642 | } |
643 | 643 | |
@@ -648,10 +648,10 @@ discard block |
||
648 | 648 | * @return int |
649 | 649 | */ |
650 | 650 | public function delete_children_line_items() { |
651 | - if ( $this->ID() ) { |
|
652 | - return $this->get_model()->delete( array( array( 'LIN_parent' => $this->ID() ) ) ); |
|
651 | + if ($this->ID()) { |
|
652 | + return $this->get_model()->delete(array(array('LIN_parent' => $this->ID()))); |
|
653 | 653 | } else { |
654 | - $count = count( $this->_children ); |
|
654 | + $count = count($this->_children); |
|
655 | 655 | $this->_children = array(); |
656 | 656 | return $count; |
657 | 657 | } |
@@ -668,25 +668,25 @@ discard block |
||
668 | 668 | * @param bool $stop_search_once_found |
669 | 669 | * @return int count of items deleted (or simply removed from the line item's cache, if not has not been saved to the DB yet) |
670 | 670 | */ |
671 | - public function delete_child_line_item( $code, $stop_search_once_found = true ) { |
|
672 | - if ( $this->ID() ) { |
|
671 | + public function delete_child_line_item($code, $stop_search_once_found = true) { |
|
672 | + if ($this->ID()) { |
|
673 | 673 | $items_deleted = 0; |
674 | - if( $this->code() == $code ) { |
|
675 | - $items_deleted += EEH_Line_Item::delete_all_child_items( $this ); |
|
674 | + if ($this->code() == $code) { |
|
675 | + $items_deleted += EEH_Line_Item::delete_all_child_items($this); |
|
676 | 676 | $items_deleted += (int) $this->delete(); |
677 | - if( $stop_search_once_found ){ |
|
677 | + if ($stop_search_once_found) { |
|
678 | 678 | return $items_deleted; |
679 | 679 | } |
680 | 680 | } |
681 | - foreach( $this->children() as $child_line_item ) { |
|
682 | - $items_deleted += $child_line_item->delete_child_line_item( $code, $stop_search_once_found ); |
|
681 | + foreach ($this->children() as $child_line_item) { |
|
682 | + $items_deleted += $child_line_item->delete_child_line_item($code, $stop_search_once_found); |
|
683 | 683 | } |
684 | 684 | return $items_deleted; |
685 | 685 | } else { |
686 | - if( isset( $this->_children[ $code ] ) ) { |
|
687 | - unset( $this->_children[ $code ] ); |
|
686 | + if (isset($this->_children[$code])) { |
|
687 | + unset($this->_children[$code]); |
|
688 | 688 | return 1; |
689 | - }else{ |
|
689 | + } else { |
|
690 | 690 | return 0; |
691 | 691 | } |
692 | 692 | } |
@@ -699,9 +699,9 @@ discard block |
||
699 | 699 | * @return boolean |
700 | 700 | */ |
701 | 701 | public function delete_if_childless_subtotal() { |
702 | - if( $this->ID() && |
|
702 | + if ($this->ID() && |
|
703 | 703 | $this->type() == EEM_Line_Item::type_sub_total && |
704 | - ! $this->children() ) { |
|
704 | + ! $this->children()) { |
|
705 | 705 | return $this->delete(); |
706 | 706 | } else { |
707 | 707 | return false; |
@@ -716,7 +716,7 @@ discard block |
||
716 | 716 | */ |
717 | 717 | public function generate_code() { |
718 | 718 | // each line item in the cart requires a unique identifier |
719 | - return md5( $this->get( 'OBJ_type' ) . $this->get( 'OBJ_ID' ) . microtime() ); |
|
719 | + return md5($this->get('OBJ_type').$this->get('OBJ_ID').microtime()); |
|
720 | 720 | } |
721 | 721 | |
722 | 722 | |
@@ -799,7 +799,7 @@ discard block |
||
799 | 799 | * @return string like '2, 004.00', formatted according to the localized currency |
800 | 800 | */ |
801 | 801 | public function unit_price_no_code() { |
802 | - return $this->get_pretty( 'LIN_unit_price', 'no_currency_code' ); |
|
802 | + return $this->get_pretty('LIN_unit_price', 'no_currency_code'); |
|
803 | 803 | } |
804 | 804 | |
805 | 805 | |
@@ -809,7 +809,7 @@ discard block |
||
809 | 809 | * @return string like '2, 004.00', formatted according to the localized currency |
810 | 810 | */ |
811 | 811 | public function total_no_code() { |
812 | - return $this->get_pretty( 'LIN_total', 'no_currency_code' ); |
|
812 | + return $this->get_pretty('LIN_total', 'no_currency_code'); |
|
813 | 813 | } |
814 | 814 | |
815 | 815 | |
@@ -829,17 +829,17 @@ discard block |
||
829 | 829 | $tax_total = $this->recalculate_taxes_and_tax_total(); |
830 | 830 | $total = $pre_tax_total + $tax_total; |
831 | 831 | // no negative totals plz |
832 | - $total = max( $total, 0 ); |
|
833 | - $this->set_total( $total ); |
|
832 | + $total = max($total, 0); |
|
833 | + $this->set_total($total); |
|
834 | 834 | //only update the related transaction's total |
835 | 835 | //if we intend to save this line item and its a grand total |
836 | - if( |
|
836 | + if ( |
|
837 | 837 | $this->allow_persist() && |
838 | 838 | $this->type() === EEM_Line_Item::type_total && |
839 | 839 | $this->transaction() instanceof EE_Transaction |
840 | - ){ |
|
841 | - $this->transaction()->set_total( $total ); |
|
842 | - if ( $this->transaction()->ID() ) { |
|
840 | + ) { |
|
841 | + $this->transaction()->set_total($total); |
|
842 | + if ($this->transaction()->ID()) { |
|
843 | 843 | $this->transaction()->save(); |
844 | 844 | } |
845 | 845 | } |
@@ -858,47 +858,47 @@ discard block |
||
858 | 858 | public function recalculate_pre_tax_total() { |
859 | 859 | $total = 0; |
860 | 860 | $my_children = $this->children(); |
861 | - $has_children = ! empty( $my_children ); |
|
862 | - if ( $has_children && $this->is_line_item() ) { |
|
863 | - $total = $this->_recalculate_pretax_total_for_line_item( $total, $my_children ); |
|
864 | - } elseif ( ! $has_children && ( $this->is_sub_line_item() || $this->is_line_item() ) ) { |
|
861 | + $has_children = ! empty($my_children); |
|
862 | + if ($has_children && $this->is_line_item()) { |
|
863 | + $total = $this->_recalculate_pretax_total_for_line_item($total, $my_children); |
|
864 | + } elseif ( ! $has_children && ($this->is_sub_line_item() || $this->is_line_item())) { |
|
865 | 865 | $total = $this->unit_price() * $this->quantity(); |
866 | - } elseif( $this->is_sub_total() || $this->is_total() ) { |
|
867 | - $total = $this->_recalculate_pretax_total_for_subtotal( $total, $my_children ); |
|
868 | - } elseif ( $this->is_tax_sub_total() || $this->is_tax() || $this->is_cancelled() ) { |
|
866 | + } elseif ($this->is_sub_total() || $this->is_total()) { |
|
867 | + $total = $this->_recalculate_pretax_total_for_subtotal($total, $my_children); |
|
868 | + } elseif ($this->is_tax_sub_total() || $this->is_tax() || $this->is_cancelled()) { |
|
869 | 869 | // completely ignore tax totals, tax sub-totals, and cancelled line items, when calculating the pre-tax-total |
870 | 870 | return 0; |
871 | 871 | } |
872 | 872 | // ensure all non-line items and non-sub-line-items have a quantity of 1 (except for Events) |
873 | - if( |
|
873 | + if ( |
|
874 | 874 | ! $this->is_line_item() && |
875 | 875 | ! $this->is_sub_line_item() && |
876 | 876 | ! $this->is_cancellation() |
877 | 877 | ) { |
878 | - if ( $this->OBJ_type() !== 'Event' ) { |
|
879 | - $this->set_quantity( 1 ); |
|
878 | + if ($this->OBJ_type() !== 'Event') { |
|
879 | + $this->set_quantity(1); |
|
880 | 880 | } |
881 | - if( ! $this->is_percent() ) { |
|
882 | - $this->set_unit_price( $this->total() ); |
|
881 | + if ( ! $this->is_percent()) { |
|
882 | + $this->set_unit_price($this->total()); |
|
883 | 883 | } |
884 | 884 | } |
885 | 885 | |
886 | 886 | //we don't want to bother saving grand totals, because that needs to factor in taxes anyways |
887 | 887 | //so it ought to be |
888 | - if( ! $this->is_total() ) { |
|
889 | - $this->set_total( $total ); |
|
888 | + if ( ! $this->is_total()) { |
|
889 | + $this->set_total($total); |
|
890 | 890 | //if not a percent line item, make sure we keep the unit price in sync |
891 | - if( |
|
891 | + if ( |
|
892 | 892 | $has_children |
893 | 893 | && $this->is_line_item() |
894 | 894 | && ! $this->is_percent() |
895 | 895 | ) { |
896 | - if( $this->quantity() === 0 ){ |
|
896 | + if ($this->quantity() === 0) { |
|
897 | 897 | $new_unit_price = 0; |
898 | 898 | } else { |
899 | 899 | $new_unit_price = $this->total() / $this->quantity(); |
900 | 900 | } |
901 | - $this->set_unit_price( $new_unit_price ); |
|
901 | + $this->set_unit_price($new_unit_price); |
|
902 | 902 | } |
903 | 903 | $this->maybe_save(); |
904 | 904 | } |
@@ -918,39 +918,39 @@ discard block |
||
918 | 918 | * @return float |
919 | 919 | * @throws \EE_Error |
920 | 920 | */ |
921 | - protected function _recalculate_pretax_total_for_subtotal( $calculated_total_so_far, $my_children = null ) { |
|
922 | - if( $my_children === null ) { |
|
921 | + protected function _recalculate_pretax_total_for_subtotal($calculated_total_so_far, $my_children = null) { |
|
922 | + if ($my_children === null) { |
|
923 | 923 | $my_children = $this->children(); |
924 | 924 | } |
925 | 925 | //get the total of all its children |
926 | - foreach ( $my_children as $child_line_item ) { |
|
927 | - if ( $child_line_item instanceof EE_Line_Item && ! $child_line_item->is_cancellation() ) { |
|
926 | + foreach ($my_children as $child_line_item) { |
|
927 | + if ($child_line_item instanceof EE_Line_Item && ! $child_line_item->is_cancellation()) { |
|
928 | 928 | // percentage line items are based on total so far |
929 | - if ( $child_line_item->is_percent() ) { |
|
929 | + if ($child_line_item->is_percent()) { |
|
930 | 930 | //round as we go so that the line items add up ok |
931 | 931 | $percent_total = round( |
932 | 932 | $calculated_total_so_far * $child_line_item->percent() / 100, |
933 | 933 | EE_Registry::instance()->CFG->currency->dec_plc |
934 | 934 | ); |
935 | - $child_line_item->set_total( $percent_total ); |
|
935 | + $child_line_item->set_total($percent_total); |
|
936 | 936 | //so far all percent line items should have a quantity of 1 |
937 | 937 | //(ie, no double percent discounts. Although that might be requested someday) |
938 | - $child_line_item->set_quantity( 1 ); |
|
938 | + $child_line_item->set_quantity(1); |
|
939 | 939 | $child_line_item->maybe_save(); |
940 | 940 | $calculated_total_so_far += $percent_total; |
941 | 941 | } else { |
942 | 942 | //verify flat sub-line-item quantities match their parent |
943 | - if( $child_line_item->is_sub_line_item() ) { |
|
944 | - $child_line_item->set_quantity( $this->quantity() ); |
|
943 | + if ($child_line_item->is_sub_line_item()) { |
|
944 | + $child_line_item->set_quantity($this->quantity()); |
|
945 | 945 | } |
946 | 946 | $calculated_total_so_far += $child_line_item->recalculate_pre_tax_total(); |
947 | 947 | } |
948 | 948 | } |
949 | 949 | } |
950 | 950 | |
951 | - if( $this->is_sub_total() ){ |
|
951 | + if ($this->is_sub_total()) { |
|
952 | 952 | // no negative totals plz |
953 | - $calculated_total_so_far = max( $calculated_total_so_far, 0 ); |
|
953 | + $calculated_total_so_far = max($calculated_total_so_far, 0); |
|
954 | 954 | } |
955 | 955 | return $calculated_total_so_far; |
956 | 956 | } |
@@ -968,8 +968,8 @@ discard block |
||
968 | 968 | * @return float |
969 | 969 | * @throws \EE_Error |
970 | 970 | */ |
971 | - protected function _recalculate_pretax_total_for_line_item( $calculated_total_so_far, $my_children = null ) { |
|
972 | - if( $my_children === null ) { |
|
971 | + protected function _recalculate_pretax_total_for_line_item($calculated_total_so_far, $my_children = null) { |
|
972 | + if ($my_children === null) { |
|
973 | 973 | $my_children = $this->children(); |
974 | 974 | } |
975 | 975 | //we need to keep track of the running total for a single item, |
@@ -977,10 +977,10 @@ discard block |
||
977 | 977 | $unit_price_for_total = 0; |
978 | 978 | $quantity_for_total = 1; |
979 | 979 | //get the total of all its children |
980 | - foreach ( $my_children as $child_line_item ) { |
|
981 | - if ( $child_line_item instanceof EE_Line_Item && |
|
980 | + foreach ($my_children as $child_line_item) { |
|
981 | + if ($child_line_item instanceof EE_Line_Item && |
|
982 | 982 | ! $child_line_item->is_cancellation()) { |
983 | - if ( $child_line_item->is_percent() ) { |
|
983 | + if ($child_line_item->is_percent()) { |
|
984 | 984 | //it should be the unit-price-so-far multiplied by teh percent multiplied by the quantity |
985 | 985 | //not total multiplied by percent, because that ignores rounding along-the-way |
986 | 986 | $percent_unit_price = round( |
@@ -988,17 +988,17 @@ discard block |
||
988 | 988 | EE_Registry::instance()->CFG->currency->dec_plc |
989 | 989 | ); |
990 | 990 | $percent_total = $percent_unit_price * $quantity_for_total; |
991 | - $child_line_item->set_total( $percent_total ); |
|
991 | + $child_line_item->set_total($percent_total); |
|
992 | 992 | //so far all percent line items should have a quantity of 1 |
993 | 993 | //(ie, no double percent discounts. Although that might be requested someday) |
994 | - $child_line_item->set_quantity( 1 ); |
|
994 | + $child_line_item->set_quantity(1); |
|
995 | 995 | $child_line_item->maybe_save(); |
996 | 996 | $calculated_total_so_far += $percent_total; |
997 | 997 | $unit_price_for_total += $percent_unit_price; |
998 | 998 | } else { |
999 | 999 | //verify flat sub-line-item quantities match their parent |
1000 | - if( $child_line_item->is_sub_line_item() ) { |
|
1001 | - $child_line_item->set_quantity( $this->quantity() ); |
|
1000 | + if ($child_line_item->is_sub_line_item()) { |
|
1001 | + $child_line_item->set_quantity($this->quantity()); |
|
1002 | 1002 | } |
1003 | 1003 | $quantity_for_total = $child_line_item->quantity(); |
1004 | 1004 | $calculated_total_so_far += $child_line_item->recalculate_pre_tax_total(); |
@@ -1022,10 +1022,10 @@ discard block |
||
1022 | 1022 | //calculate the pretax total |
1023 | 1023 | $taxable_total = $this->taxable_total(); |
1024 | 1024 | $tax_total = 0; |
1025 | - foreach ( $taxes as $tax ) { |
|
1025 | + foreach ($taxes as $tax) { |
|
1026 | 1026 | $total_on_this_tax = $taxable_total * $tax->percent() / 100; |
1027 | 1027 | //remember the total on this line item |
1028 | - $tax->set_total( $total_on_this_tax ); |
|
1028 | + $tax->set_total($total_on_this_tax); |
|
1029 | 1029 | $tax_total += $tax->total(); |
1030 | 1030 | } |
1031 | 1031 | $this->_recalculate_tax_sub_total(); |
@@ -1039,21 +1039,21 @@ discard block |
||
1039 | 1039 | * @return void |
1040 | 1040 | */ |
1041 | 1041 | private function _recalculate_tax_sub_total() { |
1042 | - if ( $this->is_tax_sub_total() ) { |
|
1042 | + if ($this->is_tax_sub_total()) { |
|
1043 | 1043 | $total = 0; |
1044 | 1044 | $total_percent = 0; |
1045 | 1045 | //simply loop through all its children (which should be taxes) and sum their total |
1046 | - foreach ( $this->children() as $child_tax ) { |
|
1047 | - if ( $child_tax instanceof EE_Line_Item ) { |
|
1046 | + foreach ($this->children() as $child_tax) { |
|
1047 | + if ($child_tax instanceof EE_Line_Item) { |
|
1048 | 1048 | $total += $child_tax->total(); |
1049 | 1049 | $total_percent += $child_tax->percent(); |
1050 | 1050 | } |
1051 | 1051 | } |
1052 | - $this->set_total( $total ); |
|
1053 | - $this->set_percent( $total_percent ); |
|
1054 | - } elseif ( $this->is_total() ) { |
|
1055 | - foreach ( $this->children() as $maybe_tax_subtotal ) { |
|
1056 | - if ( $maybe_tax_subtotal instanceof EE_Line_Item ) { |
|
1052 | + $this->set_total($total); |
|
1053 | + $this->set_percent($total_percent); |
|
1054 | + } elseif ($this->is_total()) { |
|
1055 | + foreach ($this->children() as $maybe_tax_subtotal) { |
|
1056 | + if ($maybe_tax_subtotal instanceof EE_Line_Item) { |
|
1057 | 1057 | $maybe_tax_subtotal->_recalculate_tax_sub_total(); |
1058 | 1058 | } |
1059 | 1059 | } |
@@ -1069,8 +1069,8 @@ discard block |
||
1069 | 1069 | public function get_total_tax() { |
1070 | 1070 | $this->_recalculate_tax_sub_total(); |
1071 | 1071 | $total = 0; |
1072 | - foreach ( $this->tax_descendants() as $tax_line_item ) { |
|
1073 | - if ( $tax_line_item instanceof EE_Line_Item ) { |
|
1072 | + foreach ($this->tax_descendants() as $tax_line_item) { |
|
1073 | + if ($tax_line_item instanceof EE_Line_Item) { |
|
1074 | 1074 | $total += $tax_line_item->total(); |
1075 | 1075 | } |
1076 | 1076 | } |
@@ -1084,15 +1084,15 @@ discard block |
||
1084 | 1084 | */ |
1085 | 1085 | public function get_items_total() { |
1086 | 1086 | //by default, let's make sure we're consistent with the existing line item |
1087 | - if( $this->is_total() ) { |
|
1088 | - $pretax_subtotal_li = EEH_Line_Item::get_pre_tax_subtotal( $this ); |
|
1089 | - if( $pretax_subtotal_li instanceof EE_Line_Item ) { |
|
1087 | + if ($this->is_total()) { |
|
1088 | + $pretax_subtotal_li = EEH_Line_Item::get_pre_tax_subtotal($this); |
|
1089 | + if ($pretax_subtotal_li instanceof EE_Line_Item) { |
|
1090 | 1090 | return $pretax_subtotal_li->total(); |
1091 | 1091 | } |
1092 | 1092 | } |
1093 | 1093 | $total = 0; |
1094 | - foreach ( $this->get_items() as $item ) { |
|
1095 | - if ( $item instanceof EE_Line_Item ) { |
|
1094 | + foreach ($this->get_items() as $item) { |
|
1095 | + if ($item instanceof EE_Line_Item) { |
|
1096 | 1096 | $total += $item->total(); |
1097 | 1097 | } |
1098 | 1098 | } |
@@ -1107,7 +1107,7 @@ discard block |
||
1107 | 1107 | * @return EE_Line_Item[] |
1108 | 1108 | */ |
1109 | 1109 | public function tax_descendants() { |
1110 | - return EEH_Line_Item::get_tax_descendants( $this ); |
|
1110 | + return EEH_Line_Item::get_tax_descendants($this); |
|
1111 | 1111 | } |
1112 | 1112 | |
1113 | 1113 | |
@@ -1117,7 +1117,7 @@ discard block |
||
1117 | 1117 | * @return EE_Line_Item[] |
1118 | 1118 | */ |
1119 | 1119 | public function get_items() { |
1120 | - return EEH_Line_Item::get_line_item_descendants( $this ); |
|
1120 | + return EEH_Line_Item::get_line_item_descendants($this); |
|
1121 | 1121 | } |
1122 | 1122 | |
1123 | 1123 | |
@@ -1133,22 +1133,22 @@ discard block |
||
1133 | 1133 | */ |
1134 | 1134 | public function taxable_total() { |
1135 | 1135 | $total = 0; |
1136 | - if ( $this->children() ) { |
|
1137 | - foreach ( $this->children() as $child_line_item ) { |
|
1138 | - if ( $child_line_item->type() === EEM_Line_Item::type_line_item && $child_line_item->is_taxable()) { |
|
1136 | + if ($this->children()) { |
|
1137 | + foreach ($this->children() as $child_line_item) { |
|
1138 | + if ($child_line_item->type() === EEM_Line_Item::type_line_item && $child_line_item->is_taxable()) { |
|
1139 | 1139 | //if it's a percent item, only take into account the percent |
1140 | 1140 | //that's taxable too (the taxable total so far) |
1141 | - if( $child_line_item->is_percent() ) { |
|
1142 | - $total = $total + ( $total * $child_line_item->percent() / 100 ); |
|
1143 | - }else{ |
|
1141 | + if ($child_line_item->is_percent()) { |
|
1142 | + $total = $total + ($total * $child_line_item->percent() / 100); |
|
1143 | + } else { |
|
1144 | 1144 | $total += $child_line_item->total(); |
1145 | 1145 | } |
1146 | - }elseif( $child_line_item->type() === EEM_Line_Item::type_sub_total ){ |
|
1146 | + }elseif ($child_line_item->type() === EEM_Line_Item::type_sub_total) { |
|
1147 | 1147 | $total += $child_line_item->taxable_total(); |
1148 | 1148 | } |
1149 | 1149 | } |
1150 | 1150 | } |
1151 | - return max( $total, 0 ); |
|
1151 | + return max($total, 0); |
|
1152 | 1152 | } |
1153 | 1153 | |
1154 | 1154 | |
@@ -1158,7 +1158,7 @@ discard block |
||
1158 | 1158 | * @return EE_Transaction |
1159 | 1159 | */ |
1160 | 1160 | public function transaction() { |
1161 | - return $this->get_first_related( 'Transaction' ); |
|
1161 | + return $this->get_first_related('Transaction'); |
|
1162 | 1162 | } |
1163 | 1163 | |
1164 | 1164 | |
@@ -1171,18 +1171,18 @@ discard block |
||
1171 | 1171 | * @param int $txn_id if none is provided, assumes $this->TXN_ID() |
1172 | 1172 | * @return int count of items saved |
1173 | 1173 | */ |
1174 | - public function save_this_and_descendants_to_txn( $txn_id = NULL ) { |
|
1174 | + public function save_this_and_descendants_to_txn($txn_id = NULL) { |
|
1175 | 1175 | $count = 0; |
1176 | - if ( ! $txn_id ) { |
|
1176 | + if ( ! $txn_id) { |
|
1177 | 1177 | $txn_id = $this->TXN_ID(); |
1178 | 1178 | } |
1179 | - $this->set_TXN_ID( $txn_id ); |
|
1179 | + $this->set_TXN_ID($txn_id); |
|
1180 | 1180 | $children = $this->children(); |
1181 | 1181 | $count += $this->save() ? 1 : 0; |
1182 | - foreach ( $children as $child_line_item ) { |
|
1183 | - if ( $child_line_item instanceof EE_Line_Item ) { |
|
1184 | - $child_line_item->set_parent_ID( $this->ID() ); |
|
1185 | - $count += $child_line_item->save_this_and_descendants_to_txn( $txn_id ); |
|
1182 | + foreach ($children as $child_line_item) { |
|
1183 | + if ($child_line_item instanceof EE_Line_Item) { |
|
1184 | + $child_line_item->set_parent_ID($this->ID()); |
|
1185 | + $count += $child_line_item->save_this_and_descendants_to_txn($txn_id); |
|
1186 | 1186 | } |
1187 | 1187 | } |
1188 | 1188 | return $count; |
@@ -1199,9 +1199,9 @@ discard block |
||
1199 | 1199 | $count = 0; |
1200 | 1200 | $children = $this->children(); |
1201 | 1201 | $count += $this->save() ? 1 : 0; |
1202 | - foreach ( $children as $child_line_item ) { |
|
1203 | - if ( $child_line_item instanceof EE_Line_Item ) { |
|
1204 | - $child_line_item->set_parent_ID( $this->ID() ); |
|
1202 | + foreach ($children as $child_line_item) { |
|
1203 | + if ($child_line_item instanceof EE_Line_Item) { |
|
1204 | + $child_line_item->set_parent_ID($this->ID()); |
|
1205 | 1205 | $count += $child_line_item->save_this_and_descendants(); |
1206 | 1206 | } |
1207 | 1207 | } |
@@ -1215,8 +1215,8 @@ discard block |
||
1215 | 1215 | * @return EE_Line_Item[] |
1216 | 1216 | */ |
1217 | 1217 | public function get_cancellations() { |
1218 | - EE_Registry::instance()->load_helper( 'Line_Item' ); |
|
1219 | - return EEH_Line_Item::get_descendants_of_type( $this, EEM_Line_Item::type_cancellation ); |
|
1218 | + EE_Registry::instance()->load_helper('Line_Item'); |
|
1219 | + return EEH_Line_Item::get_descendants_of_type($this, EEM_Line_Item::type_cancellation); |
|
1220 | 1220 | } |
1221 | 1221 | |
1222 | 1222 | |
@@ -1227,7 +1227,7 @@ discard block |
||
1227 | 1227 | * @return int count of items saved |
1228 | 1228 | */ |
1229 | 1229 | public function maybe_save() { |
1230 | - if ( $this->ID() ) { |
|
1230 | + if ($this->ID()) { |
|
1231 | 1231 | return $this->save(); |
1232 | 1232 | } |
1233 | 1233 | return false; |
@@ -172,7 +172,7 @@ discard block |
||
172 | 172 | * Sets quantity |
173 | 173 | * @param int $quantity |
174 | 174 | */ |
175 | - public function set_quantity( $quantity ) { |
|
175 | + public function set_quantity( $quantity ) { |
|
176 | 176 | $this->set( 'LIN_quantity', max( $quantity, 0 ) ); |
177 | 177 | } |
178 | 178 | |
@@ -212,25 +212,25 @@ discard block |
||
212 | 212 | * Gets item_type |
213 | 213 | * @return string |
214 | 214 | */ |
215 | - public function OBJ_type_i18n() { |
|
216 | - $obj_type = $this->OBJ_type(); |
|
217 | - switch ($obj_type) { |
|
218 | - case 'Event': |
|
219 | - $obj_type = __('Event', 'event_espresso'); |
|
220 | - break; |
|
221 | - case 'Price': |
|
222 | - $obj_type = __('Price', 'event_espresso'); |
|
223 | - break; |
|
224 | - case 'Promotion': |
|
225 | - $obj_type = __('Promotion', 'event_espresso'); |
|
226 | - break; |
|
227 | - case 'Ticket': |
|
228 | - $obj_type = __('Ticket', 'event_espresso'); |
|
229 | - break; |
|
230 | - case 'Transaction': |
|
231 | - $obj_type = __('Transaction', 'event_espresso'); |
|
232 | - break; |
|
233 | - } |
|
215 | + public function OBJ_type_i18n() { |
|
216 | + $obj_type = $this->OBJ_type(); |
|
217 | + switch ($obj_type) { |
|
218 | + case 'Event': |
|
219 | + $obj_type = __('Event', 'event_espresso'); |
|
220 | + break; |
|
221 | + case 'Price': |
|
222 | + $obj_type = __('Price', 'event_espresso'); |
|
223 | + break; |
|
224 | + case 'Promotion': |
|
225 | + $obj_type = __('Promotion', 'event_espresso'); |
|
226 | + break; |
|
227 | + case 'Ticket': |
|
228 | + $obj_type = __('Ticket', 'event_espresso'); |
|
229 | + break; |
|
230 | + case 'Transaction': |
|
231 | + $obj_type = __('Transaction', 'event_espresso'); |
|
232 | + break; |
|
233 | + } |
|
234 | 234 | return apply_filters('FHEE__EE_Line_Item__OBJ_type_i18n', $obj_type, $this); |
235 | 235 | } |
236 | 236 | |
@@ -1244,48 +1244,48 @@ discard block |
||
1244 | 1244 | |
1245 | 1245 | |
1246 | 1246 | |
1247 | - /** |
|
1248 | - * @param bool $raw |
|
1249 | - * @return int |
|
1250 | - * @throws \EE_Error |
|
1251 | - */ |
|
1252 | - public function timestamp($raw = false) |
|
1253 | - { |
|
1254 | - return $raw ? $this->get_raw('LIN_timestamp') : $this->get('LIN_timestamp'); |
|
1255 | - } |
|
1247 | + /** |
|
1248 | + * @param bool $raw |
|
1249 | + * @return int |
|
1250 | + * @throws \EE_Error |
|
1251 | + */ |
|
1252 | + public function timestamp($raw = false) |
|
1253 | + { |
|
1254 | + return $raw ? $this->get_raw('LIN_timestamp') : $this->get('LIN_timestamp'); |
|
1255 | + } |
|
1256 | 1256 | |
1257 | 1257 | |
1258 | 1258 | |
1259 | 1259 | |
1260 | - /************************* DEPRECATED *************************/ |
|
1260 | + /************************* DEPRECATED *************************/ |
|
1261 | 1261 | |
1262 | 1262 | |
1263 | 1263 | |
1264 | - /** |
|
1265 | - * @deprecated 4.6.0 |
|
1266 | - * @param string $type one of the constants on EEM_Line_Item |
|
1267 | - * @return EE_Line_Item[] |
|
1268 | - */ |
|
1269 | - protected function _get_descendants_of_type($type) |
|
1270 | - { |
|
1271 | - EE_Error::doing_it_wrong('EE_Line_Item::_get_descendants_of_type()', |
|
1272 | - __('Method replaced with EEH_Line_Item::get_descendants_of_type()', 'event_espresso'), '4.6.0'); |
|
1273 | - return EEH_Line_Item::get_descendants_of_type($this, $type); |
|
1274 | - } |
|
1264 | + /** |
|
1265 | + * @deprecated 4.6.0 |
|
1266 | + * @param string $type one of the constants on EEM_Line_Item |
|
1267 | + * @return EE_Line_Item[] |
|
1268 | + */ |
|
1269 | + protected function _get_descendants_of_type($type) |
|
1270 | + { |
|
1271 | + EE_Error::doing_it_wrong('EE_Line_Item::_get_descendants_of_type()', |
|
1272 | + __('Method replaced with EEH_Line_Item::get_descendants_of_type()', 'event_espresso'), '4.6.0'); |
|
1273 | + return EEH_Line_Item::get_descendants_of_type($this, $type); |
|
1274 | + } |
|
1275 | 1275 | |
1276 | 1276 | |
1277 | 1277 | |
1278 | - /** |
|
1279 | - * @deprecated 4.6.0 |
|
1280 | - * @param string $type like one of the EEM_Line_Item::type_* |
|
1281 | - * @return EE_Line_Item |
|
1282 | - */ |
|
1283 | - public function get_nearest_descendant_of_type($type) |
|
1284 | - { |
|
1285 | - EE_Error::doing_it_wrong('EE_Line_Item::get_nearest_descendant_of_type()', |
|
1286 | - __('Method replaced with EEH_Line_Item::get_nearest_descendant_of_type()', 'event_espresso'), '4.6.0'); |
|
1287 | - return EEH_Line_Item::get_nearest_descendant_of_type($this, $type); |
|
1288 | - } |
|
1278 | + /** |
|
1279 | + * @deprecated 4.6.0 |
|
1280 | + * @param string $type like one of the EEM_Line_Item::type_* |
|
1281 | + * @return EE_Line_Item |
|
1282 | + */ |
|
1283 | + public function get_nearest_descendant_of_type($type) |
|
1284 | + { |
|
1285 | + EE_Error::doing_it_wrong('EE_Line_Item::get_nearest_descendant_of_type()', |
|
1286 | + __('Method replaced with EEH_Line_Item::get_nearest_descendant_of_type()', 'event_espresso'), '4.6.0'); |
|
1287 | + return EEH_Line_Item::get_nearest_descendant_of_type($this, $type); |
|
1288 | + } |
|
1289 | 1289 | |
1290 | 1290 | |
1291 | 1291 |
@@ -2,7 +2,7 @@ discard block |
||
2 | 2 | use EventEspresso\core\exceptions\UnexpectedEntityException; |
3 | 3 | |
4 | 4 | if ( ! defined('EVENT_ESPRESSO_VERSION')) { |
5 | - exit('No direct script access allowed'); |
|
5 | + exit('No direct script access allowed'); |
|
6 | 6 | } |
7 | 7 | |
8 | 8 | |
@@ -21,952 +21,952 @@ discard block |
||
21 | 21 | class EED_Ticket_Sales_Monitor extends EED_Module |
22 | 22 | { |
23 | 23 | |
24 | - const debug = false; // true false |
|
25 | - |
|
26 | - /** |
|
27 | - * an array of raw ticket data from EED_Ticket_Selector |
|
28 | - * |
|
29 | - * @var array $ticket_selections |
|
30 | - */ |
|
31 | - protected $ticket_selections = array(); |
|
32 | - |
|
33 | - /** |
|
34 | - * the raw ticket data from EED_Ticket_Selector is organized in rows |
|
35 | - * according to how they are displayed in the actual Ticket_Selector |
|
36 | - * this tracks the current row being processed |
|
37 | - * |
|
38 | - * @var int $current_row |
|
39 | - */ |
|
40 | - protected $current_row = 0; |
|
41 | - |
|
42 | - /** |
|
43 | - * an array for tracking names of tickets that have sold out |
|
44 | - * |
|
45 | - * @var array $sold_out_tickets |
|
46 | - */ |
|
47 | - protected $sold_out_tickets = array(); |
|
48 | - |
|
49 | - /** |
|
50 | - * an array for tracking names of tickets that have had their quantities reduced |
|
51 | - * |
|
52 | - * @var array $decremented_tickets |
|
53 | - */ |
|
54 | - protected $decremented_tickets = array(); |
|
55 | - |
|
56 | - |
|
57 | - |
|
58 | - /** |
|
59 | - * set_hooks - for hooking into EE Core, other modules, etc |
|
60 | - * |
|
61 | - * @access public |
|
62 | - * @return void |
|
63 | - */ |
|
64 | - public static function set_hooks() |
|
65 | - { |
|
66 | - // release tickets for expired carts |
|
67 | - add_action('EED_Ticket_Selector__process_ticket_selections__before', |
|
68 | - array('EED_Ticket_Sales_Monitor', 'release_tickets_for_expired_carts'), |
|
69 | - 1 |
|
70 | - ); |
|
71 | - // check ticket reserves AFTER MER does it's check (hence priority 20) |
|
72 | - add_filter('FHEE__EE_Ticket_Selector___add_ticket_to_cart__ticket_qty', |
|
73 | - array('EED_Ticket_Sales_Monitor', 'validate_ticket_sale'), |
|
74 | - 20, 3 |
|
75 | - ); |
|
76 | - // add notices for sold out tickets |
|
77 | - add_action('AHEE__EE_Ticket_Selector__process_ticket_selections__after_tickets_added_to_cart', |
|
78 | - array('EED_Ticket_Sales_Monitor', 'post_notices'), |
|
79 | - 10 |
|
80 | - ); |
|
81 | - // handle ticket quantities adjusted in cart |
|
82 | - //add_action( |
|
83 | - // 'FHEE__EED_Multi_Event_Registration__adjust_line_item_quantity__line_item_quantity_updated', |
|
84 | - // array( 'EED_Ticket_Sales_Monitor', 'ticket_quantity_updated' ), |
|
85 | - // 10, 2 |
|
86 | - //); |
|
87 | - // handle tickets deleted from cart |
|
88 | - add_action( |
|
89 | - 'FHEE__EED_Multi_Event_Registration__delete_ticket__ticket_removed_from_cart', |
|
90 | - array('EED_Ticket_Sales_Monitor', 'ticket_removed_from_cart'), |
|
91 | - 10, 2 |
|
92 | - ); |
|
93 | - // handle emptied carts |
|
94 | - add_action( |
|
95 | - 'AHEE__EE_Session__reset_cart__before_reset', |
|
96 | - array('EED_Ticket_Sales_Monitor', 'session_cart_reset'), |
|
97 | - 10, 1 |
|
98 | - ); |
|
99 | - add_action( |
|
100 | - 'AHEE__EED_Multi_Event_Registration__empty_event_cart__before_delete_cart', |
|
101 | - array('EED_Ticket_Sales_Monitor', 'session_cart_reset'), |
|
102 | - 10, 1 |
|
103 | - ); |
|
104 | - // handle cancelled registrations |
|
105 | - add_action( |
|
106 | - 'AHEE__EE_Session__reset_checkout__before_reset', |
|
107 | - array('EED_Ticket_Sales_Monitor', 'session_checkout_reset'), |
|
108 | - 10, 1 |
|
109 | - ); |
|
110 | - // cron tasks |
|
111 | - add_action( |
|
112 | - 'AHEE__EE_Cron_Tasks__finalize_abandoned_transactions__abandoned_transaction', |
|
113 | - array('EED_Ticket_Sales_Monitor', 'process_abandoned_transactions'), |
|
114 | - 10, 1 |
|
115 | - ); |
|
116 | - add_action( |
|
117 | - 'AHEE__EE_Cron_Tasks__process_expired_transactions__incomplete_transaction', |
|
118 | - array('EED_Ticket_Sales_Monitor', 'process_abandoned_transactions'), |
|
119 | - 10, 1 |
|
120 | - ); |
|
121 | - add_action( |
|
122 | - 'AHEE__EE_Cron_Tasks__process_expired_transactions__failed_transaction', |
|
123 | - array('EED_Ticket_Sales_Monitor', 'process_failed_transactions'), |
|
124 | - 10, 1 |
|
125 | - ); |
|
126 | - } |
|
127 | - |
|
128 | - |
|
129 | - |
|
130 | - /** |
|
131 | - * set_hooks_admin - for hooking into EE Admin Core, other modules, etc |
|
132 | - * |
|
133 | - * @access public |
|
134 | - * @return void |
|
135 | - */ |
|
136 | - public static function set_hooks_admin() |
|
137 | - { |
|
138 | - EED_Ticket_Sales_Monitor::set_hooks(); |
|
139 | - } |
|
140 | - |
|
141 | - |
|
142 | - |
|
143 | - /** |
|
144 | - * @return EED_Ticket_Sales_Monitor|EED_Module |
|
145 | - */ |
|
146 | - public static function instance() |
|
147 | - { |
|
148 | - return parent::get_instance(__CLASS__); |
|
149 | - } |
|
150 | - |
|
151 | - |
|
152 | - |
|
153 | - /** |
|
154 | - * run |
|
155 | - * |
|
156 | - * @access public |
|
157 | - * @param WP_Query $WP_Query |
|
158 | - * @return void |
|
159 | - */ |
|
160 | - public function run($WP_Query) |
|
161 | - { |
|
162 | - } |
|
163 | - |
|
164 | - |
|
165 | - |
|
166 | - /********************************** PRE_TICKET_SALES **********************************/ |
|
167 | - |
|
168 | - |
|
169 | - |
|
170 | - /** |
|
171 | - * Retrieves grand totals from the line items that have no TXN ID |
|
172 | - * and timestamps less than the current time minus the session lifespan. |
|
173 | - * These are carts that have been abandoned before the "registrant" even attempted to checkout. |
|
174 | - * We're going to release the tickets for these line items before attempting to add more to the cart. |
|
175 | - * |
|
176 | - * @return void |
|
177 | - * @throws \EE_Error |
|
178 | - */ |
|
179 | - public static function release_tickets_for_expired_carts() |
|
180 | - { |
|
181 | - $expired_ticket_IDs = array(); |
|
182 | - $valid_ticket_line_items = array(); |
|
183 | - $total_line_items = EEM_Line_Item::instance()->get_total_line_items_with_no_transaction(); |
|
184 | - if(empty($total_line_items)){ |
|
185 | - return; |
|
186 | - } |
|
187 | - $expired = current_time('timestamp') - EE_Registry::instance()->SSN->lifespan(); |
|
188 | - foreach ($total_line_items as $total_line_item) { |
|
189 | - /** @var EE_Line_Item $total_line_item */ |
|
190 | - $ticket_line_items = EED_Ticket_Sales_Monitor::get_ticket_line_items_for_grand_total($total_line_item); |
|
191 | - foreach ($ticket_line_items as $ticket_line_item) { |
|
192 | - if(! $ticket_line_item instanceof EE_Line_Item) { |
|
193 | - continue; |
|
194 | - } |
|
195 | - if ($total_line_item->timestamp(true) <= $expired ) { |
|
196 | - $expired_ticket_IDs[$ticket_line_item->OBJ_ID()] = $ticket_line_item->OBJ_ID(); |
|
197 | - } else { |
|
198 | - $valid_ticket_line_items[$ticket_line_item->OBJ_ID()] = $ticket_line_item; |
|
199 | - } |
|
200 | - } |
|
201 | - } |
|
202 | - if (! empty($expired_ticket_IDs)) { |
|
203 | - EED_Ticket_Sales_Monitor::release_reservations_for_tickets( |
|
204 | - \EEM_Ticket::instance()->get_tickets_with_IDs($expired_ticket_IDs), |
|
205 | - $valid_ticket_line_items |
|
206 | - ); |
|
207 | - // let's get rid of expired line items so that they can't interfere with tracking |
|
208 | - add_action( |
|
209 | - 'shutdown', |
|
210 | - array('EED_Ticket_Sales_Monitor', 'clear_expired_line_items_with_no_transaction'), |
|
211 | - 999 |
|
212 | - ); |
|
213 | - } |
|
214 | - } |
|
215 | - |
|
216 | - |
|
217 | - |
|
218 | - /********************************** VALIDATE_TICKET_SALE **********************************/ |
|
219 | - |
|
220 | - |
|
221 | - |
|
222 | - /** |
|
223 | - * validate_ticket_sales |
|
224 | - * callback for 'FHEE__EED_Ticket_Selector__process_ticket_selections__valid_post_data' |
|
225 | - * |
|
226 | - * @access public |
|
227 | - * @param int $qty |
|
228 | - * @param \EE_Ticket $ticket |
|
229 | - * @return bool |
|
230 | - * @throws UnexpectedEntityException |
|
231 | - * @throws EE_Error |
|
232 | - */ |
|
233 | - public static function validate_ticket_sale($qty = 1, EE_Ticket $ticket) |
|
234 | - { |
|
235 | - $qty = absint($qty); |
|
236 | - if ($qty > 0) { |
|
237 | - $qty = EED_Ticket_Sales_Monitor::instance()->_validate_ticket_sale($ticket, $qty); |
|
238 | - } |
|
239 | - if (self::debug) { |
|
240 | - echo '<br /><br /> ' . __LINE__ . ') ' . __METHOD__ . '()'; |
|
241 | - echo '<br /><br /><b> RETURNED QTY: ' . $qty . '</b>'; |
|
242 | - } |
|
243 | - return $qty; |
|
244 | - } |
|
245 | - |
|
246 | - |
|
247 | - |
|
248 | - /** |
|
249 | - * _validate_ticket_sale |
|
250 | - * checks whether an individual ticket is available for purchase based on datetime, and ticket details |
|
251 | - * |
|
252 | - * @access protected |
|
253 | - * @param \EE_Ticket $ticket |
|
254 | - * @param int $qty |
|
255 | - * @return int |
|
256 | - * @throws UnexpectedEntityException |
|
257 | - * @throws EE_Error |
|
258 | - */ |
|
259 | - protected function _validate_ticket_sale(EE_Ticket $ticket, $qty = 1) |
|
260 | - { |
|
261 | - if (self::debug) { |
|
262 | - echo '<br /><br /> ' . __LINE__ . ') ' . __METHOD__ . '() '; |
|
263 | - } |
|
264 | - if ( ! $ticket instanceof EE_Ticket) { |
|
265 | - return 0; |
|
266 | - } |
|
267 | - if (self::debug) { |
|
268 | - echo '<br /><b> . ticket->ID: ' . $ticket->ID() . '</b>'; |
|
269 | - echo '<br /> . original ticket->reserved: ' . $ticket->reserved(); |
|
270 | - } |
|
271 | - $ticket->refresh_from_db(); |
|
272 | - // first let's determine the ticket availability based on sales |
|
273 | - $available = $ticket->qty('saleable'); |
|
274 | - if (self::debug) { |
|
275 | - echo '<br /> . . . ticket->qty: ' . $ticket->qty(); |
|
276 | - echo '<br /> . . . ticket->sold: ' . $ticket->sold(); |
|
277 | - echo '<br /> . . . ticket->reserved: ' . $ticket->reserved(); |
|
278 | - echo '<br /> . . . ticket->qty(saleable): ' . $ticket->qty('saleable'); |
|
279 | - echo '<br /> . . . available: ' . $available; |
|
280 | - } |
|
281 | - if ($available < 1) { |
|
282 | - $this->_ticket_sold_out($ticket); |
|
283 | - return 0; |
|
284 | - } |
|
285 | - if (self::debug) { |
|
286 | - echo '<br /> . . . qty: ' . $qty; |
|
287 | - } |
|
288 | - if ($available < $qty) { |
|
289 | - $qty = $available; |
|
290 | - if (self::debug) { |
|
291 | - echo '<br /> . . . QTY ADJUSTED: ' . $qty; |
|
292 | - } |
|
293 | - $this->_ticket_quantity_decremented($ticket); |
|
294 | - } |
|
295 | - $this->_reserve_ticket($ticket, $qty); |
|
296 | - return $qty; |
|
297 | - } |
|
298 | - |
|
299 | - |
|
300 | - |
|
301 | - /** |
|
302 | - * _reserve_ticket |
|
303 | - * increments ticket reserved based on quantity passed |
|
304 | - * |
|
305 | - * @access protected |
|
306 | - * @param \EE_Ticket $ticket |
|
307 | - * @param int $quantity |
|
308 | - * @return bool |
|
309 | - * @throws EE_Error |
|
310 | - */ |
|
311 | - protected function _reserve_ticket(EE_Ticket $ticket, $quantity = 1) |
|
312 | - { |
|
313 | - if (self::debug) { |
|
314 | - echo '<br /><br /> . . . INCREASE RESERVED: ' . $quantity; |
|
315 | - } |
|
316 | - $ticket->increase_reserved($quantity); |
|
317 | - return $ticket->save(); |
|
318 | - } |
|
319 | - |
|
320 | - |
|
321 | - |
|
322 | - /** |
|
323 | - * _release_reserved_ticket |
|
324 | - * |
|
325 | - * @access protected |
|
326 | - * @param EE_Ticket $ticket |
|
327 | - * @param int $quantity |
|
328 | - * @return bool |
|
329 | - * @throws EE_Error |
|
330 | - */ |
|
331 | - protected function _release_reserved_ticket(EE_Ticket $ticket, $quantity = 1) |
|
332 | - { |
|
333 | - if (self::debug) { |
|
334 | - echo '<br /> . . . ticket->ID: ' . $ticket->ID(); |
|
335 | - echo '<br /> . . . ticket->reserved: ' . $ticket->reserved(); |
|
336 | - } |
|
337 | - $ticket->decrease_reserved($quantity); |
|
338 | - if (self::debug) { |
|
339 | - echo '<br /> . . . ticket->reserved: ' . $ticket->reserved(); |
|
340 | - } |
|
341 | - return $ticket->save() ? 1 : 0; |
|
342 | - } |
|
343 | - |
|
344 | - |
|
345 | - |
|
346 | - /** |
|
347 | - * _ticket_sold_out |
|
348 | - * removes quantities within the ticket selector based on zero ticket availability |
|
349 | - * |
|
350 | - * @access protected |
|
351 | - * @param \EE_Ticket $ticket |
|
352 | - * @return void |
|
353 | - * @throws UnexpectedEntityException |
|
354 | - * @throws EE_Error |
|
355 | - */ |
|
356 | - protected function _ticket_sold_out(EE_Ticket $ticket) |
|
357 | - { |
|
358 | - if (self::debug) { |
|
359 | - echo '<br /><br /> ' . __LINE__ . ') ' . __METHOD__ . '() '; |
|
360 | - echo '<br /> . . ticket->name: ' . $this->_get_ticket_and_event_name($ticket); |
|
361 | - } |
|
362 | - $this->sold_out_tickets[] = $this->_get_ticket_and_event_name($ticket); |
|
363 | - } |
|
364 | - |
|
365 | - |
|
366 | - |
|
367 | - /** |
|
368 | - * _ticket_quantity_decremented |
|
369 | - * adjusts quantities within the ticket selector based on decreased ticket availability |
|
370 | - * |
|
371 | - * @access protected |
|
372 | - * @param \EE_Ticket $ticket |
|
373 | - * @return void |
|
374 | - * @throws UnexpectedEntityException |
|
375 | - * @throws EE_Error |
|
376 | - */ |
|
377 | - protected function _ticket_quantity_decremented(EE_Ticket $ticket) |
|
378 | - { |
|
379 | - if (self::debug) { |
|
380 | - echo '<br /><br /> ' . __LINE__ . ') ' . __METHOD__ . '() '; |
|
381 | - echo '<br /> . . ticket->name: ' . $this->_get_ticket_and_event_name($ticket); |
|
382 | - } |
|
383 | - $this->decremented_tickets[] = $this->_get_ticket_and_event_name($ticket); |
|
384 | - } |
|
385 | - |
|
386 | - |
|
387 | - |
|
388 | - /** |
|
389 | - * _get_ticket_and_event_name |
|
390 | - * builds string out of ticket and event name |
|
391 | - * |
|
392 | - * @access protected |
|
393 | - * @param \EE_Ticket $ticket |
|
394 | - * @return string |
|
395 | - * @throws UnexpectedEntityException |
|
396 | - * @throws EE_Error |
|
397 | - */ |
|
398 | - protected function _get_ticket_and_event_name(EE_Ticket $ticket) |
|
399 | - { |
|
400 | - $event = $ticket->get_related_event(); |
|
401 | - if ($event instanceof EE_Event) { |
|
402 | - $ticket_name = sprintf( |
|
403 | - _x('%1$s for %2$s', 'ticket name for event name', 'event_espresso'), |
|
404 | - $ticket->name(), |
|
405 | - $event->name() |
|
406 | - ); |
|
407 | - } else { |
|
408 | - $ticket_name = $ticket->name(); |
|
409 | - } |
|
410 | - return $ticket_name; |
|
411 | - } |
|
412 | - |
|
413 | - |
|
414 | - |
|
415 | - /********************************** EVENT CART **********************************/ |
|
416 | - |
|
417 | - |
|
418 | - |
|
419 | - /** |
|
420 | - * ticket_quantity_updated |
|
421 | - * releases or reserves ticket(s) based on quantity passed |
|
422 | - * |
|
423 | - * @access public |
|
424 | - * @param EE_Line_Item $line_item |
|
425 | - * @param int $quantity |
|
426 | - * @return void |
|
427 | - * @throws EE_Error |
|
428 | - */ |
|
429 | - public static function ticket_quantity_updated(EE_Line_Item $line_item, $quantity = 1) |
|
430 | - { |
|
431 | - $ticket = EEM_Ticket::instance()->get_one_by_ID(absint($line_item->OBJ_ID())); |
|
432 | - if ($ticket instanceof EE_Ticket) { |
|
433 | - if ($quantity > 0) { |
|
434 | - EED_Ticket_Sales_Monitor::instance()->_reserve_ticket($ticket, $quantity); |
|
435 | - } else { |
|
436 | - EED_Ticket_Sales_Monitor::instance()->_release_reserved_ticket($ticket, $quantity); |
|
437 | - } |
|
438 | - } |
|
439 | - } |
|
440 | - |
|
441 | - |
|
442 | - |
|
443 | - /** |
|
444 | - * ticket_removed_from_cart |
|
445 | - * releases reserved ticket(s) based on quantity passed |
|
446 | - * |
|
447 | - * @access public |
|
448 | - * @param EE_Ticket $ticket |
|
449 | - * @param int $quantity |
|
450 | - * @return void |
|
451 | - * @throws EE_Error |
|
452 | - */ |
|
453 | - public static function ticket_removed_from_cart(EE_Ticket $ticket, $quantity = 1) |
|
454 | - { |
|
455 | - EED_Ticket_Sales_Monitor::instance()->_release_reserved_ticket($ticket, $quantity); |
|
456 | - } |
|
457 | - |
|
458 | - |
|
459 | - |
|
460 | - /********************************** POST_NOTICES **********************************/ |
|
461 | - |
|
462 | - |
|
463 | - |
|
464 | - /** |
|
465 | - * post_notices |
|
466 | - * |
|
467 | - * @access public |
|
468 | - * @return void |
|
469 | - * @throws EE_Error |
|
470 | - */ |
|
471 | - public static function post_notices() |
|
472 | - { |
|
473 | - EED_Ticket_Sales_Monitor::instance()->_post_notices(); |
|
474 | - } |
|
475 | - |
|
476 | - |
|
477 | - |
|
478 | - /** |
|
479 | - * _post_notices |
|
480 | - * |
|
481 | - * @access protected |
|
482 | - * @return void |
|
483 | - * @throws EE_Error |
|
484 | - */ |
|
485 | - protected function _post_notices() |
|
486 | - { |
|
487 | - if (self::debug) { |
|
488 | - echo '<br /><br /> ' . __LINE__ . ') ' . __METHOD__ . '() '; |
|
489 | - } |
|
490 | - $refresh_msg = ''; |
|
491 | - $none_added_msg = ''; |
|
492 | - if (defined('DOING_AJAX') && DOING_AJAX) { |
|
493 | - $refresh_msg = __('Please refresh the page to view updated ticket quantities.', |
|
494 | - 'event_espresso'); |
|
495 | - $none_added_msg = __('No tickets were added for the event.', 'event_espresso'); |
|
496 | - } |
|
497 | - if ( ! empty($this->sold_out_tickets)) { |
|
498 | - EE_Error::add_attention( |
|
499 | - sprintf( |
|
500 | - apply_filters( |
|
501 | - 'FHEE__EED_Ticket_Sales_Monitor___post_notices__sold_out_tickets_notice', |
|
502 | - __('We\'re sorry...%1$sThe following items have sold out since you first viewed this page, and can no longer be registered for:%1$s%1$s%2$s%1$s%1$sPlease note that availability can change at any time due to cancellations, so please check back again later if registration for this event(s) is important to you.%1$s%1$s%3$s%1$s%4$s%1$s', |
|
503 | - 'event_espresso') |
|
504 | - ), |
|
505 | - '<br />', |
|
506 | - implode('<br />', $this->sold_out_tickets), |
|
507 | - $none_added_msg, |
|
508 | - $refresh_msg |
|
509 | - ) |
|
510 | - ); |
|
511 | - // alter code flow in the Ticket Selector for better UX |
|
512 | - add_filter('FHEE__EED_Ticket_Selector__process_ticket_selections__tckts_slctd', '__return_true'); |
|
513 | - add_filter('FHEE__EED_Ticket_Selector__process_ticket_selections__success', '__return_false'); |
|
514 | - $this->sold_out_tickets = array(); |
|
515 | - // and reset the cart |
|
516 | - EED_Ticket_Sales_Monitor::session_cart_reset(EE_Registry::instance()->SSN); |
|
517 | - } |
|
518 | - if ( ! empty($this->decremented_tickets)) { |
|
519 | - EE_Error::add_attention( |
|
520 | - sprintf( |
|
521 | - apply_filters( |
|
522 | - 'FHEE__EED_Ticket_Sales_Monitor___ticket_quantity_decremented__notice', |
|
523 | - __('We\'re sorry...%1$sDue to sales that have occurred since you first viewed the last page, the following items have had their quantities adjusted to match the current available amount:%1$s%1$s%2$s%1$s%1$sPlease note that availability can change at any time due to cancellations, so please check back again later if registration for this event(s) is important to you.%1$s%1$s%3$s%1$s%4$s%1$s', |
|
524 | - 'event_espresso') |
|
525 | - ), |
|
526 | - '<br />', |
|
527 | - implode('<br />', $this->decremented_tickets), |
|
528 | - $none_added_msg, |
|
529 | - $refresh_msg |
|
530 | - ) |
|
531 | - ); |
|
532 | - $this->decremented_tickets = array(); |
|
533 | - } |
|
534 | - } |
|
535 | - |
|
536 | - |
|
537 | - |
|
538 | - /********************************** RELEASE_ALL_RESERVED_TICKETS_FOR_TRANSACTION **********************************/ |
|
539 | - |
|
540 | - |
|
541 | - |
|
542 | - /** |
|
543 | - * _release_all_reserved_tickets_for_transaction |
|
544 | - * releases reserved tickets for all registrations of an EE_Transaction |
|
545 | - * by default, will NOT release tickets for finalized transactions |
|
546 | - * |
|
547 | - * @access protected |
|
548 | - * @param EE_Transaction $transaction |
|
549 | - * @return int |
|
550 | - * @throws EE_Error |
|
551 | - */ |
|
552 | - protected function _release_all_reserved_tickets_for_transaction(EE_Transaction $transaction) |
|
553 | - { |
|
554 | - if (self::debug) { |
|
555 | - echo '<br /><br /> ' . __LINE__ . ') ' . __METHOD__ . '() '; |
|
556 | - echo '<br /> . transaction->ID: ' . $transaction->ID(); |
|
557 | - } |
|
558 | - // check if 'finalize_registration' step has been completed... |
|
559 | - $finalized = $transaction->reg_step_completed('finalize_registration'); |
|
560 | - if (self::debug) { |
|
561 | - // DEBUG LOG |
|
562 | - EEH_Debug_Tools::log( |
|
563 | - __CLASS__, __FUNCTION__, __LINE__, |
|
564 | - array('finalized' => $finalized), |
|
565 | - false, 'EE_Transaction: ' . $transaction->ID() |
|
566 | - ); |
|
567 | - } |
|
568 | - // how many tickets were released |
|
569 | - $count = 0; |
|
570 | - if (self::debug) { |
|
571 | - echo '<br /> . . . finalized: ' . $finalized; |
|
572 | - } |
|
573 | - $release_tickets_with_TXN_status = array( |
|
574 | - EEM_Transaction::failed_status_code, |
|
575 | - EEM_Transaction::abandoned_status_code, |
|
576 | - EEM_Transaction::incomplete_status_code, |
|
577 | - ); |
|
578 | - // if the session is getting cleared BEFORE the TXN has been finalized |
|
579 | - if ( ! $finalized || in_array($transaction->status_ID(), $release_tickets_with_TXN_status, true)) { |
|
580 | - // let's cancel any reserved tickets |
|
581 | - $registrations = $transaction->registrations(); |
|
582 | - if ( ! empty($registrations)) { |
|
583 | - foreach ($registrations as $registration) { |
|
584 | - if ($registration instanceof EE_Registration) { |
|
585 | - $count += $this->_release_reserved_ticket_for_registration($registration, $transaction); |
|
586 | - } |
|
587 | - } |
|
588 | - } |
|
589 | - } |
|
590 | - return $count; |
|
591 | - } |
|
592 | - |
|
593 | - |
|
594 | - |
|
595 | - /** |
|
596 | - * _release_reserved_ticket_for_registration |
|
597 | - * releases reserved tickets for an EE_Registration |
|
598 | - * by default, will NOT release tickets for APPROVED registrations |
|
599 | - * |
|
600 | - * @access protected |
|
601 | - * @param EE_Registration $registration |
|
602 | - * @param EE_Transaction $transaction |
|
603 | - * @return int |
|
604 | - * @throws EE_Error |
|
605 | - */ |
|
606 | - protected function _release_reserved_ticket_for_registration( |
|
607 | - EE_Registration $registration, |
|
608 | - EE_Transaction $transaction |
|
609 | - ) { |
|
610 | - $STS_ID = $transaction->status_ID(); |
|
611 | - if (self::debug) { |
|
612 | - echo '<br /><br /> ' . __LINE__ . ') ' . __METHOD__ . '() '; |
|
613 | - echo '<br /> . . registration->ID: ' . $registration->ID(); |
|
614 | - echo '<br /> . . registration->status_ID: ' . $registration->status_ID(); |
|
615 | - echo '<br /> . . transaction->status_ID(): ' . $STS_ID; |
|
616 | - } |
|
617 | - if ( |
|
618 | - // release Tickets for Failed Transactions and Abandoned Transactions |
|
619 | - $STS_ID === EEM_Transaction::failed_status_code |
|
620 | - || $STS_ID === EEM_Transaction::abandoned_status_code |
|
621 | - || ( |
|
622 | - // also release Tickets for Incomplete Transactions, but ONLY if the Registrations are NOT Approved |
|
623 | - $STS_ID === EEM_Transaction::incomplete_status_code |
|
624 | - && $registration->status_ID() !== EEM_Registration::status_id_approved |
|
625 | - ) |
|
626 | - ) { |
|
627 | - $ticket = $registration->ticket(); |
|
628 | - if ($ticket instanceof EE_Ticket) { |
|
629 | - return $this->_release_reserved_ticket($ticket); |
|
630 | - } |
|
631 | - } |
|
632 | - return 0; |
|
633 | - } |
|
634 | - |
|
635 | - |
|
636 | - |
|
637 | - /********************************** SESSION_CART_RESET **********************************/ |
|
638 | - |
|
639 | - |
|
640 | - |
|
641 | - /** |
|
642 | - * session_cart_reset |
|
643 | - * callback hooked into 'AHEE__EE_Session__reset_cart__before_reset' |
|
644 | - * |
|
645 | - * @access public |
|
646 | - * @param EE_Session $session |
|
647 | - * @return void |
|
648 | - * @throws EE_Error |
|
649 | - */ |
|
650 | - public static function session_cart_reset(EE_Session $session) |
|
651 | - { |
|
652 | - if (self::debug) { |
|
653 | - echo '<br /><br /> ' . __LINE__ . ') ' . __METHOD__ . '() '; |
|
654 | - } |
|
655 | - $cart = $session->cart(); |
|
656 | - if ($cart instanceof EE_Cart) { |
|
657 | - if (self::debug) { |
|
658 | - echo '<br /><br /> cart instance of EE_Cart: '; |
|
659 | - } |
|
660 | - EED_Ticket_Sales_Monitor::instance()->_session_cart_reset($cart); |
|
661 | - } else { |
|
662 | - if (self::debug) { |
|
663 | - echo '<br /><br /> invalid EE_Cart: '; |
|
664 | - var_dump($cart); |
|
665 | - } |
|
666 | - } |
|
667 | - } |
|
668 | - |
|
669 | - |
|
670 | - |
|
671 | - /** |
|
672 | - * _session_cart_reset |
|
673 | - * releases reserved tickets in the EE_Cart |
|
674 | - * |
|
675 | - * @access protected |
|
676 | - * @param EE_Cart $cart |
|
677 | - * @return void |
|
678 | - * @throws EE_Error |
|
679 | - */ |
|
680 | - protected function _session_cart_reset(EE_Cart $cart) |
|
681 | - { |
|
682 | - if (self::debug) { |
|
683 | - echo '<br /><br /> ' . __LINE__ . ') ' . __METHOD__ . '() '; |
|
684 | - } |
|
685 | - EE_Registry::instance()->load_helper('Line_Item'); |
|
686 | - $ticket_line_items = $cart->get_tickets(); |
|
687 | - if (empty($ticket_line_items)) { |
|
688 | - return; |
|
689 | - } |
|
690 | - foreach ($ticket_line_items as $ticket_line_item) { |
|
691 | - if (self::debug) { |
|
692 | - echo '<br /> . ticket_line_item->ID(): ' . $ticket_line_item->ID(); |
|
693 | - } |
|
694 | - if ($ticket_line_item instanceof EE_Line_Item && $ticket_line_item->OBJ_type() === 'Ticket') { |
|
695 | - if (self::debug) { |
|
696 | - echo '<br /> . . ticket_line_item->OBJ_ID(): ' . $ticket_line_item->OBJ_ID(); |
|
697 | - } |
|
698 | - $ticket = EEM_Ticket::instance()->get_one_by_ID($ticket_line_item->OBJ_ID()); |
|
699 | - if ($ticket instanceof EE_Ticket) { |
|
700 | - if (self::debug) { |
|
701 | - echo '<br /> . . ticket->ID(): ' . $ticket->ID(); |
|
702 | - echo '<br /> . . ticket_line_item->quantity(): ' . $ticket_line_item->quantity(); |
|
703 | - } |
|
704 | - $this->_release_reserved_ticket($ticket, $ticket_line_item->quantity()); |
|
705 | - } |
|
706 | - } |
|
707 | - } |
|
708 | - if (self::debug) { |
|
709 | - echo '<br /><br /> RESET COMPLETED '; |
|
710 | - } |
|
711 | - } |
|
712 | - |
|
713 | - |
|
714 | - |
|
715 | - /********************************** SESSION_CHECKOUT_RESET **********************************/ |
|
716 | - |
|
717 | - |
|
718 | - |
|
719 | - /** |
|
720 | - * session_checkout_reset |
|
721 | - * callback hooked into 'AHEE__EE_Session__reset_checkout__before_reset' |
|
722 | - * |
|
723 | - * @access public |
|
724 | - * @param EE_Session $session |
|
725 | - * @return void |
|
726 | - * @throws EE_Error |
|
727 | - */ |
|
728 | - public static function session_checkout_reset(EE_Session $session) |
|
729 | - { |
|
730 | - $checkout = $session->checkout(); |
|
731 | - if ($checkout instanceof EE_Checkout) { |
|
732 | - EED_Ticket_Sales_Monitor::instance()->_session_checkout_reset($checkout); |
|
733 | - } |
|
734 | - } |
|
735 | - |
|
736 | - |
|
737 | - |
|
738 | - /** |
|
739 | - * _session_checkout_reset |
|
740 | - * releases reserved tickets for the EE_Checkout->transaction |
|
741 | - * |
|
742 | - * @access protected |
|
743 | - * @param EE_Checkout $checkout |
|
744 | - * @return void |
|
745 | - * @throws EE_Error |
|
746 | - */ |
|
747 | - protected function _session_checkout_reset(EE_Checkout $checkout) |
|
748 | - { |
|
749 | - if (self::debug) { |
|
750 | - echo '<br /><br /> ' . __LINE__ . ') ' . __METHOD__ . '() '; |
|
751 | - } |
|
752 | - // we want to release the each registration's reserved tickets if the session was cleared, but not if this is a revisit |
|
753 | - if ($checkout->revisit || ! $checkout->transaction instanceof EE_Transaction) { |
|
754 | - return; |
|
755 | - } |
|
756 | - $this->_release_all_reserved_tickets_for_transaction($checkout->transaction); |
|
757 | - } |
|
758 | - |
|
759 | - |
|
760 | - |
|
761 | - /********************************** SESSION_EXPIRED_RESET **********************************/ |
|
762 | - |
|
763 | - |
|
764 | - |
|
765 | - /** |
|
766 | - * session_expired_reset |
|
767 | - * |
|
768 | - * @access public |
|
769 | - * @param EE_Session $session |
|
770 | - * @return void |
|
771 | - */ |
|
772 | - public static function session_expired_reset(EE_Session $session) |
|
773 | - { |
|
774 | - } |
|
775 | - |
|
776 | - |
|
777 | - |
|
778 | - /********************************** PROCESS_ABANDONED_TRANSACTIONS **********************************/ |
|
779 | - |
|
780 | - |
|
781 | - |
|
782 | - /** |
|
783 | - * process_abandoned_transactions |
|
784 | - * releases reserved tickets for all registrations of an ABANDONED EE_Transaction |
|
785 | - * by default, will NOT release tickets for free transactions, or any that have received a payment |
|
786 | - * |
|
787 | - * @access public |
|
788 | - * @param EE_Transaction $transaction |
|
789 | - * @return void |
|
790 | - * @throws EE_Error |
|
791 | - */ |
|
792 | - public static function process_abandoned_transactions(EE_Transaction $transaction) |
|
793 | - { |
|
794 | - // is this TXN free or has any money been paid towards this TXN? If so, then leave it alone |
|
795 | - if ($transaction->is_free() || $transaction->paid() > 0) { |
|
796 | - if (self::debug) { |
|
797 | - // DEBUG LOG |
|
798 | - EEH_Debug_Tools::log( |
|
799 | - __CLASS__, __FUNCTION__, __LINE__, |
|
800 | - array($transaction), |
|
801 | - false, 'EE_Transaction: ' . $transaction->ID() |
|
802 | - ); |
|
803 | - } |
|
804 | - return; |
|
805 | - } |
|
806 | - // have their been any successful payments made ? |
|
807 | - $payments = $transaction->payments(); |
|
808 | - foreach ($payments as $payment) { |
|
809 | - if ($payment instanceof EE_Payment && $payment->status() === EEM_Payment::status_id_approved) { |
|
810 | - if (self::debug) { |
|
811 | - // DEBUG LOG |
|
812 | - EEH_Debug_Tools::log( |
|
813 | - __CLASS__, __FUNCTION__, __LINE__, |
|
814 | - array($payment), |
|
815 | - false, 'EE_Transaction: ' . $transaction->ID() |
|
816 | - ); |
|
817 | - } |
|
818 | - return; |
|
819 | - } |
|
820 | - } |
|
821 | - // since you haven't even attempted to pay for your ticket... |
|
822 | - EED_Ticket_Sales_Monitor::instance()->_release_all_reserved_tickets_for_transaction($transaction); |
|
823 | - } |
|
824 | - |
|
825 | - |
|
826 | - |
|
827 | - /********************************** PROCESS_FAILED_TRANSACTIONS **********************************/ |
|
828 | - |
|
829 | - |
|
830 | - |
|
831 | - /** |
|
832 | - * process_abandoned_transactions |
|
833 | - * releases reserved tickets for absolutely ALL registrations of a FAILED EE_Transaction |
|
834 | - * |
|
835 | - * @access public |
|
836 | - * @param EE_Transaction $transaction |
|
837 | - * @return void |
|
838 | - * @throws EE_Error |
|
839 | - */ |
|
840 | - public static function process_failed_transactions(EE_Transaction $transaction) |
|
841 | - { |
|
842 | - // since you haven't even attempted to pay for your ticket... |
|
843 | - EED_Ticket_Sales_Monitor::instance()->_release_all_reserved_tickets_for_transaction($transaction); |
|
844 | - } |
|
845 | - |
|
846 | - |
|
847 | - |
|
848 | - /********************************** RESET RESERVATION COUNTS *********************************/ |
|
849 | - |
|
850 | - |
|
851 | - |
|
852 | - /** |
|
853 | - * Resets all ticket and datetime reserved counts to zero |
|
854 | - * Tickets that are currently associated with a Transaction that is in progress |
|
855 | - * |
|
856 | - * @throws \EE_Error |
|
857 | - * @throws \DomainException |
|
858 | - */ |
|
859 | - public static function reset_reservation_counts() |
|
860 | - { |
|
861 | - /** @var EE_Line_Item[] $valid_reserved_tickets */ |
|
862 | - $valid_reserved_tickets = array(); |
|
863 | - $transactions_in_progress = EEM_Transaction::instance()->get_transactions_in_progress(); |
|
864 | - foreach ($transactions_in_progress as $transaction_in_progress) { |
|
865 | - // if this TXN has been fully completed, then skip it |
|
866 | - if ($transaction_in_progress->reg_step_completed('finalize_registration')) { |
|
867 | - continue; |
|
868 | - } |
|
869 | - /** @var EE_Transaction $transaction_in_progress */ |
|
870 | - $total_line_item = $transaction_in_progress->total_line_item(); |
|
871 | - // $transaction_in_progress->line |
|
872 | - if (! $total_line_item instanceof EE_Line_Item) { |
|
873 | - throw new DomainException( |
|
874 | - esc_html__('Transaction does not have a valid Total Line Item associated with it.', 'event_espresso') |
|
875 | - ); |
|
876 | - } |
|
877 | - $valid_reserved_tickets += EED_Ticket_Sales_Monitor::get_ticket_line_items_for_grand_total( |
|
878 | - $total_line_item |
|
879 | - ); |
|
880 | - } |
|
881 | - $total_line_items = EEM_Line_Item::instance()->get_total_line_items_for_active_carts(); |
|
882 | - foreach ($total_line_items as $total_line_item) { |
|
883 | - $valid_reserved_tickets += EED_Ticket_Sales_Monitor::get_ticket_line_items_for_grand_total( |
|
884 | - $total_line_item |
|
885 | - ); |
|
886 | - } |
|
887 | - return EED_Ticket_Sales_Monitor::release_reservations_for_tickets( |
|
888 | - EEM_Ticket::instance()->get_tickets_with_reservations(), |
|
889 | - $valid_reserved_tickets |
|
890 | - ); |
|
891 | - } |
|
892 | - |
|
893 | - |
|
894 | - |
|
895 | - /** |
|
896 | - * @param EE_Line_Item $total_line_item |
|
897 | - * @return EE_Line_Item[] |
|
898 | - */ |
|
899 | - private static function get_ticket_line_items_for_grand_total(EE_Line_Item $total_line_item) |
|
900 | - { |
|
901 | - /** @var EE_Line_Item[] $valid_reserved_tickets */ |
|
902 | - $valid_reserved_tickets = array(); |
|
903 | - $ticket_line_items = EEH_Line_Item::get_ticket_line_items($total_line_item); |
|
904 | - foreach ($ticket_line_items as $ticket_line_item) { |
|
905 | - if ($ticket_line_item instanceof EE_Line_Item) { |
|
906 | - $valid_reserved_tickets[] = $ticket_line_item; |
|
907 | - } |
|
908 | - } |
|
909 | - return $valid_reserved_tickets; |
|
910 | - } |
|
911 | - |
|
912 | - |
|
913 | - |
|
914 | - /** |
|
915 | - * @param EE_Ticket[] $tickets_with_reservations |
|
916 | - * @param EE_Line_Item[] $valid_reserved_ticket_line_items |
|
917 | - * @return int |
|
918 | - * @throws \EE_Error |
|
919 | - */ |
|
920 | - private static function release_reservations_for_tickets( |
|
921 | - array $tickets_with_reservations, |
|
922 | - $valid_reserved_ticket_line_items = array() |
|
923 | - ) { |
|
924 | - $total_tickets_released = 0; |
|
925 | - foreach ($tickets_with_reservations as $ticket_with_reservations) { |
|
926 | - if (! $ticket_with_reservations instanceof EE_Ticket) { |
|
927 | - continue; |
|
928 | - } |
|
929 | - $reserved_qty = $ticket_with_reservations->reserved(); |
|
930 | - foreach ($valid_reserved_ticket_line_items as $valid_reserved_ticket_line_item) { |
|
931 | - if ( |
|
932 | - $valid_reserved_ticket_line_item instanceof EE_Line_Item |
|
933 | - && $valid_reserved_ticket_line_item->OBJ_ID() === $ticket_with_reservations->ID() |
|
934 | - ) { |
|
935 | - $reserved_qty -= $valid_reserved_ticket_line_item->quantity(); |
|
936 | - } |
|
937 | - } |
|
938 | - if ($reserved_qty > 0) { |
|
939 | - $ticket_with_reservations->decrease_reserved($reserved_qty); |
|
940 | - $ticket_with_reservations->save(); |
|
941 | - $total_tickets_released += $reserved_qty; |
|
942 | - } |
|
943 | - } |
|
944 | - return $total_tickets_released; |
|
945 | - } |
|
946 | - |
|
947 | - |
|
948 | - |
|
949 | - /********************************** SHUTDOWN **********************************/ |
|
950 | - |
|
951 | - |
|
952 | - |
|
953 | - /** |
|
954 | - * @return false|int |
|
955 | - * @throws \EE_Error |
|
956 | - */ |
|
957 | - public static function clear_expired_line_items_with_no_transaction() |
|
958 | - { |
|
959 | - /** @type WPDB $wpdb */ |
|
960 | - global $wpdb; |
|
961 | - return $wpdb->query( |
|
962 | - $wpdb->prepare( |
|
963 | - 'DELETE FROM ' . EEM_Line_Item::instance()->table() . ' |
|
24 | + const debug = false; // true false |
|
25 | + |
|
26 | + /** |
|
27 | + * an array of raw ticket data from EED_Ticket_Selector |
|
28 | + * |
|
29 | + * @var array $ticket_selections |
|
30 | + */ |
|
31 | + protected $ticket_selections = array(); |
|
32 | + |
|
33 | + /** |
|
34 | + * the raw ticket data from EED_Ticket_Selector is organized in rows |
|
35 | + * according to how they are displayed in the actual Ticket_Selector |
|
36 | + * this tracks the current row being processed |
|
37 | + * |
|
38 | + * @var int $current_row |
|
39 | + */ |
|
40 | + protected $current_row = 0; |
|
41 | + |
|
42 | + /** |
|
43 | + * an array for tracking names of tickets that have sold out |
|
44 | + * |
|
45 | + * @var array $sold_out_tickets |
|
46 | + */ |
|
47 | + protected $sold_out_tickets = array(); |
|
48 | + |
|
49 | + /** |
|
50 | + * an array for tracking names of tickets that have had their quantities reduced |
|
51 | + * |
|
52 | + * @var array $decremented_tickets |
|
53 | + */ |
|
54 | + protected $decremented_tickets = array(); |
|
55 | + |
|
56 | + |
|
57 | + |
|
58 | + /** |
|
59 | + * set_hooks - for hooking into EE Core, other modules, etc |
|
60 | + * |
|
61 | + * @access public |
|
62 | + * @return void |
|
63 | + */ |
|
64 | + public static function set_hooks() |
|
65 | + { |
|
66 | + // release tickets for expired carts |
|
67 | + add_action('EED_Ticket_Selector__process_ticket_selections__before', |
|
68 | + array('EED_Ticket_Sales_Monitor', 'release_tickets_for_expired_carts'), |
|
69 | + 1 |
|
70 | + ); |
|
71 | + // check ticket reserves AFTER MER does it's check (hence priority 20) |
|
72 | + add_filter('FHEE__EE_Ticket_Selector___add_ticket_to_cart__ticket_qty', |
|
73 | + array('EED_Ticket_Sales_Monitor', 'validate_ticket_sale'), |
|
74 | + 20, 3 |
|
75 | + ); |
|
76 | + // add notices for sold out tickets |
|
77 | + add_action('AHEE__EE_Ticket_Selector__process_ticket_selections__after_tickets_added_to_cart', |
|
78 | + array('EED_Ticket_Sales_Monitor', 'post_notices'), |
|
79 | + 10 |
|
80 | + ); |
|
81 | + // handle ticket quantities adjusted in cart |
|
82 | + //add_action( |
|
83 | + // 'FHEE__EED_Multi_Event_Registration__adjust_line_item_quantity__line_item_quantity_updated', |
|
84 | + // array( 'EED_Ticket_Sales_Monitor', 'ticket_quantity_updated' ), |
|
85 | + // 10, 2 |
|
86 | + //); |
|
87 | + // handle tickets deleted from cart |
|
88 | + add_action( |
|
89 | + 'FHEE__EED_Multi_Event_Registration__delete_ticket__ticket_removed_from_cart', |
|
90 | + array('EED_Ticket_Sales_Monitor', 'ticket_removed_from_cart'), |
|
91 | + 10, 2 |
|
92 | + ); |
|
93 | + // handle emptied carts |
|
94 | + add_action( |
|
95 | + 'AHEE__EE_Session__reset_cart__before_reset', |
|
96 | + array('EED_Ticket_Sales_Monitor', 'session_cart_reset'), |
|
97 | + 10, 1 |
|
98 | + ); |
|
99 | + add_action( |
|
100 | + 'AHEE__EED_Multi_Event_Registration__empty_event_cart__before_delete_cart', |
|
101 | + array('EED_Ticket_Sales_Monitor', 'session_cart_reset'), |
|
102 | + 10, 1 |
|
103 | + ); |
|
104 | + // handle cancelled registrations |
|
105 | + add_action( |
|
106 | + 'AHEE__EE_Session__reset_checkout__before_reset', |
|
107 | + array('EED_Ticket_Sales_Monitor', 'session_checkout_reset'), |
|
108 | + 10, 1 |
|
109 | + ); |
|
110 | + // cron tasks |
|
111 | + add_action( |
|
112 | + 'AHEE__EE_Cron_Tasks__finalize_abandoned_transactions__abandoned_transaction', |
|
113 | + array('EED_Ticket_Sales_Monitor', 'process_abandoned_transactions'), |
|
114 | + 10, 1 |
|
115 | + ); |
|
116 | + add_action( |
|
117 | + 'AHEE__EE_Cron_Tasks__process_expired_transactions__incomplete_transaction', |
|
118 | + array('EED_Ticket_Sales_Monitor', 'process_abandoned_transactions'), |
|
119 | + 10, 1 |
|
120 | + ); |
|
121 | + add_action( |
|
122 | + 'AHEE__EE_Cron_Tasks__process_expired_transactions__failed_transaction', |
|
123 | + array('EED_Ticket_Sales_Monitor', 'process_failed_transactions'), |
|
124 | + 10, 1 |
|
125 | + ); |
|
126 | + } |
|
127 | + |
|
128 | + |
|
129 | + |
|
130 | + /** |
|
131 | + * set_hooks_admin - for hooking into EE Admin Core, other modules, etc |
|
132 | + * |
|
133 | + * @access public |
|
134 | + * @return void |
|
135 | + */ |
|
136 | + public static function set_hooks_admin() |
|
137 | + { |
|
138 | + EED_Ticket_Sales_Monitor::set_hooks(); |
|
139 | + } |
|
140 | + |
|
141 | + |
|
142 | + |
|
143 | + /** |
|
144 | + * @return EED_Ticket_Sales_Monitor|EED_Module |
|
145 | + */ |
|
146 | + public static function instance() |
|
147 | + { |
|
148 | + return parent::get_instance(__CLASS__); |
|
149 | + } |
|
150 | + |
|
151 | + |
|
152 | + |
|
153 | + /** |
|
154 | + * run |
|
155 | + * |
|
156 | + * @access public |
|
157 | + * @param WP_Query $WP_Query |
|
158 | + * @return void |
|
159 | + */ |
|
160 | + public function run($WP_Query) |
|
161 | + { |
|
162 | + } |
|
163 | + |
|
164 | + |
|
165 | + |
|
166 | + /********************************** PRE_TICKET_SALES **********************************/ |
|
167 | + |
|
168 | + |
|
169 | + |
|
170 | + /** |
|
171 | + * Retrieves grand totals from the line items that have no TXN ID |
|
172 | + * and timestamps less than the current time minus the session lifespan. |
|
173 | + * These are carts that have been abandoned before the "registrant" even attempted to checkout. |
|
174 | + * We're going to release the tickets for these line items before attempting to add more to the cart. |
|
175 | + * |
|
176 | + * @return void |
|
177 | + * @throws \EE_Error |
|
178 | + */ |
|
179 | + public static function release_tickets_for_expired_carts() |
|
180 | + { |
|
181 | + $expired_ticket_IDs = array(); |
|
182 | + $valid_ticket_line_items = array(); |
|
183 | + $total_line_items = EEM_Line_Item::instance()->get_total_line_items_with_no_transaction(); |
|
184 | + if(empty($total_line_items)){ |
|
185 | + return; |
|
186 | + } |
|
187 | + $expired = current_time('timestamp') - EE_Registry::instance()->SSN->lifespan(); |
|
188 | + foreach ($total_line_items as $total_line_item) { |
|
189 | + /** @var EE_Line_Item $total_line_item */ |
|
190 | + $ticket_line_items = EED_Ticket_Sales_Monitor::get_ticket_line_items_for_grand_total($total_line_item); |
|
191 | + foreach ($ticket_line_items as $ticket_line_item) { |
|
192 | + if(! $ticket_line_item instanceof EE_Line_Item) { |
|
193 | + continue; |
|
194 | + } |
|
195 | + if ($total_line_item->timestamp(true) <= $expired ) { |
|
196 | + $expired_ticket_IDs[$ticket_line_item->OBJ_ID()] = $ticket_line_item->OBJ_ID(); |
|
197 | + } else { |
|
198 | + $valid_ticket_line_items[$ticket_line_item->OBJ_ID()] = $ticket_line_item; |
|
199 | + } |
|
200 | + } |
|
201 | + } |
|
202 | + if (! empty($expired_ticket_IDs)) { |
|
203 | + EED_Ticket_Sales_Monitor::release_reservations_for_tickets( |
|
204 | + \EEM_Ticket::instance()->get_tickets_with_IDs($expired_ticket_IDs), |
|
205 | + $valid_ticket_line_items |
|
206 | + ); |
|
207 | + // let's get rid of expired line items so that they can't interfere with tracking |
|
208 | + add_action( |
|
209 | + 'shutdown', |
|
210 | + array('EED_Ticket_Sales_Monitor', 'clear_expired_line_items_with_no_transaction'), |
|
211 | + 999 |
|
212 | + ); |
|
213 | + } |
|
214 | + } |
|
215 | + |
|
216 | + |
|
217 | + |
|
218 | + /********************************** VALIDATE_TICKET_SALE **********************************/ |
|
219 | + |
|
220 | + |
|
221 | + |
|
222 | + /** |
|
223 | + * validate_ticket_sales |
|
224 | + * callback for 'FHEE__EED_Ticket_Selector__process_ticket_selections__valid_post_data' |
|
225 | + * |
|
226 | + * @access public |
|
227 | + * @param int $qty |
|
228 | + * @param \EE_Ticket $ticket |
|
229 | + * @return bool |
|
230 | + * @throws UnexpectedEntityException |
|
231 | + * @throws EE_Error |
|
232 | + */ |
|
233 | + public static function validate_ticket_sale($qty = 1, EE_Ticket $ticket) |
|
234 | + { |
|
235 | + $qty = absint($qty); |
|
236 | + if ($qty > 0) { |
|
237 | + $qty = EED_Ticket_Sales_Monitor::instance()->_validate_ticket_sale($ticket, $qty); |
|
238 | + } |
|
239 | + if (self::debug) { |
|
240 | + echo '<br /><br /> ' . __LINE__ . ') ' . __METHOD__ . '()'; |
|
241 | + echo '<br /><br /><b> RETURNED QTY: ' . $qty . '</b>'; |
|
242 | + } |
|
243 | + return $qty; |
|
244 | + } |
|
245 | + |
|
246 | + |
|
247 | + |
|
248 | + /** |
|
249 | + * _validate_ticket_sale |
|
250 | + * checks whether an individual ticket is available for purchase based on datetime, and ticket details |
|
251 | + * |
|
252 | + * @access protected |
|
253 | + * @param \EE_Ticket $ticket |
|
254 | + * @param int $qty |
|
255 | + * @return int |
|
256 | + * @throws UnexpectedEntityException |
|
257 | + * @throws EE_Error |
|
258 | + */ |
|
259 | + protected function _validate_ticket_sale(EE_Ticket $ticket, $qty = 1) |
|
260 | + { |
|
261 | + if (self::debug) { |
|
262 | + echo '<br /><br /> ' . __LINE__ . ') ' . __METHOD__ . '() '; |
|
263 | + } |
|
264 | + if ( ! $ticket instanceof EE_Ticket) { |
|
265 | + return 0; |
|
266 | + } |
|
267 | + if (self::debug) { |
|
268 | + echo '<br /><b> . ticket->ID: ' . $ticket->ID() . '</b>'; |
|
269 | + echo '<br /> . original ticket->reserved: ' . $ticket->reserved(); |
|
270 | + } |
|
271 | + $ticket->refresh_from_db(); |
|
272 | + // first let's determine the ticket availability based on sales |
|
273 | + $available = $ticket->qty('saleable'); |
|
274 | + if (self::debug) { |
|
275 | + echo '<br /> . . . ticket->qty: ' . $ticket->qty(); |
|
276 | + echo '<br /> . . . ticket->sold: ' . $ticket->sold(); |
|
277 | + echo '<br /> . . . ticket->reserved: ' . $ticket->reserved(); |
|
278 | + echo '<br /> . . . ticket->qty(saleable): ' . $ticket->qty('saleable'); |
|
279 | + echo '<br /> . . . available: ' . $available; |
|
280 | + } |
|
281 | + if ($available < 1) { |
|
282 | + $this->_ticket_sold_out($ticket); |
|
283 | + return 0; |
|
284 | + } |
|
285 | + if (self::debug) { |
|
286 | + echo '<br /> . . . qty: ' . $qty; |
|
287 | + } |
|
288 | + if ($available < $qty) { |
|
289 | + $qty = $available; |
|
290 | + if (self::debug) { |
|
291 | + echo '<br /> . . . QTY ADJUSTED: ' . $qty; |
|
292 | + } |
|
293 | + $this->_ticket_quantity_decremented($ticket); |
|
294 | + } |
|
295 | + $this->_reserve_ticket($ticket, $qty); |
|
296 | + return $qty; |
|
297 | + } |
|
298 | + |
|
299 | + |
|
300 | + |
|
301 | + /** |
|
302 | + * _reserve_ticket |
|
303 | + * increments ticket reserved based on quantity passed |
|
304 | + * |
|
305 | + * @access protected |
|
306 | + * @param \EE_Ticket $ticket |
|
307 | + * @param int $quantity |
|
308 | + * @return bool |
|
309 | + * @throws EE_Error |
|
310 | + */ |
|
311 | + protected function _reserve_ticket(EE_Ticket $ticket, $quantity = 1) |
|
312 | + { |
|
313 | + if (self::debug) { |
|
314 | + echo '<br /><br /> . . . INCREASE RESERVED: ' . $quantity; |
|
315 | + } |
|
316 | + $ticket->increase_reserved($quantity); |
|
317 | + return $ticket->save(); |
|
318 | + } |
|
319 | + |
|
320 | + |
|
321 | + |
|
322 | + /** |
|
323 | + * _release_reserved_ticket |
|
324 | + * |
|
325 | + * @access protected |
|
326 | + * @param EE_Ticket $ticket |
|
327 | + * @param int $quantity |
|
328 | + * @return bool |
|
329 | + * @throws EE_Error |
|
330 | + */ |
|
331 | + protected function _release_reserved_ticket(EE_Ticket $ticket, $quantity = 1) |
|
332 | + { |
|
333 | + if (self::debug) { |
|
334 | + echo '<br /> . . . ticket->ID: ' . $ticket->ID(); |
|
335 | + echo '<br /> . . . ticket->reserved: ' . $ticket->reserved(); |
|
336 | + } |
|
337 | + $ticket->decrease_reserved($quantity); |
|
338 | + if (self::debug) { |
|
339 | + echo '<br /> . . . ticket->reserved: ' . $ticket->reserved(); |
|
340 | + } |
|
341 | + return $ticket->save() ? 1 : 0; |
|
342 | + } |
|
343 | + |
|
344 | + |
|
345 | + |
|
346 | + /** |
|
347 | + * _ticket_sold_out |
|
348 | + * removes quantities within the ticket selector based on zero ticket availability |
|
349 | + * |
|
350 | + * @access protected |
|
351 | + * @param \EE_Ticket $ticket |
|
352 | + * @return void |
|
353 | + * @throws UnexpectedEntityException |
|
354 | + * @throws EE_Error |
|
355 | + */ |
|
356 | + protected function _ticket_sold_out(EE_Ticket $ticket) |
|
357 | + { |
|
358 | + if (self::debug) { |
|
359 | + echo '<br /><br /> ' . __LINE__ . ') ' . __METHOD__ . '() '; |
|
360 | + echo '<br /> . . ticket->name: ' . $this->_get_ticket_and_event_name($ticket); |
|
361 | + } |
|
362 | + $this->sold_out_tickets[] = $this->_get_ticket_and_event_name($ticket); |
|
363 | + } |
|
364 | + |
|
365 | + |
|
366 | + |
|
367 | + /** |
|
368 | + * _ticket_quantity_decremented |
|
369 | + * adjusts quantities within the ticket selector based on decreased ticket availability |
|
370 | + * |
|
371 | + * @access protected |
|
372 | + * @param \EE_Ticket $ticket |
|
373 | + * @return void |
|
374 | + * @throws UnexpectedEntityException |
|
375 | + * @throws EE_Error |
|
376 | + */ |
|
377 | + protected function _ticket_quantity_decremented(EE_Ticket $ticket) |
|
378 | + { |
|
379 | + if (self::debug) { |
|
380 | + echo '<br /><br /> ' . __LINE__ . ') ' . __METHOD__ . '() '; |
|
381 | + echo '<br /> . . ticket->name: ' . $this->_get_ticket_and_event_name($ticket); |
|
382 | + } |
|
383 | + $this->decremented_tickets[] = $this->_get_ticket_and_event_name($ticket); |
|
384 | + } |
|
385 | + |
|
386 | + |
|
387 | + |
|
388 | + /** |
|
389 | + * _get_ticket_and_event_name |
|
390 | + * builds string out of ticket and event name |
|
391 | + * |
|
392 | + * @access protected |
|
393 | + * @param \EE_Ticket $ticket |
|
394 | + * @return string |
|
395 | + * @throws UnexpectedEntityException |
|
396 | + * @throws EE_Error |
|
397 | + */ |
|
398 | + protected function _get_ticket_and_event_name(EE_Ticket $ticket) |
|
399 | + { |
|
400 | + $event = $ticket->get_related_event(); |
|
401 | + if ($event instanceof EE_Event) { |
|
402 | + $ticket_name = sprintf( |
|
403 | + _x('%1$s for %2$s', 'ticket name for event name', 'event_espresso'), |
|
404 | + $ticket->name(), |
|
405 | + $event->name() |
|
406 | + ); |
|
407 | + } else { |
|
408 | + $ticket_name = $ticket->name(); |
|
409 | + } |
|
410 | + return $ticket_name; |
|
411 | + } |
|
412 | + |
|
413 | + |
|
414 | + |
|
415 | + /********************************** EVENT CART **********************************/ |
|
416 | + |
|
417 | + |
|
418 | + |
|
419 | + /** |
|
420 | + * ticket_quantity_updated |
|
421 | + * releases or reserves ticket(s) based on quantity passed |
|
422 | + * |
|
423 | + * @access public |
|
424 | + * @param EE_Line_Item $line_item |
|
425 | + * @param int $quantity |
|
426 | + * @return void |
|
427 | + * @throws EE_Error |
|
428 | + */ |
|
429 | + public static function ticket_quantity_updated(EE_Line_Item $line_item, $quantity = 1) |
|
430 | + { |
|
431 | + $ticket = EEM_Ticket::instance()->get_one_by_ID(absint($line_item->OBJ_ID())); |
|
432 | + if ($ticket instanceof EE_Ticket) { |
|
433 | + if ($quantity > 0) { |
|
434 | + EED_Ticket_Sales_Monitor::instance()->_reserve_ticket($ticket, $quantity); |
|
435 | + } else { |
|
436 | + EED_Ticket_Sales_Monitor::instance()->_release_reserved_ticket($ticket, $quantity); |
|
437 | + } |
|
438 | + } |
|
439 | + } |
|
440 | + |
|
441 | + |
|
442 | + |
|
443 | + /** |
|
444 | + * ticket_removed_from_cart |
|
445 | + * releases reserved ticket(s) based on quantity passed |
|
446 | + * |
|
447 | + * @access public |
|
448 | + * @param EE_Ticket $ticket |
|
449 | + * @param int $quantity |
|
450 | + * @return void |
|
451 | + * @throws EE_Error |
|
452 | + */ |
|
453 | + public static function ticket_removed_from_cart(EE_Ticket $ticket, $quantity = 1) |
|
454 | + { |
|
455 | + EED_Ticket_Sales_Monitor::instance()->_release_reserved_ticket($ticket, $quantity); |
|
456 | + } |
|
457 | + |
|
458 | + |
|
459 | + |
|
460 | + /********************************** POST_NOTICES **********************************/ |
|
461 | + |
|
462 | + |
|
463 | + |
|
464 | + /** |
|
465 | + * post_notices |
|
466 | + * |
|
467 | + * @access public |
|
468 | + * @return void |
|
469 | + * @throws EE_Error |
|
470 | + */ |
|
471 | + public static function post_notices() |
|
472 | + { |
|
473 | + EED_Ticket_Sales_Monitor::instance()->_post_notices(); |
|
474 | + } |
|
475 | + |
|
476 | + |
|
477 | + |
|
478 | + /** |
|
479 | + * _post_notices |
|
480 | + * |
|
481 | + * @access protected |
|
482 | + * @return void |
|
483 | + * @throws EE_Error |
|
484 | + */ |
|
485 | + protected function _post_notices() |
|
486 | + { |
|
487 | + if (self::debug) { |
|
488 | + echo '<br /><br /> ' . __LINE__ . ') ' . __METHOD__ . '() '; |
|
489 | + } |
|
490 | + $refresh_msg = ''; |
|
491 | + $none_added_msg = ''; |
|
492 | + if (defined('DOING_AJAX') && DOING_AJAX) { |
|
493 | + $refresh_msg = __('Please refresh the page to view updated ticket quantities.', |
|
494 | + 'event_espresso'); |
|
495 | + $none_added_msg = __('No tickets were added for the event.', 'event_espresso'); |
|
496 | + } |
|
497 | + if ( ! empty($this->sold_out_tickets)) { |
|
498 | + EE_Error::add_attention( |
|
499 | + sprintf( |
|
500 | + apply_filters( |
|
501 | + 'FHEE__EED_Ticket_Sales_Monitor___post_notices__sold_out_tickets_notice', |
|
502 | + __('We\'re sorry...%1$sThe following items have sold out since you first viewed this page, and can no longer be registered for:%1$s%1$s%2$s%1$s%1$sPlease note that availability can change at any time due to cancellations, so please check back again later if registration for this event(s) is important to you.%1$s%1$s%3$s%1$s%4$s%1$s', |
|
503 | + 'event_espresso') |
|
504 | + ), |
|
505 | + '<br />', |
|
506 | + implode('<br />', $this->sold_out_tickets), |
|
507 | + $none_added_msg, |
|
508 | + $refresh_msg |
|
509 | + ) |
|
510 | + ); |
|
511 | + // alter code flow in the Ticket Selector for better UX |
|
512 | + add_filter('FHEE__EED_Ticket_Selector__process_ticket_selections__tckts_slctd', '__return_true'); |
|
513 | + add_filter('FHEE__EED_Ticket_Selector__process_ticket_selections__success', '__return_false'); |
|
514 | + $this->sold_out_tickets = array(); |
|
515 | + // and reset the cart |
|
516 | + EED_Ticket_Sales_Monitor::session_cart_reset(EE_Registry::instance()->SSN); |
|
517 | + } |
|
518 | + if ( ! empty($this->decremented_tickets)) { |
|
519 | + EE_Error::add_attention( |
|
520 | + sprintf( |
|
521 | + apply_filters( |
|
522 | + 'FHEE__EED_Ticket_Sales_Monitor___ticket_quantity_decremented__notice', |
|
523 | + __('We\'re sorry...%1$sDue to sales that have occurred since you first viewed the last page, the following items have had their quantities adjusted to match the current available amount:%1$s%1$s%2$s%1$s%1$sPlease note that availability can change at any time due to cancellations, so please check back again later if registration for this event(s) is important to you.%1$s%1$s%3$s%1$s%4$s%1$s', |
|
524 | + 'event_espresso') |
|
525 | + ), |
|
526 | + '<br />', |
|
527 | + implode('<br />', $this->decremented_tickets), |
|
528 | + $none_added_msg, |
|
529 | + $refresh_msg |
|
530 | + ) |
|
531 | + ); |
|
532 | + $this->decremented_tickets = array(); |
|
533 | + } |
|
534 | + } |
|
535 | + |
|
536 | + |
|
537 | + |
|
538 | + /********************************** RELEASE_ALL_RESERVED_TICKETS_FOR_TRANSACTION **********************************/ |
|
539 | + |
|
540 | + |
|
541 | + |
|
542 | + /** |
|
543 | + * _release_all_reserved_tickets_for_transaction |
|
544 | + * releases reserved tickets for all registrations of an EE_Transaction |
|
545 | + * by default, will NOT release tickets for finalized transactions |
|
546 | + * |
|
547 | + * @access protected |
|
548 | + * @param EE_Transaction $transaction |
|
549 | + * @return int |
|
550 | + * @throws EE_Error |
|
551 | + */ |
|
552 | + protected function _release_all_reserved_tickets_for_transaction(EE_Transaction $transaction) |
|
553 | + { |
|
554 | + if (self::debug) { |
|
555 | + echo '<br /><br /> ' . __LINE__ . ') ' . __METHOD__ . '() '; |
|
556 | + echo '<br /> . transaction->ID: ' . $transaction->ID(); |
|
557 | + } |
|
558 | + // check if 'finalize_registration' step has been completed... |
|
559 | + $finalized = $transaction->reg_step_completed('finalize_registration'); |
|
560 | + if (self::debug) { |
|
561 | + // DEBUG LOG |
|
562 | + EEH_Debug_Tools::log( |
|
563 | + __CLASS__, __FUNCTION__, __LINE__, |
|
564 | + array('finalized' => $finalized), |
|
565 | + false, 'EE_Transaction: ' . $transaction->ID() |
|
566 | + ); |
|
567 | + } |
|
568 | + // how many tickets were released |
|
569 | + $count = 0; |
|
570 | + if (self::debug) { |
|
571 | + echo '<br /> . . . finalized: ' . $finalized; |
|
572 | + } |
|
573 | + $release_tickets_with_TXN_status = array( |
|
574 | + EEM_Transaction::failed_status_code, |
|
575 | + EEM_Transaction::abandoned_status_code, |
|
576 | + EEM_Transaction::incomplete_status_code, |
|
577 | + ); |
|
578 | + // if the session is getting cleared BEFORE the TXN has been finalized |
|
579 | + if ( ! $finalized || in_array($transaction->status_ID(), $release_tickets_with_TXN_status, true)) { |
|
580 | + // let's cancel any reserved tickets |
|
581 | + $registrations = $transaction->registrations(); |
|
582 | + if ( ! empty($registrations)) { |
|
583 | + foreach ($registrations as $registration) { |
|
584 | + if ($registration instanceof EE_Registration) { |
|
585 | + $count += $this->_release_reserved_ticket_for_registration($registration, $transaction); |
|
586 | + } |
|
587 | + } |
|
588 | + } |
|
589 | + } |
|
590 | + return $count; |
|
591 | + } |
|
592 | + |
|
593 | + |
|
594 | + |
|
595 | + /** |
|
596 | + * _release_reserved_ticket_for_registration |
|
597 | + * releases reserved tickets for an EE_Registration |
|
598 | + * by default, will NOT release tickets for APPROVED registrations |
|
599 | + * |
|
600 | + * @access protected |
|
601 | + * @param EE_Registration $registration |
|
602 | + * @param EE_Transaction $transaction |
|
603 | + * @return int |
|
604 | + * @throws EE_Error |
|
605 | + */ |
|
606 | + protected function _release_reserved_ticket_for_registration( |
|
607 | + EE_Registration $registration, |
|
608 | + EE_Transaction $transaction |
|
609 | + ) { |
|
610 | + $STS_ID = $transaction->status_ID(); |
|
611 | + if (self::debug) { |
|
612 | + echo '<br /><br /> ' . __LINE__ . ') ' . __METHOD__ . '() '; |
|
613 | + echo '<br /> . . registration->ID: ' . $registration->ID(); |
|
614 | + echo '<br /> . . registration->status_ID: ' . $registration->status_ID(); |
|
615 | + echo '<br /> . . transaction->status_ID(): ' . $STS_ID; |
|
616 | + } |
|
617 | + if ( |
|
618 | + // release Tickets for Failed Transactions and Abandoned Transactions |
|
619 | + $STS_ID === EEM_Transaction::failed_status_code |
|
620 | + || $STS_ID === EEM_Transaction::abandoned_status_code |
|
621 | + || ( |
|
622 | + // also release Tickets for Incomplete Transactions, but ONLY if the Registrations are NOT Approved |
|
623 | + $STS_ID === EEM_Transaction::incomplete_status_code |
|
624 | + && $registration->status_ID() !== EEM_Registration::status_id_approved |
|
625 | + ) |
|
626 | + ) { |
|
627 | + $ticket = $registration->ticket(); |
|
628 | + if ($ticket instanceof EE_Ticket) { |
|
629 | + return $this->_release_reserved_ticket($ticket); |
|
630 | + } |
|
631 | + } |
|
632 | + return 0; |
|
633 | + } |
|
634 | + |
|
635 | + |
|
636 | + |
|
637 | + /********************************** SESSION_CART_RESET **********************************/ |
|
638 | + |
|
639 | + |
|
640 | + |
|
641 | + /** |
|
642 | + * session_cart_reset |
|
643 | + * callback hooked into 'AHEE__EE_Session__reset_cart__before_reset' |
|
644 | + * |
|
645 | + * @access public |
|
646 | + * @param EE_Session $session |
|
647 | + * @return void |
|
648 | + * @throws EE_Error |
|
649 | + */ |
|
650 | + public static function session_cart_reset(EE_Session $session) |
|
651 | + { |
|
652 | + if (self::debug) { |
|
653 | + echo '<br /><br /> ' . __LINE__ . ') ' . __METHOD__ . '() '; |
|
654 | + } |
|
655 | + $cart = $session->cart(); |
|
656 | + if ($cart instanceof EE_Cart) { |
|
657 | + if (self::debug) { |
|
658 | + echo '<br /><br /> cart instance of EE_Cart: '; |
|
659 | + } |
|
660 | + EED_Ticket_Sales_Monitor::instance()->_session_cart_reset($cart); |
|
661 | + } else { |
|
662 | + if (self::debug) { |
|
663 | + echo '<br /><br /> invalid EE_Cart: '; |
|
664 | + var_dump($cart); |
|
665 | + } |
|
666 | + } |
|
667 | + } |
|
668 | + |
|
669 | + |
|
670 | + |
|
671 | + /** |
|
672 | + * _session_cart_reset |
|
673 | + * releases reserved tickets in the EE_Cart |
|
674 | + * |
|
675 | + * @access protected |
|
676 | + * @param EE_Cart $cart |
|
677 | + * @return void |
|
678 | + * @throws EE_Error |
|
679 | + */ |
|
680 | + protected function _session_cart_reset(EE_Cart $cart) |
|
681 | + { |
|
682 | + if (self::debug) { |
|
683 | + echo '<br /><br /> ' . __LINE__ . ') ' . __METHOD__ . '() '; |
|
684 | + } |
|
685 | + EE_Registry::instance()->load_helper('Line_Item'); |
|
686 | + $ticket_line_items = $cart->get_tickets(); |
|
687 | + if (empty($ticket_line_items)) { |
|
688 | + return; |
|
689 | + } |
|
690 | + foreach ($ticket_line_items as $ticket_line_item) { |
|
691 | + if (self::debug) { |
|
692 | + echo '<br /> . ticket_line_item->ID(): ' . $ticket_line_item->ID(); |
|
693 | + } |
|
694 | + if ($ticket_line_item instanceof EE_Line_Item && $ticket_line_item->OBJ_type() === 'Ticket') { |
|
695 | + if (self::debug) { |
|
696 | + echo '<br /> . . ticket_line_item->OBJ_ID(): ' . $ticket_line_item->OBJ_ID(); |
|
697 | + } |
|
698 | + $ticket = EEM_Ticket::instance()->get_one_by_ID($ticket_line_item->OBJ_ID()); |
|
699 | + if ($ticket instanceof EE_Ticket) { |
|
700 | + if (self::debug) { |
|
701 | + echo '<br /> . . ticket->ID(): ' . $ticket->ID(); |
|
702 | + echo '<br /> . . ticket_line_item->quantity(): ' . $ticket_line_item->quantity(); |
|
703 | + } |
|
704 | + $this->_release_reserved_ticket($ticket, $ticket_line_item->quantity()); |
|
705 | + } |
|
706 | + } |
|
707 | + } |
|
708 | + if (self::debug) { |
|
709 | + echo '<br /><br /> RESET COMPLETED '; |
|
710 | + } |
|
711 | + } |
|
712 | + |
|
713 | + |
|
714 | + |
|
715 | + /********************************** SESSION_CHECKOUT_RESET **********************************/ |
|
716 | + |
|
717 | + |
|
718 | + |
|
719 | + /** |
|
720 | + * session_checkout_reset |
|
721 | + * callback hooked into 'AHEE__EE_Session__reset_checkout__before_reset' |
|
722 | + * |
|
723 | + * @access public |
|
724 | + * @param EE_Session $session |
|
725 | + * @return void |
|
726 | + * @throws EE_Error |
|
727 | + */ |
|
728 | + public static function session_checkout_reset(EE_Session $session) |
|
729 | + { |
|
730 | + $checkout = $session->checkout(); |
|
731 | + if ($checkout instanceof EE_Checkout) { |
|
732 | + EED_Ticket_Sales_Monitor::instance()->_session_checkout_reset($checkout); |
|
733 | + } |
|
734 | + } |
|
735 | + |
|
736 | + |
|
737 | + |
|
738 | + /** |
|
739 | + * _session_checkout_reset |
|
740 | + * releases reserved tickets for the EE_Checkout->transaction |
|
741 | + * |
|
742 | + * @access protected |
|
743 | + * @param EE_Checkout $checkout |
|
744 | + * @return void |
|
745 | + * @throws EE_Error |
|
746 | + */ |
|
747 | + protected function _session_checkout_reset(EE_Checkout $checkout) |
|
748 | + { |
|
749 | + if (self::debug) { |
|
750 | + echo '<br /><br /> ' . __LINE__ . ') ' . __METHOD__ . '() '; |
|
751 | + } |
|
752 | + // we want to release the each registration's reserved tickets if the session was cleared, but not if this is a revisit |
|
753 | + if ($checkout->revisit || ! $checkout->transaction instanceof EE_Transaction) { |
|
754 | + return; |
|
755 | + } |
|
756 | + $this->_release_all_reserved_tickets_for_transaction($checkout->transaction); |
|
757 | + } |
|
758 | + |
|
759 | + |
|
760 | + |
|
761 | + /********************************** SESSION_EXPIRED_RESET **********************************/ |
|
762 | + |
|
763 | + |
|
764 | + |
|
765 | + /** |
|
766 | + * session_expired_reset |
|
767 | + * |
|
768 | + * @access public |
|
769 | + * @param EE_Session $session |
|
770 | + * @return void |
|
771 | + */ |
|
772 | + public static function session_expired_reset(EE_Session $session) |
|
773 | + { |
|
774 | + } |
|
775 | + |
|
776 | + |
|
777 | + |
|
778 | + /********************************** PROCESS_ABANDONED_TRANSACTIONS **********************************/ |
|
779 | + |
|
780 | + |
|
781 | + |
|
782 | + /** |
|
783 | + * process_abandoned_transactions |
|
784 | + * releases reserved tickets for all registrations of an ABANDONED EE_Transaction |
|
785 | + * by default, will NOT release tickets for free transactions, or any that have received a payment |
|
786 | + * |
|
787 | + * @access public |
|
788 | + * @param EE_Transaction $transaction |
|
789 | + * @return void |
|
790 | + * @throws EE_Error |
|
791 | + */ |
|
792 | + public static function process_abandoned_transactions(EE_Transaction $transaction) |
|
793 | + { |
|
794 | + // is this TXN free or has any money been paid towards this TXN? If so, then leave it alone |
|
795 | + if ($transaction->is_free() || $transaction->paid() > 0) { |
|
796 | + if (self::debug) { |
|
797 | + // DEBUG LOG |
|
798 | + EEH_Debug_Tools::log( |
|
799 | + __CLASS__, __FUNCTION__, __LINE__, |
|
800 | + array($transaction), |
|
801 | + false, 'EE_Transaction: ' . $transaction->ID() |
|
802 | + ); |
|
803 | + } |
|
804 | + return; |
|
805 | + } |
|
806 | + // have their been any successful payments made ? |
|
807 | + $payments = $transaction->payments(); |
|
808 | + foreach ($payments as $payment) { |
|
809 | + if ($payment instanceof EE_Payment && $payment->status() === EEM_Payment::status_id_approved) { |
|
810 | + if (self::debug) { |
|
811 | + // DEBUG LOG |
|
812 | + EEH_Debug_Tools::log( |
|
813 | + __CLASS__, __FUNCTION__, __LINE__, |
|
814 | + array($payment), |
|
815 | + false, 'EE_Transaction: ' . $transaction->ID() |
|
816 | + ); |
|
817 | + } |
|
818 | + return; |
|
819 | + } |
|
820 | + } |
|
821 | + // since you haven't even attempted to pay for your ticket... |
|
822 | + EED_Ticket_Sales_Monitor::instance()->_release_all_reserved_tickets_for_transaction($transaction); |
|
823 | + } |
|
824 | + |
|
825 | + |
|
826 | + |
|
827 | + /********************************** PROCESS_FAILED_TRANSACTIONS **********************************/ |
|
828 | + |
|
829 | + |
|
830 | + |
|
831 | + /** |
|
832 | + * process_abandoned_transactions |
|
833 | + * releases reserved tickets for absolutely ALL registrations of a FAILED EE_Transaction |
|
834 | + * |
|
835 | + * @access public |
|
836 | + * @param EE_Transaction $transaction |
|
837 | + * @return void |
|
838 | + * @throws EE_Error |
|
839 | + */ |
|
840 | + public static function process_failed_transactions(EE_Transaction $transaction) |
|
841 | + { |
|
842 | + // since you haven't even attempted to pay for your ticket... |
|
843 | + EED_Ticket_Sales_Monitor::instance()->_release_all_reserved_tickets_for_transaction($transaction); |
|
844 | + } |
|
845 | + |
|
846 | + |
|
847 | + |
|
848 | + /********************************** RESET RESERVATION COUNTS *********************************/ |
|
849 | + |
|
850 | + |
|
851 | + |
|
852 | + /** |
|
853 | + * Resets all ticket and datetime reserved counts to zero |
|
854 | + * Tickets that are currently associated with a Transaction that is in progress |
|
855 | + * |
|
856 | + * @throws \EE_Error |
|
857 | + * @throws \DomainException |
|
858 | + */ |
|
859 | + public static function reset_reservation_counts() |
|
860 | + { |
|
861 | + /** @var EE_Line_Item[] $valid_reserved_tickets */ |
|
862 | + $valid_reserved_tickets = array(); |
|
863 | + $transactions_in_progress = EEM_Transaction::instance()->get_transactions_in_progress(); |
|
864 | + foreach ($transactions_in_progress as $transaction_in_progress) { |
|
865 | + // if this TXN has been fully completed, then skip it |
|
866 | + if ($transaction_in_progress->reg_step_completed('finalize_registration')) { |
|
867 | + continue; |
|
868 | + } |
|
869 | + /** @var EE_Transaction $transaction_in_progress */ |
|
870 | + $total_line_item = $transaction_in_progress->total_line_item(); |
|
871 | + // $transaction_in_progress->line |
|
872 | + if (! $total_line_item instanceof EE_Line_Item) { |
|
873 | + throw new DomainException( |
|
874 | + esc_html__('Transaction does not have a valid Total Line Item associated with it.', 'event_espresso') |
|
875 | + ); |
|
876 | + } |
|
877 | + $valid_reserved_tickets += EED_Ticket_Sales_Monitor::get_ticket_line_items_for_grand_total( |
|
878 | + $total_line_item |
|
879 | + ); |
|
880 | + } |
|
881 | + $total_line_items = EEM_Line_Item::instance()->get_total_line_items_for_active_carts(); |
|
882 | + foreach ($total_line_items as $total_line_item) { |
|
883 | + $valid_reserved_tickets += EED_Ticket_Sales_Monitor::get_ticket_line_items_for_grand_total( |
|
884 | + $total_line_item |
|
885 | + ); |
|
886 | + } |
|
887 | + return EED_Ticket_Sales_Monitor::release_reservations_for_tickets( |
|
888 | + EEM_Ticket::instance()->get_tickets_with_reservations(), |
|
889 | + $valid_reserved_tickets |
|
890 | + ); |
|
891 | + } |
|
892 | + |
|
893 | + |
|
894 | + |
|
895 | + /** |
|
896 | + * @param EE_Line_Item $total_line_item |
|
897 | + * @return EE_Line_Item[] |
|
898 | + */ |
|
899 | + private static function get_ticket_line_items_for_grand_total(EE_Line_Item $total_line_item) |
|
900 | + { |
|
901 | + /** @var EE_Line_Item[] $valid_reserved_tickets */ |
|
902 | + $valid_reserved_tickets = array(); |
|
903 | + $ticket_line_items = EEH_Line_Item::get_ticket_line_items($total_line_item); |
|
904 | + foreach ($ticket_line_items as $ticket_line_item) { |
|
905 | + if ($ticket_line_item instanceof EE_Line_Item) { |
|
906 | + $valid_reserved_tickets[] = $ticket_line_item; |
|
907 | + } |
|
908 | + } |
|
909 | + return $valid_reserved_tickets; |
|
910 | + } |
|
911 | + |
|
912 | + |
|
913 | + |
|
914 | + /** |
|
915 | + * @param EE_Ticket[] $tickets_with_reservations |
|
916 | + * @param EE_Line_Item[] $valid_reserved_ticket_line_items |
|
917 | + * @return int |
|
918 | + * @throws \EE_Error |
|
919 | + */ |
|
920 | + private static function release_reservations_for_tickets( |
|
921 | + array $tickets_with_reservations, |
|
922 | + $valid_reserved_ticket_line_items = array() |
|
923 | + ) { |
|
924 | + $total_tickets_released = 0; |
|
925 | + foreach ($tickets_with_reservations as $ticket_with_reservations) { |
|
926 | + if (! $ticket_with_reservations instanceof EE_Ticket) { |
|
927 | + continue; |
|
928 | + } |
|
929 | + $reserved_qty = $ticket_with_reservations->reserved(); |
|
930 | + foreach ($valid_reserved_ticket_line_items as $valid_reserved_ticket_line_item) { |
|
931 | + if ( |
|
932 | + $valid_reserved_ticket_line_item instanceof EE_Line_Item |
|
933 | + && $valid_reserved_ticket_line_item->OBJ_ID() === $ticket_with_reservations->ID() |
|
934 | + ) { |
|
935 | + $reserved_qty -= $valid_reserved_ticket_line_item->quantity(); |
|
936 | + } |
|
937 | + } |
|
938 | + if ($reserved_qty > 0) { |
|
939 | + $ticket_with_reservations->decrease_reserved($reserved_qty); |
|
940 | + $ticket_with_reservations->save(); |
|
941 | + $total_tickets_released += $reserved_qty; |
|
942 | + } |
|
943 | + } |
|
944 | + return $total_tickets_released; |
|
945 | + } |
|
946 | + |
|
947 | + |
|
948 | + |
|
949 | + /********************************** SHUTDOWN **********************************/ |
|
950 | + |
|
951 | + |
|
952 | + |
|
953 | + /** |
|
954 | + * @return false|int |
|
955 | + * @throws \EE_Error |
|
956 | + */ |
|
957 | + public static function clear_expired_line_items_with_no_transaction() |
|
958 | + { |
|
959 | + /** @type WPDB $wpdb */ |
|
960 | + global $wpdb; |
|
961 | + return $wpdb->query( |
|
962 | + $wpdb->prepare( |
|
963 | + 'DELETE FROM ' . EEM_Line_Item::instance()->table() . ' |
|
964 | 964 | WHERE TXN_ID = 0 AND LIN_timestamp <= %s', |
965 | - // use GMT time because that's what LIN_timestamps are in |
|
966 | - date('Y-m-d H:i:s', time() - EE_Registry::instance()->SSN->lifespan()) |
|
967 | - ) |
|
968 | - ); |
|
969 | - } |
|
965 | + // use GMT time because that's what LIN_timestamps are in |
|
966 | + date('Y-m-d H:i:s', time() - EE_Registry::instance()->SSN->lifespan()) |
|
967 | + ) |
|
968 | + ); |
|
969 | + } |
|
970 | 970 | |
971 | 971 | } |
972 | 972 | // End of file EED_Ticket_Sales_Monitor.module.php |
@@ -21,7 +21,7 @@ discard block |
||
21 | 21 | class EED_Ticket_Sales_Monitor extends EED_Module |
22 | 22 | { |
23 | 23 | |
24 | - const debug = false; // true false |
|
24 | + const debug = false; // true false |
|
25 | 25 | |
26 | 26 | /** |
27 | 27 | * an array of raw ticket data from EED_Ticket_Selector |
@@ -181,7 +181,7 @@ discard block |
||
181 | 181 | $expired_ticket_IDs = array(); |
182 | 182 | $valid_ticket_line_items = array(); |
183 | 183 | $total_line_items = EEM_Line_Item::instance()->get_total_line_items_with_no_transaction(); |
184 | - if(empty($total_line_items)){ |
|
184 | + if (empty($total_line_items)) { |
|
185 | 185 | return; |
186 | 186 | } |
187 | 187 | $expired = current_time('timestamp') - EE_Registry::instance()->SSN->lifespan(); |
@@ -189,17 +189,17 @@ discard block |
||
189 | 189 | /** @var EE_Line_Item $total_line_item */ |
190 | 190 | $ticket_line_items = EED_Ticket_Sales_Monitor::get_ticket_line_items_for_grand_total($total_line_item); |
191 | 191 | foreach ($ticket_line_items as $ticket_line_item) { |
192 | - if(! $ticket_line_item instanceof EE_Line_Item) { |
|
192 | + if ( ! $ticket_line_item instanceof EE_Line_Item) { |
|
193 | 193 | continue; |
194 | 194 | } |
195 | - if ($total_line_item->timestamp(true) <= $expired ) { |
|
195 | + if ($total_line_item->timestamp(true) <= $expired) { |
|
196 | 196 | $expired_ticket_IDs[$ticket_line_item->OBJ_ID()] = $ticket_line_item->OBJ_ID(); |
197 | 197 | } else { |
198 | 198 | $valid_ticket_line_items[$ticket_line_item->OBJ_ID()] = $ticket_line_item; |
199 | 199 | } |
200 | 200 | } |
201 | 201 | } |
202 | - if (! empty($expired_ticket_IDs)) { |
|
202 | + if ( ! empty($expired_ticket_IDs)) { |
|
203 | 203 | EED_Ticket_Sales_Monitor::release_reservations_for_tickets( |
204 | 204 | \EEM_Ticket::instance()->get_tickets_with_IDs($expired_ticket_IDs), |
205 | 205 | $valid_ticket_line_items |
@@ -237,8 +237,8 @@ discard block |
||
237 | 237 | $qty = EED_Ticket_Sales_Monitor::instance()->_validate_ticket_sale($ticket, $qty); |
238 | 238 | } |
239 | 239 | if (self::debug) { |
240 | - echo '<br /><br /> ' . __LINE__ . ') ' . __METHOD__ . '()'; |
|
241 | - echo '<br /><br /><b> RETURNED QTY: ' . $qty . '</b>'; |
|
240 | + echo '<br /><br /> '.__LINE__.') '.__METHOD__.'()'; |
|
241 | + echo '<br /><br /><b> RETURNED QTY: '.$qty.'</b>'; |
|
242 | 242 | } |
243 | 243 | return $qty; |
244 | 244 | } |
@@ -259,36 +259,36 @@ discard block |
||
259 | 259 | protected function _validate_ticket_sale(EE_Ticket $ticket, $qty = 1) |
260 | 260 | { |
261 | 261 | if (self::debug) { |
262 | - echo '<br /><br /> ' . __LINE__ . ') ' . __METHOD__ . '() '; |
|
262 | + echo '<br /><br /> '.__LINE__.') '.__METHOD__.'() '; |
|
263 | 263 | } |
264 | 264 | if ( ! $ticket instanceof EE_Ticket) { |
265 | 265 | return 0; |
266 | 266 | } |
267 | 267 | if (self::debug) { |
268 | - echo '<br /><b> . ticket->ID: ' . $ticket->ID() . '</b>'; |
|
269 | - echo '<br /> . original ticket->reserved: ' . $ticket->reserved(); |
|
268 | + echo '<br /><b> . ticket->ID: '.$ticket->ID().'</b>'; |
|
269 | + echo '<br /> . original ticket->reserved: '.$ticket->reserved(); |
|
270 | 270 | } |
271 | 271 | $ticket->refresh_from_db(); |
272 | 272 | // first let's determine the ticket availability based on sales |
273 | 273 | $available = $ticket->qty('saleable'); |
274 | 274 | if (self::debug) { |
275 | - echo '<br /> . . . ticket->qty: ' . $ticket->qty(); |
|
276 | - echo '<br /> . . . ticket->sold: ' . $ticket->sold(); |
|
277 | - echo '<br /> . . . ticket->reserved: ' . $ticket->reserved(); |
|
278 | - echo '<br /> . . . ticket->qty(saleable): ' . $ticket->qty('saleable'); |
|
279 | - echo '<br /> . . . available: ' . $available; |
|
275 | + echo '<br /> . . . ticket->qty: '.$ticket->qty(); |
|
276 | + echo '<br /> . . . ticket->sold: '.$ticket->sold(); |
|
277 | + echo '<br /> . . . ticket->reserved: '.$ticket->reserved(); |
|
278 | + echo '<br /> . . . ticket->qty(saleable): '.$ticket->qty('saleable'); |
|
279 | + echo '<br /> . . . available: '.$available; |
|
280 | 280 | } |
281 | 281 | if ($available < 1) { |
282 | 282 | $this->_ticket_sold_out($ticket); |
283 | 283 | return 0; |
284 | 284 | } |
285 | 285 | if (self::debug) { |
286 | - echo '<br /> . . . qty: ' . $qty; |
|
286 | + echo '<br /> . . . qty: '.$qty; |
|
287 | 287 | } |
288 | 288 | if ($available < $qty) { |
289 | 289 | $qty = $available; |
290 | 290 | if (self::debug) { |
291 | - echo '<br /> . . . QTY ADJUSTED: ' . $qty; |
|
291 | + echo '<br /> . . . QTY ADJUSTED: '.$qty; |
|
292 | 292 | } |
293 | 293 | $this->_ticket_quantity_decremented($ticket); |
294 | 294 | } |
@@ -311,7 +311,7 @@ discard block |
||
311 | 311 | protected function _reserve_ticket(EE_Ticket $ticket, $quantity = 1) |
312 | 312 | { |
313 | 313 | if (self::debug) { |
314 | - echo '<br /><br /> . . . INCREASE RESERVED: ' . $quantity; |
|
314 | + echo '<br /><br /> . . . INCREASE RESERVED: '.$quantity; |
|
315 | 315 | } |
316 | 316 | $ticket->increase_reserved($quantity); |
317 | 317 | return $ticket->save(); |
@@ -331,12 +331,12 @@ discard block |
||
331 | 331 | protected function _release_reserved_ticket(EE_Ticket $ticket, $quantity = 1) |
332 | 332 | { |
333 | 333 | if (self::debug) { |
334 | - echo '<br /> . . . ticket->ID: ' . $ticket->ID(); |
|
335 | - echo '<br /> . . . ticket->reserved: ' . $ticket->reserved(); |
|
334 | + echo '<br /> . . . ticket->ID: '.$ticket->ID(); |
|
335 | + echo '<br /> . . . ticket->reserved: '.$ticket->reserved(); |
|
336 | 336 | } |
337 | 337 | $ticket->decrease_reserved($quantity); |
338 | 338 | if (self::debug) { |
339 | - echo '<br /> . . . ticket->reserved: ' . $ticket->reserved(); |
|
339 | + echo '<br /> . . . ticket->reserved: '.$ticket->reserved(); |
|
340 | 340 | } |
341 | 341 | return $ticket->save() ? 1 : 0; |
342 | 342 | } |
@@ -356,8 +356,8 @@ discard block |
||
356 | 356 | protected function _ticket_sold_out(EE_Ticket $ticket) |
357 | 357 | { |
358 | 358 | if (self::debug) { |
359 | - echo '<br /><br /> ' . __LINE__ . ') ' . __METHOD__ . '() '; |
|
360 | - echo '<br /> . . ticket->name: ' . $this->_get_ticket_and_event_name($ticket); |
|
359 | + echo '<br /><br /> '.__LINE__.') '.__METHOD__.'() '; |
|
360 | + echo '<br /> . . ticket->name: '.$this->_get_ticket_and_event_name($ticket); |
|
361 | 361 | } |
362 | 362 | $this->sold_out_tickets[] = $this->_get_ticket_and_event_name($ticket); |
363 | 363 | } |
@@ -377,8 +377,8 @@ discard block |
||
377 | 377 | protected function _ticket_quantity_decremented(EE_Ticket $ticket) |
378 | 378 | { |
379 | 379 | if (self::debug) { |
380 | - echo '<br /><br /> ' . __LINE__ . ') ' . __METHOD__ . '() '; |
|
381 | - echo '<br /> . . ticket->name: ' . $this->_get_ticket_and_event_name($ticket); |
|
380 | + echo '<br /><br /> '.__LINE__.') '.__METHOD__.'() '; |
|
381 | + echo '<br /> . . ticket->name: '.$this->_get_ticket_and_event_name($ticket); |
|
382 | 382 | } |
383 | 383 | $this->decremented_tickets[] = $this->_get_ticket_and_event_name($ticket); |
384 | 384 | } |
@@ -485,7 +485,7 @@ discard block |
||
485 | 485 | protected function _post_notices() |
486 | 486 | { |
487 | 487 | if (self::debug) { |
488 | - echo '<br /><br /> ' . __LINE__ . ') ' . __METHOD__ . '() '; |
|
488 | + echo '<br /><br /> '.__LINE__.') '.__METHOD__.'() '; |
|
489 | 489 | } |
490 | 490 | $refresh_msg = ''; |
491 | 491 | $none_added_msg = ''; |
@@ -552,8 +552,8 @@ discard block |
||
552 | 552 | protected function _release_all_reserved_tickets_for_transaction(EE_Transaction $transaction) |
553 | 553 | { |
554 | 554 | if (self::debug) { |
555 | - echo '<br /><br /> ' . __LINE__ . ') ' . __METHOD__ . '() '; |
|
556 | - echo '<br /> . transaction->ID: ' . $transaction->ID(); |
|
555 | + echo '<br /><br /> '.__LINE__.') '.__METHOD__.'() '; |
|
556 | + echo '<br /> . transaction->ID: '.$transaction->ID(); |
|
557 | 557 | } |
558 | 558 | // check if 'finalize_registration' step has been completed... |
559 | 559 | $finalized = $transaction->reg_step_completed('finalize_registration'); |
@@ -562,13 +562,13 @@ discard block |
||
562 | 562 | EEH_Debug_Tools::log( |
563 | 563 | __CLASS__, __FUNCTION__, __LINE__, |
564 | 564 | array('finalized' => $finalized), |
565 | - false, 'EE_Transaction: ' . $transaction->ID() |
|
565 | + false, 'EE_Transaction: '.$transaction->ID() |
|
566 | 566 | ); |
567 | 567 | } |
568 | 568 | // how many tickets were released |
569 | 569 | $count = 0; |
570 | 570 | if (self::debug) { |
571 | - echo '<br /> . . . finalized: ' . $finalized; |
|
571 | + echo '<br /> . . . finalized: '.$finalized; |
|
572 | 572 | } |
573 | 573 | $release_tickets_with_TXN_status = array( |
574 | 574 | EEM_Transaction::failed_status_code, |
@@ -609,10 +609,10 @@ discard block |
||
609 | 609 | ) { |
610 | 610 | $STS_ID = $transaction->status_ID(); |
611 | 611 | if (self::debug) { |
612 | - echo '<br /><br /> ' . __LINE__ . ') ' . __METHOD__ . '() '; |
|
613 | - echo '<br /> . . registration->ID: ' . $registration->ID(); |
|
614 | - echo '<br /> . . registration->status_ID: ' . $registration->status_ID(); |
|
615 | - echo '<br /> . . transaction->status_ID(): ' . $STS_ID; |
|
612 | + echo '<br /><br /> '.__LINE__.') '.__METHOD__.'() '; |
|
613 | + echo '<br /> . . registration->ID: '.$registration->ID(); |
|
614 | + echo '<br /> . . registration->status_ID: '.$registration->status_ID(); |
|
615 | + echo '<br /> . . transaction->status_ID(): '.$STS_ID; |
|
616 | 616 | } |
617 | 617 | if ( |
618 | 618 | // release Tickets for Failed Transactions and Abandoned Transactions |
@@ -650,7 +650,7 @@ discard block |
||
650 | 650 | public static function session_cart_reset(EE_Session $session) |
651 | 651 | { |
652 | 652 | if (self::debug) { |
653 | - echo '<br /><br /> ' . __LINE__ . ') ' . __METHOD__ . '() '; |
|
653 | + echo '<br /><br /> '.__LINE__.') '.__METHOD__.'() '; |
|
654 | 654 | } |
655 | 655 | $cart = $session->cart(); |
656 | 656 | if ($cart instanceof EE_Cart) { |
@@ -680,7 +680,7 @@ discard block |
||
680 | 680 | protected function _session_cart_reset(EE_Cart $cart) |
681 | 681 | { |
682 | 682 | if (self::debug) { |
683 | - echo '<br /><br /> ' . __LINE__ . ') ' . __METHOD__ . '() '; |
|
683 | + echo '<br /><br /> '.__LINE__.') '.__METHOD__.'() '; |
|
684 | 684 | } |
685 | 685 | EE_Registry::instance()->load_helper('Line_Item'); |
686 | 686 | $ticket_line_items = $cart->get_tickets(); |
@@ -689,17 +689,17 @@ discard block |
||
689 | 689 | } |
690 | 690 | foreach ($ticket_line_items as $ticket_line_item) { |
691 | 691 | if (self::debug) { |
692 | - echo '<br /> . ticket_line_item->ID(): ' . $ticket_line_item->ID(); |
|
692 | + echo '<br /> . ticket_line_item->ID(): '.$ticket_line_item->ID(); |
|
693 | 693 | } |
694 | 694 | if ($ticket_line_item instanceof EE_Line_Item && $ticket_line_item->OBJ_type() === 'Ticket') { |
695 | 695 | if (self::debug) { |
696 | - echo '<br /> . . ticket_line_item->OBJ_ID(): ' . $ticket_line_item->OBJ_ID(); |
|
696 | + echo '<br /> . . ticket_line_item->OBJ_ID(): '.$ticket_line_item->OBJ_ID(); |
|
697 | 697 | } |
698 | 698 | $ticket = EEM_Ticket::instance()->get_one_by_ID($ticket_line_item->OBJ_ID()); |
699 | 699 | if ($ticket instanceof EE_Ticket) { |
700 | 700 | if (self::debug) { |
701 | - echo '<br /> . . ticket->ID(): ' . $ticket->ID(); |
|
702 | - echo '<br /> . . ticket_line_item->quantity(): ' . $ticket_line_item->quantity(); |
|
701 | + echo '<br /> . . ticket->ID(): '.$ticket->ID(); |
|
702 | + echo '<br /> . . ticket_line_item->quantity(): '.$ticket_line_item->quantity(); |
|
703 | 703 | } |
704 | 704 | $this->_release_reserved_ticket($ticket, $ticket_line_item->quantity()); |
705 | 705 | } |
@@ -747,7 +747,7 @@ discard block |
||
747 | 747 | protected function _session_checkout_reset(EE_Checkout $checkout) |
748 | 748 | { |
749 | 749 | if (self::debug) { |
750 | - echo '<br /><br /> ' . __LINE__ . ') ' . __METHOD__ . '() '; |
|
750 | + echo '<br /><br /> '.__LINE__.') '.__METHOD__.'() '; |
|
751 | 751 | } |
752 | 752 | // we want to release the each registration's reserved tickets if the session was cleared, but not if this is a revisit |
753 | 753 | if ($checkout->revisit || ! $checkout->transaction instanceof EE_Transaction) { |
@@ -798,7 +798,7 @@ discard block |
||
798 | 798 | EEH_Debug_Tools::log( |
799 | 799 | __CLASS__, __FUNCTION__, __LINE__, |
800 | 800 | array($transaction), |
801 | - false, 'EE_Transaction: ' . $transaction->ID() |
|
801 | + false, 'EE_Transaction: '.$transaction->ID() |
|
802 | 802 | ); |
803 | 803 | } |
804 | 804 | return; |
@@ -812,7 +812,7 @@ discard block |
||
812 | 812 | EEH_Debug_Tools::log( |
813 | 813 | __CLASS__, __FUNCTION__, __LINE__, |
814 | 814 | array($payment), |
815 | - false, 'EE_Transaction: ' . $transaction->ID() |
|
815 | + false, 'EE_Transaction: '.$transaction->ID() |
|
816 | 816 | ); |
817 | 817 | } |
818 | 818 | return; |
@@ -869,7 +869,7 @@ discard block |
||
869 | 869 | /** @var EE_Transaction $transaction_in_progress */ |
870 | 870 | $total_line_item = $transaction_in_progress->total_line_item(); |
871 | 871 | // $transaction_in_progress->line |
872 | - if (! $total_line_item instanceof EE_Line_Item) { |
|
872 | + if ( ! $total_line_item instanceof EE_Line_Item) { |
|
873 | 873 | throw new DomainException( |
874 | 874 | esc_html__('Transaction does not have a valid Total Line Item associated with it.', 'event_espresso') |
875 | 875 | ); |
@@ -923,7 +923,7 @@ discard block |
||
923 | 923 | ) { |
924 | 924 | $total_tickets_released = 0; |
925 | 925 | foreach ($tickets_with_reservations as $ticket_with_reservations) { |
926 | - if (! $ticket_with_reservations instanceof EE_Ticket) { |
|
926 | + if ( ! $ticket_with_reservations instanceof EE_Ticket) { |
|
927 | 927 | continue; |
928 | 928 | } |
929 | 929 | $reserved_qty = $ticket_with_reservations->reserved(); |
@@ -960,7 +960,7 @@ discard block |
||
960 | 960 | global $wpdb; |
961 | 961 | return $wpdb->query( |
962 | 962 | $wpdb->prepare( |
963 | - 'DELETE FROM ' . EEM_Line_Item::instance()->table() . ' |
|
963 | + 'DELETE FROM '.EEM_Line_Item::instance()->table().' |
|
964 | 964 | WHERE TXN_ID = 0 AND LIN_timestamp <= %s', |
965 | 965 | // use GMT time because that's what LIN_timestamps are in |
966 | 966 | date('Y-m-d H:i:s', time() - EE_Registry::instance()->SSN->lifespan()) |
@@ -11,1386 +11,1386 @@ |
||
11 | 11 | class EE_Form_Section_Proper extends EE_Form_Section_Validatable |
12 | 12 | { |
13 | 13 | |
14 | - const SUBMITTED_FORM_DATA_SSN_KEY = 'submitted_form_data'; |
|
15 | - |
|
16 | - /** |
|
17 | - * Subsections |
|
18 | - * |
|
19 | - * @var EE_Form_Section_Validatable[] |
|
20 | - */ |
|
21 | - protected $_subsections = array(); |
|
22 | - |
|
23 | - /** |
|
24 | - * Strategy for laying out the form |
|
25 | - * |
|
26 | - * @var EE_Form_Section_Layout_Base |
|
27 | - */ |
|
28 | - protected $_layout_strategy; |
|
29 | - |
|
30 | - /** |
|
31 | - * Whether or not this form has received and validated a form submission yet |
|
32 | - * |
|
33 | - * @var boolean |
|
34 | - */ |
|
35 | - protected $_received_submission = false; |
|
36 | - |
|
37 | - /** |
|
38 | - * message displayed to users upon successful form submission |
|
39 | - * |
|
40 | - * @var string |
|
41 | - */ |
|
42 | - protected $_form_submission_success_message = ''; |
|
43 | - |
|
44 | - /** |
|
45 | - * message displayed to users upon unsuccessful form submission |
|
46 | - * |
|
47 | - * @var string |
|
48 | - */ |
|
49 | - protected $_form_submission_error_message = ''; |
|
50 | - |
|
51 | - /** |
|
52 | - * Stores all the data that will localized for form validation |
|
53 | - * |
|
54 | - * @var array |
|
55 | - */ |
|
56 | - static protected $_js_localization = array(); |
|
57 | - |
|
58 | - /** |
|
59 | - * whether or not the form's localized validation JS vars have been set |
|
60 | - * |
|
61 | - * @type boolean |
|
62 | - */ |
|
63 | - static protected $_scripts_localized = false; |
|
64 | - |
|
65 | - |
|
66 | - |
|
67 | - /** |
|
68 | - * when constructing a proper form section, calls _construct_finalize on children |
|
69 | - * so that they know who their parent is, and what name they've been given. |
|
70 | - * |
|
71 | - * @param array $options_array { |
|
72 | - * @type $subsections EE_Form_Section_Validatable[] where keys are the section's name |
|
73 | - * @type $include string[] numerically-indexed where values are section names to be included, |
|
74 | - * and in that order. This is handy if you want |
|
75 | - * the subsections to be ordered differently than the default, and if you override |
|
76 | - * which fields are shown |
|
77 | - * @type $exclude string[] values are subsections to be excluded. This is handy if you want |
|
78 | - * to remove certain default subsections (note: if you specify BOTH 'include' AND |
|
79 | - * 'exclude', the inclusions will be applied first, and the exclusions will exclude |
|
80 | - * items from that list of inclusions) |
|
81 | - * @type $layout_strategy EE_Form_Section_Layout_Base strategy for laying out the form |
|
82 | - * } @see EE_Form_Section_Validatable::__construct() |
|
83 | - * @throws \EE_Error |
|
84 | - */ |
|
85 | - public function __construct($options_array = array()) |
|
86 | - { |
|
87 | - $options_array = (array)apply_filters('FHEE__EE_Form_Section_Proper___construct__options_array', $options_array, |
|
88 | - $this); |
|
89 | - //call parent first, as it may be setting the name |
|
90 | - parent::__construct($options_array); |
|
91 | - //if they've included subsections in the constructor, add them now |
|
92 | - if (isset($options_array['include'])) { |
|
93 | - //we are going to make sure we ONLY have those subsections to include |
|
94 | - //AND we are going to make sure they're in that specified order |
|
95 | - $reordered_subsections = array(); |
|
96 | - foreach ($options_array['include'] as $input_name) { |
|
97 | - if (isset($this->_subsections[$input_name])) { |
|
98 | - $reordered_subsections[$input_name] = $this->_subsections[$input_name]; |
|
99 | - } |
|
100 | - } |
|
101 | - $this->_subsections = $reordered_subsections; |
|
102 | - } |
|
103 | - if (isset($options_array['exclude'])) { |
|
104 | - $exclude = $options_array['exclude']; |
|
105 | - $this->_subsections = array_diff_key($this->_subsections, array_flip($exclude)); |
|
106 | - } |
|
107 | - if (isset($options_array['layout_strategy'])) { |
|
108 | - $this->_layout_strategy = $options_array['layout_strategy']; |
|
109 | - } |
|
110 | - if (! $this->_layout_strategy) { |
|
111 | - $this->_layout_strategy = is_admin() ? new EE_Admin_Two_Column_Layout() : new EE_Two_Column_Layout(); |
|
112 | - } |
|
113 | - $this->_layout_strategy->_construct_finalize($this); |
|
114 | - //ok so we are definitely going to want the forms JS, |
|
115 | - //so enqueue it or remember to enqueue it during wp_enqueue_scripts |
|
116 | - if (did_action('wp_enqueue_scripts') || did_action('admin_enqueue_scripts')) { |
|
117 | - //ok so they've constructed this object after when they should have. |
|
118 | - //just enqueue the generic form scripts and initialize the form immediately in the JS |
|
119 | - \EE_Form_Section_Proper::wp_enqueue_scripts(true); |
|
120 | - } else { |
|
121 | - add_action('wp_enqueue_scripts', array('EE_Form_Section_Proper', 'wp_enqueue_scripts')); |
|
122 | - add_action('admin_enqueue_scripts', array('EE_Form_Section_Proper', 'wp_enqueue_scripts')); |
|
123 | - } |
|
124 | - add_action('wp_footer', array($this, 'ensure_scripts_localized'), 1); |
|
125 | - |
|
126 | - /** |
|
127 | - * Gives other plugins a chance to hook in before construct finalize is called. The form probably doesn't |
|
128 | - * yet have a parent form section. Since 4.9.32, when this action was introduced, this is the best place to |
|
129 | - * add a subsection onto a form, assuming you don't care what the form section's name, HTML ID, or HTML name etc are. |
|
130 | - * Also see AHEE__EE_Form_Section_Proper___construct_finalize__end |
|
131 | - * @since 4.9.32 |
|
132 | - * @param EE_Form_Section_Proper $this before __construct is done, but all of its logic, except maybe calling |
|
133 | - * _construct_finalize has been done |
|
134 | - * @param array $options_array options passed into the constructor |
|
135 | - */ |
|
136 | - do_action('AHEE__EE_Form_Input_Base___construct__before_construct_finalize_called', $this, $options_array); |
|
137 | - |
|
138 | - if (isset($options_array['name'])) { |
|
139 | - $this->_construct_finalize(null, $options_array['name']); |
|
140 | - } |
|
141 | - } |
|
142 | - |
|
143 | - |
|
144 | - |
|
145 | - /** |
|
146 | - * Finishes construction given the parent form section and this form section's name |
|
147 | - * |
|
148 | - * @param EE_Form_Section_Proper $parent_form_section |
|
149 | - * @param string $name |
|
150 | - * @throws \EE_Error |
|
151 | - */ |
|
152 | - public function _construct_finalize($parent_form_section, $name) |
|
153 | - { |
|
154 | - parent::_construct_finalize($parent_form_section, $name); |
|
155 | - $this->_set_default_name_if_empty(); |
|
156 | - $this->_set_default_html_id_if_empty(); |
|
157 | - foreach ($this->_subsections as $subsection_name => $subsection) { |
|
158 | - if ($subsection instanceof EE_Form_Section_Base) { |
|
159 | - $subsection->_construct_finalize($this, $subsection_name); |
|
160 | - } else { |
|
161 | - throw new EE_Error( |
|
162 | - sprintf( |
|
163 | - __('Subsection "%s" is not an instanceof EE_Form_Section_Base on form "%s". It is a "%s"', |
|
164 | - 'event_espresso'), |
|
165 | - $subsection_name, |
|
166 | - get_class($this), |
|
167 | - $subsection ? get_class($subsection) : __('NULL', 'event_espresso') |
|
168 | - ) |
|
169 | - ); |
|
170 | - } |
|
171 | - } |
|
172 | - /** |
|
173 | - * Action performed just after form has been given a name (and HTML ID etc) and is fully constructed. |
|
174 | - * If you have code that should modify the form and needs it and its subsections to have a name, HTML ID (or other attributes derived |
|
175 | - * from the name like the HTML label id, etc), this is where it should be done. |
|
176 | - * This might only happen just before displaying the form, or just before it receives form submission data. |
|
177 | - * If you need to modify the form or its subsections before _construct_finalize is called on it (and we've |
|
178 | - * ensured it has a name, HTML IDs, etc |
|
179 | - * @param EE_Form_Section_Proper $this |
|
180 | - * @param EE_Form_Section_Proper|null $parent_form_section |
|
181 | - * @param string $name |
|
182 | - */ |
|
183 | - do_action('AHEE__EE_Form_Section_Proper___construct_finalize__end', $this, $parent_form_section, $name); |
|
184 | - } |
|
185 | - |
|
186 | - |
|
187 | - |
|
188 | - /** |
|
189 | - * Gets the layout strategy for this form section |
|
190 | - * |
|
191 | - * @return EE_Form_Section_Layout_Base |
|
192 | - */ |
|
193 | - public function get_layout_strategy() |
|
194 | - { |
|
195 | - return $this->_layout_strategy; |
|
196 | - } |
|
197 | - |
|
198 | - |
|
199 | - |
|
200 | - /** |
|
201 | - * Gets the HTML for a single input for this form section according |
|
202 | - * to the layout strategy |
|
203 | - * |
|
204 | - * @param EE_Form_Input_Base $input |
|
205 | - * @return string |
|
206 | - */ |
|
207 | - public function get_html_for_input($input) |
|
208 | - { |
|
209 | - return $this->_layout_strategy->layout_input($input); |
|
210 | - } |
|
211 | - |
|
212 | - |
|
213 | - |
|
214 | - /** |
|
215 | - * was_submitted - checks if form inputs are present in request data |
|
216 | - * Basically an alias for form_data_present_in() (which is used by both |
|
217 | - * proper form sections and form inputs) |
|
218 | - * |
|
219 | - * @param null $form_data |
|
220 | - * @return boolean |
|
221 | - */ |
|
222 | - public function was_submitted($form_data = null) |
|
223 | - { |
|
224 | - return $this->form_data_present_in($form_data); |
|
225 | - } |
|
226 | - |
|
227 | - |
|
228 | - |
|
229 | - /** |
|
230 | - * After the form section is initially created, call this to sanitize the data in the submission |
|
231 | - * which relates to this form section, validate it, and set it as properties on the form. |
|
232 | - * |
|
233 | - * @param array|null $req_data should usually be $_POST (the default). |
|
234 | - * However, you CAN supply a different array. |
|
235 | - * Consider using set_defaults() instead however. |
|
236 | - * (If you rendered the form in the page using echo $form_x->get_html() |
|
237 | - * the inputs will have the correct name in the request data for this function |
|
238 | - * to find them and populate the form with them. |
|
239 | - * If you have a flat form (with only input subsections), |
|
240 | - * you can supply a flat array where keys |
|
241 | - * are the form input names and values are their values) |
|
242 | - * @param boolean $validate whether or not to perform validation on this data. Default is, |
|
243 | - * of course, to validate that data, and set errors on the invalid values. |
|
244 | - * But if the data has already been validated |
|
245 | - * (eg you validated the data then stored it in the DB) |
|
246 | - * you may want to skip this step. |
|
247 | - */ |
|
248 | - public function receive_form_submission($req_data = null, $validate = true) |
|
249 | - { |
|
250 | - $req_data = apply_filters('FHEE__EE_Form_Section_Proper__receive_form_submission__req_data', $req_data, $this, |
|
251 | - $validate); |
|
252 | - if ($req_data === null) { |
|
253 | - $req_data = array_merge($_GET, $_POST); |
|
254 | - } |
|
255 | - $req_data = apply_filters('FHEE__EE_Form_Section_Proper__receive_form_submission__request_data', $req_data, |
|
256 | - $this); |
|
257 | - $this->_normalize($req_data); |
|
258 | - if ($validate) { |
|
259 | - $this->_validate(); |
|
260 | - //if it's invalid, we're going to want to re-display so remember what they submitted |
|
261 | - if (! $this->is_valid()) { |
|
262 | - $this->store_submitted_form_data_in_session(); |
|
263 | - } |
|
264 | - } |
|
265 | - do_action('AHEE__EE_Form_Section_Proper__receive_form_submission__end', $req_data, $this, $validate); |
|
266 | - } |
|
267 | - |
|
268 | - |
|
269 | - |
|
270 | - /** |
|
271 | - * caches the originally submitted input values in the session |
|
272 | - * so that they can be used to repopulate the form if it failed validation |
|
273 | - * |
|
274 | - * @return boolean whether or not the data was successfully stored in the session |
|
275 | - */ |
|
276 | - protected function store_submitted_form_data_in_session() |
|
277 | - { |
|
278 | - return EE_Registry::instance()->SSN->set_session_data( |
|
279 | - array( |
|
280 | - \EE_Form_Section_Proper::SUBMITTED_FORM_DATA_SSN_KEY => $this->submitted_values(true), |
|
281 | - ) |
|
282 | - ); |
|
283 | - } |
|
284 | - |
|
285 | - |
|
286 | - |
|
287 | - /** |
|
288 | - * retrieves the originally submitted input values in the session |
|
289 | - * so that they can be used to repopulate the form if it failed validation |
|
290 | - * |
|
291 | - * @return array |
|
292 | - */ |
|
293 | - protected function get_submitted_form_data_from_session() |
|
294 | - { |
|
295 | - $session = EE_Registry::instance()->SSN; |
|
296 | - if ($session instanceof EE_Session) { |
|
297 | - return $session->get_session_data( |
|
298 | - \EE_Form_Section_Proper::SUBMITTED_FORM_DATA_SSN_KEY |
|
299 | - ); |
|
300 | - } else { |
|
301 | - return array(); |
|
302 | - } |
|
303 | - } |
|
304 | - |
|
305 | - |
|
306 | - |
|
307 | - /** |
|
308 | - * flushed the originally submitted input values from the session |
|
309 | - * |
|
310 | - * @return boolean whether or not the data was successfully removed from the session |
|
311 | - */ |
|
312 | - protected function flush_submitted_form_data_from_session() |
|
313 | - { |
|
314 | - return EE_Registry::instance()->SSN->reset_data( |
|
315 | - array(\EE_Form_Section_Proper::SUBMITTED_FORM_DATA_SSN_KEY) |
|
316 | - ); |
|
317 | - } |
|
318 | - |
|
319 | - |
|
320 | - |
|
321 | - /** |
|
322 | - * Populates this form and its subsections with data from the session. |
|
323 | - * (Wrapper for EE_Form_Section_Proper::receive_form_submission, so it shows |
|
324 | - * validation errors when displaying too) |
|
325 | - * Returns true if the form was populated from the session, false otherwise |
|
326 | - * |
|
327 | - * @return boolean |
|
328 | - */ |
|
329 | - public function populate_from_session() |
|
330 | - { |
|
331 | - $form_data_in_session = $this->get_submitted_form_data_from_session(); |
|
332 | - if (empty($form_data_in_session)) { |
|
333 | - return false; |
|
334 | - } |
|
335 | - $this->receive_form_submission($form_data_in_session); |
|
336 | - $this->flush_submitted_form_data_from_session(); |
|
337 | - if ($this->form_data_present_in($form_data_in_session)) { |
|
338 | - return true; |
|
339 | - } else { |
|
340 | - return false; |
|
341 | - } |
|
342 | - } |
|
343 | - |
|
344 | - |
|
345 | - |
|
346 | - /** |
|
347 | - * Populates the default data for the form, given an array where keys are |
|
348 | - * the input names, and values are their values (preferably normalized to be their |
|
349 | - * proper PHP types, not all strings... although that should be ok too). |
|
350 | - * Proper subsections are sub-arrays, the key being the subsection's name, and |
|
351 | - * the value being an array formatted in teh same way |
|
352 | - * |
|
353 | - * @param array $default_data |
|
354 | - */ |
|
355 | - public function populate_defaults($default_data) |
|
356 | - { |
|
357 | - foreach ($this->subsections(false) as $subsection_name => $subsection) { |
|
358 | - if (isset($default_data[$subsection_name])) { |
|
359 | - if ($subsection instanceof EE_Form_Input_Base) { |
|
360 | - $subsection->set_default($default_data[$subsection_name]); |
|
361 | - } elseif ($subsection instanceof EE_Form_Section_Proper) { |
|
362 | - $subsection->populate_defaults($default_data[$subsection_name]); |
|
363 | - } |
|
364 | - } |
|
365 | - } |
|
366 | - } |
|
367 | - |
|
368 | - |
|
369 | - |
|
370 | - /** |
|
371 | - * returns true if subsection exists |
|
372 | - * |
|
373 | - * @param string $name |
|
374 | - * @return boolean |
|
375 | - */ |
|
376 | - public function subsection_exists($name) |
|
377 | - { |
|
378 | - return isset($this->_subsections[$name]) ? true : false; |
|
379 | - } |
|
380 | - |
|
381 | - |
|
382 | - |
|
383 | - /** |
|
384 | - * Gets the subsection specified by its name |
|
385 | - * |
|
386 | - * @param string $name |
|
387 | - * @param boolean $require_construction_to_be_finalized most client code should leave this as TRUE |
|
388 | - * so that the inputs will be properly configured. |
|
389 | - * However, some client code may be ok |
|
390 | - * with construction finalize being called later |
|
391 | - * (realizing that the subsections' html names |
|
392 | - * might not be set yet, etc.) |
|
393 | - * @return EE_Form_Section_Base |
|
394 | - * @throws \EE_Error |
|
395 | - */ |
|
396 | - public function get_subsection($name, $require_construction_to_be_finalized = true) |
|
397 | - { |
|
398 | - if ($require_construction_to_be_finalized) { |
|
399 | - $this->ensure_construct_finalized_called(); |
|
400 | - } |
|
401 | - return $this->subsection_exists($name) ? $this->_subsections[$name] : null; |
|
402 | - } |
|
403 | - |
|
404 | - |
|
405 | - |
|
406 | - /** |
|
407 | - * Gets all the validatable subsections of this form section |
|
408 | - * |
|
409 | - * @return EE_Form_Section_Validatable[] |
|
410 | - */ |
|
411 | - public function get_validatable_subsections() |
|
412 | - { |
|
413 | - $validatable_subsections = array(); |
|
414 | - foreach ($this->subsections() as $name => $obj) { |
|
415 | - if ($obj instanceof EE_Form_Section_Validatable) { |
|
416 | - $validatable_subsections[$name] = $obj; |
|
417 | - } |
|
418 | - } |
|
419 | - return $validatable_subsections; |
|
420 | - } |
|
421 | - |
|
422 | - |
|
423 | - |
|
424 | - /** |
|
425 | - * Gets an input by the given name. If not found, or if its not an EE_FOrm_Input_Base child, |
|
426 | - * throw an EE_Error. |
|
427 | - * |
|
428 | - * @param string $name |
|
429 | - * @param boolean $require_construction_to_be_finalized most client code should |
|
430 | - * leave this as TRUE so that the inputs will be properly |
|
431 | - * configured. However, some client code may be ok with |
|
432 | - * construction finalize being called later |
|
433 | - * (realizing that the subsections' html names might not be |
|
434 | - * set yet, etc.) |
|
435 | - * @return EE_Form_Input_Base |
|
436 | - * @throws EE_Error |
|
437 | - */ |
|
438 | - public function get_input($name, $require_construction_to_be_finalized = true) |
|
439 | - { |
|
440 | - $subsection = $this->get_subsection($name, $require_construction_to_be_finalized); |
|
441 | - if (! $subsection instanceof EE_Form_Input_Base) { |
|
442 | - throw new EE_Error( |
|
443 | - sprintf( |
|
444 | - __( |
|
445 | - "Subsection '%s' is not an instanceof EE_Form_Input_Base on form '%s'. It is a '%s'", |
|
446 | - 'event_espresso' |
|
447 | - ), |
|
448 | - $name, |
|
449 | - get_class($this), |
|
450 | - $subsection ? get_class($subsection) : __("NULL", 'event_espresso') |
|
451 | - ) |
|
452 | - ); |
|
453 | - } |
|
454 | - return $subsection; |
|
455 | - } |
|
456 | - |
|
457 | - |
|
458 | - |
|
459 | - /** |
|
460 | - * Like get_input(), gets the proper subsection of the form given the name, |
|
461 | - * otherwise throws an EE_Error |
|
462 | - * |
|
463 | - * @param string $name |
|
464 | - * @param boolean $require_construction_to_be_finalized most client code should |
|
465 | - * leave this as TRUE so that the inputs will be properly |
|
466 | - * configured. However, some client code may be ok with |
|
467 | - * construction finalize being called later |
|
468 | - * (realizing that the subsections' html names might not be |
|
469 | - * set yet, etc.) |
|
470 | - * @return EE_Form_Section_Proper |
|
471 | - * @throws EE_Error |
|
472 | - */ |
|
473 | - public function get_proper_subsection($name, $require_construction_to_be_finalized = true) |
|
474 | - { |
|
475 | - $subsection = $this->get_subsection($name, $require_construction_to_be_finalized); |
|
476 | - if (! $subsection instanceof EE_Form_Section_Proper) { |
|
477 | - throw new EE_Error( |
|
478 | - sprintf( |
|
479 | - __("Subsection '%'s is not an instanceof EE_Form_Section_Proper on form '%s'", 'event_espresso'), |
|
480 | - $name, |
|
481 | - get_class($this) |
|
482 | - ) |
|
483 | - ); |
|
484 | - } |
|
485 | - return $subsection; |
|
486 | - } |
|
487 | - |
|
488 | - |
|
489 | - |
|
490 | - /** |
|
491 | - * Gets the value of the specified input. Should be called after receive_form_submission() |
|
492 | - * or populate_defaults() on the form, where the normalized value on the input is set. |
|
493 | - * |
|
494 | - * @param string $name |
|
495 | - * @return mixed depending on the input's type and its normalization strategy |
|
496 | - * @throws \EE_Error |
|
497 | - */ |
|
498 | - public function get_input_value($name) |
|
499 | - { |
|
500 | - $input = $this->get_input($name); |
|
501 | - return $input->normalized_value(); |
|
502 | - } |
|
503 | - |
|
504 | - |
|
505 | - |
|
506 | - /** |
|
507 | - * Checks if this form section itself is valid, and then checks its subsections |
|
508 | - * |
|
509 | - * @throws EE_Error |
|
510 | - * @return boolean |
|
511 | - */ |
|
512 | - public function is_valid() |
|
513 | - { |
|
514 | - if (! $this->has_received_submission()) { |
|
515 | - throw new EE_Error( |
|
516 | - sprintf( |
|
517 | - __( |
|
518 | - "You cannot check if a form is valid before receiving the form submission using receive_form_submission", |
|
519 | - "event_espresso" |
|
520 | - ) |
|
521 | - ) |
|
522 | - ); |
|
523 | - } |
|
524 | - if (! parent::is_valid()) { |
|
525 | - return false; |
|
526 | - } |
|
527 | - // ok so no general errors to this entire form section. |
|
528 | - // so let's check the subsections, but only set errors if that hasn't been done yet |
|
529 | - $set_submission_errors = $this->submission_error_message() === '' ? true : false; |
|
530 | - foreach ($this->get_validatable_subsections() as $subsection) { |
|
531 | - if (! $subsection->is_valid() || $subsection->get_validation_error_string() !== '') { |
|
532 | - if ($set_submission_errors) { |
|
533 | - $this->set_submission_error_message($subsection->get_validation_error_string()); |
|
534 | - } |
|
535 | - return false; |
|
536 | - } |
|
537 | - } |
|
538 | - return true; |
|
539 | - } |
|
540 | - |
|
541 | - |
|
542 | - |
|
543 | - /** |
|
544 | - * gets teh default name of this form section if none is specified |
|
545 | - * |
|
546 | - * @return string |
|
547 | - */ |
|
548 | - protected function _set_default_name_if_empty() |
|
549 | - { |
|
550 | - if (! $this->_name) { |
|
551 | - $classname = get_class($this); |
|
552 | - $default_name = str_replace("EE_", "", $classname); |
|
553 | - $this->_name = $default_name; |
|
554 | - } |
|
555 | - } |
|
556 | - |
|
557 | - |
|
558 | - |
|
559 | - /** |
|
560 | - * Returns the HTML for the form, except for the form opening and closing tags |
|
561 | - * (as the form section doesn't know where you necessarily want to send the information to), |
|
562 | - * and except for a submit button. Enqueus JS and CSS; if called early enough we will |
|
563 | - * try to enqueue them in the header, otherwise they'll be enqueued in the footer. |
|
564 | - * Not doing_it_wrong because theoretically this CAN be used properly, |
|
565 | - * provided its used during "wp_enqueue_scripts", or it doesn't need to enqueue |
|
566 | - * any CSS. |
|
567 | - * |
|
568 | - * @throws \EE_Error |
|
569 | - */ |
|
570 | - public function get_html_and_js() |
|
571 | - { |
|
572 | - $this->enqueue_js(); |
|
573 | - return $this->get_html(); |
|
574 | - } |
|
575 | - |
|
576 | - |
|
577 | - |
|
578 | - /** |
|
579 | - * returns HTML for displaying this form section. recursively calls display_section() on all subsections |
|
580 | - * |
|
581 | - * @param bool $display_previously_submitted_data |
|
582 | - * @return string |
|
583 | - */ |
|
584 | - public function get_html($display_previously_submitted_data = true) |
|
585 | - { |
|
586 | - $this->ensure_construct_finalized_called(); |
|
587 | - if ($display_previously_submitted_data) { |
|
588 | - $this->populate_from_session(); |
|
589 | - } |
|
590 | - return $this->_form_html_filter |
|
591 | - ? $this->_form_html_filter->filterHtml($this->_layout_strategy->layout_form(), $this) |
|
592 | - : $this->_layout_strategy->layout_form(); |
|
593 | - } |
|
594 | - |
|
595 | - |
|
596 | - |
|
597 | - /** |
|
598 | - * enqueues JS and CSS for the form. |
|
599 | - * It is preferred to call this before wp_enqueue_scripts so the |
|
600 | - * scripts and styles can be put in the header, but if called later |
|
601 | - * they will be put in the footer (which is OK for JS, but in HTML4 CSS should |
|
602 | - * only be in the header; but in HTML5 its ok in the body. |
|
603 | - * See http://stackoverflow.com/questions/4957446/load-external-css-file-in-body-tag. |
|
604 | - * So if your form enqueues CSS, it's preferred to call this before wp_enqueue_scripts.) |
|
605 | - * |
|
606 | - * @return string |
|
607 | - * @throws \EE_Error |
|
608 | - */ |
|
609 | - public function enqueue_js() |
|
610 | - { |
|
611 | - $this->_enqueue_and_localize_form_js(); |
|
612 | - foreach ($this->subsections() as $subsection) { |
|
613 | - $subsection->enqueue_js(); |
|
614 | - } |
|
615 | - } |
|
616 | - |
|
617 | - |
|
618 | - |
|
619 | - /** |
|
620 | - * adds a filter so that jquery validate gets enqueued in EE_System::wp_enqueue_scripts(). |
|
621 | - * This must be done BEFORE wp_enqueue_scripts() gets called, which is on |
|
622 | - * the wp_enqueue_scripts hook. |
|
623 | - * However, registering the form js and localizing it can happen when we |
|
624 | - * actually output the form (which is preferred, seeing how teh form's fields |
|
625 | - * could change until it's actually outputted) |
|
626 | - * |
|
627 | - * @param boolean $init_form_validation_automatically whether or not we want the form validation |
|
628 | - * to be triggered automatically or not |
|
629 | - * @return void |
|
630 | - */ |
|
631 | - public static function wp_enqueue_scripts($init_form_validation_automatically = true) |
|
632 | - { |
|
633 | - add_filter('FHEE_load_jquery_validate', '__return_true'); |
|
634 | - wp_register_script( |
|
635 | - 'ee_form_section_validation', |
|
636 | - EE_GLOBAL_ASSETS_URL . 'scripts' . DS . 'form_section_validation.js', |
|
637 | - array('jquery-validate', 'jquery-ui-datepicker', 'jquery-validate-extra-methods'), |
|
638 | - EVENT_ESPRESSO_VERSION, |
|
639 | - true |
|
640 | - ); |
|
641 | - wp_localize_script( |
|
642 | - 'ee_form_section_validation', |
|
643 | - 'ee_form_section_validation_init', |
|
644 | - array('init' => $init_form_validation_automatically ? true : false) |
|
645 | - ); |
|
646 | - } |
|
647 | - |
|
648 | - |
|
649 | - |
|
650 | - /** |
|
651 | - * gets the variables used by form_section_validation.js. |
|
652 | - * This needs to be called AFTER we've called $this->_enqueue_jquery_validate_script, |
|
653 | - * but before the wordpress hook wp_loaded |
|
654 | - * |
|
655 | - * @throws \EE_Error |
|
656 | - */ |
|
657 | - public function _enqueue_and_localize_form_js() |
|
658 | - { |
|
659 | - $this->ensure_construct_finalized_called(); |
|
660 | - //actually, we don't want to localize just yet. There may be other forms on the page. |
|
661 | - //so we need to add our form section data to a static variable accessible by all form sections |
|
662 | - //and localize it just before the footer |
|
663 | - $this->localize_validation_rules(); |
|
664 | - add_action('wp_footer', array('EE_Form_Section_Proper', 'localize_script_for_all_forms'), 2); |
|
665 | - add_action('admin_footer', array('EE_Form_Section_Proper', 'localize_script_for_all_forms')); |
|
666 | - } |
|
667 | - |
|
668 | - |
|
669 | - |
|
670 | - /** |
|
671 | - * add our form section data to a static variable accessible by all form sections |
|
672 | - * |
|
673 | - * @param bool $return_for_subsection |
|
674 | - * @return void |
|
675 | - * @throws \EE_Error |
|
676 | - */ |
|
677 | - public function localize_validation_rules($return_for_subsection = false) |
|
678 | - { |
|
679 | - // we only want to localize vars ONCE for the entire form, |
|
680 | - // so if the form section doesn't have a parent, then it must be the top dog |
|
681 | - if ($return_for_subsection || ! $this->parent_section()) { |
|
682 | - EE_Form_Section_Proper::$_js_localization['form_data'][$this->html_id()] = array( |
|
683 | - 'form_section_id' => $this->html_id(true), |
|
684 | - 'validation_rules' => $this->get_jquery_validation_rules(), |
|
685 | - 'other_data' => $this->get_other_js_data(), |
|
686 | - 'errors' => $this->subsection_validation_errors_by_html_name(), |
|
687 | - ); |
|
688 | - EE_Form_Section_Proper::$_scripts_localized = true; |
|
689 | - } |
|
690 | - } |
|
691 | - |
|
692 | - |
|
693 | - |
|
694 | - /** |
|
695 | - * Gets an array of extra data that will be useful for client-side javascript. |
|
696 | - * This is primarily data added by inputs and forms in addition to any |
|
697 | - * scripts they might enqueue |
|
698 | - * |
|
699 | - * @param array $form_other_js_data |
|
700 | - * @return array |
|
701 | - */ |
|
702 | - public function get_other_js_data($form_other_js_data = array()) |
|
703 | - { |
|
704 | - foreach ($this->subsections() as $subsection) { |
|
705 | - $form_other_js_data = $subsection->get_other_js_data($form_other_js_data); |
|
706 | - } |
|
707 | - return $form_other_js_data; |
|
708 | - } |
|
709 | - |
|
710 | - |
|
711 | - |
|
712 | - /** |
|
713 | - * Gets a flat array of inputs for this form section and its subsections. |
|
714 | - * Keys are their form names, and values are the inputs themselves |
|
715 | - * |
|
716 | - * @return EE_Form_Input_Base |
|
717 | - */ |
|
718 | - public function inputs_in_subsections() |
|
719 | - { |
|
720 | - $inputs = array(); |
|
721 | - foreach ($this->subsections() as $subsection) { |
|
722 | - if ($subsection instanceof EE_Form_Input_Base) { |
|
723 | - $inputs[$subsection->html_name()] = $subsection; |
|
724 | - } elseif ($subsection instanceof EE_Form_Section_Proper) { |
|
725 | - $inputs += $subsection->inputs_in_subsections(); |
|
726 | - } |
|
727 | - } |
|
728 | - return $inputs; |
|
729 | - } |
|
730 | - |
|
731 | - |
|
732 | - |
|
733 | - /** |
|
734 | - * Gets a flat array of all the validation errors. |
|
735 | - * Keys are html names (because those should be unique) |
|
736 | - * and values are a string of all their validation errors |
|
737 | - * |
|
738 | - * @return string[] |
|
739 | - */ |
|
740 | - public function subsection_validation_errors_by_html_name() |
|
741 | - { |
|
742 | - $inputs = $this->inputs(); |
|
743 | - $errors = array(); |
|
744 | - foreach ($inputs as $form_input) { |
|
745 | - if ($form_input instanceof EE_Form_Input_Base && $form_input->get_validation_errors()) { |
|
746 | - $errors[$form_input->html_name()] = $form_input->get_validation_error_string(); |
|
747 | - } |
|
748 | - } |
|
749 | - return $errors; |
|
750 | - } |
|
751 | - |
|
752 | - |
|
753 | - |
|
754 | - /** |
|
755 | - * passes all the form data required by the JS to the JS, and enqueues the few required JS files. |
|
756 | - * Should be setup by each form during the _enqueues_and_localize_form_js |
|
757 | - */ |
|
758 | - public static function localize_script_for_all_forms() |
|
759 | - { |
|
760 | - //allow inputs and stuff to hook in their JS and stuff here |
|
761 | - do_action('AHEE__EE_Form_Section_Proper__localize_script_for_all_forms__begin'); |
|
762 | - EE_Form_Section_Proper::$_js_localization['localized_error_messages'] = EE_Form_Section_Proper::_get_localized_error_messages(); |
|
763 | - $email_validation_level = isset(EE_Registry::instance()->CFG->registration->email_validation_level) |
|
764 | - ? EE_Registry::instance()->CFG->registration->email_validation_level |
|
765 | - : 'wp_default'; |
|
766 | - EE_Form_Section_Proper::$_js_localization['email_validation_level'] = $email_validation_level; |
|
767 | - wp_enqueue_script('ee_form_section_validation'); |
|
768 | - wp_localize_script( |
|
769 | - 'ee_form_section_validation', |
|
770 | - 'ee_form_section_vars', |
|
771 | - EE_Form_Section_Proper::$_js_localization |
|
772 | - ); |
|
773 | - } |
|
774 | - |
|
775 | - |
|
776 | - |
|
777 | - /** |
|
778 | - * ensure_scripts_localized |
|
779 | - */ |
|
780 | - public function ensure_scripts_localized() |
|
781 | - { |
|
782 | - if (! EE_Form_Section_Proper::$_scripts_localized) { |
|
783 | - $this->_enqueue_and_localize_form_js(); |
|
784 | - } |
|
785 | - } |
|
786 | - |
|
787 | - |
|
788 | - |
|
789 | - /** |
|
790 | - * Gets the hard-coded validation error messages to be used in the JS. The convention |
|
791 | - * is that the key here should be the same as the custom validation rule put in the JS file |
|
792 | - * |
|
793 | - * @return array keys are custom validation rules, and values are internationalized strings |
|
794 | - */ |
|
795 | - private static function _get_localized_error_messages() |
|
796 | - { |
|
797 | - return array( |
|
798 | - 'validUrl' => __("This is not a valid absolute URL. Eg, http://domain.com/monkey.jpg", "event_espresso"), |
|
799 | - 'regex' => __('Please check your input', 'event_espresso'), |
|
800 | - ); |
|
801 | - } |
|
802 | - |
|
803 | - |
|
804 | - |
|
805 | - /** |
|
806 | - * @return array |
|
807 | - */ |
|
808 | - public static function js_localization() |
|
809 | - { |
|
810 | - return self::$_js_localization; |
|
811 | - } |
|
812 | - |
|
813 | - |
|
814 | - |
|
815 | - /** |
|
816 | - * @return array |
|
817 | - */ |
|
818 | - public static function reset_js_localization() |
|
819 | - { |
|
820 | - self::$_js_localization = array(); |
|
821 | - } |
|
822 | - |
|
823 | - |
|
824 | - |
|
825 | - /** |
|
826 | - * Gets the JS to put inside the jquery validation rules for subsection of this form section. |
|
827 | - * See parent function for more... |
|
828 | - * |
|
829 | - * @return array |
|
830 | - */ |
|
831 | - public function get_jquery_validation_rules() |
|
832 | - { |
|
833 | - $jquery_validation_rules = array(); |
|
834 | - foreach ($this->get_validatable_subsections() as $subsection) { |
|
835 | - $jquery_validation_rules = array_merge( |
|
836 | - $jquery_validation_rules, |
|
837 | - $subsection->get_jquery_validation_rules() |
|
838 | - ); |
|
839 | - } |
|
840 | - return $jquery_validation_rules; |
|
841 | - } |
|
842 | - |
|
843 | - |
|
844 | - |
|
845 | - /** |
|
846 | - * Sanitizes all the data and sets the sanitized value of each field |
|
847 | - * |
|
848 | - * @param array $req_data like $_POST |
|
849 | - * @return void |
|
850 | - */ |
|
851 | - protected function _normalize($req_data) |
|
852 | - { |
|
853 | - $this->_received_submission = true; |
|
854 | - $this->_validation_errors = array(); |
|
855 | - foreach ($this->get_validatable_subsections() as $subsection) { |
|
856 | - try { |
|
857 | - $subsection->_normalize($req_data); |
|
858 | - } catch (EE_Validation_Error $e) { |
|
859 | - $subsection->add_validation_error($e); |
|
860 | - } |
|
861 | - } |
|
862 | - } |
|
863 | - |
|
864 | - |
|
865 | - |
|
866 | - /** |
|
867 | - * Performs validation on this form section and its subsections. |
|
868 | - * For each subsection, |
|
869 | - * calls _validate_{subsection_name} on THIS form (if the function exists) |
|
870 | - * and passes it the subsection, then calls _validate on that subsection. |
|
871 | - * If you need to perform validation on the form as a whole (considering multiple) |
|
872 | - * you would be best to override this _validate method, |
|
873 | - * calling parent::_validate() first. |
|
874 | - */ |
|
875 | - protected function _validate() |
|
876 | - { |
|
877 | - foreach ($this->get_validatable_subsections() as $subsection_name => $subsection) { |
|
878 | - if (method_exists($this, '_validate_' . $subsection_name)) { |
|
879 | - call_user_func_array(array($this, '_validate_' . $subsection_name), array($subsection)); |
|
880 | - } |
|
881 | - $subsection->_validate(); |
|
882 | - } |
|
883 | - } |
|
884 | - |
|
885 | - |
|
886 | - |
|
887 | - /** |
|
888 | - * Gets all the validated inputs for the form section |
|
889 | - * |
|
890 | - * @return array |
|
891 | - */ |
|
892 | - public function valid_data() |
|
893 | - { |
|
894 | - $inputs = array(); |
|
895 | - foreach ($this->subsections() as $subsection_name => $subsection) { |
|
896 | - if ($subsection instanceof EE_Form_Section_Proper) { |
|
897 | - $inputs[$subsection_name] = $subsection->valid_data(); |
|
898 | - } else if ($subsection instanceof EE_Form_Input_Base) { |
|
899 | - $inputs[$subsection_name] = $subsection->normalized_value(); |
|
900 | - } |
|
901 | - } |
|
902 | - return $inputs; |
|
903 | - } |
|
904 | - |
|
905 | - |
|
906 | - |
|
907 | - /** |
|
908 | - * Gets all the inputs on this form section |
|
909 | - * |
|
910 | - * @return EE_Form_Input_Base[] |
|
911 | - */ |
|
912 | - public function inputs() |
|
913 | - { |
|
914 | - $inputs = array(); |
|
915 | - foreach ($this->subsections() as $subsection_name => $subsection) { |
|
916 | - if ($subsection instanceof EE_Form_Input_Base) { |
|
917 | - $inputs[$subsection_name] = $subsection; |
|
918 | - } |
|
919 | - } |
|
920 | - return $inputs; |
|
921 | - } |
|
922 | - |
|
923 | - |
|
924 | - |
|
925 | - /** |
|
926 | - * Gets all the subsections which are a proper form |
|
927 | - * |
|
928 | - * @return EE_Form_Section_Proper[] |
|
929 | - */ |
|
930 | - public function subforms() |
|
931 | - { |
|
932 | - $form_sections = array(); |
|
933 | - foreach ($this->subsections() as $name => $obj) { |
|
934 | - if ($obj instanceof EE_Form_Section_Proper) { |
|
935 | - $form_sections[$name] = $obj; |
|
936 | - } |
|
937 | - } |
|
938 | - return $form_sections; |
|
939 | - } |
|
940 | - |
|
941 | - |
|
942 | - |
|
943 | - /** |
|
944 | - * Gets all the subsections (inputs, proper subsections, or html-only sections). |
|
945 | - * Consider using inputs() or subforms() |
|
946 | - * if you only want form inputs or proper form sections. |
|
947 | - * |
|
948 | - * @param boolean $require_construction_to_be_finalized most client code should |
|
949 | - * leave this as TRUE so that the inputs will be properly |
|
950 | - * configured. However, some client code may be ok with |
|
951 | - * construction finalize being called later |
|
952 | - * (realizing that the subsections' html names might not be |
|
953 | - * set yet, etc.) |
|
954 | - * @return EE_Form_Section_Proper[] |
|
955 | - */ |
|
956 | - public function subsections($require_construction_to_be_finalized = true) |
|
957 | - { |
|
958 | - if ($require_construction_to_be_finalized) { |
|
959 | - $this->ensure_construct_finalized_called(); |
|
960 | - } |
|
961 | - return $this->_subsections; |
|
962 | - } |
|
963 | - |
|
964 | - |
|
965 | - |
|
966 | - /** |
|
967 | - * Returns a simple array where keys are input names, and values are their normalized |
|
968 | - * values. (Similar to calling get_input_value on inputs) |
|
969 | - * |
|
970 | - * @param boolean $include_subform_inputs Whether to include inputs from subforms, |
|
971 | - * or just this forms' direct children inputs |
|
972 | - * @param boolean $flatten Whether to force the results into 1-dimensional array, |
|
973 | - * or allow multidimensional array |
|
974 | - * @return array if $flatten is TRUE it will always be a 1-dimensional array |
|
975 | - * with array keys being input names |
|
976 | - * (regardless of whether they are from a subsection or not), |
|
977 | - * and if $flatten is FALSE it can be a multidimensional array |
|
978 | - * where keys are always subsection names and values are either |
|
979 | - * the input's normalized value, or an array like the top-level array |
|
980 | - */ |
|
981 | - public function input_values($include_subform_inputs = false, $flatten = false) |
|
982 | - { |
|
983 | - return $this->_input_values(false, $include_subform_inputs, $flatten); |
|
984 | - } |
|
985 | - |
|
986 | - |
|
987 | - |
|
988 | - /** |
|
989 | - * Similar to EE_Form_Section_Proper::input_values(), except this returns the 'display_value' |
|
990 | - * of each input. On some inputs (especially radio boxes or checkboxes), the value stored |
|
991 | - * is not necessarily the value we want to display to users. This creates an array |
|
992 | - * where keys are the input names, and values are their display values |
|
993 | - * |
|
994 | - * @param boolean $include_subform_inputs Whether to include inputs from subforms, |
|
995 | - * or just this forms' direct children inputs |
|
996 | - * @param boolean $flatten Whether to force the results into 1-dimensional array, |
|
997 | - * or allow multidimensional array |
|
998 | - * @return array if $flatten is TRUE it will always be a 1-dimensional array |
|
999 | - * with array keys being input names |
|
1000 | - * (regardless of whether they are from a subsection or not), |
|
1001 | - * and if $flatten is FALSE it can be a multidimensional array |
|
1002 | - * where keys are always subsection names and values are either |
|
1003 | - * the input's normalized value, or an array like the top-level array |
|
1004 | - */ |
|
1005 | - public function input_pretty_values($include_subform_inputs = false, $flatten = false) |
|
1006 | - { |
|
1007 | - return $this->_input_values(true, $include_subform_inputs, $flatten); |
|
1008 | - } |
|
1009 | - |
|
1010 | - |
|
1011 | - |
|
1012 | - /** |
|
1013 | - * Gets the input values from the form |
|
1014 | - * |
|
1015 | - * @param boolean $pretty Whether to retrieve the pretty value, |
|
1016 | - * or just the normalized value |
|
1017 | - * @param boolean $include_subform_inputs Whether to include inputs from subforms, |
|
1018 | - * or just this forms' direct children inputs |
|
1019 | - * @param boolean $flatten Whether to force the results into 1-dimensional array, |
|
1020 | - * or allow multidimensional array |
|
1021 | - * @return array if $flatten is TRUE it will always be a 1-dimensional array with array keys being |
|
1022 | - * input names (regardless of whether they are from a subsection or not), |
|
1023 | - * and if $flatten is FALSE it can be a multidimensional array |
|
1024 | - * where keys are always subsection names and values are either |
|
1025 | - * the input's normalized value, or an array like the top-level array |
|
1026 | - */ |
|
1027 | - public function _input_values($pretty = false, $include_subform_inputs = false, $flatten = false) |
|
1028 | - { |
|
1029 | - $input_values = array(); |
|
1030 | - foreach ($this->subsections() as $subsection_name => $subsection) { |
|
1031 | - if ($subsection instanceof EE_Form_Input_Base) { |
|
1032 | - $input_values[$subsection_name] = $pretty |
|
1033 | - ? $subsection->pretty_value() |
|
1034 | - : $subsection->normalized_value(); |
|
1035 | - } else if ($subsection instanceof EE_Form_Section_Proper && $include_subform_inputs) { |
|
1036 | - $subform_input_values = $subsection->_input_values($pretty, $include_subform_inputs, $flatten); |
|
1037 | - if ($flatten) { |
|
1038 | - $input_values = array_merge($input_values, $subform_input_values); |
|
1039 | - } else { |
|
1040 | - $input_values[$subsection_name] = $subform_input_values; |
|
1041 | - } |
|
1042 | - } |
|
1043 | - } |
|
1044 | - return $input_values; |
|
1045 | - } |
|
1046 | - |
|
1047 | - |
|
1048 | - |
|
1049 | - /** |
|
1050 | - * Gets the originally submitted input values from the form |
|
1051 | - * |
|
1052 | - * @param boolean $include_subforms Whether to include inputs from subforms, |
|
1053 | - * or just this forms' direct children inputs |
|
1054 | - * @return array if $flatten is TRUE it will always be a 1-dimensional array |
|
1055 | - * with array keys being input names |
|
1056 | - * (regardless of whether they are from a subsection or not), |
|
1057 | - * and if $flatten is FALSE it can be a multidimensional array |
|
1058 | - * where keys are always subsection names and values are either |
|
1059 | - * the input's normalized value, or an array like the top-level array |
|
1060 | - */ |
|
1061 | - public function submitted_values($include_subforms = false) |
|
1062 | - { |
|
1063 | - $submitted_values = array(); |
|
1064 | - foreach ($this->subsections() as $subsection) { |
|
1065 | - if ($subsection instanceof EE_Form_Input_Base) { |
|
1066 | - // is this input part of an array of inputs? |
|
1067 | - if (strpos($subsection->html_name(), '[') !== false) { |
|
1068 | - $full_input_name = \EEH_Array::convert_array_values_to_keys( |
|
1069 | - explode('[', str_replace(']', '', $subsection->html_name())), |
|
1070 | - $subsection->raw_value() |
|
1071 | - ); |
|
1072 | - $submitted_values = array_replace_recursive($submitted_values, $full_input_name); |
|
1073 | - } else { |
|
1074 | - $submitted_values[$subsection->html_name()] = $subsection->raw_value(); |
|
1075 | - } |
|
1076 | - } else if ($subsection instanceof EE_Form_Section_Proper && $include_subforms) { |
|
1077 | - $subform_input_values = $subsection->submitted_values($include_subforms); |
|
1078 | - $submitted_values = array_replace_recursive($submitted_values, $subform_input_values); |
|
1079 | - } |
|
1080 | - } |
|
1081 | - return $submitted_values; |
|
1082 | - } |
|
1083 | - |
|
1084 | - |
|
1085 | - |
|
1086 | - /** |
|
1087 | - * Indicates whether or not this form has received a submission yet |
|
1088 | - * (ie, had receive_form_submission called on it yet) |
|
1089 | - * |
|
1090 | - * @return boolean |
|
1091 | - * @throws \EE_Error |
|
1092 | - */ |
|
1093 | - public function has_received_submission() |
|
1094 | - { |
|
1095 | - $this->ensure_construct_finalized_called(); |
|
1096 | - return $this->_received_submission; |
|
1097 | - } |
|
1098 | - |
|
1099 | - |
|
1100 | - |
|
1101 | - /** |
|
1102 | - * Equivalent to passing 'exclude' in the constructor's options array. |
|
1103 | - * Removes the listed inputs from the form |
|
1104 | - * |
|
1105 | - * @param array $inputs_to_exclude values are the input names |
|
1106 | - * @return void |
|
1107 | - */ |
|
1108 | - public function exclude(array $inputs_to_exclude = array()) |
|
1109 | - { |
|
1110 | - foreach ($inputs_to_exclude as $input_to_exclude_name) { |
|
1111 | - unset($this->_subsections[$input_to_exclude_name]); |
|
1112 | - } |
|
1113 | - } |
|
1114 | - |
|
1115 | - |
|
1116 | - |
|
1117 | - /** |
|
1118 | - * @param array $inputs_to_hide |
|
1119 | - * @throws \EE_Error |
|
1120 | - */ |
|
1121 | - public function hide(array $inputs_to_hide = array()) |
|
1122 | - { |
|
1123 | - foreach ($inputs_to_hide as $input_to_hide) { |
|
1124 | - $input = $this->get_input($input_to_hide); |
|
1125 | - $input->set_display_strategy(new EE_Hidden_Display_Strategy()); |
|
1126 | - } |
|
1127 | - } |
|
1128 | - |
|
1129 | - |
|
1130 | - |
|
1131 | - /** |
|
1132 | - * add_subsections |
|
1133 | - * Adds the listed subsections to the form section. |
|
1134 | - * If $subsection_name_to_target is provided, |
|
1135 | - * then new subsections are added before or after that subsection, |
|
1136 | - * otherwise to the start or end of the entire subsections array. |
|
1137 | - * |
|
1138 | - * @param EE_Form_Section_Base[] $new_subsections array of new form subsections |
|
1139 | - * where keys are their names |
|
1140 | - * @param string $subsection_name_to_target an existing for section that $new_subsections |
|
1141 | - * should be added before or after |
|
1142 | - * IF $subsection_name_to_target is null, |
|
1143 | - * then $new_subsections will be added to |
|
1144 | - * the beginning or end of the entire subsections array |
|
1145 | - * @param boolean $add_before whether to add $new_subsections, before or after |
|
1146 | - * $subsection_name_to_target, |
|
1147 | - * or if $subsection_name_to_target is null, |
|
1148 | - * before or after entire subsections array |
|
1149 | - * @return void |
|
1150 | - * @throws \EE_Error |
|
1151 | - */ |
|
1152 | - public function add_subsections($new_subsections, $subsection_name_to_target = null, $add_before = true) |
|
1153 | - { |
|
1154 | - foreach ($new_subsections as $subsection_name => $subsection) { |
|
1155 | - if (! $subsection instanceof EE_Form_Section_Base) { |
|
1156 | - EE_Error::add_error( |
|
1157 | - sprintf( |
|
1158 | - __( |
|
1159 | - "Trying to add a %s as a subsection (it was named '%s') to the form section '%s'. It was removed.", |
|
1160 | - "event_espresso" |
|
1161 | - ), |
|
1162 | - get_class($subsection), |
|
1163 | - $subsection_name, |
|
1164 | - $this->name() |
|
1165 | - ) |
|
1166 | - ); |
|
1167 | - unset($new_subsections[$subsection_name]); |
|
1168 | - } |
|
1169 | - } |
|
1170 | - $this->_subsections = EEH_Array::insert_into_array( |
|
1171 | - $this->_subsections, |
|
1172 | - $new_subsections, |
|
1173 | - $subsection_name_to_target, |
|
1174 | - $add_before |
|
1175 | - ); |
|
1176 | - if ($this->_construction_finalized) { |
|
1177 | - foreach ($this->_subsections as $name => $subsection) { |
|
1178 | - $subsection->_construct_finalize($this, $name); |
|
1179 | - } |
|
1180 | - } |
|
1181 | - } |
|
1182 | - |
|
1183 | - |
|
1184 | - |
|
1185 | - /** |
|
1186 | - * Just gets all validatable subsections to clean their sensitive data |
|
1187 | - */ |
|
1188 | - public function clean_sensitive_data() |
|
1189 | - { |
|
1190 | - foreach ($this->get_validatable_subsections() as $subsection) { |
|
1191 | - $subsection->clean_sensitive_data(); |
|
1192 | - } |
|
1193 | - } |
|
1194 | - |
|
1195 | - |
|
1196 | - |
|
1197 | - /** |
|
1198 | - * @param string $form_submission_error_message |
|
1199 | - */ |
|
1200 | - public function set_submission_error_message($form_submission_error_message = '') |
|
1201 | - { |
|
1202 | - $this->_form_submission_error_message .= ! empty($form_submission_error_message) |
|
1203 | - ? $form_submission_error_message |
|
1204 | - : __('Form submission failed due to errors', 'event_espresso'); |
|
1205 | - } |
|
1206 | - |
|
1207 | - |
|
1208 | - |
|
1209 | - /** |
|
1210 | - * @return string |
|
1211 | - */ |
|
1212 | - public function submission_error_message() |
|
1213 | - { |
|
1214 | - return $this->_form_submission_error_message; |
|
1215 | - } |
|
1216 | - |
|
1217 | - |
|
1218 | - |
|
1219 | - /** |
|
1220 | - * @param string $form_submission_success_message |
|
1221 | - */ |
|
1222 | - public function set_submission_success_message($form_submission_success_message) |
|
1223 | - { |
|
1224 | - $this->_form_submission_success_message .= ! empty($form_submission_success_message) |
|
1225 | - ? $form_submission_success_message |
|
1226 | - : __('Form submitted successfully', 'event_espresso'); |
|
1227 | - } |
|
1228 | - |
|
1229 | - |
|
1230 | - |
|
1231 | - /** |
|
1232 | - * @return string |
|
1233 | - */ |
|
1234 | - public function submission_success_message() |
|
1235 | - { |
|
1236 | - return $this->_form_submission_success_message; |
|
1237 | - } |
|
1238 | - |
|
1239 | - |
|
1240 | - |
|
1241 | - /** |
|
1242 | - * Returns the prefix that should be used on child of this form section for |
|
1243 | - * their html names. If this form section itself has a parent, prepends ITS |
|
1244 | - * prefix onto this form section's prefix. Used primarily by |
|
1245 | - * EE_Form_Input_Base::_set_default_html_name_if_empty |
|
1246 | - * |
|
1247 | - * @return string |
|
1248 | - * @throws \EE_Error |
|
1249 | - */ |
|
1250 | - public function html_name_prefix() |
|
1251 | - { |
|
1252 | - if ($this->parent_section() instanceof EE_Form_Section_Proper) { |
|
1253 | - return $this->parent_section()->html_name_prefix() . '[' . $this->name() . ']'; |
|
1254 | - } else { |
|
1255 | - return $this->name(); |
|
1256 | - } |
|
1257 | - } |
|
1258 | - |
|
1259 | - |
|
1260 | - |
|
1261 | - /** |
|
1262 | - * Gets the name, but first checks _construct_finalize has been called. If not, |
|
1263 | - * calls it (assumes there is no parent and that we want the name to be whatever |
|
1264 | - * was set, which is probably nothing, or the classname) |
|
1265 | - * |
|
1266 | - * @return string |
|
1267 | - * @throws \EE_Error |
|
1268 | - */ |
|
1269 | - public function name() |
|
1270 | - { |
|
1271 | - $this->ensure_construct_finalized_called(); |
|
1272 | - return parent::name(); |
|
1273 | - } |
|
1274 | - |
|
1275 | - |
|
1276 | - |
|
1277 | - /** |
|
1278 | - * @return EE_Form_Section_Proper |
|
1279 | - * @throws \EE_Error |
|
1280 | - */ |
|
1281 | - public function parent_section() |
|
1282 | - { |
|
1283 | - $this->ensure_construct_finalized_called(); |
|
1284 | - return parent::parent_section(); |
|
1285 | - } |
|
1286 | - |
|
1287 | - |
|
1288 | - |
|
1289 | - /** |
|
1290 | - * make sure construction finalized was called, otherwise children might not be ready |
|
1291 | - * |
|
1292 | - * @return void |
|
1293 | - * @throws \EE_Error |
|
1294 | - */ |
|
1295 | - public function ensure_construct_finalized_called() |
|
1296 | - { |
|
1297 | - if (! $this->_construction_finalized) { |
|
1298 | - $this->_construct_finalize($this->_parent_section, $this->_name); |
|
1299 | - } |
|
1300 | - } |
|
1301 | - |
|
1302 | - |
|
1303 | - |
|
1304 | - /** |
|
1305 | - * Checks if any of this form section's inputs, or any of its children's inputs, |
|
1306 | - * are in teh form data. If any are found, returns true. Else false |
|
1307 | - * |
|
1308 | - * @param array $req_data |
|
1309 | - * @return boolean |
|
1310 | - */ |
|
1311 | - public function form_data_present_in($req_data = null) |
|
1312 | - { |
|
1313 | - if ($req_data === null) { |
|
1314 | - $req_data = $_POST; |
|
1315 | - } |
|
1316 | - foreach ($this->subsections() as $subsection) { |
|
1317 | - if ($subsection instanceof EE_Form_Input_Base) { |
|
1318 | - if ($subsection->form_data_present_in($req_data)) { |
|
1319 | - return true; |
|
1320 | - } |
|
1321 | - } elseif ($subsection instanceof EE_Form_Section_Proper) { |
|
1322 | - if ($subsection->form_data_present_in($req_data)) { |
|
1323 | - return true; |
|
1324 | - } |
|
1325 | - } |
|
1326 | - } |
|
1327 | - return false; |
|
1328 | - } |
|
1329 | - |
|
1330 | - |
|
1331 | - |
|
1332 | - /** |
|
1333 | - * Gets validation errors for this form section and subsections |
|
1334 | - * Similar to EE_Form_Section_Validatable::get_validation_errors() except this |
|
1335 | - * gets the validation errors for ALL subsection |
|
1336 | - * |
|
1337 | - * @return EE_Validation_Error[] |
|
1338 | - */ |
|
1339 | - public function get_validation_errors_accumulated() |
|
1340 | - { |
|
1341 | - $validation_errors = $this->get_validation_errors(); |
|
1342 | - foreach ($this->get_validatable_subsections() as $subsection) { |
|
1343 | - if ($subsection instanceof EE_Form_Section_Proper) { |
|
1344 | - $validation_errors_on_this_subsection = $subsection->get_validation_errors_accumulated(); |
|
1345 | - } else { |
|
1346 | - $validation_errors_on_this_subsection = $subsection->get_validation_errors(); |
|
1347 | - } |
|
1348 | - if ($validation_errors_on_this_subsection) { |
|
1349 | - $validation_errors = array_merge($validation_errors, $validation_errors_on_this_subsection); |
|
1350 | - } |
|
1351 | - } |
|
1352 | - return $validation_errors; |
|
1353 | - } |
|
1354 | - |
|
1355 | - |
|
1356 | - |
|
1357 | - /** |
|
1358 | - * This isn't just the name of an input, it's a path pointing to an input. The |
|
1359 | - * path is similar to a folder path: slash (/) means to descend into a subsection, |
|
1360 | - * dot-dot-slash (../) means to ascend into the parent section. |
|
1361 | - * After a series of slashes and dot-dot-slashes, there should be the name of an input, |
|
1362 | - * which will be returned. |
|
1363 | - * Eg, if you want the related input to be conditional on a sibling input name 'foobar' |
|
1364 | - * just use 'foobar'. If you want it to be conditional on an aunt/uncle input name |
|
1365 | - * 'baz', use '../baz'. If you want it to be conditional on a cousin input, |
|
1366 | - * the child of 'baz_section' named 'baz_child', use '../baz_section/baz_child'. |
|
1367 | - * Etc |
|
1368 | - * |
|
1369 | - * @param string|false $form_section_path we accept false also because substr( '../', '../' ) = false |
|
1370 | - * @return EE_Form_Section_Base |
|
1371 | - */ |
|
1372 | - public function find_section_from_path($form_section_path) |
|
1373 | - { |
|
1374 | - //check if we can find the input from purely going straight up the tree |
|
1375 | - $input = parent::find_section_from_path($form_section_path); |
|
1376 | - if ($input instanceof EE_Form_Section_Base) { |
|
1377 | - return $input; |
|
1378 | - } |
|
1379 | - $next_slash_pos = strpos($form_section_path, '/'); |
|
1380 | - if ($next_slash_pos !== false) { |
|
1381 | - $child_section_name = substr($form_section_path, 0, $next_slash_pos); |
|
1382 | - $subpath = substr($form_section_path, $next_slash_pos + 1); |
|
1383 | - } else { |
|
1384 | - $child_section_name = $form_section_path; |
|
1385 | - $subpath = ''; |
|
1386 | - } |
|
1387 | - $child_section = $this->get_subsection($child_section_name); |
|
1388 | - if ($child_section instanceof EE_Form_Section_Base) { |
|
1389 | - return $child_section->find_section_from_path($subpath); |
|
1390 | - } else { |
|
1391 | - return null; |
|
1392 | - } |
|
1393 | - } |
|
14 | + const SUBMITTED_FORM_DATA_SSN_KEY = 'submitted_form_data'; |
|
15 | + |
|
16 | + /** |
|
17 | + * Subsections |
|
18 | + * |
|
19 | + * @var EE_Form_Section_Validatable[] |
|
20 | + */ |
|
21 | + protected $_subsections = array(); |
|
22 | + |
|
23 | + /** |
|
24 | + * Strategy for laying out the form |
|
25 | + * |
|
26 | + * @var EE_Form_Section_Layout_Base |
|
27 | + */ |
|
28 | + protected $_layout_strategy; |
|
29 | + |
|
30 | + /** |
|
31 | + * Whether or not this form has received and validated a form submission yet |
|
32 | + * |
|
33 | + * @var boolean |
|
34 | + */ |
|
35 | + protected $_received_submission = false; |
|
36 | + |
|
37 | + /** |
|
38 | + * message displayed to users upon successful form submission |
|
39 | + * |
|
40 | + * @var string |
|
41 | + */ |
|
42 | + protected $_form_submission_success_message = ''; |
|
43 | + |
|
44 | + /** |
|
45 | + * message displayed to users upon unsuccessful form submission |
|
46 | + * |
|
47 | + * @var string |
|
48 | + */ |
|
49 | + protected $_form_submission_error_message = ''; |
|
50 | + |
|
51 | + /** |
|
52 | + * Stores all the data that will localized for form validation |
|
53 | + * |
|
54 | + * @var array |
|
55 | + */ |
|
56 | + static protected $_js_localization = array(); |
|
57 | + |
|
58 | + /** |
|
59 | + * whether or not the form's localized validation JS vars have been set |
|
60 | + * |
|
61 | + * @type boolean |
|
62 | + */ |
|
63 | + static protected $_scripts_localized = false; |
|
64 | + |
|
65 | + |
|
66 | + |
|
67 | + /** |
|
68 | + * when constructing a proper form section, calls _construct_finalize on children |
|
69 | + * so that they know who their parent is, and what name they've been given. |
|
70 | + * |
|
71 | + * @param array $options_array { |
|
72 | + * @type $subsections EE_Form_Section_Validatable[] where keys are the section's name |
|
73 | + * @type $include string[] numerically-indexed where values are section names to be included, |
|
74 | + * and in that order. This is handy if you want |
|
75 | + * the subsections to be ordered differently than the default, and if you override |
|
76 | + * which fields are shown |
|
77 | + * @type $exclude string[] values are subsections to be excluded. This is handy if you want |
|
78 | + * to remove certain default subsections (note: if you specify BOTH 'include' AND |
|
79 | + * 'exclude', the inclusions will be applied first, and the exclusions will exclude |
|
80 | + * items from that list of inclusions) |
|
81 | + * @type $layout_strategy EE_Form_Section_Layout_Base strategy for laying out the form |
|
82 | + * } @see EE_Form_Section_Validatable::__construct() |
|
83 | + * @throws \EE_Error |
|
84 | + */ |
|
85 | + public function __construct($options_array = array()) |
|
86 | + { |
|
87 | + $options_array = (array)apply_filters('FHEE__EE_Form_Section_Proper___construct__options_array', $options_array, |
|
88 | + $this); |
|
89 | + //call parent first, as it may be setting the name |
|
90 | + parent::__construct($options_array); |
|
91 | + //if they've included subsections in the constructor, add them now |
|
92 | + if (isset($options_array['include'])) { |
|
93 | + //we are going to make sure we ONLY have those subsections to include |
|
94 | + //AND we are going to make sure they're in that specified order |
|
95 | + $reordered_subsections = array(); |
|
96 | + foreach ($options_array['include'] as $input_name) { |
|
97 | + if (isset($this->_subsections[$input_name])) { |
|
98 | + $reordered_subsections[$input_name] = $this->_subsections[$input_name]; |
|
99 | + } |
|
100 | + } |
|
101 | + $this->_subsections = $reordered_subsections; |
|
102 | + } |
|
103 | + if (isset($options_array['exclude'])) { |
|
104 | + $exclude = $options_array['exclude']; |
|
105 | + $this->_subsections = array_diff_key($this->_subsections, array_flip($exclude)); |
|
106 | + } |
|
107 | + if (isset($options_array['layout_strategy'])) { |
|
108 | + $this->_layout_strategy = $options_array['layout_strategy']; |
|
109 | + } |
|
110 | + if (! $this->_layout_strategy) { |
|
111 | + $this->_layout_strategy = is_admin() ? new EE_Admin_Two_Column_Layout() : new EE_Two_Column_Layout(); |
|
112 | + } |
|
113 | + $this->_layout_strategy->_construct_finalize($this); |
|
114 | + //ok so we are definitely going to want the forms JS, |
|
115 | + //so enqueue it or remember to enqueue it during wp_enqueue_scripts |
|
116 | + if (did_action('wp_enqueue_scripts') || did_action('admin_enqueue_scripts')) { |
|
117 | + //ok so they've constructed this object after when they should have. |
|
118 | + //just enqueue the generic form scripts and initialize the form immediately in the JS |
|
119 | + \EE_Form_Section_Proper::wp_enqueue_scripts(true); |
|
120 | + } else { |
|
121 | + add_action('wp_enqueue_scripts', array('EE_Form_Section_Proper', 'wp_enqueue_scripts')); |
|
122 | + add_action('admin_enqueue_scripts', array('EE_Form_Section_Proper', 'wp_enqueue_scripts')); |
|
123 | + } |
|
124 | + add_action('wp_footer', array($this, 'ensure_scripts_localized'), 1); |
|
125 | + |
|
126 | + /** |
|
127 | + * Gives other plugins a chance to hook in before construct finalize is called. The form probably doesn't |
|
128 | + * yet have a parent form section. Since 4.9.32, when this action was introduced, this is the best place to |
|
129 | + * add a subsection onto a form, assuming you don't care what the form section's name, HTML ID, or HTML name etc are. |
|
130 | + * Also see AHEE__EE_Form_Section_Proper___construct_finalize__end |
|
131 | + * @since 4.9.32 |
|
132 | + * @param EE_Form_Section_Proper $this before __construct is done, but all of its logic, except maybe calling |
|
133 | + * _construct_finalize has been done |
|
134 | + * @param array $options_array options passed into the constructor |
|
135 | + */ |
|
136 | + do_action('AHEE__EE_Form_Input_Base___construct__before_construct_finalize_called', $this, $options_array); |
|
137 | + |
|
138 | + if (isset($options_array['name'])) { |
|
139 | + $this->_construct_finalize(null, $options_array['name']); |
|
140 | + } |
|
141 | + } |
|
142 | + |
|
143 | + |
|
144 | + |
|
145 | + /** |
|
146 | + * Finishes construction given the parent form section and this form section's name |
|
147 | + * |
|
148 | + * @param EE_Form_Section_Proper $parent_form_section |
|
149 | + * @param string $name |
|
150 | + * @throws \EE_Error |
|
151 | + */ |
|
152 | + public function _construct_finalize($parent_form_section, $name) |
|
153 | + { |
|
154 | + parent::_construct_finalize($parent_form_section, $name); |
|
155 | + $this->_set_default_name_if_empty(); |
|
156 | + $this->_set_default_html_id_if_empty(); |
|
157 | + foreach ($this->_subsections as $subsection_name => $subsection) { |
|
158 | + if ($subsection instanceof EE_Form_Section_Base) { |
|
159 | + $subsection->_construct_finalize($this, $subsection_name); |
|
160 | + } else { |
|
161 | + throw new EE_Error( |
|
162 | + sprintf( |
|
163 | + __('Subsection "%s" is not an instanceof EE_Form_Section_Base on form "%s". It is a "%s"', |
|
164 | + 'event_espresso'), |
|
165 | + $subsection_name, |
|
166 | + get_class($this), |
|
167 | + $subsection ? get_class($subsection) : __('NULL', 'event_espresso') |
|
168 | + ) |
|
169 | + ); |
|
170 | + } |
|
171 | + } |
|
172 | + /** |
|
173 | + * Action performed just after form has been given a name (and HTML ID etc) and is fully constructed. |
|
174 | + * If you have code that should modify the form and needs it and its subsections to have a name, HTML ID (or other attributes derived |
|
175 | + * from the name like the HTML label id, etc), this is where it should be done. |
|
176 | + * This might only happen just before displaying the form, or just before it receives form submission data. |
|
177 | + * If you need to modify the form or its subsections before _construct_finalize is called on it (and we've |
|
178 | + * ensured it has a name, HTML IDs, etc |
|
179 | + * @param EE_Form_Section_Proper $this |
|
180 | + * @param EE_Form_Section_Proper|null $parent_form_section |
|
181 | + * @param string $name |
|
182 | + */ |
|
183 | + do_action('AHEE__EE_Form_Section_Proper___construct_finalize__end', $this, $parent_form_section, $name); |
|
184 | + } |
|
185 | + |
|
186 | + |
|
187 | + |
|
188 | + /** |
|
189 | + * Gets the layout strategy for this form section |
|
190 | + * |
|
191 | + * @return EE_Form_Section_Layout_Base |
|
192 | + */ |
|
193 | + public function get_layout_strategy() |
|
194 | + { |
|
195 | + return $this->_layout_strategy; |
|
196 | + } |
|
197 | + |
|
198 | + |
|
199 | + |
|
200 | + /** |
|
201 | + * Gets the HTML for a single input for this form section according |
|
202 | + * to the layout strategy |
|
203 | + * |
|
204 | + * @param EE_Form_Input_Base $input |
|
205 | + * @return string |
|
206 | + */ |
|
207 | + public function get_html_for_input($input) |
|
208 | + { |
|
209 | + return $this->_layout_strategy->layout_input($input); |
|
210 | + } |
|
211 | + |
|
212 | + |
|
213 | + |
|
214 | + /** |
|
215 | + * was_submitted - checks if form inputs are present in request data |
|
216 | + * Basically an alias for form_data_present_in() (which is used by both |
|
217 | + * proper form sections and form inputs) |
|
218 | + * |
|
219 | + * @param null $form_data |
|
220 | + * @return boolean |
|
221 | + */ |
|
222 | + public function was_submitted($form_data = null) |
|
223 | + { |
|
224 | + return $this->form_data_present_in($form_data); |
|
225 | + } |
|
226 | + |
|
227 | + |
|
228 | + |
|
229 | + /** |
|
230 | + * After the form section is initially created, call this to sanitize the data in the submission |
|
231 | + * which relates to this form section, validate it, and set it as properties on the form. |
|
232 | + * |
|
233 | + * @param array|null $req_data should usually be $_POST (the default). |
|
234 | + * However, you CAN supply a different array. |
|
235 | + * Consider using set_defaults() instead however. |
|
236 | + * (If you rendered the form in the page using echo $form_x->get_html() |
|
237 | + * the inputs will have the correct name in the request data for this function |
|
238 | + * to find them and populate the form with them. |
|
239 | + * If you have a flat form (with only input subsections), |
|
240 | + * you can supply a flat array where keys |
|
241 | + * are the form input names and values are their values) |
|
242 | + * @param boolean $validate whether or not to perform validation on this data. Default is, |
|
243 | + * of course, to validate that data, and set errors on the invalid values. |
|
244 | + * But if the data has already been validated |
|
245 | + * (eg you validated the data then stored it in the DB) |
|
246 | + * you may want to skip this step. |
|
247 | + */ |
|
248 | + public function receive_form_submission($req_data = null, $validate = true) |
|
249 | + { |
|
250 | + $req_data = apply_filters('FHEE__EE_Form_Section_Proper__receive_form_submission__req_data', $req_data, $this, |
|
251 | + $validate); |
|
252 | + if ($req_data === null) { |
|
253 | + $req_data = array_merge($_GET, $_POST); |
|
254 | + } |
|
255 | + $req_data = apply_filters('FHEE__EE_Form_Section_Proper__receive_form_submission__request_data', $req_data, |
|
256 | + $this); |
|
257 | + $this->_normalize($req_data); |
|
258 | + if ($validate) { |
|
259 | + $this->_validate(); |
|
260 | + //if it's invalid, we're going to want to re-display so remember what they submitted |
|
261 | + if (! $this->is_valid()) { |
|
262 | + $this->store_submitted_form_data_in_session(); |
|
263 | + } |
|
264 | + } |
|
265 | + do_action('AHEE__EE_Form_Section_Proper__receive_form_submission__end', $req_data, $this, $validate); |
|
266 | + } |
|
267 | + |
|
268 | + |
|
269 | + |
|
270 | + /** |
|
271 | + * caches the originally submitted input values in the session |
|
272 | + * so that they can be used to repopulate the form if it failed validation |
|
273 | + * |
|
274 | + * @return boolean whether or not the data was successfully stored in the session |
|
275 | + */ |
|
276 | + protected function store_submitted_form_data_in_session() |
|
277 | + { |
|
278 | + return EE_Registry::instance()->SSN->set_session_data( |
|
279 | + array( |
|
280 | + \EE_Form_Section_Proper::SUBMITTED_FORM_DATA_SSN_KEY => $this->submitted_values(true), |
|
281 | + ) |
|
282 | + ); |
|
283 | + } |
|
284 | + |
|
285 | + |
|
286 | + |
|
287 | + /** |
|
288 | + * retrieves the originally submitted input values in the session |
|
289 | + * so that they can be used to repopulate the form if it failed validation |
|
290 | + * |
|
291 | + * @return array |
|
292 | + */ |
|
293 | + protected function get_submitted_form_data_from_session() |
|
294 | + { |
|
295 | + $session = EE_Registry::instance()->SSN; |
|
296 | + if ($session instanceof EE_Session) { |
|
297 | + return $session->get_session_data( |
|
298 | + \EE_Form_Section_Proper::SUBMITTED_FORM_DATA_SSN_KEY |
|
299 | + ); |
|
300 | + } else { |
|
301 | + return array(); |
|
302 | + } |
|
303 | + } |
|
304 | + |
|
305 | + |
|
306 | + |
|
307 | + /** |
|
308 | + * flushed the originally submitted input values from the session |
|
309 | + * |
|
310 | + * @return boolean whether or not the data was successfully removed from the session |
|
311 | + */ |
|
312 | + protected function flush_submitted_form_data_from_session() |
|
313 | + { |
|
314 | + return EE_Registry::instance()->SSN->reset_data( |
|
315 | + array(\EE_Form_Section_Proper::SUBMITTED_FORM_DATA_SSN_KEY) |
|
316 | + ); |
|
317 | + } |
|
318 | + |
|
319 | + |
|
320 | + |
|
321 | + /** |
|
322 | + * Populates this form and its subsections with data from the session. |
|
323 | + * (Wrapper for EE_Form_Section_Proper::receive_form_submission, so it shows |
|
324 | + * validation errors when displaying too) |
|
325 | + * Returns true if the form was populated from the session, false otherwise |
|
326 | + * |
|
327 | + * @return boolean |
|
328 | + */ |
|
329 | + public function populate_from_session() |
|
330 | + { |
|
331 | + $form_data_in_session = $this->get_submitted_form_data_from_session(); |
|
332 | + if (empty($form_data_in_session)) { |
|
333 | + return false; |
|
334 | + } |
|
335 | + $this->receive_form_submission($form_data_in_session); |
|
336 | + $this->flush_submitted_form_data_from_session(); |
|
337 | + if ($this->form_data_present_in($form_data_in_session)) { |
|
338 | + return true; |
|
339 | + } else { |
|
340 | + return false; |
|
341 | + } |
|
342 | + } |
|
343 | + |
|
344 | + |
|
345 | + |
|
346 | + /** |
|
347 | + * Populates the default data for the form, given an array where keys are |
|
348 | + * the input names, and values are their values (preferably normalized to be their |
|
349 | + * proper PHP types, not all strings... although that should be ok too). |
|
350 | + * Proper subsections are sub-arrays, the key being the subsection's name, and |
|
351 | + * the value being an array formatted in teh same way |
|
352 | + * |
|
353 | + * @param array $default_data |
|
354 | + */ |
|
355 | + public function populate_defaults($default_data) |
|
356 | + { |
|
357 | + foreach ($this->subsections(false) as $subsection_name => $subsection) { |
|
358 | + if (isset($default_data[$subsection_name])) { |
|
359 | + if ($subsection instanceof EE_Form_Input_Base) { |
|
360 | + $subsection->set_default($default_data[$subsection_name]); |
|
361 | + } elseif ($subsection instanceof EE_Form_Section_Proper) { |
|
362 | + $subsection->populate_defaults($default_data[$subsection_name]); |
|
363 | + } |
|
364 | + } |
|
365 | + } |
|
366 | + } |
|
367 | + |
|
368 | + |
|
369 | + |
|
370 | + /** |
|
371 | + * returns true if subsection exists |
|
372 | + * |
|
373 | + * @param string $name |
|
374 | + * @return boolean |
|
375 | + */ |
|
376 | + public function subsection_exists($name) |
|
377 | + { |
|
378 | + return isset($this->_subsections[$name]) ? true : false; |
|
379 | + } |
|
380 | + |
|
381 | + |
|
382 | + |
|
383 | + /** |
|
384 | + * Gets the subsection specified by its name |
|
385 | + * |
|
386 | + * @param string $name |
|
387 | + * @param boolean $require_construction_to_be_finalized most client code should leave this as TRUE |
|
388 | + * so that the inputs will be properly configured. |
|
389 | + * However, some client code may be ok |
|
390 | + * with construction finalize being called later |
|
391 | + * (realizing that the subsections' html names |
|
392 | + * might not be set yet, etc.) |
|
393 | + * @return EE_Form_Section_Base |
|
394 | + * @throws \EE_Error |
|
395 | + */ |
|
396 | + public function get_subsection($name, $require_construction_to_be_finalized = true) |
|
397 | + { |
|
398 | + if ($require_construction_to_be_finalized) { |
|
399 | + $this->ensure_construct_finalized_called(); |
|
400 | + } |
|
401 | + return $this->subsection_exists($name) ? $this->_subsections[$name] : null; |
|
402 | + } |
|
403 | + |
|
404 | + |
|
405 | + |
|
406 | + /** |
|
407 | + * Gets all the validatable subsections of this form section |
|
408 | + * |
|
409 | + * @return EE_Form_Section_Validatable[] |
|
410 | + */ |
|
411 | + public function get_validatable_subsections() |
|
412 | + { |
|
413 | + $validatable_subsections = array(); |
|
414 | + foreach ($this->subsections() as $name => $obj) { |
|
415 | + if ($obj instanceof EE_Form_Section_Validatable) { |
|
416 | + $validatable_subsections[$name] = $obj; |
|
417 | + } |
|
418 | + } |
|
419 | + return $validatable_subsections; |
|
420 | + } |
|
421 | + |
|
422 | + |
|
423 | + |
|
424 | + /** |
|
425 | + * Gets an input by the given name. If not found, or if its not an EE_FOrm_Input_Base child, |
|
426 | + * throw an EE_Error. |
|
427 | + * |
|
428 | + * @param string $name |
|
429 | + * @param boolean $require_construction_to_be_finalized most client code should |
|
430 | + * leave this as TRUE so that the inputs will be properly |
|
431 | + * configured. However, some client code may be ok with |
|
432 | + * construction finalize being called later |
|
433 | + * (realizing that the subsections' html names might not be |
|
434 | + * set yet, etc.) |
|
435 | + * @return EE_Form_Input_Base |
|
436 | + * @throws EE_Error |
|
437 | + */ |
|
438 | + public function get_input($name, $require_construction_to_be_finalized = true) |
|
439 | + { |
|
440 | + $subsection = $this->get_subsection($name, $require_construction_to_be_finalized); |
|
441 | + if (! $subsection instanceof EE_Form_Input_Base) { |
|
442 | + throw new EE_Error( |
|
443 | + sprintf( |
|
444 | + __( |
|
445 | + "Subsection '%s' is not an instanceof EE_Form_Input_Base on form '%s'. It is a '%s'", |
|
446 | + 'event_espresso' |
|
447 | + ), |
|
448 | + $name, |
|
449 | + get_class($this), |
|
450 | + $subsection ? get_class($subsection) : __("NULL", 'event_espresso') |
|
451 | + ) |
|
452 | + ); |
|
453 | + } |
|
454 | + return $subsection; |
|
455 | + } |
|
456 | + |
|
457 | + |
|
458 | + |
|
459 | + /** |
|
460 | + * Like get_input(), gets the proper subsection of the form given the name, |
|
461 | + * otherwise throws an EE_Error |
|
462 | + * |
|
463 | + * @param string $name |
|
464 | + * @param boolean $require_construction_to_be_finalized most client code should |
|
465 | + * leave this as TRUE so that the inputs will be properly |
|
466 | + * configured. However, some client code may be ok with |
|
467 | + * construction finalize being called later |
|
468 | + * (realizing that the subsections' html names might not be |
|
469 | + * set yet, etc.) |
|
470 | + * @return EE_Form_Section_Proper |
|
471 | + * @throws EE_Error |
|
472 | + */ |
|
473 | + public function get_proper_subsection($name, $require_construction_to_be_finalized = true) |
|
474 | + { |
|
475 | + $subsection = $this->get_subsection($name, $require_construction_to_be_finalized); |
|
476 | + if (! $subsection instanceof EE_Form_Section_Proper) { |
|
477 | + throw new EE_Error( |
|
478 | + sprintf( |
|
479 | + __("Subsection '%'s is not an instanceof EE_Form_Section_Proper on form '%s'", 'event_espresso'), |
|
480 | + $name, |
|
481 | + get_class($this) |
|
482 | + ) |
|
483 | + ); |
|
484 | + } |
|
485 | + return $subsection; |
|
486 | + } |
|
487 | + |
|
488 | + |
|
489 | + |
|
490 | + /** |
|
491 | + * Gets the value of the specified input. Should be called after receive_form_submission() |
|
492 | + * or populate_defaults() on the form, where the normalized value on the input is set. |
|
493 | + * |
|
494 | + * @param string $name |
|
495 | + * @return mixed depending on the input's type and its normalization strategy |
|
496 | + * @throws \EE_Error |
|
497 | + */ |
|
498 | + public function get_input_value($name) |
|
499 | + { |
|
500 | + $input = $this->get_input($name); |
|
501 | + return $input->normalized_value(); |
|
502 | + } |
|
503 | + |
|
504 | + |
|
505 | + |
|
506 | + /** |
|
507 | + * Checks if this form section itself is valid, and then checks its subsections |
|
508 | + * |
|
509 | + * @throws EE_Error |
|
510 | + * @return boolean |
|
511 | + */ |
|
512 | + public function is_valid() |
|
513 | + { |
|
514 | + if (! $this->has_received_submission()) { |
|
515 | + throw new EE_Error( |
|
516 | + sprintf( |
|
517 | + __( |
|
518 | + "You cannot check if a form is valid before receiving the form submission using receive_form_submission", |
|
519 | + "event_espresso" |
|
520 | + ) |
|
521 | + ) |
|
522 | + ); |
|
523 | + } |
|
524 | + if (! parent::is_valid()) { |
|
525 | + return false; |
|
526 | + } |
|
527 | + // ok so no general errors to this entire form section. |
|
528 | + // so let's check the subsections, but only set errors if that hasn't been done yet |
|
529 | + $set_submission_errors = $this->submission_error_message() === '' ? true : false; |
|
530 | + foreach ($this->get_validatable_subsections() as $subsection) { |
|
531 | + if (! $subsection->is_valid() || $subsection->get_validation_error_string() !== '') { |
|
532 | + if ($set_submission_errors) { |
|
533 | + $this->set_submission_error_message($subsection->get_validation_error_string()); |
|
534 | + } |
|
535 | + return false; |
|
536 | + } |
|
537 | + } |
|
538 | + return true; |
|
539 | + } |
|
540 | + |
|
541 | + |
|
542 | + |
|
543 | + /** |
|
544 | + * gets teh default name of this form section if none is specified |
|
545 | + * |
|
546 | + * @return string |
|
547 | + */ |
|
548 | + protected function _set_default_name_if_empty() |
|
549 | + { |
|
550 | + if (! $this->_name) { |
|
551 | + $classname = get_class($this); |
|
552 | + $default_name = str_replace("EE_", "", $classname); |
|
553 | + $this->_name = $default_name; |
|
554 | + } |
|
555 | + } |
|
556 | + |
|
557 | + |
|
558 | + |
|
559 | + /** |
|
560 | + * Returns the HTML for the form, except for the form opening and closing tags |
|
561 | + * (as the form section doesn't know where you necessarily want to send the information to), |
|
562 | + * and except for a submit button. Enqueus JS and CSS; if called early enough we will |
|
563 | + * try to enqueue them in the header, otherwise they'll be enqueued in the footer. |
|
564 | + * Not doing_it_wrong because theoretically this CAN be used properly, |
|
565 | + * provided its used during "wp_enqueue_scripts", or it doesn't need to enqueue |
|
566 | + * any CSS. |
|
567 | + * |
|
568 | + * @throws \EE_Error |
|
569 | + */ |
|
570 | + public function get_html_and_js() |
|
571 | + { |
|
572 | + $this->enqueue_js(); |
|
573 | + return $this->get_html(); |
|
574 | + } |
|
575 | + |
|
576 | + |
|
577 | + |
|
578 | + /** |
|
579 | + * returns HTML for displaying this form section. recursively calls display_section() on all subsections |
|
580 | + * |
|
581 | + * @param bool $display_previously_submitted_data |
|
582 | + * @return string |
|
583 | + */ |
|
584 | + public function get_html($display_previously_submitted_data = true) |
|
585 | + { |
|
586 | + $this->ensure_construct_finalized_called(); |
|
587 | + if ($display_previously_submitted_data) { |
|
588 | + $this->populate_from_session(); |
|
589 | + } |
|
590 | + return $this->_form_html_filter |
|
591 | + ? $this->_form_html_filter->filterHtml($this->_layout_strategy->layout_form(), $this) |
|
592 | + : $this->_layout_strategy->layout_form(); |
|
593 | + } |
|
594 | + |
|
595 | + |
|
596 | + |
|
597 | + /** |
|
598 | + * enqueues JS and CSS for the form. |
|
599 | + * It is preferred to call this before wp_enqueue_scripts so the |
|
600 | + * scripts and styles can be put in the header, but if called later |
|
601 | + * they will be put in the footer (which is OK for JS, but in HTML4 CSS should |
|
602 | + * only be in the header; but in HTML5 its ok in the body. |
|
603 | + * See http://stackoverflow.com/questions/4957446/load-external-css-file-in-body-tag. |
|
604 | + * So if your form enqueues CSS, it's preferred to call this before wp_enqueue_scripts.) |
|
605 | + * |
|
606 | + * @return string |
|
607 | + * @throws \EE_Error |
|
608 | + */ |
|
609 | + public function enqueue_js() |
|
610 | + { |
|
611 | + $this->_enqueue_and_localize_form_js(); |
|
612 | + foreach ($this->subsections() as $subsection) { |
|
613 | + $subsection->enqueue_js(); |
|
614 | + } |
|
615 | + } |
|
616 | + |
|
617 | + |
|
618 | + |
|
619 | + /** |
|
620 | + * adds a filter so that jquery validate gets enqueued in EE_System::wp_enqueue_scripts(). |
|
621 | + * This must be done BEFORE wp_enqueue_scripts() gets called, which is on |
|
622 | + * the wp_enqueue_scripts hook. |
|
623 | + * However, registering the form js and localizing it can happen when we |
|
624 | + * actually output the form (which is preferred, seeing how teh form's fields |
|
625 | + * could change until it's actually outputted) |
|
626 | + * |
|
627 | + * @param boolean $init_form_validation_automatically whether or not we want the form validation |
|
628 | + * to be triggered automatically or not |
|
629 | + * @return void |
|
630 | + */ |
|
631 | + public static function wp_enqueue_scripts($init_form_validation_automatically = true) |
|
632 | + { |
|
633 | + add_filter('FHEE_load_jquery_validate', '__return_true'); |
|
634 | + wp_register_script( |
|
635 | + 'ee_form_section_validation', |
|
636 | + EE_GLOBAL_ASSETS_URL . 'scripts' . DS . 'form_section_validation.js', |
|
637 | + array('jquery-validate', 'jquery-ui-datepicker', 'jquery-validate-extra-methods'), |
|
638 | + EVENT_ESPRESSO_VERSION, |
|
639 | + true |
|
640 | + ); |
|
641 | + wp_localize_script( |
|
642 | + 'ee_form_section_validation', |
|
643 | + 'ee_form_section_validation_init', |
|
644 | + array('init' => $init_form_validation_automatically ? true : false) |
|
645 | + ); |
|
646 | + } |
|
647 | + |
|
648 | + |
|
649 | + |
|
650 | + /** |
|
651 | + * gets the variables used by form_section_validation.js. |
|
652 | + * This needs to be called AFTER we've called $this->_enqueue_jquery_validate_script, |
|
653 | + * but before the wordpress hook wp_loaded |
|
654 | + * |
|
655 | + * @throws \EE_Error |
|
656 | + */ |
|
657 | + public function _enqueue_and_localize_form_js() |
|
658 | + { |
|
659 | + $this->ensure_construct_finalized_called(); |
|
660 | + //actually, we don't want to localize just yet. There may be other forms on the page. |
|
661 | + //so we need to add our form section data to a static variable accessible by all form sections |
|
662 | + //and localize it just before the footer |
|
663 | + $this->localize_validation_rules(); |
|
664 | + add_action('wp_footer', array('EE_Form_Section_Proper', 'localize_script_for_all_forms'), 2); |
|
665 | + add_action('admin_footer', array('EE_Form_Section_Proper', 'localize_script_for_all_forms')); |
|
666 | + } |
|
667 | + |
|
668 | + |
|
669 | + |
|
670 | + /** |
|
671 | + * add our form section data to a static variable accessible by all form sections |
|
672 | + * |
|
673 | + * @param bool $return_for_subsection |
|
674 | + * @return void |
|
675 | + * @throws \EE_Error |
|
676 | + */ |
|
677 | + public function localize_validation_rules($return_for_subsection = false) |
|
678 | + { |
|
679 | + // we only want to localize vars ONCE for the entire form, |
|
680 | + // so if the form section doesn't have a parent, then it must be the top dog |
|
681 | + if ($return_for_subsection || ! $this->parent_section()) { |
|
682 | + EE_Form_Section_Proper::$_js_localization['form_data'][$this->html_id()] = array( |
|
683 | + 'form_section_id' => $this->html_id(true), |
|
684 | + 'validation_rules' => $this->get_jquery_validation_rules(), |
|
685 | + 'other_data' => $this->get_other_js_data(), |
|
686 | + 'errors' => $this->subsection_validation_errors_by_html_name(), |
|
687 | + ); |
|
688 | + EE_Form_Section_Proper::$_scripts_localized = true; |
|
689 | + } |
|
690 | + } |
|
691 | + |
|
692 | + |
|
693 | + |
|
694 | + /** |
|
695 | + * Gets an array of extra data that will be useful for client-side javascript. |
|
696 | + * This is primarily data added by inputs and forms in addition to any |
|
697 | + * scripts they might enqueue |
|
698 | + * |
|
699 | + * @param array $form_other_js_data |
|
700 | + * @return array |
|
701 | + */ |
|
702 | + public function get_other_js_data($form_other_js_data = array()) |
|
703 | + { |
|
704 | + foreach ($this->subsections() as $subsection) { |
|
705 | + $form_other_js_data = $subsection->get_other_js_data($form_other_js_data); |
|
706 | + } |
|
707 | + return $form_other_js_data; |
|
708 | + } |
|
709 | + |
|
710 | + |
|
711 | + |
|
712 | + /** |
|
713 | + * Gets a flat array of inputs for this form section and its subsections. |
|
714 | + * Keys are their form names, and values are the inputs themselves |
|
715 | + * |
|
716 | + * @return EE_Form_Input_Base |
|
717 | + */ |
|
718 | + public function inputs_in_subsections() |
|
719 | + { |
|
720 | + $inputs = array(); |
|
721 | + foreach ($this->subsections() as $subsection) { |
|
722 | + if ($subsection instanceof EE_Form_Input_Base) { |
|
723 | + $inputs[$subsection->html_name()] = $subsection; |
|
724 | + } elseif ($subsection instanceof EE_Form_Section_Proper) { |
|
725 | + $inputs += $subsection->inputs_in_subsections(); |
|
726 | + } |
|
727 | + } |
|
728 | + return $inputs; |
|
729 | + } |
|
730 | + |
|
731 | + |
|
732 | + |
|
733 | + /** |
|
734 | + * Gets a flat array of all the validation errors. |
|
735 | + * Keys are html names (because those should be unique) |
|
736 | + * and values are a string of all their validation errors |
|
737 | + * |
|
738 | + * @return string[] |
|
739 | + */ |
|
740 | + public function subsection_validation_errors_by_html_name() |
|
741 | + { |
|
742 | + $inputs = $this->inputs(); |
|
743 | + $errors = array(); |
|
744 | + foreach ($inputs as $form_input) { |
|
745 | + if ($form_input instanceof EE_Form_Input_Base && $form_input->get_validation_errors()) { |
|
746 | + $errors[$form_input->html_name()] = $form_input->get_validation_error_string(); |
|
747 | + } |
|
748 | + } |
|
749 | + return $errors; |
|
750 | + } |
|
751 | + |
|
752 | + |
|
753 | + |
|
754 | + /** |
|
755 | + * passes all the form data required by the JS to the JS, and enqueues the few required JS files. |
|
756 | + * Should be setup by each form during the _enqueues_and_localize_form_js |
|
757 | + */ |
|
758 | + public static function localize_script_for_all_forms() |
|
759 | + { |
|
760 | + //allow inputs and stuff to hook in their JS and stuff here |
|
761 | + do_action('AHEE__EE_Form_Section_Proper__localize_script_for_all_forms__begin'); |
|
762 | + EE_Form_Section_Proper::$_js_localization['localized_error_messages'] = EE_Form_Section_Proper::_get_localized_error_messages(); |
|
763 | + $email_validation_level = isset(EE_Registry::instance()->CFG->registration->email_validation_level) |
|
764 | + ? EE_Registry::instance()->CFG->registration->email_validation_level |
|
765 | + : 'wp_default'; |
|
766 | + EE_Form_Section_Proper::$_js_localization['email_validation_level'] = $email_validation_level; |
|
767 | + wp_enqueue_script('ee_form_section_validation'); |
|
768 | + wp_localize_script( |
|
769 | + 'ee_form_section_validation', |
|
770 | + 'ee_form_section_vars', |
|
771 | + EE_Form_Section_Proper::$_js_localization |
|
772 | + ); |
|
773 | + } |
|
774 | + |
|
775 | + |
|
776 | + |
|
777 | + /** |
|
778 | + * ensure_scripts_localized |
|
779 | + */ |
|
780 | + public function ensure_scripts_localized() |
|
781 | + { |
|
782 | + if (! EE_Form_Section_Proper::$_scripts_localized) { |
|
783 | + $this->_enqueue_and_localize_form_js(); |
|
784 | + } |
|
785 | + } |
|
786 | + |
|
787 | + |
|
788 | + |
|
789 | + /** |
|
790 | + * Gets the hard-coded validation error messages to be used in the JS. The convention |
|
791 | + * is that the key here should be the same as the custom validation rule put in the JS file |
|
792 | + * |
|
793 | + * @return array keys are custom validation rules, and values are internationalized strings |
|
794 | + */ |
|
795 | + private static function _get_localized_error_messages() |
|
796 | + { |
|
797 | + return array( |
|
798 | + 'validUrl' => __("This is not a valid absolute URL. Eg, http://domain.com/monkey.jpg", "event_espresso"), |
|
799 | + 'regex' => __('Please check your input', 'event_espresso'), |
|
800 | + ); |
|
801 | + } |
|
802 | + |
|
803 | + |
|
804 | + |
|
805 | + /** |
|
806 | + * @return array |
|
807 | + */ |
|
808 | + public static function js_localization() |
|
809 | + { |
|
810 | + return self::$_js_localization; |
|
811 | + } |
|
812 | + |
|
813 | + |
|
814 | + |
|
815 | + /** |
|
816 | + * @return array |
|
817 | + */ |
|
818 | + public static function reset_js_localization() |
|
819 | + { |
|
820 | + self::$_js_localization = array(); |
|
821 | + } |
|
822 | + |
|
823 | + |
|
824 | + |
|
825 | + /** |
|
826 | + * Gets the JS to put inside the jquery validation rules for subsection of this form section. |
|
827 | + * See parent function for more... |
|
828 | + * |
|
829 | + * @return array |
|
830 | + */ |
|
831 | + public function get_jquery_validation_rules() |
|
832 | + { |
|
833 | + $jquery_validation_rules = array(); |
|
834 | + foreach ($this->get_validatable_subsections() as $subsection) { |
|
835 | + $jquery_validation_rules = array_merge( |
|
836 | + $jquery_validation_rules, |
|
837 | + $subsection->get_jquery_validation_rules() |
|
838 | + ); |
|
839 | + } |
|
840 | + return $jquery_validation_rules; |
|
841 | + } |
|
842 | + |
|
843 | + |
|
844 | + |
|
845 | + /** |
|
846 | + * Sanitizes all the data and sets the sanitized value of each field |
|
847 | + * |
|
848 | + * @param array $req_data like $_POST |
|
849 | + * @return void |
|
850 | + */ |
|
851 | + protected function _normalize($req_data) |
|
852 | + { |
|
853 | + $this->_received_submission = true; |
|
854 | + $this->_validation_errors = array(); |
|
855 | + foreach ($this->get_validatable_subsections() as $subsection) { |
|
856 | + try { |
|
857 | + $subsection->_normalize($req_data); |
|
858 | + } catch (EE_Validation_Error $e) { |
|
859 | + $subsection->add_validation_error($e); |
|
860 | + } |
|
861 | + } |
|
862 | + } |
|
863 | + |
|
864 | + |
|
865 | + |
|
866 | + /** |
|
867 | + * Performs validation on this form section and its subsections. |
|
868 | + * For each subsection, |
|
869 | + * calls _validate_{subsection_name} on THIS form (if the function exists) |
|
870 | + * and passes it the subsection, then calls _validate on that subsection. |
|
871 | + * If you need to perform validation on the form as a whole (considering multiple) |
|
872 | + * you would be best to override this _validate method, |
|
873 | + * calling parent::_validate() first. |
|
874 | + */ |
|
875 | + protected function _validate() |
|
876 | + { |
|
877 | + foreach ($this->get_validatable_subsections() as $subsection_name => $subsection) { |
|
878 | + if (method_exists($this, '_validate_' . $subsection_name)) { |
|
879 | + call_user_func_array(array($this, '_validate_' . $subsection_name), array($subsection)); |
|
880 | + } |
|
881 | + $subsection->_validate(); |
|
882 | + } |
|
883 | + } |
|
884 | + |
|
885 | + |
|
886 | + |
|
887 | + /** |
|
888 | + * Gets all the validated inputs for the form section |
|
889 | + * |
|
890 | + * @return array |
|
891 | + */ |
|
892 | + public function valid_data() |
|
893 | + { |
|
894 | + $inputs = array(); |
|
895 | + foreach ($this->subsections() as $subsection_name => $subsection) { |
|
896 | + if ($subsection instanceof EE_Form_Section_Proper) { |
|
897 | + $inputs[$subsection_name] = $subsection->valid_data(); |
|
898 | + } else if ($subsection instanceof EE_Form_Input_Base) { |
|
899 | + $inputs[$subsection_name] = $subsection->normalized_value(); |
|
900 | + } |
|
901 | + } |
|
902 | + return $inputs; |
|
903 | + } |
|
904 | + |
|
905 | + |
|
906 | + |
|
907 | + /** |
|
908 | + * Gets all the inputs on this form section |
|
909 | + * |
|
910 | + * @return EE_Form_Input_Base[] |
|
911 | + */ |
|
912 | + public function inputs() |
|
913 | + { |
|
914 | + $inputs = array(); |
|
915 | + foreach ($this->subsections() as $subsection_name => $subsection) { |
|
916 | + if ($subsection instanceof EE_Form_Input_Base) { |
|
917 | + $inputs[$subsection_name] = $subsection; |
|
918 | + } |
|
919 | + } |
|
920 | + return $inputs; |
|
921 | + } |
|
922 | + |
|
923 | + |
|
924 | + |
|
925 | + /** |
|
926 | + * Gets all the subsections which are a proper form |
|
927 | + * |
|
928 | + * @return EE_Form_Section_Proper[] |
|
929 | + */ |
|
930 | + public function subforms() |
|
931 | + { |
|
932 | + $form_sections = array(); |
|
933 | + foreach ($this->subsections() as $name => $obj) { |
|
934 | + if ($obj instanceof EE_Form_Section_Proper) { |
|
935 | + $form_sections[$name] = $obj; |
|
936 | + } |
|
937 | + } |
|
938 | + return $form_sections; |
|
939 | + } |
|
940 | + |
|
941 | + |
|
942 | + |
|
943 | + /** |
|
944 | + * Gets all the subsections (inputs, proper subsections, or html-only sections). |
|
945 | + * Consider using inputs() or subforms() |
|
946 | + * if you only want form inputs or proper form sections. |
|
947 | + * |
|
948 | + * @param boolean $require_construction_to_be_finalized most client code should |
|
949 | + * leave this as TRUE so that the inputs will be properly |
|
950 | + * configured. However, some client code may be ok with |
|
951 | + * construction finalize being called later |
|
952 | + * (realizing that the subsections' html names might not be |
|
953 | + * set yet, etc.) |
|
954 | + * @return EE_Form_Section_Proper[] |
|
955 | + */ |
|
956 | + public function subsections($require_construction_to_be_finalized = true) |
|
957 | + { |
|
958 | + if ($require_construction_to_be_finalized) { |
|
959 | + $this->ensure_construct_finalized_called(); |
|
960 | + } |
|
961 | + return $this->_subsections; |
|
962 | + } |
|
963 | + |
|
964 | + |
|
965 | + |
|
966 | + /** |
|
967 | + * Returns a simple array where keys are input names, and values are their normalized |
|
968 | + * values. (Similar to calling get_input_value on inputs) |
|
969 | + * |
|
970 | + * @param boolean $include_subform_inputs Whether to include inputs from subforms, |
|
971 | + * or just this forms' direct children inputs |
|
972 | + * @param boolean $flatten Whether to force the results into 1-dimensional array, |
|
973 | + * or allow multidimensional array |
|
974 | + * @return array if $flatten is TRUE it will always be a 1-dimensional array |
|
975 | + * with array keys being input names |
|
976 | + * (regardless of whether they are from a subsection or not), |
|
977 | + * and if $flatten is FALSE it can be a multidimensional array |
|
978 | + * where keys are always subsection names and values are either |
|
979 | + * the input's normalized value, or an array like the top-level array |
|
980 | + */ |
|
981 | + public function input_values($include_subform_inputs = false, $flatten = false) |
|
982 | + { |
|
983 | + return $this->_input_values(false, $include_subform_inputs, $flatten); |
|
984 | + } |
|
985 | + |
|
986 | + |
|
987 | + |
|
988 | + /** |
|
989 | + * Similar to EE_Form_Section_Proper::input_values(), except this returns the 'display_value' |
|
990 | + * of each input. On some inputs (especially radio boxes or checkboxes), the value stored |
|
991 | + * is not necessarily the value we want to display to users. This creates an array |
|
992 | + * where keys are the input names, and values are their display values |
|
993 | + * |
|
994 | + * @param boolean $include_subform_inputs Whether to include inputs from subforms, |
|
995 | + * or just this forms' direct children inputs |
|
996 | + * @param boolean $flatten Whether to force the results into 1-dimensional array, |
|
997 | + * or allow multidimensional array |
|
998 | + * @return array if $flatten is TRUE it will always be a 1-dimensional array |
|
999 | + * with array keys being input names |
|
1000 | + * (regardless of whether they are from a subsection or not), |
|
1001 | + * and if $flatten is FALSE it can be a multidimensional array |
|
1002 | + * where keys are always subsection names and values are either |
|
1003 | + * the input's normalized value, or an array like the top-level array |
|
1004 | + */ |
|
1005 | + public function input_pretty_values($include_subform_inputs = false, $flatten = false) |
|
1006 | + { |
|
1007 | + return $this->_input_values(true, $include_subform_inputs, $flatten); |
|
1008 | + } |
|
1009 | + |
|
1010 | + |
|
1011 | + |
|
1012 | + /** |
|
1013 | + * Gets the input values from the form |
|
1014 | + * |
|
1015 | + * @param boolean $pretty Whether to retrieve the pretty value, |
|
1016 | + * or just the normalized value |
|
1017 | + * @param boolean $include_subform_inputs Whether to include inputs from subforms, |
|
1018 | + * or just this forms' direct children inputs |
|
1019 | + * @param boolean $flatten Whether to force the results into 1-dimensional array, |
|
1020 | + * or allow multidimensional array |
|
1021 | + * @return array if $flatten is TRUE it will always be a 1-dimensional array with array keys being |
|
1022 | + * input names (regardless of whether they are from a subsection or not), |
|
1023 | + * and if $flatten is FALSE it can be a multidimensional array |
|
1024 | + * where keys are always subsection names and values are either |
|
1025 | + * the input's normalized value, or an array like the top-level array |
|
1026 | + */ |
|
1027 | + public function _input_values($pretty = false, $include_subform_inputs = false, $flatten = false) |
|
1028 | + { |
|
1029 | + $input_values = array(); |
|
1030 | + foreach ($this->subsections() as $subsection_name => $subsection) { |
|
1031 | + if ($subsection instanceof EE_Form_Input_Base) { |
|
1032 | + $input_values[$subsection_name] = $pretty |
|
1033 | + ? $subsection->pretty_value() |
|
1034 | + : $subsection->normalized_value(); |
|
1035 | + } else if ($subsection instanceof EE_Form_Section_Proper && $include_subform_inputs) { |
|
1036 | + $subform_input_values = $subsection->_input_values($pretty, $include_subform_inputs, $flatten); |
|
1037 | + if ($flatten) { |
|
1038 | + $input_values = array_merge($input_values, $subform_input_values); |
|
1039 | + } else { |
|
1040 | + $input_values[$subsection_name] = $subform_input_values; |
|
1041 | + } |
|
1042 | + } |
|
1043 | + } |
|
1044 | + return $input_values; |
|
1045 | + } |
|
1046 | + |
|
1047 | + |
|
1048 | + |
|
1049 | + /** |
|
1050 | + * Gets the originally submitted input values from the form |
|
1051 | + * |
|
1052 | + * @param boolean $include_subforms Whether to include inputs from subforms, |
|
1053 | + * or just this forms' direct children inputs |
|
1054 | + * @return array if $flatten is TRUE it will always be a 1-dimensional array |
|
1055 | + * with array keys being input names |
|
1056 | + * (regardless of whether they are from a subsection or not), |
|
1057 | + * and if $flatten is FALSE it can be a multidimensional array |
|
1058 | + * where keys are always subsection names and values are either |
|
1059 | + * the input's normalized value, or an array like the top-level array |
|
1060 | + */ |
|
1061 | + public function submitted_values($include_subforms = false) |
|
1062 | + { |
|
1063 | + $submitted_values = array(); |
|
1064 | + foreach ($this->subsections() as $subsection) { |
|
1065 | + if ($subsection instanceof EE_Form_Input_Base) { |
|
1066 | + // is this input part of an array of inputs? |
|
1067 | + if (strpos($subsection->html_name(), '[') !== false) { |
|
1068 | + $full_input_name = \EEH_Array::convert_array_values_to_keys( |
|
1069 | + explode('[', str_replace(']', '', $subsection->html_name())), |
|
1070 | + $subsection->raw_value() |
|
1071 | + ); |
|
1072 | + $submitted_values = array_replace_recursive($submitted_values, $full_input_name); |
|
1073 | + } else { |
|
1074 | + $submitted_values[$subsection->html_name()] = $subsection->raw_value(); |
|
1075 | + } |
|
1076 | + } else if ($subsection instanceof EE_Form_Section_Proper && $include_subforms) { |
|
1077 | + $subform_input_values = $subsection->submitted_values($include_subforms); |
|
1078 | + $submitted_values = array_replace_recursive($submitted_values, $subform_input_values); |
|
1079 | + } |
|
1080 | + } |
|
1081 | + return $submitted_values; |
|
1082 | + } |
|
1083 | + |
|
1084 | + |
|
1085 | + |
|
1086 | + /** |
|
1087 | + * Indicates whether or not this form has received a submission yet |
|
1088 | + * (ie, had receive_form_submission called on it yet) |
|
1089 | + * |
|
1090 | + * @return boolean |
|
1091 | + * @throws \EE_Error |
|
1092 | + */ |
|
1093 | + public function has_received_submission() |
|
1094 | + { |
|
1095 | + $this->ensure_construct_finalized_called(); |
|
1096 | + return $this->_received_submission; |
|
1097 | + } |
|
1098 | + |
|
1099 | + |
|
1100 | + |
|
1101 | + /** |
|
1102 | + * Equivalent to passing 'exclude' in the constructor's options array. |
|
1103 | + * Removes the listed inputs from the form |
|
1104 | + * |
|
1105 | + * @param array $inputs_to_exclude values are the input names |
|
1106 | + * @return void |
|
1107 | + */ |
|
1108 | + public function exclude(array $inputs_to_exclude = array()) |
|
1109 | + { |
|
1110 | + foreach ($inputs_to_exclude as $input_to_exclude_name) { |
|
1111 | + unset($this->_subsections[$input_to_exclude_name]); |
|
1112 | + } |
|
1113 | + } |
|
1114 | + |
|
1115 | + |
|
1116 | + |
|
1117 | + /** |
|
1118 | + * @param array $inputs_to_hide |
|
1119 | + * @throws \EE_Error |
|
1120 | + */ |
|
1121 | + public function hide(array $inputs_to_hide = array()) |
|
1122 | + { |
|
1123 | + foreach ($inputs_to_hide as $input_to_hide) { |
|
1124 | + $input = $this->get_input($input_to_hide); |
|
1125 | + $input->set_display_strategy(new EE_Hidden_Display_Strategy()); |
|
1126 | + } |
|
1127 | + } |
|
1128 | + |
|
1129 | + |
|
1130 | + |
|
1131 | + /** |
|
1132 | + * add_subsections |
|
1133 | + * Adds the listed subsections to the form section. |
|
1134 | + * If $subsection_name_to_target is provided, |
|
1135 | + * then new subsections are added before or after that subsection, |
|
1136 | + * otherwise to the start or end of the entire subsections array. |
|
1137 | + * |
|
1138 | + * @param EE_Form_Section_Base[] $new_subsections array of new form subsections |
|
1139 | + * where keys are their names |
|
1140 | + * @param string $subsection_name_to_target an existing for section that $new_subsections |
|
1141 | + * should be added before or after |
|
1142 | + * IF $subsection_name_to_target is null, |
|
1143 | + * then $new_subsections will be added to |
|
1144 | + * the beginning or end of the entire subsections array |
|
1145 | + * @param boolean $add_before whether to add $new_subsections, before or after |
|
1146 | + * $subsection_name_to_target, |
|
1147 | + * or if $subsection_name_to_target is null, |
|
1148 | + * before or after entire subsections array |
|
1149 | + * @return void |
|
1150 | + * @throws \EE_Error |
|
1151 | + */ |
|
1152 | + public function add_subsections($new_subsections, $subsection_name_to_target = null, $add_before = true) |
|
1153 | + { |
|
1154 | + foreach ($new_subsections as $subsection_name => $subsection) { |
|
1155 | + if (! $subsection instanceof EE_Form_Section_Base) { |
|
1156 | + EE_Error::add_error( |
|
1157 | + sprintf( |
|
1158 | + __( |
|
1159 | + "Trying to add a %s as a subsection (it was named '%s') to the form section '%s'. It was removed.", |
|
1160 | + "event_espresso" |
|
1161 | + ), |
|
1162 | + get_class($subsection), |
|
1163 | + $subsection_name, |
|
1164 | + $this->name() |
|
1165 | + ) |
|
1166 | + ); |
|
1167 | + unset($new_subsections[$subsection_name]); |
|
1168 | + } |
|
1169 | + } |
|
1170 | + $this->_subsections = EEH_Array::insert_into_array( |
|
1171 | + $this->_subsections, |
|
1172 | + $new_subsections, |
|
1173 | + $subsection_name_to_target, |
|
1174 | + $add_before |
|
1175 | + ); |
|
1176 | + if ($this->_construction_finalized) { |
|
1177 | + foreach ($this->_subsections as $name => $subsection) { |
|
1178 | + $subsection->_construct_finalize($this, $name); |
|
1179 | + } |
|
1180 | + } |
|
1181 | + } |
|
1182 | + |
|
1183 | + |
|
1184 | + |
|
1185 | + /** |
|
1186 | + * Just gets all validatable subsections to clean their sensitive data |
|
1187 | + */ |
|
1188 | + public function clean_sensitive_data() |
|
1189 | + { |
|
1190 | + foreach ($this->get_validatable_subsections() as $subsection) { |
|
1191 | + $subsection->clean_sensitive_data(); |
|
1192 | + } |
|
1193 | + } |
|
1194 | + |
|
1195 | + |
|
1196 | + |
|
1197 | + /** |
|
1198 | + * @param string $form_submission_error_message |
|
1199 | + */ |
|
1200 | + public function set_submission_error_message($form_submission_error_message = '') |
|
1201 | + { |
|
1202 | + $this->_form_submission_error_message .= ! empty($form_submission_error_message) |
|
1203 | + ? $form_submission_error_message |
|
1204 | + : __('Form submission failed due to errors', 'event_espresso'); |
|
1205 | + } |
|
1206 | + |
|
1207 | + |
|
1208 | + |
|
1209 | + /** |
|
1210 | + * @return string |
|
1211 | + */ |
|
1212 | + public function submission_error_message() |
|
1213 | + { |
|
1214 | + return $this->_form_submission_error_message; |
|
1215 | + } |
|
1216 | + |
|
1217 | + |
|
1218 | + |
|
1219 | + /** |
|
1220 | + * @param string $form_submission_success_message |
|
1221 | + */ |
|
1222 | + public function set_submission_success_message($form_submission_success_message) |
|
1223 | + { |
|
1224 | + $this->_form_submission_success_message .= ! empty($form_submission_success_message) |
|
1225 | + ? $form_submission_success_message |
|
1226 | + : __('Form submitted successfully', 'event_espresso'); |
|
1227 | + } |
|
1228 | + |
|
1229 | + |
|
1230 | + |
|
1231 | + /** |
|
1232 | + * @return string |
|
1233 | + */ |
|
1234 | + public function submission_success_message() |
|
1235 | + { |
|
1236 | + return $this->_form_submission_success_message; |
|
1237 | + } |
|
1238 | + |
|
1239 | + |
|
1240 | + |
|
1241 | + /** |
|
1242 | + * Returns the prefix that should be used on child of this form section for |
|
1243 | + * their html names. If this form section itself has a parent, prepends ITS |
|
1244 | + * prefix onto this form section's prefix. Used primarily by |
|
1245 | + * EE_Form_Input_Base::_set_default_html_name_if_empty |
|
1246 | + * |
|
1247 | + * @return string |
|
1248 | + * @throws \EE_Error |
|
1249 | + */ |
|
1250 | + public function html_name_prefix() |
|
1251 | + { |
|
1252 | + if ($this->parent_section() instanceof EE_Form_Section_Proper) { |
|
1253 | + return $this->parent_section()->html_name_prefix() . '[' . $this->name() . ']'; |
|
1254 | + } else { |
|
1255 | + return $this->name(); |
|
1256 | + } |
|
1257 | + } |
|
1258 | + |
|
1259 | + |
|
1260 | + |
|
1261 | + /** |
|
1262 | + * Gets the name, but first checks _construct_finalize has been called. If not, |
|
1263 | + * calls it (assumes there is no parent and that we want the name to be whatever |
|
1264 | + * was set, which is probably nothing, or the classname) |
|
1265 | + * |
|
1266 | + * @return string |
|
1267 | + * @throws \EE_Error |
|
1268 | + */ |
|
1269 | + public function name() |
|
1270 | + { |
|
1271 | + $this->ensure_construct_finalized_called(); |
|
1272 | + return parent::name(); |
|
1273 | + } |
|
1274 | + |
|
1275 | + |
|
1276 | + |
|
1277 | + /** |
|
1278 | + * @return EE_Form_Section_Proper |
|
1279 | + * @throws \EE_Error |
|
1280 | + */ |
|
1281 | + public function parent_section() |
|
1282 | + { |
|
1283 | + $this->ensure_construct_finalized_called(); |
|
1284 | + return parent::parent_section(); |
|
1285 | + } |
|
1286 | + |
|
1287 | + |
|
1288 | + |
|
1289 | + /** |
|
1290 | + * make sure construction finalized was called, otherwise children might not be ready |
|
1291 | + * |
|
1292 | + * @return void |
|
1293 | + * @throws \EE_Error |
|
1294 | + */ |
|
1295 | + public function ensure_construct_finalized_called() |
|
1296 | + { |
|
1297 | + if (! $this->_construction_finalized) { |
|
1298 | + $this->_construct_finalize($this->_parent_section, $this->_name); |
|
1299 | + } |
|
1300 | + } |
|
1301 | + |
|
1302 | + |
|
1303 | + |
|
1304 | + /** |
|
1305 | + * Checks if any of this form section's inputs, or any of its children's inputs, |
|
1306 | + * are in teh form data. If any are found, returns true. Else false |
|
1307 | + * |
|
1308 | + * @param array $req_data |
|
1309 | + * @return boolean |
|
1310 | + */ |
|
1311 | + public function form_data_present_in($req_data = null) |
|
1312 | + { |
|
1313 | + if ($req_data === null) { |
|
1314 | + $req_data = $_POST; |
|
1315 | + } |
|
1316 | + foreach ($this->subsections() as $subsection) { |
|
1317 | + if ($subsection instanceof EE_Form_Input_Base) { |
|
1318 | + if ($subsection->form_data_present_in($req_data)) { |
|
1319 | + return true; |
|
1320 | + } |
|
1321 | + } elseif ($subsection instanceof EE_Form_Section_Proper) { |
|
1322 | + if ($subsection->form_data_present_in($req_data)) { |
|
1323 | + return true; |
|
1324 | + } |
|
1325 | + } |
|
1326 | + } |
|
1327 | + return false; |
|
1328 | + } |
|
1329 | + |
|
1330 | + |
|
1331 | + |
|
1332 | + /** |
|
1333 | + * Gets validation errors for this form section and subsections |
|
1334 | + * Similar to EE_Form_Section_Validatable::get_validation_errors() except this |
|
1335 | + * gets the validation errors for ALL subsection |
|
1336 | + * |
|
1337 | + * @return EE_Validation_Error[] |
|
1338 | + */ |
|
1339 | + public function get_validation_errors_accumulated() |
|
1340 | + { |
|
1341 | + $validation_errors = $this->get_validation_errors(); |
|
1342 | + foreach ($this->get_validatable_subsections() as $subsection) { |
|
1343 | + if ($subsection instanceof EE_Form_Section_Proper) { |
|
1344 | + $validation_errors_on_this_subsection = $subsection->get_validation_errors_accumulated(); |
|
1345 | + } else { |
|
1346 | + $validation_errors_on_this_subsection = $subsection->get_validation_errors(); |
|
1347 | + } |
|
1348 | + if ($validation_errors_on_this_subsection) { |
|
1349 | + $validation_errors = array_merge($validation_errors, $validation_errors_on_this_subsection); |
|
1350 | + } |
|
1351 | + } |
|
1352 | + return $validation_errors; |
|
1353 | + } |
|
1354 | + |
|
1355 | + |
|
1356 | + |
|
1357 | + /** |
|
1358 | + * This isn't just the name of an input, it's a path pointing to an input. The |
|
1359 | + * path is similar to a folder path: slash (/) means to descend into a subsection, |
|
1360 | + * dot-dot-slash (../) means to ascend into the parent section. |
|
1361 | + * After a series of slashes and dot-dot-slashes, there should be the name of an input, |
|
1362 | + * which will be returned. |
|
1363 | + * Eg, if you want the related input to be conditional on a sibling input name 'foobar' |
|
1364 | + * just use 'foobar'. If you want it to be conditional on an aunt/uncle input name |
|
1365 | + * 'baz', use '../baz'. If you want it to be conditional on a cousin input, |
|
1366 | + * the child of 'baz_section' named 'baz_child', use '../baz_section/baz_child'. |
|
1367 | + * Etc |
|
1368 | + * |
|
1369 | + * @param string|false $form_section_path we accept false also because substr( '../', '../' ) = false |
|
1370 | + * @return EE_Form_Section_Base |
|
1371 | + */ |
|
1372 | + public function find_section_from_path($form_section_path) |
|
1373 | + { |
|
1374 | + //check if we can find the input from purely going straight up the tree |
|
1375 | + $input = parent::find_section_from_path($form_section_path); |
|
1376 | + if ($input instanceof EE_Form_Section_Base) { |
|
1377 | + return $input; |
|
1378 | + } |
|
1379 | + $next_slash_pos = strpos($form_section_path, '/'); |
|
1380 | + if ($next_slash_pos !== false) { |
|
1381 | + $child_section_name = substr($form_section_path, 0, $next_slash_pos); |
|
1382 | + $subpath = substr($form_section_path, $next_slash_pos + 1); |
|
1383 | + } else { |
|
1384 | + $child_section_name = $form_section_path; |
|
1385 | + $subpath = ''; |
|
1386 | + } |
|
1387 | + $child_section = $this->get_subsection($child_section_name); |
|
1388 | + if ($child_section instanceof EE_Form_Section_Base) { |
|
1389 | + return $child_section->find_section_from_path($subpath); |
|
1390 | + } else { |
|
1391 | + return null; |
|
1392 | + } |
|
1393 | + } |
|
1394 | 1394 | |
1395 | 1395 | } |
1396 | 1396 |
@@ -1,5 +1,5 @@ discard block |
||
1 | 1 | <?php if (! defined('EVENT_ESPRESSO_VERSION')) { |
2 | - exit('No direct script access allowed'); |
|
2 | + exit('No direct script access allowed'); |
|
3 | 3 | } |
4 | 4 | |
5 | 5 | |
@@ -16,1130 +16,1130 @@ discard block |
||
16 | 16 | abstract class EE_Form_Input_Base extends EE_Form_Section_Validatable |
17 | 17 | { |
18 | 18 | |
19 | - /** |
|
20 | - * the input's name attribute |
|
21 | - * |
|
22 | - * @var string |
|
23 | - */ |
|
24 | - protected $_html_name; |
|
25 | - |
|
26 | - /** |
|
27 | - * id for the html label tag |
|
28 | - * |
|
29 | - * @var string |
|
30 | - */ |
|
31 | - protected $_html_label_id; |
|
32 | - |
|
33 | - /** |
|
34 | - * class for teh html label tag |
|
35 | - * |
|
36 | - * @var string |
|
37 | - */ |
|
38 | - protected $_html_label_class; |
|
39 | - |
|
40 | - /** |
|
41 | - * any additional html attributes that you may want to add |
|
42 | - * |
|
43 | - * @var string |
|
44 | - */ |
|
45 | - protected $_html_other_attributes; |
|
46 | - |
|
47 | - /** |
|
48 | - * style for teh html label tag |
|
49 | - * |
|
50 | - * @var string |
|
51 | - */ |
|
52 | - protected $_html_label_style; |
|
53 | - |
|
54 | - /** |
|
55 | - * text to be placed in the html label |
|
56 | - * |
|
57 | - * @var string |
|
58 | - */ |
|
59 | - protected $_html_label_text; |
|
60 | - |
|
61 | - /** |
|
62 | - * the full html label. If used, all other html_label_* properties are invalid |
|
63 | - * |
|
64 | - * @var string |
|
65 | - */ |
|
66 | - protected $_html_label; |
|
67 | - |
|
68 | - /** |
|
69 | - * HTML to use for help text (normally placed below form input), in a span which normally |
|
70 | - * has a class of 'description' |
|
71 | - * |
|
72 | - * @var string |
|
73 | - */ |
|
74 | - protected $_html_help_text; |
|
75 | - |
|
76 | - /** |
|
77 | - * CSS classes for displaying the help span |
|
78 | - * |
|
79 | - * @var string |
|
80 | - */ |
|
81 | - protected $_html_help_class = 'description'; |
|
82 | - |
|
83 | - /** |
|
84 | - * CSS to put in the style attribute on the help span |
|
85 | - * |
|
86 | - * @var string |
|
87 | - */ |
|
88 | - protected $_html_help_style; |
|
89 | - |
|
90 | - /** |
|
91 | - * Stores whether or not this input's response is required. |
|
92 | - * Because certain styling elements may also want to know that this |
|
93 | - * input is required etc. |
|
94 | - * |
|
95 | - * @var boolean |
|
96 | - */ |
|
97 | - protected $_required; |
|
98 | - |
|
99 | - /** |
|
100 | - * css class added to required inputs |
|
101 | - * |
|
102 | - * @var string |
|
103 | - */ |
|
104 | - protected $_required_css_class = 'ee-required'; |
|
105 | - |
|
106 | - /** |
|
107 | - * css styles applied to button type inputs |
|
108 | - * |
|
109 | - * @var string |
|
110 | - */ |
|
111 | - protected $_button_css_attributes; |
|
112 | - |
|
113 | - /** |
|
114 | - * The raw data submitted for this, like in the $_POST super global. |
|
115 | - * Generally unsafe for usage in client code |
|
116 | - * |
|
117 | - * @var mixed string or array |
|
118 | - */ |
|
119 | - protected $_raw_value; |
|
120 | - |
|
121 | - /** |
|
122 | - * Value normalized according to the input's normalization strategy. |
|
123 | - * The normalization strategy dictates whether this is a string, int, float, |
|
124 | - * boolean, or array of any of those. |
|
125 | - * |
|
126 | - * @var mixed |
|
127 | - */ |
|
128 | - protected $_normalized_value; |
|
129 | - |
|
130 | - /** |
|
131 | - * Strategy used for displaying this field. |
|
132 | - * Child classes must use _get_display_strategy to access it. |
|
133 | - * |
|
134 | - * @var EE_Display_Strategy_Base |
|
135 | - */ |
|
136 | - private $_display_strategy; |
|
137 | - |
|
138 | - /** |
|
139 | - * Gets all the validation strategies used on this field |
|
140 | - * |
|
141 | - * @var EE_Validation_Strategy_Base[] |
|
142 | - */ |
|
143 | - private $_validation_strategies = array(); |
|
144 | - |
|
145 | - /** |
|
146 | - * The normalization strategy for this field |
|
147 | - * |
|
148 | - * @var EE_Normalization_Strategy_Base |
|
149 | - */ |
|
150 | - private $_normalization_strategy; |
|
151 | - |
|
152 | - /** |
|
153 | - * Strategy for removing sensitive data after we're done with the form input |
|
154 | - * |
|
155 | - * @var EE_Sensitive_Data_Removal_Base |
|
156 | - */ |
|
157 | - protected $_sensitive_data_removal_strategy; |
|
158 | - |
|
159 | - |
|
160 | - |
|
161 | - /** |
|
162 | - * @param array $input_args { |
|
163 | - * @type string $html_name the html name for the input |
|
164 | - * @type string $html_label_id the id attribute to give to the html label tag |
|
165 | - * @type string $html_label_class the class attribute to give to the html label tag |
|
166 | - * @type string $html_label_style the style attribute to give ot teh label tag |
|
167 | - * @type string $html_label_text the text to put in the label tag |
|
168 | - * @type string $html_label the full html label. If used, |
|
169 | - * all other html_label_* args are invalid |
|
170 | - * @type string $html_help_text text to put in help element |
|
171 | - * @type string $html_help_style style attribute to give to teh help element |
|
172 | - * @type string $html_help_class class attribute to give to the help element |
|
173 | - * @type string $default default value NORMALIZED (eg, if providing the default |
|
174 | - * for a Yes_No_Input, you should provide TRUE or FALSE, not '1' or '0') |
|
175 | - * @type EE_Display_Strategy_Base $display strategy |
|
176 | - * @type EE_Normalization_Strategy_Base $normalization_strategy |
|
177 | - * @type EE_Validation_Strategy_Base[] $validation_strategies |
|
178 | - * } |
|
179 | - */ |
|
180 | - public function __construct($input_args = array()) |
|
181 | - { |
|
182 | - $input_args = (array)apply_filters('FHEE__EE_Form_Input_Base___construct__input_args', $input_args, $this); |
|
183 | - // the following properties must be cast as arrays |
|
184 | - if (isset($input_args['validation_strategies'])) { |
|
185 | - foreach ((array)$input_args['validation_strategies'] as $validation_strategy) { |
|
186 | - if ($validation_strategy instanceof EE_Validation_Strategy_Base) { |
|
187 | - $this->_validation_strategies[get_class($validation_strategy)] = $validation_strategy; |
|
188 | - } |
|
189 | - } |
|
190 | - unset($input_args['validation_strategies']); |
|
191 | - } |
|
192 | - // loop thru incoming options |
|
193 | - foreach ($input_args as $key => $value) { |
|
194 | - // add underscore to $key to match property names |
|
195 | - $_key = '_' . $key; |
|
196 | - if (property_exists($this, $_key)) { |
|
197 | - $this->{$_key} = $value; |
|
198 | - } |
|
199 | - } |
|
200 | - // ensure that "required" is set correctly |
|
201 | - $this->set_required( |
|
202 | - $this->_required, isset($input_args['required_validation_error_message']) |
|
203 | - ? $input_args['required_validation_error_message'] |
|
204 | - : null |
|
205 | - ); |
|
206 | - //$this->_html_name_specified = isset( $input_args['html_name'] ) ? TRUE : FALSE; |
|
207 | - $this->_display_strategy->_construct_finalize($this); |
|
208 | - foreach ($this->_validation_strategies as $validation_strategy) { |
|
209 | - $validation_strategy->_construct_finalize($this); |
|
210 | - } |
|
211 | - if (! $this->_normalization_strategy) { |
|
212 | - $this->_normalization_strategy = new EE_Text_Normalization(); |
|
213 | - } |
|
214 | - $this->_normalization_strategy->_construct_finalize($this); |
|
215 | - //at least we can use the normalization strategy to populate the default |
|
216 | - if (isset($input_args['default'])) { |
|
217 | - $this->set_default($input_args['default']); |
|
218 | - } |
|
219 | - if (! $this->_sensitive_data_removal_strategy) { |
|
220 | - $this->_sensitive_data_removal_strategy = new EE_No_Sensitive_Data_Removal(); |
|
221 | - } |
|
222 | - $this->_sensitive_data_removal_strategy->_construct_finalize($this); |
|
223 | - parent::__construct($input_args); |
|
224 | - } |
|
225 | - |
|
226 | - |
|
227 | - |
|
228 | - /** |
|
229 | - * Sets the html_name to its default value, if none was specified in teh constructor. |
|
230 | - * Calculation involves using the name and the parent's html_name |
|
231 | - * |
|
232 | - * @throws \EE_Error |
|
233 | - */ |
|
234 | - protected function _set_default_html_name_if_empty() |
|
235 | - { |
|
236 | - if (! $this->_html_name) { |
|
237 | - $this->_html_name = $this->name(); |
|
238 | - if ($this->_parent_section && $this->_parent_section instanceof EE_Form_Section_Proper) { |
|
239 | - $this->_html_name = $this->_parent_section->html_name_prefix() . "[{$this->name()}]"; |
|
240 | - } |
|
241 | - } |
|
242 | - } |
|
243 | - |
|
244 | - |
|
245 | - |
|
246 | - /** |
|
247 | - * @param $parent_form_section |
|
248 | - * @param $name |
|
249 | - * @throws \EE_Error |
|
250 | - */ |
|
251 | - public function _construct_finalize($parent_form_section, $name) |
|
252 | - { |
|
253 | - parent::_construct_finalize($parent_form_section, $name); |
|
254 | - if ($this->_html_label === null && $this->_html_label_text === null) { |
|
255 | - $this->_html_label_text = ucwords(str_replace("_", " ", $name)); |
|
256 | - } |
|
257 | - do_action('AHEE__EE_Form_Input_Base___construct_finalize__end', $this, $parent_form_section, $name); |
|
258 | - } |
|
259 | - |
|
260 | - |
|
261 | - |
|
262 | - /** |
|
263 | - * Returns the strategy for displaying this form input. If none is set, throws an exception. |
|
264 | - * |
|
265 | - * @return EE_Display_Strategy_Base |
|
266 | - * @throws EE_Error |
|
267 | - */ |
|
268 | - protected function _get_display_strategy() |
|
269 | - { |
|
270 | - $this->ensure_construct_finalized_called(); |
|
271 | - if (! $this->_display_strategy || ! $this->_display_strategy instanceof EE_Display_Strategy_Base) { |
|
272 | - throw new EE_Error( |
|
273 | - sprintf( |
|
274 | - __( |
|
275 | - "Cannot get display strategy for form input with name %s and id %s, because it has not been set in the constructor", |
|
276 | - "event_espresso" |
|
277 | - ), |
|
278 | - $this->html_name(), |
|
279 | - $this->html_id() |
|
280 | - ) |
|
281 | - ); |
|
282 | - } else { |
|
283 | - return $this->_display_strategy; |
|
284 | - } |
|
285 | - } |
|
286 | - |
|
287 | - |
|
288 | - |
|
289 | - /** |
|
290 | - * Sets the display strategy. |
|
291 | - * |
|
292 | - * @param EE_Display_Strategy_Base $strategy |
|
293 | - */ |
|
294 | - protected function _set_display_strategy(EE_Display_Strategy_Base $strategy) |
|
295 | - { |
|
296 | - $this->_display_strategy = $strategy; |
|
297 | - } |
|
298 | - |
|
299 | - |
|
300 | - |
|
301 | - /** |
|
302 | - * Sets the sanitization strategy |
|
303 | - * |
|
304 | - * @param EE_Normalization_Strategy_Base $strategy |
|
305 | - */ |
|
306 | - protected function _set_normalization_strategy(EE_Normalization_Strategy_Base $strategy) |
|
307 | - { |
|
308 | - $this->_normalization_strategy = $strategy; |
|
309 | - } |
|
310 | - |
|
311 | - |
|
312 | - |
|
313 | - /** |
|
314 | - * Gets sensitive_data_removal_strategy |
|
315 | - * |
|
316 | - * @return EE_Sensitive_Data_Removal_Base |
|
317 | - */ |
|
318 | - public function get_sensitive_data_removal_strategy() |
|
319 | - { |
|
320 | - return $this->_sensitive_data_removal_strategy; |
|
321 | - } |
|
322 | - |
|
323 | - |
|
324 | - |
|
325 | - /** |
|
326 | - * Sets sensitive_data_removal_strategy |
|
327 | - * |
|
328 | - * @param EE_Sensitive_Data_Removal_Base $sensitive_data_removal_strategy |
|
329 | - * @return boolean |
|
330 | - */ |
|
331 | - public function set_sensitive_data_removal_strategy($sensitive_data_removal_strategy) |
|
332 | - { |
|
333 | - $this->_sensitive_data_removal_strategy = $sensitive_data_removal_strategy; |
|
334 | - } |
|
335 | - |
|
336 | - |
|
337 | - |
|
338 | - /** |
|
339 | - * Gets the display strategy for this input |
|
340 | - * |
|
341 | - * @return EE_Display_Strategy_Base |
|
342 | - */ |
|
343 | - public function get_display_strategy() |
|
344 | - { |
|
345 | - return $this->_display_strategy; |
|
346 | - } |
|
347 | - |
|
348 | - |
|
349 | - |
|
350 | - /** |
|
351 | - * Overwrites the display strategy |
|
352 | - * |
|
353 | - * @param EE_Display_Strategy_Base $display_strategy |
|
354 | - */ |
|
355 | - public function set_display_strategy($display_strategy) |
|
356 | - { |
|
357 | - $this->_display_strategy = $display_strategy; |
|
358 | - $this->_display_strategy->_construct_finalize($this); |
|
359 | - } |
|
360 | - |
|
361 | - |
|
362 | - |
|
363 | - /** |
|
364 | - * Gets the normalization strategy set on this input |
|
365 | - * |
|
366 | - * @return EE_Normalization_Strategy_Base |
|
367 | - */ |
|
368 | - public function get_normalization_strategy() |
|
369 | - { |
|
370 | - return $this->_normalization_strategy; |
|
371 | - } |
|
372 | - |
|
373 | - |
|
374 | - |
|
375 | - /** |
|
376 | - * Overwrites the normalization strategy |
|
377 | - * |
|
378 | - * @param EE_Normalization_Strategy_Base $normalization_strategy |
|
379 | - */ |
|
380 | - public function set_normalization_strategy($normalization_strategy) |
|
381 | - { |
|
382 | - $this->_normalization_strategy = $normalization_strategy; |
|
383 | - $this->_normalization_strategy->_construct_finalize($this); |
|
384 | - } |
|
385 | - |
|
386 | - |
|
387 | - |
|
388 | - /** |
|
389 | - * Returns all teh validation strategies which apply to this field, numerically indexed |
|
390 | - * |
|
391 | - * @return EE_Validation_Strategy_Base[] |
|
392 | - */ |
|
393 | - public function get_validation_strategies() |
|
394 | - { |
|
395 | - return $this->_validation_strategies; |
|
396 | - } |
|
397 | - |
|
398 | - |
|
399 | - |
|
400 | - /** |
|
401 | - * Adds this strategy to the field so it will be used in both JS validation and server-side validation |
|
402 | - * |
|
403 | - * @param EE_Validation_Strategy_Base $validation_strategy |
|
404 | - * @return void |
|
405 | - */ |
|
406 | - protected function _add_validation_strategy(EE_Validation_Strategy_Base $validation_strategy) |
|
407 | - { |
|
408 | - $validation_strategy->_construct_finalize($this); |
|
409 | - $this->_validation_strategies[] = $validation_strategy; |
|
410 | - } |
|
411 | - |
|
412 | - |
|
413 | - |
|
414 | - /** |
|
415 | - * Adds a new validation strategy onto the form input |
|
416 | - * |
|
417 | - * @param EE_Validation_Strategy_Base $validation_strategy |
|
418 | - * @return void |
|
419 | - */ |
|
420 | - public function add_validation_strategy(EE_Validation_Strategy_Base $validation_strategy) |
|
421 | - { |
|
422 | - $this->_add_validation_strategy($validation_strategy); |
|
423 | - } |
|
424 | - |
|
425 | - |
|
426 | - |
|
427 | - /** |
|
428 | - * The classname of the validation strategy to remove |
|
429 | - * |
|
430 | - * @param string $validation_strategy_classname |
|
431 | - */ |
|
432 | - public function remove_validation_strategy($validation_strategy_classname) |
|
433 | - { |
|
434 | - foreach ($this->_validation_strategies as $key => $validation_strategy) { |
|
435 | - if ( |
|
436 | - $validation_strategy instanceof $validation_strategy_classname |
|
437 | - || is_subclass_of($validation_strategy, $validation_strategy_classname) |
|
438 | - ) { |
|
439 | - unset($this->_validation_strategies[$key]); |
|
440 | - } |
|
441 | - } |
|
442 | - } |
|
443 | - |
|
444 | - |
|
445 | - |
|
446 | - /** |
|
447 | - * returns true if input employs any of the validation strategy defined by the supplied array of classnames |
|
448 | - * |
|
449 | - * @param array $validation_strategy_classnames |
|
450 | - * @return bool |
|
451 | - */ |
|
452 | - public function has_validation_strategy($validation_strategy_classnames) |
|
453 | - { |
|
454 | - $validation_strategy_classnames = is_array($validation_strategy_classnames) |
|
455 | - ? $validation_strategy_classnames |
|
456 | - : array($validation_strategy_classnames); |
|
457 | - foreach ($this->_validation_strategies as $key => $validation_strategy) { |
|
458 | - if (in_array($key, $validation_strategy_classnames)) { |
|
459 | - return true; |
|
460 | - } |
|
461 | - } |
|
462 | - return false; |
|
463 | - } |
|
464 | - |
|
465 | - |
|
466 | - |
|
467 | - /** |
|
468 | - * Gets the HTML |
|
469 | - * |
|
470 | - * @return string |
|
471 | - */ |
|
472 | - public function get_html() |
|
473 | - { |
|
474 | - return $this->_parent_section->get_html_for_input($this); |
|
475 | - } |
|
476 | - |
|
477 | - |
|
478 | - |
|
479 | - /** |
|
480 | - * Gets the HTML for the input itself (no label or errors) according to the |
|
481 | - * input's display strategy |
|
482 | - * Makes sure the JS and CSS are enqueued for it |
|
483 | - * |
|
484 | - * @return string |
|
485 | - * @throws \EE_Error |
|
486 | - */ |
|
487 | - public function get_html_for_input() |
|
488 | - { |
|
489 | - return $this->_form_html_filter |
|
490 | - ? $this->_form_html_filter->filterHtml( |
|
491 | - $this->_get_display_strategy()->display(), |
|
492 | - $this |
|
493 | - ) |
|
494 | - : $this->_get_display_strategy()->display(); |
|
495 | - } |
|
496 | - |
|
497 | - |
|
498 | - |
|
499 | - /** |
|
500 | - * @return string |
|
501 | - */ |
|
502 | - public function html_other_attributes() |
|
503 | - { |
|
504 | - return ! empty($this->_html_other_attributes) ? ' ' . $this->_html_other_attributes : ''; |
|
505 | - } |
|
506 | - |
|
507 | - |
|
508 | - |
|
509 | - /** |
|
510 | - * @param string $html_other_attributes |
|
511 | - */ |
|
512 | - public function set_html_other_attributes($html_other_attributes) |
|
513 | - { |
|
514 | - $this->_html_other_attributes = $html_other_attributes; |
|
515 | - } |
|
516 | - |
|
517 | - |
|
518 | - |
|
519 | - /** |
|
520 | - * Gets the HTML for displaying the label for this form input |
|
521 | - * according to the form section's layout strategy |
|
522 | - * |
|
523 | - * @return string |
|
524 | - */ |
|
525 | - public function get_html_for_label() |
|
526 | - { |
|
527 | - return $this->_parent_section->get_layout_strategy()->display_label($this); |
|
528 | - } |
|
529 | - |
|
530 | - |
|
531 | - |
|
532 | - /** |
|
533 | - * Gets the HTML for displaying the errors section for this form input |
|
534 | - * according to the form section's layout strategy |
|
535 | - * |
|
536 | - * @return string |
|
537 | - */ |
|
538 | - public function get_html_for_errors() |
|
539 | - { |
|
540 | - return $this->_parent_section->get_layout_strategy()->display_errors($this); |
|
541 | - } |
|
542 | - |
|
543 | - |
|
544 | - |
|
545 | - /** |
|
546 | - * Gets the HTML for displaying the help text for this form input |
|
547 | - * according to the form section's layout strategy |
|
548 | - * |
|
549 | - * @return string |
|
550 | - */ |
|
551 | - public function get_html_for_help() |
|
552 | - { |
|
553 | - return $this->_parent_section->get_layout_strategy()->display_help_text($this); |
|
554 | - } |
|
555 | - |
|
556 | - |
|
557 | - |
|
558 | - /** |
|
559 | - * Validates the input's sanitized value (assumes _sanitize() has already been called) |
|
560 | - * and returns whether or not the form input's submitted value is value |
|
561 | - * |
|
562 | - * @return boolean |
|
563 | - */ |
|
564 | - protected function _validate() |
|
565 | - { |
|
566 | - foreach ($this->_validation_strategies as $validation_strategy) { |
|
567 | - if ($validation_strategy instanceof EE_Validation_Strategy_Base) { |
|
568 | - try { |
|
569 | - $validation_strategy->validate($this->normalized_value()); |
|
570 | - } catch (EE_Validation_Error $e) { |
|
571 | - $this->add_validation_error($e); |
|
572 | - } |
|
573 | - } |
|
574 | - } |
|
575 | - if ($this->get_validation_errors()) { |
|
576 | - return false; |
|
577 | - } else { |
|
578 | - return true; |
|
579 | - } |
|
580 | - } |
|
581 | - |
|
582 | - |
|
583 | - |
|
584 | - /** |
|
585 | - * Performs basic sanitization on this value. But what sanitization can be performed anyways? |
|
586 | - * This value MIGHT be allowed to have tags, so we can't really remove them. |
|
587 | - * |
|
588 | - * @param string $value |
|
589 | - * @return null|string |
|
590 | - */ |
|
591 | - private function _sanitize($value) |
|
592 | - { |
|
593 | - return $value !== null ? stripslashes(html_entity_decode(trim($value))) : null; |
|
594 | - } |
|
595 | - |
|
596 | - |
|
597 | - |
|
598 | - /** |
|
599 | - * Picks out the form value that relates to this form input, |
|
600 | - * and stores it as the sanitized value on the form input, and sets the normalized value. |
|
601 | - * Returns whether or not any validation errors occurred |
|
602 | - * |
|
603 | - * @param array $req_data like $_POST |
|
604 | - * @return boolean whether or not there was an error |
|
605 | - * @throws \EE_Error |
|
606 | - */ |
|
607 | - protected function _normalize($req_data) |
|
608 | - { |
|
609 | - //any existing validation errors don't apply so clear them |
|
610 | - $this->_validation_errors = array(); |
|
611 | - try { |
|
612 | - $raw_input = $this->find_form_data_for_this_section($req_data); |
|
613 | - //super simple sanitization for now |
|
614 | - if (is_array($raw_input)) { |
|
615 | - $raw_value = array(); |
|
616 | - foreach ($raw_input as $key => $value) { |
|
617 | - $raw_value[$key] = $this->_sanitize($value); |
|
618 | - } |
|
619 | - $this->_set_raw_value($raw_value); |
|
620 | - } else { |
|
621 | - $this->_set_raw_value($this->_sanitize($raw_input)); |
|
622 | - } |
|
623 | - //we want to mostly leave the input alone in case we need to re-display it to the user |
|
624 | - $this->_set_normalized_value($this->_normalization_strategy->normalize($this->raw_value())); |
|
625 | - } catch (EE_Validation_Error $e) { |
|
626 | - $this->add_validation_error($e); |
|
627 | - } |
|
628 | - } |
|
629 | - |
|
630 | - |
|
631 | - |
|
632 | - /** |
|
633 | - * @return string |
|
634 | - */ |
|
635 | - public function html_name() |
|
636 | - { |
|
637 | - $this->_set_default_html_name_if_empty(); |
|
638 | - return $this->_html_name; |
|
639 | - } |
|
640 | - |
|
641 | - |
|
642 | - |
|
643 | - /** |
|
644 | - * @return string |
|
645 | - */ |
|
646 | - public function html_label_id() |
|
647 | - { |
|
648 | - return ! empty($this->_html_label_id) ? $this->_html_label_id : $this->_html_id . '-lbl'; |
|
649 | - } |
|
650 | - |
|
651 | - |
|
652 | - |
|
653 | - /** |
|
654 | - * @return string |
|
655 | - */ |
|
656 | - public function html_label_class() |
|
657 | - { |
|
658 | - return $this->_html_label_class; |
|
659 | - } |
|
660 | - |
|
661 | - |
|
662 | - |
|
663 | - /** |
|
664 | - * @return string |
|
665 | - */ |
|
666 | - public function html_label_style() |
|
667 | - { |
|
668 | - return $this->_html_label_style; |
|
669 | - } |
|
670 | - |
|
671 | - |
|
672 | - |
|
673 | - /** |
|
674 | - * @return string |
|
675 | - */ |
|
676 | - public function html_label_text() |
|
677 | - { |
|
678 | - return $this->_html_label_text; |
|
679 | - } |
|
680 | - |
|
681 | - |
|
682 | - |
|
683 | - /** |
|
684 | - * @return string |
|
685 | - */ |
|
686 | - public function html_help_text() |
|
687 | - { |
|
688 | - return $this->_html_help_text; |
|
689 | - } |
|
690 | - |
|
691 | - |
|
692 | - |
|
693 | - /** |
|
694 | - * @return string |
|
695 | - */ |
|
696 | - public function html_help_class() |
|
697 | - { |
|
698 | - return $this->_html_help_class; |
|
699 | - } |
|
700 | - |
|
701 | - |
|
702 | - |
|
703 | - /** |
|
704 | - * @return string |
|
705 | - */ |
|
706 | - public function html_help_style() |
|
707 | - { |
|
708 | - return $this->_html_style; |
|
709 | - } |
|
710 | - |
|
711 | - |
|
712 | - |
|
713 | - /** |
|
714 | - * returns the raw, UNSAFE, input, almost exactly as the user submitted it. |
|
715 | - * Please note that almost all client code should instead use the normalized_value; |
|
716 | - * or possibly raw_value_in_form (which prepares the string for displaying in an HTML attribute on a tag, |
|
717 | - * mostly by escaping quotes) |
|
718 | - * Note, we do not store the exact original value sent in the user's request because |
|
719 | - * it may have malicious content, and we MIGHT want to store the form input in a transient or something... |
|
720 | - * in which case, we would have stored the malicious content to our database. |
|
721 | - * |
|
722 | - * @return string |
|
723 | - */ |
|
724 | - public function raw_value() |
|
725 | - { |
|
726 | - return $this->_raw_value; |
|
727 | - } |
|
728 | - |
|
729 | - |
|
730 | - |
|
731 | - /** |
|
732 | - * Returns a string safe to usage in form inputs when displaying, because |
|
733 | - * it escapes all html entities |
|
734 | - * |
|
735 | - * @return string |
|
736 | - */ |
|
737 | - public function raw_value_in_form() |
|
738 | - { |
|
739 | - return htmlentities($this->raw_value(), ENT_QUOTES, 'UTF-8'); |
|
740 | - } |
|
741 | - |
|
742 | - |
|
743 | - |
|
744 | - /** |
|
745 | - * returns the value after it's been sanitized, and then converted into it's proper type |
|
746 | - * in PHP. Eg, a string, an int, an array, |
|
747 | - * |
|
748 | - * @return mixed |
|
749 | - */ |
|
750 | - public function normalized_value() |
|
751 | - { |
|
752 | - return $this->_normalized_value; |
|
753 | - } |
|
754 | - |
|
755 | - |
|
756 | - |
|
757 | - /** |
|
758 | - * Returns the normalized value is a presentable way. By default this is just |
|
759 | - * the normalized value by itself, but it can be overridden for when that's not |
|
760 | - * the best thing to display |
|
761 | - * |
|
762 | - * @return string |
|
763 | - */ |
|
764 | - public function pretty_value() |
|
765 | - { |
|
766 | - return $this->_normalized_value; |
|
767 | - } |
|
768 | - |
|
769 | - |
|
770 | - |
|
771 | - /** |
|
772 | - * When generating the JS for the jquery validation rules like<br> |
|
773 | - * <code>$( "#myform" ).validate({ |
|
774 | - * rules: { |
|
775 | - * password: "required", |
|
776 | - * password_again: { |
|
777 | - * equalTo: "#password" |
|
778 | - * } |
|
779 | - * } |
|
780 | - * });</code> |
|
781 | - * if this field had the name 'password_again', it should return |
|
782 | - * <br><code>password_again: { |
|
783 | - * equalTo: "#password" |
|
784 | - * }</code> |
|
785 | - * |
|
786 | - * @return array |
|
787 | - */ |
|
788 | - public function get_jquery_validation_rules() |
|
789 | - { |
|
790 | - $jquery_validation_js = array(); |
|
791 | - $jquery_validation_rules = array(); |
|
792 | - foreach ($this->get_validation_strategies() as $validation_strategy) { |
|
793 | - $jquery_validation_rules = array_replace_recursive( |
|
794 | - $jquery_validation_rules, |
|
795 | - $validation_strategy->get_jquery_validation_rule_array() |
|
796 | - ); |
|
797 | - } |
|
798 | - if (! empty($jquery_validation_rules)) { |
|
799 | - foreach ($this->get_display_strategy()->get_html_input_ids(true) as $html_id_with_pound_sign) { |
|
800 | - $jquery_validation_js[$html_id_with_pound_sign] = $jquery_validation_rules; |
|
801 | - } |
|
802 | - } |
|
803 | - return $jquery_validation_js; |
|
804 | - } |
|
805 | - |
|
806 | - |
|
807 | - |
|
808 | - /** |
|
809 | - * Sets the input's default value for use in displaying in the form. Note: value should be |
|
810 | - * normalized (Eg, if providing a default of ra Yes_NO_Input you would provide TRUE or FALSE, not '1' or '0') |
|
811 | - * |
|
812 | - * @param mixed $value |
|
813 | - * @return void |
|
814 | - */ |
|
815 | - public function set_default($value) |
|
816 | - { |
|
817 | - $this->_set_normalized_value($value); |
|
818 | - $this->_set_raw_value($value); |
|
819 | - } |
|
820 | - |
|
821 | - |
|
822 | - |
|
823 | - /** |
|
824 | - * Sets the normalized value on this input |
|
825 | - * |
|
826 | - * @param mixed $value |
|
827 | - */ |
|
828 | - protected function _set_normalized_value($value) |
|
829 | - { |
|
830 | - $this->_normalized_value = $value; |
|
831 | - } |
|
832 | - |
|
833 | - |
|
834 | - |
|
835 | - /** |
|
836 | - * Sets the raw value on this input (ie, exactly as the user submitted it) |
|
837 | - * |
|
838 | - * @param mixed $value |
|
839 | - */ |
|
840 | - protected function _set_raw_value($value) |
|
841 | - { |
|
842 | - $this->_raw_value = $this->_normalization_strategy->unnormalize($value); |
|
843 | - } |
|
844 | - |
|
845 | - |
|
846 | - |
|
847 | - /** |
|
848 | - * Sets the HTML label text after it has already been defined |
|
849 | - * |
|
850 | - * @param string $label |
|
851 | - * @return void |
|
852 | - */ |
|
853 | - public function set_html_label_text($label) |
|
854 | - { |
|
855 | - $this->_html_label_text = $label; |
|
856 | - } |
|
857 | - |
|
858 | - |
|
859 | - |
|
860 | - /** |
|
861 | - * Sets whether or not this field is required, and adjusts the validation strategy. |
|
862 | - * If you want to use the EE_Conditionally_Required_Validation_Strategy, |
|
863 | - * please add it as a validation strategy using add_validation_strategy as normal |
|
864 | - * |
|
865 | - * @param boolean $required boolean |
|
866 | - * @param null $required_text |
|
867 | - */ |
|
868 | - public function set_required($required = true, $required_text = null) |
|
869 | - { |
|
870 | - $required = filter_var($required, FILTER_VALIDATE_BOOLEAN); |
|
871 | - //whether $required is a string or a boolean, we want to add a required validation strategy |
|
872 | - if ($required) { |
|
873 | - $this->_add_validation_strategy(new EE_Required_Validation_Strategy($required_text)); |
|
874 | - } else { |
|
875 | - $this->remove_validation_strategy('EE_Required_Validation_Strategy'); |
|
876 | - } |
|
877 | - $this->_required = $required; |
|
878 | - } |
|
879 | - |
|
880 | - |
|
881 | - |
|
882 | - /** |
|
883 | - * Returns whether or not this field is required |
|
884 | - * |
|
885 | - * @return boolean |
|
886 | - */ |
|
887 | - public function required() |
|
888 | - { |
|
889 | - return $this->_required; |
|
890 | - } |
|
891 | - |
|
892 | - |
|
893 | - |
|
894 | - /** |
|
895 | - * @param string $required_css_class |
|
896 | - */ |
|
897 | - public function set_required_css_class($required_css_class) |
|
898 | - { |
|
899 | - $this->_required_css_class = $required_css_class; |
|
900 | - } |
|
901 | - |
|
902 | - |
|
903 | - |
|
904 | - /** |
|
905 | - * @return string |
|
906 | - */ |
|
907 | - public function required_css_class() |
|
908 | - { |
|
909 | - return $this->_required_css_class; |
|
910 | - } |
|
911 | - |
|
912 | - |
|
913 | - |
|
914 | - /** |
|
915 | - * Sets the help text, in case |
|
916 | - * |
|
917 | - * @param string $text |
|
918 | - */ |
|
919 | - public function set_html_help_text($text) |
|
920 | - { |
|
921 | - $this->_html_help_text = $text; |
|
922 | - } |
|
923 | - |
|
924 | - |
|
925 | - |
|
926 | - /** |
|
927 | - * Uses the sensitive data removal strategy to remove the sensitive data from this |
|
928 | - * input. If there is any kind of sensitive data removal on this input, we clear |
|
929 | - * out the raw value completely |
|
930 | - * |
|
931 | - * @return void |
|
932 | - */ |
|
933 | - public function clean_sensitive_data() |
|
934 | - { |
|
935 | - //if we do ANY kind of sensitive data removal on this, then just clear out the raw value |
|
936 | - //if we need more logic than this we'll make a strategy for it |
|
937 | - if ($this->_sensitive_data_removal_strategy |
|
938 | - && ! $this->_sensitive_data_removal_strategy instanceof EE_No_Sensitive_Data_Removal |
|
939 | - ) { |
|
940 | - $this->_set_raw_value(null); |
|
941 | - } |
|
942 | - //and clean the normalized value according to the appropriate strategy |
|
943 | - $this->_set_normalized_value( |
|
944 | - $this->get_sensitive_data_removal_strategy()->remove_sensitive_data( |
|
945 | - $this->_normalized_value |
|
946 | - ) |
|
947 | - ); |
|
948 | - } |
|
949 | - |
|
950 | - |
|
951 | - |
|
952 | - /** |
|
953 | - * @param bool $primary |
|
954 | - * @param string $button_size |
|
955 | - * @param string $other_attributes |
|
956 | - */ |
|
957 | - public function set_button_css_attributes($primary = true, $button_size = '', $other_attributes = '') |
|
958 | - { |
|
959 | - $button_css_attributes = 'button'; |
|
960 | - $button_css_attributes .= $primary === true ? ' button-primary' : ' button-secondary'; |
|
961 | - switch ($button_size) { |
|
962 | - case 'xs' : |
|
963 | - case 'extra-small' : |
|
964 | - $button_css_attributes .= ' button-xs'; |
|
965 | - break; |
|
966 | - case 'sm' : |
|
967 | - case 'small' : |
|
968 | - $button_css_attributes .= ' button-sm'; |
|
969 | - break; |
|
970 | - case 'lg' : |
|
971 | - case 'large' : |
|
972 | - $button_css_attributes .= ' button-lg'; |
|
973 | - break; |
|
974 | - case 'block' : |
|
975 | - $button_css_attributes .= ' button-block'; |
|
976 | - break; |
|
977 | - case 'md' : |
|
978 | - case 'medium' : |
|
979 | - default : |
|
980 | - $button_css_attributes .= ''; |
|
981 | - } |
|
982 | - $this->_button_css_attributes .= ! empty($other_attributes) |
|
983 | - ? $button_css_attributes . ' ' . $other_attributes |
|
984 | - : $button_css_attributes; |
|
985 | - } |
|
986 | - |
|
987 | - |
|
988 | - |
|
989 | - /** |
|
990 | - * @return string |
|
991 | - */ |
|
992 | - public function button_css_attributes() |
|
993 | - { |
|
994 | - if (empty($this->_button_css_attributes)) { |
|
995 | - $this->set_button_css_attributes(); |
|
996 | - } |
|
997 | - return $this->_button_css_attributes; |
|
998 | - } |
|
999 | - |
|
1000 | - |
|
1001 | - |
|
1002 | - /** |
|
1003 | - * find_form_data_for_this_section |
|
1004 | - * using this section's name and its parents, finds the value of the form data that corresponds to it. |
|
1005 | - * For example, if this form section's HTML name is my_form[subform][form_input_1], |
|
1006 | - * then it's value should be in $_REQUEST at $_REQUEST['my_form']['subform']['form_input_1']. |
|
1007 | - * (If that doesn't exist, we also check for this subsection's name |
|
1008 | - * at the TOP LEVEL of the request data. Eg $_REQUEST['form_input_1'].) |
|
1009 | - * This function finds its value in the form. |
|
1010 | - * |
|
1011 | - * @param array $req_data |
|
1012 | - * @return mixed whatever the raw value of this form section is in the request data |
|
1013 | - * @throws \EE_Error |
|
1014 | - */ |
|
1015 | - public function find_form_data_for_this_section($req_data) |
|
1016 | - { |
|
1017 | - // break up the html name by "[]" |
|
1018 | - if (strpos($this->html_name(), '[') !== false) { |
|
1019 | - $before_any_brackets = substr($this->html_name(), 0, strpos($this->html_name(), '[')); |
|
1020 | - } else { |
|
1021 | - $before_any_brackets = $this->html_name(); |
|
1022 | - } |
|
1023 | - // grab all of the segments |
|
1024 | - preg_match_all('~\[([^]]*)\]~', $this->html_name(), $matches); |
|
1025 | - if (isset($matches[1]) && is_array($matches[1])) { |
|
1026 | - $name_parts = $matches[1]; |
|
1027 | - array_unshift($name_parts, $before_any_brackets); |
|
1028 | - } else { |
|
1029 | - $name_parts = array($before_any_brackets); |
|
1030 | - } |
|
1031 | - // now get the value for the input |
|
1032 | - $value = $this->_find_form_data_for_this_section_using_name_parts($name_parts, $req_data); |
|
1033 | - // check if this thing's name is at the TOP level of the request data |
|
1034 | - if ($value === null && isset($req_data[$this->name()])) { |
|
1035 | - $value = $req_data[$this->name()]; |
|
1036 | - } |
|
1037 | - return $value; |
|
1038 | - } |
|
1039 | - |
|
1040 | - |
|
1041 | - |
|
1042 | - /** |
|
1043 | - * @param array $html_name_parts |
|
1044 | - * @param array $req_data |
|
1045 | - * @return array | NULL |
|
1046 | - */ |
|
1047 | - public function _find_form_data_for_this_section_using_name_parts($html_name_parts, $req_data) |
|
1048 | - { |
|
1049 | - $first_part_to_consider = array_shift($html_name_parts); |
|
1050 | - if (isset($req_data[$first_part_to_consider])) { |
|
1051 | - if (empty($html_name_parts)) { |
|
1052 | - return $req_data[$first_part_to_consider]; |
|
1053 | - } else { |
|
1054 | - return $this->_find_form_data_for_this_section_using_name_parts( |
|
1055 | - $html_name_parts, |
|
1056 | - $req_data[$first_part_to_consider] |
|
1057 | - ); |
|
1058 | - } |
|
1059 | - } else { |
|
1060 | - return null; |
|
1061 | - } |
|
1062 | - } |
|
1063 | - |
|
1064 | - |
|
1065 | - |
|
1066 | - /** |
|
1067 | - * Checks if this form input's data is in the request data |
|
1068 | - * |
|
1069 | - * @param array $req_data like $_POST |
|
1070 | - * @return boolean |
|
1071 | - * @throws \EE_Error |
|
1072 | - */ |
|
1073 | - public function form_data_present_in($req_data = null) |
|
1074 | - { |
|
1075 | - if ($req_data === null) { |
|
1076 | - $req_data = $_POST; |
|
1077 | - } |
|
1078 | - $checked_value = $this->find_form_data_for_this_section($req_data); |
|
1079 | - if ($checked_value !== null) { |
|
1080 | - return true; |
|
1081 | - } else { |
|
1082 | - return false; |
|
1083 | - } |
|
1084 | - } |
|
1085 | - |
|
1086 | - |
|
1087 | - |
|
1088 | - /** |
|
1089 | - * Overrides parent to add js data from validation and display strategies |
|
1090 | - * |
|
1091 | - * @param array $form_other_js_data |
|
1092 | - * @return array |
|
1093 | - */ |
|
1094 | - public function get_other_js_data($form_other_js_data = array()) |
|
1095 | - { |
|
1096 | - $form_other_js_data = $this->get_other_js_data_from_strategies($form_other_js_data); |
|
1097 | - return $form_other_js_data; |
|
1098 | - } |
|
1099 | - |
|
1100 | - |
|
1101 | - |
|
1102 | - /** |
|
1103 | - * Gets other JS data for localization from this input's strategies, like |
|
1104 | - * the validation strategies and the display strategy |
|
1105 | - * |
|
1106 | - * @param array $form_other_js_data |
|
1107 | - * @return array |
|
1108 | - */ |
|
1109 | - public function get_other_js_data_from_strategies($form_other_js_data = array()) |
|
1110 | - { |
|
1111 | - $form_other_js_data = $this->get_display_strategy()->get_other_js_data($form_other_js_data); |
|
1112 | - foreach ($this->get_validation_strategies() as $validation_strategy) { |
|
1113 | - $form_other_js_data = $validation_strategy->get_other_js_data($form_other_js_data); |
|
1114 | - } |
|
1115 | - return $form_other_js_data; |
|
1116 | - } |
|
1117 | - |
|
1118 | - |
|
1119 | - |
|
1120 | - /** |
|
1121 | - * Override parent because we want to give our strategies an opportunity to enqueue some js and css |
|
1122 | - * |
|
1123 | - * @return void |
|
1124 | - */ |
|
1125 | - public function enqueue_js() |
|
1126 | - { |
|
1127 | - //ask our display strategy and validation strategies if they have js to enqueue |
|
1128 | - $this->enqueue_js_from_strategies(); |
|
1129 | - } |
|
1130 | - |
|
1131 | - |
|
1132 | - |
|
1133 | - /** |
|
1134 | - * Tells strategies when its ok to enqueue their js and css |
|
1135 | - * |
|
1136 | - * @return void |
|
1137 | - */ |
|
1138 | - public function enqueue_js_from_strategies() |
|
1139 | - { |
|
1140 | - $this->get_display_strategy()->enqueue_js(); |
|
1141 | - foreach ($this->get_validation_strategies() as $validation_strategy) { |
|
1142 | - $validation_strategy->enqueue_js(); |
|
1143 | - } |
|
1144 | - } |
|
19 | + /** |
|
20 | + * the input's name attribute |
|
21 | + * |
|
22 | + * @var string |
|
23 | + */ |
|
24 | + protected $_html_name; |
|
25 | + |
|
26 | + /** |
|
27 | + * id for the html label tag |
|
28 | + * |
|
29 | + * @var string |
|
30 | + */ |
|
31 | + protected $_html_label_id; |
|
32 | + |
|
33 | + /** |
|
34 | + * class for teh html label tag |
|
35 | + * |
|
36 | + * @var string |
|
37 | + */ |
|
38 | + protected $_html_label_class; |
|
39 | + |
|
40 | + /** |
|
41 | + * any additional html attributes that you may want to add |
|
42 | + * |
|
43 | + * @var string |
|
44 | + */ |
|
45 | + protected $_html_other_attributes; |
|
46 | + |
|
47 | + /** |
|
48 | + * style for teh html label tag |
|
49 | + * |
|
50 | + * @var string |
|
51 | + */ |
|
52 | + protected $_html_label_style; |
|
53 | + |
|
54 | + /** |
|
55 | + * text to be placed in the html label |
|
56 | + * |
|
57 | + * @var string |
|
58 | + */ |
|
59 | + protected $_html_label_text; |
|
60 | + |
|
61 | + /** |
|
62 | + * the full html label. If used, all other html_label_* properties are invalid |
|
63 | + * |
|
64 | + * @var string |
|
65 | + */ |
|
66 | + protected $_html_label; |
|
67 | + |
|
68 | + /** |
|
69 | + * HTML to use for help text (normally placed below form input), in a span which normally |
|
70 | + * has a class of 'description' |
|
71 | + * |
|
72 | + * @var string |
|
73 | + */ |
|
74 | + protected $_html_help_text; |
|
75 | + |
|
76 | + /** |
|
77 | + * CSS classes for displaying the help span |
|
78 | + * |
|
79 | + * @var string |
|
80 | + */ |
|
81 | + protected $_html_help_class = 'description'; |
|
82 | + |
|
83 | + /** |
|
84 | + * CSS to put in the style attribute on the help span |
|
85 | + * |
|
86 | + * @var string |
|
87 | + */ |
|
88 | + protected $_html_help_style; |
|
89 | + |
|
90 | + /** |
|
91 | + * Stores whether or not this input's response is required. |
|
92 | + * Because certain styling elements may also want to know that this |
|
93 | + * input is required etc. |
|
94 | + * |
|
95 | + * @var boolean |
|
96 | + */ |
|
97 | + protected $_required; |
|
98 | + |
|
99 | + /** |
|
100 | + * css class added to required inputs |
|
101 | + * |
|
102 | + * @var string |
|
103 | + */ |
|
104 | + protected $_required_css_class = 'ee-required'; |
|
105 | + |
|
106 | + /** |
|
107 | + * css styles applied to button type inputs |
|
108 | + * |
|
109 | + * @var string |
|
110 | + */ |
|
111 | + protected $_button_css_attributes; |
|
112 | + |
|
113 | + /** |
|
114 | + * The raw data submitted for this, like in the $_POST super global. |
|
115 | + * Generally unsafe for usage in client code |
|
116 | + * |
|
117 | + * @var mixed string or array |
|
118 | + */ |
|
119 | + protected $_raw_value; |
|
120 | + |
|
121 | + /** |
|
122 | + * Value normalized according to the input's normalization strategy. |
|
123 | + * The normalization strategy dictates whether this is a string, int, float, |
|
124 | + * boolean, or array of any of those. |
|
125 | + * |
|
126 | + * @var mixed |
|
127 | + */ |
|
128 | + protected $_normalized_value; |
|
129 | + |
|
130 | + /** |
|
131 | + * Strategy used for displaying this field. |
|
132 | + * Child classes must use _get_display_strategy to access it. |
|
133 | + * |
|
134 | + * @var EE_Display_Strategy_Base |
|
135 | + */ |
|
136 | + private $_display_strategy; |
|
137 | + |
|
138 | + /** |
|
139 | + * Gets all the validation strategies used on this field |
|
140 | + * |
|
141 | + * @var EE_Validation_Strategy_Base[] |
|
142 | + */ |
|
143 | + private $_validation_strategies = array(); |
|
144 | + |
|
145 | + /** |
|
146 | + * The normalization strategy for this field |
|
147 | + * |
|
148 | + * @var EE_Normalization_Strategy_Base |
|
149 | + */ |
|
150 | + private $_normalization_strategy; |
|
151 | + |
|
152 | + /** |
|
153 | + * Strategy for removing sensitive data after we're done with the form input |
|
154 | + * |
|
155 | + * @var EE_Sensitive_Data_Removal_Base |
|
156 | + */ |
|
157 | + protected $_sensitive_data_removal_strategy; |
|
158 | + |
|
159 | + |
|
160 | + |
|
161 | + /** |
|
162 | + * @param array $input_args { |
|
163 | + * @type string $html_name the html name for the input |
|
164 | + * @type string $html_label_id the id attribute to give to the html label tag |
|
165 | + * @type string $html_label_class the class attribute to give to the html label tag |
|
166 | + * @type string $html_label_style the style attribute to give ot teh label tag |
|
167 | + * @type string $html_label_text the text to put in the label tag |
|
168 | + * @type string $html_label the full html label. If used, |
|
169 | + * all other html_label_* args are invalid |
|
170 | + * @type string $html_help_text text to put in help element |
|
171 | + * @type string $html_help_style style attribute to give to teh help element |
|
172 | + * @type string $html_help_class class attribute to give to the help element |
|
173 | + * @type string $default default value NORMALIZED (eg, if providing the default |
|
174 | + * for a Yes_No_Input, you should provide TRUE or FALSE, not '1' or '0') |
|
175 | + * @type EE_Display_Strategy_Base $display strategy |
|
176 | + * @type EE_Normalization_Strategy_Base $normalization_strategy |
|
177 | + * @type EE_Validation_Strategy_Base[] $validation_strategies |
|
178 | + * } |
|
179 | + */ |
|
180 | + public function __construct($input_args = array()) |
|
181 | + { |
|
182 | + $input_args = (array)apply_filters('FHEE__EE_Form_Input_Base___construct__input_args', $input_args, $this); |
|
183 | + // the following properties must be cast as arrays |
|
184 | + if (isset($input_args['validation_strategies'])) { |
|
185 | + foreach ((array)$input_args['validation_strategies'] as $validation_strategy) { |
|
186 | + if ($validation_strategy instanceof EE_Validation_Strategy_Base) { |
|
187 | + $this->_validation_strategies[get_class($validation_strategy)] = $validation_strategy; |
|
188 | + } |
|
189 | + } |
|
190 | + unset($input_args['validation_strategies']); |
|
191 | + } |
|
192 | + // loop thru incoming options |
|
193 | + foreach ($input_args as $key => $value) { |
|
194 | + // add underscore to $key to match property names |
|
195 | + $_key = '_' . $key; |
|
196 | + if (property_exists($this, $_key)) { |
|
197 | + $this->{$_key} = $value; |
|
198 | + } |
|
199 | + } |
|
200 | + // ensure that "required" is set correctly |
|
201 | + $this->set_required( |
|
202 | + $this->_required, isset($input_args['required_validation_error_message']) |
|
203 | + ? $input_args['required_validation_error_message'] |
|
204 | + : null |
|
205 | + ); |
|
206 | + //$this->_html_name_specified = isset( $input_args['html_name'] ) ? TRUE : FALSE; |
|
207 | + $this->_display_strategy->_construct_finalize($this); |
|
208 | + foreach ($this->_validation_strategies as $validation_strategy) { |
|
209 | + $validation_strategy->_construct_finalize($this); |
|
210 | + } |
|
211 | + if (! $this->_normalization_strategy) { |
|
212 | + $this->_normalization_strategy = new EE_Text_Normalization(); |
|
213 | + } |
|
214 | + $this->_normalization_strategy->_construct_finalize($this); |
|
215 | + //at least we can use the normalization strategy to populate the default |
|
216 | + if (isset($input_args['default'])) { |
|
217 | + $this->set_default($input_args['default']); |
|
218 | + } |
|
219 | + if (! $this->_sensitive_data_removal_strategy) { |
|
220 | + $this->_sensitive_data_removal_strategy = new EE_No_Sensitive_Data_Removal(); |
|
221 | + } |
|
222 | + $this->_sensitive_data_removal_strategy->_construct_finalize($this); |
|
223 | + parent::__construct($input_args); |
|
224 | + } |
|
225 | + |
|
226 | + |
|
227 | + |
|
228 | + /** |
|
229 | + * Sets the html_name to its default value, if none was specified in teh constructor. |
|
230 | + * Calculation involves using the name and the parent's html_name |
|
231 | + * |
|
232 | + * @throws \EE_Error |
|
233 | + */ |
|
234 | + protected function _set_default_html_name_if_empty() |
|
235 | + { |
|
236 | + if (! $this->_html_name) { |
|
237 | + $this->_html_name = $this->name(); |
|
238 | + if ($this->_parent_section && $this->_parent_section instanceof EE_Form_Section_Proper) { |
|
239 | + $this->_html_name = $this->_parent_section->html_name_prefix() . "[{$this->name()}]"; |
|
240 | + } |
|
241 | + } |
|
242 | + } |
|
243 | + |
|
244 | + |
|
245 | + |
|
246 | + /** |
|
247 | + * @param $parent_form_section |
|
248 | + * @param $name |
|
249 | + * @throws \EE_Error |
|
250 | + */ |
|
251 | + public function _construct_finalize($parent_form_section, $name) |
|
252 | + { |
|
253 | + parent::_construct_finalize($parent_form_section, $name); |
|
254 | + if ($this->_html_label === null && $this->_html_label_text === null) { |
|
255 | + $this->_html_label_text = ucwords(str_replace("_", " ", $name)); |
|
256 | + } |
|
257 | + do_action('AHEE__EE_Form_Input_Base___construct_finalize__end', $this, $parent_form_section, $name); |
|
258 | + } |
|
259 | + |
|
260 | + |
|
261 | + |
|
262 | + /** |
|
263 | + * Returns the strategy for displaying this form input. If none is set, throws an exception. |
|
264 | + * |
|
265 | + * @return EE_Display_Strategy_Base |
|
266 | + * @throws EE_Error |
|
267 | + */ |
|
268 | + protected function _get_display_strategy() |
|
269 | + { |
|
270 | + $this->ensure_construct_finalized_called(); |
|
271 | + if (! $this->_display_strategy || ! $this->_display_strategy instanceof EE_Display_Strategy_Base) { |
|
272 | + throw new EE_Error( |
|
273 | + sprintf( |
|
274 | + __( |
|
275 | + "Cannot get display strategy for form input with name %s and id %s, because it has not been set in the constructor", |
|
276 | + "event_espresso" |
|
277 | + ), |
|
278 | + $this->html_name(), |
|
279 | + $this->html_id() |
|
280 | + ) |
|
281 | + ); |
|
282 | + } else { |
|
283 | + return $this->_display_strategy; |
|
284 | + } |
|
285 | + } |
|
286 | + |
|
287 | + |
|
288 | + |
|
289 | + /** |
|
290 | + * Sets the display strategy. |
|
291 | + * |
|
292 | + * @param EE_Display_Strategy_Base $strategy |
|
293 | + */ |
|
294 | + protected function _set_display_strategy(EE_Display_Strategy_Base $strategy) |
|
295 | + { |
|
296 | + $this->_display_strategy = $strategy; |
|
297 | + } |
|
298 | + |
|
299 | + |
|
300 | + |
|
301 | + /** |
|
302 | + * Sets the sanitization strategy |
|
303 | + * |
|
304 | + * @param EE_Normalization_Strategy_Base $strategy |
|
305 | + */ |
|
306 | + protected function _set_normalization_strategy(EE_Normalization_Strategy_Base $strategy) |
|
307 | + { |
|
308 | + $this->_normalization_strategy = $strategy; |
|
309 | + } |
|
310 | + |
|
311 | + |
|
312 | + |
|
313 | + /** |
|
314 | + * Gets sensitive_data_removal_strategy |
|
315 | + * |
|
316 | + * @return EE_Sensitive_Data_Removal_Base |
|
317 | + */ |
|
318 | + public function get_sensitive_data_removal_strategy() |
|
319 | + { |
|
320 | + return $this->_sensitive_data_removal_strategy; |
|
321 | + } |
|
322 | + |
|
323 | + |
|
324 | + |
|
325 | + /** |
|
326 | + * Sets sensitive_data_removal_strategy |
|
327 | + * |
|
328 | + * @param EE_Sensitive_Data_Removal_Base $sensitive_data_removal_strategy |
|
329 | + * @return boolean |
|
330 | + */ |
|
331 | + public function set_sensitive_data_removal_strategy($sensitive_data_removal_strategy) |
|
332 | + { |
|
333 | + $this->_sensitive_data_removal_strategy = $sensitive_data_removal_strategy; |
|
334 | + } |
|
335 | + |
|
336 | + |
|
337 | + |
|
338 | + /** |
|
339 | + * Gets the display strategy for this input |
|
340 | + * |
|
341 | + * @return EE_Display_Strategy_Base |
|
342 | + */ |
|
343 | + public function get_display_strategy() |
|
344 | + { |
|
345 | + return $this->_display_strategy; |
|
346 | + } |
|
347 | + |
|
348 | + |
|
349 | + |
|
350 | + /** |
|
351 | + * Overwrites the display strategy |
|
352 | + * |
|
353 | + * @param EE_Display_Strategy_Base $display_strategy |
|
354 | + */ |
|
355 | + public function set_display_strategy($display_strategy) |
|
356 | + { |
|
357 | + $this->_display_strategy = $display_strategy; |
|
358 | + $this->_display_strategy->_construct_finalize($this); |
|
359 | + } |
|
360 | + |
|
361 | + |
|
362 | + |
|
363 | + /** |
|
364 | + * Gets the normalization strategy set on this input |
|
365 | + * |
|
366 | + * @return EE_Normalization_Strategy_Base |
|
367 | + */ |
|
368 | + public function get_normalization_strategy() |
|
369 | + { |
|
370 | + return $this->_normalization_strategy; |
|
371 | + } |
|
372 | + |
|
373 | + |
|
374 | + |
|
375 | + /** |
|
376 | + * Overwrites the normalization strategy |
|
377 | + * |
|
378 | + * @param EE_Normalization_Strategy_Base $normalization_strategy |
|
379 | + */ |
|
380 | + public function set_normalization_strategy($normalization_strategy) |
|
381 | + { |
|
382 | + $this->_normalization_strategy = $normalization_strategy; |
|
383 | + $this->_normalization_strategy->_construct_finalize($this); |
|
384 | + } |
|
385 | + |
|
386 | + |
|
387 | + |
|
388 | + /** |
|
389 | + * Returns all teh validation strategies which apply to this field, numerically indexed |
|
390 | + * |
|
391 | + * @return EE_Validation_Strategy_Base[] |
|
392 | + */ |
|
393 | + public function get_validation_strategies() |
|
394 | + { |
|
395 | + return $this->_validation_strategies; |
|
396 | + } |
|
397 | + |
|
398 | + |
|
399 | + |
|
400 | + /** |
|
401 | + * Adds this strategy to the field so it will be used in both JS validation and server-side validation |
|
402 | + * |
|
403 | + * @param EE_Validation_Strategy_Base $validation_strategy |
|
404 | + * @return void |
|
405 | + */ |
|
406 | + protected function _add_validation_strategy(EE_Validation_Strategy_Base $validation_strategy) |
|
407 | + { |
|
408 | + $validation_strategy->_construct_finalize($this); |
|
409 | + $this->_validation_strategies[] = $validation_strategy; |
|
410 | + } |
|
411 | + |
|
412 | + |
|
413 | + |
|
414 | + /** |
|
415 | + * Adds a new validation strategy onto the form input |
|
416 | + * |
|
417 | + * @param EE_Validation_Strategy_Base $validation_strategy |
|
418 | + * @return void |
|
419 | + */ |
|
420 | + public function add_validation_strategy(EE_Validation_Strategy_Base $validation_strategy) |
|
421 | + { |
|
422 | + $this->_add_validation_strategy($validation_strategy); |
|
423 | + } |
|
424 | + |
|
425 | + |
|
426 | + |
|
427 | + /** |
|
428 | + * The classname of the validation strategy to remove |
|
429 | + * |
|
430 | + * @param string $validation_strategy_classname |
|
431 | + */ |
|
432 | + public function remove_validation_strategy($validation_strategy_classname) |
|
433 | + { |
|
434 | + foreach ($this->_validation_strategies as $key => $validation_strategy) { |
|
435 | + if ( |
|
436 | + $validation_strategy instanceof $validation_strategy_classname |
|
437 | + || is_subclass_of($validation_strategy, $validation_strategy_classname) |
|
438 | + ) { |
|
439 | + unset($this->_validation_strategies[$key]); |
|
440 | + } |
|
441 | + } |
|
442 | + } |
|
443 | + |
|
444 | + |
|
445 | + |
|
446 | + /** |
|
447 | + * returns true if input employs any of the validation strategy defined by the supplied array of classnames |
|
448 | + * |
|
449 | + * @param array $validation_strategy_classnames |
|
450 | + * @return bool |
|
451 | + */ |
|
452 | + public function has_validation_strategy($validation_strategy_classnames) |
|
453 | + { |
|
454 | + $validation_strategy_classnames = is_array($validation_strategy_classnames) |
|
455 | + ? $validation_strategy_classnames |
|
456 | + : array($validation_strategy_classnames); |
|
457 | + foreach ($this->_validation_strategies as $key => $validation_strategy) { |
|
458 | + if (in_array($key, $validation_strategy_classnames)) { |
|
459 | + return true; |
|
460 | + } |
|
461 | + } |
|
462 | + return false; |
|
463 | + } |
|
464 | + |
|
465 | + |
|
466 | + |
|
467 | + /** |
|
468 | + * Gets the HTML |
|
469 | + * |
|
470 | + * @return string |
|
471 | + */ |
|
472 | + public function get_html() |
|
473 | + { |
|
474 | + return $this->_parent_section->get_html_for_input($this); |
|
475 | + } |
|
476 | + |
|
477 | + |
|
478 | + |
|
479 | + /** |
|
480 | + * Gets the HTML for the input itself (no label or errors) according to the |
|
481 | + * input's display strategy |
|
482 | + * Makes sure the JS and CSS are enqueued for it |
|
483 | + * |
|
484 | + * @return string |
|
485 | + * @throws \EE_Error |
|
486 | + */ |
|
487 | + public function get_html_for_input() |
|
488 | + { |
|
489 | + return $this->_form_html_filter |
|
490 | + ? $this->_form_html_filter->filterHtml( |
|
491 | + $this->_get_display_strategy()->display(), |
|
492 | + $this |
|
493 | + ) |
|
494 | + : $this->_get_display_strategy()->display(); |
|
495 | + } |
|
496 | + |
|
497 | + |
|
498 | + |
|
499 | + /** |
|
500 | + * @return string |
|
501 | + */ |
|
502 | + public function html_other_attributes() |
|
503 | + { |
|
504 | + return ! empty($this->_html_other_attributes) ? ' ' . $this->_html_other_attributes : ''; |
|
505 | + } |
|
506 | + |
|
507 | + |
|
508 | + |
|
509 | + /** |
|
510 | + * @param string $html_other_attributes |
|
511 | + */ |
|
512 | + public function set_html_other_attributes($html_other_attributes) |
|
513 | + { |
|
514 | + $this->_html_other_attributes = $html_other_attributes; |
|
515 | + } |
|
516 | + |
|
517 | + |
|
518 | + |
|
519 | + /** |
|
520 | + * Gets the HTML for displaying the label for this form input |
|
521 | + * according to the form section's layout strategy |
|
522 | + * |
|
523 | + * @return string |
|
524 | + */ |
|
525 | + public function get_html_for_label() |
|
526 | + { |
|
527 | + return $this->_parent_section->get_layout_strategy()->display_label($this); |
|
528 | + } |
|
529 | + |
|
530 | + |
|
531 | + |
|
532 | + /** |
|
533 | + * Gets the HTML for displaying the errors section for this form input |
|
534 | + * according to the form section's layout strategy |
|
535 | + * |
|
536 | + * @return string |
|
537 | + */ |
|
538 | + public function get_html_for_errors() |
|
539 | + { |
|
540 | + return $this->_parent_section->get_layout_strategy()->display_errors($this); |
|
541 | + } |
|
542 | + |
|
543 | + |
|
544 | + |
|
545 | + /** |
|
546 | + * Gets the HTML for displaying the help text for this form input |
|
547 | + * according to the form section's layout strategy |
|
548 | + * |
|
549 | + * @return string |
|
550 | + */ |
|
551 | + public function get_html_for_help() |
|
552 | + { |
|
553 | + return $this->_parent_section->get_layout_strategy()->display_help_text($this); |
|
554 | + } |
|
555 | + |
|
556 | + |
|
557 | + |
|
558 | + /** |
|
559 | + * Validates the input's sanitized value (assumes _sanitize() has already been called) |
|
560 | + * and returns whether or not the form input's submitted value is value |
|
561 | + * |
|
562 | + * @return boolean |
|
563 | + */ |
|
564 | + protected function _validate() |
|
565 | + { |
|
566 | + foreach ($this->_validation_strategies as $validation_strategy) { |
|
567 | + if ($validation_strategy instanceof EE_Validation_Strategy_Base) { |
|
568 | + try { |
|
569 | + $validation_strategy->validate($this->normalized_value()); |
|
570 | + } catch (EE_Validation_Error $e) { |
|
571 | + $this->add_validation_error($e); |
|
572 | + } |
|
573 | + } |
|
574 | + } |
|
575 | + if ($this->get_validation_errors()) { |
|
576 | + return false; |
|
577 | + } else { |
|
578 | + return true; |
|
579 | + } |
|
580 | + } |
|
581 | + |
|
582 | + |
|
583 | + |
|
584 | + /** |
|
585 | + * Performs basic sanitization on this value. But what sanitization can be performed anyways? |
|
586 | + * This value MIGHT be allowed to have tags, so we can't really remove them. |
|
587 | + * |
|
588 | + * @param string $value |
|
589 | + * @return null|string |
|
590 | + */ |
|
591 | + private function _sanitize($value) |
|
592 | + { |
|
593 | + return $value !== null ? stripslashes(html_entity_decode(trim($value))) : null; |
|
594 | + } |
|
595 | + |
|
596 | + |
|
597 | + |
|
598 | + /** |
|
599 | + * Picks out the form value that relates to this form input, |
|
600 | + * and stores it as the sanitized value on the form input, and sets the normalized value. |
|
601 | + * Returns whether or not any validation errors occurred |
|
602 | + * |
|
603 | + * @param array $req_data like $_POST |
|
604 | + * @return boolean whether or not there was an error |
|
605 | + * @throws \EE_Error |
|
606 | + */ |
|
607 | + protected function _normalize($req_data) |
|
608 | + { |
|
609 | + //any existing validation errors don't apply so clear them |
|
610 | + $this->_validation_errors = array(); |
|
611 | + try { |
|
612 | + $raw_input = $this->find_form_data_for_this_section($req_data); |
|
613 | + //super simple sanitization for now |
|
614 | + if (is_array($raw_input)) { |
|
615 | + $raw_value = array(); |
|
616 | + foreach ($raw_input as $key => $value) { |
|
617 | + $raw_value[$key] = $this->_sanitize($value); |
|
618 | + } |
|
619 | + $this->_set_raw_value($raw_value); |
|
620 | + } else { |
|
621 | + $this->_set_raw_value($this->_sanitize($raw_input)); |
|
622 | + } |
|
623 | + //we want to mostly leave the input alone in case we need to re-display it to the user |
|
624 | + $this->_set_normalized_value($this->_normalization_strategy->normalize($this->raw_value())); |
|
625 | + } catch (EE_Validation_Error $e) { |
|
626 | + $this->add_validation_error($e); |
|
627 | + } |
|
628 | + } |
|
629 | + |
|
630 | + |
|
631 | + |
|
632 | + /** |
|
633 | + * @return string |
|
634 | + */ |
|
635 | + public function html_name() |
|
636 | + { |
|
637 | + $this->_set_default_html_name_if_empty(); |
|
638 | + return $this->_html_name; |
|
639 | + } |
|
640 | + |
|
641 | + |
|
642 | + |
|
643 | + /** |
|
644 | + * @return string |
|
645 | + */ |
|
646 | + public function html_label_id() |
|
647 | + { |
|
648 | + return ! empty($this->_html_label_id) ? $this->_html_label_id : $this->_html_id . '-lbl'; |
|
649 | + } |
|
650 | + |
|
651 | + |
|
652 | + |
|
653 | + /** |
|
654 | + * @return string |
|
655 | + */ |
|
656 | + public function html_label_class() |
|
657 | + { |
|
658 | + return $this->_html_label_class; |
|
659 | + } |
|
660 | + |
|
661 | + |
|
662 | + |
|
663 | + /** |
|
664 | + * @return string |
|
665 | + */ |
|
666 | + public function html_label_style() |
|
667 | + { |
|
668 | + return $this->_html_label_style; |
|
669 | + } |
|
670 | + |
|
671 | + |
|
672 | + |
|
673 | + /** |
|
674 | + * @return string |
|
675 | + */ |
|
676 | + public function html_label_text() |
|
677 | + { |
|
678 | + return $this->_html_label_text; |
|
679 | + } |
|
680 | + |
|
681 | + |
|
682 | + |
|
683 | + /** |
|
684 | + * @return string |
|
685 | + */ |
|
686 | + public function html_help_text() |
|
687 | + { |
|
688 | + return $this->_html_help_text; |
|
689 | + } |
|
690 | + |
|
691 | + |
|
692 | + |
|
693 | + /** |
|
694 | + * @return string |
|
695 | + */ |
|
696 | + public function html_help_class() |
|
697 | + { |
|
698 | + return $this->_html_help_class; |
|
699 | + } |
|
700 | + |
|
701 | + |
|
702 | + |
|
703 | + /** |
|
704 | + * @return string |
|
705 | + */ |
|
706 | + public function html_help_style() |
|
707 | + { |
|
708 | + return $this->_html_style; |
|
709 | + } |
|
710 | + |
|
711 | + |
|
712 | + |
|
713 | + /** |
|
714 | + * returns the raw, UNSAFE, input, almost exactly as the user submitted it. |
|
715 | + * Please note that almost all client code should instead use the normalized_value; |
|
716 | + * or possibly raw_value_in_form (which prepares the string for displaying in an HTML attribute on a tag, |
|
717 | + * mostly by escaping quotes) |
|
718 | + * Note, we do not store the exact original value sent in the user's request because |
|
719 | + * it may have malicious content, and we MIGHT want to store the form input in a transient or something... |
|
720 | + * in which case, we would have stored the malicious content to our database. |
|
721 | + * |
|
722 | + * @return string |
|
723 | + */ |
|
724 | + public function raw_value() |
|
725 | + { |
|
726 | + return $this->_raw_value; |
|
727 | + } |
|
728 | + |
|
729 | + |
|
730 | + |
|
731 | + /** |
|
732 | + * Returns a string safe to usage in form inputs when displaying, because |
|
733 | + * it escapes all html entities |
|
734 | + * |
|
735 | + * @return string |
|
736 | + */ |
|
737 | + public function raw_value_in_form() |
|
738 | + { |
|
739 | + return htmlentities($this->raw_value(), ENT_QUOTES, 'UTF-8'); |
|
740 | + } |
|
741 | + |
|
742 | + |
|
743 | + |
|
744 | + /** |
|
745 | + * returns the value after it's been sanitized, and then converted into it's proper type |
|
746 | + * in PHP. Eg, a string, an int, an array, |
|
747 | + * |
|
748 | + * @return mixed |
|
749 | + */ |
|
750 | + public function normalized_value() |
|
751 | + { |
|
752 | + return $this->_normalized_value; |
|
753 | + } |
|
754 | + |
|
755 | + |
|
756 | + |
|
757 | + /** |
|
758 | + * Returns the normalized value is a presentable way. By default this is just |
|
759 | + * the normalized value by itself, but it can be overridden for when that's not |
|
760 | + * the best thing to display |
|
761 | + * |
|
762 | + * @return string |
|
763 | + */ |
|
764 | + public function pretty_value() |
|
765 | + { |
|
766 | + return $this->_normalized_value; |
|
767 | + } |
|
768 | + |
|
769 | + |
|
770 | + |
|
771 | + /** |
|
772 | + * When generating the JS for the jquery validation rules like<br> |
|
773 | + * <code>$( "#myform" ).validate({ |
|
774 | + * rules: { |
|
775 | + * password: "required", |
|
776 | + * password_again: { |
|
777 | + * equalTo: "#password" |
|
778 | + * } |
|
779 | + * } |
|
780 | + * });</code> |
|
781 | + * if this field had the name 'password_again', it should return |
|
782 | + * <br><code>password_again: { |
|
783 | + * equalTo: "#password" |
|
784 | + * }</code> |
|
785 | + * |
|
786 | + * @return array |
|
787 | + */ |
|
788 | + public function get_jquery_validation_rules() |
|
789 | + { |
|
790 | + $jquery_validation_js = array(); |
|
791 | + $jquery_validation_rules = array(); |
|
792 | + foreach ($this->get_validation_strategies() as $validation_strategy) { |
|
793 | + $jquery_validation_rules = array_replace_recursive( |
|
794 | + $jquery_validation_rules, |
|
795 | + $validation_strategy->get_jquery_validation_rule_array() |
|
796 | + ); |
|
797 | + } |
|
798 | + if (! empty($jquery_validation_rules)) { |
|
799 | + foreach ($this->get_display_strategy()->get_html_input_ids(true) as $html_id_with_pound_sign) { |
|
800 | + $jquery_validation_js[$html_id_with_pound_sign] = $jquery_validation_rules; |
|
801 | + } |
|
802 | + } |
|
803 | + return $jquery_validation_js; |
|
804 | + } |
|
805 | + |
|
806 | + |
|
807 | + |
|
808 | + /** |
|
809 | + * Sets the input's default value for use in displaying in the form. Note: value should be |
|
810 | + * normalized (Eg, if providing a default of ra Yes_NO_Input you would provide TRUE or FALSE, not '1' or '0') |
|
811 | + * |
|
812 | + * @param mixed $value |
|
813 | + * @return void |
|
814 | + */ |
|
815 | + public function set_default($value) |
|
816 | + { |
|
817 | + $this->_set_normalized_value($value); |
|
818 | + $this->_set_raw_value($value); |
|
819 | + } |
|
820 | + |
|
821 | + |
|
822 | + |
|
823 | + /** |
|
824 | + * Sets the normalized value on this input |
|
825 | + * |
|
826 | + * @param mixed $value |
|
827 | + */ |
|
828 | + protected function _set_normalized_value($value) |
|
829 | + { |
|
830 | + $this->_normalized_value = $value; |
|
831 | + } |
|
832 | + |
|
833 | + |
|
834 | + |
|
835 | + /** |
|
836 | + * Sets the raw value on this input (ie, exactly as the user submitted it) |
|
837 | + * |
|
838 | + * @param mixed $value |
|
839 | + */ |
|
840 | + protected function _set_raw_value($value) |
|
841 | + { |
|
842 | + $this->_raw_value = $this->_normalization_strategy->unnormalize($value); |
|
843 | + } |
|
844 | + |
|
845 | + |
|
846 | + |
|
847 | + /** |
|
848 | + * Sets the HTML label text after it has already been defined |
|
849 | + * |
|
850 | + * @param string $label |
|
851 | + * @return void |
|
852 | + */ |
|
853 | + public function set_html_label_text($label) |
|
854 | + { |
|
855 | + $this->_html_label_text = $label; |
|
856 | + } |
|
857 | + |
|
858 | + |
|
859 | + |
|
860 | + /** |
|
861 | + * Sets whether or not this field is required, and adjusts the validation strategy. |
|
862 | + * If you want to use the EE_Conditionally_Required_Validation_Strategy, |
|
863 | + * please add it as a validation strategy using add_validation_strategy as normal |
|
864 | + * |
|
865 | + * @param boolean $required boolean |
|
866 | + * @param null $required_text |
|
867 | + */ |
|
868 | + public function set_required($required = true, $required_text = null) |
|
869 | + { |
|
870 | + $required = filter_var($required, FILTER_VALIDATE_BOOLEAN); |
|
871 | + //whether $required is a string or a boolean, we want to add a required validation strategy |
|
872 | + if ($required) { |
|
873 | + $this->_add_validation_strategy(new EE_Required_Validation_Strategy($required_text)); |
|
874 | + } else { |
|
875 | + $this->remove_validation_strategy('EE_Required_Validation_Strategy'); |
|
876 | + } |
|
877 | + $this->_required = $required; |
|
878 | + } |
|
879 | + |
|
880 | + |
|
881 | + |
|
882 | + /** |
|
883 | + * Returns whether or not this field is required |
|
884 | + * |
|
885 | + * @return boolean |
|
886 | + */ |
|
887 | + public function required() |
|
888 | + { |
|
889 | + return $this->_required; |
|
890 | + } |
|
891 | + |
|
892 | + |
|
893 | + |
|
894 | + /** |
|
895 | + * @param string $required_css_class |
|
896 | + */ |
|
897 | + public function set_required_css_class($required_css_class) |
|
898 | + { |
|
899 | + $this->_required_css_class = $required_css_class; |
|
900 | + } |
|
901 | + |
|
902 | + |
|
903 | + |
|
904 | + /** |
|
905 | + * @return string |
|
906 | + */ |
|
907 | + public function required_css_class() |
|
908 | + { |
|
909 | + return $this->_required_css_class; |
|
910 | + } |
|
911 | + |
|
912 | + |
|
913 | + |
|
914 | + /** |
|
915 | + * Sets the help text, in case |
|
916 | + * |
|
917 | + * @param string $text |
|
918 | + */ |
|
919 | + public function set_html_help_text($text) |
|
920 | + { |
|
921 | + $this->_html_help_text = $text; |
|
922 | + } |
|
923 | + |
|
924 | + |
|
925 | + |
|
926 | + /** |
|
927 | + * Uses the sensitive data removal strategy to remove the sensitive data from this |
|
928 | + * input. If there is any kind of sensitive data removal on this input, we clear |
|
929 | + * out the raw value completely |
|
930 | + * |
|
931 | + * @return void |
|
932 | + */ |
|
933 | + public function clean_sensitive_data() |
|
934 | + { |
|
935 | + //if we do ANY kind of sensitive data removal on this, then just clear out the raw value |
|
936 | + //if we need more logic than this we'll make a strategy for it |
|
937 | + if ($this->_sensitive_data_removal_strategy |
|
938 | + && ! $this->_sensitive_data_removal_strategy instanceof EE_No_Sensitive_Data_Removal |
|
939 | + ) { |
|
940 | + $this->_set_raw_value(null); |
|
941 | + } |
|
942 | + //and clean the normalized value according to the appropriate strategy |
|
943 | + $this->_set_normalized_value( |
|
944 | + $this->get_sensitive_data_removal_strategy()->remove_sensitive_data( |
|
945 | + $this->_normalized_value |
|
946 | + ) |
|
947 | + ); |
|
948 | + } |
|
949 | + |
|
950 | + |
|
951 | + |
|
952 | + /** |
|
953 | + * @param bool $primary |
|
954 | + * @param string $button_size |
|
955 | + * @param string $other_attributes |
|
956 | + */ |
|
957 | + public function set_button_css_attributes($primary = true, $button_size = '', $other_attributes = '') |
|
958 | + { |
|
959 | + $button_css_attributes = 'button'; |
|
960 | + $button_css_attributes .= $primary === true ? ' button-primary' : ' button-secondary'; |
|
961 | + switch ($button_size) { |
|
962 | + case 'xs' : |
|
963 | + case 'extra-small' : |
|
964 | + $button_css_attributes .= ' button-xs'; |
|
965 | + break; |
|
966 | + case 'sm' : |
|
967 | + case 'small' : |
|
968 | + $button_css_attributes .= ' button-sm'; |
|
969 | + break; |
|
970 | + case 'lg' : |
|
971 | + case 'large' : |
|
972 | + $button_css_attributes .= ' button-lg'; |
|
973 | + break; |
|
974 | + case 'block' : |
|
975 | + $button_css_attributes .= ' button-block'; |
|
976 | + break; |
|
977 | + case 'md' : |
|
978 | + case 'medium' : |
|
979 | + default : |
|
980 | + $button_css_attributes .= ''; |
|
981 | + } |
|
982 | + $this->_button_css_attributes .= ! empty($other_attributes) |
|
983 | + ? $button_css_attributes . ' ' . $other_attributes |
|
984 | + : $button_css_attributes; |
|
985 | + } |
|
986 | + |
|
987 | + |
|
988 | + |
|
989 | + /** |
|
990 | + * @return string |
|
991 | + */ |
|
992 | + public function button_css_attributes() |
|
993 | + { |
|
994 | + if (empty($this->_button_css_attributes)) { |
|
995 | + $this->set_button_css_attributes(); |
|
996 | + } |
|
997 | + return $this->_button_css_attributes; |
|
998 | + } |
|
999 | + |
|
1000 | + |
|
1001 | + |
|
1002 | + /** |
|
1003 | + * find_form_data_for_this_section |
|
1004 | + * using this section's name and its parents, finds the value of the form data that corresponds to it. |
|
1005 | + * For example, if this form section's HTML name is my_form[subform][form_input_1], |
|
1006 | + * then it's value should be in $_REQUEST at $_REQUEST['my_form']['subform']['form_input_1']. |
|
1007 | + * (If that doesn't exist, we also check for this subsection's name |
|
1008 | + * at the TOP LEVEL of the request data. Eg $_REQUEST['form_input_1'].) |
|
1009 | + * This function finds its value in the form. |
|
1010 | + * |
|
1011 | + * @param array $req_data |
|
1012 | + * @return mixed whatever the raw value of this form section is in the request data |
|
1013 | + * @throws \EE_Error |
|
1014 | + */ |
|
1015 | + public function find_form_data_for_this_section($req_data) |
|
1016 | + { |
|
1017 | + // break up the html name by "[]" |
|
1018 | + if (strpos($this->html_name(), '[') !== false) { |
|
1019 | + $before_any_brackets = substr($this->html_name(), 0, strpos($this->html_name(), '[')); |
|
1020 | + } else { |
|
1021 | + $before_any_brackets = $this->html_name(); |
|
1022 | + } |
|
1023 | + // grab all of the segments |
|
1024 | + preg_match_all('~\[([^]]*)\]~', $this->html_name(), $matches); |
|
1025 | + if (isset($matches[1]) && is_array($matches[1])) { |
|
1026 | + $name_parts = $matches[1]; |
|
1027 | + array_unshift($name_parts, $before_any_brackets); |
|
1028 | + } else { |
|
1029 | + $name_parts = array($before_any_brackets); |
|
1030 | + } |
|
1031 | + // now get the value for the input |
|
1032 | + $value = $this->_find_form_data_for_this_section_using_name_parts($name_parts, $req_data); |
|
1033 | + // check if this thing's name is at the TOP level of the request data |
|
1034 | + if ($value === null && isset($req_data[$this->name()])) { |
|
1035 | + $value = $req_data[$this->name()]; |
|
1036 | + } |
|
1037 | + return $value; |
|
1038 | + } |
|
1039 | + |
|
1040 | + |
|
1041 | + |
|
1042 | + /** |
|
1043 | + * @param array $html_name_parts |
|
1044 | + * @param array $req_data |
|
1045 | + * @return array | NULL |
|
1046 | + */ |
|
1047 | + public function _find_form_data_for_this_section_using_name_parts($html_name_parts, $req_data) |
|
1048 | + { |
|
1049 | + $first_part_to_consider = array_shift($html_name_parts); |
|
1050 | + if (isset($req_data[$first_part_to_consider])) { |
|
1051 | + if (empty($html_name_parts)) { |
|
1052 | + return $req_data[$first_part_to_consider]; |
|
1053 | + } else { |
|
1054 | + return $this->_find_form_data_for_this_section_using_name_parts( |
|
1055 | + $html_name_parts, |
|
1056 | + $req_data[$first_part_to_consider] |
|
1057 | + ); |
|
1058 | + } |
|
1059 | + } else { |
|
1060 | + return null; |
|
1061 | + } |
|
1062 | + } |
|
1063 | + |
|
1064 | + |
|
1065 | + |
|
1066 | + /** |
|
1067 | + * Checks if this form input's data is in the request data |
|
1068 | + * |
|
1069 | + * @param array $req_data like $_POST |
|
1070 | + * @return boolean |
|
1071 | + * @throws \EE_Error |
|
1072 | + */ |
|
1073 | + public function form_data_present_in($req_data = null) |
|
1074 | + { |
|
1075 | + if ($req_data === null) { |
|
1076 | + $req_data = $_POST; |
|
1077 | + } |
|
1078 | + $checked_value = $this->find_form_data_for_this_section($req_data); |
|
1079 | + if ($checked_value !== null) { |
|
1080 | + return true; |
|
1081 | + } else { |
|
1082 | + return false; |
|
1083 | + } |
|
1084 | + } |
|
1085 | + |
|
1086 | + |
|
1087 | + |
|
1088 | + /** |
|
1089 | + * Overrides parent to add js data from validation and display strategies |
|
1090 | + * |
|
1091 | + * @param array $form_other_js_data |
|
1092 | + * @return array |
|
1093 | + */ |
|
1094 | + public function get_other_js_data($form_other_js_data = array()) |
|
1095 | + { |
|
1096 | + $form_other_js_data = $this->get_other_js_data_from_strategies($form_other_js_data); |
|
1097 | + return $form_other_js_data; |
|
1098 | + } |
|
1099 | + |
|
1100 | + |
|
1101 | + |
|
1102 | + /** |
|
1103 | + * Gets other JS data for localization from this input's strategies, like |
|
1104 | + * the validation strategies and the display strategy |
|
1105 | + * |
|
1106 | + * @param array $form_other_js_data |
|
1107 | + * @return array |
|
1108 | + */ |
|
1109 | + public function get_other_js_data_from_strategies($form_other_js_data = array()) |
|
1110 | + { |
|
1111 | + $form_other_js_data = $this->get_display_strategy()->get_other_js_data($form_other_js_data); |
|
1112 | + foreach ($this->get_validation_strategies() as $validation_strategy) { |
|
1113 | + $form_other_js_data = $validation_strategy->get_other_js_data($form_other_js_data); |
|
1114 | + } |
|
1115 | + return $form_other_js_data; |
|
1116 | + } |
|
1117 | + |
|
1118 | + |
|
1119 | + |
|
1120 | + /** |
|
1121 | + * Override parent because we want to give our strategies an opportunity to enqueue some js and css |
|
1122 | + * |
|
1123 | + * @return void |
|
1124 | + */ |
|
1125 | + public function enqueue_js() |
|
1126 | + { |
|
1127 | + //ask our display strategy and validation strategies if they have js to enqueue |
|
1128 | + $this->enqueue_js_from_strategies(); |
|
1129 | + } |
|
1130 | + |
|
1131 | + |
|
1132 | + |
|
1133 | + /** |
|
1134 | + * Tells strategies when its ok to enqueue their js and css |
|
1135 | + * |
|
1136 | + * @return void |
|
1137 | + */ |
|
1138 | + public function enqueue_js_from_strategies() |
|
1139 | + { |
|
1140 | + $this->get_display_strategy()->enqueue_js(); |
|
1141 | + foreach ($this->get_validation_strategies() as $validation_strategy) { |
|
1142 | + $validation_strategy->enqueue_js(); |
|
1143 | + } |
|
1144 | + } |
|
1145 | 1145 | } |
@@ -7,8 +7,7 @@ discard block |
||
7 | 7 | * the interaction of EE_Transaction and EE_Registration model objects |
8 | 8 | * Provides methods for manipulating and processing changes to an EE_Transaction |
9 | 9 | * and it's related EE_Registrations with regards to the checkout/registration process |
10 | - |
|
11 | -* |
|
10 | + * |
|
12 | 11 | *@package Event Espresso |
13 | 12 | * @subpackage core |
14 | 13 | * @author Brent Christensen |
@@ -177,24 +176,24 @@ discard block |
||
177 | 176 | |
178 | 177 | |
179 | 178 | |
180 | - /** |
|
181 | - * update_transaction_and_registrations_after_checkout_or_payment |
|
182 | - * cycles thru related registrations and calls update_registration_after_checkout_or_payment() on each |
|
183 | - * |
|
184 | - * @param EE_Transaction $transaction |
|
185 | - * @param \EE_Payment | NULL $payment |
|
186 | - * @param array $registration_query_params array of query WHERE params to use |
|
187 | - * when retrieving cached registrations from a transaction |
|
188 | - * @param bool $trigger_notifications whether or not to call |
|
189 | - * \EE_Registration_Processor::trigger_registration_update_notifications() |
|
190 | - * @return array |
|
191 | - * @throws \EE_Error |
|
192 | - */ |
|
179 | + /** |
|
180 | + * update_transaction_and_registrations_after_checkout_or_payment |
|
181 | + * cycles thru related registrations and calls update_registration_after_checkout_or_payment() on each |
|
182 | + * |
|
183 | + * @param EE_Transaction $transaction |
|
184 | + * @param \EE_Payment | NULL $payment |
|
185 | + * @param array $registration_query_params array of query WHERE params to use |
|
186 | + * when retrieving cached registrations from a transaction |
|
187 | + * @param bool $trigger_notifications whether or not to call |
|
188 | + * \EE_Registration_Processor::trigger_registration_update_notifications() |
|
189 | + * @return array |
|
190 | + * @throws \EE_Error |
|
191 | + */ |
|
193 | 192 | public function update_transaction_and_registrations_after_checkout_or_payment( |
194 | 193 | EE_Transaction $transaction, |
195 | 194 | $payment = null, |
196 | 195 | $registration_query_params = array(), |
197 | - $trigger_notifications = true |
|
196 | + $trigger_notifications = true |
|
198 | 197 | ) { |
199 | 198 | // make sure some query params are set for retrieving registrations |
200 | 199 | $this->_set_registration_query_params( $registration_query_params ); |
@@ -224,15 +223,15 @@ discard block |
||
224 | 223 | $update_params |
225 | 224 | ); |
226 | 225 | if ($trigger_notifications) { |
227 | - // send messages |
|
228 | - /** @type EE_Registration_Processor $registration_processor */ |
|
229 | - $registration_processor = EE_Registry::instance()->load_class('Registration_Processor'); |
|
230 | - $registration_processor->trigger_registration_update_notifications( |
|
231 | - $transaction->primary_registration(), |
|
232 | - $update_params |
|
233 | - ); |
|
234 | - } |
|
235 | - do_action( |
|
226 | + // send messages |
|
227 | + /** @type EE_Registration_Processor $registration_processor */ |
|
228 | + $registration_processor = EE_Registry::instance()->load_class('Registration_Processor'); |
|
229 | + $registration_processor->trigger_registration_update_notifications( |
|
230 | + $transaction->primary_registration(), |
|
231 | + $update_params |
|
232 | + ); |
|
233 | + } |
|
234 | + do_action( |
|
236 | 235 | 'AHEE__EE_Transaction_Processor__update_transaction_and_registrations_after_checkout_or_payment', |
237 | 236 | $transaction, |
238 | 237 | $update_params |
@@ -242,17 +241,17 @@ discard block |
||
242 | 241 | |
243 | 242 | |
244 | 243 | |
245 | - /** |
|
246 | - * update_transaction_after_registration_reopened |
|
247 | - * readjusts TXN and Line Item totals after a registration is changed from |
|
248 | - * cancelled or declined to another reg status such as pending payment or approved |
|
249 | - * |
|
250 | - * @param \EE_Registration $registration |
|
251 | - * @param array $closed_reg_statuses |
|
252 | - * @param bool $update_txn |
|
253 | - * @return bool |
|
254 | - * @throws \EE_Error |
|
255 | - */ |
|
244 | + /** |
|
245 | + * update_transaction_after_registration_reopened |
|
246 | + * readjusts TXN and Line Item totals after a registration is changed from |
|
247 | + * cancelled or declined to another reg status such as pending payment or approved |
|
248 | + * |
|
249 | + * @param \EE_Registration $registration |
|
250 | + * @param array $closed_reg_statuses |
|
251 | + * @param bool $update_txn |
|
252 | + * @return bool |
|
253 | + * @throws \EE_Error |
|
254 | + */ |
|
256 | 255 | public function update_transaction_after_reinstating_canceled_registration( |
257 | 256 | EE_Registration $registration, |
258 | 257 | $closed_reg_statuses = array(), |
@@ -314,15 +313,15 @@ discard block |
||
314 | 313 | try { |
315 | 314 | $transaction = $this->get_transaction_for_registration( $registration ); |
316 | 315 | if ( |
317 | - apply_filters( |
|
318 | - 'FHEE__EE_Transaction_Processor__update_transaction_after_canceled_or_declined_registration__cancel_ticket_line_item', |
|
319 | - true, |
|
320 | - $registration, |
|
321 | - $transaction |
|
322 | - ) |
|
323 | - ){ |
|
324 | - $ticket_line_item = $this->get_ticket_line_item_for_transaction_registration( $transaction, $registration ); |
|
325 | - EEH_Line_Item::cancel_ticket_line_item( $ticket_line_item ); |
|
316 | + apply_filters( |
|
317 | + 'FHEE__EE_Transaction_Processor__update_transaction_after_canceled_or_declined_registration__cancel_ticket_line_item', |
|
318 | + true, |
|
319 | + $registration, |
|
320 | + $transaction |
|
321 | + ) |
|
322 | + ){ |
|
323 | + $ticket_line_item = $this->get_ticket_line_item_for_transaction_registration( $transaction, $registration ); |
|
324 | + EEH_Line_Item::cancel_ticket_line_item( $ticket_line_item ); |
|
326 | 325 | } |
327 | 326 | } catch ( EE_Error $e ) { |
328 | 327 | EE_Error::add_error( |
@@ -532,7 +531,7 @@ discard block |
||
532 | 531 | foreach ( $available_payment_methods as $available_payment_method ) { |
533 | 532 | if ( |
534 | 533 | $available_payment_method instanceof EE_Payment_Method |
535 | - && $available_payment_method->open_by_default() |
|
534 | + && $available_payment_method->open_by_default() |
|
536 | 535 | ) { |
537 | 536 | $PMD_ID = $available_payment_method->ID(); |
538 | 537 | break; |
@@ -1,5 +1,5 @@ discard block |
||
1 | 1 | <?php if ( ! defined('EVENT_ESPRESSO_VERSION')) { exit('No direct script access allowed'); } |
2 | -EE_Registry::instance()->load_class( 'Processor_Base' ); |
|
2 | +EE_Registry::instance()->load_class('Processor_Base'); |
|
3 | 3 | |
4 | 4 | /** |
5 | 5 | * Class EE_Transaction_Processor |
@@ -50,10 +50,10 @@ discard block |
||
50 | 50 | * @param array $registration_query_params |
51 | 51 | *@return EE_Transaction_Processor instance |
52 | 52 | */ |
53 | - public static function instance( $registration_query_params = array() ) { |
|
53 | + public static function instance($registration_query_params = array()) { |
|
54 | 54 | // check if class object is instantiated |
55 | - if ( ! self::$_instance instanceof EE_Transaction_Processor ) { |
|
56 | - self::$_instance = new self( $registration_query_params ); |
|
55 | + if ( ! self::$_instance instanceof EE_Transaction_Processor) { |
|
56 | + self::$_instance = new self($registration_query_params); |
|
57 | 57 | } |
58 | 58 | return self::$_instance; |
59 | 59 | } |
@@ -63,9 +63,9 @@ discard block |
||
63 | 63 | /** |
64 | 64 | * @param array $registration_query_params |
65 | 65 | */ |
66 | - private function __construct( $registration_query_params = array() ) { |
|
66 | + private function __construct($registration_query_params = array()) { |
|
67 | 67 | // make sure some query params are set for retrieving registrations |
68 | - $this->_set_registration_query_params( $registration_query_params ); |
|
68 | + $this->_set_registration_query_params($registration_query_params); |
|
69 | 69 | } |
70 | 70 | |
71 | 71 | |
@@ -74,8 +74,8 @@ discard block |
||
74 | 74 | * @access private |
75 | 75 | * @param array $registration_query_params |
76 | 76 | */ |
77 | - private function _set_registration_query_params( $registration_query_params ) { |
|
78 | - $this->_registration_query_params = ! empty( $registration_query_params ) ? $registration_query_params : array( 'order_by' => array( 'REG_count' => 'ASC' )); |
|
77 | + private function _set_registration_query_params($registration_query_params) { |
|
78 | + $this->_registration_query_params = ! empty($registration_query_params) ? $registration_query_params : array('order_by' => array('REG_count' => 'ASC')); |
|
79 | 79 | } |
80 | 80 | |
81 | 81 | |
@@ -104,10 +104,10 @@ discard block |
||
104 | 104 | ); |
105 | 105 | // send messages |
106 | 106 | /** @type EE_Registration_Processor $registration_processor */ |
107 | - $registration_processor = EE_Registry::instance()->load_class( 'Registration_Processor' ); |
|
107 | + $registration_processor = EE_Registry::instance()->load_class('Registration_Processor'); |
|
108 | 108 | $registration_processor->trigger_registration_update_notifications( |
109 | 109 | $transaction->primary_registration(), |
110 | - array( 'manually_updated' => true ) |
|
110 | + array('manually_updated' => true) |
|
111 | 111 | ); |
112 | 112 | do_action( |
113 | 113 | 'AHEE__EE_Transaction_Processor__manually_update_registration_statuses', |
@@ -197,13 +197,13 @@ discard block |
||
197 | 197 | $trigger_notifications = true |
198 | 198 | ) { |
199 | 199 | // make sure some query params are set for retrieving registrations |
200 | - $this->_set_registration_query_params( $registration_query_params ); |
|
200 | + $this->_set_registration_query_params($registration_query_params); |
|
201 | 201 | // get final reg step status |
202 | 202 | $finalized = $transaction->final_reg_step_completed(); |
203 | 203 | // if the 'finalize_registration' step has been initiated (has a timestamp) |
204 | 204 | // but has not yet been fully completed (TRUE) |
205 | - if ( is_int( $finalized ) && $finalized !== false && $finalized !== true ) { |
|
206 | - $transaction->set_reg_step_completed( 'finalize_registration' ); |
|
205 | + if (is_int($finalized) && $finalized !== false && $finalized !== true) { |
|
206 | + $transaction->set_reg_step_completed('finalize_registration'); |
|
207 | 207 | $finalized = true; |
208 | 208 | } |
209 | 209 | $transaction->save(); |
@@ -259,22 +259,22 @@ discard block |
||
259 | 259 | $update_txn = true |
260 | 260 | ) { |
261 | 261 | // these reg statuses should not be considered in any calculations involving monies owing |
262 | - $closed_reg_statuses = ! empty( $closed_reg_statuses ) ? $closed_reg_statuses : EEM_Registration::closed_reg_statuses(); |
|
263 | - if ( in_array( $registration->status_ID(), $closed_reg_statuses, true ) ) { |
|
262 | + $closed_reg_statuses = ! empty($closed_reg_statuses) ? $closed_reg_statuses : EEM_Registration::closed_reg_statuses(); |
|
263 | + if (in_array($registration->status_ID(), $closed_reg_statuses, true)) { |
|
264 | 264 | return false; |
265 | 265 | } |
266 | 266 | try { |
267 | - $transaction = $this->get_transaction_for_registration( $registration ); |
|
267 | + $transaction = $this->get_transaction_for_registration($registration); |
|
268 | 268 | $ticket_line_item = $this->get_ticket_line_item_for_transaction_registration( |
269 | 269 | $transaction, |
270 | 270 | $registration |
271 | 271 | ); |
272 | 272 | // un-cancel the ticket |
273 | - $success = EEH_Line_Item::reinstate_canceled_ticket_line_item( $ticket_line_item ); |
|
274 | - } catch ( EE_Error $e ) { |
|
273 | + $success = EEH_Line_Item::reinstate_canceled_ticket_line_item($ticket_line_item); |
|
274 | + } catch (EE_Error $e) { |
|
275 | 275 | EE_Error::add_error( |
276 | 276 | sprintf( |
277 | - __( 'The Ticket Line Item for Registration %1$d could not be reinstated because :%2$s%3$s', 'event_espresso' ), |
|
277 | + __('The Ticket Line Item for Registration %1$d could not be reinstated because :%2$s%3$s', 'event_espresso'), |
|
278 | 278 | $registration->ID(), |
279 | 279 | '<br />', |
280 | 280 | $e->getMessage() |
@@ -283,7 +283,7 @@ discard block |
||
283 | 283 | ); |
284 | 284 | return false; |
285 | 285 | } |
286 | - if ( $update_txn ) { |
|
286 | + if ($update_txn) { |
|
287 | 287 | return $transaction->save() ? $success : false; |
288 | 288 | } |
289 | 289 | return $success; |
@@ -307,12 +307,12 @@ discard block |
||
307 | 307 | $update_txn = true |
308 | 308 | ) { |
309 | 309 | // these reg statuses should not be considered in any calculations involving monies owing |
310 | - $closed_reg_statuses = ! empty( $closed_reg_statuses ) ? $closed_reg_statuses : EEM_Registration::closed_reg_statuses(); |
|
311 | - if ( ! in_array( $registration->status_ID(), $closed_reg_statuses, true ) ) { |
|
310 | + $closed_reg_statuses = ! empty($closed_reg_statuses) ? $closed_reg_statuses : EEM_Registration::closed_reg_statuses(); |
|
311 | + if ( ! in_array($registration->status_ID(), $closed_reg_statuses, true)) { |
|
312 | 312 | return false; |
313 | 313 | } |
314 | 314 | try { |
315 | - $transaction = $this->get_transaction_for_registration( $registration ); |
|
315 | + $transaction = $this->get_transaction_for_registration($registration); |
|
316 | 316 | if ( |
317 | 317 | apply_filters( |
318 | 318 | 'FHEE__EE_Transaction_Processor__update_transaction_after_canceled_or_declined_registration__cancel_ticket_line_item', |
@@ -320,14 +320,14 @@ discard block |
||
320 | 320 | $registration, |
321 | 321 | $transaction |
322 | 322 | ) |
323 | - ){ |
|
324 | - $ticket_line_item = $this->get_ticket_line_item_for_transaction_registration( $transaction, $registration ); |
|
325 | - EEH_Line_Item::cancel_ticket_line_item( $ticket_line_item ); |
|
323 | + ) { |
|
324 | + $ticket_line_item = $this->get_ticket_line_item_for_transaction_registration($transaction, $registration); |
|
325 | + EEH_Line_Item::cancel_ticket_line_item($ticket_line_item); |
|
326 | 326 | } |
327 | - } catch ( EE_Error $e ) { |
|
327 | + } catch (EE_Error $e) { |
|
328 | 328 | EE_Error::add_error( |
329 | 329 | sprintf( |
330 | - __( 'The Ticket Line Item for Registration %1$d could not be cancelled because :%2$s%3$s', 'event_espresso' ), |
|
330 | + __('The Ticket Line Item for Registration %1$d could not be cancelled because :%2$s%3$s', 'event_espresso'), |
|
331 | 331 | $registration->ID(), |
332 | 332 | '<br />', |
333 | 333 | $e->getMessage() |
@@ -336,7 +336,7 @@ discard block |
||
336 | 336 | ); |
337 | 337 | return false; |
338 | 338 | } |
339 | - if ( $update_txn ) { |
|
339 | + if ($update_txn) { |
|
340 | 340 | return $transaction->save() ? true : false; |
341 | 341 | } |
342 | 342 | return true; |
@@ -352,12 +352,12 @@ discard block |
||
352 | 352 | * @return EE_Transaction |
353 | 353 | * @throws EE_Error |
354 | 354 | */ |
355 | - public function get_transaction_for_registration( EE_Registration $registration ) { |
|
355 | + public function get_transaction_for_registration(EE_Registration $registration) { |
|
356 | 356 | $transaction = $registration->transaction(); |
357 | - if ( ! $transaction instanceof EE_Transaction ) { |
|
357 | + if ( ! $transaction instanceof EE_Transaction) { |
|
358 | 358 | throw new EE_Error( |
359 | 359 | sprintf( |
360 | - __( 'The Transaction for Registration %1$d was not found or is invalid.', 'event_espresso' ), |
|
360 | + __('The Transaction for Registration %1$d was not found or is invalid.', 'event_espresso'), |
|
361 | 361 | $registration->ID() |
362 | 362 | ) |
363 | 363 | ); |
@@ -380,16 +380,16 @@ discard block |
||
380 | 380 | EE_Transaction $transaction, |
381 | 381 | EE_Registration $registration |
382 | 382 | ) { |
383 | - EE_Registry::instance()->load_helper( 'Line_Item' ); |
|
383 | + EE_Registry::instance()->load_helper('Line_Item'); |
|
384 | 384 | $ticket_line_item = EEM_Line_Item::instance()->get_ticket_line_item_for_transaction( |
385 | 385 | $transaction->ID(), |
386 | 386 | $registration->ticket_ID() |
387 | 387 | ); |
388 | - if ( ! $ticket_line_item instanceof EE_Line_Item ) { |
|
388 | + if ( ! $ticket_line_item instanceof EE_Line_Item) { |
|
389 | 389 | throw new EE_Error( |
390 | 390 | sprintf( |
391 | - __( 'The Line Item for Transaction %1$d and Ticket %2$d was not found or is invalid.', |
|
392 | - 'event_espresso' ), |
|
391 | + __('The Line Item for Transaction %1$d and Ticket %2$d was not found or is invalid.', |
|
392 | + 'event_espresso'), |
|
393 | 393 | $transaction->ID(), |
394 | 394 | $registration->ticket_ID() |
395 | 395 | ) |
@@ -422,22 +422,22 @@ discard block |
||
422 | 422 | $update_txn = true |
423 | 423 | ) { |
424 | 424 | // make sure some query params are set for retrieving registrations |
425 | - $this->_set_registration_query_params( $registration_query_params ); |
|
425 | + $this->_set_registration_query_params($registration_query_params); |
|
426 | 426 | // these reg statuses should not be considered in any calculations involving monies owing |
427 | - $closed_reg_statuses = ! empty( $closed_reg_statuses ) ? $closed_reg_statuses : EEM_Registration::closed_reg_statuses(); |
|
427 | + $closed_reg_statuses = ! empty($closed_reg_statuses) ? $closed_reg_statuses : EEM_Registration::closed_reg_statuses(); |
|
428 | 428 | // loop through cached registrations |
429 | - foreach ( $transaction->registrations( $this->_registration_query_params ) as $registration ) { |
|
429 | + foreach ($transaction->registrations($this->_registration_query_params) as $registration) { |
|
430 | 430 | if ( |
431 | 431 | $registration instanceof EE_Registration |
432 | - && ! in_array( $registration->status_ID(), $closed_reg_statuses ) |
|
432 | + && ! in_array($registration->status_ID(), $closed_reg_statuses) |
|
433 | 433 | ) { |
434 | 434 | return false; |
435 | 435 | } |
436 | 436 | } |
437 | - if ( in_array( $new_TXN_status, EEM_Transaction::txn_status_array() ) ) { |
|
438 | - $transaction->set_status( $new_TXN_status ); |
|
437 | + if (in_array($new_TXN_status, EEM_Transaction::txn_status_array())) { |
|
438 | + $transaction->set_status($new_TXN_status); |
|
439 | 439 | } |
440 | - if ( $update_txn ) { |
|
440 | + if ($update_txn) { |
|
441 | 441 | return $transaction->save() ? true : false; |
442 | 442 | } |
443 | 443 | return true; |
@@ -466,22 +466,22 @@ discard block |
||
466 | 466 | ) { |
467 | 467 | $response = false; |
468 | 468 | /** @type EE_Registration_Processor $registration_processor */ |
469 | - $registration_processor = EE_Registry::instance()->load_class( 'Registration_Processor' ); |
|
469 | + $registration_processor = EE_Registry::instance()->load_class('Registration_Processor'); |
|
470 | 470 | // check that method exists |
471 | - if ( ! method_exists( $registration_processor, $method_name )) { |
|
472 | - throw new EE_Error( __( 'Method does not exist.', 'event_espresso' )); |
|
471 | + if ( ! method_exists($registration_processor, $method_name)) { |
|
472 | + throw new EE_Error(__('Method does not exist.', 'event_espresso')); |
|
473 | 473 | } |
474 | 474 | // make sure some query params are set for retrieving registrations |
475 | - $this->_set_registration_query_params( $registration_query_params ); |
|
475 | + $this->_set_registration_query_params($registration_query_params); |
|
476 | 476 | // loop through cached registrations |
477 | - foreach ( $transaction->registrations( $this->_registration_query_params ) as $registration ) { |
|
478 | - if ( $registration instanceof EE_Registration ) { |
|
479 | - if ( $additional_param ) { |
|
480 | - $response = $registration_processor->{$method_name}( $registration, $additional_param ) |
|
477 | + foreach ($transaction->registrations($this->_registration_query_params) as $registration) { |
|
478 | + if ($registration instanceof EE_Registration) { |
|
479 | + if ($additional_param) { |
|
480 | + $response = $registration_processor->{$method_name}($registration, $additional_param) |
|
481 | 481 | ? true |
482 | 482 | : $response; |
483 | 483 | } else { |
484 | - $response = $registration_processor->{$method_name}( $registration ) |
|
484 | + $response = $registration_processor->{$method_name}($registration) |
|
485 | 485 | ? true |
486 | 486 | : $response; |
487 | 487 | } |
@@ -508,28 +508,28 @@ discard block |
||
508 | 508 | public function set_transaction_payment_method_based_on_registration_statuses( |
509 | 509 | EE_Registration $edited_registration |
510 | 510 | ) { |
511 | - if ( $edited_registration instanceof EE_Registration ) { |
|
511 | + if ($edited_registration instanceof EE_Registration) { |
|
512 | 512 | $transaction = $edited_registration->transaction(); |
513 | - if ( $transaction instanceof EE_Transaction ) { |
|
513 | + if ($transaction instanceof EE_Transaction) { |
|
514 | 514 | $all_not_approved = true; |
515 | - foreach ( $transaction->registrations() as $registration ) { |
|
516 | - if ( $registration instanceof EE_Registration ) { |
|
515 | + foreach ($transaction->registrations() as $registration) { |
|
516 | + if ($registration instanceof EE_Registration) { |
|
517 | 517 | // if any REG != "Not Approved" then toggle to false |
518 | 518 | $all_not_approved = $registration->is_not_approved() ? $all_not_approved : false; |
519 | 519 | } |
520 | 520 | } |
521 | 521 | // if ALL Registrations are "Not Approved" |
522 | - if ( $all_not_approved ) { |
|
523 | - $transaction->set_payment_method_ID( null ); |
|
522 | + if ($all_not_approved) { |
|
523 | + $transaction->set_payment_method_ID(null); |
|
524 | 524 | $transaction->save(); |
525 | 525 | } else { |
526 | 526 | $available_payment_methods = EEM_Payment_Method::instance()->get_all_for_transaction( |
527 | 527 | $transaction, |
528 | 528 | EEM_Payment_Method::scope_cart |
529 | 529 | ); |
530 | - if ( ! empty( $available_payment_methods ) ) { |
|
530 | + if ( ! empty($available_payment_methods)) { |
|
531 | 531 | $PMD_ID = 0; |
532 | - foreach ( $available_payment_methods as $available_payment_method ) { |
|
532 | + foreach ($available_payment_methods as $available_payment_method) { |
|
533 | 533 | if ( |
534 | 534 | $available_payment_method instanceof EE_Payment_Method |
535 | 535 | && $available_payment_method->open_by_default() |
@@ -538,22 +538,22 @@ discard block |
||
538 | 538 | break; |
539 | 539 | } |
540 | 540 | } |
541 | - if ( ! $PMD_ID ) { |
|
542 | - $first_payment_method = reset( $available_payment_methods ); |
|
543 | - if ( $first_payment_method instanceof EE_Payment_Method ) { |
|
541 | + if ( ! $PMD_ID) { |
|
542 | + $first_payment_method = reset($available_payment_methods); |
|
543 | + if ($first_payment_method instanceof EE_Payment_Method) { |
|
544 | 544 | $PMD_ID = $first_payment_method->ID(); |
545 | 545 | } else { |
546 | 546 | EE_Error::add_error( |
547 | - __( 'A valid Payment Method could not be determined. Please ensure that at least one Payment Method is activated.', 'event_espresso' ), |
|
547 | + __('A valid Payment Method could not be determined. Please ensure that at least one Payment Method is activated.', 'event_espresso'), |
|
548 | 548 | __FILE__, __LINE__, __FUNCTION__ |
549 | 549 | ); |
550 | 550 | } |
551 | 551 | } |
552 | - $transaction->set_payment_method_ID( $PMD_ID ); |
|
552 | + $transaction->set_payment_method_ID($PMD_ID); |
|
553 | 553 | $transaction->save(); |
554 | 554 | } else { |
555 | 555 | EE_Error::add_error( |
556 | - __( 'Please activate at least one Payment Method in order for things to operate correctly.', 'event_espresso' ), |
|
556 | + __('Please activate at least one Payment Method in order for things to operate correctly.', 'event_espresso'), |
|
557 | 557 | __FILE__, __LINE__, __FUNCTION__ |
558 | 558 | ); |
559 | 559 | } |
@@ -590,7 +590,7 @@ discard block |
||
590 | 590 | * @deprecated 4.9.12 |
591 | 591 | * @param string $old_txn_status |
592 | 592 | */ |
593 | - public function set_old_txn_status( $old_txn_status ) { |
|
593 | + public function set_old_txn_status($old_txn_status) { |
|
594 | 594 | EE_Error::doing_it_wrong( |
595 | 595 | __METHOD__, |
596 | 596 | esc_html__( |
@@ -600,7 +600,7 @@ discard block |
||
600 | 600 | '4.9.12' |
601 | 601 | ); |
602 | 602 | // only set the first time |
603 | - if ( $this->_old_txn_status === null ) { |
|
603 | + if ($this->_old_txn_status === null) { |
|
604 | 604 | $this->_old_txn_status = $old_txn_status; |
605 | 605 | } |
606 | 606 | } |
@@ -629,7 +629,7 @@ discard block |
||
629 | 629 | * @deprecated 4.9.12 |
630 | 630 | * @param string $new_txn_status |
631 | 631 | */ |
632 | - public function set_new_txn_status( $new_txn_status ) { |
|
632 | + public function set_new_txn_status($new_txn_status) { |
|
633 | 633 | EE_Error::doing_it_wrong( |
634 | 634 | __METHOD__, |
635 | 635 | esc_html__( |
@@ -673,7 +673,7 @@ discard block |
||
673 | 673 | * @param EE_Transaction $transaction |
674 | 674 | * @return boolean |
675 | 675 | */ |
676 | - public function all_reg_steps_completed( EE_Transaction $transaction ) { |
|
676 | + public function all_reg_steps_completed(EE_Transaction $transaction) { |
|
677 | 677 | EE_Error::doing_it_wrong( |
678 | 678 | __METHOD__, |
679 | 679 | esc_html__( |
@@ -700,7 +700,7 @@ discard block |
||
700 | 700 | * @param string $exception |
701 | 701 | * @return boolean |
702 | 702 | */ |
703 | - public function all_reg_steps_completed_except( EE_Transaction $transaction, $exception = '' ) { |
|
703 | + public function all_reg_steps_completed_except(EE_Transaction $transaction, $exception = '') { |
|
704 | 704 | EE_Error::doing_it_wrong( |
705 | 705 | __METHOD__, |
706 | 706 | esc_html__( |
@@ -710,7 +710,7 @@ discard block |
||
710 | 710 | '4.9.12', |
711 | 711 | '5.0.0' |
712 | 712 | ); |
713 | - return $transaction->all_reg_steps_completed_except( $exception ); |
|
713 | + return $transaction->all_reg_steps_completed_except($exception); |
|
714 | 714 | } |
715 | 715 | |
716 | 716 | |
@@ -726,7 +726,7 @@ discard block |
||
726 | 726 | * @param EE_Transaction $transaction |
727 | 727 | * @return boolean |
728 | 728 | */ |
729 | - public function all_reg_steps_completed_except_final_step( EE_Transaction $transaction ) { |
|
729 | + public function all_reg_steps_completed_except_final_step(EE_Transaction $transaction) { |
|
730 | 730 | EE_Error::doing_it_wrong( |
731 | 731 | __METHOD__, |
732 | 732 | esc_html__( |
@@ -753,7 +753,7 @@ discard block |
||
753 | 753 | * @param string $reg_step_slug |
754 | 754 | * @return boolean | int |
755 | 755 | */ |
756 | - public function reg_step_completed( EE_Transaction $transaction, $reg_step_slug ) { |
|
756 | + public function reg_step_completed(EE_Transaction $transaction, $reg_step_slug) { |
|
757 | 757 | EE_Error::doing_it_wrong( |
758 | 758 | __METHOD__, |
759 | 759 | esc_html__( |
@@ -763,7 +763,7 @@ discard block |
||
763 | 763 | '4.9.12', |
764 | 764 | '5.0.0' |
765 | 765 | ); |
766 | - return $transaction->reg_step_completed( $reg_step_slug ); |
|
766 | + return $transaction->reg_step_completed($reg_step_slug); |
|
767 | 767 | } |
768 | 768 | |
769 | 769 | |
@@ -779,7 +779,7 @@ discard block |
||
779 | 779 | * @param EE_Transaction $transaction |
780 | 780 | * @return boolean | int |
781 | 781 | */ |
782 | - public function final_reg_step_completed( EE_Transaction $transaction ) { |
|
782 | + public function final_reg_step_completed(EE_Transaction $transaction) { |
|
783 | 783 | EE_Error::doing_it_wrong( |
784 | 784 | __METHOD__, |
785 | 785 | esc_html__( |
@@ -805,7 +805,7 @@ discard block |
||
805 | 805 | * @return boolean |
806 | 806 | * @throws \EE_Error |
807 | 807 | */ |
808 | - public function set_reg_step_initiated( EE_Transaction $transaction, $reg_step_slug ) { |
|
808 | + public function set_reg_step_initiated(EE_Transaction $transaction, $reg_step_slug) { |
|
809 | 809 | EE_Error::doing_it_wrong( |
810 | 810 | __METHOD__, |
811 | 811 | esc_html__( |
@@ -815,7 +815,7 @@ discard block |
||
815 | 815 | '4.9.12', |
816 | 816 | '5.0.0' |
817 | 817 | ); |
818 | - return $transaction->set_reg_step_initiated( $reg_step_slug ); |
|
818 | + return $transaction->set_reg_step_initiated($reg_step_slug); |
|
819 | 819 | } |
820 | 820 | |
821 | 821 | |
@@ -831,7 +831,7 @@ discard block |
||
831 | 831 | * @return boolean |
832 | 832 | * @throws \EE_Error |
833 | 833 | */ |
834 | - public function set_reg_step_completed( EE_Transaction $transaction, $reg_step_slug ) { |
|
834 | + public function set_reg_step_completed(EE_Transaction $transaction, $reg_step_slug) { |
|
835 | 835 | EE_Error::doing_it_wrong( |
836 | 836 | __METHOD__, |
837 | 837 | esc_html__( |
@@ -841,7 +841,7 @@ discard block |
||
841 | 841 | '4.9.12', |
842 | 842 | '5.0.0' |
843 | 843 | ); |
844 | - return $transaction->set_reg_step_completed( $reg_step_slug ); |
|
844 | + return $transaction->set_reg_step_completed($reg_step_slug); |
|
845 | 845 | } |
846 | 846 | |
847 | 847 | |
@@ -857,7 +857,7 @@ discard block |
||
857 | 857 | * @return boolean |
858 | 858 | * @throws \EE_Error |
859 | 859 | */ |
860 | - public function set_reg_step_not_completed( EE_Transaction $transaction, $reg_step_slug ) { |
|
860 | + public function set_reg_step_not_completed(EE_Transaction $transaction, $reg_step_slug) { |
|
861 | 861 | EE_Error::doing_it_wrong( |
862 | 862 | __METHOD__, |
863 | 863 | esc_html__( |
@@ -867,7 +867,7 @@ discard block |
||
867 | 867 | '4.9.12', |
868 | 868 | '5.0.0' |
869 | 869 | ); |
870 | - return $transaction->set_reg_step_not_completed( $reg_step_slug ); |
|
870 | + return $transaction->set_reg_step_not_completed($reg_step_slug); |
|
871 | 871 | } |
872 | 872 | |
873 | 873 | |
@@ -884,7 +884,7 @@ discard block |
||
884 | 884 | * @param string $reg_step_slug |
885 | 885 | * @return void |
886 | 886 | */ |
887 | - public function remove_reg_step( EE_Transaction $transaction, $reg_step_slug ) { |
|
887 | + public function remove_reg_step(EE_Transaction $transaction, $reg_step_slug) { |
|
888 | 888 | EE_Error::doing_it_wrong( |
889 | 889 | __METHOD__, |
890 | 890 | esc_html__( |
@@ -894,7 +894,7 @@ discard block |
||
894 | 894 | '4.9.12', |
895 | 895 | '5.0.0' |
896 | 896 | ); |
897 | - $transaction->remove_reg_step( $reg_step_slug ); |
|
897 | + $transaction->remove_reg_step($reg_step_slug); |
|
898 | 898 | } |
899 | 899 | |
900 | 900 | |
@@ -910,7 +910,7 @@ discard block |
||
910 | 910 | * @return boolean |
911 | 911 | * @throws \EE_Error |
912 | 912 | */ |
913 | - public function toggle_failed_transaction_status( EE_Transaction $transaction ) { |
|
913 | + public function toggle_failed_transaction_status(EE_Transaction $transaction) { |
|
914 | 914 | EE_Error::doing_it_wrong( |
915 | 915 | __METHOD__, |
916 | 916 | esc_html__( |
@@ -934,7 +934,7 @@ discard block |
||
934 | 934 | * @param EE_Transaction $transaction |
935 | 935 | * @return boolean |
936 | 936 | */ |
937 | - public function toggle_abandoned_transaction_status( EE_Transaction $transaction ) { |
|
937 | + public function toggle_abandoned_transaction_status(EE_Transaction $transaction) { |
|
938 | 938 | EE_Error::doing_it_wrong( |
939 | 939 | __METHOD__, |
940 | 940 | esc_html__( |
@@ -2,7 +2,7 @@ discard block |
||
2 | 2 | use EventEspresso\core\libraries\form_sections\strategies\filter\FormHtmlFilter; |
3 | 3 | |
4 | 4 | if (! defined('EVENT_ESPRESSO_VERSION')) { |
5 | - exit('No direct script access allowed'); |
|
5 | + exit('No direct script access allowed'); |
|
6 | 6 | } |
7 | 7 | |
8 | 8 | |
@@ -19,462 +19,462 @@ discard block |
||
19 | 19 | abstract class EE_Form_Section_Base |
20 | 20 | { |
21 | 21 | |
22 | - /** |
|
23 | - * the URL the form is submitted to |
|
24 | - * |
|
25 | - * @var string |
|
26 | - */ |
|
27 | - protected $_action; |
|
28 | - |
|
29 | - /** |
|
30 | - * POST (default) or GET |
|
31 | - * |
|
32 | - * @var string |
|
33 | - */ |
|
34 | - protected $_method; |
|
35 | - |
|
36 | - /** |
|
37 | - * html_id and html_name are derived from this by default |
|
38 | - * |
|
39 | - * @var string |
|
40 | - */ |
|
41 | - protected $_name; |
|
42 | - |
|
43 | - /** |
|
44 | - * $_html_id |
|
45 | - * @var string |
|
46 | - */ |
|
47 | - protected $_html_id; |
|
48 | - |
|
49 | - /** |
|
50 | - * $_html_class |
|
51 | - * @var string |
|
52 | - */ |
|
53 | - protected $_html_class; |
|
54 | - |
|
55 | - /** |
|
56 | - * $_html_style |
|
57 | - * @var string |
|
58 | - */ |
|
59 | - protected $_html_style; |
|
60 | - |
|
61 | - /** |
|
62 | - * $_other_html_attributes |
|
63 | - * @var string |
|
64 | - */ |
|
65 | - protected $_other_html_attributes; |
|
66 | - |
|
67 | - /** |
|
68 | - * The form section of which this form section is a part |
|
69 | - * |
|
70 | - * @var EE_Form_Section_Proper |
|
71 | - */ |
|
72 | - protected $_parent_section; |
|
73 | - |
|
74 | - /** |
|
75 | - * flag indicating that _construct_finalize has been called. |
|
76 | - * If it hasn't been called and we try to use functions which require it, we call it |
|
77 | - * with no parameters. But normally, _construct_finalize should be called by the instantiating class |
|
78 | - * |
|
79 | - * @var boolean |
|
80 | - */ |
|
81 | - protected $_construction_finalized; |
|
82 | - |
|
83 | - /** |
|
84 | - * Strategy for parsing the form HTML upon display |
|
85 | - * |
|
86 | - * @var FormHtmlFilter |
|
87 | - */ |
|
88 | - protected $_form_html_filter; |
|
89 | - |
|
90 | - |
|
91 | - |
|
92 | - /** |
|
93 | - * @param array $options_array { |
|
94 | - * @type $name string the name for this form section, if you want to explicitly define it |
|
95 | - * } |
|
96 | - */ |
|
97 | - public function __construct($options_array = array()) |
|
98 | - { |
|
99 | - // used by display strategies |
|
100 | - // assign incoming values to properties |
|
101 | - foreach ($options_array as $key => $value) { |
|
102 | - $key = '_' . $key; |
|
103 | - if (property_exists($this, $key) && empty($this->{$key})) { |
|
104 | - $this->{$key} = $value; |
|
105 | - } |
|
106 | - } |
|
107 | - // set parser which allows the form section's rendered HTML to be filtered |
|
108 | - if (isset($options_array['form_html_filter']) && $options_array['form_html_filter'] instanceof FormHtmlFilter) { |
|
109 | - $this->_form_html_filter = $options_array['form_html_filter']; |
|
110 | - } |
|
111 | - } |
|
112 | - |
|
113 | - |
|
114 | - |
|
115 | - /** |
|
116 | - * @param $parent_form_section |
|
117 | - * @param $name |
|
118 | - * @throws \EE_Error |
|
119 | - */ |
|
120 | - protected function _construct_finalize($parent_form_section, $name) |
|
121 | - { |
|
122 | - $this->_construction_finalized = true; |
|
123 | - $this->_parent_section = $parent_form_section; |
|
124 | - if ($name !== null) { |
|
125 | - $this->_name = $name; |
|
126 | - } |
|
127 | - } |
|
128 | - |
|
129 | - |
|
130 | - |
|
131 | - /** |
|
132 | - * make sure construction finalized was called, otherwise children might not be ready |
|
133 | - * |
|
134 | - * @return void |
|
135 | - * @throws \EE_Error |
|
136 | - */ |
|
137 | - public function ensure_construct_finalized_called() |
|
138 | - { |
|
139 | - if (! $this->_construction_finalized) { |
|
140 | - $this->_construct_finalize($this->_parent_section, $this->_name); |
|
141 | - } |
|
142 | - } |
|
143 | - |
|
144 | - |
|
145 | - |
|
146 | - /** |
|
147 | - * @return string |
|
148 | - */ |
|
149 | - public function action() |
|
150 | - { |
|
151 | - return $this->_action; |
|
152 | - } |
|
153 | - |
|
154 | - |
|
155 | - |
|
156 | - /** |
|
157 | - * @param string $action |
|
158 | - */ |
|
159 | - public function set_action($action) |
|
160 | - { |
|
161 | - $this->_action = $action; |
|
162 | - } |
|
163 | - |
|
164 | - |
|
165 | - |
|
166 | - /** |
|
167 | - * @return string |
|
168 | - */ |
|
169 | - public function method() |
|
170 | - { |
|
171 | - return ! empty($this->_method) ? $this->_method : 'POST'; |
|
172 | - } |
|
173 | - |
|
174 | - |
|
175 | - |
|
176 | - /** |
|
177 | - * @param string $method |
|
178 | - */ |
|
179 | - public function set_method($method) |
|
180 | - { |
|
181 | - switch ($method) { |
|
182 | - case 'get' : |
|
183 | - case 'GET' : |
|
184 | - $this->_method = 'GET'; |
|
185 | - break; |
|
186 | - default : |
|
187 | - $this->_method = 'POST'; |
|
188 | - } |
|
189 | - } |
|
190 | - |
|
191 | - |
|
192 | - |
|
193 | - /** |
|
194 | - * Sets the html_id to its default value, if none was specified in the constructor. |
|
195 | - * Calculation involves using the name and the parent's html id |
|
196 | - * return void |
|
197 | - * |
|
198 | - * @throws \EE_Error |
|
199 | - */ |
|
200 | - protected function _set_default_html_id_if_empty() |
|
201 | - { |
|
202 | - if (! $this->_html_id) { |
|
203 | - if ($this->_parent_section && $this->_parent_section instanceof EE_Form_Section_Proper) { |
|
204 | - $this->_html_id = $this->_parent_section->html_id() |
|
205 | - . '-' |
|
206 | - . $this->_prep_name_for_html_id($this->name()); |
|
207 | - } else { |
|
208 | - $this->_html_id = $this->_prep_name_for_html_id($this->name()); |
|
209 | - } |
|
210 | - } |
|
211 | - } |
|
212 | - |
|
213 | - |
|
214 | - |
|
215 | - /** |
|
216 | - * _prep_name_for_html_id |
|
217 | - * |
|
218 | - * @param $name |
|
219 | - * @return string |
|
220 | - */ |
|
221 | - private function _prep_name_for_html_id($name) |
|
222 | - { |
|
223 | - return sanitize_key(str_replace(array(' ', ' ', '_'), '-', $name)); |
|
224 | - } |
|
22 | + /** |
|
23 | + * the URL the form is submitted to |
|
24 | + * |
|
25 | + * @var string |
|
26 | + */ |
|
27 | + protected $_action; |
|
28 | + |
|
29 | + /** |
|
30 | + * POST (default) or GET |
|
31 | + * |
|
32 | + * @var string |
|
33 | + */ |
|
34 | + protected $_method; |
|
35 | + |
|
36 | + /** |
|
37 | + * html_id and html_name are derived from this by default |
|
38 | + * |
|
39 | + * @var string |
|
40 | + */ |
|
41 | + protected $_name; |
|
42 | + |
|
43 | + /** |
|
44 | + * $_html_id |
|
45 | + * @var string |
|
46 | + */ |
|
47 | + protected $_html_id; |
|
48 | + |
|
49 | + /** |
|
50 | + * $_html_class |
|
51 | + * @var string |
|
52 | + */ |
|
53 | + protected $_html_class; |
|
54 | + |
|
55 | + /** |
|
56 | + * $_html_style |
|
57 | + * @var string |
|
58 | + */ |
|
59 | + protected $_html_style; |
|
60 | + |
|
61 | + /** |
|
62 | + * $_other_html_attributes |
|
63 | + * @var string |
|
64 | + */ |
|
65 | + protected $_other_html_attributes; |
|
66 | + |
|
67 | + /** |
|
68 | + * The form section of which this form section is a part |
|
69 | + * |
|
70 | + * @var EE_Form_Section_Proper |
|
71 | + */ |
|
72 | + protected $_parent_section; |
|
73 | + |
|
74 | + /** |
|
75 | + * flag indicating that _construct_finalize has been called. |
|
76 | + * If it hasn't been called and we try to use functions which require it, we call it |
|
77 | + * with no parameters. But normally, _construct_finalize should be called by the instantiating class |
|
78 | + * |
|
79 | + * @var boolean |
|
80 | + */ |
|
81 | + protected $_construction_finalized; |
|
82 | + |
|
83 | + /** |
|
84 | + * Strategy for parsing the form HTML upon display |
|
85 | + * |
|
86 | + * @var FormHtmlFilter |
|
87 | + */ |
|
88 | + protected $_form_html_filter; |
|
89 | + |
|
90 | + |
|
91 | + |
|
92 | + /** |
|
93 | + * @param array $options_array { |
|
94 | + * @type $name string the name for this form section, if you want to explicitly define it |
|
95 | + * } |
|
96 | + */ |
|
97 | + public function __construct($options_array = array()) |
|
98 | + { |
|
99 | + // used by display strategies |
|
100 | + // assign incoming values to properties |
|
101 | + foreach ($options_array as $key => $value) { |
|
102 | + $key = '_' . $key; |
|
103 | + if (property_exists($this, $key) && empty($this->{$key})) { |
|
104 | + $this->{$key} = $value; |
|
105 | + } |
|
106 | + } |
|
107 | + // set parser which allows the form section's rendered HTML to be filtered |
|
108 | + if (isset($options_array['form_html_filter']) && $options_array['form_html_filter'] instanceof FormHtmlFilter) { |
|
109 | + $this->_form_html_filter = $options_array['form_html_filter']; |
|
110 | + } |
|
111 | + } |
|
112 | + |
|
113 | + |
|
114 | + |
|
115 | + /** |
|
116 | + * @param $parent_form_section |
|
117 | + * @param $name |
|
118 | + * @throws \EE_Error |
|
119 | + */ |
|
120 | + protected function _construct_finalize($parent_form_section, $name) |
|
121 | + { |
|
122 | + $this->_construction_finalized = true; |
|
123 | + $this->_parent_section = $parent_form_section; |
|
124 | + if ($name !== null) { |
|
125 | + $this->_name = $name; |
|
126 | + } |
|
127 | + } |
|
128 | + |
|
129 | + |
|
130 | + |
|
131 | + /** |
|
132 | + * make sure construction finalized was called, otherwise children might not be ready |
|
133 | + * |
|
134 | + * @return void |
|
135 | + * @throws \EE_Error |
|
136 | + */ |
|
137 | + public function ensure_construct_finalized_called() |
|
138 | + { |
|
139 | + if (! $this->_construction_finalized) { |
|
140 | + $this->_construct_finalize($this->_parent_section, $this->_name); |
|
141 | + } |
|
142 | + } |
|
143 | + |
|
144 | + |
|
145 | + |
|
146 | + /** |
|
147 | + * @return string |
|
148 | + */ |
|
149 | + public function action() |
|
150 | + { |
|
151 | + return $this->_action; |
|
152 | + } |
|
153 | + |
|
154 | + |
|
155 | + |
|
156 | + /** |
|
157 | + * @param string $action |
|
158 | + */ |
|
159 | + public function set_action($action) |
|
160 | + { |
|
161 | + $this->_action = $action; |
|
162 | + } |
|
163 | + |
|
164 | + |
|
165 | + |
|
166 | + /** |
|
167 | + * @return string |
|
168 | + */ |
|
169 | + public function method() |
|
170 | + { |
|
171 | + return ! empty($this->_method) ? $this->_method : 'POST'; |
|
172 | + } |
|
173 | + |
|
174 | + |
|
175 | + |
|
176 | + /** |
|
177 | + * @param string $method |
|
178 | + */ |
|
179 | + public function set_method($method) |
|
180 | + { |
|
181 | + switch ($method) { |
|
182 | + case 'get' : |
|
183 | + case 'GET' : |
|
184 | + $this->_method = 'GET'; |
|
185 | + break; |
|
186 | + default : |
|
187 | + $this->_method = 'POST'; |
|
188 | + } |
|
189 | + } |
|
190 | + |
|
191 | + |
|
192 | + |
|
193 | + /** |
|
194 | + * Sets the html_id to its default value, if none was specified in the constructor. |
|
195 | + * Calculation involves using the name and the parent's html id |
|
196 | + * return void |
|
197 | + * |
|
198 | + * @throws \EE_Error |
|
199 | + */ |
|
200 | + protected function _set_default_html_id_if_empty() |
|
201 | + { |
|
202 | + if (! $this->_html_id) { |
|
203 | + if ($this->_parent_section && $this->_parent_section instanceof EE_Form_Section_Proper) { |
|
204 | + $this->_html_id = $this->_parent_section->html_id() |
|
205 | + . '-' |
|
206 | + . $this->_prep_name_for_html_id($this->name()); |
|
207 | + } else { |
|
208 | + $this->_html_id = $this->_prep_name_for_html_id($this->name()); |
|
209 | + } |
|
210 | + } |
|
211 | + } |
|
212 | + |
|
213 | + |
|
214 | + |
|
215 | + /** |
|
216 | + * _prep_name_for_html_id |
|
217 | + * |
|
218 | + * @param $name |
|
219 | + * @return string |
|
220 | + */ |
|
221 | + private function _prep_name_for_html_id($name) |
|
222 | + { |
|
223 | + return sanitize_key(str_replace(array(' ', ' ', '_'), '-', $name)); |
|
224 | + } |
|
225 | 225 | |
226 | 226 | |
227 | 227 | |
228 | - /** |
|
229 | - * Returns the HTML, JS, and CSS necessary to display this form section on a page. |
|
230 | - * Note however, it's recommended that you instead call enqueue_js on the "wp_enqueue_scripts" action, |
|
231 | - * and call get_html when you want to output the html. Calling get_html_and_js after |
|
232 | - * "wp_enqueue_scripts" has already fired seems to work for now, but is contrary |
|
233 | - * to the instructions on https://developer.wordpress.org/reference/functions/wp_enqueue_script/ |
|
234 | - * and so might stop working anytime. |
|
235 | - * |
|
236 | - * @return string |
|
237 | - */ |
|
238 | - public function get_html_and_js() |
|
239 | - { |
|
240 | - return $this->get_html(); |
|
241 | - } |
|
228 | + /** |
|
229 | + * Returns the HTML, JS, and CSS necessary to display this form section on a page. |
|
230 | + * Note however, it's recommended that you instead call enqueue_js on the "wp_enqueue_scripts" action, |
|
231 | + * and call get_html when you want to output the html. Calling get_html_and_js after |
|
232 | + * "wp_enqueue_scripts" has already fired seems to work for now, but is contrary |
|
233 | + * to the instructions on https://developer.wordpress.org/reference/functions/wp_enqueue_script/ |
|
234 | + * and so might stop working anytime. |
|
235 | + * |
|
236 | + * @return string |
|
237 | + */ |
|
238 | + public function get_html_and_js() |
|
239 | + { |
|
240 | + return $this->get_html(); |
|
241 | + } |
|
242 | 242 | |
243 | 243 | |
244 | 244 | |
245 | - /** |
|
246 | - * Gets the HTML for displaying this form section |
|
247 | - * |
|
248 | - * @return string |
|
249 | - */ |
|
250 | - public abstract function get_html(); |
|
245 | + /** |
|
246 | + * Gets the HTML for displaying this form section |
|
247 | + * |
|
248 | + * @return string |
|
249 | + */ |
|
250 | + public abstract function get_html(); |
|
251 | 251 | |
252 | 252 | |
253 | 253 | |
254 | - /** |
|
255 | - * @param bool $add_pound_sign |
|
256 | - * @return string |
|
257 | - */ |
|
258 | - public function html_id($add_pound_sign = false) |
|
259 | - { |
|
260 | - $this->_set_default_html_id_if_empty(); |
|
261 | - return $add_pound_sign ? '#' . $this->_html_id : $this->_html_id; |
|
262 | - } |
|
254 | + /** |
|
255 | + * @param bool $add_pound_sign |
|
256 | + * @return string |
|
257 | + */ |
|
258 | + public function html_id($add_pound_sign = false) |
|
259 | + { |
|
260 | + $this->_set_default_html_id_if_empty(); |
|
261 | + return $add_pound_sign ? '#' . $this->_html_id : $this->_html_id; |
|
262 | + } |
|
263 | 263 | |
264 | 264 | |
265 | - |
|
266 | - /** |
|
267 | - * @return string |
|
268 | - */ |
|
269 | - public function html_class() |
|
270 | - { |
|
271 | - return $this->_html_class; |
|
272 | - } |
|
273 | - |
|
274 | - |
|
275 | - |
|
276 | - /** |
|
277 | - * @return string |
|
278 | - */ |
|
279 | - public function html_style() |
|
280 | - { |
|
281 | - return $this->_html_style; |
|
282 | - } |
|
283 | - |
|
284 | - |
|
285 | - |
|
286 | - /** |
|
287 | - * @param mixed $html_class |
|
288 | - */ |
|
289 | - public function set_html_class($html_class) |
|
290 | - { |
|
291 | - $this->_html_class = $html_class; |
|
292 | - } |
|
293 | - |
|
294 | - |
|
295 | - |
|
296 | - /** |
|
297 | - * @param mixed $html_id |
|
298 | - */ |
|
299 | - public function set_html_id($html_id) |
|
300 | - { |
|
301 | - $this->_html_id = $html_id; |
|
302 | - } |
|
303 | - |
|
304 | - |
|
305 | - |
|
306 | - /** |
|
307 | - * @param mixed $html_style |
|
308 | - */ |
|
309 | - public function set_html_style($html_style) |
|
310 | - { |
|
311 | - $this->_html_style = $html_style; |
|
312 | - } |
|
313 | - |
|
314 | - |
|
315 | - |
|
316 | - /** |
|
317 | - * @param string $other_html_attributes |
|
318 | - */ |
|
319 | - public function set_other_html_attributes($other_html_attributes) |
|
320 | - { |
|
321 | - $this->_other_html_attributes = $other_html_attributes; |
|
322 | - } |
|
323 | - |
|
324 | - |
|
325 | - |
|
326 | - /** |
|
327 | - * @return string |
|
328 | - */ |
|
329 | - public function other_html_attributes() |
|
330 | - { |
|
331 | - return $this->_other_html_attributes; |
|
332 | - } |
|
333 | - |
|
334 | - |
|
335 | - |
|
336 | - /** |
|
337 | - * Gets the name of the form section. This is not the same as the HTML name. |
|
338 | - * |
|
339 | - * @throws EE_Error |
|
340 | - * @return string |
|
341 | - */ |
|
342 | - public function name() |
|
343 | - { |
|
344 | - if (! $this->_construction_finalized) { |
|
345 | - throw new EE_Error(sprintf(__('You cannot use the form section\s name until _construct_finalize has been called on it (when we set the name). It was called on a form section of type \'s\'', |
|
346 | - 'event_espresso'), get_class($this))); |
|
347 | - } |
|
348 | - return $this->_name; |
|
349 | - } |
|
350 | - |
|
351 | - |
|
352 | - |
|
353 | - /** |
|
354 | - * Gets the parent section |
|
355 | - * |
|
356 | - * @return EE_Form_Section_Proper |
|
357 | - */ |
|
358 | - public function parent_section() |
|
359 | - { |
|
360 | - return $this->_parent_section; |
|
361 | - } |
|
362 | - |
|
363 | - |
|
364 | - |
|
365 | - /** |
|
366 | - * returns HTML for generating the opening form HTML tag (<form>) |
|
367 | - * |
|
368 | - * @param string $action the URL the form is submitted to |
|
369 | - * @param string $method POST (default) or GET |
|
370 | - * @param string $other_attributes anything else added to the form open tag, MUST BE VALID HTML |
|
371 | - * @return string |
|
372 | - */ |
|
373 | - public function form_open($action = '', $method = '', $other_attributes = '') |
|
374 | - { |
|
375 | - if (! empty($action)) { |
|
376 | - $this->set_action($action); |
|
377 | - } |
|
378 | - if (! empty($method)) { |
|
379 | - $this->set_method($method); |
|
380 | - } |
|
381 | - $html = EEH_HTML::nl(1, 'form') . '<form'; |
|
382 | - $html .= $this->html_id() !== '' ? ' id="' . $this->html_id() . '"' : ''; |
|
383 | - $html .= ' action="' . $this->action() . '"'; |
|
384 | - $html .= ' method="' . $this->method() . '"'; |
|
385 | - $html .= $other_attributes . '>'; |
|
386 | - return $html; |
|
387 | - } |
|
388 | - |
|
389 | - |
|
390 | - |
|
391 | - /** |
|
392 | - * returns HTML for generating the closing form HTML tag (</form>) |
|
393 | - * |
|
394 | - * @return string |
|
395 | - */ |
|
396 | - public function form_close() |
|
397 | - { |
|
398 | - return EEH_HTML::nl(-1, 'form') |
|
399 | - . '</form>' |
|
400 | - . EEH_HTML::nl() |
|
401 | - . '<!-- end of ee-' |
|
402 | - . $this->html_id() |
|
403 | - . '-form -->' |
|
404 | - . EEH_HTML::nl(); |
|
405 | - } |
|
406 | - |
|
407 | - |
|
408 | - |
|
409 | - /** |
|
410 | - * enqueues JS (and CSS) for the form (ie immediately call wp_enqueue_script and |
|
411 | - * wp_enqueue_style; the scripts could have optionally been registered earlier) |
|
412 | - * Default does nothing, but child classes can override |
|
413 | - * |
|
414 | - * @return void |
|
415 | - */ |
|
416 | - public function enqueue_js() |
|
417 | - { |
|
418 | - //defaults to enqueue NO js or css |
|
419 | - } |
|
420 | - |
|
421 | - |
|
422 | - |
|
423 | - /** |
|
424 | - * Adds any extra data needed by js. Eventually we'll call wp_localize_script |
|
425 | - * with it, and it will be on each form section's 'other_data' property. |
|
426 | - * By default nothing is added, but child classes can extend this method to add something. |
|
427 | - * Eg, if you have an input that will cause a modal dialog to appear, |
|
428 | - * here you could add an entry like 'modal_dialog_inputs' to this array |
|
429 | - * to map between the input's html ID and the modal dialogue's ID, so that |
|
430 | - * your JS code will know where to find the modal dialog when the input is pressed. |
|
431 | - * Eg $form_other_js_data['modal_dialog_inputs']['some-input-id']='modal-dialog-id'; |
|
432 | - * |
|
433 | - * @param array $form_other_js_data |
|
434 | - * @return array |
|
435 | - */ |
|
436 | - public function get_other_js_data($form_other_js_data = array()) |
|
437 | - { |
|
438 | - return $form_other_js_data; |
|
439 | - } |
|
440 | - |
|
441 | - |
|
442 | - |
|
443 | - /** |
|
444 | - * This isn't just the name of an input, it's a path pointing to an input. The |
|
445 | - * path is similar to a folder path: slash (/) means to descend into a subsection, |
|
446 | - * dot-dot-slash (../) means to ascend into the parent section. |
|
447 | - * After a series of slashes and dot-dot-slashes, there should be the name of an input, |
|
448 | - * which will be returned. |
|
449 | - * Eg, if you want the related input to be conditional on a sibling input name 'foobar' |
|
450 | - * just use 'foobar'. If you want it to be conditional on an aunt/uncle input name |
|
451 | - * 'baz', use '../baz'. If you want it to be conditional on a cousin input, |
|
452 | - * the child of 'baz_section' named 'baz_child', use '../baz_section/baz_child'. |
|
453 | - * Etc |
|
454 | - * |
|
455 | - * @param string|false $form_section_path we accept false also because substr( '../', '../' ) = false |
|
456 | - * @return EE_Form_Section_Base |
|
457 | - */ |
|
458 | - public function find_section_from_path($form_section_path) |
|
459 | - { |
|
460 | - if (strpos($form_section_path, '/') === 0) { |
|
461 | - $form_section_path = substr($form_section_path, strlen('/')); |
|
462 | - } |
|
463 | - if (empty($form_section_path)) { |
|
464 | - return $this; |
|
465 | - } |
|
466 | - if (strpos($form_section_path, '../') === 0) { |
|
467 | - $parent = $this->parent_section(); |
|
468 | - $form_section_path = substr($form_section_path, strlen('../')); |
|
469 | - if ($parent instanceof EE_Form_Section_Base) { |
|
470 | - return $parent->find_section_from_path($form_section_path); |
|
471 | - } elseif (empty($form_section_path)) { |
|
472 | - return $this; |
|
473 | - } |
|
474 | - } |
|
475 | - //couldn't find it using simple parent following |
|
476 | - return null; |
|
477 | - } |
|
265 | + |
|
266 | + /** |
|
267 | + * @return string |
|
268 | + */ |
|
269 | + public function html_class() |
|
270 | + { |
|
271 | + return $this->_html_class; |
|
272 | + } |
|
273 | + |
|
274 | + |
|
275 | + |
|
276 | + /** |
|
277 | + * @return string |
|
278 | + */ |
|
279 | + public function html_style() |
|
280 | + { |
|
281 | + return $this->_html_style; |
|
282 | + } |
|
283 | + |
|
284 | + |
|
285 | + |
|
286 | + /** |
|
287 | + * @param mixed $html_class |
|
288 | + */ |
|
289 | + public function set_html_class($html_class) |
|
290 | + { |
|
291 | + $this->_html_class = $html_class; |
|
292 | + } |
|
293 | + |
|
294 | + |
|
295 | + |
|
296 | + /** |
|
297 | + * @param mixed $html_id |
|
298 | + */ |
|
299 | + public function set_html_id($html_id) |
|
300 | + { |
|
301 | + $this->_html_id = $html_id; |
|
302 | + } |
|
303 | + |
|
304 | + |
|
305 | + |
|
306 | + /** |
|
307 | + * @param mixed $html_style |
|
308 | + */ |
|
309 | + public function set_html_style($html_style) |
|
310 | + { |
|
311 | + $this->_html_style = $html_style; |
|
312 | + } |
|
313 | + |
|
314 | + |
|
315 | + |
|
316 | + /** |
|
317 | + * @param string $other_html_attributes |
|
318 | + */ |
|
319 | + public function set_other_html_attributes($other_html_attributes) |
|
320 | + { |
|
321 | + $this->_other_html_attributes = $other_html_attributes; |
|
322 | + } |
|
323 | + |
|
324 | + |
|
325 | + |
|
326 | + /** |
|
327 | + * @return string |
|
328 | + */ |
|
329 | + public function other_html_attributes() |
|
330 | + { |
|
331 | + return $this->_other_html_attributes; |
|
332 | + } |
|
333 | + |
|
334 | + |
|
335 | + |
|
336 | + /** |
|
337 | + * Gets the name of the form section. This is not the same as the HTML name. |
|
338 | + * |
|
339 | + * @throws EE_Error |
|
340 | + * @return string |
|
341 | + */ |
|
342 | + public function name() |
|
343 | + { |
|
344 | + if (! $this->_construction_finalized) { |
|
345 | + throw new EE_Error(sprintf(__('You cannot use the form section\s name until _construct_finalize has been called on it (when we set the name). It was called on a form section of type \'s\'', |
|
346 | + 'event_espresso'), get_class($this))); |
|
347 | + } |
|
348 | + return $this->_name; |
|
349 | + } |
|
350 | + |
|
351 | + |
|
352 | + |
|
353 | + /** |
|
354 | + * Gets the parent section |
|
355 | + * |
|
356 | + * @return EE_Form_Section_Proper |
|
357 | + */ |
|
358 | + public function parent_section() |
|
359 | + { |
|
360 | + return $this->_parent_section; |
|
361 | + } |
|
362 | + |
|
363 | + |
|
364 | + |
|
365 | + /** |
|
366 | + * returns HTML for generating the opening form HTML tag (<form>) |
|
367 | + * |
|
368 | + * @param string $action the URL the form is submitted to |
|
369 | + * @param string $method POST (default) or GET |
|
370 | + * @param string $other_attributes anything else added to the form open tag, MUST BE VALID HTML |
|
371 | + * @return string |
|
372 | + */ |
|
373 | + public function form_open($action = '', $method = '', $other_attributes = '') |
|
374 | + { |
|
375 | + if (! empty($action)) { |
|
376 | + $this->set_action($action); |
|
377 | + } |
|
378 | + if (! empty($method)) { |
|
379 | + $this->set_method($method); |
|
380 | + } |
|
381 | + $html = EEH_HTML::nl(1, 'form') . '<form'; |
|
382 | + $html .= $this->html_id() !== '' ? ' id="' . $this->html_id() . '"' : ''; |
|
383 | + $html .= ' action="' . $this->action() . '"'; |
|
384 | + $html .= ' method="' . $this->method() . '"'; |
|
385 | + $html .= $other_attributes . '>'; |
|
386 | + return $html; |
|
387 | + } |
|
388 | + |
|
389 | + |
|
390 | + |
|
391 | + /** |
|
392 | + * returns HTML for generating the closing form HTML tag (</form>) |
|
393 | + * |
|
394 | + * @return string |
|
395 | + */ |
|
396 | + public function form_close() |
|
397 | + { |
|
398 | + return EEH_HTML::nl(-1, 'form') |
|
399 | + . '</form>' |
|
400 | + . EEH_HTML::nl() |
|
401 | + . '<!-- end of ee-' |
|
402 | + . $this->html_id() |
|
403 | + . '-form -->' |
|
404 | + . EEH_HTML::nl(); |
|
405 | + } |
|
406 | + |
|
407 | + |
|
408 | + |
|
409 | + /** |
|
410 | + * enqueues JS (and CSS) for the form (ie immediately call wp_enqueue_script and |
|
411 | + * wp_enqueue_style; the scripts could have optionally been registered earlier) |
|
412 | + * Default does nothing, but child classes can override |
|
413 | + * |
|
414 | + * @return void |
|
415 | + */ |
|
416 | + public function enqueue_js() |
|
417 | + { |
|
418 | + //defaults to enqueue NO js or css |
|
419 | + } |
|
420 | + |
|
421 | + |
|
422 | + |
|
423 | + /** |
|
424 | + * Adds any extra data needed by js. Eventually we'll call wp_localize_script |
|
425 | + * with it, and it will be on each form section's 'other_data' property. |
|
426 | + * By default nothing is added, but child classes can extend this method to add something. |
|
427 | + * Eg, if you have an input that will cause a modal dialog to appear, |
|
428 | + * here you could add an entry like 'modal_dialog_inputs' to this array |
|
429 | + * to map between the input's html ID and the modal dialogue's ID, so that |
|
430 | + * your JS code will know where to find the modal dialog when the input is pressed. |
|
431 | + * Eg $form_other_js_data['modal_dialog_inputs']['some-input-id']='modal-dialog-id'; |
|
432 | + * |
|
433 | + * @param array $form_other_js_data |
|
434 | + * @return array |
|
435 | + */ |
|
436 | + public function get_other_js_data($form_other_js_data = array()) |
|
437 | + { |
|
438 | + return $form_other_js_data; |
|
439 | + } |
|
440 | + |
|
441 | + |
|
442 | + |
|
443 | + /** |
|
444 | + * This isn't just the name of an input, it's a path pointing to an input. The |
|
445 | + * path is similar to a folder path: slash (/) means to descend into a subsection, |
|
446 | + * dot-dot-slash (../) means to ascend into the parent section. |
|
447 | + * After a series of slashes and dot-dot-slashes, there should be the name of an input, |
|
448 | + * which will be returned. |
|
449 | + * Eg, if you want the related input to be conditional on a sibling input name 'foobar' |
|
450 | + * just use 'foobar'. If you want it to be conditional on an aunt/uncle input name |
|
451 | + * 'baz', use '../baz'. If you want it to be conditional on a cousin input, |
|
452 | + * the child of 'baz_section' named 'baz_child', use '../baz_section/baz_child'. |
|
453 | + * Etc |
|
454 | + * |
|
455 | + * @param string|false $form_section_path we accept false also because substr( '../', '../' ) = false |
|
456 | + * @return EE_Form_Section_Base |
|
457 | + */ |
|
458 | + public function find_section_from_path($form_section_path) |
|
459 | + { |
|
460 | + if (strpos($form_section_path, '/') === 0) { |
|
461 | + $form_section_path = substr($form_section_path, strlen('/')); |
|
462 | + } |
|
463 | + if (empty($form_section_path)) { |
|
464 | + return $this; |
|
465 | + } |
|
466 | + if (strpos($form_section_path, '../') === 0) { |
|
467 | + $parent = $this->parent_section(); |
|
468 | + $form_section_path = substr($form_section_path, strlen('../')); |
|
469 | + if ($parent instanceof EE_Form_Section_Base) { |
|
470 | + return $parent->find_section_from_path($form_section_path); |
|
471 | + } elseif (empty($form_section_path)) { |
|
472 | + return $this; |
|
473 | + } |
|
474 | + } |
|
475 | + //couldn't find it using simple parent following |
|
476 | + return null; |
|
477 | + } |
|
478 | 478 | |
479 | 479 | |
480 | 480 | } |
@@ -1,7 +1,7 @@ discard block |
||
1 | 1 | <?php |
2 | 2 | use EventEspresso\core\libraries\form_sections\strategies\filter\FormHtmlFilter; |
3 | 3 | |
4 | -if (! defined('EVENT_ESPRESSO_VERSION')) { |
|
4 | +if ( ! defined('EVENT_ESPRESSO_VERSION')) { |
|
5 | 5 | exit('No direct script access allowed'); |
6 | 6 | } |
7 | 7 | |
@@ -99,7 +99,7 @@ discard block |
||
99 | 99 | // used by display strategies |
100 | 100 | // assign incoming values to properties |
101 | 101 | foreach ($options_array as $key => $value) { |
102 | - $key = '_' . $key; |
|
102 | + $key = '_'.$key; |
|
103 | 103 | if (property_exists($this, $key) && empty($this->{$key})) { |
104 | 104 | $this->{$key} = $value; |
105 | 105 | } |
@@ -136,7 +136,7 @@ discard block |
||
136 | 136 | */ |
137 | 137 | public function ensure_construct_finalized_called() |
138 | 138 | { |
139 | - if (! $this->_construction_finalized) { |
|
139 | + if ( ! $this->_construction_finalized) { |
|
140 | 140 | $this->_construct_finalize($this->_parent_section, $this->_name); |
141 | 141 | } |
142 | 142 | } |
@@ -199,7 +199,7 @@ discard block |
||
199 | 199 | */ |
200 | 200 | protected function _set_default_html_id_if_empty() |
201 | 201 | { |
202 | - if (! $this->_html_id) { |
|
202 | + if ( ! $this->_html_id) { |
|
203 | 203 | if ($this->_parent_section && $this->_parent_section instanceof EE_Form_Section_Proper) { |
204 | 204 | $this->_html_id = $this->_parent_section->html_id() |
205 | 205 | . '-' |
@@ -258,7 +258,7 @@ discard block |
||
258 | 258 | public function html_id($add_pound_sign = false) |
259 | 259 | { |
260 | 260 | $this->_set_default_html_id_if_empty(); |
261 | - return $add_pound_sign ? '#' . $this->_html_id : $this->_html_id; |
|
261 | + return $add_pound_sign ? '#'.$this->_html_id : $this->_html_id; |
|
262 | 262 | } |
263 | 263 | |
264 | 264 | |
@@ -341,7 +341,7 @@ discard block |
||
341 | 341 | */ |
342 | 342 | public function name() |
343 | 343 | { |
344 | - if (! $this->_construction_finalized) { |
|
344 | + if ( ! $this->_construction_finalized) { |
|
345 | 345 | throw new EE_Error(sprintf(__('You cannot use the form section\s name until _construct_finalize has been called on it (when we set the name). It was called on a form section of type \'s\'', |
346 | 346 | 'event_espresso'), get_class($this))); |
347 | 347 | } |
@@ -372,17 +372,17 @@ discard block |
||
372 | 372 | */ |
373 | 373 | public function form_open($action = '', $method = '', $other_attributes = '') |
374 | 374 | { |
375 | - if (! empty($action)) { |
|
375 | + if ( ! empty($action)) { |
|
376 | 376 | $this->set_action($action); |
377 | 377 | } |
378 | - if (! empty($method)) { |
|
378 | + if ( ! empty($method)) { |
|
379 | 379 | $this->set_method($method); |
380 | 380 | } |
381 | - $html = EEH_HTML::nl(1, 'form') . '<form'; |
|
382 | - $html .= $this->html_id() !== '' ? ' id="' . $this->html_id() . '"' : ''; |
|
383 | - $html .= ' action="' . $this->action() . '"'; |
|
384 | - $html .= ' method="' . $this->method() . '"'; |
|
385 | - $html .= $other_attributes . '>'; |
|
381 | + $html = EEH_HTML::nl(1, 'form').'<form'; |
|
382 | + $html .= $this->html_id() !== '' ? ' id="'.$this->html_id().'"' : ''; |
|
383 | + $html .= ' action="'.$this->action().'"'; |
|
384 | + $html .= ' method="'.$this->method().'"'; |
|
385 | + $html .= $other_attributes.'>'; |
|
386 | 386 | return $html; |
387 | 387 | } |
388 | 388 |
@@ -13,110 +13,110 @@ |
||
13 | 13 | { |
14 | 14 | |
15 | 15 | |
16 | - /** |
|
17 | - * This is a flag indicating whether to use '<br>' tags after each input in the layout |
|
18 | - * strategy. |
|
19 | - * |
|
20 | - * @var bool |
|
21 | - */ |
|
22 | - protected $_use_break_tags = true; |
|
16 | + /** |
|
17 | + * This is a flag indicating whether to use '<br>' tags after each input in the layout |
|
18 | + * strategy. |
|
19 | + * |
|
20 | + * @var bool |
|
21 | + */ |
|
22 | + protected $_use_break_tags = true; |
|
23 | 23 | |
24 | 24 | |
25 | - /** |
|
26 | - * EE_No_Layout constructor. |
|
27 | - * |
|
28 | - * @param array $options Currently if this has a 'use_break_tags' key that is used to set the _use_break_tags |
|
29 | - * property on the class. |
|
30 | - */ |
|
31 | - public function __construct($options = array()) |
|
32 | - { |
|
33 | - $this->_use_break_tags = is_array($options) && isset($options['use_break_tags']) |
|
34 | - ? filter_var($options['use_break_tags'], FILTER_VALIDATE_BOOLEAN) |
|
35 | - : $this->_use_break_tags; |
|
36 | - parent::__construct(); |
|
37 | - } |
|
25 | + /** |
|
26 | + * EE_No_Layout constructor. |
|
27 | + * |
|
28 | + * @param array $options Currently if this has a 'use_break_tags' key that is used to set the _use_break_tags |
|
29 | + * property on the class. |
|
30 | + */ |
|
31 | + public function __construct($options = array()) |
|
32 | + { |
|
33 | + $this->_use_break_tags = is_array($options) && isset($options['use_break_tags']) |
|
34 | + ? filter_var($options['use_break_tags'], FILTER_VALIDATE_BOOLEAN) |
|
35 | + : $this->_use_break_tags; |
|
36 | + parent::__construct(); |
|
37 | + } |
|
38 | 38 | |
39 | - /** |
|
40 | - * Add line break at beginning of form |
|
41 | - * |
|
42 | - * @return string |
|
43 | - */ |
|
44 | - public function layout_form_begin() |
|
45 | - { |
|
46 | - return EEH_HTML::nl(1); |
|
47 | - } |
|
39 | + /** |
|
40 | + * Add line break at beginning of form |
|
41 | + * |
|
42 | + * @return string |
|
43 | + */ |
|
44 | + public function layout_form_begin() |
|
45 | + { |
|
46 | + return EEH_HTML::nl(1); |
|
47 | + } |
|
48 | 48 | |
49 | 49 | |
50 | - /** |
|
51 | - * Lays out the row for the input, including label and errors |
|
52 | - * |
|
53 | - * @param EE_Form_Input_Base $input |
|
54 | - * @return string |
|
55 | - * @throws \EE_Error |
|
56 | - */ |
|
57 | - public function layout_input($input) |
|
58 | - { |
|
59 | - $html = ''; |
|
60 | - if ($input instanceof EE_Hidden_Input) { |
|
61 | - $html .= EEH_HTML::nl() . $input->get_html_for_input(); |
|
62 | - } else if ($input instanceof EE_Submit_Input) { |
|
63 | - $html .= $this->br(); |
|
64 | - $html .= $input->get_html_for_input(); |
|
65 | - } else if ($input instanceof EE_Select_Input) { |
|
66 | - $html .= $this->br(); |
|
67 | - $html .= EEH_HTML::nl(1) . $input->get_html_for_label(); |
|
68 | - $html .= EEH_HTML::nl() . $input->get_html_for_errors(); |
|
69 | - $html .= EEH_HTML::nl() . $input->get_html_for_input(); |
|
70 | - $html .= EEH_HTML::nl() . $input->get_html_for_help(); |
|
71 | - $html .= $this->br(); |
|
72 | - } else if ($input instanceof EE_Form_Input_With_Options_Base) { |
|
73 | - $html .= $this->br(); |
|
74 | - $html .= EEH_HTML::nl() . $input->get_html_for_errors(); |
|
75 | - $html .= EEH_HTML::nl() . $input->get_html_for_input(); |
|
76 | - $html .= EEH_HTML::nl() . $input->get_html_for_help(); |
|
77 | - } else { |
|
78 | - $html .= $this->br(); |
|
79 | - $html .= EEH_HTML::nl(1) . $input->get_html_for_label(); |
|
80 | - $html .= EEH_HTML::nl() . $input->get_html_for_errors(); |
|
81 | - $html .= EEH_HTML::nl() . $input->get_html_for_input(); |
|
82 | - $html .= EEH_HTML::nl() . $input->get_html_for_help(); |
|
83 | - } |
|
84 | - $html .= EEH_HTML::nl(-1); |
|
85 | - return $html; |
|
86 | - } |
|
50 | + /** |
|
51 | + * Lays out the row for the input, including label and errors |
|
52 | + * |
|
53 | + * @param EE_Form_Input_Base $input |
|
54 | + * @return string |
|
55 | + * @throws \EE_Error |
|
56 | + */ |
|
57 | + public function layout_input($input) |
|
58 | + { |
|
59 | + $html = ''; |
|
60 | + if ($input instanceof EE_Hidden_Input) { |
|
61 | + $html .= EEH_HTML::nl() . $input->get_html_for_input(); |
|
62 | + } else if ($input instanceof EE_Submit_Input) { |
|
63 | + $html .= $this->br(); |
|
64 | + $html .= $input->get_html_for_input(); |
|
65 | + } else if ($input instanceof EE_Select_Input) { |
|
66 | + $html .= $this->br(); |
|
67 | + $html .= EEH_HTML::nl(1) . $input->get_html_for_label(); |
|
68 | + $html .= EEH_HTML::nl() . $input->get_html_for_errors(); |
|
69 | + $html .= EEH_HTML::nl() . $input->get_html_for_input(); |
|
70 | + $html .= EEH_HTML::nl() . $input->get_html_for_help(); |
|
71 | + $html .= $this->br(); |
|
72 | + } else if ($input instanceof EE_Form_Input_With_Options_Base) { |
|
73 | + $html .= $this->br(); |
|
74 | + $html .= EEH_HTML::nl() . $input->get_html_for_errors(); |
|
75 | + $html .= EEH_HTML::nl() . $input->get_html_for_input(); |
|
76 | + $html .= EEH_HTML::nl() . $input->get_html_for_help(); |
|
77 | + } else { |
|
78 | + $html .= $this->br(); |
|
79 | + $html .= EEH_HTML::nl(1) . $input->get_html_for_label(); |
|
80 | + $html .= EEH_HTML::nl() . $input->get_html_for_errors(); |
|
81 | + $html .= EEH_HTML::nl() . $input->get_html_for_input(); |
|
82 | + $html .= EEH_HTML::nl() . $input->get_html_for_help(); |
|
83 | + } |
|
84 | + $html .= EEH_HTML::nl(-1); |
|
85 | + return $html; |
|
86 | + } |
|
87 | 87 | |
88 | 88 | |
89 | - /** |
|
90 | - * Lays out a row for the subsection |
|
91 | - * |
|
92 | - * @param EE_Form_Section_Proper $form_section |
|
93 | - * @return string |
|
94 | - */ |
|
95 | - public function layout_subsection($form_section) |
|
96 | - { |
|
89 | + /** |
|
90 | + * Lays out a row for the subsection |
|
91 | + * |
|
92 | + * @param EE_Form_Section_Proper $form_section |
|
93 | + * @return string |
|
94 | + */ |
|
95 | + public function layout_subsection($form_section) |
|
96 | + { |
|
97 | 97 | // d( $form_section ); |
98 | - return EEH_HTML::nl(1) . $form_section->get_html() . EEH_HTML::nl(-1); |
|
99 | - } |
|
98 | + return EEH_HTML::nl(1) . $form_section->get_html() . EEH_HTML::nl(-1); |
|
99 | + } |
|
100 | 100 | |
101 | 101 | |
102 | - /** |
|
103 | - * Add line break at end of form. |
|
104 | - * |
|
105 | - * @return string |
|
106 | - */ |
|
107 | - public function layout_form_end() |
|
108 | - { |
|
109 | - return EEH_HTML::nl(-1); |
|
110 | - } |
|
102 | + /** |
|
103 | + * Add line break at end of form. |
|
104 | + * |
|
105 | + * @return string |
|
106 | + */ |
|
107 | + public function layout_form_end() |
|
108 | + { |
|
109 | + return EEH_HTML::nl(-1); |
|
110 | + } |
|
111 | 111 | |
112 | 112 | |
113 | - /** |
|
114 | - * This returns a break tag or an empty string depending on the value of the `_use_break_tags` property. |
|
115 | - * |
|
116 | - * @return string |
|
117 | - */ |
|
118 | - protected function br() |
|
119 | - { |
|
120 | - return $this->_use_break_tags ? EEH_HTML::br() : ''; |
|
121 | - } |
|
113 | + /** |
|
114 | + * This returns a break tag or an empty string depending on the value of the `_use_break_tags` property. |
|
115 | + * |
|
116 | + * @return string |
|
117 | + */ |
|
118 | + protected function br() |
|
119 | + { |
|
120 | + return $this->_use_break_tags ? EEH_HTML::br() : ''; |
|
121 | + } |
|
122 | 122 | } |
123 | 123 | \ No newline at end of file |
@@ -58,28 +58,28 @@ discard block |
||
58 | 58 | { |
59 | 59 | $html = ''; |
60 | 60 | if ($input instanceof EE_Hidden_Input) { |
61 | - $html .= EEH_HTML::nl() . $input->get_html_for_input(); |
|
61 | + $html .= EEH_HTML::nl().$input->get_html_for_input(); |
|
62 | 62 | } else if ($input instanceof EE_Submit_Input) { |
63 | 63 | $html .= $this->br(); |
64 | 64 | $html .= $input->get_html_for_input(); |
65 | 65 | } else if ($input instanceof EE_Select_Input) { |
66 | 66 | $html .= $this->br(); |
67 | - $html .= EEH_HTML::nl(1) . $input->get_html_for_label(); |
|
68 | - $html .= EEH_HTML::nl() . $input->get_html_for_errors(); |
|
69 | - $html .= EEH_HTML::nl() . $input->get_html_for_input(); |
|
70 | - $html .= EEH_HTML::nl() . $input->get_html_for_help(); |
|
67 | + $html .= EEH_HTML::nl(1).$input->get_html_for_label(); |
|
68 | + $html .= EEH_HTML::nl().$input->get_html_for_errors(); |
|
69 | + $html .= EEH_HTML::nl().$input->get_html_for_input(); |
|
70 | + $html .= EEH_HTML::nl().$input->get_html_for_help(); |
|
71 | 71 | $html .= $this->br(); |
72 | 72 | } else if ($input instanceof EE_Form_Input_With_Options_Base) { |
73 | 73 | $html .= $this->br(); |
74 | - $html .= EEH_HTML::nl() . $input->get_html_for_errors(); |
|
75 | - $html .= EEH_HTML::nl() . $input->get_html_for_input(); |
|
76 | - $html .= EEH_HTML::nl() . $input->get_html_for_help(); |
|
74 | + $html .= EEH_HTML::nl().$input->get_html_for_errors(); |
|
75 | + $html .= EEH_HTML::nl().$input->get_html_for_input(); |
|
76 | + $html .= EEH_HTML::nl().$input->get_html_for_help(); |
|
77 | 77 | } else { |
78 | 78 | $html .= $this->br(); |
79 | - $html .= EEH_HTML::nl(1) . $input->get_html_for_label(); |
|
80 | - $html .= EEH_HTML::nl() . $input->get_html_for_errors(); |
|
81 | - $html .= EEH_HTML::nl() . $input->get_html_for_input(); |
|
82 | - $html .= EEH_HTML::nl() . $input->get_html_for_help(); |
|
79 | + $html .= EEH_HTML::nl(1).$input->get_html_for_label(); |
|
80 | + $html .= EEH_HTML::nl().$input->get_html_for_errors(); |
|
81 | + $html .= EEH_HTML::nl().$input->get_html_for_input(); |
|
82 | + $html .= EEH_HTML::nl().$input->get_html_for_help(); |
|
83 | 83 | } |
84 | 84 | $html .= EEH_HTML::nl(-1); |
85 | 85 | return $html; |
@@ -95,7 +95,7 @@ discard block |
||
95 | 95 | public function layout_subsection($form_section) |
96 | 96 | { |
97 | 97 | // d( $form_section ); |
98 | - return EEH_HTML::nl(1) . $form_section->get_html() . EEH_HTML::nl(-1); |
|
98 | + return EEH_HTML::nl(1).$form_section->get_html().EEH_HTML::nl(-1); |
|
99 | 99 | } |
100 | 100 | |
101 | 101 |