@@ -1,8 +1,8 @@ |
||
1 | 1 | <div class="padding"> |
2 | 2 | <p><?php |
3 | - printf( |
|
4 | - esc_html__('Check out the %1$sroadmap for Event Espresso%2$s.', 'event_espresso'), |
|
5 | - '<a href="https://trello.com/b/zg9DCIpe/event-espresso-public-roadmap" target="_blank" rel="noopener noreferrer">', |
|
6 | - '</a>' |
|
7 | - ); ?></p> |
|
3 | + printf( |
|
4 | + esc_html__('Check out the %1$sroadmap for Event Espresso%2$s.', 'event_espresso'), |
|
5 | + '<a href="https://trello.com/b/zg9DCIpe/event-espresso-public-roadmap" target="_blank" rel="noopener noreferrer">', |
|
6 | + '</a>' |
|
7 | + ); ?></p> |
|
8 | 8 | </div> |
9 | 9 | \ No newline at end of file |
@@ -75,7 +75,7 @@ |
||
75 | 75 | <?php esc_html_e('Change the image that is used for this payment gateway.', 'event_espresso'); ?> |
76 | 76 | </li> |
77 | 77 | <li> |
78 | - <strong><?php esc_html_e('Note About Special Characters', 'event_espresso');?></strong> |
|
79 | - <?php esc_html_e('If your event name, ticket name or ticket description contain special characters (eg emojis, foreign language characters, or curly quotes) they will be removed when sent to Authorize.net. This is because Authorize.net doesn\'t support them.', 'event_espresso');?></li> |
|
78 | + <strong><?php esc_html_e('Note About Special Characters', 'event_espresso'); ?></strong> |
|
79 | + <?php esc_html_e('If your event name, ticket name or ticket description contain special characters (eg emojis, foreign language characters, or curly quotes) they will be removed when sent to Authorize.net. This is because Authorize.net doesn\'t support them.', 'event_espresso'); ?></li> |
|
80 | 80 | </li> |
81 | 81 | </ul> |
82 | 82 | \ No newline at end of file |
@@ -4,82 +4,82 @@ |
||
4 | 4 | </p> |
5 | 5 | <p> |
6 | 6 | <?php printf( |
7 | - esc_html__( |
|
8 | - 'See %1$shere%2$s for list of currencies supported by Authorize.net AIM.', |
|
9 | - 'event_espresso' |
|
10 | - ), |
|
11 | - "<a href='https://support.authorize.net/s/article/Which-Currencies-Does-Authorize-Net-Support/' target='_blank' rel='noopener noreferrer'>", |
|
12 | - "</a>" |
|
13 | - ); ?> |
|
7 | + esc_html__( |
|
8 | + 'See %1$shere%2$s for list of currencies supported by Authorize.net AIM.', |
|
9 | + 'event_espresso' |
|
10 | + ), |
|
11 | + "<a href='https://support.authorize.net/s/article/Which-Currencies-Does-Authorize-Net-Support/' target='_blank' rel='noopener noreferrer'>", |
|
12 | + "</a>" |
|
13 | + ); ?> |
|
14 | 14 | </p> |
15 | 15 | <p><strong><?php esc_html_e('Authorize.net AIM Settings', 'event_espresso'); ?></strong></p> |
16 | 16 | <ul> |
17 | 17 | <li> |
18 | 18 | <strong><?php esc_html_e('Authorize.net API Login ID', 'event_espresso'); ?></strong><br/> |
19 | 19 | <?php printf( |
20 | - esc_html__( |
|
21 | - 'Enter your API Login ID for Authorize.net. Learn how to find your %1$sAPI Login%2$s ID.', |
|
22 | - 'event_espresso' |
|
23 | - ), |
|
24 | - '<a href="https://support.authorize.net/authkb/index?page=content&id=A405" target="_blank" rel="noopener noreferrer">', |
|
25 | - '</a>' |
|
26 | - ); ?> |
|
20 | + esc_html__( |
|
21 | + 'Enter your API Login ID for Authorize.net. Learn how to find your %1$sAPI Login%2$s ID.', |
|
22 | + 'event_espresso' |
|
23 | + ), |
|
24 | + '<a href="https://support.authorize.net/authkb/index?page=content&id=A405" target="_blank" rel="noopener noreferrer">', |
|
25 | + '</a>' |
|
26 | + ); ?> |
|
27 | 27 | </li> |
28 | 28 | <li> |
29 | 29 | <strong><?php esc_html_e('Authorize.net Transaction Key', 'event_espresso'); ?></strong><br/> |
30 | 30 | <?php printf( |
31 | - esc_html__( |
|
32 | - 'Enter your Transaction Key for Authorize.net. Learn how to find your %1$sTransaction Key%2$s.', |
|
33 | - 'event_espresso' |
|
34 | - ), |
|
35 | - '<a href="https://support.authorize.net/authkb/index?page=content&id=A405" target="_blank" rel="noopener noreferrer">', |
|
36 | - '</a>' |
|
37 | - ); ?> |
|
31 | + esc_html__( |
|
32 | + 'Enter your Transaction Key for Authorize.net. Learn how to find your %1$sTransaction Key%2$s.', |
|
33 | + 'event_espresso' |
|
34 | + ), |
|
35 | + '<a href="https://support.authorize.net/authkb/index?page=content&id=A405" target="_blank" rel="noopener noreferrer">', |
|
36 | + '</a>' |
|
37 | + ); ?> |
|
38 | 38 | </li> |
39 | 39 | <li> |
40 | 40 | <strong> |
41 | 41 | <?php esc_html_e( |
42 | - 'Is this an account on the Authorize.net development server?', |
|
43 | - 'event_espresso' |
|
44 | - ); ?></strong><br/> |
|
42 | + 'Is this an account on the Authorize.net development server?', |
|
43 | + 'event_espresso' |
|
44 | + ); ?></strong><br/> |
|
45 | 45 | <?php esc_html_e( |
46 | - 'Specify whether this is a live/production account or a test account on the Authorize.net development server.', |
|
47 | - 'event_espresso' |
|
48 | - ); ?> |
|
46 | + 'Specify whether this is a live/production account or a test account on the Authorize.net development server.', |
|
47 | + 'event_espresso' |
|
48 | + ); ?> |
|
49 | 49 | </li> |
50 | 50 | <li> |
51 | 51 | <strong><?php esc_html_e('Do you want to submit a test transaction?', 'event_espresso'); ?></strong><br/> |
52 | 52 | <?php esc_html_e( |
53 | - 'Specify if you want to test the Authorize.net AIM payment gateway by submitting a test transaction. Be sure to turn this setting off when you are done testing.', |
|
54 | - 'event_espresso' |
|
55 | - ); ?> |
|
53 | + 'Specify if you want to test the Authorize.net AIM payment gateway by submitting a test transaction. Be sure to turn this setting off when you are done testing.', |
|
54 | + 'event_espresso' |
|
55 | + ); ?> |
|
56 | 56 | </li> |
57 | 57 | <li> |
58 | 58 | <strong><?php esc_html_e('Excluded and Required Payment Form Fields', 'event_espresso'); ?></strong><br/> |
59 | 59 | <?php esc_html_e( |
60 | - 'By logging into Authorize.net, you can change which payment fields are required by Authorize.net when processing payments. These settings affect both the Advanced Integration Method (AIM, this) and the Simple Integration Method (SIM, different). The payment method settings "Excluded Payment Form Fields" and "Required Payment Form Fields" allow you to change the billing form in Event Espresso to reflect your payment form settings in Authorize.net.', |
|
61 | - 'event_espresso' |
|
62 | - ); ?> |
|
60 | + 'By logging into Authorize.net, you can change which payment fields are required by Authorize.net when processing payments. These settings affect both the Advanced Integration Method (AIM, this) and the Simple Integration Method (SIM, different). The payment method settings "Excluded Payment Form Fields" and "Required Payment Form Fields" allow you to change the billing form in Event Espresso to reflect your payment form settings in Authorize.net.', |
|
61 | + 'event_espresso' |
|
62 | + ); ?> |
|
63 | 63 | <br> |
64 | 64 | <?php |
65 | - printf( |
|
66 | - esc_html__( |
|
67 | - 'To change your payment form settings in Authorize.net, %1$slog in to authorize.net%2$s, go to %3$sAccount then Payment Form%2$s, then %4$sForm Fields%2$s. It will look similar to %5$sthis%2$s. If you make a field required in Authorize.net, you should also make it required in Event Espresso. If it isn\'t required in Authorize.net, and you want to simplify the billing form in Event Espresso, you can exclude it from the Event Espresso Form too.', |
|
68 | - 'event_espresso' |
|
69 | - ), |
|
70 | - '<a href="http://authorize.net" target="_blank" rel="noopener noreferrer">', |
|
71 | - '</a>', |
|
72 | - '<a href="https://monosnap.com/file/nebVteOkEXcdDIos88SojStWOifP23" target="_blank" rel="noopener noreferrer">', |
|
73 | - '<a href="https://monosnap.com/file/WyxGJtev87TcDmdGBEZ2oi1xaBIQAm" target="_blank" rel="noopener noreferrer">', |
|
74 | - '<a href="https://monosnap.com/image/DbCJNfEesWXeSNUs1wLIpGYODFw52m" target="_blank" rel="noopener noreferrer">' |
|
75 | - ); ?> |
|
65 | + printf( |
|
66 | + esc_html__( |
|
67 | + 'To change your payment form settings in Authorize.net, %1$slog in to authorize.net%2$s, go to %3$sAccount then Payment Form%2$s, then %4$sForm Fields%2$s. It will look similar to %5$sthis%2$s. If you make a field required in Authorize.net, you should also make it required in Event Espresso. If it isn\'t required in Authorize.net, and you want to simplify the billing form in Event Espresso, you can exclude it from the Event Espresso Form too.', |
|
68 | + 'event_espresso' |
|
69 | + ), |
|
70 | + '<a href="http://authorize.net" target="_blank" rel="noopener noreferrer">', |
|
71 | + '</a>', |
|
72 | + '<a href="https://monosnap.com/file/nebVteOkEXcdDIos88SojStWOifP23" target="_blank" rel="noopener noreferrer">', |
|
73 | + '<a href="https://monosnap.com/file/WyxGJtev87TcDmdGBEZ2oi1xaBIQAm" target="_blank" rel="noopener noreferrer">', |
|
74 | + '<a href="https://monosnap.com/image/DbCJNfEesWXeSNUs1wLIpGYODFw52m" target="_blank" rel="noopener noreferrer">' |
|
75 | + ); ?> |
|
76 | 76 | </li> |
77 | 77 | <li> |
78 | 78 | <strong><?php esc_html_e('Server', 'event_espresso'); ?></strong> |
79 | 79 | <?php esc_html_e( |
80 | - 'Use this setting to change the server where Authorize.net AIM requests are sent. Change this to "Authorize.net/Akamai" before June 30th 2016 to verify your server will work with Authorize.net\'s servers which will be in use after that date.', |
|
81 | - 'event_espresso' |
|
82 | - ); ?> |
|
80 | + 'Use this setting to change the server where Authorize.net AIM requests are sent. Change this to "Authorize.net/Akamai" before June 30th 2016 to verify your server will work with Authorize.net\'s servers which will be in use after that date.', |
|
81 | + 'event_espresso' |
|
82 | + ); ?> |
|
83 | 83 | </li> |
84 | 84 | <li> |
85 | 85 | <strong><?php esc_html_e('Button Image URL', 'event_espresso'); ?></strong><br/> |
@@ -16,39 +16,39 @@ discard block |
||
16 | 16 | <div class="sandbox-panel"> |
17 | 17 | <h2 class="section-title"><?php _e('PayPal Sandbox Mode', 'event_espresso'); ?></h2> |
18 | 18 | <h3 style="color:#ff0000;"><?php |
19 | - _e( |
|
20 | - 'Debug Mode Is Turned On. Payments will not be processed', |
|
21 | - 'event_espresso' |
|
22 | - ); ?></h3> |
|
19 | + _e( |
|
20 | + 'Debug Mode Is Turned On. Payments will not be processed', |
|
21 | + 'event_espresso' |
|
22 | + ); ?></h3> |
|
23 | 23 | |
24 | 24 | <p class="test-credit-cards-info-pg" style="margin-bottom:0;"> |
25 | 25 | <strong><?php _e('Testing Guidelines', 'event_espresso'); ?></strong> |
26 | 26 | </p> |
27 | 27 | <ul style="margin:1em 2em 1.5em; line-height:1.2em;"> |
28 | 28 | <li><?php |
29 | - _e( |
|
30 | - 'While testing, use the credit card number associated with your sandbox account.', |
|
31 | - 'event_espresso' |
|
32 | - ); ?></li> |
|
29 | + _e( |
|
30 | + 'While testing, use the credit card number associated with your sandbox account.', |
|
31 | + 'event_espresso' |
|
32 | + ); ?></li> |
|
33 | 33 | <li><?php |
34 | - printf( |
|
35 | - __( |
|
36 | - 'To find the sandbox account\'s credit card, go to %1$s, then "Dashboard", then under Sandbox click "Accounts", then click your account and click "Profile", then in the popup that appears click on the "Funding" tab. Your testing card is listed there.', |
|
37 | - 'event_espresso' |
|
38 | - ), |
|
39 | - '<a href="http://developer.paypal.com">developer.paypal.com</a>' |
|
40 | - ); ?></li> |
|
34 | + printf( |
|
35 | + __( |
|
36 | + 'To find the sandbox account\'s credit card, go to %1$s, then "Dashboard", then under Sandbox click "Accounts", then click your account and click "Profile", then in the popup that appears click on the "Funding" tab. Your testing card is listed there.', |
|
37 | + 'event_espresso' |
|
38 | + ), |
|
39 | + '<a href="http://developer.paypal.com">developer.paypal.com</a>' |
|
40 | + ); ?></li> |
|
41 | 41 | <li><?php |
42 | - esc_html_e('CVV2 should be 115', 'event_espresso'); ?></li> |
|
42 | + esc_html_e('CVV2 should be 115', 'event_espresso'); ?></li> |
|
43 | 43 | </ul> |
44 | 44 | |
45 | 45 | <p class="test-credit-cards-info-pg"> |
46 | 46 | <strong><?php _e('Credit Card Numbers Used for Testing', 'event_espresso'); ?></strong><br/> |
47 | 47 | <span class="small-text"><?php |
48 | - _e( |
|
49 | - 'Use the following credit card numbers for testing. Any other card number produces a general failure.', |
|
50 | - 'event_espresso' |
|
51 | - ); ?></span> |
|
48 | + _e( |
|
49 | + 'Use the following credit card numbers for testing. Any other card number produces a general failure.', |
|
50 | + 'event_espresso' |
|
51 | + ); ?></span> |
|
52 | 52 | </p> |
53 | 53 | |
54 | 54 | <div class="tbl-wrap"> |
@@ -72,18 +72,18 @@ discard block |
||
72 | 72 | <p class="test-credit-cards-info-pg"> |
73 | 73 | <strong><?php _e('Testing Result Code Responses', 'event_espresso'); ?></strong><br/> |
74 | 74 | <span class="small-text"><?php |
75 | - printf( |
|
76 | - __( |
|
77 | - 'You can use the amount of the transaction to generate a particular result code (see %s PayPal\'s documentation%s). The table below lists the general guidelines for specifying amounts. IMPORTANT: before you attempt any of these, ensure your sandbox PayPal account has %s "Negative Testing" set to on%s. Also be aware that you can generate AVS errors by using certain strings in your address field, and CVV errors using certain CVV values. See %s this PayPal doc %s', |
|
78 | - 'event_espresso' |
|
79 | - ), |
|
80 | - "<a href='https://developer.paypal.com/docs/classic/api/errorcodes/#id09C3GA00GR1' target='_blank'>", |
|
81 | - "</a>", |
|
82 | - "<a href='https://docs.google.com/a/eventespresso.com/file/d/0B5P8GXTvZgfMNXNkZ2s5VUlHTUk/edit?usp=drivesdk' target='_blank'>", |
|
83 | - "</a>", |
|
84 | - "<a href='https://cms.paypal.com/ca/cgi-bin/?cmd=_render-content&content_ID=developer/e_howto_testing_SBTestErrorConditions' target='_blank'>", |
|
85 | - "</a>" |
|
86 | - ); ?></span> |
|
75 | + printf( |
|
76 | + __( |
|
77 | + 'You can use the amount of the transaction to generate a particular result code (see %s PayPal\'s documentation%s). The table below lists the general guidelines for specifying amounts. IMPORTANT: before you attempt any of these, ensure your sandbox PayPal account has %s "Negative Testing" set to on%s. Also be aware that you can generate AVS errors by using certain strings in your address field, and CVV errors using certain CVV values. See %s this PayPal doc %s', |
|
78 | + 'event_espresso' |
|
79 | + ), |
|
80 | + "<a href='https://developer.paypal.com/docs/classic/api/errorcodes/#id09C3GA00GR1' target='_blank'>", |
|
81 | + "</a>", |
|
82 | + "<a href='https://docs.google.com/a/eventespresso.com/file/d/0B5P8GXTvZgfMNXNkZ2s5VUlHTUk/edit?usp=drivesdk' target='_blank'>", |
|
83 | + "</a>", |
|
84 | + "<a href='https://cms.paypal.com/ca/cgi-bin/?cmd=_render-content&content_ID=developer/e_howto_testing_SBTestErrorConditions' target='_blank'>", |
|
85 | + "</a>" |
|
86 | + ); ?></span> |
|
87 | 87 | </p> |
88 | 88 | |
89 | 89 | <div class="tbl-wrap"> |
@@ -4,37 +4,37 @@ discard block |
||
4 | 4 | </p> |
5 | 5 | <p> |
6 | 6 | <?php |
7 | - printf( |
|
8 | - esc_html__( |
|
9 | - 'Mijireh is basically a middle-man between Event Espresso and over 90 payment gateways. Most of the configuration occurs on %1$sMijireh\'s website%2$s, where you configure your Mijireh store with the %3$spayment gateway of your choice%4$s.', |
|
10 | - 'event_espresso' |
|
11 | - ), |
|
12 | - '<a href="http://www.mijireh.com/" target="_blank" rel="noopener noreferrer">', |
|
13 | - '</a>', |
|
14 | - '<a href="http://www.mijireh.com/docs/payment-gateways/" target="_blank" rel="noopener noreferrer">', |
|
15 | - '</a>' |
|
16 | - ); |
|
17 | - ?> |
|
7 | + printf( |
|
8 | + esc_html__( |
|
9 | + 'Mijireh is basically a middle-man between Event Espresso and over 90 payment gateways. Most of the configuration occurs on %1$sMijireh\'s website%2$s, where you configure your Mijireh store with the %3$spayment gateway of your choice%4$s.', |
|
10 | + 'event_espresso' |
|
11 | + ), |
|
12 | + '<a href="http://www.mijireh.com/" target="_blank" rel="noopener noreferrer">', |
|
13 | + '</a>', |
|
14 | + '<a href="http://www.mijireh.com/docs/payment-gateways/" target="_blank" rel="noopener noreferrer">', |
|
15 | + '</a>' |
|
16 | + ); |
|
17 | + ?> |
|
18 | 18 | </p> |
19 | 19 | <p> |
20 | 20 | <?php esc_html_e( |
21 | - 'For information on what currencies you can use with Mijireh, please consult the payment gateway Mijireh is setup to use.', |
|
22 | - 'event_espresso' |
|
23 | - ) ?> |
|
21 | + 'For information on what currencies you can use with Mijireh, please consult the payment gateway Mijireh is setup to use.', |
|
22 | + 'event_espresso' |
|
23 | + ) ?> |
|
24 | 24 | </p> |
25 | 25 | <ul> |
26 | 26 | <li> |
27 | 27 | <strong><?php esc_html_e('Mijireh Access Key', 'event_espresso'); ?></strong><br/> |
28 | 28 | <?php |
29 | - printf( |
|
30 | - esc_html__( |
|
31 | - 'Enter your Access Key for Mijireh. Your Access Key can be found in your %1$sMijireh account dashboard%2$s.', |
|
32 | - 'event_espresso' |
|
33 | - ), |
|
34 | - '<a href="https://secure.mijireh.com/login" target="_blank" rel="noopener noreferrer">', |
|
35 | - '</a>' |
|
36 | - ); |
|
37 | - ?> |
|
29 | + printf( |
|
30 | + esc_html__( |
|
31 | + 'Enter your Access Key for Mijireh. Your Access Key can be found in your %1$sMijireh account dashboard%2$s.', |
|
32 | + 'event_espresso' |
|
33 | + ), |
|
34 | + '<a href="https://secure.mijireh.com/login" target="_blank" rel="noopener noreferrer">', |
|
35 | + '</a>' |
|
36 | + ); |
|
37 | + ?> |
|
38 | 38 | </li> |
39 | 39 | <li> |
40 | 40 | <strong><?php esc_html_e('Button Image URL', 'event_espresso'); ?></strong><br/> |
@@ -44,15 +44,15 @@ discard block |
||
44 | 44 | <p><strong><?php esc_html_e('Mijireh Checkout Page Design', 'event_espresso'); ?></strong></p> |
45 | 45 | <p> |
46 | 46 | <?php esc_html_e( |
47 | - "As you are probably aware, when users pay with Mijireh Payment Method, they are taken to a secure offsite page, hosted by Mijireh. This page can easily be made to have the look-and-feel of your website through a process called 'slurping', where Mijireh 'slurps' up your website's design and uses it on their checkout page.", |
|
48 | - 'event_espresso' |
|
49 | - ); ?> |
|
47 | + "As you are probably aware, when users pay with Mijireh Payment Method, they are taken to a secure offsite page, hosted by Mijireh. This page can easily be made to have the look-and-feel of your website through a process called 'slurping', where Mijireh 'slurps' up your website's design and uses it on their checkout page.", |
|
48 | + 'event_espresso' |
|
49 | + ); ?> |
|
50 | 50 | <?php printf( |
51 | - esc_html__( |
|
52 | - "In order to do this, we automatically create a new WordPress page which is designed to be slurped by Mijireh. You can customize the page like any other, but the page must contain Mijireh's special '{{mijireh-checkout-form}}' shortcode. Once you have finished designing the page, publish it, and %s then click the special 'slurp now' button%s. Mijireh may take several minutes to slurp the page. Once Mijireh is finished slurping, you can delete the page, or mark it as a draft.", |
|
53 | - 'event_espresso' |
|
54 | - ), |
|
55 | - '<a href="http://ee-screenshots.s3.amazonaws.com/ee4/event-espresso-mijireh-slurp-page-example.jpg" target="_blank" rel="noopener noreferrer">', |
|
56 | - '</a>' |
|
57 | - ); ?> |
|
51 | + esc_html__( |
|
52 | + "In order to do this, we automatically create a new WordPress page which is designed to be slurped by Mijireh. You can customize the page like any other, but the page must contain Mijireh's special '{{mijireh-checkout-form}}' shortcode. Once you have finished designing the page, publish it, and %s then click the special 'slurp now' button%s. Mijireh may take several minutes to slurp the page. Once Mijireh is finished slurping, you can delete the page, or mark it as a draft.", |
|
53 | + 'event_espresso' |
|
54 | + ), |
|
55 | + '<a href="http://ee-screenshots.s3.amazonaws.com/ee4/event-espresso-mijireh-slurp-page-example.jpg" target="_blank" rel="noopener noreferrer">', |
|
56 | + '</a>' |
|
57 | + ); ?> |
|
58 | 58 | </p> |
59 | 59 | \ No newline at end of file |
@@ -3,10 +3,10 @@ |
||
3 | 3 | <?php esc_html_e('This page shows options for Email Validation, the EE "Bot Trap" and reCAPTCHA which can help prevent SPAM registrations on your site.', 'event_espresso'); ?> |
4 | 4 | </p> |
5 | 5 | <div id="email_validation_info"> |
6 | -<p><strong><?php esc_html_e('Email Validation', 'event_espresso');?></strong></p> |
|
6 | +<p><strong><?php esc_html_e('Email Validation', 'event_espresso'); ?></strong></p> |
|
7 | 7 | <p><?php esc_html_e("Validating an email address is extremely difficult to do correctly. Your server's configuration, as well as your own tolerances and needs, can affect the type of validation needed. We offer different types of validation so that you can control how strict your registration form responds to entered email addresses. If you are receiving too many bogus email addresses, then you can try the WordPress Default validation setting. If you find that the form validation is blocking a valid email address you can try the Basic setting, or if available, the International validation settings.", 'event_espresso'); ?> |
8 | 8 | </p> |
9 | -<p><strong><?php esc_html_e('Validation Options:', 'event_espresso');?></strong></p> |
|
9 | +<p><strong><?php esc_html_e('Validation Options:', 'event_espresso'); ?></strong></p> |
|
10 | 10 | <ul> |
11 | 11 | <li> |
12 | 12 | <?php esc_html_e('"Basic" - only checks that an email address follows the most basic structure guidelines ( ie: [email protected] ). Will work with the widest range of email addresses but will also allow the most garbage through.', 'event_espresso'); ?></li> |
@@ -1,93 +1,93 @@ |
||
1 | 1 | <div class="padding"> |
2 | 2 | <?php esc_html_e( |
3 | - 'If you want to integrate with Event Espresso or participate in building code, then you are in the right place. The following resources can help you get started.', |
|
4 | - 'event_espresso' |
|
5 | - ); ?> |
|
3 | + 'If you want to integrate with Event Espresso or participate in building code, then you are in the right place. The following resources can help you get started.', |
|
4 | + 'event_espresso' |
|
5 | + ); ?> |
|
6 | 6 | <h2><?php esc_html_e('Developer Resources', 'event_espresso'); ?></h2> |
7 | 7 | <ul> |
8 | 8 | <li> |
9 | 9 | <?php printf( |
10 | - esc_html__('%1$sEvent Espresso 4 Developer Documentation%2$s', 'event_espresso'), |
|
11 | - '<a href="https://github.com/eventespresso/event-espresso-core/tree/master/docs#getting-started-with-the-ee-developer-docs" target="_blank" rel="noopener noreferrer">', |
|
12 | - '</a>' |
|
13 | - ); ?></li> |
|
10 | + esc_html__('%1$sEvent Espresso 4 Developer Documentation%2$s', 'event_espresso'), |
|
11 | + '<a href="https://github.com/eventespresso/event-espresso-core/tree/master/docs#getting-started-with-the-ee-developer-docs" target="_blank" rel="noopener noreferrer">', |
|
12 | + '</a>' |
|
13 | + ); ?></li> |
|
14 | 14 | <li> |
15 | 15 | <?php printf( |
16 | - esc_html__('%1$sEvent Espresso 4 Developer News%2$s', 'event_espresso'), |
|
17 | - '<a href="http://developer.eventespresso.com/?ee_ver=ee4&utm_source=ee4_plugin_admin&utm_medium=link&utm_campaign=ee_support_page&utm_content=developers_tab" target="_blank">', |
|
18 | - '</a>' |
|
19 | - ); ?></li> |
|
16 | + esc_html__('%1$sEvent Espresso 4 Developer News%2$s', 'event_espresso'), |
|
17 | + '<a href="http://developer.eventespresso.com/?ee_ver=ee4&utm_source=ee4_plugin_admin&utm_medium=link&utm_campaign=ee_support_page&utm_content=developers_tab" target="_blank">', |
|
18 | + '</a>' |
|
19 | + ); ?></li> |
|
20 | 20 | <li> |
21 | 21 | <?php printf( |
22 | - esc_html__('%1$sApply%2$s to be listed as an %3$sEvent Espresso Professional%2$s', 'event_espresso'), |
|
23 | - '<a href="https://eventespresso.com/developers/event-espresso-pros-application/?ee_ver=ee4&utm_source=ee4_plugin_admin&utm_medium=link&utm_campaign=ee_support_page&utm_content=developers_tab" target="_blank">', |
|
24 | - '</a>', |
|
25 | - '<a href="https://eventespresso.com/developers/event-espresso-pros/?ee_ver=ee4&utm_source=ee4_plugin_admin&utm_medium=link&utm_campaign=ee_support_page&utm_content=developers_tab" target="_blank">' |
|
26 | - ); ?></li> |
|
22 | + esc_html__('%1$sApply%2$s to be listed as an %3$sEvent Espresso Professional%2$s', 'event_espresso'), |
|
23 | + '<a href="https://eventespresso.com/developers/event-espresso-pros-application/?ee_ver=ee4&utm_source=ee4_plugin_admin&utm_medium=link&utm_campaign=ee_support_page&utm_content=developers_tab" target="_blank">', |
|
24 | + '</a>', |
|
25 | + '<a href="https://eventespresso.com/developers/event-espresso-pros/?ee_ver=ee4&utm_source=ee4_plugin_admin&utm_medium=link&utm_campaign=ee_support_page&utm_content=developers_tab" target="_blank">' |
|
26 | + ); ?></li> |
|
27 | 27 | </ul> |
28 | 28 | |
29 | 29 | <h2><?php esc_html_e('Event Espresso 4 Articles for Developers', 'event_espresso'); ?></h2> |
30 | 30 | <ul> |
31 | 31 | <li> |
32 | 32 | <?php printf( |
33 | - esc_html__('%1$sCustom Post Types Usage%2$s', 'event_espresso'), |
|
34 | - '<a href="https://eventespresso.com/2014/02/epsresso-brewery-custom-post-types-event-espresso/?ee_ver=ee4&utm_source=ee4_plugin_admin&utm_medium=link&utm_campaign=ee_support_page&utm_content=developers_tab" target="_blank">', |
|
35 | - '</a>' |
|
36 | - ); ?></li> |
|
33 | + esc_html__('%1$sCustom Post Types Usage%2$s', 'event_espresso'), |
|
34 | + '<a href="https://eventespresso.com/2014/02/epsresso-brewery-custom-post-types-event-espresso/?ee_ver=ee4&utm_source=ee4_plugin_admin&utm_medium=link&utm_campaign=ee_support_page&utm_content=developers_tab" target="_blank">', |
|
35 | + '</a>' |
|
36 | + ); ?></li> |
|
37 | 37 | <li> |
38 | 38 | <?php printf( |
39 | - esc_html__('%1$sTheme Development%2$s', 'event_espresso'), |
|
40 | - '<a href="https://eventespresso.com/2014/02/developers-corner-theming-event-espresso-4/?ee_ver=ee4&utm_source=ee4_plugin_admin&utm_medium=link&utm_campaign=ee_support_page&utm_content=developers_tab" target="_blank">', |
|
41 | - '</a>' |
|
42 | - ); ?></li> |
|
39 | + esc_html__('%1$sTheme Development%2$s', 'event_espresso'), |
|
40 | + '<a href="https://eventespresso.com/2014/02/developers-corner-theming-event-espresso-4/?ee_ver=ee4&utm_source=ee4_plugin_admin&utm_medium=link&utm_campaign=ee_support_page&utm_content=developers_tab" target="_blank">', |
|
41 | + '</a>' |
|
42 | + ); ?></li> |
|
43 | 43 | <li> |
44 | 44 | <?php printf( |
45 | - esc_html__('%1$sCapability System%2$s', 'event_espresso'), |
|
46 | - '<a href="http://developer.eventespresso.com/docs/ee-capability-system-overview/?ee_ver=ee4&utm_source=ee4_plugin_admin&utm_medium=link&utm_campaign=ee_support_page&utm_content=developers_tab" target="_blank">', |
|
47 | - '</a>' |
|
48 | - ); ?></li> |
|
45 | + esc_html__('%1$sCapability System%2$s', 'event_espresso'), |
|
46 | + '<a href="http://developer.eventespresso.com/docs/ee-capability-system-overview/?ee_ver=ee4&utm_source=ee4_plugin_admin&utm_medium=link&utm_campaign=ee_support_page&utm_content=developers_tab" target="_blank">', |
|
47 | + '</a>' |
|
48 | + ); ?></li> |
|
49 | 49 | <li> |
50 | 50 | <?php printf( |
51 | - esc_html__('%1$sPayment Method Development%2$s', 'event_espresso'), |
|
52 | - '<a href="https://github.com/eventespresso/event-espresso-core/blob/master/docs/L--Payment-Methods-and-Gateways/creating-a-payment-method.md" target="_blank" rel="noopener noreferrer">', |
|
53 | - '</a>' |
|
54 | - ); ?></li> |
|
51 | + esc_html__('%1$sPayment Method Development%2$s', 'event_espresso'), |
|
52 | + '<a href="https://github.com/eventespresso/event-espresso-core/blob/master/docs/L--Payment-Methods-and-Gateways/creating-a-payment-method.md" target="_blank" rel="noopener noreferrer">', |
|
53 | + '</a>' |
|
54 | + ); ?></li> |
|
55 | 55 | <li> |
56 | 56 | <?php printf( |
57 | - esc_html__('%1$sMessages System in Event Espresso 4%2$s', 'event_espresso'), |
|
58 | - '<a href="https://eventespresso.com/2014/03/messages-systemyour-tool-getting-word/?ee_ver=ee4&utm_source=ee4_plugin_admin&utm_medium=link&utm_campaign=ee_support_page&utm_content=developers_tab" target="_blank">', |
|
59 | - '</a>' |
|
60 | - ); ?></li> |
|
57 | + esc_html__('%1$sMessages System in Event Espresso 4%2$s', 'event_espresso'), |
|
58 | + '<a href="https://eventespresso.com/2014/03/messages-systemyour-tool-getting-word/?ee_ver=ee4&utm_source=ee4_plugin_admin&utm_medium=link&utm_campaign=ee_support_page&utm_content=developers_tab" target="_blank">', |
|
59 | + '</a>' |
|
60 | + ); ?></li> |
|
61 | 61 | <li> |
62 | 62 | <?php printf( |
63 | - esc_html__( |
|
64 | - '%1$sDatabase Model System%2$s (used for interfacing with EE4 data via WordPress plugins and server side querying)', |
|
65 | - 'event_espresso' |
|
66 | - ), |
|
67 | - '<a href="http://developer.eventespresso.com/docs/using-ee4-model-objects/?ee_ver=ee4&utm_source=ee4_plugin_admin&utm_medium=link&utm_campaign=ee_support_page&utm_content=developers_tab" target="_blank">', |
|
68 | - '</a>' |
|
69 | - ); ?></li> |
|
63 | + esc_html__( |
|
64 | + '%1$sDatabase Model System%2$s (used for interfacing with EE4 data via WordPress plugins and server side querying)', |
|
65 | + 'event_espresso' |
|
66 | + ), |
|
67 | + '<a href="http://developer.eventespresso.com/docs/using-ee4-model-objects/?ee_ver=ee4&utm_source=ee4_plugin_admin&utm_medium=link&utm_campaign=ee_support_page&utm_content=developers_tab" target="_blank">', |
|
68 | + '</a>' |
|
69 | + ); ?></li> |
|
70 | 70 | </ul> |
71 | 71 | |
72 | 72 | <h2><?php esc_html_e('REST API Resources', 'event_espresso'); ?></h2> |
73 | 73 | <ul> |
74 | 74 | <li> |
75 | 75 | <?php printf( |
76 | - esc_html__('%1$sREST API: Introduction%2$s', 'event_espresso'), |
|
77 | - '<a href="https://github.com/eventespresso/event-espresso-core/blob/master/docs/C--REST-API/ee4-rest-api-introduction.md" target="_blank" rel="noopener noreferrer">', |
|
78 | - '</a>' |
|
79 | - ); ?></li> |
|
76 | + esc_html__('%1$sREST API: Introduction%2$s', 'event_espresso'), |
|
77 | + '<a href="https://github.com/eventespresso/event-espresso-core/blob/master/docs/C--REST-API/ee4-rest-api-introduction.md" target="_blank" rel="noopener noreferrer">', |
|
78 | + '</a>' |
|
79 | + ); ?></li> |
|
80 | 80 | <li> |
81 | 81 | <?php printf( |
82 | - esc_html__('%1$sREST API: Reading Data%2$s', 'event_espresso'), |
|
83 | - '<a href="https://github.com/eventespresso/event-espresso-core/blob/master/docs/C--REST-API/ee4-rest-api-reading-data.md" target="_blank" rel="noopener noreferrer">', |
|
84 | - '</a>' |
|
85 | - ); ?></li> |
|
82 | + esc_html__('%1$sREST API: Reading Data%2$s', 'event_espresso'), |
|
83 | + '<a href="https://github.com/eventespresso/event-espresso-core/blob/master/docs/C--REST-API/ee4-rest-api-reading-data.md" target="_blank" rel="noopener noreferrer">', |
|
84 | + '</a>' |
|
85 | + ); ?></li> |
|
86 | 86 | <li> |
87 | 87 | <?php printf( |
88 | - esc_html__('%1$sBuilding an EE4 Add-on Using the REST API%2$s', 'event_espresso'), |
|
89 | - '<a href="https://github.com/eventespresso/event-espresso-core/blob/master/docs/T--Tutorials/building-an-ee4-addon-that-uses-angular-js-and-the-ee4-json-rest-api.md" target="_blank" rel="noopener noreferrer">', |
|
90 | - '</a>' |
|
91 | - ); ?></li> |
|
88 | + esc_html__('%1$sBuilding an EE4 Add-on Using the REST API%2$s', 'event_espresso'), |
|
89 | + '<a href="https://github.com/eventespresso/event-espresso-core/blob/master/docs/T--Tutorials/building-an-ee4-addon-that-uses-angular-js-and-the-ee4-json-rest-api.md" target="_blank" rel="noopener noreferrer">', |
|
90 | + '</a>' |
|
91 | + ); ?></li> |
|
92 | 92 | </ul> |
93 | 93 | </div> |
94 | 94 | \ No newline at end of file |
@@ -11,20 +11,20 @@ discard block |
||
11 | 11 | </th> |
12 | 12 | <td> |
13 | 13 | <?php echo EEH_Form_Fields::select_input( |
14 | - 'use_google_maps', |
|
15 | - $values, |
|
16 | - $map_settings->use_google_maps, |
|
17 | - 'id="ee-display-map-no-shortcodes"' |
|
18 | - ); ?> |
|
14 | + 'use_google_maps', |
|
15 | + $values, |
|
16 | + $map_settings->use_google_maps, |
|
17 | + 'id="ee-display-map-no-shortcodes"' |
|
18 | + ); ?> |
|
19 | 19 | <p class="description"> |
20 | 20 | <?php esc_html_e( |
21 | - 'Turn Google maps on or off site wide for Event Espresso.', |
|
22 | - 'event_espresso' |
|
23 | - ); ?></p> |
|
21 | + 'Turn Google maps on or off site wide for Event Espresso.', |
|
22 | + 'event_espresso' |
|
23 | + ); ?></p> |
|
24 | 24 | </td> |
25 | 25 | </tr> |
26 | 26 | <?php |
27 | - if (apply_filters('FHEE__google_map__show_api_key_input', true)) { ?> |
|
27 | + if (apply_filters('FHEE__google_map__show_api_key_input', true)) { ?> |
|
28 | 28 | <tr> |
29 | 29 | <th> |
30 | 30 | <label for="ee-google-map-api-key"> |
@@ -36,15 +36,15 @@ discard block |
||
36 | 36 | value="<?php echo $map_settings->google_map_api_key; ?>"/> |
37 | 37 | <p class="description"> |
38 | 38 | <?php |
39 | - printf( |
|
40 | - __( |
|
41 | - 'An API key is now required to use the Google Maps API: %1$sclick here to get an API key%2$s', |
|
42 | - 'event_espresso' |
|
43 | - ), |
|
44 | - '<a href="https://console.developers.google.com/flows/enableapi?apiid=maps_backend,geocoding_backend,directions_backend,distance_matrix_backend,elevation_backend,static_maps_backend&keyType=CLIENT_SIDE&reusekey=true" target="_blank" rel="noopener noreferrer">', |
|
45 | - '</a>' |
|
46 | - ); |
|
47 | - ?> |
|
39 | + printf( |
|
40 | + __( |
|
41 | + 'An API key is now required to use the Google Maps API: %1$sclick here to get an API key%2$s', |
|
42 | + 'event_espresso' |
|
43 | + ), |
|
44 | + '<a href="https://console.developers.google.com/flows/enableapi?apiid=maps_backend,geocoding_backend,directions_backend,distance_matrix_backend,elevation_backend,static_maps_backend&keyType=CLIENT_SIDE&reusekey=true" target="_blank" rel="noopener noreferrer">', |
|
45 | + '</a>' |
|
46 | + ); |
|
47 | + ?> |
|
48 | 48 | </p> |
49 | 49 | </td> |
50 | 50 | </tr> |
@@ -105,11 +105,11 @@ discard block |
||
105 | 105 | </th> |
106 | 106 | <td> |
107 | 107 | <?php echo EEH_Form_Fields::select_input( |
108 | - 'event_details_display_nav', |
|
109 | - $values, |
|
110 | - $map_settings->event_details_display_nav, |
|
111 | - 'id="event_details_display_nav" ' |
|
112 | - ); ?> |
|
108 | + 'event_details_display_nav', |
|
109 | + $values, |
|
110 | + $map_settings->event_details_display_nav, |
|
111 | + 'id="event_details_display_nav" ' |
|
112 | + ); ?> |
|
113 | 113 | </td> |
114 | 114 | </tr> |
115 | 115 | |
@@ -121,11 +121,11 @@ discard block |
||
121 | 121 | </th> |
122 | 122 | <td> |
123 | 123 | <?php echo EEH_Form_Fields::select_input( |
124 | - 'event_details_nav_size', |
|
125 | - $values, |
|
126 | - $map_settings->event_details_nav_size, |
|
127 | - 'id="event_details_nav_size"' |
|
128 | - ); ?> |
|
124 | + 'event_details_nav_size', |
|
125 | + $values, |
|
126 | + $map_settings->event_details_nav_size, |
|
127 | + 'id="event_details_nav_size"' |
|
128 | + ); ?> |
|
129 | 129 | </td> |
130 | 130 | </tr> |
131 | 131 | |
@@ -136,7 +136,7 @@ discard block |
||
136 | 136 | <td> |
137 | 137 | <label for="event_details_control_type-default" class="ee-admin-radio-lbl"> |
138 | 138 | <?php $checked = $map_settings->event_details_control_type == 'default' ? 'checked="checked"' |
139 | - : ''; ?> |
|
139 | + : ''; ?> |
|
140 | 140 | <input id="event_details_control_type-default" type="radio" name="event_details_control_type" |
141 | 141 | value="default"<?php echo $checked; ?>/> |
142 | 142 | <?php esc_html_e(' Default', 'event_espresso') ?> |
@@ -144,7 +144,7 @@ discard block |
||
144 | 144 | |
145 | 145 | <label for="event_details_control_type-horizontal" class="ee-admin-radio-lbl"> |
146 | 146 | <?php $checked = $map_settings->event_details_control_type == 'horizontal' ? 'checked="checked"' |
147 | - : ''; ?> |
|
147 | + : ''; ?> |
|
148 | 148 | <input id="event_details_control_type-horizontal" type="radio" name="event_details_control_type" |
149 | 149 | value="horizontal"<?php echo $checked; ?>/> |
150 | 150 | <?php esc_html_e(' Horizontal', 'event_espresso') ?> |
@@ -152,7 +152,7 @@ discard block |
||
152 | 152 | |
153 | 153 | <label for="event_details_control_type-dropdown" class="ee-admin-radio-lbl"> |
154 | 154 | <?php $checked = $map_settings->event_details_control_type == 'dropdown' ? 'checked="checked"' |
155 | - : ''; ?> |
|
155 | + : ''; ?> |
|
156 | 156 | <input id="event_details_control_type-dropdown" type="radio" name="event_details_control_type" |
157 | 157 | value="dropdown"<?php echo $checked; ?>/> |
158 | 158 | <?php esc_html_e(' Dropdown', 'event_espresso') ?> |
@@ -246,11 +246,11 @@ discard block |
||
246 | 246 | </th> |
247 | 247 | <td> |
248 | 248 | <?php echo EEH_Form_Fields::select_input( |
249 | - 'event_list_display_nav', |
|
250 | - $values, |
|
251 | - $map_settings->event_list_display_nav, |
|
252 | - 'id="event_list_display_nav"' |
|
253 | - ); ?> |
|
249 | + 'event_list_display_nav', |
|
250 | + $values, |
|
251 | + $map_settings->event_list_display_nav, |
|
252 | + 'id="event_list_display_nav"' |
|
253 | + ); ?> |
|
254 | 254 | </td> |
255 | 255 | </tr> |
256 | 256 | |
@@ -262,11 +262,11 @@ discard block |
||
262 | 262 | </th> |
263 | 263 | <td> |
264 | 264 | <?php echo EEH_Form_Fields::select_input( |
265 | - 'event_list_nav_size', |
|
266 | - $values, |
|
267 | - $map_settings->event_list_nav_size, |
|
268 | - 'id="event_list_nav_size"' |
|
269 | - ); ?> |
|
265 | + 'event_list_nav_size', |
|
266 | + $values, |
|
267 | + $map_settings->event_list_nav_size, |
|
268 | + 'id="event_list_nav_size"' |
|
269 | + ); ?> |
|
270 | 270 | </td> |
271 | 271 | </tr> |
272 | 272 | |
@@ -284,7 +284,7 @@ discard block |
||
284 | 284 | |
285 | 285 | <label for="event_list_control_type-horizontal" class="ee-admin-radio-lbl"> |
286 | 286 | <?php $checked = $map_settings->event_list_control_type == 'horizontal' ? 'checked="checked"' |
287 | - : ''; ?> |
|
287 | + : ''; ?> |
|
288 | 288 | <input id="event_list_control_type-horizontal" type="radio" name="event_list_control_type" |
289 | 289 | value="horizontal"<?php echo $checked; ?>/> |
290 | 290 | <?php esc_html_e(' Horizontal', 'event_espresso') ?> |
@@ -15,1800 +15,1800 @@ |
||
15 | 15 | class EED_Single_Page_Checkout extends EED_Module |
16 | 16 | { |
17 | 17 | |
18 | - /** |
|
19 | - * $_initialized - has the SPCO controller already been initialized ? |
|
20 | - * |
|
21 | - * @access private |
|
22 | - * @var bool $_initialized |
|
23 | - */ |
|
24 | - private static $_initialized = false; |
|
25 | - |
|
26 | - |
|
27 | - /** |
|
28 | - * $_checkout_verified - is the EE_Checkout verified as correct for this request ? |
|
29 | - * |
|
30 | - * @access private |
|
31 | - * @var bool $_valid_checkout |
|
32 | - */ |
|
33 | - private static $_checkout_verified = true; |
|
34 | - |
|
35 | - /** |
|
36 | - * $_reg_steps_array - holds initial array of reg steps |
|
37 | - * |
|
38 | - * @access private |
|
39 | - * @var array $_reg_steps_array |
|
40 | - */ |
|
41 | - private static $_reg_steps_array = array(); |
|
42 | - |
|
43 | - /** |
|
44 | - * $checkout - EE_Checkout object for handling the properties of the current checkout process |
|
45 | - * |
|
46 | - * @access public |
|
47 | - * @var EE_Checkout $checkout |
|
48 | - */ |
|
49 | - public $checkout; |
|
50 | - |
|
51 | - |
|
52 | - /** |
|
53 | - * @return EED_Module|EED_Single_Page_Checkout |
|
54 | - */ |
|
55 | - public static function instance() |
|
56 | - { |
|
57 | - add_filter('EED_Single_Page_Checkout__SPCO_active', '__return_true'); |
|
58 | - return parent::get_instance(__CLASS__); |
|
59 | - } |
|
60 | - |
|
61 | - |
|
62 | - /** |
|
63 | - * @return EE_CART |
|
64 | - */ |
|
65 | - public function cart() |
|
66 | - { |
|
67 | - return $this->checkout->cart; |
|
68 | - } |
|
69 | - |
|
70 | - |
|
71 | - /** |
|
72 | - * @return EE_Transaction |
|
73 | - */ |
|
74 | - public function transaction() |
|
75 | - { |
|
76 | - return $this->checkout->transaction; |
|
77 | - } |
|
78 | - |
|
79 | - |
|
80 | - /** |
|
81 | - * set_hooks - for hooking into EE Core, other modules, etc |
|
82 | - * |
|
83 | - * @access public |
|
84 | - * @return void |
|
85 | - * @throws EE_Error |
|
86 | - */ |
|
87 | - public static function set_hooks() |
|
88 | - { |
|
89 | - EED_Single_Page_Checkout::set_definitions(); |
|
90 | - } |
|
91 | - |
|
92 | - |
|
93 | - /** |
|
94 | - * set_hooks_admin - for hooking into EE Admin Core, other modules, etc |
|
95 | - * |
|
96 | - * @access public |
|
97 | - * @return void |
|
98 | - * @throws EE_Error |
|
99 | - */ |
|
100 | - public static function set_hooks_admin() |
|
101 | - { |
|
102 | - EED_Single_Page_Checkout::set_definitions(); |
|
103 | - if (! (defined('DOING_AJAX') && DOING_AJAX)) { |
|
104 | - return; |
|
105 | - } |
|
106 | - // going to start an output buffer in case anything gets accidentally output |
|
107 | - // that might disrupt our JSON response |
|
108 | - ob_start(); |
|
109 | - EED_Single_Page_Checkout::load_request_handler(); |
|
110 | - EED_Single_Page_Checkout::load_reg_steps(); |
|
111 | - // set ajax hooks |
|
112 | - add_action('wp_ajax_process_reg_step', array('EED_Single_Page_Checkout', 'process_reg_step')); |
|
113 | - add_action('wp_ajax_nopriv_process_reg_step', array('EED_Single_Page_Checkout', 'process_reg_step')); |
|
114 | - add_action('wp_ajax_display_spco_reg_step', array('EED_Single_Page_Checkout', 'display_reg_step')); |
|
115 | - add_action('wp_ajax_nopriv_display_spco_reg_step', array('EED_Single_Page_Checkout', 'display_reg_step')); |
|
116 | - add_action('wp_ajax_update_reg_step', array('EED_Single_Page_Checkout', 'update_reg_step')); |
|
117 | - add_action('wp_ajax_nopriv_update_reg_step', array('EED_Single_Page_Checkout', 'update_reg_step')); |
|
118 | - } |
|
119 | - |
|
120 | - |
|
121 | - /** |
|
122 | - * process ajax request |
|
123 | - * |
|
124 | - * @param string $ajax_action |
|
125 | - * @throws EE_Error |
|
126 | - */ |
|
127 | - public static function process_ajax_request($ajax_action) |
|
128 | - { |
|
129 | - EE_Registry::instance()->REQ->set('action', $ajax_action); |
|
130 | - EED_Single_Page_Checkout::instance()->_initialize(); |
|
131 | - } |
|
132 | - |
|
133 | - |
|
134 | - /** |
|
135 | - * ajax display registration step |
|
136 | - * |
|
137 | - * @throws EE_Error |
|
138 | - */ |
|
139 | - public static function display_reg_step() |
|
140 | - { |
|
141 | - EED_Single_Page_Checkout::process_ajax_request('display_spco_reg_step'); |
|
142 | - } |
|
143 | - |
|
144 | - |
|
145 | - /** |
|
146 | - * ajax process registration step |
|
147 | - * |
|
148 | - * @throws EE_Error |
|
149 | - */ |
|
150 | - public static function process_reg_step() |
|
151 | - { |
|
152 | - EED_Single_Page_Checkout::process_ajax_request('process_reg_step'); |
|
153 | - } |
|
154 | - |
|
155 | - |
|
156 | - /** |
|
157 | - * ajax process registration step |
|
158 | - * |
|
159 | - * @throws EE_Error |
|
160 | - */ |
|
161 | - public static function update_reg_step() |
|
162 | - { |
|
163 | - EED_Single_Page_Checkout::process_ajax_request('update_reg_step'); |
|
164 | - } |
|
165 | - |
|
166 | - |
|
167 | - /** |
|
168 | - * update_checkout |
|
169 | - * |
|
170 | - * @access public |
|
171 | - * @return void |
|
172 | - * @throws EE_Error |
|
173 | - */ |
|
174 | - public static function update_checkout() |
|
175 | - { |
|
176 | - EED_Single_Page_Checkout::process_ajax_request('update_checkout'); |
|
177 | - } |
|
178 | - |
|
179 | - |
|
180 | - /** |
|
181 | - * load_request_handler |
|
182 | - * |
|
183 | - * @access public |
|
184 | - * @return void |
|
185 | - */ |
|
186 | - public static function load_request_handler() |
|
187 | - { |
|
188 | - // load core Request_Handler class |
|
189 | - if (EE_Registry::instance()->REQ !== null) { |
|
190 | - EE_Registry::instance()->load_core('Request_Handler'); |
|
191 | - } |
|
192 | - } |
|
193 | - |
|
194 | - |
|
195 | - /** |
|
196 | - * set_definitions |
|
197 | - * |
|
198 | - * @access public |
|
199 | - * @return void |
|
200 | - * @throws EE_Error |
|
201 | - */ |
|
202 | - public static function set_definitions() |
|
203 | - { |
|
204 | - if (defined('SPCO_BASE_PATH')) { |
|
205 | - return; |
|
206 | - } |
|
207 | - define( |
|
208 | - 'SPCO_BASE_PATH', |
|
209 | - rtrim(str_replace(array('\\', '/'), DS, plugin_dir_path(__FILE__)), DS) . DS |
|
210 | - ); |
|
211 | - define('SPCO_CSS_URL', plugin_dir_url(__FILE__) . 'css' . DS); |
|
212 | - define('SPCO_IMG_URL', plugin_dir_url(__FILE__) . 'img' . DS); |
|
213 | - define('SPCO_JS_URL', plugin_dir_url(__FILE__) . 'js' . DS); |
|
214 | - define('SPCO_INC_PATH', SPCO_BASE_PATH . 'inc' . DS); |
|
215 | - define('SPCO_REG_STEPS_PATH', SPCO_BASE_PATH . 'reg_steps' . DS); |
|
216 | - define('SPCO_TEMPLATES_PATH', SPCO_BASE_PATH . 'templates' . DS); |
|
217 | - EEH_Autoloader::register_autoloaders_for_each_file_in_folder(SPCO_BASE_PATH, true); |
|
218 | - EE_Registry::$i18n_js_strings['registration_expiration_notice'] = EED_Single_Page_Checkout::getRegistrationExpirationNotice( |
|
219 | - ); |
|
220 | - } |
|
221 | - |
|
222 | - |
|
223 | - /** |
|
224 | - * load_reg_steps |
|
225 | - * loads and instantiates each reg step based on the EE_Registry::instance()->CFG->registration->reg_steps array |
|
226 | - * |
|
227 | - * @access private |
|
228 | - * @throws EE_Error |
|
229 | - */ |
|
230 | - public static function load_reg_steps() |
|
231 | - { |
|
232 | - static $reg_steps_loaded = false; |
|
233 | - if ($reg_steps_loaded) { |
|
234 | - return; |
|
235 | - } |
|
236 | - // filter list of reg_steps |
|
237 | - $reg_steps_to_load = (array) apply_filters( |
|
238 | - 'AHEE__SPCO__load_reg_steps__reg_steps_to_load', |
|
239 | - EED_Single_Page_Checkout::get_reg_steps() |
|
240 | - ); |
|
241 | - // sort by key (order) |
|
242 | - ksort($reg_steps_to_load); |
|
243 | - // loop through folders |
|
244 | - foreach ($reg_steps_to_load as $order => $reg_step) { |
|
245 | - // we need a |
|
246 | - if (isset($reg_step['file_path'], $reg_step['class_name'], $reg_step['slug'])) { |
|
247 | - // copy over to the reg_steps_array |
|
248 | - EED_Single_Page_Checkout::$_reg_steps_array[ $order ] = $reg_step; |
|
249 | - // register custom key route for each reg step |
|
250 | - // ie: step=>"slug" - this is the entire reason we load the reg steps array now |
|
251 | - EE_Config::register_route( |
|
252 | - $reg_step['slug'], |
|
253 | - 'EED_Single_Page_Checkout', |
|
254 | - 'run', |
|
255 | - 'step' |
|
256 | - ); |
|
257 | - // add AJAX or other hooks |
|
258 | - if (isset($reg_step['has_hooks']) && $reg_step['has_hooks']) { |
|
259 | - // setup autoloaders if necessary |
|
260 | - if (! class_exists($reg_step['class_name'])) { |
|
261 | - EEH_Autoloader::register_autoloaders_for_each_file_in_folder( |
|
262 | - $reg_step['file_path'], |
|
263 | - true |
|
264 | - ); |
|
265 | - } |
|
266 | - if (is_callable($reg_step['class_name'], 'set_hooks')) { |
|
267 | - call_user_func(array($reg_step['class_name'], 'set_hooks')); |
|
268 | - } |
|
269 | - } |
|
270 | - } |
|
271 | - } |
|
272 | - $reg_steps_loaded = true; |
|
273 | - } |
|
274 | - |
|
275 | - |
|
276 | - /** |
|
277 | - * get_reg_steps |
|
278 | - * |
|
279 | - * @access public |
|
280 | - * @return array |
|
281 | - */ |
|
282 | - public static function get_reg_steps() |
|
283 | - { |
|
284 | - $reg_steps = EE_Registry::instance()->CFG->registration->reg_steps; |
|
285 | - if (empty($reg_steps)) { |
|
286 | - $reg_steps = array( |
|
287 | - 10 => array( |
|
288 | - 'file_path' => SPCO_REG_STEPS_PATH . 'attendee_information', |
|
289 | - 'class_name' => 'EE_SPCO_Reg_Step_Attendee_Information', |
|
290 | - 'slug' => 'attendee_information', |
|
291 | - 'has_hooks' => false, |
|
292 | - ), |
|
293 | - 30 => array( |
|
294 | - 'file_path' => SPCO_REG_STEPS_PATH . 'payment_options', |
|
295 | - 'class_name' => 'EE_SPCO_Reg_Step_Payment_Options', |
|
296 | - 'slug' => 'payment_options', |
|
297 | - 'has_hooks' => true, |
|
298 | - ), |
|
299 | - 999 => array( |
|
300 | - 'file_path' => SPCO_REG_STEPS_PATH . 'finalize_registration', |
|
301 | - 'class_name' => 'EE_SPCO_Reg_Step_Finalize_Registration', |
|
302 | - 'slug' => 'finalize_registration', |
|
303 | - 'has_hooks' => false, |
|
304 | - ), |
|
305 | - ); |
|
306 | - } |
|
307 | - return $reg_steps; |
|
308 | - } |
|
309 | - |
|
310 | - |
|
311 | - /** |
|
312 | - * registration_checkout_for_admin |
|
313 | - * |
|
314 | - * @access public |
|
315 | - * @return string |
|
316 | - * @throws EE_Error |
|
317 | - */ |
|
318 | - public static function registration_checkout_for_admin() |
|
319 | - { |
|
320 | - EED_Single_Page_Checkout::load_request_handler(); |
|
321 | - EE_Registry::instance()->REQ->set('step', 'attendee_information'); |
|
322 | - EE_Registry::instance()->REQ->set('action', 'display_spco_reg_step'); |
|
323 | - EE_Registry::instance()->REQ->set('process_form_submission', false); |
|
324 | - EED_Single_Page_Checkout::instance()->_initialize(); |
|
325 | - EED_Single_Page_Checkout::instance()->_display_spco_reg_form(); |
|
326 | - return EE_Registry::instance()->REQ->get_output(); |
|
327 | - } |
|
328 | - |
|
329 | - |
|
330 | - /** |
|
331 | - * process_registration_from_admin |
|
332 | - * |
|
333 | - * @access public |
|
334 | - * @return \EE_Transaction |
|
335 | - * @throws EE_Error |
|
336 | - */ |
|
337 | - public static function process_registration_from_admin() |
|
338 | - { |
|
339 | - EED_Single_Page_Checkout::load_request_handler(); |
|
340 | - EE_Registry::instance()->REQ->set('step', 'attendee_information'); |
|
341 | - EE_Registry::instance()->REQ->set('action', 'process_reg_step'); |
|
342 | - EE_Registry::instance()->REQ->set('process_form_submission', true); |
|
343 | - EED_Single_Page_Checkout::instance()->_initialize(); |
|
344 | - if (EED_Single_Page_Checkout::instance()->checkout->current_step->completed()) { |
|
345 | - $final_reg_step = end(EED_Single_Page_Checkout::instance()->checkout->reg_steps); |
|
346 | - if ($final_reg_step instanceof EE_SPCO_Reg_Step_Finalize_Registration) { |
|
347 | - EED_Single_Page_Checkout::instance()->checkout->set_reg_step_initiated($final_reg_step); |
|
348 | - if ($final_reg_step->process_reg_step()) { |
|
349 | - $final_reg_step->set_completed(); |
|
350 | - EED_Single_Page_Checkout::instance()->checkout->update_txn_reg_steps_array(); |
|
351 | - return EED_Single_Page_Checkout::instance()->checkout->transaction; |
|
352 | - } |
|
353 | - } |
|
354 | - } |
|
355 | - return null; |
|
356 | - } |
|
357 | - |
|
358 | - |
|
359 | - /** |
|
360 | - * run |
|
361 | - * |
|
362 | - * @access public |
|
363 | - * @param WP_Query $WP_Query |
|
364 | - * @return void |
|
365 | - * @throws EE_Error |
|
366 | - */ |
|
367 | - public function run($WP_Query) |
|
368 | - { |
|
369 | - if ($WP_Query instanceof WP_Query |
|
370 | - && $WP_Query->is_main_query() |
|
371 | - && apply_filters('FHEE__EED_Single_Page_Checkout__run', true) |
|
372 | - && $this->_is_reg_checkout() |
|
373 | - ) { |
|
374 | - $this->_initialize(); |
|
375 | - } |
|
376 | - } |
|
377 | - |
|
378 | - |
|
379 | - /** |
|
380 | - * determines whether current url matches reg page url |
|
381 | - * |
|
382 | - * @return bool |
|
383 | - */ |
|
384 | - protected function _is_reg_checkout() |
|
385 | - { |
|
386 | - // get current permalink for reg page without any extra query args |
|
387 | - $reg_page_url = \get_permalink(EE_Config::instance()->core->reg_page_id); |
|
388 | - // get request URI for current request, but without the scheme or host |
|
389 | - $current_request_uri = \EEH_URL::filter_input_server_url('REQUEST_URI'); |
|
390 | - $current_request_uri = html_entity_decode($current_request_uri); |
|
391 | - // get array of query args from the current request URI |
|
392 | - $query_args = \EEH_URL::get_query_string($current_request_uri); |
|
393 | - // grab page id if it is set |
|
394 | - $page_id = isset($query_args['page_id']) ? absint($query_args['page_id']) : 0; |
|
395 | - // and remove the page id from the query args (we will re-add it later) |
|
396 | - unset($query_args['page_id']); |
|
397 | - // now strip all query args from current request URI |
|
398 | - $current_request_uri = remove_query_arg(array_keys($query_args), $current_request_uri); |
|
399 | - // and re-add the page id if it was set |
|
400 | - if ($page_id) { |
|
401 | - $current_request_uri = add_query_arg('page_id', $page_id, $current_request_uri); |
|
402 | - } |
|
403 | - // remove slashes and ? |
|
404 | - $current_request_uri = trim($current_request_uri, '?/'); |
|
405 | - // is current request URI part of the known full reg page URL ? |
|
406 | - return ! empty($current_request_uri) && strpos($reg_page_url, $current_request_uri) !== false; |
|
407 | - } |
|
408 | - |
|
409 | - |
|
410 | - /** |
|
411 | - * @param WP_Query $wp_query |
|
412 | - * @return void |
|
413 | - * @throws EE_Error |
|
414 | - */ |
|
415 | - public static function init($wp_query) |
|
416 | - { |
|
417 | - EED_Single_Page_Checkout::instance()->run($wp_query); |
|
418 | - } |
|
419 | - |
|
420 | - |
|
421 | - /** |
|
422 | - * _initialize - initial module setup |
|
423 | - * |
|
424 | - * @access private |
|
425 | - * @throws EE_Error |
|
426 | - * @return void |
|
427 | - */ |
|
428 | - private function _initialize() |
|
429 | - { |
|
430 | - // ensure SPCO doesn't run twice |
|
431 | - if (EED_Single_Page_Checkout::$_initialized) { |
|
432 | - return; |
|
433 | - } |
|
434 | - try { |
|
435 | - EED_Single_Page_Checkout::load_reg_steps(); |
|
436 | - $this->_verify_session(); |
|
437 | - // setup the EE_Checkout object |
|
438 | - $this->checkout = $this->_initialize_checkout(); |
|
439 | - // filter checkout |
|
440 | - $this->checkout = apply_filters('FHEE__EED_Single_Page_Checkout___initialize__checkout', $this->checkout); |
|
441 | - // get the $_GET |
|
442 | - $this->_get_request_vars(); |
|
443 | - if ($this->_block_bots()) { |
|
444 | - return; |
|
445 | - } |
|
446 | - // filter continue_reg |
|
447 | - $this->checkout->continue_reg = apply_filters( |
|
448 | - 'FHEE__EED_Single_Page_Checkout__init___continue_reg', |
|
449 | - true, |
|
450 | - $this->checkout |
|
451 | - ); |
|
452 | - // load the reg steps array |
|
453 | - if (! $this->_load_and_instantiate_reg_steps()) { |
|
454 | - EED_Single_Page_Checkout::$_initialized = true; |
|
455 | - return; |
|
456 | - } |
|
457 | - // set the current step |
|
458 | - $this->checkout->set_current_step($this->checkout->step); |
|
459 | - // and the next step |
|
460 | - $this->checkout->set_next_step(); |
|
461 | - // verify that everything has been setup correctly |
|
462 | - if (! ($this->_verify_transaction_and_get_registrations() && $this->_final_verifications())) { |
|
463 | - EED_Single_Page_Checkout::$_initialized = true; |
|
464 | - return; |
|
465 | - } |
|
466 | - // lock the transaction |
|
467 | - $this->checkout->transaction->lock(); |
|
468 | - // make sure all of our cached objects are added to their respective model entity mappers |
|
469 | - $this->checkout->refresh_all_entities(); |
|
470 | - // set amount owing |
|
471 | - $this->checkout->amount_owing = $this->checkout->transaction->remaining(); |
|
472 | - // initialize each reg step, which gives them the chance to potentially alter the process |
|
473 | - $this->_initialize_reg_steps(); |
|
474 | - // DEBUG LOG |
|
475 | - // $this->checkout->log( __CLASS__, __FUNCTION__, __LINE__ ); |
|
476 | - // get reg form |
|
477 | - if (! $this->_check_form_submission()) { |
|
478 | - EED_Single_Page_Checkout::$_initialized = true; |
|
479 | - return; |
|
480 | - } |
|
481 | - // checkout the action!!! |
|
482 | - $this->_process_form_action(); |
|
483 | - // add some style and make it dance |
|
484 | - $this->add_styles_and_scripts(); |
|
485 | - // kk... SPCO has successfully run |
|
486 | - EED_Single_Page_Checkout::$_initialized = true; |
|
487 | - // set no cache headers and constants |
|
488 | - EE_System::do_not_cache(); |
|
489 | - // add anchor |
|
490 | - add_action('loop_start', array($this, 'set_checkout_anchor'), 1); |
|
491 | - // remove transaction lock |
|
492 | - add_action('shutdown', array($this, 'unlock_transaction'), 1); |
|
493 | - } catch (Exception $e) { |
|
494 | - EE_Error::add_error($e->getMessage(), __FILE__, __FUNCTION__, __LINE__); |
|
495 | - } |
|
496 | - } |
|
497 | - |
|
498 | - |
|
499 | - /** |
|
500 | - * _verify_session |
|
501 | - * checks that the session is valid and not expired |
|
502 | - * |
|
503 | - * @access private |
|
504 | - * @throws EE_Error |
|
505 | - */ |
|
506 | - private function _verify_session() |
|
507 | - { |
|
508 | - if (! EE_Registry::instance()->SSN instanceof EE_Session) { |
|
509 | - throw new EE_Error(esc_html__('The EE_Session class could not be loaded.', 'event_espresso')); |
|
510 | - } |
|
511 | - $clear_session_requested = filter_var( |
|
512 | - EE_Registry::instance()->REQ->get('clear_session', false), |
|
513 | - FILTER_VALIDATE_BOOLEAN |
|
514 | - ); |
|
515 | - // is session still valid ? |
|
516 | - if ($clear_session_requested |
|
517 | - || (EE_Registry::instance()->SSN->expired() |
|
518 | - && EE_Registry::instance()->REQ->get('e_reg_url_link', '') === '' |
|
519 | - ) |
|
520 | - ) { |
|
521 | - $this->checkout = new EE_Checkout(); |
|
522 | - EE_Registry::instance()->SSN->clear_session(__CLASS__, __FUNCTION__); |
|
523 | - // EE_Registry::instance()->SSN->reset_cart(); |
|
524 | - // EE_Registry::instance()->SSN->reset_checkout(); |
|
525 | - // EE_Registry::instance()->SSN->reset_transaction(); |
|
526 | - if (! $clear_session_requested) { |
|
527 | - EE_Error::add_attention( |
|
528 | - EE_Registry::$i18n_js_strings['registration_expiration_notice'], |
|
529 | - __FILE__, |
|
530 | - __FUNCTION__, |
|
531 | - __LINE__ |
|
532 | - ); |
|
533 | - } |
|
534 | - // EE_Registry::instance()->SSN->reset_expired(); |
|
535 | - } |
|
536 | - } |
|
537 | - |
|
538 | - |
|
539 | - /** |
|
540 | - * _initialize_checkout |
|
541 | - * loads and instantiates EE_Checkout |
|
542 | - * |
|
543 | - * @access private |
|
544 | - * @throws EE_Error |
|
545 | - * @return EE_Checkout |
|
546 | - */ |
|
547 | - private function _initialize_checkout() |
|
548 | - { |
|
549 | - // look in session for existing checkout |
|
550 | - /** @type EE_Checkout $checkout */ |
|
551 | - $checkout = EE_Registry::instance()->SSN->checkout(); |
|
552 | - // verify |
|
553 | - if (! $checkout instanceof EE_Checkout) { |
|
554 | - // instantiate EE_Checkout object for handling the properties of the current checkout process |
|
555 | - $checkout = EE_Registry::instance()->load_file( |
|
556 | - SPCO_INC_PATH, |
|
557 | - 'EE_Checkout', |
|
558 | - 'class', |
|
559 | - array(), |
|
560 | - false |
|
561 | - ); |
|
562 | - } else { |
|
563 | - if ($checkout->current_step->is_final_step() && $checkout->exit_spco() === true) { |
|
564 | - $this->unlock_transaction(); |
|
565 | - wp_safe_redirect($checkout->redirect_url); |
|
566 | - exit(); |
|
567 | - } |
|
568 | - } |
|
569 | - $checkout = apply_filters('FHEE__EED_Single_Page_Checkout___initialize_checkout__checkout', $checkout); |
|
570 | - // verify again |
|
571 | - if (! $checkout instanceof EE_Checkout) { |
|
572 | - throw new EE_Error(esc_html__('The EE_Checkout class could not be loaded.', 'event_espresso')); |
|
573 | - } |
|
574 | - // reset anything that needs a clean slate for each request |
|
575 | - $checkout->reset_for_current_request(); |
|
576 | - return $checkout; |
|
577 | - } |
|
578 | - |
|
579 | - |
|
580 | - /** |
|
581 | - * _get_request_vars |
|
582 | - * |
|
583 | - * @access private |
|
584 | - * @return void |
|
585 | - * @throws EE_Error |
|
586 | - */ |
|
587 | - private function _get_request_vars() |
|
588 | - { |
|
589 | - // load classes |
|
590 | - EED_Single_Page_Checkout::load_request_handler(); |
|
591 | - // make sure this request is marked as belonging to EE |
|
592 | - EE_Registry::instance()->REQ->set_espresso_page(true); |
|
593 | - // which step is being requested ? |
|
594 | - $this->checkout->step = EE_Registry::instance()->REQ->get('step', $this->_get_first_step()); |
|
595 | - // which step is being edited ? |
|
596 | - $this->checkout->edit_step = EE_Registry::instance()->REQ->get('edit_step', ''); |
|
597 | - // and what we're doing on the current step |
|
598 | - $this->checkout->action = EE_Registry::instance()->REQ->get('action', 'display_spco_reg_step'); |
|
599 | - // timestamp |
|
600 | - $this->checkout->uts = EE_Registry::instance()->REQ->get('uts', 0); |
|
601 | - // returning to edit ? |
|
602 | - $this->checkout->reg_url_link = EE_Registry::instance()->REQ->get('e_reg_url_link', ''); |
|
603 | - // add reg url link to registration query params |
|
604 | - if ($this->checkout->reg_url_link && strpos($this->checkout->reg_url_link, '1-') !== 0) { |
|
605 | - $this->checkout->reg_cache_where_params[0]['REG_url_link'] = $this->checkout->reg_url_link; |
|
606 | - } |
|
607 | - // or some other kind of revisit ? |
|
608 | - $this->checkout->revisit = filter_var( |
|
609 | - EE_Registry::instance()->REQ->get('revisit', false), |
|
610 | - FILTER_VALIDATE_BOOLEAN |
|
611 | - ); |
|
612 | - // and whether or not to generate a reg form for this request |
|
613 | - $this->checkout->generate_reg_form = filter_var( |
|
614 | - EE_Registry::instance()->REQ->get('generate_reg_form', true), |
|
615 | - FILTER_VALIDATE_BOOLEAN |
|
616 | - ); |
|
617 | - // and whether or not to process a reg form submission for this request |
|
618 | - $this->checkout->process_form_submission = filter_var( |
|
619 | - EE_Registry::instance()->REQ->get( |
|
620 | - 'process_form_submission', |
|
621 | - $this->checkout->action === 'process_reg_step' |
|
622 | - ), |
|
623 | - FILTER_VALIDATE_BOOLEAN |
|
624 | - ); |
|
625 | - $this->checkout->process_form_submission = filter_var( |
|
626 | - $this->checkout->action !== 'display_spco_reg_step' |
|
627 | - ? $this->checkout->process_form_submission |
|
628 | - : false, |
|
629 | - FILTER_VALIDATE_BOOLEAN |
|
630 | - ); |
|
631 | - // $this->_display_request_vars(); |
|
632 | - } |
|
633 | - |
|
634 | - |
|
635 | - /** |
|
636 | - * _display_request_vars |
|
637 | - * |
|
638 | - * @access protected |
|
639 | - * @return void |
|
640 | - */ |
|
641 | - protected function _display_request_vars() |
|
642 | - { |
|
643 | - if (! WP_DEBUG) { |
|
644 | - return; |
|
645 | - } |
|
646 | - EEH_Debug_Tools::printr($_REQUEST, '$_REQUEST', __FILE__, __LINE__); |
|
647 | - EEH_Debug_Tools::printr($this->checkout->step, '$this->checkout->step', __FILE__, __LINE__); |
|
648 | - EEH_Debug_Tools::printr($this->checkout->edit_step, '$this->checkout->edit_step', __FILE__, __LINE__); |
|
649 | - EEH_Debug_Tools::printr($this->checkout->action, '$this->checkout->action', __FILE__, __LINE__); |
|
650 | - EEH_Debug_Tools::printr($this->checkout->reg_url_link, '$this->checkout->reg_url_link', __FILE__, __LINE__); |
|
651 | - EEH_Debug_Tools::printr($this->checkout->revisit, '$this->checkout->revisit', __FILE__, __LINE__); |
|
652 | - EEH_Debug_Tools::printr( |
|
653 | - $this->checkout->generate_reg_form, |
|
654 | - '$this->checkout->generate_reg_form', |
|
655 | - __FILE__, |
|
656 | - __LINE__ |
|
657 | - ); |
|
658 | - EEH_Debug_Tools::printr( |
|
659 | - $this->checkout->process_form_submission, |
|
660 | - '$this->checkout->process_form_submission', |
|
661 | - __FILE__, |
|
662 | - __LINE__ |
|
663 | - ); |
|
664 | - } |
|
665 | - |
|
666 | - |
|
667 | - /** |
|
668 | - * _block_bots |
|
669 | - * checks that the incoming request has either of the following set: |
|
670 | - * a uts (unix timestamp) which indicates that the request was redirected from the Ticket Selector |
|
671 | - * a REG URL Link, which indicates that the request is a return visit to SPCO for a valid TXN |
|
672 | - * so if you're not coming from the Ticket Selector nor returning for a valid IP... |
|
673 | - * then where you coming from man? |
|
674 | - * |
|
675 | - * @return boolean |
|
676 | - */ |
|
677 | - private function _block_bots() |
|
678 | - { |
|
679 | - $invalid_checkout_access = EED_Invalid_Checkout_Access::getInvalidCheckoutAccess(); |
|
680 | - if ($invalid_checkout_access->checkoutAccessIsInvalid($this->checkout)) { |
|
681 | - return true; |
|
682 | - } |
|
683 | - return false; |
|
684 | - } |
|
685 | - |
|
686 | - |
|
687 | - /** |
|
688 | - * _get_first_step |
|
689 | - * gets slug for first step in $_reg_steps_array |
|
690 | - * |
|
691 | - * @access private |
|
692 | - * @throws EE_Error |
|
693 | - * @return string |
|
694 | - */ |
|
695 | - private function _get_first_step() |
|
696 | - { |
|
697 | - $first_step = reset(EED_Single_Page_Checkout::$_reg_steps_array); |
|
698 | - return isset($first_step['slug']) ? $first_step['slug'] : 'attendee_information'; |
|
699 | - } |
|
700 | - |
|
701 | - |
|
702 | - /** |
|
703 | - * instantiates each reg step based on the loaded reg_steps array |
|
704 | - * |
|
705 | - * @return bool |
|
706 | - * @throws EE_Error |
|
707 | - * @throws InvalidArgumentException |
|
708 | - * @throws InvalidDataTypeException |
|
709 | - * @throws InvalidInterfaceException |
|
710 | - */ |
|
711 | - private function _load_and_instantiate_reg_steps() |
|
712 | - { |
|
713 | - do_action('AHEE__Single_Page_Checkout___load_and_instantiate_reg_steps__start', $this->checkout); |
|
714 | - // have reg_steps already been instantiated ? |
|
715 | - if (empty($this->checkout->reg_steps) |
|
716 | - || apply_filters('FHEE__Single_Page_Checkout__load_reg_steps__reload_reg_steps', false, $this->checkout) |
|
717 | - ) { |
|
718 | - // if not, then loop through raw reg steps array |
|
719 | - foreach (EED_Single_Page_Checkout::$_reg_steps_array as $order => $reg_step) { |
|
720 | - if (! $this->_load_and_instantiate_reg_step($reg_step, $order)) { |
|
721 | - return false; |
|
722 | - } |
|
723 | - } |
|
724 | - if (isset($this->checkout->reg_steps['registration_confirmation'])) { |
|
725 | - // skip the registration_confirmation page ? |
|
726 | - if (EE_Registry::instance()->CFG->registration->skip_reg_confirmation) { |
|
727 | - // just remove it from the reg steps array |
|
728 | - $this->checkout->remove_reg_step('registration_confirmation', false); |
|
729 | - } elseif (EE_Registry::instance()->CFG->registration->reg_confirmation_last |
|
730 | - ) { |
|
731 | - // set the order to something big like 100 |
|
732 | - $this->checkout->set_reg_step_order('registration_confirmation', 100); |
|
733 | - } |
|
734 | - } |
|
735 | - // filter the array for good luck |
|
736 | - $this->checkout->reg_steps = apply_filters( |
|
737 | - 'FHEE__Single_Page_Checkout__load_reg_steps__reg_steps', |
|
738 | - $this->checkout->reg_steps |
|
739 | - ); |
|
740 | - // finally re-sort based on the reg step class order properties |
|
741 | - $this->checkout->sort_reg_steps(); |
|
742 | - } else { |
|
743 | - foreach ($this->checkout->reg_steps as $reg_step) { |
|
744 | - // set all current step stati to FALSE |
|
745 | - $reg_step->set_is_current_step(false); |
|
746 | - } |
|
747 | - } |
|
748 | - if (empty($this->checkout->reg_steps)) { |
|
749 | - EE_Error::add_error( |
|
750 | - esc_html__('No Reg Steps were loaded..', 'event_espresso'), |
|
751 | - __FILE__, |
|
752 | - __FUNCTION__, |
|
753 | - __LINE__ |
|
754 | - ); |
|
755 | - return false; |
|
756 | - } |
|
757 | - // make reg step details available to JS |
|
758 | - $this->checkout->set_reg_step_JSON_info(); |
|
759 | - return true; |
|
760 | - } |
|
761 | - |
|
762 | - |
|
763 | - /** |
|
764 | - * _load_and_instantiate_reg_step |
|
765 | - * |
|
766 | - * @access private |
|
767 | - * @param array $reg_step |
|
768 | - * @param int $order |
|
769 | - * @return bool |
|
770 | - */ |
|
771 | - private function _load_and_instantiate_reg_step($reg_step = array(), $order = 0) |
|
772 | - { |
|
773 | - // we need a file_path, class_name, and slug to add a reg step |
|
774 | - if (isset($reg_step['file_path'], $reg_step['class_name'], $reg_step['slug'])) { |
|
775 | - // if editing a specific step, but this is NOT that step... (and it's not the 'finalize_registration' step) |
|
776 | - if ($this->checkout->reg_url_link |
|
777 | - && $this->checkout->step !== $reg_step['slug'] |
|
778 | - && $reg_step['slug'] !== 'finalize_registration' |
|
779 | - // normally at this point we would NOT load the reg step, but this filter can change that |
|
780 | - && apply_filters( |
|
781 | - 'FHEE__Single_Page_Checkout___load_and_instantiate_reg_step__bypass_reg_step', |
|
782 | - true, |
|
783 | - $reg_step, |
|
784 | - $this->checkout |
|
785 | - ) |
|
786 | - ) { |
|
787 | - return true; |
|
788 | - } |
|
789 | - // instantiate step class using file path and class name |
|
790 | - $reg_step_obj = EE_Registry::instance()->load_file( |
|
791 | - $reg_step['file_path'], |
|
792 | - $reg_step['class_name'], |
|
793 | - 'class', |
|
794 | - $this->checkout, |
|
795 | - false |
|
796 | - ); |
|
797 | - // did we gets the goods ? |
|
798 | - if ($reg_step_obj instanceof EE_SPCO_Reg_Step) { |
|
799 | - // set reg step order based on config |
|
800 | - $reg_step_obj->set_order($order); |
|
801 | - // add instantiated reg step object to the master reg steps array |
|
802 | - $this->checkout->add_reg_step($reg_step_obj); |
|
803 | - } else { |
|
804 | - EE_Error::add_error( |
|
805 | - esc_html__('The current step could not be set.', 'event_espresso'), |
|
806 | - __FILE__, |
|
807 | - __FUNCTION__, |
|
808 | - __LINE__ |
|
809 | - ); |
|
810 | - return false; |
|
811 | - } |
|
812 | - } else { |
|
813 | - if (WP_DEBUG) { |
|
814 | - EE_Error::add_error( |
|
815 | - sprintf( |
|
816 | - esc_html__( |
|
817 | - 'A registration step could not be loaded. One or more of the following data points is invalid:%4$s%5$sFile Path: %1$s%6$s%5$sClass Name: %2$s%6$s%5$sSlug: %3$s%6$s%7$s', |
|
818 | - 'event_espresso' |
|
819 | - ), |
|
820 | - isset($reg_step['file_path']) ? $reg_step['file_path'] : '', |
|
821 | - isset($reg_step['class_name']) ? $reg_step['class_name'] : '', |
|
822 | - isset($reg_step['slug']) ? $reg_step['slug'] : '', |
|
823 | - '<ul>', |
|
824 | - '<li>', |
|
825 | - '</li>', |
|
826 | - '</ul>' |
|
827 | - ), |
|
828 | - __FILE__, |
|
829 | - __FUNCTION__, |
|
830 | - __LINE__ |
|
831 | - ); |
|
832 | - } |
|
833 | - return false; |
|
834 | - } |
|
835 | - return true; |
|
836 | - } |
|
837 | - |
|
838 | - |
|
839 | - /** |
|
840 | - * _verify_transaction_and_get_registrations |
|
841 | - * |
|
842 | - * @access private |
|
843 | - * @return bool |
|
844 | - * @throws InvalidDataTypeException |
|
845 | - * @throws InvalidEntityException |
|
846 | - * @throws EE_Error |
|
847 | - */ |
|
848 | - private function _verify_transaction_and_get_registrations() |
|
849 | - { |
|
850 | - // was there already a valid transaction in the checkout from the session ? |
|
851 | - if (! $this->checkout->transaction instanceof EE_Transaction) { |
|
852 | - // get transaction from db or session |
|
853 | - $this->checkout->transaction = $this->checkout->reg_url_link && ! is_admin() |
|
854 | - ? $this->_get_transaction_and_cart_for_previous_visit() |
|
855 | - : $this->_get_cart_for_current_session_and_setup_new_transaction(); |
|
856 | - if (! $this->checkout->transaction instanceof EE_Transaction) { |
|
857 | - EE_Error::add_error( |
|
858 | - esc_html__( |
|
859 | - 'Your Registration and Transaction information could not be retrieved from the db.', |
|
860 | - 'event_espresso' |
|
861 | - ), |
|
862 | - __FILE__, |
|
863 | - __FUNCTION__, |
|
864 | - __LINE__ |
|
865 | - ); |
|
866 | - $this->checkout->transaction = EE_Transaction::new_instance(); |
|
867 | - // add some style and make it dance |
|
868 | - $this->add_styles_and_scripts(); |
|
869 | - EED_Single_Page_Checkout::$_initialized = true; |
|
870 | - return false; |
|
871 | - } |
|
872 | - // and the registrations for the transaction |
|
873 | - $this->_get_registrations($this->checkout->transaction); |
|
874 | - } |
|
875 | - return true; |
|
876 | - } |
|
877 | - |
|
878 | - |
|
879 | - /** |
|
880 | - * _get_transaction_and_cart_for_previous_visit |
|
881 | - * |
|
882 | - * @access private |
|
883 | - * @return mixed EE_Transaction|NULL |
|
884 | - */ |
|
885 | - private function _get_transaction_and_cart_for_previous_visit() |
|
886 | - { |
|
887 | - /** @var $TXN_model EEM_Transaction */ |
|
888 | - $TXN_model = EE_Registry::instance()->load_model('Transaction'); |
|
889 | - // because the reg_url_link is present in the request, |
|
890 | - // this is a return visit to SPCO, so we'll get the transaction data from the db |
|
891 | - $transaction = $TXN_model->get_transaction_from_reg_url_link($this->checkout->reg_url_link); |
|
892 | - // verify transaction |
|
893 | - if ($transaction instanceof EE_Transaction) { |
|
894 | - // and get the cart that was used for that transaction |
|
895 | - $this->checkout->cart = $this->_get_cart_for_transaction($transaction); |
|
896 | - return $transaction; |
|
897 | - } |
|
898 | - EE_Error::add_error( |
|
899 | - esc_html__('Your Registration and Transaction information could not be retrieved from the db.', 'event_espresso'), |
|
900 | - __FILE__, |
|
901 | - __FUNCTION__, |
|
902 | - __LINE__ |
|
903 | - ); |
|
904 | - return null; |
|
905 | - } |
|
906 | - |
|
907 | - |
|
908 | - /** |
|
909 | - * _get_cart_for_transaction |
|
910 | - * |
|
911 | - * @access private |
|
912 | - * @param EE_Transaction $transaction |
|
913 | - * @return EE_Cart |
|
914 | - */ |
|
915 | - private function _get_cart_for_transaction($transaction) |
|
916 | - { |
|
917 | - return $this->checkout->get_cart_for_transaction($transaction); |
|
918 | - } |
|
919 | - |
|
920 | - |
|
921 | - /** |
|
922 | - * get_cart_for_transaction |
|
923 | - * |
|
924 | - * @access public |
|
925 | - * @param EE_Transaction $transaction |
|
926 | - * @return EE_Cart |
|
927 | - */ |
|
928 | - public function get_cart_for_transaction(EE_Transaction $transaction) |
|
929 | - { |
|
930 | - return $this->checkout->get_cart_for_transaction($transaction); |
|
931 | - } |
|
932 | - |
|
933 | - |
|
934 | - /** |
|
935 | - * _get_transaction_and_cart_for_current_session |
|
936 | - * generates a new EE_Transaction object and adds it to the $_transaction property. |
|
937 | - * |
|
938 | - * @access private |
|
939 | - * @return EE_Transaction |
|
940 | - * @throws EE_Error |
|
941 | - */ |
|
942 | - private function _get_cart_for_current_session_and_setup_new_transaction() |
|
943 | - { |
|
944 | - // if there's no transaction, then this is the FIRST visit to SPCO |
|
945 | - // so load up the cart ( passing nothing for the TXN because it doesn't exist yet ) |
|
946 | - $this->checkout->cart = $this->_get_cart_for_transaction(null); |
|
947 | - // and then create a new transaction |
|
948 | - $transaction = $this->_initialize_transaction(); |
|
949 | - // verify transaction |
|
950 | - if ($transaction instanceof EE_Transaction) { |
|
951 | - // save it so that we have an ID for other objects to use |
|
952 | - $transaction->save(); |
|
953 | - // and save TXN data to the cart |
|
954 | - $this->checkout->cart->get_grand_total()->save_this_and_descendants_to_txn($transaction->ID()); |
|
955 | - } else { |
|
956 | - EE_Error::add_error( |
|
957 | - esc_html__('A Valid Transaction could not be initialized.', 'event_espresso'), |
|
958 | - __FILE__, |
|
959 | - __FUNCTION__, |
|
960 | - __LINE__ |
|
961 | - ); |
|
962 | - } |
|
963 | - return $transaction; |
|
964 | - } |
|
965 | - |
|
966 | - |
|
967 | - /** |
|
968 | - * generates a new EE_Transaction object and adds it to the $_transaction property. |
|
969 | - * |
|
970 | - * @access private |
|
971 | - * @return mixed EE_Transaction|NULL |
|
972 | - */ |
|
973 | - private function _initialize_transaction() |
|
974 | - { |
|
975 | - try { |
|
976 | - // ensure cart totals have been calculated |
|
977 | - $this->checkout->cart->get_grand_total()->recalculate_total_including_taxes(); |
|
978 | - // grab the cart grand total |
|
979 | - $cart_total = $this->checkout->cart->get_cart_grand_total(); |
|
980 | - // create new TXN |
|
981 | - $transaction = EE_Transaction::new_instance( |
|
982 | - array( |
|
983 | - 'TXN_reg_steps' => $this->checkout->initialize_txn_reg_steps_array(), |
|
984 | - 'TXN_total' => $cart_total > 0 ? $cart_total : 0, |
|
985 | - 'TXN_paid' => 0, |
|
986 | - 'STS_ID' => EEM_Transaction::failed_status_code, |
|
987 | - ) |
|
988 | - ); |
|
989 | - // save it so that we have an ID for other objects to use |
|
990 | - $transaction->save(); |
|
991 | - // set cron job for following up on TXNs after their session has expired |
|
992 | - EE_Cron_Tasks::schedule_expired_transaction_check( |
|
993 | - EE_Registry::instance()->SSN->expiration() + 1, |
|
994 | - $transaction->ID() |
|
995 | - ); |
|
996 | - return $transaction; |
|
997 | - } catch (Exception $e) { |
|
998 | - EE_Error::add_error($e->getMessage(), __FILE__, __FUNCTION__, __LINE__); |
|
999 | - } |
|
1000 | - return null; |
|
1001 | - } |
|
1002 | - |
|
1003 | - |
|
1004 | - /** |
|
1005 | - * _get_registrations |
|
1006 | - * |
|
1007 | - * @access private |
|
1008 | - * @param EE_Transaction $transaction |
|
1009 | - * @return void |
|
1010 | - * @throws InvalidDataTypeException |
|
1011 | - * @throws InvalidEntityException |
|
1012 | - * @throws EE_Error |
|
1013 | - */ |
|
1014 | - private function _get_registrations(EE_Transaction $transaction) |
|
1015 | - { |
|
1016 | - // first step: grab the registrants { : o |
|
1017 | - $registrations = $transaction->registrations($this->checkout->reg_cache_where_params, false); |
|
1018 | - $this->checkout->total_ticket_count = count($registrations); |
|
1019 | - // verify registrations have been set |
|
1020 | - if (empty($registrations)) { |
|
1021 | - // if no cached registrations, then check the db |
|
1022 | - $registrations = $transaction->registrations($this->checkout->reg_cache_where_params, false); |
|
1023 | - // still nothing ? well as long as this isn't a revisit |
|
1024 | - if (empty($registrations) && ! $this->checkout->revisit) { |
|
1025 | - // generate new registrations from scratch |
|
1026 | - $registrations = $this->_initialize_registrations($transaction); |
|
1027 | - } |
|
1028 | - } |
|
1029 | - // sort by their original registration order |
|
1030 | - usort($registrations, array('EED_Single_Page_Checkout', 'sort_registrations_by_REG_count')); |
|
1031 | - // then loop thru the array |
|
1032 | - foreach ($registrations as $registration) { |
|
1033 | - // verify each registration |
|
1034 | - if ($registration instanceof EE_Registration) { |
|
1035 | - // we display all attendee info for the primary registrant |
|
1036 | - if ($this->checkout->reg_url_link === $registration->reg_url_link() |
|
1037 | - && $registration->is_primary_registrant() |
|
1038 | - ) { |
|
1039 | - $this->checkout->primary_revisit = true; |
|
1040 | - break; |
|
1041 | - } |
|
1042 | - if ($this->checkout->revisit && $this->checkout->reg_url_link !== $registration->reg_url_link()) { |
|
1043 | - // but hide info if it doesn't belong to you |
|
1044 | - $transaction->clear_cache('Registration', $registration->ID()); |
|
1045 | - $this->checkout->total_ticket_count--; |
|
1046 | - } |
|
1047 | - $this->checkout->set_reg_status_updated($registration->ID(), false); |
|
1048 | - } |
|
1049 | - } |
|
1050 | - } |
|
1051 | - |
|
1052 | - |
|
1053 | - /** |
|
1054 | - * adds related EE_Registration objects for each ticket in the cart to the current EE_Transaction object |
|
1055 | - * |
|
1056 | - * @access private |
|
1057 | - * @param EE_Transaction $transaction |
|
1058 | - * @return array |
|
1059 | - * @throws InvalidDataTypeException |
|
1060 | - * @throws InvalidEntityException |
|
1061 | - * @throws EE_Error |
|
1062 | - */ |
|
1063 | - private function _initialize_registrations(EE_Transaction $transaction) |
|
1064 | - { |
|
1065 | - $att_nmbr = 0; |
|
1066 | - $registrations = array(); |
|
1067 | - if ($transaction instanceof EE_Transaction) { |
|
1068 | - /** @type EE_Registration_Processor $registration_processor */ |
|
1069 | - $registration_processor = EE_Registry::instance()->load_class('Registration_Processor'); |
|
1070 | - $this->checkout->total_ticket_count = $this->checkout->cart->all_ticket_quantity_count(); |
|
1071 | - // now let's add the cart items to the $transaction |
|
1072 | - foreach ($this->checkout->cart->get_tickets() as $line_item) { |
|
1073 | - // do the following for each ticket of this type they selected |
|
1074 | - for ($x = 1; $x <= $line_item->quantity(); $x++) { |
|
1075 | - $att_nmbr++; |
|
1076 | - /** @var EventEspresso\core\services\commands\registration\CreateRegistrationCommand $CreateRegistrationCommand */ |
|
1077 | - $CreateRegistrationCommand = EE_Registry::instance()->create( |
|
1078 | - 'EventEspresso\core\services\commands\registration\CreateRegistrationCommand', |
|
1079 | - array( |
|
1080 | - $transaction, |
|
1081 | - $line_item, |
|
1082 | - $att_nmbr, |
|
1083 | - $this->checkout->total_ticket_count, |
|
1084 | - ) |
|
1085 | - ); |
|
1086 | - // override capabilities for frontend registrations |
|
1087 | - if (! is_admin()) { |
|
1088 | - $CreateRegistrationCommand->setCapCheck( |
|
1089 | - new PublicCapabilities('', 'create_new_registration') |
|
1090 | - ); |
|
1091 | - } |
|
1092 | - $registration = EE_Registry::instance()->BUS->execute($CreateRegistrationCommand); |
|
1093 | - if (! $registration instanceof EE_Registration) { |
|
1094 | - throw new InvalidEntityException($registration, 'EE_Registration'); |
|
1095 | - } |
|
1096 | - $registrations[ $registration->ID() ] = $registration; |
|
1097 | - } |
|
1098 | - } |
|
1099 | - $registration_processor->fix_reg_final_price_rounding_issue($transaction); |
|
1100 | - } |
|
1101 | - return $registrations; |
|
1102 | - } |
|
1103 | - |
|
1104 | - |
|
1105 | - /** |
|
1106 | - * sorts registrations by REG_count |
|
1107 | - * |
|
1108 | - * @access public |
|
1109 | - * @param EE_Registration $reg_A |
|
1110 | - * @param EE_Registration $reg_B |
|
1111 | - * @return int |
|
1112 | - */ |
|
1113 | - public static function sort_registrations_by_REG_count(EE_Registration $reg_A, EE_Registration $reg_B) |
|
1114 | - { |
|
1115 | - // this shouldn't ever happen within the same TXN, but oh well |
|
1116 | - if ($reg_A->count() === $reg_B->count()) { |
|
1117 | - return 0; |
|
1118 | - } |
|
1119 | - return ($reg_A->count() > $reg_B->count()) ? 1 : -1; |
|
1120 | - } |
|
1121 | - |
|
1122 | - |
|
1123 | - /** |
|
1124 | - * _final_verifications |
|
1125 | - * just makes sure that everything is set up correctly before proceeding |
|
1126 | - * |
|
1127 | - * @access private |
|
1128 | - * @return bool |
|
1129 | - * @throws EE_Error |
|
1130 | - */ |
|
1131 | - private function _final_verifications() |
|
1132 | - { |
|
1133 | - // filter checkout |
|
1134 | - $this->checkout = apply_filters( |
|
1135 | - 'FHEE__EED_Single_Page_Checkout___final_verifications__checkout', |
|
1136 | - $this->checkout |
|
1137 | - ); |
|
1138 | - // verify that current step is still set correctly |
|
1139 | - if (! $this->checkout->current_step instanceof EE_SPCO_Reg_Step) { |
|
1140 | - EE_Error::add_error( |
|
1141 | - esc_html__( |
|
1142 | - 'We\'re sorry but the registration process can not proceed because one or more registration steps were not setup correctly. Please refresh the page and try again or contact support.', |
|
1143 | - 'event_espresso' |
|
1144 | - ), |
|
1145 | - __FILE__, |
|
1146 | - __FUNCTION__, |
|
1147 | - __LINE__ |
|
1148 | - ); |
|
1149 | - return false; |
|
1150 | - } |
|
1151 | - // if returning to SPCO, then verify that primary registrant is set |
|
1152 | - if (! empty($this->checkout->reg_url_link)) { |
|
1153 | - $valid_registrant = $this->checkout->transaction->primary_registration(); |
|
1154 | - if (! $valid_registrant instanceof EE_Registration) { |
|
1155 | - EE_Error::add_error( |
|
1156 | - esc_html__( |
|
1157 | - 'We\'re sorry but there appears to be an error with the "reg_url_link" or the primary registrant for this transaction. Please refresh the page and try again or contact support.', |
|
1158 | - 'event_espresso' |
|
1159 | - ), |
|
1160 | - __FILE__, |
|
1161 | - __FUNCTION__, |
|
1162 | - __LINE__ |
|
1163 | - ); |
|
1164 | - return false; |
|
1165 | - } |
|
1166 | - $valid_registrant = null; |
|
1167 | - foreach ($this->checkout->transaction->registrations($this->checkout->reg_cache_where_params) as $registration) { |
|
1168 | - if ($registration instanceof EE_Registration |
|
1169 | - && $registration->reg_url_link() === $this->checkout->reg_url_link |
|
1170 | - ) { |
|
1171 | - $valid_registrant = $registration; |
|
1172 | - } |
|
1173 | - } |
|
1174 | - if (! $valid_registrant instanceof EE_Registration) { |
|
1175 | - // hmmm... maybe we have the wrong session because the user is opening multiple tabs ? |
|
1176 | - if (EED_Single_Page_Checkout::$_checkout_verified) { |
|
1177 | - // clear the session, mark the checkout as unverified, and try again |
|
1178 | - EE_Registry::instance()->SSN->clear_session(__CLASS__, __FUNCTION__); |
|
1179 | - EED_Single_Page_Checkout::$_initialized = false; |
|
1180 | - EED_Single_Page_Checkout::$_checkout_verified = false; |
|
1181 | - $this->_initialize(); |
|
1182 | - EE_Error::reset_notices(); |
|
1183 | - return false; |
|
1184 | - } |
|
1185 | - EE_Error::add_error( |
|
1186 | - esc_html__( |
|
1187 | - 'We\'re sorry but there appears to be an error with the "reg_url_link" or the transaction itself. Please refresh the page and try again or contact support.', |
|
1188 | - 'event_espresso' |
|
1189 | - ), |
|
1190 | - __FILE__, |
|
1191 | - __FUNCTION__, |
|
1192 | - __LINE__ |
|
1193 | - ); |
|
1194 | - return false; |
|
1195 | - } |
|
1196 | - } |
|
1197 | - // now that things have been kinda sufficiently verified, |
|
1198 | - // let's add the checkout to the session so that it's available to other systems |
|
1199 | - EE_Registry::instance()->SSN->set_checkout($this->checkout); |
|
1200 | - return true; |
|
1201 | - } |
|
1202 | - |
|
1203 | - |
|
1204 | - /** |
|
1205 | - * _initialize_reg_steps |
|
1206 | - * first makes sure that EE_Transaction_Processor::set_reg_step_initiated() is called as required |
|
1207 | - * then loops thru all of the active reg steps and calls the initialize_reg_step() method |
|
1208 | - * |
|
1209 | - * @access private |
|
1210 | - * @param bool $reinitializing |
|
1211 | - * @throws EE_Error |
|
1212 | - */ |
|
1213 | - private function _initialize_reg_steps($reinitializing = false) |
|
1214 | - { |
|
1215 | - $this->checkout->set_reg_step_initiated($this->checkout->current_step); |
|
1216 | - // loop thru all steps to call their individual "initialize" methods and set i18n strings for JS |
|
1217 | - foreach ($this->checkout->reg_steps as $reg_step) { |
|
1218 | - if (! $reg_step->initialize_reg_step()) { |
|
1219 | - // if not initialized then maybe this step is being removed... |
|
1220 | - if (! $reinitializing && $reg_step->is_current_step()) { |
|
1221 | - // if it was the current step, then we need to start over here |
|
1222 | - $this->_initialize_reg_steps(true); |
|
1223 | - return; |
|
1224 | - } |
|
1225 | - continue; |
|
1226 | - } |
|
1227 | - // add css and JS for current step |
|
1228 | - $reg_step->enqueue_styles_and_scripts(); |
|
1229 | - // i18n |
|
1230 | - $reg_step->translate_js_strings(); |
|
1231 | - if ($reg_step->is_current_step()) { |
|
1232 | - // the text that appears on the reg step form submit button |
|
1233 | - $reg_step->set_submit_button_text(); |
|
1234 | - } |
|
1235 | - } |
|
1236 | - // dynamically creates hook point like: AHEE__Single_Page_Checkout___initialize_reg_step__attendee_information |
|
1237 | - do_action( |
|
1238 | - "AHEE__Single_Page_Checkout___initialize_reg_step__{$this->checkout->current_step->slug()}", |
|
1239 | - $this->checkout->current_step |
|
1240 | - ); |
|
1241 | - } |
|
1242 | - |
|
1243 | - |
|
1244 | - /** |
|
1245 | - * _check_form_submission |
|
1246 | - * |
|
1247 | - * @access private |
|
1248 | - * @return boolean |
|
1249 | - */ |
|
1250 | - private function _check_form_submission() |
|
1251 | - { |
|
1252 | - // does this request require the reg form to be generated ? |
|
1253 | - if ($this->checkout->generate_reg_form) { |
|
1254 | - // ever heard that song by Blue Rodeo ? |
|
1255 | - try { |
|
1256 | - $this->checkout->current_step->reg_form = $this->checkout->current_step->generate_reg_form(); |
|
1257 | - // if not displaying a form, then check for form submission |
|
1258 | - if ($this->checkout->process_form_submission |
|
1259 | - && $this->checkout->current_step->reg_form->was_submitted() |
|
1260 | - ) { |
|
1261 | - // clear out any old data in case this step is being run again |
|
1262 | - $this->checkout->current_step->set_valid_data(array()); |
|
1263 | - // capture submitted form data |
|
1264 | - $this->checkout->current_step->reg_form->receive_form_submission( |
|
1265 | - apply_filters( |
|
1266 | - 'FHEE__Single_Page_Checkout___check_form_submission__request_params', |
|
1267 | - EE_Registry::instance()->REQ->params(), |
|
1268 | - $this->checkout |
|
1269 | - ) |
|
1270 | - ); |
|
1271 | - // validate submitted form data |
|
1272 | - if (! $this->checkout->continue_reg || ! $this->checkout->current_step->reg_form->is_valid()) { |
|
1273 | - // thou shall not pass !!! |
|
1274 | - $this->checkout->continue_reg = false; |
|
1275 | - // any form validation errors? |
|
1276 | - if ($this->checkout->current_step->reg_form->submission_error_message() !== '') { |
|
1277 | - EE_Error::add_error( |
|
1278 | - $this->checkout->current_step->reg_form->submission_error_message(), |
|
1279 | - __FILE__, |
|
1280 | - __FUNCTION__, |
|
1281 | - __LINE__ |
|
1282 | - ); |
|
1283 | - } |
|
1284 | - // well not really... what will happen is |
|
1285 | - // we'll just get redirected back to redo the current step |
|
1286 | - $this->go_to_next_step(); |
|
1287 | - return false; |
|
1288 | - } |
|
1289 | - } |
|
1290 | - } catch (EE_Error $e) { |
|
1291 | - $e->get_error(); |
|
1292 | - } |
|
1293 | - } |
|
1294 | - return true; |
|
1295 | - } |
|
1296 | - |
|
1297 | - |
|
1298 | - /** |
|
1299 | - * _process_action |
|
1300 | - * |
|
1301 | - * @access private |
|
1302 | - * @return void |
|
1303 | - * @throws EE_Error |
|
1304 | - */ |
|
1305 | - private function _process_form_action() |
|
1306 | - { |
|
1307 | - // what cha wanna do? |
|
1308 | - switch ($this->checkout->action) { |
|
1309 | - // AJAX next step reg form |
|
1310 | - case 'display_spco_reg_step': |
|
1311 | - $this->checkout->redirect = false; |
|
1312 | - if (EE_Registry::instance()->REQ->ajax) { |
|
1313 | - $this->checkout->json_response->set_reg_step_html( |
|
1314 | - $this->checkout->current_step->display_reg_form() |
|
1315 | - ); |
|
1316 | - } |
|
1317 | - break; |
|
1318 | - default: |
|
1319 | - // meh... do one of those other steps first |
|
1320 | - if (! empty($this->checkout->action) |
|
1321 | - && is_callable(array($this->checkout->current_step, $this->checkout->action)) |
|
1322 | - ) { |
|
1323 | - // dynamically creates hook point like: |
|
1324 | - // AHEE__Single_Page_Checkout__before_attendee_information__process_reg_step |
|
1325 | - do_action( |
|
1326 | - "AHEE__Single_Page_Checkout__before_{$this->checkout->current_step->slug()}__{$this->checkout->action}", |
|
1327 | - $this->checkout->current_step |
|
1328 | - ); |
|
1329 | - // call action on current step |
|
1330 | - if (call_user_func(array($this->checkout->current_step, $this->checkout->action))) { |
|
1331 | - // good registrant, you get to proceed |
|
1332 | - if ($this->checkout->current_step->success_message() !== '' |
|
1333 | - && apply_filters( |
|
1334 | - 'FHEE__Single_Page_Checkout___process_form_action__display_success', |
|
1335 | - false |
|
1336 | - ) |
|
1337 | - ) { |
|
1338 | - EE_Error::add_success( |
|
1339 | - $this->checkout->current_step->success_message() |
|
1340 | - . '<br />' . $this->checkout->next_step->_instructions() |
|
1341 | - ); |
|
1342 | - } |
|
1343 | - // pack it up, pack it in... |
|
1344 | - $this->_setup_redirect(); |
|
1345 | - } |
|
1346 | - // dynamically creates hook point like: |
|
1347 | - // AHEE__Single_Page_Checkout__after_payment_options__process_reg_step |
|
1348 | - do_action( |
|
1349 | - "AHEE__Single_Page_Checkout__after_{$this->checkout->current_step->slug()}__{$this->checkout->action}", |
|
1350 | - $this->checkout->current_step |
|
1351 | - ); |
|
1352 | - } else { |
|
1353 | - EE_Error::add_error( |
|
1354 | - sprintf( |
|
1355 | - esc_html__( |
|
1356 | - 'The requested form action "%s" does not exist for the current "%s" registration step.', |
|
1357 | - 'event_espresso' |
|
1358 | - ), |
|
1359 | - $this->checkout->action, |
|
1360 | - $this->checkout->current_step->name() |
|
1361 | - ), |
|
1362 | - __FILE__, |
|
1363 | - __FUNCTION__, |
|
1364 | - __LINE__ |
|
1365 | - ); |
|
1366 | - } |
|
1367 | - // end default |
|
1368 | - } |
|
1369 | - // store our progress so far |
|
1370 | - $this->checkout->stash_transaction_and_checkout(); |
|
1371 | - // advance to the next step! If you pass GO, collect $200 |
|
1372 | - $this->go_to_next_step(); |
|
1373 | - } |
|
1374 | - |
|
1375 | - |
|
1376 | - /** |
|
1377 | - * add_styles_and_scripts |
|
1378 | - * |
|
1379 | - * @access public |
|
1380 | - * @return void |
|
1381 | - */ |
|
1382 | - public function add_styles_and_scripts() |
|
1383 | - { |
|
1384 | - // i18n |
|
1385 | - $this->translate_js_strings(); |
|
1386 | - if ($this->checkout->admin_request) { |
|
1387 | - add_action('admin_enqueue_scripts', array($this, 'enqueue_styles_and_scripts'), 10); |
|
1388 | - } else { |
|
1389 | - add_action('wp_enqueue_scripts', array($this, 'enqueue_styles_and_scripts'), 10); |
|
1390 | - } |
|
1391 | - } |
|
1392 | - |
|
1393 | - |
|
1394 | - /** |
|
1395 | - * translate_js_strings |
|
1396 | - * |
|
1397 | - * @access public |
|
1398 | - * @return void |
|
1399 | - */ |
|
1400 | - public function translate_js_strings() |
|
1401 | - { |
|
1402 | - EE_Registry::$i18n_js_strings['revisit'] = $this->checkout->revisit; |
|
1403 | - EE_Registry::$i18n_js_strings['e_reg_url_link'] = $this->checkout->reg_url_link; |
|
1404 | - EE_Registry::$i18n_js_strings['server_error'] = esc_html__( |
|
1405 | - 'An unknown error occurred on the server while attempting to process your request. Please refresh the page and try again or contact support.', |
|
1406 | - 'event_espresso' |
|
1407 | - ); |
|
1408 | - EE_Registry::$i18n_js_strings['invalid_json_response'] = esc_html__( |
|
1409 | - 'An invalid response was returned from the server while attempting to process your request. Please refresh the page and try again or contact support.', |
|
1410 | - 'event_espresso' |
|
1411 | - ); |
|
1412 | - EE_Registry::$i18n_js_strings['validation_error'] = esc_html__( |
|
1413 | - 'There appears to be a problem with the form validation configuration! Please check the admin settings or contact support.', |
|
1414 | - 'event_espresso' |
|
1415 | - ); |
|
1416 | - EE_Registry::$i18n_js_strings['invalid_payment_method'] = esc_html__( |
|
1417 | - 'There appears to be a problem with the payment method configuration! Please refresh the page and try again or contact support.', |
|
1418 | - 'event_espresso' |
|
1419 | - ); |
|
1420 | - EE_Registry::$i18n_js_strings['reg_step_error'] = esc_html__( |
|
1421 | - 'This registration step could not be completed. Please refresh the page and try again.', |
|
1422 | - 'event_espresso' |
|
1423 | - ); |
|
1424 | - EE_Registry::$i18n_js_strings['invalid_coupon'] = esc_html__( |
|
1425 | - 'We\'re sorry but that coupon code does not appear to be valid. If this is incorrect, please contact the site administrator.', |
|
1426 | - 'event_espresso' |
|
1427 | - ); |
|
1428 | - EE_Registry::$i18n_js_strings['process_registration'] = sprintf( |
|
1429 | - esc_html__( |
|
1430 | - 'Please wait while we process your registration.%sDo not refresh the page or navigate away while this is happening.%sThank you for your patience.', |
|
1431 | - 'event_espresso' |
|
1432 | - ), |
|
1433 | - '<br/>', |
|
1434 | - '<br/>' |
|
1435 | - ); |
|
1436 | - EE_Registry::$i18n_js_strings['language'] = get_bloginfo('language'); |
|
1437 | - EE_Registry::$i18n_js_strings['EESID'] = EE_Registry::instance()->SSN->id(); |
|
1438 | - EE_Registry::$i18n_js_strings['currency'] = EE_Registry::instance()->CFG->currency; |
|
1439 | - EE_Registry::$i18n_js_strings['datepicker_yearRange'] = '-150:+20'; |
|
1440 | - EE_Registry::$i18n_js_strings['timer_years'] = esc_html__('years', 'event_espresso'); |
|
1441 | - EE_Registry::$i18n_js_strings['timer_months'] = esc_html__('months', 'event_espresso'); |
|
1442 | - EE_Registry::$i18n_js_strings['timer_weeks'] = esc_html__('weeks', 'event_espresso'); |
|
1443 | - EE_Registry::$i18n_js_strings['timer_days'] = esc_html__('days', 'event_espresso'); |
|
1444 | - EE_Registry::$i18n_js_strings['timer_hours'] = esc_html__('hours', 'event_espresso'); |
|
1445 | - EE_Registry::$i18n_js_strings['timer_minutes'] = esc_html__('minutes', 'event_espresso'); |
|
1446 | - EE_Registry::$i18n_js_strings['timer_seconds'] = esc_html__('seconds', 'event_espresso'); |
|
1447 | - EE_Registry::$i18n_js_strings['timer_year'] = esc_html__('year', 'event_espresso'); |
|
1448 | - EE_Registry::$i18n_js_strings['timer_month'] = esc_html__('month', 'event_espresso'); |
|
1449 | - EE_Registry::$i18n_js_strings['timer_week'] = esc_html__('week', 'event_espresso'); |
|
1450 | - EE_Registry::$i18n_js_strings['timer_day'] = esc_html__('day', 'event_espresso'); |
|
1451 | - EE_Registry::$i18n_js_strings['timer_hour'] = esc_html__('hour', 'event_espresso'); |
|
1452 | - EE_Registry::$i18n_js_strings['timer_minute'] = esc_html__('minute', 'event_espresso'); |
|
1453 | - EE_Registry::$i18n_js_strings['timer_second'] = esc_html__('second', 'event_espresso'); |
|
1454 | - EE_Registry::$i18n_js_strings['registration_expiration_notice'] = EED_Single_Page_Checkout::getRegistrationExpirationNotice( |
|
1455 | - ); |
|
1456 | - EE_Registry::$i18n_js_strings['ajax_submit'] = apply_filters( |
|
1457 | - 'FHEE__Single_Page_Checkout__translate_js_strings__ajax_submit', |
|
1458 | - true |
|
1459 | - ); |
|
1460 | - EE_Registry::$i18n_js_strings['session_extension'] = absint( |
|
1461 | - apply_filters('FHEE__EE_Session__extend_expiration__seconds_added', 10 * MINUTE_IN_SECONDS) |
|
1462 | - ); |
|
1463 | - EE_Registry::$i18n_js_strings['session_expiration'] = gmdate( |
|
1464 | - 'M d, Y H:i:s', |
|
1465 | - EE_Registry::instance()->SSN->expiration() + (get_option('gmt_offset') * HOUR_IN_SECONDS) |
|
1466 | - ); |
|
1467 | - } |
|
1468 | - |
|
1469 | - |
|
1470 | - /** |
|
1471 | - * enqueue_styles_and_scripts |
|
1472 | - * |
|
1473 | - * @access public |
|
1474 | - * @return void |
|
1475 | - * @throws EE_Error |
|
1476 | - */ |
|
1477 | - public function enqueue_styles_and_scripts() |
|
1478 | - { |
|
1479 | - // load css |
|
1480 | - wp_register_style( |
|
1481 | - 'single_page_checkout', |
|
1482 | - SPCO_CSS_URL . 'single_page_checkout.css', |
|
1483 | - array('espresso_default'), |
|
1484 | - EVENT_ESPRESSO_VERSION |
|
1485 | - ); |
|
1486 | - wp_enqueue_style('single_page_checkout'); |
|
1487 | - // load JS |
|
1488 | - wp_register_script( |
|
1489 | - 'jquery_plugin', |
|
1490 | - EE_THIRD_PARTY_URL . 'jquery .plugin.min.js', |
|
1491 | - array('jquery'), |
|
1492 | - '1.0.1', |
|
1493 | - true |
|
1494 | - ); |
|
1495 | - wp_register_script( |
|
1496 | - 'jquery_countdown', |
|
1497 | - EE_THIRD_PARTY_URL . 'jquery .countdown.min.js', |
|
1498 | - array('jquery_plugin'), |
|
1499 | - '2.1.0', |
|
1500 | - true |
|
1501 | - ); |
|
1502 | - wp_register_script( |
|
1503 | - 'single_page_checkout', |
|
1504 | - SPCO_JS_URL . 'single_page_checkout.js', |
|
1505 | - array('espresso_core', 'underscore', 'ee_form_section_validation'), |
|
1506 | - EVENT_ESPRESSO_VERSION, |
|
1507 | - true |
|
1508 | - ); |
|
1509 | - if ($this->checkout->registration_form instanceof EE_Form_Section_Proper) { |
|
1510 | - $this->checkout->registration_form->enqueue_js(); |
|
1511 | - } |
|
1512 | - if ($this->checkout->current_step->reg_form instanceof EE_Form_Section_Proper) { |
|
1513 | - $this->checkout->current_step->reg_form->enqueue_js(); |
|
1514 | - } |
|
1515 | - wp_enqueue_script('single_page_checkout'); |
|
1516 | - if (apply_filters('FHEE__registration_page_wrapper_template__display_time_limit', false)) { |
|
1517 | - wp_enqueue_script('jquery_countdown'); |
|
1518 | - } |
|
1519 | - /** |
|
1520 | - * global action hook for enqueueing styles and scripts with |
|
1521 | - * spco calls. |
|
1522 | - */ |
|
1523 | - do_action('AHEE__EED_Single_Page_Checkout__enqueue_styles_and_scripts', $this); |
|
1524 | - /** |
|
1525 | - * dynamic action hook for enqueueing styles and scripts with spco calls. |
|
1526 | - * The hook will end up being something like: |
|
1527 | - * AHEE__EED_Single_Page_Checkout__enqueue_styles_and_scripts__attendee_information |
|
1528 | - */ |
|
1529 | - do_action( |
|
1530 | - 'AHEE__EED_Single_Page_Checkout__enqueue_styles_and_scripts__' . $this->checkout->current_step->slug(), |
|
1531 | - $this |
|
1532 | - ); |
|
1533 | - } |
|
1534 | - |
|
1535 | - |
|
1536 | - /** |
|
1537 | - * display the Registration Single Page Checkout Form |
|
1538 | - * |
|
1539 | - * @access private |
|
1540 | - * @return void |
|
1541 | - * @throws EE_Error |
|
1542 | - */ |
|
1543 | - private function _display_spco_reg_form() |
|
1544 | - { |
|
1545 | - // if registering via the admin, just display the reg form for the current step |
|
1546 | - if ($this->checkout->admin_request) { |
|
1547 | - EE_Registry::instance()->REQ->add_output($this->checkout->current_step->display_reg_form()); |
|
1548 | - } else { |
|
1549 | - // add powered by EE msg |
|
1550 | - add_action('AHEE__SPCO__reg_form_footer', array('EED_Single_Page_Checkout', 'display_registration_footer')); |
|
1551 | - $empty_cart = count($this->checkout->transaction |
|
1552 | - ->registrations($this->checkout->reg_cache_where_params)) < 1; |
|
1553 | - EE_Registry::$i18n_js_strings['empty_cart'] = $empty_cart; |
|
1554 | - $cookies_not_set_msg = ''; |
|
1555 | - if ($empty_cart) { |
|
1556 | - $cookies_not_set_msg = apply_filters( |
|
1557 | - 'FHEE__Single_Page_Checkout__display_spco_reg_form__cookies_not_set_msg', |
|
1558 | - sprintf( |
|
1559 | - esc_html__( |
|
1560 | - '%1$s%3$sIt appears your browser is not currently set to accept Cookies%4$s%5$sIn order to register for events, you need to enable cookies.%7$sIf you require assistance, then click the following link to learn how to %8$senable cookies%9$s%6$s%2$s', |
|
1561 | - 'event_espresso' |
|
1562 | - ), |
|
1563 | - '<div class="ee-attention hidden" id="ee-cookies-not-set-msg">', |
|
1564 | - '</div>', |
|
1565 | - '<h6 class="important-notice">', |
|
1566 | - '</h6>', |
|
1567 | - '<p>', |
|
1568 | - '</p>', |
|
1569 | - '<br />', |
|
1570 | - '<a href="http://www.whatarecookies.com/enable.asp" target="_blank" rel="noopener noreferrer">', |
|
1571 | - '</a>' |
|
1572 | - ) |
|
1573 | - ); |
|
1574 | - } |
|
1575 | - $this->checkout->registration_form = new EE_Form_Section_Proper( |
|
1576 | - array( |
|
1577 | - 'name' => 'single-page-checkout', |
|
1578 | - 'html_id' => 'ee-single-page-checkout-dv', |
|
1579 | - 'layout_strategy' => |
|
1580 | - new EE_Template_Layout( |
|
1581 | - array( |
|
1582 | - 'layout_template_file' => SPCO_TEMPLATES_PATH . 'registration_page_wrapper.template.php', |
|
1583 | - 'template_args' => array( |
|
1584 | - 'empty_cart' => $empty_cart, |
|
1585 | - 'revisit' => $this->checkout->revisit, |
|
1586 | - 'reg_steps' => $this->checkout->reg_steps, |
|
1587 | - 'next_step' => $this->checkout->next_step instanceof EE_SPCO_Reg_Step |
|
1588 | - ? $this->checkout->next_step->slug() |
|
1589 | - : '', |
|
1590 | - 'empty_msg' => apply_filters( |
|
1591 | - 'FHEE__Single_Page_Checkout__display_spco_reg_form__empty_msg', |
|
1592 | - sprintf( |
|
1593 | - esc_html__( |
|
1594 | - 'You need to %1$sReturn to Events list%2$sselect at least one event%3$s before you can proceed with the registration process.', |
|
1595 | - 'event_espresso' |
|
1596 | - ), |
|
1597 | - '<a href="' |
|
1598 | - . get_post_type_archive_link('espresso_events') |
|
1599 | - . '" title="', |
|
1600 | - '">', |
|
1601 | - '</a>' |
|
1602 | - ) |
|
1603 | - ), |
|
1604 | - 'cookies_not_set_msg' => $cookies_not_set_msg, |
|
1605 | - 'registration_time_limit' => $this->checkout->get_registration_time_limit(), |
|
1606 | - 'session_expiration' => gmdate( |
|
1607 | - 'M d, Y H:i:s', |
|
1608 | - EE_Registry::instance()->SSN->expiration() |
|
1609 | - + (get_option('gmt_offset') * HOUR_IN_SECONDS) |
|
1610 | - ), |
|
1611 | - ), |
|
1612 | - ) |
|
1613 | - ), |
|
1614 | - ) |
|
1615 | - ); |
|
1616 | - // load template and add to output sent that gets filtered into the_content() |
|
1617 | - EE_Registry::instance()->REQ->add_output($this->checkout->registration_form->get_html()); |
|
1618 | - } |
|
1619 | - } |
|
1620 | - |
|
1621 | - |
|
1622 | - /** |
|
1623 | - * add_extra_finalize_registration_inputs |
|
1624 | - * |
|
1625 | - * @access public |
|
1626 | - * @param $next_step |
|
1627 | - * @internal param string $label |
|
1628 | - * @return void |
|
1629 | - */ |
|
1630 | - public function add_extra_finalize_registration_inputs($next_step) |
|
1631 | - { |
|
1632 | - if ($next_step === 'finalize_registration') { |
|
1633 | - echo '<div id="spco-extra-finalize_registration-inputs-dv"></div>'; |
|
1634 | - } |
|
1635 | - } |
|
1636 | - |
|
1637 | - |
|
1638 | - /** |
|
1639 | - * display_registration_footer |
|
1640 | - * |
|
1641 | - * @access public |
|
1642 | - * @return string |
|
1643 | - */ |
|
1644 | - public static function display_registration_footer() |
|
1645 | - { |
|
1646 | - if (apply_filters( |
|
1647 | - 'FHEE__EE_Front__Controller__show_reg_footer', |
|
1648 | - EE_Registry::instance()->CFG->admin->show_reg_footer |
|
1649 | - )) { |
|
1650 | - add_filter( |
|
1651 | - 'FHEE__EEH_Template__powered_by_event_espresso__url', |
|
1652 | - function ($url) { |
|
1653 | - return apply_filters('FHEE__EE_Front_Controller__registration_footer__url', $url); |
|
1654 | - } |
|
1655 | - ); |
|
1656 | - echo apply_filters( |
|
1657 | - 'FHEE__EE_Front_Controller__display_registration_footer', |
|
1658 | - \EEH_Template::powered_by_event_espresso( |
|
1659 | - '', |
|
1660 | - 'espresso-registration-footer-dv', |
|
1661 | - array('utm_content' => 'registration_checkout') |
|
1662 | - ) |
|
1663 | - ); |
|
1664 | - } |
|
1665 | - return ''; |
|
1666 | - } |
|
1667 | - |
|
1668 | - |
|
1669 | - /** |
|
1670 | - * unlock_transaction |
|
1671 | - * |
|
1672 | - * @access public |
|
1673 | - * @return void |
|
1674 | - * @throws EE_Error |
|
1675 | - */ |
|
1676 | - public function unlock_transaction() |
|
1677 | - { |
|
1678 | - if ($this->checkout->transaction instanceof EE_Transaction) { |
|
1679 | - $this->checkout->transaction->unlock(); |
|
1680 | - } |
|
1681 | - } |
|
1682 | - |
|
1683 | - |
|
1684 | - /** |
|
1685 | - * _setup_redirect |
|
1686 | - * |
|
1687 | - * @access private |
|
1688 | - * @return void |
|
1689 | - */ |
|
1690 | - private function _setup_redirect() |
|
1691 | - { |
|
1692 | - if ($this->checkout->continue_reg && $this->checkout->next_step instanceof EE_SPCO_Reg_Step) { |
|
1693 | - $this->checkout->redirect = true; |
|
1694 | - if (empty($this->checkout->redirect_url)) { |
|
1695 | - $this->checkout->redirect_url = $this->checkout->next_step->reg_step_url(); |
|
1696 | - } |
|
1697 | - $this->checkout->redirect_url = apply_filters( |
|
1698 | - 'FHEE__EED_Single_Page_Checkout___setup_redirect__checkout_redirect_url', |
|
1699 | - $this->checkout->redirect_url, |
|
1700 | - $this->checkout |
|
1701 | - ); |
|
1702 | - } |
|
1703 | - } |
|
1704 | - |
|
1705 | - |
|
1706 | - /** |
|
1707 | - * handle ajax message responses and redirects |
|
1708 | - * |
|
1709 | - * @access public |
|
1710 | - * @return void |
|
1711 | - * @throws EE_Error |
|
1712 | - */ |
|
1713 | - public function go_to_next_step() |
|
1714 | - { |
|
1715 | - if (EE_Registry::instance()->REQ->ajax) { |
|
1716 | - // capture contents of output buffer we started earlier in the request, and insert into JSON response |
|
1717 | - $this->checkout->json_response->set_unexpected_errors(ob_get_clean()); |
|
1718 | - } |
|
1719 | - $this->unlock_transaction(); |
|
1720 | - // just return for these conditions |
|
1721 | - if ($this->checkout->admin_request |
|
1722 | - || $this->checkout->action === 'redirect_form' |
|
1723 | - || $this->checkout->action === 'update_checkout' |
|
1724 | - ) { |
|
1725 | - return; |
|
1726 | - } |
|
1727 | - // AJAX response |
|
1728 | - $this->_handle_json_response(); |
|
1729 | - // redirect to next step or the Thank You page |
|
1730 | - $this->_handle_html_redirects(); |
|
1731 | - // hmmm... must be something wrong, so let's just display the form again ! |
|
1732 | - $this->_display_spco_reg_form(); |
|
1733 | - } |
|
1734 | - |
|
1735 | - |
|
1736 | - /** |
|
1737 | - * _handle_json_response |
|
1738 | - * |
|
1739 | - * @access protected |
|
1740 | - * @return void |
|
1741 | - */ |
|
1742 | - protected function _handle_json_response() |
|
1743 | - { |
|
1744 | - // if this is an ajax request |
|
1745 | - if (EE_Registry::instance()->REQ->ajax) { |
|
1746 | - $this->checkout->json_response->set_registration_time_limit( |
|
1747 | - $this->checkout->get_registration_time_limit() |
|
1748 | - ); |
|
1749 | - $this->checkout->json_response->set_payment_amount($this->checkout->amount_owing); |
|
1750 | - // just send the ajax ( |
|
1751 | - $json_response = apply_filters( |
|
1752 | - 'FHEE__EE_Single_Page_Checkout__JSON_response', |
|
1753 | - $this->checkout->json_response |
|
1754 | - ); |
|
1755 | - echo $json_response; |
|
1756 | - exit(); |
|
1757 | - } |
|
1758 | - } |
|
1759 | - |
|
1760 | - |
|
1761 | - /** |
|
1762 | - * _handle_redirects |
|
1763 | - * |
|
1764 | - * @access protected |
|
1765 | - * @return void |
|
1766 | - */ |
|
1767 | - protected function _handle_html_redirects() |
|
1768 | - { |
|
1769 | - // going somewhere ? |
|
1770 | - if ($this->checkout->redirect && ! empty($this->checkout->redirect_url)) { |
|
1771 | - // store notices in a transient |
|
1772 | - EE_Error::get_notices(false, true, true); |
|
1773 | - wp_safe_redirect($this->checkout->redirect_url); |
|
1774 | - exit(); |
|
1775 | - } |
|
1776 | - } |
|
1777 | - |
|
1778 | - |
|
1779 | - /** |
|
1780 | - * set_checkout_anchor |
|
1781 | - * |
|
1782 | - * @access public |
|
1783 | - * @return void |
|
1784 | - */ |
|
1785 | - public function set_checkout_anchor() |
|
1786 | - { |
|
1787 | - echo '<a id="checkout" style="float: left; margin-left: -999em;"></a>'; |
|
1788 | - } |
|
1789 | - |
|
1790 | - /** |
|
1791 | - * getRegistrationExpirationNotice |
|
1792 | - * |
|
1793 | - * @since 4.9.59.p |
|
1794 | - * @access public |
|
1795 | - * @return string |
|
1796 | - */ |
|
1797 | - public static function getRegistrationExpirationNotice() |
|
1798 | - { |
|
1799 | - return sprintf( |
|
1800 | - esc_html__( |
|
1801 | - '%1$sWe\'re sorry, but your registration time has expired.%2$s%3$s%4$sIf you still wish to complete your registration, please return to the %5$sEvent List%6$sEvent List%7$s and reselect your tickets if available. Please accept our apologies for any inconvenience this may have caused.%8$s', |
|
1802 | - 'event_espresso' |
|
1803 | - ), |
|
1804 | - '<h4 class="important-notice">', |
|
1805 | - '</h4>', |
|
1806 | - '<br />', |
|
1807 | - '<p>', |
|
1808 | - '<a href="' . get_post_type_archive_link('espresso_events') . '" title="', |
|
1809 | - '">', |
|
1810 | - '</a>', |
|
1811 | - '</p>' |
|
1812 | - ); |
|
1813 | - } |
|
18 | + /** |
|
19 | + * $_initialized - has the SPCO controller already been initialized ? |
|
20 | + * |
|
21 | + * @access private |
|
22 | + * @var bool $_initialized |
|
23 | + */ |
|
24 | + private static $_initialized = false; |
|
25 | + |
|
26 | + |
|
27 | + /** |
|
28 | + * $_checkout_verified - is the EE_Checkout verified as correct for this request ? |
|
29 | + * |
|
30 | + * @access private |
|
31 | + * @var bool $_valid_checkout |
|
32 | + */ |
|
33 | + private static $_checkout_verified = true; |
|
34 | + |
|
35 | + /** |
|
36 | + * $_reg_steps_array - holds initial array of reg steps |
|
37 | + * |
|
38 | + * @access private |
|
39 | + * @var array $_reg_steps_array |
|
40 | + */ |
|
41 | + private static $_reg_steps_array = array(); |
|
42 | + |
|
43 | + /** |
|
44 | + * $checkout - EE_Checkout object for handling the properties of the current checkout process |
|
45 | + * |
|
46 | + * @access public |
|
47 | + * @var EE_Checkout $checkout |
|
48 | + */ |
|
49 | + public $checkout; |
|
50 | + |
|
51 | + |
|
52 | + /** |
|
53 | + * @return EED_Module|EED_Single_Page_Checkout |
|
54 | + */ |
|
55 | + public static function instance() |
|
56 | + { |
|
57 | + add_filter('EED_Single_Page_Checkout__SPCO_active', '__return_true'); |
|
58 | + return parent::get_instance(__CLASS__); |
|
59 | + } |
|
60 | + |
|
61 | + |
|
62 | + /** |
|
63 | + * @return EE_CART |
|
64 | + */ |
|
65 | + public function cart() |
|
66 | + { |
|
67 | + return $this->checkout->cart; |
|
68 | + } |
|
69 | + |
|
70 | + |
|
71 | + /** |
|
72 | + * @return EE_Transaction |
|
73 | + */ |
|
74 | + public function transaction() |
|
75 | + { |
|
76 | + return $this->checkout->transaction; |
|
77 | + } |
|
78 | + |
|
79 | + |
|
80 | + /** |
|
81 | + * set_hooks - for hooking into EE Core, other modules, etc |
|
82 | + * |
|
83 | + * @access public |
|
84 | + * @return void |
|
85 | + * @throws EE_Error |
|
86 | + */ |
|
87 | + public static function set_hooks() |
|
88 | + { |
|
89 | + EED_Single_Page_Checkout::set_definitions(); |
|
90 | + } |
|
91 | + |
|
92 | + |
|
93 | + /** |
|
94 | + * set_hooks_admin - for hooking into EE Admin Core, other modules, etc |
|
95 | + * |
|
96 | + * @access public |
|
97 | + * @return void |
|
98 | + * @throws EE_Error |
|
99 | + */ |
|
100 | + public static function set_hooks_admin() |
|
101 | + { |
|
102 | + EED_Single_Page_Checkout::set_definitions(); |
|
103 | + if (! (defined('DOING_AJAX') && DOING_AJAX)) { |
|
104 | + return; |
|
105 | + } |
|
106 | + // going to start an output buffer in case anything gets accidentally output |
|
107 | + // that might disrupt our JSON response |
|
108 | + ob_start(); |
|
109 | + EED_Single_Page_Checkout::load_request_handler(); |
|
110 | + EED_Single_Page_Checkout::load_reg_steps(); |
|
111 | + // set ajax hooks |
|
112 | + add_action('wp_ajax_process_reg_step', array('EED_Single_Page_Checkout', 'process_reg_step')); |
|
113 | + add_action('wp_ajax_nopriv_process_reg_step', array('EED_Single_Page_Checkout', 'process_reg_step')); |
|
114 | + add_action('wp_ajax_display_spco_reg_step', array('EED_Single_Page_Checkout', 'display_reg_step')); |
|
115 | + add_action('wp_ajax_nopriv_display_spco_reg_step', array('EED_Single_Page_Checkout', 'display_reg_step')); |
|
116 | + add_action('wp_ajax_update_reg_step', array('EED_Single_Page_Checkout', 'update_reg_step')); |
|
117 | + add_action('wp_ajax_nopriv_update_reg_step', array('EED_Single_Page_Checkout', 'update_reg_step')); |
|
118 | + } |
|
119 | + |
|
120 | + |
|
121 | + /** |
|
122 | + * process ajax request |
|
123 | + * |
|
124 | + * @param string $ajax_action |
|
125 | + * @throws EE_Error |
|
126 | + */ |
|
127 | + public static function process_ajax_request($ajax_action) |
|
128 | + { |
|
129 | + EE_Registry::instance()->REQ->set('action', $ajax_action); |
|
130 | + EED_Single_Page_Checkout::instance()->_initialize(); |
|
131 | + } |
|
132 | + |
|
133 | + |
|
134 | + /** |
|
135 | + * ajax display registration step |
|
136 | + * |
|
137 | + * @throws EE_Error |
|
138 | + */ |
|
139 | + public static function display_reg_step() |
|
140 | + { |
|
141 | + EED_Single_Page_Checkout::process_ajax_request('display_spco_reg_step'); |
|
142 | + } |
|
143 | + |
|
144 | + |
|
145 | + /** |
|
146 | + * ajax process registration step |
|
147 | + * |
|
148 | + * @throws EE_Error |
|
149 | + */ |
|
150 | + public static function process_reg_step() |
|
151 | + { |
|
152 | + EED_Single_Page_Checkout::process_ajax_request('process_reg_step'); |
|
153 | + } |
|
154 | + |
|
155 | + |
|
156 | + /** |
|
157 | + * ajax process registration step |
|
158 | + * |
|
159 | + * @throws EE_Error |
|
160 | + */ |
|
161 | + public static function update_reg_step() |
|
162 | + { |
|
163 | + EED_Single_Page_Checkout::process_ajax_request('update_reg_step'); |
|
164 | + } |
|
165 | + |
|
166 | + |
|
167 | + /** |
|
168 | + * update_checkout |
|
169 | + * |
|
170 | + * @access public |
|
171 | + * @return void |
|
172 | + * @throws EE_Error |
|
173 | + */ |
|
174 | + public static function update_checkout() |
|
175 | + { |
|
176 | + EED_Single_Page_Checkout::process_ajax_request('update_checkout'); |
|
177 | + } |
|
178 | + |
|
179 | + |
|
180 | + /** |
|
181 | + * load_request_handler |
|
182 | + * |
|
183 | + * @access public |
|
184 | + * @return void |
|
185 | + */ |
|
186 | + public static function load_request_handler() |
|
187 | + { |
|
188 | + // load core Request_Handler class |
|
189 | + if (EE_Registry::instance()->REQ !== null) { |
|
190 | + EE_Registry::instance()->load_core('Request_Handler'); |
|
191 | + } |
|
192 | + } |
|
193 | + |
|
194 | + |
|
195 | + /** |
|
196 | + * set_definitions |
|
197 | + * |
|
198 | + * @access public |
|
199 | + * @return void |
|
200 | + * @throws EE_Error |
|
201 | + */ |
|
202 | + public static function set_definitions() |
|
203 | + { |
|
204 | + if (defined('SPCO_BASE_PATH')) { |
|
205 | + return; |
|
206 | + } |
|
207 | + define( |
|
208 | + 'SPCO_BASE_PATH', |
|
209 | + rtrim(str_replace(array('\\', '/'), DS, plugin_dir_path(__FILE__)), DS) . DS |
|
210 | + ); |
|
211 | + define('SPCO_CSS_URL', plugin_dir_url(__FILE__) . 'css' . DS); |
|
212 | + define('SPCO_IMG_URL', plugin_dir_url(__FILE__) . 'img' . DS); |
|
213 | + define('SPCO_JS_URL', plugin_dir_url(__FILE__) . 'js' . DS); |
|
214 | + define('SPCO_INC_PATH', SPCO_BASE_PATH . 'inc' . DS); |
|
215 | + define('SPCO_REG_STEPS_PATH', SPCO_BASE_PATH . 'reg_steps' . DS); |
|
216 | + define('SPCO_TEMPLATES_PATH', SPCO_BASE_PATH . 'templates' . DS); |
|
217 | + EEH_Autoloader::register_autoloaders_for_each_file_in_folder(SPCO_BASE_PATH, true); |
|
218 | + EE_Registry::$i18n_js_strings['registration_expiration_notice'] = EED_Single_Page_Checkout::getRegistrationExpirationNotice( |
|
219 | + ); |
|
220 | + } |
|
221 | + |
|
222 | + |
|
223 | + /** |
|
224 | + * load_reg_steps |
|
225 | + * loads and instantiates each reg step based on the EE_Registry::instance()->CFG->registration->reg_steps array |
|
226 | + * |
|
227 | + * @access private |
|
228 | + * @throws EE_Error |
|
229 | + */ |
|
230 | + public static function load_reg_steps() |
|
231 | + { |
|
232 | + static $reg_steps_loaded = false; |
|
233 | + if ($reg_steps_loaded) { |
|
234 | + return; |
|
235 | + } |
|
236 | + // filter list of reg_steps |
|
237 | + $reg_steps_to_load = (array) apply_filters( |
|
238 | + 'AHEE__SPCO__load_reg_steps__reg_steps_to_load', |
|
239 | + EED_Single_Page_Checkout::get_reg_steps() |
|
240 | + ); |
|
241 | + // sort by key (order) |
|
242 | + ksort($reg_steps_to_load); |
|
243 | + // loop through folders |
|
244 | + foreach ($reg_steps_to_load as $order => $reg_step) { |
|
245 | + // we need a |
|
246 | + if (isset($reg_step['file_path'], $reg_step['class_name'], $reg_step['slug'])) { |
|
247 | + // copy over to the reg_steps_array |
|
248 | + EED_Single_Page_Checkout::$_reg_steps_array[ $order ] = $reg_step; |
|
249 | + // register custom key route for each reg step |
|
250 | + // ie: step=>"slug" - this is the entire reason we load the reg steps array now |
|
251 | + EE_Config::register_route( |
|
252 | + $reg_step['slug'], |
|
253 | + 'EED_Single_Page_Checkout', |
|
254 | + 'run', |
|
255 | + 'step' |
|
256 | + ); |
|
257 | + // add AJAX or other hooks |
|
258 | + if (isset($reg_step['has_hooks']) && $reg_step['has_hooks']) { |
|
259 | + // setup autoloaders if necessary |
|
260 | + if (! class_exists($reg_step['class_name'])) { |
|
261 | + EEH_Autoloader::register_autoloaders_for_each_file_in_folder( |
|
262 | + $reg_step['file_path'], |
|
263 | + true |
|
264 | + ); |
|
265 | + } |
|
266 | + if (is_callable($reg_step['class_name'], 'set_hooks')) { |
|
267 | + call_user_func(array($reg_step['class_name'], 'set_hooks')); |
|
268 | + } |
|
269 | + } |
|
270 | + } |
|
271 | + } |
|
272 | + $reg_steps_loaded = true; |
|
273 | + } |
|
274 | + |
|
275 | + |
|
276 | + /** |
|
277 | + * get_reg_steps |
|
278 | + * |
|
279 | + * @access public |
|
280 | + * @return array |
|
281 | + */ |
|
282 | + public static function get_reg_steps() |
|
283 | + { |
|
284 | + $reg_steps = EE_Registry::instance()->CFG->registration->reg_steps; |
|
285 | + if (empty($reg_steps)) { |
|
286 | + $reg_steps = array( |
|
287 | + 10 => array( |
|
288 | + 'file_path' => SPCO_REG_STEPS_PATH . 'attendee_information', |
|
289 | + 'class_name' => 'EE_SPCO_Reg_Step_Attendee_Information', |
|
290 | + 'slug' => 'attendee_information', |
|
291 | + 'has_hooks' => false, |
|
292 | + ), |
|
293 | + 30 => array( |
|
294 | + 'file_path' => SPCO_REG_STEPS_PATH . 'payment_options', |
|
295 | + 'class_name' => 'EE_SPCO_Reg_Step_Payment_Options', |
|
296 | + 'slug' => 'payment_options', |
|
297 | + 'has_hooks' => true, |
|
298 | + ), |
|
299 | + 999 => array( |
|
300 | + 'file_path' => SPCO_REG_STEPS_PATH . 'finalize_registration', |
|
301 | + 'class_name' => 'EE_SPCO_Reg_Step_Finalize_Registration', |
|
302 | + 'slug' => 'finalize_registration', |
|
303 | + 'has_hooks' => false, |
|
304 | + ), |
|
305 | + ); |
|
306 | + } |
|
307 | + return $reg_steps; |
|
308 | + } |
|
309 | + |
|
310 | + |
|
311 | + /** |
|
312 | + * registration_checkout_for_admin |
|
313 | + * |
|
314 | + * @access public |
|
315 | + * @return string |
|
316 | + * @throws EE_Error |
|
317 | + */ |
|
318 | + public static function registration_checkout_for_admin() |
|
319 | + { |
|
320 | + EED_Single_Page_Checkout::load_request_handler(); |
|
321 | + EE_Registry::instance()->REQ->set('step', 'attendee_information'); |
|
322 | + EE_Registry::instance()->REQ->set('action', 'display_spco_reg_step'); |
|
323 | + EE_Registry::instance()->REQ->set('process_form_submission', false); |
|
324 | + EED_Single_Page_Checkout::instance()->_initialize(); |
|
325 | + EED_Single_Page_Checkout::instance()->_display_spco_reg_form(); |
|
326 | + return EE_Registry::instance()->REQ->get_output(); |
|
327 | + } |
|
328 | + |
|
329 | + |
|
330 | + /** |
|
331 | + * process_registration_from_admin |
|
332 | + * |
|
333 | + * @access public |
|
334 | + * @return \EE_Transaction |
|
335 | + * @throws EE_Error |
|
336 | + */ |
|
337 | + public static function process_registration_from_admin() |
|
338 | + { |
|
339 | + EED_Single_Page_Checkout::load_request_handler(); |
|
340 | + EE_Registry::instance()->REQ->set('step', 'attendee_information'); |
|
341 | + EE_Registry::instance()->REQ->set('action', 'process_reg_step'); |
|
342 | + EE_Registry::instance()->REQ->set('process_form_submission', true); |
|
343 | + EED_Single_Page_Checkout::instance()->_initialize(); |
|
344 | + if (EED_Single_Page_Checkout::instance()->checkout->current_step->completed()) { |
|
345 | + $final_reg_step = end(EED_Single_Page_Checkout::instance()->checkout->reg_steps); |
|
346 | + if ($final_reg_step instanceof EE_SPCO_Reg_Step_Finalize_Registration) { |
|
347 | + EED_Single_Page_Checkout::instance()->checkout->set_reg_step_initiated($final_reg_step); |
|
348 | + if ($final_reg_step->process_reg_step()) { |
|
349 | + $final_reg_step->set_completed(); |
|
350 | + EED_Single_Page_Checkout::instance()->checkout->update_txn_reg_steps_array(); |
|
351 | + return EED_Single_Page_Checkout::instance()->checkout->transaction; |
|
352 | + } |
|
353 | + } |
|
354 | + } |
|
355 | + return null; |
|
356 | + } |
|
357 | + |
|
358 | + |
|
359 | + /** |
|
360 | + * run |
|
361 | + * |
|
362 | + * @access public |
|
363 | + * @param WP_Query $WP_Query |
|
364 | + * @return void |
|
365 | + * @throws EE_Error |
|
366 | + */ |
|
367 | + public function run($WP_Query) |
|
368 | + { |
|
369 | + if ($WP_Query instanceof WP_Query |
|
370 | + && $WP_Query->is_main_query() |
|
371 | + && apply_filters('FHEE__EED_Single_Page_Checkout__run', true) |
|
372 | + && $this->_is_reg_checkout() |
|
373 | + ) { |
|
374 | + $this->_initialize(); |
|
375 | + } |
|
376 | + } |
|
377 | + |
|
378 | + |
|
379 | + /** |
|
380 | + * determines whether current url matches reg page url |
|
381 | + * |
|
382 | + * @return bool |
|
383 | + */ |
|
384 | + protected function _is_reg_checkout() |
|
385 | + { |
|
386 | + // get current permalink for reg page without any extra query args |
|
387 | + $reg_page_url = \get_permalink(EE_Config::instance()->core->reg_page_id); |
|
388 | + // get request URI for current request, but without the scheme or host |
|
389 | + $current_request_uri = \EEH_URL::filter_input_server_url('REQUEST_URI'); |
|
390 | + $current_request_uri = html_entity_decode($current_request_uri); |
|
391 | + // get array of query args from the current request URI |
|
392 | + $query_args = \EEH_URL::get_query_string($current_request_uri); |
|
393 | + // grab page id if it is set |
|
394 | + $page_id = isset($query_args['page_id']) ? absint($query_args['page_id']) : 0; |
|
395 | + // and remove the page id from the query args (we will re-add it later) |
|
396 | + unset($query_args['page_id']); |
|
397 | + // now strip all query args from current request URI |
|
398 | + $current_request_uri = remove_query_arg(array_keys($query_args), $current_request_uri); |
|
399 | + // and re-add the page id if it was set |
|
400 | + if ($page_id) { |
|
401 | + $current_request_uri = add_query_arg('page_id', $page_id, $current_request_uri); |
|
402 | + } |
|
403 | + // remove slashes and ? |
|
404 | + $current_request_uri = trim($current_request_uri, '?/'); |
|
405 | + // is current request URI part of the known full reg page URL ? |
|
406 | + return ! empty($current_request_uri) && strpos($reg_page_url, $current_request_uri) !== false; |
|
407 | + } |
|
408 | + |
|
409 | + |
|
410 | + /** |
|
411 | + * @param WP_Query $wp_query |
|
412 | + * @return void |
|
413 | + * @throws EE_Error |
|
414 | + */ |
|
415 | + public static function init($wp_query) |
|
416 | + { |
|
417 | + EED_Single_Page_Checkout::instance()->run($wp_query); |
|
418 | + } |
|
419 | + |
|
420 | + |
|
421 | + /** |
|
422 | + * _initialize - initial module setup |
|
423 | + * |
|
424 | + * @access private |
|
425 | + * @throws EE_Error |
|
426 | + * @return void |
|
427 | + */ |
|
428 | + private function _initialize() |
|
429 | + { |
|
430 | + // ensure SPCO doesn't run twice |
|
431 | + if (EED_Single_Page_Checkout::$_initialized) { |
|
432 | + return; |
|
433 | + } |
|
434 | + try { |
|
435 | + EED_Single_Page_Checkout::load_reg_steps(); |
|
436 | + $this->_verify_session(); |
|
437 | + // setup the EE_Checkout object |
|
438 | + $this->checkout = $this->_initialize_checkout(); |
|
439 | + // filter checkout |
|
440 | + $this->checkout = apply_filters('FHEE__EED_Single_Page_Checkout___initialize__checkout', $this->checkout); |
|
441 | + // get the $_GET |
|
442 | + $this->_get_request_vars(); |
|
443 | + if ($this->_block_bots()) { |
|
444 | + return; |
|
445 | + } |
|
446 | + // filter continue_reg |
|
447 | + $this->checkout->continue_reg = apply_filters( |
|
448 | + 'FHEE__EED_Single_Page_Checkout__init___continue_reg', |
|
449 | + true, |
|
450 | + $this->checkout |
|
451 | + ); |
|
452 | + // load the reg steps array |
|
453 | + if (! $this->_load_and_instantiate_reg_steps()) { |
|
454 | + EED_Single_Page_Checkout::$_initialized = true; |
|
455 | + return; |
|
456 | + } |
|
457 | + // set the current step |
|
458 | + $this->checkout->set_current_step($this->checkout->step); |
|
459 | + // and the next step |
|
460 | + $this->checkout->set_next_step(); |
|
461 | + // verify that everything has been setup correctly |
|
462 | + if (! ($this->_verify_transaction_and_get_registrations() && $this->_final_verifications())) { |
|
463 | + EED_Single_Page_Checkout::$_initialized = true; |
|
464 | + return; |
|
465 | + } |
|
466 | + // lock the transaction |
|
467 | + $this->checkout->transaction->lock(); |
|
468 | + // make sure all of our cached objects are added to their respective model entity mappers |
|
469 | + $this->checkout->refresh_all_entities(); |
|
470 | + // set amount owing |
|
471 | + $this->checkout->amount_owing = $this->checkout->transaction->remaining(); |
|
472 | + // initialize each reg step, which gives them the chance to potentially alter the process |
|
473 | + $this->_initialize_reg_steps(); |
|
474 | + // DEBUG LOG |
|
475 | + // $this->checkout->log( __CLASS__, __FUNCTION__, __LINE__ ); |
|
476 | + // get reg form |
|
477 | + if (! $this->_check_form_submission()) { |
|
478 | + EED_Single_Page_Checkout::$_initialized = true; |
|
479 | + return; |
|
480 | + } |
|
481 | + // checkout the action!!! |
|
482 | + $this->_process_form_action(); |
|
483 | + // add some style and make it dance |
|
484 | + $this->add_styles_and_scripts(); |
|
485 | + // kk... SPCO has successfully run |
|
486 | + EED_Single_Page_Checkout::$_initialized = true; |
|
487 | + // set no cache headers and constants |
|
488 | + EE_System::do_not_cache(); |
|
489 | + // add anchor |
|
490 | + add_action('loop_start', array($this, 'set_checkout_anchor'), 1); |
|
491 | + // remove transaction lock |
|
492 | + add_action('shutdown', array($this, 'unlock_transaction'), 1); |
|
493 | + } catch (Exception $e) { |
|
494 | + EE_Error::add_error($e->getMessage(), __FILE__, __FUNCTION__, __LINE__); |
|
495 | + } |
|
496 | + } |
|
497 | + |
|
498 | + |
|
499 | + /** |
|
500 | + * _verify_session |
|
501 | + * checks that the session is valid and not expired |
|
502 | + * |
|
503 | + * @access private |
|
504 | + * @throws EE_Error |
|
505 | + */ |
|
506 | + private function _verify_session() |
|
507 | + { |
|
508 | + if (! EE_Registry::instance()->SSN instanceof EE_Session) { |
|
509 | + throw new EE_Error(esc_html__('The EE_Session class could not be loaded.', 'event_espresso')); |
|
510 | + } |
|
511 | + $clear_session_requested = filter_var( |
|
512 | + EE_Registry::instance()->REQ->get('clear_session', false), |
|
513 | + FILTER_VALIDATE_BOOLEAN |
|
514 | + ); |
|
515 | + // is session still valid ? |
|
516 | + if ($clear_session_requested |
|
517 | + || (EE_Registry::instance()->SSN->expired() |
|
518 | + && EE_Registry::instance()->REQ->get('e_reg_url_link', '') === '' |
|
519 | + ) |
|
520 | + ) { |
|
521 | + $this->checkout = new EE_Checkout(); |
|
522 | + EE_Registry::instance()->SSN->clear_session(__CLASS__, __FUNCTION__); |
|
523 | + // EE_Registry::instance()->SSN->reset_cart(); |
|
524 | + // EE_Registry::instance()->SSN->reset_checkout(); |
|
525 | + // EE_Registry::instance()->SSN->reset_transaction(); |
|
526 | + if (! $clear_session_requested) { |
|
527 | + EE_Error::add_attention( |
|
528 | + EE_Registry::$i18n_js_strings['registration_expiration_notice'], |
|
529 | + __FILE__, |
|
530 | + __FUNCTION__, |
|
531 | + __LINE__ |
|
532 | + ); |
|
533 | + } |
|
534 | + // EE_Registry::instance()->SSN->reset_expired(); |
|
535 | + } |
|
536 | + } |
|
537 | + |
|
538 | + |
|
539 | + /** |
|
540 | + * _initialize_checkout |
|
541 | + * loads and instantiates EE_Checkout |
|
542 | + * |
|
543 | + * @access private |
|
544 | + * @throws EE_Error |
|
545 | + * @return EE_Checkout |
|
546 | + */ |
|
547 | + private function _initialize_checkout() |
|
548 | + { |
|
549 | + // look in session for existing checkout |
|
550 | + /** @type EE_Checkout $checkout */ |
|
551 | + $checkout = EE_Registry::instance()->SSN->checkout(); |
|
552 | + // verify |
|
553 | + if (! $checkout instanceof EE_Checkout) { |
|
554 | + // instantiate EE_Checkout object for handling the properties of the current checkout process |
|
555 | + $checkout = EE_Registry::instance()->load_file( |
|
556 | + SPCO_INC_PATH, |
|
557 | + 'EE_Checkout', |
|
558 | + 'class', |
|
559 | + array(), |
|
560 | + false |
|
561 | + ); |
|
562 | + } else { |
|
563 | + if ($checkout->current_step->is_final_step() && $checkout->exit_spco() === true) { |
|
564 | + $this->unlock_transaction(); |
|
565 | + wp_safe_redirect($checkout->redirect_url); |
|
566 | + exit(); |
|
567 | + } |
|
568 | + } |
|
569 | + $checkout = apply_filters('FHEE__EED_Single_Page_Checkout___initialize_checkout__checkout', $checkout); |
|
570 | + // verify again |
|
571 | + if (! $checkout instanceof EE_Checkout) { |
|
572 | + throw new EE_Error(esc_html__('The EE_Checkout class could not be loaded.', 'event_espresso')); |
|
573 | + } |
|
574 | + // reset anything that needs a clean slate for each request |
|
575 | + $checkout->reset_for_current_request(); |
|
576 | + return $checkout; |
|
577 | + } |
|
578 | + |
|
579 | + |
|
580 | + /** |
|
581 | + * _get_request_vars |
|
582 | + * |
|
583 | + * @access private |
|
584 | + * @return void |
|
585 | + * @throws EE_Error |
|
586 | + */ |
|
587 | + private function _get_request_vars() |
|
588 | + { |
|
589 | + // load classes |
|
590 | + EED_Single_Page_Checkout::load_request_handler(); |
|
591 | + // make sure this request is marked as belonging to EE |
|
592 | + EE_Registry::instance()->REQ->set_espresso_page(true); |
|
593 | + // which step is being requested ? |
|
594 | + $this->checkout->step = EE_Registry::instance()->REQ->get('step', $this->_get_first_step()); |
|
595 | + // which step is being edited ? |
|
596 | + $this->checkout->edit_step = EE_Registry::instance()->REQ->get('edit_step', ''); |
|
597 | + // and what we're doing on the current step |
|
598 | + $this->checkout->action = EE_Registry::instance()->REQ->get('action', 'display_spco_reg_step'); |
|
599 | + // timestamp |
|
600 | + $this->checkout->uts = EE_Registry::instance()->REQ->get('uts', 0); |
|
601 | + // returning to edit ? |
|
602 | + $this->checkout->reg_url_link = EE_Registry::instance()->REQ->get('e_reg_url_link', ''); |
|
603 | + // add reg url link to registration query params |
|
604 | + if ($this->checkout->reg_url_link && strpos($this->checkout->reg_url_link, '1-') !== 0) { |
|
605 | + $this->checkout->reg_cache_where_params[0]['REG_url_link'] = $this->checkout->reg_url_link; |
|
606 | + } |
|
607 | + // or some other kind of revisit ? |
|
608 | + $this->checkout->revisit = filter_var( |
|
609 | + EE_Registry::instance()->REQ->get('revisit', false), |
|
610 | + FILTER_VALIDATE_BOOLEAN |
|
611 | + ); |
|
612 | + // and whether or not to generate a reg form for this request |
|
613 | + $this->checkout->generate_reg_form = filter_var( |
|
614 | + EE_Registry::instance()->REQ->get('generate_reg_form', true), |
|
615 | + FILTER_VALIDATE_BOOLEAN |
|
616 | + ); |
|
617 | + // and whether or not to process a reg form submission for this request |
|
618 | + $this->checkout->process_form_submission = filter_var( |
|
619 | + EE_Registry::instance()->REQ->get( |
|
620 | + 'process_form_submission', |
|
621 | + $this->checkout->action === 'process_reg_step' |
|
622 | + ), |
|
623 | + FILTER_VALIDATE_BOOLEAN |
|
624 | + ); |
|
625 | + $this->checkout->process_form_submission = filter_var( |
|
626 | + $this->checkout->action !== 'display_spco_reg_step' |
|
627 | + ? $this->checkout->process_form_submission |
|
628 | + : false, |
|
629 | + FILTER_VALIDATE_BOOLEAN |
|
630 | + ); |
|
631 | + // $this->_display_request_vars(); |
|
632 | + } |
|
633 | + |
|
634 | + |
|
635 | + /** |
|
636 | + * _display_request_vars |
|
637 | + * |
|
638 | + * @access protected |
|
639 | + * @return void |
|
640 | + */ |
|
641 | + protected function _display_request_vars() |
|
642 | + { |
|
643 | + if (! WP_DEBUG) { |
|
644 | + return; |
|
645 | + } |
|
646 | + EEH_Debug_Tools::printr($_REQUEST, '$_REQUEST', __FILE__, __LINE__); |
|
647 | + EEH_Debug_Tools::printr($this->checkout->step, '$this->checkout->step', __FILE__, __LINE__); |
|
648 | + EEH_Debug_Tools::printr($this->checkout->edit_step, '$this->checkout->edit_step', __FILE__, __LINE__); |
|
649 | + EEH_Debug_Tools::printr($this->checkout->action, '$this->checkout->action', __FILE__, __LINE__); |
|
650 | + EEH_Debug_Tools::printr($this->checkout->reg_url_link, '$this->checkout->reg_url_link', __FILE__, __LINE__); |
|
651 | + EEH_Debug_Tools::printr($this->checkout->revisit, '$this->checkout->revisit', __FILE__, __LINE__); |
|
652 | + EEH_Debug_Tools::printr( |
|
653 | + $this->checkout->generate_reg_form, |
|
654 | + '$this->checkout->generate_reg_form', |
|
655 | + __FILE__, |
|
656 | + __LINE__ |
|
657 | + ); |
|
658 | + EEH_Debug_Tools::printr( |
|
659 | + $this->checkout->process_form_submission, |
|
660 | + '$this->checkout->process_form_submission', |
|
661 | + __FILE__, |
|
662 | + __LINE__ |
|
663 | + ); |
|
664 | + } |
|
665 | + |
|
666 | + |
|
667 | + /** |
|
668 | + * _block_bots |
|
669 | + * checks that the incoming request has either of the following set: |
|
670 | + * a uts (unix timestamp) which indicates that the request was redirected from the Ticket Selector |
|
671 | + * a REG URL Link, which indicates that the request is a return visit to SPCO for a valid TXN |
|
672 | + * so if you're not coming from the Ticket Selector nor returning for a valid IP... |
|
673 | + * then where you coming from man? |
|
674 | + * |
|
675 | + * @return boolean |
|
676 | + */ |
|
677 | + private function _block_bots() |
|
678 | + { |
|
679 | + $invalid_checkout_access = EED_Invalid_Checkout_Access::getInvalidCheckoutAccess(); |
|
680 | + if ($invalid_checkout_access->checkoutAccessIsInvalid($this->checkout)) { |
|
681 | + return true; |
|
682 | + } |
|
683 | + return false; |
|
684 | + } |
|
685 | + |
|
686 | + |
|
687 | + /** |
|
688 | + * _get_first_step |
|
689 | + * gets slug for first step in $_reg_steps_array |
|
690 | + * |
|
691 | + * @access private |
|
692 | + * @throws EE_Error |
|
693 | + * @return string |
|
694 | + */ |
|
695 | + private function _get_first_step() |
|
696 | + { |
|
697 | + $first_step = reset(EED_Single_Page_Checkout::$_reg_steps_array); |
|
698 | + return isset($first_step['slug']) ? $first_step['slug'] : 'attendee_information'; |
|
699 | + } |
|
700 | + |
|
701 | + |
|
702 | + /** |
|
703 | + * instantiates each reg step based on the loaded reg_steps array |
|
704 | + * |
|
705 | + * @return bool |
|
706 | + * @throws EE_Error |
|
707 | + * @throws InvalidArgumentException |
|
708 | + * @throws InvalidDataTypeException |
|
709 | + * @throws InvalidInterfaceException |
|
710 | + */ |
|
711 | + private function _load_and_instantiate_reg_steps() |
|
712 | + { |
|
713 | + do_action('AHEE__Single_Page_Checkout___load_and_instantiate_reg_steps__start', $this->checkout); |
|
714 | + // have reg_steps already been instantiated ? |
|
715 | + if (empty($this->checkout->reg_steps) |
|
716 | + || apply_filters('FHEE__Single_Page_Checkout__load_reg_steps__reload_reg_steps', false, $this->checkout) |
|
717 | + ) { |
|
718 | + // if not, then loop through raw reg steps array |
|
719 | + foreach (EED_Single_Page_Checkout::$_reg_steps_array as $order => $reg_step) { |
|
720 | + if (! $this->_load_and_instantiate_reg_step($reg_step, $order)) { |
|
721 | + return false; |
|
722 | + } |
|
723 | + } |
|
724 | + if (isset($this->checkout->reg_steps['registration_confirmation'])) { |
|
725 | + // skip the registration_confirmation page ? |
|
726 | + if (EE_Registry::instance()->CFG->registration->skip_reg_confirmation) { |
|
727 | + // just remove it from the reg steps array |
|
728 | + $this->checkout->remove_reg_step('registration_confirmation', false); |
|
729 | + } elseif (EE_Registry::instance()->CFG->registration->reg_confirmation_last |
|
730 | + ) { |
|
731 | + // set the order to something big like 100 |
|
732 | + $this->checkout->set_reg_step_order('registration_confirmation', 100); |
|
733 | + } |
|
734 | + } |
|
735 | + // filter the array for good luck |
|
736 | + $this->checkout->reg_steps = apply_filters( |
|
737 | + 'FHEE__Single_Page_Checkout__load_reg_steps__reg_steps', |
|
738 | + $this->checkout->reg_steps |
|
739 | + ); |
|
740 | + // finally re-sort based on the reg step class order properties |
|
741 | + $this->checkout->sort_reg_steps(); |
|
742 | + } else { |
|
743 | + foreach ($this->checkout->reg_steps as $reg_step) { |
|
744 | + // set all current step stati to FALSE |
|
745 | + $reg_step->set_is_current_step(false); |
|
746 | + } |
|
747 | + } |
|
748 | + if (empty($this->checkout->reg_steps)) { |
|
749 | + EE_Error::add_error( |
|
750 | + esc_html__('No Reg Steps were loaded..', 'event_espresso'), |
|
751 | + __FILE__, |
|
752 | + __FUNCTION__, |
|
753 | + __LINE__ |
|
754 | + ); |
|
755 | + return false; |
|
756 | + } |
|
757 | + // make reg step details available to JS |
|
758 | + $this->checkout->set_reg_step_JSON_info(); |
|
759 | + return true; |
|
760 | + } |
|
761 | + |
|
762 | + |
|
763 | + /** |
|
764 | + * _load_and_instantiate_reg_step |
|
765 | + * |
|
766 | + * @access private |
|
767 | + * @param array $reg_step |
|
768 | + * @param int $order |
|
769 | + * @return bool |
|
770 | + */ |
|
771 | + private function _load_and_instantiate_reg_step($reg_step = array(), $order = 0) |
|
772 | + { |
|
773 | + // we need a file_path, class_name, and slug to add a reg step |
|
774 | + if (isset($reg_step['file_path'], $reg_step['class_name'], $reg_step['slug'])) { |
|
775 | + // if editing a specific step, but this is NOT that step... (and it's not the 'finalize_registration' step) |
|
776 | + if ($this->checkout->reg_url_link |
|
777 | + && $this->checkout->step !== $reg_step['slug'] |
|
778 | + && $reg_step['slug'] !== 'finalize_registration' |
|
779 | + // normally at this point we would NOT load the reg step, but this filter can change that |
|
780 | + && apply_filters( |
|
781 | + 'FHEE__Single_Page_Checkout___load_and_instantiate_reg_step__bypass_reg_step', |
|
782 | + true, |
|
783 | + $reg_step, |
|
784 | + $this->checkout |
|
785 | + ) |
|
786 | + ) { |
|
787 | + return true; |
|
788 | + } |
|
789 | + // instantiate step class using file path and class name |
|
790 | + $reg_step_obj = EE_Registry::instance()->load_file( |
|
791 | + $reg_step['file_path'], |
|
792 | + $reg_step['class_name'], |
|
793 | + 'class', |
|
794 | + $this->checkout, |
|
795 | + false |
|
796 | + ); |
|
797 | + // did we gets the goods ? |
|
798 | + if ($reg_step_obj instanceof EE_SPCO_Reg_Step) { |
|
799 | + // set reg step order based on config |
|
800 | + $reg_step_obj->set_order($order); |
|
801 | + // add instantiated reg step object to the master reg steps array |
|
802 | + $this->checkout->add_reg_step($reg_step_obj); |
|
803 | + } else { |
|
804 | + EE_Error::add_error( |
|
805 | + esc_html__('The current step could not be set.', 'event_espresso'), |
|
806 | + __FILE__, |
|
807 | + __FUNCTION__, |
|
808 | + __LINE__ |
|
809 | + ); |
|
810 | + return false; |
|
811 | + } |
|
812 | + } else { |
|
813 | + if (WP_DEBUG) { |
|
814 | + EE_Error::add_error( |
|
815 | + sprintf( |
|
816 | + esc_html__( |
|
817 | + 'A registration step could not be loaded. One or more of the following data points is invalid:%4$s%5$sFile Path: %1$s%6$s%5$sClass Name: %2$s%6$s%5$sSlug: %3$s%6$s%7$s', |
|
818 | + 'event_espresso' |
|
819 | + ), |
|
820 | + isset($reg_step['file_path']) ? $reg_step['file_path'] : '', |
|
821 | + isset($reg_step['class_name']) ? $reg_step['class_name'] : '', |
|
822 | + isset($reg_step['slug']) ? $reg_step['slug'] : '', |
|
823 | + '<ul>', |
|
824 | + '<li>', |
|
825 | + '</li>', |
|
826 | + '</ul>' |
|
827 | + ), |
|
828 | + __FILE__, |
|
829 | + __FUNCTION__, |
|
830 | + __LINE__ |
|
831 | + ); |
|
832 | + } |
|
833 | + return false; |
|
834 | + } |
|
835 | + return true; |
|
836 | + } |
|
837 | + |
|
838 | + |
|
839 | + /** |
|
840 | + * _verify_transaction_and_get_registrations |
|
841 | + * |
|
842 | + * @access private |
|
843 | + * @return bool |
|
844 | + * @throws InvalidDataTypeException |
|
845 | + * @throws InvalidEntityException |
|
846 | + * @throws EE_Error |
|
847 | + */ |
|
848 | + private function _verify_transaction_and_get_registrations() |
|
849 | + { |
|
850 | + // was there already a valid transaction in the checkout from the session ? |
|
851 | + if (! $this->checkout->transaction instanceof EE_Transaction) { |
|
852 | + // get transaction from db or session |
|
853 | + $this->checkout->transaction = $this->checkout->reg_url_link && ! is_admin() |
|
854 | + ? $this->_get_transaction_and_cart_for_previous_visit() |
|
855 | + : $this->_get_cart_for_current_session_and_setup_new_transaction(); |
|
856 | + if (! $this->checkout->transaction instanceof EE_Transaction) { |
|
857 | + EE_Error::add_error( |
|
858 | + esc_html__( |
|
859 | + 'Your Registration and Transaction information could not be retrieved from the db.', |
|
860 | + 'event_espresso' |
|
861 | + ), |
|
862 | + __FILE__, |
|
863 | + __FUNCTION__, |
|
864 | + __LINE__ |
|
865 | + ); |
|
866 | + $this->checkout->transaction = EE_Transaction::new_instance(); |
|
867 | + // add some style and make it dance |
|
868 | + $this->add_styles_and_scripts(); |
|
869 | + EED_Single_Page_Checkout::$_initialized = true; |
|
870 | + return false; |
|
871 | + } |
|
872 | + // and the registrations for the transaction |
|
873 | + $this->_get_registrations($this->checkout->transaction); |
|
874 | + } |
|
875 | + return true; |
|
876 | + } |
|
877 | + |
|
878 | + |
|
879 | + /** |
|
880 | + * _get_transaction_and_cart_for_previous_visit |
|
881 | + * |
|
882 | + * @access private |
|
883 | + * @return mixed EE_Transaction|NULL |
|
884 | + */ |
|
885 | + private function _get_transaction_and_cart_for_previous_visit() |
|
886 | + { |
|
887 | + /** @var $TXN_model EEM_Transaction */ |
|
888 | + $TXN_model = EE_Registry::instance()->load_model('Transaction'); |
|
889 | + // because the reg_url_link is present in the request, |
|
890 | + // this is a return visit to SPCO, so we'll get the transaction data from the db |
|
891 | + $transaction = $TXN_model->get_transaction_from_reg_url_link($this->checkout->reg_url_link); |
|
892 | + // verify transaction |
|
893 | + if ($transaction instanceof EE_Transaction) { |
|
894 | + // and get the cart that was used for that transaction |
|
895 | + $this->checkout->cart = $this->_get_cart_for_transaction($transaction); |
|
896 | + return $transaction; |
|
897 | + } |
|
898 | + EE_Error::add_error( |
|
899 | + esc_html__('Your Registration and Transaction information could not be retrieved from the db.', 'event_espresso'), |
|
900 | + __FILE__, |
|
901 | + __FUNCTION__, |
|
902 | + __LINE__ |
|
903 | + ); |
|
904 | + return null; |
|
905 | + } |
|
906 | + |
|
907 | + |
|
908 | + /** |
|
909 | + * _get_cart_for_transaction |
|
910 | + * |
|
911 | + * @access private |
|
912 | + * @param EE_Transaction $transaction |
|
913 | + * @return EE_Cart |
|
914 | + */ |
|
915 | + private function _get_cart_for_transaction($transaction) |
|
916 | + { |
|
917 | + return $this->checkout->get_cart_for_transaction($transaction); |
|
918 | + } |
|
919 | + |
|
920 | + |
|
921 | + /** |
|
922 | + * get_cart_for_transaction |
|
923 | + * |
|
924 | + * @access public |
|
925 | + * @param EE_Transaction $transaction |
|
926 | + * @return EE_Cart |
|
927 | + */ |
|
928 | + public function get_cart_for_transaction(EE_Transaction $transaction) |
|
929 | + { |
|
930 | + return $this->checkout->get_cart_for_transaction($transaction); |
|
931 | + } |
|
932 | + |
|
933 | + |
|
934 | + /** |
|
935 | + * _get_transaction_and_cart_for_current_session |
|
936 | + * generates a new EE_Transaction object and adds it to the $_transaction property. |
|
937 | + * |
|
938 | + * @access private |
|
939 | + * @return EE_Transaction |
|
940 | + * @throws EE_Error |
|
941 | + */ |
|
942 | + private function _get_cart_for_current_session_and_setup_new_transaction() |
|
943 | + { |
|
944 | + // if there's no transaction, then this is the FIRST visit to SPCO |
|
945 | + // so load up the cart ( passing nothing for the TXN because it doesn't exist yet ) |
|
946 | + $this->checkout->cart = $this->_get_cart_for_transaction(null); |
|
947 | + // and then create a new transaction |
|
948 | + $transaction = $this->_initialize_transaction(); |
|
949 | + // verify transaction |
|
950 | + if ($transaction instanceof EE_Transaction) { |
|
951 | + // save it so that we have an ID for other objects to use |
|
952 | + $transaction->save(); |
|
953 | + // and save TXN data to the cart |
|
954 | + $this->checkout->cart->get_grand_total()->save_this_and_descendants_to_txn($transaction->ID()); |
|
955 | + } else { |
|
956 | + EE_Error::add_error( |
|
957 | + esc_html__('A Valid Transaction could not be initialized.', 'event_espresso'), |
|
958 | + __FILE__, |
|
959 | + __FUNCTION__, |
|
960 | + __LINE__ |
|
961 | + ); |
|
962 | + } |
|
963 | + return $transaction; |
|
964 | + } |
|
965 | + |
|
966 | + |
|
967 | + /** |
|
968 | + * generates a new EE_Transaction object and adds it to the $_transaction property. |
|
969 | + * |
|
970 | + * @access private |
|
971 | + * @return mixed EE_Transaction|NULL |
|
972 | + */ |
|
973 | + private function _initialize_transaction() |
|
974 | + { |
|
975 | + try { |
|
976 | + // ensure cart totals have been calculated |
|
977 | + $this->checkout->cart->get_grand_total()->recalculate_total_including_taxes(); |
|
978 | + // grab the cart grand total |
|
979 | + $cart_total = $this->checkout->cart->get_cart_grand_total(); |
|
980 | + // create new TXN |
|
981 | + $transaction = EE_Transaction::new_instance( |
|
982 | + array( |
|
983 | + 'TXN_reg_steps' => $this->checkout->initialize_txn_reg_steps_array(), |
|
984 | + 'TXN_total' => $cart_total > 0 ? $cart_total : 0, |
|
985 | + 'TXN_paid' => 0, |
|
986 | + 'STS_ID' => EEM_Transaction::failed_status_code, |
|
987 | + ) |
|
988 | + ); |
|
989 | + // save it so that we have an ID for other objects to use |
|
990 | + $transaction->save(); |
|
991 | + // set cron job for following up on TXNs after their session has expired |
|
992 | + EE_Cron_Tasks::schedule_expired_transaction_check( |
|
993 | + EE_Registry::instance()->SSN->expiration() + 1, |
|
994 | + $transaction->ID() |
|
995 | + ); |
|
996 | + return $transaction; |
|
997 | + } catch (Exception $e) { |
|
998 | + EE_Error::add_error($e->getMessage(), __FILE__, __FUNCTION__, __LINE__); |
|
999 | + } |
|
1000 | + return null; |
|
1001 | + } |
|
1002 | + |
|
1003 | + |
|
1004 | + /** |
|
1005 | + * _get_registrations |
|
1006 | + * |
|
1007 | + * @access private |
|
1008 | + * @param EE_Transaction $transaction |
|
1009 | + * @return void |
|
1010 | + * @throws InvalidDataTypeException |
|
1011 | + * @throws InvalidEntityException |
|
1012 | + * @throws EE_Error |
|
1013 | + */ |
|
1014 | + private function _get_registrations(EE_Transaction $transaction) |
|
1015 | + { |
|
1016 | + // first step: grab the registrants { : o |
|
1017 | + $registrations = $transaction->registrations($this->checkout->reg_cache_where_params, false); |
|
1018 | + $this->checkout->total_ticket_count = count($registrations); |
|
1019 | + // verify registrations have been set |
|
1020 | + if (empty($registrations)) { |
|
1021 | + // if no cached registrations, then check the db |
|
1022 | + $registrations = $transaction->registrations($this->checkout->reg_cache_where_params, false); |
|
1023 | + // still nothing ? well as long as this isn't a revisit |
|
1024 | + if (empty($registrations) && ! $this->checkout->revisit) { |
|
1025 | + // generate new registrations from scratch |
|
1026 | + $registrations = $this->_initialize_registrations($transaction); |
|
1027 | + } |
|
1028 | + } |
|
1029 | + // sort by their original registration order |
|
1030 | + usort($registrations, array('EED_Single_Page_Checkout', 'sort_registrations_by_REG_count')); |
|
1031 | + // then loop thru the array |
|
1032 | + foreach ($registrations as $registration) { |
|
1033 | + // verify each registration |
|
1034 | + if ($registration instanceof EE_Registration) { |
|
1035 | + // we display all attendee info for the primary registrant |
|
1036 | + if ($this->checkout->reg_url_link === $registration->reg_url_link() |
|
1037 | + && $registration->is_primary_registrant() |
|
1038 | + ) { |
|
1039 | + $this->checkout->primary_revisit = true; |
|
1040 | + break; |
|
1041 | + } |
|
1042 | + if ($this->checkout->revisit && $this->checkout->reg_url_link !== $registration->reg_url_link()) { |
|
1043 | + // but hide info if it doesn't belong to you |
|
1044 | + $transaction->clear_cache('Registration', $registration->ID()); |
|
1045 | + $this->checkout->total_ticket_count--; |
|
1046 | + } |
|
1047 | + $this->checkout->set_reg_status_updated($registration->ID(), false); |
|
1048 | + } |
|
1049 | + } |
|
1050 | + } |
|
1051 | + |
|
1052 | + |
|
1053 | + /** |
|
1054 | + * adds related EE_Registration objects for each ticket in the cart to the current EE_Transaction object |
|
1055 | + * |
|
1056 | + * @access private |
|
1057 | + * @param EE_Transaction $transaction |
|
1058 | + * @return array |
|
1059 | + * @throws InvalidDataTypeException |
|
1060 | + * @throws InvalidEntityException |
|
1061 | + * @throws EE_Error |
|
1062 | + */ |
|
1063 | + private function _initialize_registrations(EE_Transaction $transaction) |
|
1064 | + { |
|
1065 | + $att_nmbr = 0; |
|
1066 | + $registrations = array(); |
|
1067 | + if ($transaction instanceof EE_Transaction) { |
|
1068 | + /** @type EE_Registration_Processor $registration_processor */ |
|
1069 | + $registration_processor = EE_Registry::instance()->load_class('Registration_Processor'); |
|
1070 | + $this->checkout->total_ticket_count = $this->checkout->cart->all_ticket_quantity_count(); |
|
1071 | + // now let's add the cart items to the $transaction |
|
1072 | + foreach ($this->checkout->cart->get_tickets() as $line_item) { |
|
1073 | + // do the following for each ticket of this type they selected |
|
1074 | + for ($x = 1; $x <= $line_item->quantity(); $x++) { |
|
1075 | + $att_nmbr++; |
|
1076 | + /** @var EventEspresso\core\services\commands\registration\CreateRegistrationCommand $CreateRegistrationCommand */ |
|
1077 | + $CreateRegistrationCommand = EE_Registry::instance()->create( |
|
1078 | + 'EventEspresso\core\services\commands\registration\CreateRegistrationCommand', |
|
1079 | + array( |
|
1080 | + $transaction, |
|
1081 | + $line_item, |
|
1082 | + $att_nmbr, |
|
1083 | + $this->checkout->total_ticket_count, |
|
1084 | + ) |
|
1085 | + ); |
|
1086 | + // override capabilities for frontend registrations |
|
1087 | + if (! is_admin()) { |
|
1088 | + $CreateRegistrationCommand->setCapCheck( |
|
1089 | + new PublicCapabilities('', 'create_new_registration') |
|
1090 | + ); |
|
1091 | + } |
|
1092 | + $registration = EE_Registry::instance()->BUS->execute($CreateRegistrationCommand); |
|
1093 | + if (! $registration instanceof EE_Registration) { |
|
1094 | + throw new InvalidEntityException($registration, 'EE_Registration'); |
|
1095 | + } |
|
1096 | + $registrations[ $registration->ID() ] = $registration; |
|
1097 | + } |
|
1098 | + } |
|
1099 | + $registration_processor->fix_reg_final_price_rounding_issue($transaction); |
|
1100 | + } |
|
1101 | + return $registrations; |
|
1102 | + } |
|
1103 | + |
|
1104 | + |
|
1105 | + /** |
|
1106 | + * sorts registrations by REG_count |
|
1107 | + * |
|
1108 | + * @access public |
|
1109 | + * @param EE_Registration $reg_A |
|
1110 | + * @param EE_Registration $reg_B |
|
1111 | + * @return int |
|
1112 | + */ |
|
1113 | + public static function sort_registrations_by_REG_count(EE_Registration $reg_A, EE_Registration $reg_B) |
|
1114 | + { |
|
1115 | + // this shouldn't ever happen within the same TXN, but oh well |
|
1116 | + if ($reg_A->count() === $reg_B->count()) { |
|
1117 | + return 0; |
|
1118 | + } |
|
1119 | + return ($reg_A->count() > $reg_B->count()) ? 1 : -1; |
|
1120 | + } |
|
1121 | + |
|
1122 | + |
|
1123 | + /** |
|
1124 | + * _final_verifications |
|
1125 | + * just makes sure that everything is set up correctly before proceeding |
|
1126 | + * |
|
1127 | + * @access private |
|
1128 | + * @return bool |
|
1129 | + * @throws EE_Error |
|
1130 | + */ |
|
1131 | + private function _final_verifications() |
|
1132 | + { |
|
1133 | + // filter checkout |
|
1134 | + $this->checkout = apply_filters( |
|
1135 | + 'FHEE__EED_Single_Page_Checkout___final_verifications__checkout', |
|
1136 | + $this->checkout |
|
1137 | + ); |
|
1138 | + // verify that current step is still set correctly |
|
1139 | + if (! $this->checkout->current_step instanceof EE_SPCO_Reg_Step) { |
|
1140 | + EE_Error::add_error( |
|
1141 | + esc_html__( |
|
1142 | + 'We\'re sorry but the registration process can not proceed because one or more registration steps were not setup correctly. Please refresh the page and try again or contact support.', |
|
1143 | + 'event_espresso' |
|
1144 | + ), |
|
1145 | + __FILE__, |
|
1146 | + __FUNCTION__, |
|
1147 | + __LINE__ |
|
1148 | + ); |
|
1149 | + return false; |
|
1150 | + } |
|
1151 | + // if returning to SPCO, then verify that primary registrant is set |
|
1152 | + if (! empty($this->checkout->reg_url_link)) { |
|
1153 | + $valid_registrant = $this->checkout->transaction->primary_registration(); |
|
1154 | + if (! $valid_registrant instanceof EE_Registration) { |
|
1155 | + EE_Error::add_error( |
|
1156 | + esc_html__( |
|
1157 | + 'We\'re sorry but there appears to be an error with the "reg_url_link" or the primary registrant for this transaction. Please refresh the page and try again or contact support.', |
|
1158 | + 'event_espresso' |
|
1159 | + ), |
|
1160 | + __FILE__, |
|
1161 | + __FUNCTION__, |
|
1162 | + __LINE__ |
|
1163 | + ); |
|
1164 | + return false; |
|
1165 | + } |
|
1166 | + $valid_registrant = null; |
|
1167 | + foreach ($this->checkout->transaction->registrations($this->checkout->reg_cache_where_params) as $registration) { |
|
1168 | + if ($registration instanceof EE_Registration |
|
1169 | + && $registration->reg_url_link() === $this->checkout->reg_url_link |
|
1170 | + ) { |
|
1171 | + $valid_registrant = $registration; |
|
1172 | + } |
|
1173 | + } |
|
1174 | + if (! $valid_registrant instanceof EE_Registration) { |
|
1175 | + // hmmm... maybe we have the wrong session because the user is opening multiple tabs ? |
|
1176 | + if (EED_Single_Page_Checkout::$_checkout_verified) { |
|
1177 | + // clear the session, mark the checkout as unverified, and try again |
|
1178 | + EE_Registry::instance()->SSN->clear_session(__CLASS__, __FUNCTION__); |
|
1179 | + EED_Single_Page_Checkout::$_initialized = false; |
|
1180 | + EED_Single_Page_Checkout::$_checkout_verified = false; |
|
1181 | + $this->_initialize(); |
|
1182 | + EE_Error::reset_notices(); |
|
1183 | + return false; |
|
1184 | + } |
|
1185 | + EE_Error::add_error( |
|
1186 | + esc_html__( |
|
1187 | + 'We\'re sorry but there appears to be an error with the "reg_url_link" or the transaction itself. Please refresh the page and try again or contact support.', |
|
1188 | + 'event_espresso' |
|
1189 | + ), |
|
1190 | + __FILE__, |
|
1191 | + __FUNCTION__, |
|
1192 | + __LINE__ |
|
1193 | + ); |
|
1194 | + return false; |
|
1195 | + } |
|
1196 | + } |
|
1197 | + // now that things have been kinda sufficiently verified, |
|
1198 | + // let's add the checkout to the session so that it's available to other systems |
|
1199 | + EE_Registry::instance()->SSN->set_checkout($this->checkout); |
|
1200 | + return true; |
|
1201 | + } |
|
1202 | + |
|
1203 | + |
|
1204 | + /** |
|
1205 | + * _initialize_reg_steps |
|
1206 | + * first makes sure that EE_Transaction_Processor::set_reg_step_initiated() is called as required |
|
1207 | + * then loops thru all of the active reg steps and calls the initialize_reg_step() method |
|
1208 | + * |
|
1209 | + * @access private |
|
1210 | + * @param bool $reinitializing |
|
1211 | + * @throws EE_Error |
|
1212 | + */ |
|
1213 | + private function _initialize_reg_steps($reinitializing = false) |
|
1214 | + { |
|
1215 | + $this->checkout->set_reg_step_initiated($this->checkout->current_step); |
|
1216 | + // loop thru all steps to call their individual "initialize" methods and set i18n strings for JS |
|
1217 | + foreach ($this->checkout->reg_steps as $reg_step) { |
|
1218 | + if (! $reg_step->initialize_reg_step()) { |
|
1219 | + // if not initialized then maybe this step is being removed... |
|
1220 | + if (! $reinitializing && $reg_step->is_current_step()) { |
|
1221 | + // if it was the current step, then we need to start over here |
|
1222 | + $this->_initialize_reg_steps(true); |
|
1223 | + return; |
|
1224 | + } |
|
1225 | + continue; |
|
1226 | + } |
|
1227 | + // add css and JS for current step |
|
1228 | + $reg_step->enqueue_styles_and_scripts(); |
|
1229 | + // i18n |
|
1230 | + $reg_step->translate_js_strings(); |
|
1231 | + if ($reg_step->is_current_step()) { |
|
1232 | + // the text that appears on the reg step form submit button |
|
1233 | + $reg_step->set_submit_button_text(); |
|
1234 | + } |
|
1235 | + } |
|
1236 | + // dynamically creates hook point like: AHEE__Single_Page_Checkout___initialize_reg_step__attendee_information |
|
1237 | + do_action( |
|
1238 | + "AHEE__Single_Page_Checkout___initialize_reg_step__{$this->checkout->current_step->slug()}", |
|
1239 | + $this->checkout->current_step |
|
1240 | + ); |
|
1241 | + } |
|
1242 | + |
|
1243 | + |
|
1244 | + /** |
|
1245 | + * _check_form_submission |
|
1246 | + * |
|
1247 | + * @access private |
|
1248 | + * @return boolean |
|
1249 | + */ |
|
1250 | + private function _check_form_submission() |
|
1251 | + { |
|
1252 | + // does this request require the reg form to be generated ? |
|
1253 | + if ($this->checkout->generate_reg_form) { |
|
1254 | + // ever heard that song by Blue Rodeo ? |
|
1255 | + try { |
|
1256 | + $this->checkout->current_step->reg_form = $this->checkout->current_step->generate_reg_form(); |
|
1257 | + // if not displaying a form, then check for form submission |
|
1258 | + if ($this->checkout->process_form_submission |
|
1259 | + && $this->checkout->current_step->reg_form->was_submitted() |
|
1260 | + ) { |
|
1261 | + // clear out any old data in case this step is being run again |
|
1262 | + $this->checkout->current_step->set_valid_data(array()); |
|
1263 | + // capture submitted form data |
|
1264 | + $this->checkout->current_step->reg_form->receive_form_submission( |
|
1265 | + apply_filters( |
|
1266 | + 'FHEE__Single_Page_Checkout___check_form_submission__request_params', |
|
1267 | + EE_Registry::instance()->REQ->params(), |
|
1268 | + $this->checkout |
|
1269 | + ) |
|
1270 | + ); |
|
1271 | + // validate submitted form data |
|
1272 | + if (! $this->checkout->continue_reg || ! $this->checkout->current_step->reg_form->is_valid()) { |
|
1273 | + // thou shall not pass !!! |
|
1274 | + $this->checkout->continue_reg = false; |
|
1275 | + // any form validation errors? |
|
1276 | + if ($this->checkout->current_step->reg_form->submission_error_message() !== '') { |
|
1277 | + EE_Error::add_error( |
|
1278 | + $this->checkout->current_step->reg_form->submission_error_message(), |
|
1279 | + __FILE__, |
|
1280 | + __FUNCTION__, |
|
1281 | + __LINE__ |
|
1282 | + ); |
|
1283 | + } |
|
1284 | + // well not really... what will happen is |
|
1285 | + // we'll just get redirected back to redo the current step |
|
1286 | + $this->go_to_next_step(); |
|
1287 | + return false; |
|
1288 | + } |
|
1289 | + } |
|
1290 | + } catch (EE_Error $e) { |
|
1291 | + $e->get_error(); |
|
1292 | + } |
|
1293 | + } |
|
1294 | + return true; |
|
1295 | + } |
|
1296 | + |
|
1297 | + |
|
1298 | + /** |
|
1299 | + * _process_action |
|
1300 | + * |
|
1301 | + * @access private |
|
1302 | + * @return void |
|
1303 | + * @throws EE_Error |
|
1304 | + */ |
|
1305 | + private function _process_form_action() |
|
1306 | + { |
|
1307 | + // what cha wanna do? |
|
1308 | + switch ($this->checkout->action) { |
|
1309 | + // AJAX next step reg form |
|
1310 | + case 'display_spco_reg_step': |
|
1311 | + $this->checkout->redirect = false; |
|
1312 | + if (EE_Registry::instance()->REQ->ajax) { |
|
1313 | + $this->checkout->json_response->set_reg_step_html( |
|
1314 | + $this->checkout->current_step->display_reg_form() |
|
1315 | + ); |
|
1316 | + } |
|
1317 | + break; |
|
1318 | + default: |
|
1319 | + // meh... do one of those other steps first |
|
1320 | + if (! empty($this->checkout->action) |
|
1321 | + && is_callable(array($this->checkout->current_step, $this->checkout->action)) |
|
1322 | + ) { |
|
1323 | + // dynamically creates hook point like: |
|
1324 | + // AHEE__Single_Page_Checkout__before_attendee_information__process_reg_step |
|
1325 | + do_action( |
|
1326 | + "AHEE__Single_Page_Checkout__before_{$this->checkout->current_step->slug()}__{$this->checkout->action}", |
|
1327 | + $this->checkout->current_step |
|
1328 | + ); |
|
1329 | + // call action on current step |
|
1330 | + if (call_user_func(array($this->checkout->current_step, $this->checkout->action))) { |
|
1331 | + // good registrant, you get to proceed |
|
1332 | + if ($this->checkout->current_step->success_message() !== '' |
|
1333 | + && apply_filters( |
|
1334 | + 'FHEE__Single_Page_Checkout___process_form_action__display_success', |
|
1335 | + false |
|
1336 | + ) |
|
1337 | + ) { |
|
1338 | + EE_Error::add_success( |
|
1339 | + $this->checkout->current_step->success_message() |
|
1340 | + . '<br />' . $this->checkout->next_step->_instructions() |
|
1341 | + ); |
|
1342 | + } |
|
1343 | + // pack it up, pack it in... |
|
1344 | + $this->_setup_redirect(); |
|
1345 | + } |
|
1346 | + // dynamically creates hook point like: |
|
1347 | + // AHEE__Single_Page_Checkout__after_payment_options__process_reg_step |
|
1348 | + do_action( |
|
1349 | + "AHEE__Single_Page_Checkout__after_{$this->checkout->current_step->slug()}__{$this->checkout->action}", |
|
1350 | + $this->checkout->current_step |
|
1351 | + ); |
|
1352 | + } else { |
|
1353 | + EE_Error::add_error( |
|
1354 | + sprintf( |
|
1355 | + esc_html__( |
|
1356 | + 'The requested form action "%s" does not exist for the current "%s" registration step.', |
|
1357 | + 'event_espresso' |
|
1358 | + ), |
|
1359 | + $this->checkout->action, |
|
1360 | + $this->checkout->current_step->name() |
|
1361 | + ), |
|
1362 | + __FILE__, |
|
1363 | + __FUNCTION__, |
|
1364 | + __LINE__ |
|
1365 | + ); |
|
1366 | + } |
|
1367 | + // end default |
|
1368 | + } |
|
1369 | + // store our progress so far |
|
1370 | + $this->checkout->stash_transaction_and_checkout(); |
|
1371 | + // advance to the next step! If you pass GO, collect $200 |
|
1372 | + $this->go_to_next_step(); |
|
1373 | + } |
|
1374 | + |
|
1375 | + |
|
1376 | + /** |
|
1377 | + * add_styles_and_scripts |
|
1378 | + * |
|
1379 | + * @access public |
|
1380 | + * @return void |
|
1381 | + */ |
|
1382 | + public function add_styles_and_scripts() |
|
1383 | + { |
|
1384 | + // i18n |
|
1385 | + $this->translate_js_strings(); |
|
1386 | + if ($this->checkout->admin_request) { |
|
1387 | + add_action('admin_enqueue_scripts', array($this, 'enqueue_styles_and_scripts'), 10); |
|
1388 | + } else { |
|
1389 | + add_action('wp_enqueue_scripts', array($this, 'enqueue_styles_and_scripts'), 10); |
|
1390 | + } |
|
1391 | + } |
|
1392 | + |
|
1393 | + |
|
1394 | + /** |
|
1395 | + * translate_js_strings |
|
1396 | + * |
|
1397 | + * @access public |
|
1398 | + * @return void |
|
1399 | + */ |
|
1400 | + public function translate_js_strings() |
|
1401 | + { |
|
1402 | + EE_Registry::$i18n_js_strings['revisit'] = $this->checkout->revisit; |
|
1403 | + EE_Registry::$i18n_js_strings['e_reg_url_link'] = $this->checkout->reg_url_link; |
|
1404 | + EE_Registry::$i18n_js_strings['server_error'] = esc_html__( |
|
1405 | + 'An unknown error occurred on the server while attempting to process your request. Please refresh the page and try again or contact support.', |
|
1406 | + 'event_espresso' |
|
1407 | + ); |
|
1408 | + EE_Registry::$i18n_js_strings['invalid_json_response'] = esc_html__( |
|
1409 | + 'An invalid response was returned from the server while attempting to process your request. Please refresh the page and try again or contact support.', |
|
1410 | + 'event_espresso' |
|
1411 | + ); |
|
1412 | + EE_Registry::$i18n_js_strings['validation_error'] = esc_html__( |
|
1413 | + 'There appears to be a problem with the form validation configuration! Please check the admin settings or contact support.', |
|
1414 | + 'event_espresso' |
|
1415 | + ); |
|
1416 | + EE_Registry::$i18n_js_strings['invalid_payment_method'] = esc_html__( |
|
1417 | + 'There appears to be a problem with the payment method configuration! Please refresh the page and try again or contact support.', |
|
1418 | + 'event_espresso' |
|
1419 | + ); |
|
1420 | + EE_Registry::$i18n_js_strings['reg_step_error'] = esc_html__( |
|
1421 | + 'This registration step could not be completed. Please refresh the page and try again.', |
|
1422 | + 'event_espresso' |
|
1423 | + ); |
|
1424 | + EE_Registry::$i18n_js_strings['invalid_coupon'] = esc_html__( |
|
1425 | + 'We\'re sorry but that coupon code does not appear to be valid. If this is incorrect, please contact the site administrator.', |
|
1426 | + 'event_espresso' |
|
1427 | + ); |
|
1428 | + EE_Registry::$i18n_js_strings['process_registration'] = sprintf( |
|
1429 | + esc_html__( |
|
1430 | + 'Please wait while we process your registration.%sDo not refresh the page or navigate away while this is happening.%sThank you for your patience.', |
|
1431 | + 'event_espresso' |
|
1432 | + ), |
|
1433 | + '<br/>', |
|
1434 | + '<br/>' |
|
1435 | + ); |
|
1436 | + EE_Registry::$i18n_js_strings['language'] = get_bloginfo('language'); |
|
1437 | + EE_Registry::$i18n_js_strings['EESID'] = EE_Registry::instance()->SSN->id(); |
|
1438 | + EE_Registry::$i18n_js_strings['currency'] = EE_Registry::instance()->CFG->currency; |
|
1439 | + EE_Registry::$i18n_js_strings['datepicker_yearRange'] = '-150:+20'; |
|
1440 | + EE_Registry::$i18n_js_strings['timer_years'] = esc_html__('years', 'event_espresso'); |
|
1441 | + EE_Registry::$i18n_js_strings['timer_months'] = esc_html__('months', 'event_espresso'); |
|
1442 | + EE_Registry::$i18n_js_strings['timer_weeks'] = esc_html__('weeks', 'event_espresso'); |
|
1443 | + EE_Registry::$i18n_js_strings['timer_days'] = esc_html__('days', 'event_espresso'); |
|
1444 | + EE_Registry::$i18n_js_strings['timer_hours'] = esc_html__('hours', 'event_espresso'); |
|
1445 | + EE_Registry::$i18n_js_strings['timer_minutes'] = esc_html__('minutes', 'event_espresso'); |
|
1446 | + EE_Registry::$i18n_js_strings['timer_seconds'] = esc_html__('seconds', 'event_espresso'); |
|
1447 | + EE_Registry::$i18n_js_strings['timer_year'] = esc_html__('year', 'event_espresso'); |
|
1448 | + EE_Registry::$i18n_js_strings['timer_month'] = esc_html__('month', 'event_espresso'); |
|
1449 | + EE_Registry::$i18n_js_strings['timer_week'] = esc_html__('week', 'event_espresso'); |
|
1450 | + EE_Registry::$i18n_js_strings['timer_day'] = esc_html__('day', 'event_espresso'); |
|
1451 | + EE_Registry::$i18n_js_strings['timer_hour'] = esc_html__('hour', 'event_espresso'); |
|
1452 | + EE_Registry::$i18n_js_strings['timer_minute'] = esc_html__('minute', 'event_espresso'); |
|
1453 | + EE_Registry::$i18n_js_strings['timer_second'] = esc_html__('second', 'event_espresso'); |
|
1454 | + EE_Registry::$i18n_js_strings['registration_expiration_notice'] = EED_Single_Page_Checkout::getRegistrationExpirationNotice( |
|
1455 | + ); |
|
1456 | + EE_Registry::$i18n_js_strings['ajax_submit'] = apply_filters( |
|
1457 | + 'FHEE__Single_Page_Checkout__translate_js_strings__ajax_submit', |
|
1458 | + true |
|
1459 | + ); |
|
1460 | + EE_Registry::$i18n_js_strings['session_extension'] = absint( |
|
1461 | + apply_filters('FHEE__EE_Session__extend_expiration__seconds_added', 10 * MINUTE_IN_SECONDS) |
|
1462 | + ); |
|
1463 | + EE_Registry::$i18n_js_strings['session_expiration'] = gmdate( |
|
1464 | + 'M d, Y H:i:s', |
|
1465 | + EE_Registry::instance()->SSN->expiration() + (get_option('gmt_offset') * HOUR_IN_SECONDS) |
|
1466 | + ); |
|
1467 | + } |
|
1468 | + |
|
1469 | + |
|
1470 | + /** |
|
1471 | + * enqueue_styles_and_scripts |
|
1472 | + * |
|
1473 | + * @access public |
|
1474 | + * @return void |
|
1475 | + * @throws EE_Error |
|
1476 | + */ |
|
1477 | + public function enqueue_styles_and_scripts() |
|
1478 | + { |
|
1479 | + // load css |
|
1480 | + wp_register_style( |
|
1481 | + 'single_page_checkout', |
|
1482 | + SPCO_CSS_URL . 'single_page_checkout.css', |
|
1483 | + array('espresso_default'), |
|
1484 | + EVENT_ESPRESSO_VERSION |
|
1485 | + ); |
|
1486 | + wp_enqueue_style('single_page_checkout'); |
|
1487 | + // load JS |
|
1488 | + wp_register_script( |
|
1489 | + 'jquery_plugin', |
|
1490 | + EE_THIRD_PARTY_URL . 'jquery .plugin.min.js', |
|
1491 | + array('jquery'), |
|
1492 | + '1.0.1', |
|
1493 | + true |
|
1494 | + ); |
|
1495 | + wp_register_script( |
|
1496 | + 'jquery_countdown', |
|
1497 | + EE_THIRD_PARTY_URL . 'jquery .countdown.min.js', |
|
1498 | + array('jquery_plugin'), |
|
1499 | + '2.1.0', |
|
1500 | + true |
|
1501 | + ); |
|
1502 | + wp_register_script( |
|
1503 | + 'single_page_checkout', |
|
1504 | + SPCO_JS_URL . 'single_page_checkout.js', |
|
1505 | + array('espresso_core', 'underscore', 'ee_form_section_validation'), |
|
1506 | + EVENT_ESPRESSO_VERSION, |
|
1507 | + true |
|
1508 | + ); |
|
1509 | + if ($this->checkout->registration_form instanceof EE_Form_Section_Proper) { |
|
1510 | + $this->checkout->registration_form->enqueue_js(); |
|
1511 | + } |
|
1512 | + if ($this->checkout->current_step->reg_form instanceof EE_Form_Section_Proper) { |
|
1513 | + $this->checkout->current_step->reg_form->enqueue_js(); |
|
1514 | + } |
|
1515 | + wp_enqueue_script('single_page_checkout'); |
|
1516 | + if (apply_filters('FHEE__registration_page_wrapper_template__display_time_limit', false)) { |
|
1517 | + wp_enqueue_script('jquery_countdown'); |
|
1518 | + } |
|
1519 | + /** |
|
1520 | + * global action hook for enqueueing styles and scripts with |
|
1521 | + * spco calls. |
|
1522 | + */ |
|
1523 | + do_action('AHEE__EED_Single_Page_Checkout__enqueue_styles_and_scripts', $this); |
|
1524 | + /** |
|
1525 | + * dynamic action hook for enqueueing styles and scripts with spco calls. |
|
1526 | + * The hook will end up being something like: |
|
1527 | + * AHEE__EED_Single_Page_Checkout__enqueue_styles_and_scripts__attendee_information |
|
1528 | + */ |
|
1529 | + do_action( |
|
1530 | + 'AHEE__EED_Single_Page_Checkout__enqueue_styles_and_scripts__' . $this->checkout->current_step->slug(), |
|
1531 | + $this |
|
1532 | + ); |
|
1533 | + } |
|
1534 | + |
|
1535 | + |
|
1536 | + /** |
|
1537 | + * display the Registration Single Page Checkout Form |
|
1538 | + * |
|
1539 | + * @access private |
|
1540 | + * @return void |
|
1541 | + * @throws EE_Error |
|
1542 | + */ |
|
1543 | + private function _display_spco_reg_form() |
|
1544 | + { |
|
1545 | + // if registering via the admin, just display the reg form for the current step |
|
1546 | + if ($this->checkout->admin_request) { |
|
1547 | + EE_Registry::instance()->REQ->add_output($this->checkout->current_step->display_reg_form()); |
|
1548 | + } else { |
|
1549 | + // add powered by EE msg |
|
1550 | + add_action('AHEE__SPCO__reg_form_footer', array('EED_Single_Page_Checkout', 'display_registration_footer')); |
|
1551 | + $empty_cart = count($this->checkout->transaction |
|
1552 | + ->registrations($this->checkout->reg_cache_where_params)) < 1; |
|
1553 | + EE_Registry::$i18n_js_strings['empty_cart'] = $empty_cart; |
|
1554 | + $cookies_not_set_msg = ''; |
|
1555 | + if ($empty_cart) { |
|
1556 | + $cookies_not_set_msg = apply_filters( |
|
1557 | + 'FHEE__Single_Page_Checkout__display_spco_reg_form__cookies_not_set_msg', |
|
1558 | + sprintf( |
|
1559 | + esc_html__( |
|
1560 | + '%1$s%3$sIt appears your browser is not currently set to accept Cookies%4$s%5$sIn order to register for events, you need to enable cookies.%7$sIf you require assistance, then click the following link to learn how to %8$senable cookies%9$s%6$s%2$s', |
|
1561 | + 'event_espresso' |
|
1562 | + ), |
|
1563 | + '<div class="ee-attention hidden" id="ee-cookies-not-set-msg">', |
|
1564 | + '</div>', |
|
1565 | + '<h6 class="important-notice">', |
|
1566 | + '</h6>', |
|
1567 | + '<p>', |
|
1568 | + '</p>', |
|
1569 | + '<br />', |
|
1570 | + '<a href="http://www.whatarecookies.com/enable.asp" target="_blank" rel="noopener noreferrer">', |
|
1571 | + '</a>' |
|
1572 | + ) |
|
1573 | + ); |
|
1574 | + } |
|
1575 | + $this->checkout->registration_form = new EE_Form_Section_Proper( |
|
1576 | + array( |
|
1577 | + 'name' => 'single-page-checkout', |
|
1578 | + 'html_id' => 'ee-single-page-checkout-dv', |
|
1579 | + 'layout_strategy' => |
|
1580 | + new EE_Template_Layout( |
|
1581 | + array( |
|
1582 | + 'layout_template_file' => SPCO_TEMPLATES_PATH . 'registration_page_wrapper.template.php', |
|
1583 | + 'template_args' => array( |
|
1584 | + 'empty_cart' => $empty_cart, |
|
1585 | + 'revisit' => $this->checkout->revisit, |
|
1586 | + 'reg_steps' => $this->checkout->reg_steps, |
|
1587 | + 'next_step' => $this->checkout->next_step instanceof EE_SPCO_Reg_Step |
|
1588 | + ? $this->checkout->next_step->slug() |
|
1589 | + : '', |
|
1590 | + 'empty_msg' => apply_filters( |
|
1591 | + 'FHEE__Single_Page_Checkout__display_spco_reg_form__empty_msg', |
|
1592 | + sprintf( |
|
1593 | + esc_html__( |
|
1594 | + 'You need to %1$sReturn to Events list%2$sselect at least one event%3$s before you can proceed with the registration process.', |
|
1595 | + 'event_espresso' |
|
1596 | + ), |
|
1597 | + '<a href="' |
|
1598 | + . get_post_type_archive_link('espresso_events') |
|
1599 | + . '" title="', |
|
1600 | + '">', |
|
1601 | + '</a>' |
|
1602 | + ) |
|
1603 | + ), |
|
1604 | + 'cookies_not_set_msg' => $cookies_not_set_msg, |
|
1605 | + 'registration_time_limit' => $this->checkout->get_registration_time_limit(), |
|
1606 | + 'session_expiration' => gmdate( |
|
1607 | + 'M d, Y H:i:s', |
|
1608 | + EE_Registry::instance()->SSN->expiration() |
|
1609 | + + (get_option('gmt_offset') * HOUR_IN_SECONDS) |
|
1610 | + ), |
|
1611 | + ), |
|
1612 | + ) |
|
1613 | + ), |
|
1614 | + ) |
|
1615 | + ); |
|
1616 | + // load template and add to output sent that gets filtered into the_content() |
|
1617 | + EE_Registry::instance()->REQ->add_output($this->checkout->registration_form->get_html()); |
|
1618 | + } |
|
1619 | + } |
|
1620 | + |
|
1621 | + |
|
1622 | + /** |
|
1623 | + * add_extra_finalize_registration_inputs |
|
1624 | + * |
|
1625 | + * @access public |
|
1626 | + * @param $next_step |
|
1627 | + * @internal param string $label |
|
1628 | + * @return void |
|
1629 | + */ |
|
1630 | + public function add_extra_finalize_registration_inputs($next_step) |
|
1631 | + { |
|
1632 | + if ($next_step === 'finalize_registration') { |
|
1633 | + echo '<div id="spco-extra-finalize_registration-inputs-dv"></div>'; |
|
1634 | + } |
|
1635 | + } |
|
1636 | + |
|
1637 | + |
|
1638 | + /** |
|
1639 | + * display_registration_footer |
|
1640 | + * |
|
1641 | + * @access public |
|
1642 | + * @return string |
|
1643 | + */ |
|
1644 | + public static function display_registration_footer() |
|
1645 | + { |
|
1646 | + if (apply_filters( |
|
1647 | + 'FHEE__EE_Front__Controller__show_reg_footer', |
|
1648 | + EE_Registry::instance()->CFG->admin->show_reg_footer |
|
1649 | + )) { |
|
1650 | + add_filter( |
|
1651 | + 'FHEE__EEH_Template__powered_by_event_espresso__url', |
|
1652 | + function ($url) { |
|
1653 | + return apply_filters('FHEE__EE_Front_Controller__registration_footer__url', $url); |
|
1654 | + } |
|
1655 | + ); |
|
1656 | + echo apply_filters( |
|
1657 | + 'FHEE__EE_Front_Controller__display_registration_footer', |
|
1658 | + \EEH_Template::powered_by_event_espresso( |
|
1659 | + '', |
|
1660 | + 'espresso-registration-footer-dv', |
|
1661 | + array('utm_content' => 'registration_checkout') |
|
1662 | + ) |
|
1663 | + ); |
|
1664 | + } |
|
1665 | + return ''; |
|
1666 | + } |
|
1667 | + |
|
1668 | + |
|
1669 | + /** |
|
1670 | + * unlock_transaction |
|
1671 | + * |
|
1672 | + * @access public |
|
1673 | + * @return void |
|
1674 | + * @throws EE_Error |
|
1675 | + */ |
|
1676 | + public function unlock_transaction() |
|
1677 | + { |
|
1678 | + if ($this->checkout->transaction instanceof EE_Transaction) { |
|
1679 | + $this->checkout->transaction->unlock(); |
|
1680 | + } |
|
1681 | + } |
|
1682 | + |
|
1683 | + |
|
1684 | + /** |
|
1685 | + * _setup_redirect |
|
1686 | + * |
|
1687 | + * @access private |
|
1688 | + * @return void |
|
1689 | + */ |
|
1690 | + private function _setup_redirect() |
|
1691 | + { |
|
1692 | + if ($this->checkout->continue_reg && $this->checkout->next_step instanceof EE_SPCO_Reg_Step) { |
|
1693 | + $this->checkout->redirect = true; |
|
1694 | + if (empty($this->checkout->redirect_url)) { |
|
1695 | + $this->checkout->redirect_url = $this->checkout->next_step->reg_step_url(); |
|
1696 | + } |
|
1697 | + $this->checkout->redirect_url = apply_filters( |
|
1698 | + 'FHEE__EED_Single_Page_Checkout___setup_redirect__checkout_redirect_url', |
|
1699 | + $this->checkout->redirect_url, |
|
1700 | + $this->checkout |
|
1701 | + ); |
|
1702 | + } |
|
1703 | + } |
|
1704 | + |
|
1705 | + |
|
1706 | + /** |
|
1707 | + * handle ajax message responses and redirects |
|
1708 | + * |
|
1709 | + * @access public |
|
1710 | + * @return void |
|
1711 | + * @throws EE_Error |
|
1712 | + */ |
|
1713 | + public function go_to_next_step() |
|
1714 | + { |
|
1715 | + if (EE_Registry::instance()->REQ->ajax) { |
|
1716 | + // capture contents of output buffer we started earlier in the request, and insert into JSON response |
|
1717 | + $this->checkout->json_response->set_unexpected_errors(ob_get_clean()); |
|
1718 | + } |
|
1719 | + $this->unlock_transaction(); |
|
1720 | + // just return for these conditions |
|
1721 | + if ($this->checkout->admin_request |
|
1722 | + || $this->checkout->action === 'redirect_form' |
|
1723 | + || $this->checkout->action === 'update_checkout' |
|
1724 | + ) { |
|
1725 | + return; |
|
1726 | + } |
|
1727 | + // AJAX response |
|
1728 | + $this->_handle_json_response(); |
|
1729 | + // redirect to next step or the Thank You page |
|
1730 | + $this->_handle_html_redirects(); |
|
1731 | + // hmmm... must be something wrong, so let's just display the form again ! |
|
1732 | + $this->_display_spco_reg_form(); |
|
1733 | + } |
|
1734 | + |
|
1735 | + |
|
1736 | + /** |
|
1737 | + * _handle_json_response |
|
1738 | + * |
|
1739 | + * @access protected |
|
1740 | + * @return void |
|
1741 | + */ |
|
1742 | + protected function _handle_json_response() |
|
1743 | + { |
|
1744 | + // if this is an ajax request |
|
1745 | + if (EE_Registry::instance()->REQ->ajax) { |
|
1746 | + $this->checkout->json_response->set_registration_time_limit( |
|
1747 | + $this->checkout->get_registration_time_limit() |
|
1748 | + ); |
|
1749 | + $this->checkout->json_response->set_payment_amount($this->checkout->amount_owing); |
|
1750 | + // just send the ajax ( |
|
1751 | + $json_response = apply_filters( |
|
1752 | + 'FHEE__EE_Single_Page_Checkout__JSON_response', |
|
1753 | + $this->checkout->json_response |
|
1754 | + ); |
|
1755 | + echo $json_response; |
|
1756 | + exit(); |
|
1757 | + } |
|
1758 | + } |
|
1759 | + |
|
1760 | + |
|
1761 | + /** |
|
1762 | + * _handle_redirects |
|
1763 | + * |
|
1764 | + * @access protected |
|
1765 | + * @return void |
|
1766 | + */ |
|
1767 | + protected function _handle_html_redirects() |
|
1768 | + { |
|
1769 | + // going somewhere ? |
|
1770 | + if ($this->checkout->redirect && ! empty($this->checkout->redirect_url)) { |
|
1771 | + // store notices in a transient |
|
1772 | + EE_Error::get_notices(false, true, true); |
|
1773 | + wp_safe_redirect($this->checkout->redirect_url); |
|
1774 | + exit(); |
|
1775 | + } |
|
1776 | + } |
|
1777 | + |
|
1778 | + |
|
1779 | + /** |
|
1780 | + * set_checkout_anchor |
|
1781 | + * |
|
1782 | + * @access public |
|
1783 | + * @return void |
|
1784 | + */ |
|
1785 | + public function set_checkout_anchor() |
|
1786 | + { |
|
1787 | + echo '<a id="checkout" style="float: left; margin-left: -999em;"></a>'; |
|
1788 | + } |
|
1789 | + |
|
1790 | + /** |
|
1791 | + * getRegistrationExpirationNotice |
|
1792 | + * |
|
1793 | + * @since 4.9.59.p |
|
1794 | + * @access public |
|
1795 | + * @return string |
|
1796 | + */ |
|
1797 | + public static function getRegistrationExpirationNotice() |
|
1798 | + { |
|
1799 | + return sprintf( |
|
1800 | + esc_html__( |
|
1801 | + '%1$sWe\'re sorry, but your registration time has expired.%2$s%3$s%4$sIf you still wish to complete your registration, please return to the %5$sEvent List%6$sEvent List%7$s and reselect your tickets if available. Please accept our apologies for any inconvenience this may have caused.%8$s', |
|
1802 | + 'event_espresso' |
|
1803 | + ), |
|
1804 | + '<h4 class="important-notice">', |
|
1805 | + '</h4>', |
|
1806 | + '<br />', |
|
1807 | + '<p>', |
|
1808 | + '<a href="' . get_post_type_archive_link('espresso_events') . '" title="', |
|
1809 | + '">', |
|
1810 | + '</a>', |
|
1811 | + '</p>' |
|
1812 | + ); |
|
1813 | + } |
|
1814 | 1814 | } |
@@ -100,7 +100,7 @@ discard block |
||
100 | 100 | public static function set_hooks_admin() |
101 | 101 | { |
102 | 102 | EED_Single_Page_Checkout::set_definitions(); |
103 | - if (! (defined('DOING_AJAX') && DOING_AJAX)) { |
|
103 | + if ( ! (defined('DOING_AJAX') && DOING_AJAX)) { |
|
104 | 104 | return; |
105 | 105 | } |
106 | 106 | // going to start an output buffer in case anything gets accidentally output |
@@ -206,14 +206,14 @@ discard block |
||
206 | 206 | } |
207 | 207 | define( |
208 | 208 | 'SPCO_BASE_PATH', |
209 | - rtrim(str_replace(array('\\', '/'), DS, plugin_dir_path(__FILE__)), DS) . DS |
|
209 | + rtrim(str_replace(array('\\', '/'), DS, plugin_dir_path(__FILE__)), DS).DS |
|
210 | 210 | ); |
211 | - define('SPCO_CSS_URL', plugin_dir_url(__FILE__) . 'css' . DS); |
|
212 | - define('SPCO_IMG_URL', plugin_dir_url(__FILE__) . 'img' . DS); |
|
213 | - define('SPCO_JS_URL', plugin_dir_url(__FILE__) . 'js' . DS); |
|
214 | - define('SPCO_INC_PATH', SPCO_BASE_PATH . 'inc' . DS); |
|
215 | - define('SPCO_REG_STEPS_PATH', SPCO_BASE_PATH . 'reg_steps' . DS); |
|
216 | - define('SPCO_TEMPLATES_PATH', SPCO_BASE_PATH . 'templates' . DS); |
|
211 | + define('SPCO_CSS_URL', plugin_dir_url(__FILE__).'css'.DS); |
|
212 | + define('SPCO_IMG_URL', plugin_dir_url(__FILE__).'img'.DS); |
|
213 | + define('SPCO_JS_URL', plugin_dir_url(__FILE__).'js'.DS); |
|
214 | + define('SPCO_INC_PATH', SPCO_BASE_PATH.'inc'.DS); |
|
215 | + define('SPCO_REG_STEPS_PATH', SPCO_BASE_PATH.'reg_steps'.DS); |
|
216 | + define('SPCO_TEMPLATES_PATH', SPCO_BASE_PATH.'templates'.DS); |
|
217 | 217 | EEH_Autoloader::register_autoloaders_for_each_file_in_folder(SPCO_BASE_PATH, true); |
218 | 218 | EE_Registry::$i18n_js_strings['registration_expiration_notice'] = EED_Single_Page_Checkout::getRegistrationExpirationNotice( |
219 | 219 | ); |
@@ -245,7 +245,7 @@ discard block |
||
245 | 245 | // we need a |
246 | 246 | if (isset($reg_step['file_path'], $reg_step['class_name'], $reg_step['slug'])) { |
247 | 247 | // copy over to the reg_steps_array |
248 | - EED_Single_Page_Checkout::$_reg_steps_array[ $order ] = $reg_step; |
|
248 | + EED_Single_Page_Checkout::$_reg_steps_array[$order] = $reg_step; |
|
249 | 249 | // register custom key route for each reg step |
250 | 250 | // ie: step=>"slug" - this is the entire reason we load the reg steps array now |
251 | 251 | EE_Config::register_route( |
@@ -257,7 +257,7 @@ discard block |
||
257 | 257 | // add AJAX or other hooks |
258 | 258 | if (isset($reg_step['has_hooks']) && $reg_step['has_hooks']) { |
259 | 259 | // setup autoloaders if necessary |
260 | - if (! class_exists($reg_step['class_name'])) { |
|
260 | + if ( ! class_exists($reg_step['class_name'])) { |
|
261 | 261 | EEH_Autoloader::register_autoloaders_for_each_file_in_folder( |
262 | 262 | $reg_step['file_path'], |
263 | 263 | true |
@@ -285,19 +285,19 @@ discard block |
||
285 | 285 | if (empty($reg_steps)) { |
286 | 286 | $reg_steps = array( |
287 | 287 | 10 => array( |
288 | - 'file_path' => SPCO_REG_STEPS_PATH . 'attendee_information', |
|
288 | + 'file_path' => SPCO_REG_STEPS_PATH.'attendee_information', |
|
289 | 289 | 'class_name' => 'EE_SPCO_Reg_Step_Attendee_Information', |
290 | 290 | 'slug' => 'attendee_information', |
291 | 291 | 'has_hooks' => false, |
292 | 292 | ), |
293 | 293 | 30 => array( |
294 | - 'file_path' => SPCO_REG_STEPS_PATH . 'payment_options', |
|
294 | + 'file_path' => SPCO_REG_STEPS_PATH.'payment_options', |
|
295 | 295 | 'class_name' => 'EE_SPCO_Reg_Step_Payment_Options', |
296 | 296 | 'slug' => 'payment_options', |
297 | 297 | 'has_hooks' => true, |
298 | 298 | ), |
299 | 299 | 999 => array( |
300 | - 'file_path' => SPCO_REG_STEPS_PATH . 'finalize_registration', |
|
300 | + 'file_path' => SPCO_REG_STEPS_PATH.'finalize_registration', |
|
301 | 301 | 'class_name' => 'EE_SPCO_Reg_Step_Finalize_Registration', |
302 | 302 | 'slug' => 'finalize_registration', |
303 | 303 | 'has_hooks' => false, |
@@ -450,7 +450,7 @@ discard block |
||
450 | 450 | $this->checkout |
451 | 451 | ); |
452 | 452 | // load the reg steps array |
453 | - if (! $this->_load_and_instantiate_reg_steps()) { |
|
453 | + if ( ! $this->_load_and_instantiate_reg_steps()) { |
|
454 | 454 | EED_Single_Page_Checkout::$_initialized = true; |
455 | 455 | return; |
456 | 456 | } |
@@ -459,7 +459,7 @@ discard block |
||
459 | 459 | // and the next step |
460 | 460 | $this->checkout->set_next_step(); |
461 | 461 | // verify that everything has been setup correctly |
462 | - if (! ($this->_verify_transaction_and_get_registrations() && $this->_final_verifications())) { |
|
462 | + if ( ! ($this->_verify_transaction_and_get_registrations() && $this->_final_verifications())) { |
|
463 | 463 | EED_Single_Page_Checkout::$_initialized = true; |
464 | 464 | return; |
465 | 465 | } |
@@ -474,7 +474,7 @@ discard block |
||
474 | 474 | // DEBUG LOG |
475 | 475 | // $this->checkout->log( __CLASS__, __FUNCTION__, __LINE__ ); |
476 | 476 | // get reg form |
477 | - if (! $this->_check_form_submission()) { |
|
477 | + if ( ! $this->_check_form_submission()) { |
|
478 | 478 | EED_Single_Page_Checkout::$_initialized = true; |
479 | 479 | return; |
480 | 480 | } |
@@ -505,7 +505,7 @@ discard block |
||
505 | 505 | */ |
506 | 506 | private function _verify_session() |
507 | 507 | { |
508 | - if (! EE_Registry::instance()->SSN instanceof EE_Session) { |
|
508 | + if ( ! EE_Registry::instance()->SSN instanceof EE_Session) { |
|
509 | 509 | throw new EE_Error(esc_html__('The EE_Session class could not be loaded.', 'event_espresso')); |
510 | 510 | } |
511 | 511 | $clear_session_requested = filter_var( |
@@ -523,7 +523,7 @@ discard block |
||
523 | 523 | // EE_Registry::instance()->SSN->reset_cart(); |
524 | 524 | // EE_Registry::instance()->SSN->reset_checkout(); |
525 | 525 | // EE_Registry::instance()->SSN->reset_transaction(); |
526 | - if (! $clear_session_requested) { |
|
526 | + if ( ! $clear_session_requested) { |
|
527 | 527 | EE_Error::add_attention( |
528 | 528 | EE_Registry::$i18n_js_strings['registration_expiration_notice'], |
529 | 529 | __FILE__, |
@@ -550,7 +550,7 @@ discard block |
||
550 | 550 | /** @type EE_Checkout $checkout */ |
551 | 551 | $checkout = EE_Registry::instance()->SSN->checkout(); |
552 | 552 | // verify |
553 | - if (! $checkout instanceof EE_Checkout) { |
|
553 | + if ( ! $checkout instanceof EE_Checkout) { |
|
554 | 554 | // instantiate EE_Checkout object for handling the properties of the current checkout process |
555 | 555 | $checkout = EE_Registry::instance()->load_file( |
556 | 556 | SPCO_INC_PATH, |
@@ -568,7 +568,7 @@ discard block |
||
568 | 568 | } |
569 | 569 | $checkout = apply_filters('FHEE__EED_Single_Page_Checkout___initialize_checkout__checkout', $checkout); |
570 | 570 | // verify again |
571 | - if (! $checkout instanceof EE_Checkout) { |
|
571 | + if ( ! $checkout instanceof EE_Checkout) { |
|
572 | 572 | throw new EE_Error(esc_html__('The EE_Checkout class could not be loaded.', 'event_espresso')); |
573 | 573 | } |
574 | 574 | // reset anything that needs a clean slate for each request |
@@ -640,7 +640,7 @@ discard block |
||
640 | 640 | */ |
641 | 641 | protected function _display_request_vars() |
642 | 642 | { |
643 | - if (! WP_DEBUG) { |
|
643 | + if ( ! WP_DEBUG) { |
|
644 | 644 | return; |
645 | 645 | } |
646 | 646 | EEH_Debug_Tools::printr($_REQUEST, '$_REQUEST', __FILE__, __LINE__); |
@@ -717,7 +717,7 @@ discard block |
||
717 | 717 | ) { |
718 | 718 | // if not, then loop through raw reg steps array |
719 | 719 | foreach (EED_Single_Page_Checkout::$_reg_steps_array as $order => $reg_step) { |
720 | - if (! $this->_load_and_instantiate_reg_step($reg_step, $order)) { |
|
720 | + if ( ! $this->_load_and_instantiate_reg_step($reg_step, $order)) { |
|
721 | 721 | return false; |
722 | 722 | } |
723 | 723 | } |
@@ -848,12 +848,12 @@ discard block |
||
848 | 848 | private function _verify_transaction_and_get_registrations() |
849 | 849 | { |
850 | 850 | // was there already a valid transaction in the checkout from the session ? |
851 | - if (! $this->checkout->transaction instanceof EE_Transaction) { |
|
851 | + if ( ! $this->checkout->transaction instanceof EE_Transaction) { |
|
852 | 852 | // get transaction from db or session |
853 | 853 | $this->checkout->transaction = $this->checkout->reg_url_link && ! is_admin() |
854 | 854 | ? $this->_get_transaction_and_cart_for_previous_visit() |
855 | 855 | : $this->_get_cart_for_current_session_and_setup_new_transaction(); |
856 | - if (! $this->checkout->transaction instanceof EE_Transaction) { |
|
856 | + if ( ! $this->checkout->transaction instanceof EE_Transaction) { |
|
857 | 857 | EE_Error::add_error( |
858 | 858 | esc_html__( |
859 | 859 | 'Your Registration and Transaction information could not be retrieved from the db.', |
@@ -1084,16 +1084,16 @@ discard block |
||
1084 | 1084 | ) |
1085 | 1085 | ); |
1086 | 1086 | // override capabilities for frontend registrations |
1087 | - if (! is_admin()) { |
|
1087 | + if ( ! is_admin()) { |
|
1088 | 1088 | $CreateRegistrationCommand->setCapCheck( |
1089 | 1089 | new PublicCapabilities('', 'create_new_registration') |
1090 | 1090 | ); |
1091 | 1091 | } |
1092 | 1092 | $registration = EE_Registry::instance()->BUS->execute($CreateRegistrationCommand); |
1093 | - if (! $registration instanceof EE_Registration) { |
|
1093 | + if ( ! $registration instanceof EE_Registration) { |
|
1094 | 1094 | throw new InvalidEntityException($registration, 'EE_Registration'); |
1095 | 1095 | } |
1096 | - $registrations[ $registration->ID() ] = $registration; |
|
1096 | + $registrations[$registration->ID()] = $registration; |
|
1097 | 1097 | } |
1098 | 1098 | } |
1099 | 1099 | $registration_processor->fix_reg_final_price_rounding_issue($transaction); |
@@ -1136,7 +1136,7 @@ discard block |
||
1136 | 1136 | $this->checkout |
1137 | 1137 | ); |
1138 | 1138 | // verify that current step is still set correctly |
1139 | - if (! $this->checkout->current_step instanceof EE_SPCO_Reg_Step) { |
|
1139 | + if ( ! $this->checkout->current_step instanceof EE_SPCO_Reg_Step) { |
|
1140 | 1140 | EE_Error::add_error( |
1141 | 1141 | esc_html__( |
1142 | 1142 | 'We\'re sorry but the registration process can not proceed because one or more registration steps were not setup correctly. Please refresh the page and try again or contact support.', |
@@ -1149,9 +1149,9 @@ discard block |
||
1149 | 1149 | return false; |
1150 | 1150 | } |
1151 | 1151 | // if returning to SPCO, then verify that primary registrant is set |
1152 | - if (! empty($this->checkout->reg_url_link)) { |
|
1152 | + if ( ! empty($this->checkout->reg_url_link)) { |
|
1153 | 1153 | $valid_registrant = $this->checkout->transaction->primary_registration(); |
1154 | - if (! $valid_registrant instanceof EE_Registration) { |
|
1154 | + if ( ! $valid_registrant instanceof EE_Registration) { |
|
1155 | 1155 | EE_Error::add_error( |
1156 | 1156 | esc_html__( |
1157 | 1157 | 'We\'re sorry but there appears to be an error with the "reg_url_link" or the primary registrant for this transaction. Please refresh the page and try again or contact support.', |
@@ -1171,7 +1171,7 @@ discard block |
||
1171 | 1171 | $valid_registrant = $registration; |
1172 | 1172 | } |
1173 | 1173 | } |
1174 | - if (! $valid_registrant instanceof EE_Registration) { |
|
1174 | + if ( ! $valid_registrant instanceof EE_Registration) { |
|
1175 | 1175 | // hmmm... maybe we have the wrong session because the user is opening multiple tabs ? |
1176 | 1176 | if (EED_Single_Page_Checkout::$_checkout_verified) { |
1177 | 1177 | // clear the session, mark the checkout as unverified, and try again |
@@ -1215,9 +1215,9 @@ discard block |
||
1215 | 1215 | $this->checkout->set_reg_step_initiated($this->checkout->current_step); |
1216 | 1216 | // loop thru all steps to call their individual "initialize" methods and set i18n strings for JS |
1217 | 1217 | foreach ($this->checkout->reg_steps as $reg_step) { |
1218 | - if (! $reg_step->initialize_reg_step()) { |
|
1218 | + if ( ! $reg_step->initialize_reg_step()) { |
|
1219 | 1219 | // if not initialized then maybe this step is being removed... |
1220 | - if (! $reinitializing && $reg_step->is_current_step()) { |
|
1220 | + if ( ! $reinitializing && $reg_step->is_current_step()) { |
|
1221 | 1221 | // if it was the current step, then we need to start over here |
1222 | 1222 | $this->_initialize_reg_steps(true); |
1223 | 1223 | return; |
@@ -1269,7 +1269,7 @@ discard block |
||
1269 | 1269 | ) |
1270 | 1270 | ); |
1271 | 1271 | // validate submitted form data |
1272 | - if (! $this->checkout->continue_reg || ! $this->checkout->current_step->reg_form->is_valid()) { |
|
1272 | + if ( ! $this->checkout->continue_reg || ! $this->checkout->current_step->reg_form->is_valid()) { |
|
1273 | 1273 | // thou shall not pass !!! |
1274 | 1274 | $this->checkout->continue_reg = false; |
1275 | 1275 | // any form validation errors? |
@@ -1317,7 +1317,7 @@ discard block |
||
1317 | 1317 | break; |
1318 | 1318 | default: |
1319 | 1319 | // meh... do one of those other steps first |
1320 | - if (! empty($this->checkout->action) |
|
1320 | + if ( ! empty($this->checkout->action) |
|
1321 | 1321 | && is_callable(array($this->checkout->current_step, $this->checkout->action)) |
1322 | 1322 | ) { |
1323 | 1323 | // dynamically creates hook point like: |
@@ -1337,7 +1337,7 @@ discard block |
||
1337 | 1337 | ) { |
1338 | 1338 | EE_Error::add_success( |
1339 | 1339 | $this->checkout->current_step->success_message() |
1340 | - . '<br />' . $this->checkout->next_step->_instructions() |
|
1340 | + . '<br />'.$this->checkout->next_step->_instructions() |
|
1341 | 1341 | ); |
1342 | 1342 | } |
1343 | 1343 | // pack it up, pack it in... |
@@ -1479,7 +1479,7 @@ discard block |
||
1479 | 1479 | // load css |
1480 | 1480 | wp_register_style( |
1481 | 1481 | 'single_page_checkout', |
1482 | - SPCO_CSS_URL . 'single_page_checkout.css', |
|
1482 | + SPCO_CSS_URL.'single_page_checkout.css', |
|
1483 | 1483 | array('espresso_default'), |
1484 | 1484 | EVENT_ESPRESSO_VERSION |
1485 | 1485 | ); |
@@ -1487,21 +1487,21 @@ discard block |
||
1487 | 1487 | // load JS |
1488 | 1488 | wp_register_script( |
1489 | 1489 | 'jquery_plugin', |
1490 | - EE_THIRD_PARTY_URL . 'jquery .plugin.min.js', |
|
1490 | + EE_THIRD_PARTY_URL.'jquery .plugin.min.js', |
|
1491 | 1491 | array('jquery'), |
1492 | 1492 | '1.0.1', |
1493 | 1493 | true |
1494 | 1494 | ); |
1495 | 1495 | wp_register_script( |
1496 | 1496 | 'jquery_countdown', |
1497 | - EE_THIRD_PARTY_URL . 'jquery .countdown.min.js', |
|
1497 | + EE_THIRD_PARTY_URL.'jquery .countdown.min.js', |
|
1498 | 1498 | array('jquery_plugin'), |
1499 | 1499 | '2.1.0', |
1500 | 1500 | true |
1501 | 1501 | ); |
1502 | 1502 | wp_register_script( |
1503 | 1503 | 'single_page_checkout', |
1504 | - SPCO_JS_URL . 'single_page_checkout.js', |
|
1504 | + SPCO_JS_URL.'single_page_checkout.js', |
|
1505 | 1505 | array('espresso_core', 'underscore', 'ee_form_section_validation'), |
1506 | 1506 | EVENT_ESPRESSO_VERSION, |
1507 | 1507 | true |
@@ -1527,7 +1527,7 @@ discard block |
||
1527 | 1527 | * AHEE__EED_Single_Page_Checkout__enqueue_styles_and_scripts__attendee_information |
1528 | 1528 | */ |
1529 | 1529 | do_action( |
1530 | - 'AHEE__EED_Single_Page_Checkout__enqueue_styles_and_scripts__' . $this->checkout->current_step->slug(), |
|
1530 | + 'AHEE__EED_Single_Page_Checkout__enqueue_styles_and_scripts__'.$this->checkout->current_step->slug(), |
|
1531 | 1531 | $this |
1532 | 1532 | ); |
1533 | 1533 | } |
@@ -1579,7 +1579,7 @@ discard block |
||
1579 | 1579 | 'layout_strategy' => |
1580 | 1580 | new EE_Template_Layout( |
1581 | 1581 | array( |
1582 | - 'layout_template_file' => SPCO_TEMPLATES_PATH . 'registration_page_wrapper.template.php', |
|
1582 | + 'layout_template_file' => SPCO_TEMPLATES_PATH.'registration_page_wrapper.template.php', |
|
1583 | 1583 | 'template_args' => array( |
1584 | 1584 | 'empty_cart' => $empty_cart, |
1585 | 1585 | 'revisit' => $this->checkout->revisit, |
@@ -1649,7 +1649,7 @@ discard block |
||
1649 | 1649 | )) { |
1650 | 1650 | add_filter( |
1651 | 1651 | 'FHEE__EEH_Template__powered_by_event_espresso__url', |
1652 | - function ($url) { |
|
1652 | + function($url) { |
|
1653 | 1653 | return apply_filters('FHEE__EE_Front_Controller__registration_footer__url', $url); |
1654 | 1654 | } |
1655 | 1655 | ); |
@@ -1805,7 +1805,7 @@ discard block |
||
1805 | 1805 | '</h4>', |
1806 | 1806 | '<br />', |
1807 | 1807 | '<p>', |
1808 | - '<a href="' . get_post_type_archive_link('espresso_events') . '" title="', |
|
1808 | + '<a href="'.get_post_type_archive_link('espresso_events').'" title="', |
|
1809 | 1809 | '">', |
1810 | 1810 | '</a>', |
1811 | 1811 | '</p>' |
@@ -26,159 +26,159 @@ |
||
26 | 26 | |
27 | 27 | class EE_DMS_4_1_0_checkins extends EE_Data_Migration_Script_Stage_Table |
28 | 28 | { |
29 | - private $_new_table; |
|
30 | - public function __construct() |
|
31 | - { |
|
32 | - global $wpdb; |
|
33 | - $this->_pretty_name = esc_html__('Checkins', 'event_espresso'); |
|
34 | - $this->_old_table = $wpdb->prefix."events_attendee"; |
|
35 | - $this->_extra_where_sql = 'AS att |
|
29 | + private $_new_table; |
|
30 | + public function __construct() |
|
31 | + { |
|
32 | + global $wpdb; |
|
33 | + $this->_pretty_name = esc_html__('Checkins', 'event_espresso'); |
|
34 | + $this->_old_table = $wpdb->prefix."events_attendee"; |
|
35 | + $this->_extra_where_sql = 'AS att |
|
36 | 36 | INNER JOIN ' . $wpdb->prefix . 'events_detail AS e ON att.event_id=e.id |
37 | 37 | WHERE e.event_status!="D"'; |
38 | - $this->_new_table = $wpdb->prefix."esp_checkin"; |
|
39 | - parent::__construct(); |
|
40 | - } |
|
41 | - protected function _migrate_old_row($old_row) |
|
42 | - { |
|
43 | - global $wpdb; |
|
44 | - $new_reg_table = $wpdb->prefix."esp_registration"; |
|
38 | + $this->_new_table = $wpdb->prefix."esp_checkin"; |
|
39 | + parent::__construct(); |
|
40 | + } |
|
41 | + protected function _migrate_old_row($old_row) |
|
42 | + { |
|
43 | + global $wpdb; |
|
44 | + $new_reg_table = $wpdb->prefix."esp_registration"; |
|
45 | 45 | |
46 | - $num_to_checkin_at_this_time = max(array(intval($old_row['checked_in_quantity']),intval($old_row['checked_in']))) ; |
|
46 | + $num_to_checkin_at_this_time = max(array(intval($old_row['checked_in_quantity']),intval($old_row['checked_in']))) ; |
|
47 | 47 | |
48 | - $new_registrations_for_attendee = $this->get_migration_script()->get_mapping_new_pk($this->_old_table, $old_row['id'], $new_reg_table); |
|
49 | - if (! $new_registrations_for_attendee) { |
|
50 | - $new_registrations_for_attendee = array(); |
|
51 | - } |
|
52 | - $new_datetime = $this->_try_to_find_datetime($old_row); |
|
48 | + $new_registrations_for_attendee = $this->get_migration_script()->get_mapping_new_pk($this->_old_table, $old_row['id'], $new_reg_table); |
|
49 | + if (! $new_registrations_for_attendee) { |
|
50 | + $new_registrations_for_attendee = array(); |
|
51 | + } |
|
52 | + $new_datetime = $this->_try_to_find_datetime($old_row); |
|
53 | 53 | |
54 | - // make sure registrations array is numerically indexed starting at 0 (it probably already is) |
|
55 | - $new_registrations_for_attendee = array_values($new_registrations_for_attendee); |
|
56 | - $new_checkin_ids = array(); |
|
57 | - for ($i = 0; $i<abs($num_to_checkin_at_this_time); $i++) { |
|
58 | - $new_reg_id = $new_registrations_for_attendee[ $i ]; |
|
59 | - if (! $new_reg_id) { |
|
60 | - $this->add_error(sprintf( |
|
61 | - esc_html__( |
|
62 | - /* translators: %1$s database row represented in JSON, %2$s number of registrations to check-in |
|
54 | + // make sure registrations array is numerically indexed starting at 0 (it probably already is) |
|
55 | + $new_registrations_for_attendee = array_values($new_registrations_for_attendee); |
|
56 | + $new_checkin_ids = array(); |
|
57 | + for ($i = 0; $i<abs($num_to_checkin_at_this_time); $i++) { |
|
58 | + $new_reg_id = $new_registrations_for_attendee[ $i ]; |
|
59 | + if (! $new_reg_id) { |
|
60 | + $this->add_error(sprintf( |
|
61 | + esc_html__( |
|
62 | + /* translators: %1$s database row represented in JSON, %2$s number of registrations to check-in |
|
63 | 63 | * %3$s number of registrations for the attendee, %4$s new registration rows represented in JSON |
64 | 64 | */ |
65 | - // @codingStandardsIgnoreStart |
|
66 | - 'It appears we wanted to check-in more registrations than actually exist. The old attendee record (%1$s) indicated we should check-in %2$d registrations, but there are only %3$d registrations for that attendee (%4$s)', |
|
67 | - // @codingStandardsIgnoreEnd |
|
68 | - 'event_espresso' |
|
69 | - ), |
|
70 | - $this->_json_encode($old_row), |
|
71 | - abs($num_to_checkin_at_this_time), |
|
72 | - count($new_registrations_for_attendee), |
|
73 | - $this->_json_encode($new_registrations_for_attendee) |
|
74 | - )); |
|
75 | - break; |
|
76 | - } |
|
77 | - $existing_checkin_record = $wpdb->get_var( |
|
78 | - $wpdb->prepare( |
|
79 | - "SELECT CHK_ID FROM $this->_new_table WHERE REG_ID = %d ORDER BY CHK_ID DESC LIMIT 1", |
|
80 | - $new_reg_id |
|
81 | - ) |
|
82 | - ); |
|
83 | - if (! $existing_checkin_record) { |
|
84 | - $new_id = $this->_insert_checkin_record($new_reg_id, $new_datetime); |
|
85 | - if ($new_id) { |
|
86 | - $new_checkin_ids[]= $new_id; |
|
87 | - } |
|
88 | - } |
|
89 | - } |
|
90 | - if ($new_checkin_ids) { |
|
91 | - $this->get_migration_script()->set_mapping( |
|
92 | - $this->_old_table, |
|
93 | - $old_row['id'], |
|
94 | - $this->_new_table, |
|
95 | - $new_checkin_ids |
|
96 | - ); |
|
97 | - } |
|
98 | - } |
|
65 | + // @codingStandardsIgnoreStart |
|
66 | + 'It appears we wanted to check-in more registrations than actually exist. The old attendee record (%1$s) indicated we should check-in %2$d registrations, but there are only %3$d registrations for that attendee (%4$s)', |
|
67 | + // @codingStandardsIgnoreEnd |
|
68 | + 'event_espresso' |
|
69 | + ), |
|
70 | + $this->_json_encode($old_row), |
|
71 | + abs($num_to_checkin_at_this_time), |
|
72 | + count($new_registrations_for_attendee), |
|
73 | + $this->_json_encode($new_registrations_for_attendee) |
|
74 | + )); |
|
75 | + break; |
|
76 | + } |
|
77 | + $existing_checkin_record = $wpdb->get_var( |
|
78 | + $wpdb->prepare( |
|
79 | + "SELECT CHK_ID FROM $this->_new_table WHERE REG_ID = %d ORDER BY CHK_ID DESC LIMIT 1", |
|
80 | + $new_reg_id |
|
81 | + ) |
|
82 | + ); |
|
83 | + if (! $existing_checkin_record) { |
|
84 | + $new_id = $this->_insert_checkin_record($new_reg_id, $new_datetime); |
|
85 | + if ($new_id) { |
|
86 | + $new_checkin_ids[]= $new_id; |
|
87 | + } |
|
88 | + } |
|
89 | + } |
|
90 | + if ($new_checkin_ids) { |
|
91 | + $this->get_migration_script()->set_mapping( |
|
92 | + $this->_old_table, |
|
93 | + $old_row['id'], |
|
94 | + $this->_new_table, |
|
95 | + $new_checkin_ids |
|
96 | + ); |
|
97 | + } |
|
98 | + } |
|
99 | 99 | |
100 | 100 | |
101 | - /** |
|
102 | - * Tries to find the new datetime the Check-in was for, based on the attendee row |
|
103 | - * (because we know the attendee was for an event as a specific time, and we know |
|
104 | - * the event's OLD ID...) |
|
105 | - * @global type $wpdb |
|
106 | - * @param array $old_attendee_row |
|
107 | - * @return array row of datetime from DB |
|
108 | - */ |
|
109 | - private function _try_to_find_datetime($old_attendee) |
|
110 | - { |
|
111 | - global $wpdb; |
|
101 | + /** |
|
102 | + * Tries to find the new datetime the Check-in was for, based on the attendee row |
|
103 | + * (because we know the attendee was for an event as a specific time, and we know |
|
104 | + * the event's OLD ID...) |
|
105 | + * @global type $wpdb |
|
106 | + * @param array $old_attendee_row |
|
107 | + * @return array row of datetime from DB |
|
108 | + */ |
|
109 | + private function _try_to_find_datetime($old_attendee) |
|
110 | + { |
|
111 | + global $wpdb; |
|
112 | 112 | |
113 | - $new_event_id = $this->get_migration_script()->get_mapping_new_pk($wpdb->prefix."events_detail", $old_attendee['event_id'], $wpdb->posts); |
|
114 | - if (! $new_event_id) { |
|
115 | - $this->add_error( |
|
116 | - sprintf( |
|
117 | - esc_html__( |
|
118 | - /* translators: 1: original event ID, 2: original attendee database row */ |
|
119 | - // @codingStandardsIgnoreStart |
|
120 | - 'Could not find new event ID with old event ID %1$d, on attendee row %2$s; and because of that couldn\'t find the correct datetime for Check-in', |
|
121 | - // @codingStandardsIgnoreEnd |
|
122 | - 'event_espresso' |
|
123 | - ), |
|
124 | - $old_attendee['event_id'], |
|
125 | - $this->_json_encode($old_attendee) |
|
126 | - ) |
|
127 | - ); |
|
128 | - return 0; |
|
129 | - } |
|
130 | - $old_att_start_date = $old_attendee['start_date']; |
|
131 | - $old_att_start_time = $this->get_migration_script()->convertTimeFromAMPM($old_attendee['event_time']); |
|
132 | - $old_att_datetime = $this->get_migration_script()->convert_date_string_to_utc($this, $old_attendee, "$old_att_start_date $old_att_start_time:00"); |
|
113 | + $new_event_id = $this->get_migration_script()->get_mapping_new_pk($wpdb->prefix."events_detail", $old_attendee['event_id'], $wpdb->posts); |
|
114 | + if (! $new_event_id) { |
|
115 | + $this->add_error( |
|
116 | + sprintf( |
|
117 | + esc_html__( |
|
118 | + /* translators: 1: original event ID, 2: original attendee database row */ |
|
119 | + // @codingStandardsIgnoreStart |
|
120 | + 'Could not find new event ID with old event ID %1$d, on attendee row %2$s; and because of that couldn\'t find the correct datetime for Check-in', |
|
121 | + // @codingStandardsIgnoreEnd |
|
122 | + 'event_espresso' |
|
123 | + ), |
|
124 | + $old_attendee['event_id'], |
|
125 | + $this->_json_encode($old_attendee) |
|
126 | + ) |
|
127 | + ); |
|
128 | + return 0; |
|
129 | + } |
|
130 | + $old_att_start_date = $old_attendee['start_date']; |
|
131 | + $old_att_start_time = $this->get_migration_script()->convertTimeFromAMPM($old_attendee['event_time']); |
|
132 | + $old_att_datetime = $this->get_migration_script()->convert_date_string_to_utc($this, $old_attendee, "$old_att_start_date $old_att_start_time:00"); |
|
133 | 133 | |
134 | - $datetime_table = $wpdb->prefix."esp_datetime"; |
|
135 | - // add all conditions to an array from which we can SHIFT conditions off in order to widen our search |
|
136 | - // the most important condition should be last, as it will be array_shift'ed off last |
|
137 | - $conditions = array( |
|
138 | - $wpdb->prepare("$datetime_table.DTT_EVT_start = %s", $old_att_datetime),// times match? |
|
139 | - $wpdb->prepare("$datetime_table.EVT_ID = %d", $new_event_id),// events match? |
|
140 | - ); |
|
141 | - // start running queries, widening search each time by removing a condition |
|
142 | - $datetime_found = null; |
|
143 | - do { |
|
144 | - $full_query = "SELECT * FROM $datetime_table WHERE ".implode(" AND ", $conditions)." LIMIT 1"; |
|
145 | - $datetime_found = $wpdb->get_row($full_query, ARRAY_A); |
|
146 | - array_shift($conditions); |
|
147 | - } while (! $datetime_found && $conditions); |
|
148 | - return $datetime_found; |
|
149 | - } |
|
134 | + $datetime_table = $wpdb->prefix."esp_datetime"; |
|
135 | + // add all conditions to an array from which we can SHIFT conditions off in order to widen our search |
|
136 | + // the most important condition should be last, as it will be array_shift'ed off last |
|
137 | + $conditions = array( |
|
138 | + $wpdb->prepare("$datetime_table.DTT_EVT_start = %s", $old_att_datetime),// times match? |
|
139 | + $wpdb->prepare("$datetime_table.EVT_ID = %d", $new_event_id),// events match? |
|
140 | + ); |
|
141 | + // start running queries, widening search each time by removing a condition |
|
142 | + $datetime_found = null; |
|
143 | + do { |
|
144 | + $full_query = "SELECT * FROM $datetime_table WHERE ".implode(" AND ", $conditions)." LIMIT 1"; |
|
145 | + $datetime_found = $wpdb->get_row($full_query, ARRAY_A); |
|
146 | + array_shift($conditions); |
|
147 | + } while (! $datetime_found && $conditions); |
|
148 | + return $datetime_found; |
|
149 | + } |
|
150 | 150 | |
151 | - /** |
|
152 | - * Adds a new Check-in/checkout record according for $new_reg_id,$new_datetime_id,$checking_in, and $timestmap |
|
153 | - * @param int $new_reg_id |
|
154 | - * @param int $new_datetime_id |
|
155 | - * @param string $timestamp mysql datetime |
|
156 | - * @return int new Check-in id |
|
157 | - */ |
|
158 | - private function _insert_checkin_record($new_reg_id, $new_datetime) |
|
159 | - { |
|
160 | - global $wpdb; |
|
151 | + /** |
|
152 | + * Adds a new Check-in/checkout record according for $new_reg_id,$new_datetime_id,$checking_in, and $timestmap |
|
153 | + * @param int $new_reg_id |
|
154 | + * @param int $new_datetime_id |
|
155 | + * @param string $timestamp mysql datetime |
|
156 | + * @return int new Check-in id |
|
157 | + */ |
|
158 | + private function _insert_checkin_record($new_reg_id, $new_datetime) |
|
159 | + { |
|
160 | + global $wpdb; |
|
161 | 161 | |
162 | 162 | |
163 | - // ok we can actually do what we set out to do: add a checkin/checkout record |
|
164 | - $cols_n_values = array( |
|
165 | - 'REG_ID'=>$new_reg_id, |
|
166 | - 'DTT_ID'=>$new_datetime['DTT_ID'], |
|
167 | - 'CHK_in'=>true, |
|
168 | - 'CHK_timestamp'=>$new_datetime['DTT_EVT_start'] |
|
169 | - ); |
|
170 | - $datatypes = array( |
|
171 | - '%d',// REG_ID |
|
172 | - '%d',// DTT_ID |
|
173 | - '%d',// CHK_in |
|
174 | - '%s',// CHK_timestamp |
|
175 | - ); |
|
176 | - $success = $wpdb->insert($this->_new_table, $cols_n_values, $datatypes); |
|
177 | - if (! $success) { |
|
178 | - $this->add_error($this->get_migration_script()->_create_error_message_for_db_insertion($this->_old_table, $old_checkin, $this->_new_table, $cols_n_values, $datatypes)); |
|
179 | - return 0; |
|
180 | - } |
|
181 | - $new_id = $wpdb->insert_id; |
|
182 | - return $new_id; |
|
183 | - } |
|
163 | + // ok we can actually do what we set out to do: add a checkin/checkout record |
|
164 | + $cols_n_values = array( |
|
165 | + 'REG_ID'=>$new_reg_id, |
|
166 | + 'DTT_ID'=>$new_datetime['DTT_ID'], |
|
167 | + 'CHK_in'=>true, |
|
168 | + 'CHK_timestamp'=>$new_datetime['DTT_EVT_start'] |
|
169 | + ); |
|
170 | + $datatypes = array( |
|
171 | + '%d',// REG_ID |
|
172 | + '%d',// DTT_ID |
|
173 | + '%d',// CHK_in |
|
174 | + '%s',// CHK_timestamp |
|
175 | + ); |
|
176 | + $success = $wpdb->insert($this->_new_table, $cols_n_values, $datatypes); |
|
177 | + if (! $success) { |
|
178 | + $this->add_error($this->get_migration_script()->_create_error_message_for_db_insertion($this->_old_table, $old_checkin, $this->_new_table, $cols_n_values, $datatypes)); |
|
179 | + return 0; |
|
180 | + } |
|
181 | + $new_id = $wpdb->insert_id; |
|
182 | + return $new_id; |
|
183 | + } |
|
184 | 184 | } |
@@ -33,7 +33,7 @@ discard block |
||
33 | 33 | $this->_pretty_name = esc_html__('Checkins', 'event_espresso'); |
34 | 34 | $this->_old_table = $wpdb->prefix."events_attendee"; |
35 | 35 | $this->_extra_where_sql = 'AS att |
36 | - INNER JOIN ' . $wpdb->prefix . 'events_detail AS e ON att.event_id=e.id |
|
36 | + INNER JOIN ' . $wpdb->prefix.'events_detail AS e ON att.event_id=e.id |
|
37 | 37 | WHERE e.event_status!="D"'; |
38 | 38 | $this->_new_table = $wpdb->prefix."esp_checkin"; |
39 | 39 | parent::__construct(); |
@@ -43,10 +43,10 @@ discard block |
||
43 | 43 | global $wpdb; |
44 | 44 | $new_reg_table = $wpdb->prefix."esp_registration"; |
45 | 45 | |
46 | - $num_to_checkin_at_this_time = max(array(intval($old_row['checked_in_quantity']),intval($old_row['checked_in']))) ; |
|
46 | + $num_to_checkin_at_this_time = max(array(intval($old_row['checked_in_quantity']), intval($old_row['checked_in']))); |
|
47 | 47 | |
48 | 48 | $new_registrations_for_attendee = $this->get_migration_script()->get_mapping_new_pk($this->_old_table, $old_row['id'], $new_reg_table); |
49 | - if (! $new_registrations_for_attendee) { |
|
49 | + if ( ! $new_registrations_for_attendee) { |
|
50 | 50 | $new_registrations_for_attendee = array(); |
51 | 51 | } |
52 | 52 | $new_datetime = $this->_try_to_find_datetime($old_row); |
@@ -54,9 +54,9 @@ discard block |
||
54 | 54 | // make sure registrations array is numerically indexed starting at 0 (it probably already is) |
55 | 55 | $new_registrations_for_attendee = array_values($new_registrations_for_attendee); |
56 | 56 | $new_checkin_ids = array(); |
57 | - for ($i = 0; $i<abs($num_to_checkin_at_this_time); $i++) { |
|
58 | - $new_reg_id = $new_registrations_for_attendee[ $i ]; |
|
59 | - if (! $new_reg_id) { |
|
57 | + for ($i = 0; $i < abs($num_to_checkin_at_this_time); $i++) { |
|
58 | + $new_reg_id = $new_registrations_for_attendee[$i]; |
|
59 | + if ( ! $new_reg_id) { |
|
60 | 60 | $this->add_error(sprintf( |
61 | 61 | esc_html__( |
62 | 62 | /* translators: %1$s database row represented in JSON, %2$s number of registrations to check-in |
@@ -80,10 +80,10 @@ discard block |
||
80 | 80 | $new_reg_id |
81 | 81 | ) |
82 | 82 | ); |
83 | - if (! $existing_checkin_record) { |
|
83 | + if ( ! $existing_checkin_record) { |
|
84 | 84 | $new_id = $this->_insert_checkin_record($new_reg_id, $new_datetime); |
85 | 85 | if ($new_id) { |
86 | - $new_checkin_ids[]= $new_id; |
|
86 | + $new_checkin_ids[] = $new_id; |
|
87 | 87 | } |
88 | 88 | } |
89 | 89 | } |
@@ -111,7 +111,7 @@ discard block |
||
111 | 111 | global $wpdb; |
112 | 112 | |
113 | 113 | $new_event_id = $this->get_migration_script()->get_mapping_new_pk($wpdb->prefix."events_detail", $old_attendee['event_id'], $wpdb->posts); |
114 | - if (! $new_event_id) { |
|
114 | + if ( ! $new_event_id) { |
|
115 | 115 | $this->add_error( |
116 | 116 | sprintf( |
117 | 117 | esc_html__( |
@@ -135,8 +135,8 @@ discard block |
||
135 | 135 | // add all conditions to an array from which we can SHIFT conditions off in order to widen our search |
136 | 136 | // the most important condition should be last, as it will be array_shift'ed off last |
137 | 137 | $conditions = array( |
138 | - $wpdb->prepare("$datetime_table.DTT_EVT_start = %s", $old_att_datetime),// times match? |
|
139 | - $wpdb->prepare("$datetime_table.EVT_ID = %d", $new_event_id),// events match? |
|
138 | + $wpdb->prepare("$datetime_table.DTT_EVT_start = %s", $old_att_datetime), // times match? |
|
139 | + $wpdb->prepare("$datetime_table.EVT_ID = %d", $new_event_id), // events match? |
|
140 | 140 | ); |
141 | 141 | // start running queries, widening search each time by removing a condition |
142 | 142 | $datetime_found = null; |
@@ -144,7 +144,7 @@ discard block |
||
144 | 144 | $full_query = "SELECT * FROM $datetime_table WHERE ".implode(" AND ", $conditions)." LIMIT 1"; |
145 | 145 | $datetime_found = $wpdb->get_row($full_query, ARRAY_A); |
146 | 146 | array_shift($conditions); |
147 | - } while (! $datetime_found && $conditions); |
|
147 | + }while ( ! $datetime_found && $conditions); |
|
148 | 148 | return $datetime_found; |
149 | 149 | } |
150 | 150 | |
@@ -168,13 +168,13 @@ discard block |
||
168 | 168 | 'CHK_timestamp'=>$new_datetime['DTT_EVT_start'] |
169 | 169 | ); |
170 | 170 | $datatypes = array( |
171 | - '%d',// REG_ID |
|
172 | - '%d',// DTT_ID |
|
173 | - '%d',// CHK_in |
|
174 | - '%s',// CHK_timestamp |
|
171 | + '%d', // REG_ID |
|
172 | + '%d', // DTT_ID |
|
173 | + '%d', // CHK_in |
|
174 | + '%s', // CHK_timestamp |
|
175 | 175 | ); |
176 | 176 | $success = $wpdb->insert($this->_new_table, $cols_n_values, $datatypes); |
177 | - if (! $success) { |
|
177 | + if ( ! $success) { |
|
178 | 178 | $this->add_error($this->get_migration_script()->_create_error_message_for_db_insertion($this->_old_table, $old_checkin, $this->_new_table, $cols_n_values, $datatypes)); |
179 | 179 | return 0; |
180 | 180 | } |