PluginProbe ʕ •ᴥ•ʔ
SureCart – Ecommerce Made Easy For Selling Physical Products, Digital Downloads, Subscriptions, Donations, & Payments / 4.5.0
SureCart – Ecommerce Made Easy For Selling Physical Products, Digital Downloads, Subscriptions, Donations, & Payments v4.5.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 / app / src / Integrations / Bricks / Elements / BuyButton.php
surecart / app / src / Integrations / Bricks / Elements Last commit date
BuyButton.php 3 months ago CartMenuIcon.php 5 months ago CollectionTag.php 1 year ago CollectionTags.php 1 year ago Media.php 1 year ago PriceChoiceTemplate.php 1 year ago PriceChooser.php 4 months ago PriceData.php 1 year ago Product.php 4 months ago ProductCard.php 10 months ago ProductContent.php 10 months ago ProductData.php 1 year ago ProductLineItemNote.php 10 months ago ProductQuickAddButton.php 10 months ago ProductReviewAverageRatingStars.php 4 months ago ProductReviewAverageRatingValue.php 4 months ago ProductReviewBreakdown.php 4 months ago ProductReviewContent.php 4 months ago ProductReviewList.php 2 months ago ProductReviewRating.php 4 months ago ProductReviewTotalRating.php 4 months ago ProductReviews.php 4 months ago Quantity.php 10 months ago SaleBadge.php 1 year ago SelectedPriceAdHocAmount.php 1 year ago VariantPill.php 6 months ago VariantPills.php 1 year ago
BuyButton.php
291 lines
1 <?php
2
3 namespace SureCart\Integrations\Bricks\Elements;
4
5 use SureCart\Integrations\Bricks\Concerns\ConvertsBlocks;
6
7 if ( ! defined( 'ABSPATH' ) ) {
8 exit; // Exit if accessed directly.
9 }
10
11 /**
12 * Buy Button element.
13 */
14 class BuyButton extends \Bricks\Element {
15 use ConvertsBlocks; // we have to use a trait since we can't extend the bricks class.
16
17 /**
18 * Element category.
19 *
20 * @var string
21 */
22 public $category = 'SureCart Elements';
23
24 /**
25 * Element name.
26 *
27 * @var string
28 */
29 public $name = 'surecart-product-buy-button';
30
31 /**
32 * Element block name.
33 *
34 * @var string
35 */
36 public $block_name = 'surecart/product-buy-button';
37
38 /**
39 * Element icon.
40 *
41 * @var string
42 */
43 public $icon = 'ti-shopping-cart';
44
45 /**
46 * Get element label.
47 *
48 * @return string
49 */
50 public function get_label() {
51 return esc_html__( 'Add To Cart', 'surecart' );
52 }
53
54 /**
55 * Enqueue element-specific styles and scripts.
56 */
57 public function enqueue_scripts() {
58 wp_enqueue_style( 'surecart-spinner' );
59 wp_enqueue_style( 'surecart-wp-button' );
60 }
61
62 /**
63 * Set controls.
64 *
65 * @return void
66 */
67 public function set_controls() {
68 $this->controls['content'] = [
69 'tab' => 'content',
70 'label' => esc_html__( 'Button Text', 'surecart' ),
71 'type' => 'text',
72 'default' => esc_html__( 'Add To Cart', 'surecart' ),
73 ];
74
75 $this->controls['buy_now'] = [
76 'tab' => 'content',
77 'label' => esc_html__( 'Go Directly To Checkout', 'surecart' ),
78 'type' => 'checkbox',
79 'description' => esc_html__( 'Bypass adding to cart and go directly to the checkout.', 'surecart' ),
80 ];
81
82 $this->controls['show_sticky_purchase_button'] = [
83 'tab' => 'content',
84 'label' => esc_html__( 'Show sticky button', 'surecart' ),
85 'type' => 'select',
86 'description' => esc_html__( 'Show a sticky purchase button when this button is out of view', 'surecart' ),
87 'options' => [
88 'never' => esc_html__( 'Never', 'surecart' ),
89 'in_stock' => esc_html__( 'In stock', 'surecart' ),
90 'always' => esc_html__( 'Always', 'surecart' ),
91 ],
92 'inline' => true,
93 'fullAccess' => true,
94 'default' => 'never',
95 ];
96
97 $this->controls['styleSeparator'] = [
98 'label' => esc_html__( 'Style', 'surecart' ),
99 'type' => 'separator',
100 ];
101
102 $this->controls['size'] = [
103 'label' => esc_html__( 'Size', 'surecart' ),
104 'type' => 'select',
105 'options' => $this->control_options['buttonSizes'],
106 'inline' => true,
107 'reset' => true,
108 'placeholder' => esc_html__( 'Default', 'surecart' ),
109 ];
110
111 $this->controls['style'] = [
112 'label' => esc_html__( 'Style', 'surecart' ),
113 'type' => 'select',
114 'options' => $this->control_options['styles'],
115 'inline' => true,
116 'reset' => true,
117 'default' => 'primary',
118 'placeholder' => esc_html__( 'None', 'surecart' ),
119 ];
120
121 $this->controls['circle'] = [
122 'label' => esc_html__( 'Circle', 'surecart' ),
123 'type' => 'checkbox',
124 'reset' => true,
125 ];
126
127 $this->controls['outline'] = [
128 'label' => esc_html__( 'Outline', 'surecart' ),
129 'type' => 'checkbox',
130 'reset' => true,
131 ];
132
133 // Icon.
134 $this->controls['iconSeparator'] = [
135 'label' => esc_html__( 'Icon', 'surecart' ),
136 'type' => 'separator',
137 ];
138
139 $this->controls['icon'] = [
140 'label' => esc_html__( 'Icon', 'surecart' ),
141 'type' => 'icon',
142 ];
143
144 $this->controls['iconTypography'] = [
145 'label' => esc_html__( 'Typography', 'surecart' ),
146 'type' => 'typography',
147 'css' => [
148 [
149 'property' => 'font',
150 'selector' => 'i',
151 ],
152 ],
153 'required' => [ 'icon.icon', '!=', '' ],
154 ];
155
156 $this->controls['iconPosition'] = [
157 'label' => esc_html__( 'Position', 'surecart' ),
158 'type' => 'select',
159 'options' => $this->control_options['iconPosition'],
160 'inline' => true,
161 'placeholder' => esc_html__( 'Right', 'surecart' ),
162 'required' => [ 'icon', '!=', '' ],
163 ];
164
165 $this->controls['iconGap'] = [
166 'label' => esc_html__( 'Gap', 'surecart' ),
167 'type' => 'number',
168 'units' => true,
169 'css' => [
170 [
171 'property' => 'gap',
172 ],
173 ],
174 'required' => [ 'icon', '!=', '' ],
175 ];
176
177 $this->controls['iconSpace'] = [
178 'label' => esc_html__( 'Space between', 'surecart' ),
179 'type' => 'checkbox',
180 'css' => [
181 [
182 'property' => 'justify-content',
183 'value' => 'space-between',
184 ],
185 ],
186 'required' => [ 'icon', '!=', '' ],
187 ];
188 }
189
190 /**
191 * Render element.
192 *
193 * @return void
194 */
195 public function render() {
196 $settings = $this->settings;
197 $is_buy_now = isset( $settings['buy_now'] ) ? (bool) $settings['buy_now'] : false;
198
199 $this->set_attribute( '_root', 'class', 'bricks-button' );
200
201 if ( ! empty( $settings['size'] ) ) {
202 $this->set_attribute( '_root', 'class', $settings['size'] );
203 }
204
205 // Outline.
206 if ( isset( $settings['outline'] ) ) {
207 $this->set_attribute( '_root', 'class', 'outline' );
208 }
209
210 if ( ! empty( $settings['style'] ) ) {
211 // Outline (border).
212 if ( isset( $settings['outline'] ) ) {
213 $this->set_attribute( '_root', 'class', "bricks-color-{$settings['style']}" );
214 } else { // Background (= default).
215 $this->set_attribute( '_root', 'class', "bricks-background-{$settings['style']}" );
216 }
217 }
218
219 // Interactivity context.
220 $this->set_attribute(
221 '_root',
222 'data-wp-context',
223 wp_json_encode(
224 array(
225 'checkoutUrl' => esc_url( \SureCart::pages()->url( 'checkout' ) ),
226 'text' => $settings['content'] ?? ( $is_buy_now ? __( 'Buy Now', 'surecart' ) : __( 'Add To Cart', 'surecart' ) ),
227 'outOfStockText' => esc_attr( __( 'Sold Out', 'surecart' ) ),
228 'unavailableText' => esc_attr( __( 'Unavailable For Purchase', 'surecart' ) ),
229 'addToCart' => ! $is_buy_now,
230 'buttonText' => $settings['content'] ?? ( $is_buy_now ? __( 'Buy Now', 'surecart' ) : __( 'Add To Cart', 'surecart' ) ),
231 ),
232 JSON_HEX_TAG | JSON_HEX_APOS | JSON_HEX_QUOT | JSON_HEX_AMP
233 )
234 );
235
236 // Circle.
237 if ( isset( $settings['circle'] ) ) {
238 $this->set_attribute( '_root', 'class', 'circle' );
239 }
240
241 // Block.
242 if ( isset( $settings['block'] ) ) {
243 $this->set_attribute( '_root', 'class', 'block' );
244 }
245
246 // Link class for busy state.
247 $this->set_attribute( '_root', 'class', 'sc-button__link' );
248 $this->set_attribute( '_root', 'data-wp-class--sc-button__link--busy', 'context.busy' );
249 $this->set_attribute( '_root', 'data-wp-bind--disabled', 'state.isUnavailable' );
250
251 // Set tag and attributes.
252 if ( $is_buy_now ) {
253 $this->set_attribute( '_root', 'data-wp-on--click', 'callbacks.redirectToCheckout' );
254 }
255
256 if ( ! empty( $settings['show_sticky_purchase_button'] ) && 'never' !== $settings['show_sticky_purchase_button'] ) {
257 $this->set_attribute( '_root', 'data-wp-on-window--scroll', 'surecart/sticky-purchase::actions.toggleVisibility' );
258 $this->set_attribute( '_root', 'data-wp-on-window--resize', 'surecart/sticky-purchase::actions.toggleVisibility' );
259 }
260
261 $output = "<button {$this->render_attributes( '_root' )}>";
262
263 // Icon.
264 $icon = ! empty( $settings['icon'] ) ? self::render_icon( $settings['icon'] ) : false;
265 $icon_position = ! empty( $settings['iconPosition'] ) ? $settings['iconPosition'] : 'right';
266
267 if ( 'left' === $icon_position && $icon ) {
268 $output .= $icon;
269 }
270
271 if ( isset( $settings['content'] ) || true ) {
272 if ( $this->is_admin_editor() ) {
273 $output .= trim( $settings['content'] ?? ( $is_buy_now ? __( 'Buy Now', 'surecart' ) : __( 'Add To Cart', 'surecart' ) ) );
274 } else {
275 $output .= '<span class="sc-spinner" aria-hidden="false"></span>';
276 $output .= '<span class="sc-button__link-text" data-wp-text="state.buttonText"></span>';
277 }
278 }
279
280 if ( 'right' === $icon_position && $icon ) {
281 $output .= $icon;
282 }
283
284 $output .= '</button>';
285
286 echo $output; // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped
287
288 \SureCart::render( 'blocks/sticky-purchase', [ 'settings' => $settings ] );
289 }
290 }
291