PluginProbe ʕ •ᴥ•ʔ
SureCart – Ecommerce Made Easy For Selling Physical Products, Digital Downloads, Subscriptions, Donations, & Payments / 4.6.4
SureCart – Ecommerce Made Easy For Selling Physical Products, Digital Downloads, Subscriptions, Donations, & Payments v4.6.4
4.7.0 4.6.6 4.6.5 4.6.4 4.6.3 4.6.2 4.6.1 4.6.0 4.5.1 4.5.0 4.4.2 4.4.1 4.4.0 4.3.3 4.3.2 4.3.1 4.3.0 4.2.3 4.2.2 4.2.1 1.0.3 1.0.4 1.0.5 1.0.6 1.1.0 1.1.1 1.1.10 1.1.11 1.1.12 1.1.13 1.1.14 1.1.15 1.1.16 1.1.17 1.1.18 1.1.19 1.1.2 1.1.3 1.1.4 1.1.5 1.1.6 1.1.7 1.1.8 1.1.9 1.10.0 1.10.1 1.10.2 1.10.3 1.10.4 1.11.0 1.11.1 1.11.2 1.2.0 1.2.1 1.2.2 1.2.3 1.2.4 1.2.5 1.3.0 1.3.1 1.3.2 1.3.3 1.3.4 1.4.0 1.4.1 1.4.2 1.5.0 1.5.1 1.5.2 1.5.3 1.5.4 1.5.5 1.5.6 1.5.7 1.5.8 1.6.0 1.6.1 1.6.2 1.6.3 1.6.4 1.7.0 1.7.1 1.7.2 1.8.0 1.8.1 1.8.2 1.8.3 1.8.4 1.8.5 1.9.0 1.9.1 1.9.2 1.9.3 1.9.4 1.9.5 2.0.0 2.0.1 2.1.0 2.1.1 2.1.2 2.1.3 2.1.4 2.10.0 2.10.1 2.11.0 2.11.1 2.11.2 2.11.3 2.11.4 2.12.0 2.13.0 2.14.0 2.14.1 2.15.0 2.15.1 2.16.0 2.16.1 2.16.2 2.16.3 2.17.0 2.17.1 2.17.2 2.18.0 2.19.0 2.19.2 2.19.3 2.19.4 2.2.0 2.2.1 2.20.0 2.20.1 2.20.2 2.20.3 2.20.4 2.20.5 2.20.6 2.21.0 2.22.0 2.22.1 2.23.0 2.24.0 2.25.0 2.25.1 2.25.2 2.26.0 2.27.0 2.27.1 2.28.0 2.29.0 2.29.1 2.29.2 2.29.3 2.29.4 2.3.0 2.3.1 2.30.0 2.31.0 2.31.1 2.31.2 2.31.3 2.4.0 2.4.1 2.4.2 2.4.3 2.4.4 2.40.0 2.40.1 2.5.0 2.5.1 2.5.2 2.6.0 2.6.1 2.6.2 2.7.0 2.7.1 2.7.2 2.7.3 2.7.4 2.7.5 2.8.0 2.8.1 2.8.2 2.8.3 2.8.4 2.9.0 3.0.0 3.0.0-RC1 3.0.0-RC2 3.0.0-beta1 3.0.0-beta2 3.0.1 3.0.2 3.0.3 3.0.4 3.0.5 3.1.0 3.1.1 3.1.2 3.1.3 3.1.4 3.1.5 3.1.6 3.10.0 3.10.1 3.11.0 3.12.0 3.13.0 3.13.1 3.13.2 3.13.3 3.13.4 3.14.0 3.15.0 3.15.1 3.15.2 3.15.3 3.15.4 3.15.5 3.16.0 3.16.1 3.16.2 3.16.3 3.16.4 3.16.5 3.16.6 3.16.7 3.16.8 3.17.0 3.17.1 3.17.2 3.17.3 3.17.4 3.17.5 3.17.6 3.18.0 3.19.0 3.19.1 3.19.2 3.2.0 3.2.1 3.2.2 3.20.0 3.20.1 3.3.0 3.3.1 3.4.0 3.4.1 3.4.2 3.4.3 3.5.0 3.5.1 3.5.2 3.5.3 3.6.0 3.6.1 3.6.2 3.7.0 3.7.1 3.7.2 3.7.3 3.8.0 3.8.1 3.8.2 3.8.3 3.8.4 3.8.5 3.9.0 4.0.0 4.0.1 4.0.2 4.0.3 trunk 4.1.0 0.2.19.1 4.1.1 1.0.0 4.2.0 1.0.1 1.0.2
surecart / packages / blocks / Blocks / Form / Block.php
surecart / packages / blocks / Blocks / Form Last commit date
Block.php 1 week ago block.json 4 months ago
Block.php
209 lines
1 <?php
2
3 namespace SureCartBlocks\Blocks\Form;
4
5 use SureCart\Models\ManualPaymentMethod;
6 use SureCart\Models\Processor;
7 use SureCart\Support\PublicCatalogData;
8 use SureCartBlocks\Blocks\BaseBlock;
9
10 /**
11 * Checkout block
12 */
13 class Block extends BaseBlock {
14 /**
15 * Get the style for the block
16 *
17 * @param array $attributes Block attributes.
18 * @return string
19 */
20 public function getStyle( $attributes ) {
21 $style = 'text-align: left;';
22 $style .= '--sc-form-row-spacing: ' . ( $attributes['gap'] ?? '25' ) . ';';
23 if ( ! empty( $attributes['color'] ) ) {
24 $style .= '--sc-color-primary-500: ' . sanitize_hex_color( $attributes['color'] ) . ';';
25 $style .= '--sc-focus-ring-color-primary: ' . sanitize_hex_color( $attributes['color'] ) . ';';
26 $style .= '--sc-input-border-color-focus: ' . sanitize_hex_color( $attributes['color'] ) . ';';
27 }
28 return $style;
29 }
30
31 /**
32 * Render the block
33 *
34 * @param array $attributes Block attributes.
35 * @param string $content Post content.
36 *
37 * @return string
38 */
39 public function render( $attributes, $content ) {
40 global $sc_form_id;
41 $post = get_post( $sc_form_id );
42 $user = wp_get_current_user();
43
44 $processors = Processor::get();
45 if ( is_wp_error( $processors ) ) {
46 $processors = [];
47 }
48
49 // set the initial state.
50 sc_initial_state(
51 array_filter(
52 [
53 'checkout' => [
54 'formId' => $attributes['form_id'] ?? $sc_form_id,
55 'mode' => apply_filters( 'surecart/payments/mode', $attributes['mode'] ?? 'live' ),
56 // Serialized into public page state — strip private catalog fields.
57 'product' => PublicCatalogData::product( $attributes['product'] ?? [] ),
58 'currencyCode' => $attributes['currency'] ?? \SureCart::account()->currency,
59 'groupId' => 'sc-checkout-' . ( $attributes['form_id'] ?? $sc_form_id ),
60 'abandonedCheckoutEnabled' => ! is_admin(),
61 'captureGeoAddressEnabled' => (bool) ( \SureCart::account()->order_protocol->capture_geo_address_enabled ?? false ),
62 'geoCapture' => [
63 'title' => (string) get_option( 'surecart_checkout_geo_capture_title' ),
64 'content' => (string) get_option( 'surecart_checkout_geo_capture_content' ),
65 'allowLabel' => (string) get_option( 'surecart_checkout_geo_capture_allow_label' ),
66 'declineLabel' => (string) get_option( 'surecart_checkout_geo_capture_decline_label' ),
67 ],
68 'showLoginPrompt' => (bool) get_option( 'surecart_checkout_show_login_prompt', false ),
69 'taxProtocol' => \SureCart::account()->tax_protocol,
70 'isCheckoutPage' => true,
71 'validateStock' => ! is_admin(),
72 'persist' => $this->getPeristance( $attributes, $attributes['form_id'] ?? $sc_form_id ),
73 ],
74 'processors' => [
75 'processors' => array_values(
76 array_filter(
77 $processors ?? [],
78 function ( $processor ) {
79 return $processor->approved && $processor->enabled;
80 }
81 )
82 ),
83 'manualPaymentMethods' => (array) ManualPaymentMethod::where( [ 'archived' => false ] )->get() ?? [],
84 'config' => [
85 'stripe' => [
86 'paymentElement' => (bool) get_option( 'sc_stripe_payment_element', true ),
87 ],
88 ],
89 ],
90 'user' => [
91 'loggedIn' => is_user_logged_in(),
92 'email' => $user->user_email,
93 'name' => $user->display_name,
94 'avatarUrl' => is_user_logged_in() ? get_avatar_url( $user->user_email, [ 'size' => 48 ] ) : '',
95 ],
96 'form' => array_filter(
97 [
98 'text' => array_filter(
99 [
100 'loading' => array_filter( $attributes['loading_text'] ?? [] ),
101 'success' => array_filter( $attributes['success_text'] ?? [] ),
102 ]
103 ),
104 ]
105 ),
106 ]
107 )
108 );
109
110 if ( ! empty( $attributes['prices'] ) ) {
111 $line_items = $this->convertPricesToLineItems( $attributes['prices'] );
112 sc_initial_state(
113 [
114 'checkout' => [
115 'initialLineItems' => sc_initial_line_items( $line_items ),
116 ],
117 ]
118 );
119 }
120
121 return \SureCart::block()->render(
122 'blocks/form',
123 [
124 'align' => $attributes['align'] ?? '',
125 'modified' => $post->post_modified_gmt ?? '',
126 'honeypot_enabled' => (bool) get_option( 'surecart_honeypot_enabled', true ),
127 'classes' => $this->getClasses( $attributes ),
128 'style' => $this->getStyle( $attributes ),
129 'content' => $content,
130 'id' => 'sc-checkout-' . ( $attributes['form_id'] ?? $sc_form_id ),
131 'success_url' => $this->getSuccessUrl( $attributes ),
132 ]
133 );
134 }
135
136 /**
137 * Get the URL the customer is sent to after a successful checkout.
138 *
139 * @param array $attributes Block attributes.
140 * @return string
141 */
142 public function getSuccessUrl( $attributes ) {
143 $url = ! empty( $attributes['success_url'] ) ? $attributes['success_url'] : \SureCart::pages()->url( 'order-confirmation' );
144
145 /**
146 * Filter the URL the customer is sent to after a successful checkout.
147 *
148 * A `success_url` in the checkout's metadata still wins over this — the
149 * front end prefers the per-checkout value so a single checkout can
150 * override the form it was created from.
151 *
152 * @param string $url Success URL, or an empty string when no order confirmation page is set.
153 * @param array $attributes Form block attributes.
154 */
155 return (string) apply_filters( 'surecart/checkout/success_url', $url, $attributes );
156 }
157
158 /**
159 * Get persistent mode.
160 *
161 * @param array $attributes Block attributes.
162 * @return string|false
163 */
164 public function getPeristance( $attributes, $id = null ) {
165 // don't persist in the admin.
166 if ( is_admin() ) {
167 return false;
168 }
169
170 // if there is a checkout id in the url, use url persistence.
171 if ( ! empty( $_GET['checkout_id'] ) ) {
172 return 'url';
173 }
174
175 // default checkout form should persist in the browser.
176 if ( \SureCart::forms()->getDefaultId() === (int) $id ) {
177 return 'browser';
178 }
179
180 // otherwise, use the attributes with url as the fallback.
181 return $attributes['persist_cart'] ?? 'url';
182 }
183
184 /**
185 * Convert price blocks to line items
186 *
187 * @param array $prices Array of prices.
188 *
189 * @return array Array of line items.
190 */
191 public function convertPricesToLineItems( $prices ) {
192 return array_values(
193 array_map(
194 function ( $price ) {
195 return array_filter(
196 [
197 'price' => $price['id'],
198 'variant' => $price['variant_id'] ?? null,
199 'quantity' => $price['quantity'] ?? 1,
200 'ad_hoc_amount' => $price['ad_hoc_amount'] ?? null,
201 ]
202 );
203 },
204 $prices
205 )
206 );
207 }
208 }
209