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 / ProductQuickAddButton.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
ProductQuickAddButton.php
262 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 * Product Quick Add Button element.
13 */
14 class ProductQuickAddButton 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-quick-add-button';
30
31 /**
32 * Element block name.
33 *
34 * @var string
35 */
36 public $block_name = 'surecart/product-quick-view-button';
37
38 /**
39 * Element icon.
40 *
41 * @var string
42 */
43 public $icon = 'ti-plus';
44
45 /**
46 * Get element label.
47 *
48 * @return string
49 */
50 public function get_label() {
51 return esc_html__( 'Product Quick Add Button', 'surecart' );
52 }
53
54 /**
55 * Get the default button label.
56 *
57 * @return string
58 */
59 protected function get_default_label(): string {
60 return esc_html__( 'Add', 'surecart' );
61 }
62
63 /**
64 * Set controls.
65 *
66 * @return void
67 */
68 public function set_controls() {
69 // Design Controls.
70 $this->controls['designSeparator'] = [
71 'label' => esc_html__( 'Design', 'surecart' ),
72 'type' => 'separator',
73 ];
74
75 $this->controls['label'] = [
76 'tab' => 'content',
77 'label' => esc_html__( 'Button Text', 'surecart' ),
78 'type' => 'text',
79 'default' => $this->get_default_label(),
80 ];
81
82 $this->controls['quick_view_button_type'] = [
83 'tab' => 'content',
84 'label' => esc_html__( 'Icon & Text', 'surecart' ),
85 'type' => 'select',
86 'options' => [
87 'icon' => esc_html__( 'Icon', 'surecart' ),
88 'text' => esc_html__( 'Text', 'surecart' ),
89 'both' => esc_html__( 'Both', 'surecart' ),
90 ],
91 'default' => 'both',
92 'inline' => true,
93 ];
94
95 // Settings Controls.
96 $this->controls['settingsSeparator'] = [
97 'label' => esc_html__( 'Settings', 'surecart' ),
98 'type' => 'separator',
99 ];
100
101 $this->controls['direct_add_to_cart'] = [
102 'tab' => 'content',
103 'label' => esc_html__( 'Direct add to cart', 'surecart' ),
104 'type' => 'checkbox',
105 'description' => esc_html__( 'Add the product directly to the cart if it has no options.', 'surecart' ),
106 'default' => true,
107 ];
108
109 $this->controls['iconSeparator'] = [
110 'label' => esc_html__( 'Icon', 'surecart' ),
111 'type' => 'separator',
112 ];
113
114 $this->controls['icon'] = [
115 'label' => esc_html__( 'Icon', 'surecart' ),
116 'type' => 'icon',
117 'default' => array(
118 'library' => 'fontawesomeSolid',
119 'icon' => 'fas fa-plus',
120 ),
121 ];
122
123 $this->controls['iconTypography'] = [
124 'label' => esc_html__( 'Typography', 'surecart' ),
125 'type' => 'typography',
126 'css' => [
127 [
128 'property' => 'font',
129 'selector' => 'i',
130 ],
131 ],
132 'required' => [ 'icon.icon', '!=', '' ],
133 ];
134
135 $this->controls['icon_position'] = [
136 'tab' => 'content',
137 'label' => esc_html__( 'Icon Position', 'surecart' ),
138 'type' => 'select',
139 'options' => [
140 'before' => esc_html__( 'Before', 'surecart' ),
141 'after' => esc_html__( 'After', 'surecart' ),
142 ],
143 'default' => 'before',
144 'inline' => true,
145 'placeholder' => esc_html__( 'Before', 'surecart' ),
146 ];
147
148 $this->controls['styleSeparator'] = [
149 'label' => esc_html__( 'Style', 'surecart' ),
150 'type' => 'separator',
151 ];
152
153 $this->controls['size'] = [
154 'label' => esc_html__( 'Size', 'surecart' ),
155 'type' => 'select',
156 'options' => $this->control_options['buttonSizes'],
157 'inline' => true,
158 'reset' => true,
159 'placeholder' => esc_html__( 'Default', 'surecart' ),
160 ];
161
162 $this->controls['style'] = [
163 'label' => esc_html__( 'Style', 'surecart' ),
164 'type' => 'select',
165 'options' => $this->control_options['styles'],
166 'inline' => true,
167 'reset' => true,
168 'default' => 'primary',
169 'placeholder' => esc_html__( 'None', 'surecart' ),
170 ];
171 }
172
173 /**
174 * Render element.
175 *
176 * @return void
177 */
178 public function render() {
179 $settings = $this->settings;
180 $product_id = get_the_ID();
181 $product = sc_get_product();
182 $is_add_to_cart = ! empty( $settings['direct_add_to_cart'] );
183 $should_direct_add = $is_add_to_cart && empty( $product->has_options );
184 $attributes = array(
185 'icon_position' => $settings['icon_position'] ?? 'before',
186 'quick_view_button_type' => $settings['quick_view_button_type'] ?? 'both',
187 'label' => $settings['label'] ?? $this->get_default_label(),
188 );
189 $show_icon = in_array( $attributes['quick_view_button_type'], [ 'icon', 'both' ], true ) && ! empty( $settings['icon'] );
190 $show_text = in_array( $attributes['quick_view_button_type'], [ 'text', 'both' ], true );
191 $quick_view_link = add_query_arg( 'product-quick-view', $product_id );
192 $is_disabled = empty( $quick_view_link ) ? 'true' : null;
193
194 if ( $should_direct_add ) {
195 $is_disabled = empty( $product->in_stock ) ? 'true' : null;
196 $aria_label = empty( $product->in_stock ) ? __( 'Sold Out', 'surecart' ) : __( 'Add to Cart', 'surecart' );
197
198 $this->set_attribute( '_root', 'disabled', $is_disabled );
199 $this->set_attribute( '_root', 'aria-label', $aria_label );
200 $this->set_attribute( '_root', 'data-wp-on--click', 'callbacks.handleSubmit' );
201 $this->set_attribute( '_root', 'data-wp-on--keydown', 'callbacks.handleSubmit' );
202 } else {
203 $this->set_attribute(
204 '_root',
205 'data-wp-context',
206 wp_json_encode(
207 [
208 'url' => sanitize_url( $quick_view_link ),
209 ],
210 JSON_HEX_TAG | JSON_HEX_APOS | JSON_HEX_QUOT | JSON_HEX_AMP
211 )
212 );
213 $this->set_attribute( '_root', 'aria-label', __( 'Quick Add Product', 'surecart' ) );
214 $this->set_attribute( '_root', 'data-wp-on--click', 'actions.open' );
215 $this->set_attribute( '_root', 'data-wp-on--keydown', 'actions.open' );
216 $this->set_attribute( '_root', 'data-wp-on--mouseenter', 'actions.prefetch' );
217 $this->set_attribute( '_root', 'data-wp-interactive', '{ "namespace": "surecart/product-quick-view" }' );
218 }
219
220 $this->set_attribute( '_root', 'class', 'wp-block-surecart-product-quick-view-button sc-button__link bricks-button' );
221 $this->set_attribute( '_root', 'data-wp-class--loading', 'state.loading' );
222 $this->set_attribute( '_root', 'data-wp-class--sc-button__link--busy', 'state.loading' );
223 $this->set_attribute( '_root', 'aria-disabled', $is_disabled );
224
225 if ( ! empty( $settings['size'] ) ) {
226 $this->set_attribute( '_root', 'class', $settings['size'] );
227 }
228
229 if ( ! empty( $settings['style'] ) ) {
230 // Outline (border).
231 if ( isset( $settings['outline'] ) ) {
232 $this->set_attribute( '_root', 'class', "bricks-color-{$settings['style']}" );
233 } else { // Background (= default).
234 $this->set_attribute( '_root', 'class', "bricks-background-{$settings['style']}" );
235 }
236 }
237
238 if ( ! $this->is_admin_editor() ) {
239 \SureCart::block()->quickView()->render();
240 }
241
242 ?>
243 <div
244 role="button"
245 tabindex="0"
246 <?php echo $this->render_attributes( '_root' ); // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped ?>
247 >
248 <span class="sc-spinner" aria-hidden="true"></span>
249 <?php if ( $show_icon && 'before' === $attributes['icon_position'] ) : ?>
250 <span class="sc-button__link-text"><?php echo self::render_icon( $settings['icon'] ); // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped ?></span>
251 <?php endif; ?>
252 <?php if ( $show_text ) : ?>
253 <span class="sc-button__link-text"><?php echo esc_html( empty( $product->in_stock ) ? __( 'Sold Out', 'surecart' ) : $attributes['label'] ); ?></span>
254 <?php endif; ?>
255 <?php if ( $show_icon && 'after' === $attributes['icon_position'] ) : ?>
256 <span class="sc-button__link-text"><?php echo self::render_icon( $settings['icon'] ); // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped ?></span>
257 <?php endif; ?>
258 </div>
259 <?php
260 }
261 }
262