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