PluginProbe
ShopBuilder – WooCommerce Builder For Elementor / 1.1.0
ShopBuilder – WooCommerce Builder For Elementor v1.1.0
3.4.2 3.4.1 3.4.0 2.0.1 2.0.2 2.0.3 2.1.0 2.1.1 2.1.10 2.1.11 2.1.12 2.1.13 2.1.14 2.1.15 2.1.2 2.1.3 2.1.4 2.1.5 2.1.6 2.1.7 2.1.8 2.1.9 2.2.0 2.2.1 2.2.2 All 63 releases
shopbuilder / app / Abstracts / ElementorWidgetBase.php

ElementorWidgetBase.php in ShopBuilder – WooCommerce Builder For Elementor 1.1.0, at app/Abstracts/ElementorWidgetBase.php

637 lines 15.2 KB
No matching file
Up and down to move Enter to open Esc to close
Raw Download Zip
1 <?php
2 /**
3 * Main ElementorWidgetBase class.
4 *
5 * @package RadiusTheme\SB
6 */
7
8 namespace RadiusTheme\SB\Abstracts;
9
10 use Elementor\Plugin;
11 use Elementor\Repeater;
12 use Elementor\Widget_Base;
13 use Elementor\Controls_Manager;
14 use Elementor\Group_Control_Border;
15 use RadiusTheme\SB\Helpers\BuilderFns;
16 use Elementor\Group_Control_Typography;
17 use Elementor\Group_Control_Background;
18 use Elementor\Group_Control_Box_Shadow;
19 use Elementor\Group_Control_Text_Shadow;
20 use Elementor\Group_Control_Text_Stroke;
21 use RadiusTheme\SB\Elementor\Helper\ControlSelectors;
22
23
24 // Do not allow directly accessing this file.
25 if ( ! defined( 'ABSPATH' ) ) {
26 exit( 'This script cannot be accessed directly.' );
27 }
28
29 /**
30 * Abstract ElementorWidgetBase Class
31 *
32 * Implemented by classes using using for elementor addons development.
33 *
34 * @version 1.0.0
35 * @package RadiusTheme\SB
36 */
37 abstract class ElementorWidgetBase extends Widget_Base {
38 /**
39 * Widget Title.
40 *
41 * @var String
42 */
43 public $rtsb_name;
44
45 /**
46 * Widget name.
47 *
48 * @var String
49 */
50 public $rtsb_base;
51
52 /**
53 * Widget categories.
54 *
55 * @var String
56 */
57 public $rtsb_category;
58
59 /**
60 * Widget icon class
61 *
62 * @var String
63 */
64 public $rtsb_icon;
65
66 /**
67 * PRO Label HTML.
68 *
69 * @var String
70 */
71 public $pro_label = '';
72
73 /**
74 * PRO content tab.
75 *
76 * @var String
77 */
78 public $pro_tab;
79
80 /**
81 * Widget prefix.
82 *
83 * @var String
84 */
85 public $el_prefix;
86
87 /**
88 * Widget controls.
89 *
90 * @var array
91 */
92 public $selectors = [];
93
94 /**
95 * Class Constructor
96 *
97 * @param array $data default data.
98 * @param array $args default arg.
99 */
100 public function __construct( $data = [], $args = null ) {
101 parent::__construct( $data, $args );
102 $this->rtsb_category = 'rtsb-shopbuilder';
103 $this->rtsb_icon = 'rtsb-el-custom rtsb-element icon-' . $this->rtsb_base;
104 $this->el_prefix = 'rtsb_el_';
105 $this->pro_label = sprintf(
106 '<span class="rtsb-pro-label">%s</span>',
107 esc_html__( 'Pro', 'shopbuilder' )
108 );
109 $this->selectors = ControlSelectors::get_widget_selectors( $this );
110
111 }
112
113 /**
114 * Elementor controls marge all settings
115 *
116 * @return array
117 */
118 abstract public function widget_fields();
119
120 /**
121 * Get widget name.
122 *
123 * Retrieve widget name.
124 *
125 * @access public
126 *
127 * @return string Widget name.
128 */
129 public function get_name() {
130 return $this->rtsb_base;
131 }
132
133 /**
134 * Set Widget Keyword.
135 *
136 * @return array
137 */
138 public function get_keywords() {
139 return [ 'woocommerce', 'shopbuilder' ];
140 }
141
142 /**
143 * Get widget title.
144 *
145 * Retrieve widget title.
146 *
147 * @access public
148 *
149 * @return string Widget title.
150 */
151 public function get_title() {
152 return $this->rtsb_name;
153 }
154
155 /**
156 * Get widget icon.
157 *
158 * Retrieve widget icon.
159 *
160 * @since 1.0.0
161 * @access public
162 *
163 * @return string Widget icon.
164 */
165 public function get_icon() {
166 return $this->rtsb_icon;
167 }
168
169 /**
170 * Get widget categories.
171 *
172 * Retrieve the list of categories widget belongs to.
173 *
174 * @since 1.0.0
175 * @access public
176 *
177 * @return array Widget categories.
178 */
179 public function get_categories() {
180 return [ $this->rtsb_category ];
181 }
182
183 /**
184 * Elementor Promotional section controls.
185 *
186 * @return array
187 */
188 public function promo_content() {
189 if ( rtsb()->has_pro() ) {
190 return [];
191 }
192
193 $promo_fields = [];
194
195 $promo_fields['pro_alert'] = [
196 'mode' => 'section_start',
197 'label' => sprintf(
198 '<span style="color: #f54">%s</span>',
199 esc_html__( 'Go Premium for More Features', 'shopbuilder' )
200 ),
201 ];
202
203 if ( $this->pro_tab ) {
204 $promo_fields['pro_alert']['tab'] = $this->pro_tab;
205 }
206
207 $promo_fields['get_pro'] = [
208 'type' => 'html',
209 'raw' => '<div class="elementor-nerd-box"><div class="elementor-nerd-box-title" style="margin-top: 0; margin-bottom: 20px;">Unlock more possibilities</div><div class="elementor-nerd-box-message"><span class="pro-feature" style="font-size: 13px;"> Get the <a href="' . esc_url( rtsb()->pro_version_link() ) . '" target="_blank" style="color: #f54">Pro version</a> for more stunning layouts and customization options.</span></div><a class="elementor-nerd-box-link elementor-button elementor-button-default elementor-button-go-pro" href="' . esc_url( rtsb()->pro_version_link() ) . '" target="_blank">Get Pro</a></div>',
210 'separator' => 'default',
211 ];
212
213 $promo_fields['pro_alert_end'] = [
214 'mode' => 'section_end',
215 ];
216
217 // TODO: Will be activated after pro version released.
218 // return $promo_fields;
219 return [];
220 }
221
222 /**
223 * Register widget controls.
224 *
225 * Adds different input fields to allow the user to change and customize the widget settings.
226 *
227 * @since 1.0.0
228 * @access protected
229 */
230 protected function register_controls() {
231
232 $this->theme_support( 'widget_controls' );
233
234 $fields = array_merge( $this->widget_fields(), $this->promo_content() );
235
236 $fields = apply_filters( 'rtsb/elements/elementor/widgets/controls/' . $this->rtsb_base, $fields, $this );
237
238 foreach ( $fields as $id => $field ) {
239 $field['classes'] = ! empty( $field['classes'] ) ? $field['classes'] . ' elementor-control-rtsb_el' : ' elementor-control-rtsb_el';
240 $field['separator'] = ! empty( $field['separator'] ) ? $field['separator'] : 'before-short';
241
242 if ( ! empty( $field['type'] ) ) {
243 $field['type'] = self::el_fields( $field['type'] );
244 }
245
246 if ( ! empty( $field['tab'] ) ) {
247 $field['tab'] = self::el_tabs( $field['tab'] );
248 }
249
250 if ( isset( $field['mode'] ) && 'section_start' === $field['mode'] ) {
251 unset( $field['mode'] );
252 unset( $field['separator'] );
253
254 $this->start_controls_section( $id, $field );
255 } elseif ( isset( $field['mode'] ) && 'section_end' === $field['mode'] ) {
256 $this->end_controls_section();
257 } elseif ( isset( $field['mode'] ) && 'tabs_start' === $field['mode'] ) {
258 unset( $field['mode'] );
259 unset( $field['separator'] );
260
261 $this->start_controls_tabs( $id );
262 } elseif ( isset( $field['mode'] ) && 'tabs_end' === $field['mode'] ) {
263 $this->end_controls_tabs();
264 } elseif ( isset( $field['mode'] ) && 'tab_start' === $field['mode'] ) {
265 unset( $field['mode'] );
266 unset( $field['separator'] );
267
268 $this->start_controls_tab( $id, $field );
269 } elseif ( isset( $field['mode'] ) && 'tab_end' === $field['mode'] ) {
270 $this->end_controls_tab();
271 } elseif ( isset( $field['mode'] ) && 'group' === $field['mode'] ) {
272 $type = $field['type'];
273 $field['name'] = $id;
274 unset( $field['mode'] );
275 unset( $field['type'] );
276 $this->add_group_control( $type, $field );
277 } elseif ( isset( $field['mode'] ) && 'responsive' === $field['mode'] ) {
278 unset( $field['mode'] );
279
280 $this->add_responsive_control( $id, $field );
281 } elseif ( isset( $field['mode'] ) && 'repeater' === $field['mode'] ) {
282 $repeater = new Repeater();
283 $repeater_fields = $field['fields'];
284
285 foreach ( $repeater_fields as $rf_id => $value ) {
286 $repeater->add_control( $rf_id, $value );
287 }
288
289 $field['fields'] = $repeater->get_controls();
290
291 $this->add_control( $id, $field );
292 } else {
293 $this->add_control( $id, $field );
294 }
295 }
296
297 do_action( 'rtsb/after/register/controls' );
298 }
299
300 /**
301 * Elementor Edit mode.
302 *
303 * @return mixed
304 */
305 public function is_edit_mode() {
306 return Plugin::$instance->preview->is_preview_mode() || Plugin::$instance->editor->is_edit_mode();
307 }
308
309 /**
310 * Elementor Edit preview.
311 *
312 * @return mixed
313 */
314 public function is_builder_mode() {
315 return BuilderFns::is_builder_preview() || $this->is_edit_mode();
316 }
317
318 /**
319 * Elementor Edit mode need some extra js for isotop reinitialize
320 *
321 * @return void
322 */
323 public function editor_slider_script() {
324 if ( \Elementor\Plugin::$instance->editor->is_edit_mode() ) {
325 $selector = $this->get_unique_selector() . ' .rtsb-carousel-slider';
326 ?>
327 <script>
328 jQuery('<?php echo esc_attr( $selector ); ?>').rtsb_slider();
329 </script>
330 <?php
331 }
332 }
333 /**
334 * Elementor Edit mode need some extra js for isotop reinitialize
335 *
336 * @return void
337 */
338 public function editor_cart_icon_script() {
339 if ( $this->is_edit_mode() ) {
340 $selector = $this->get_unique_selector() . ' .has-cart-button';
341 ?>
342 <script type="text/javascript">
343 // Product Archive Catelog
344 (function ($) {
345 var cartWrpper = $('<?php echo esc_attr( $selector ); ?>');
346 var cartIcon = cartWrpper.attr('data-cart-icon');
347 var cartButton = cartWrpper.find(
348 '.product_type_grouped, .add_to_cart_button, .single_add_to_cart_button '
349 );
350 if( cartIcon ) {
351 cartButton.find('i').remove();
352 cartButton.prepend(cartIcon);
353 }
354 })(jQuery);
355 </script>
356 <?php
357 }
358 }
359
360 /**
361 * Elementor Edit mode script
362 *
363 * @return void
364 */
365 public function edit_mode_script() {
366 if ( ! $this->is_edit_mode() ) {
367 return;
368 }
369 $ajaxurl = admin_url( 'admin-ajax.php' );
370 if ( in_array( 'sitepress-multilingual-cms/sitepress.php', get_option( 'active_plugins' ) ) ) {
371 $ajaxurl = admin_url( 'admin-ajax.php?lang=' . ICL_LANGUAGE_CODE );
372 }
373 ?>
374 <script>
375 var rtsb = {
376 ajaxurl: '<?php echo esc_url( $ajaxurl ); ?>',
377 nonce : '<?php echo esc_attr( wp_create_nonce( rtsb()->nonceId ) ); ?>',
378 is_pro : '<?php echo esc_attr( rtsb()->has_pro() ? 'true' : 'false' ); ?>'
379 };
380 rtsbElFrontend();
381 </script>
382
383 <?php
384 }
385
386 /**
387 * Starts an Elementor Section
388 *
389 * @param string $label Section label.
390 * @param object $tab Tab ID.
391 * @param array $conditions Section Condition.
392 * @param array $condition Section Conditions.
393 * @return array
394 */
395 public function start_section( $label, $tab, $conditions = [], $condition = [] ) {
396 return [
397 'mode' => 'section_start',
398 'label' => $label,
399 'tab' => $tab,
400 'condition' => $condition,
401 'conditions' => $conditions,
402 ];
403 }
404
405 /**
406 * Ends an Elementor Section
407 *
408 * @return array
409 */
410 public function end_section() {
411 return [
412 'mode' => 'section_end',
413 ];
414 }
415
416 /**
417 * Theme Support for render/widget_controls
418 *
419 * @param string $support Support for render/widget_controls.
420 * @return void
421 */
422 public function theme_support( $support = 'render' ) {
423
424 if ( empty( $support ) ) {
425 return;
426 }
427 $theme = ucwords( str_replace( [ '_', '-', ' ' ], '', rtsb()->current_theme ) );
428
429 $supportClass = apply_filters(
430 'radiustheme/sb/widgetsupport/class',
431 [
432 'ShopbuilderPlugin' => 'RadiusTheme\SB\Controllers\ThemesSupport\\' . $theme . '\\WidgetsSupport',
433 'TheTheme' => \WidgetSupport::class,
434 ]
435 );
436
437 foreach ( $supportClass as $key => $theClass ) {
438 $themeWidgetSupport = get_theme_file_path( '/shopbuilder/WidgetSupport.php' );
439 if ( 'TheTheme' === $key && file_exists( $themeWidgetSupport ) ) {
440 require_once $themeWidgetSupport;
441 }
442 if ( class_exists( $theClass ) ) {
443 $method = $support . '_' . str_replace( [ '-', ' ' ], '_', $this->rtsb_base );
444 if ( method_exists( $theClass, $method ) ) {
445 $theClass::instance( $this )->$method();
446 }
447 }
448 }
449 }
450
451 /**
452 * Starts an Elementor tab group.
453 *
454 * @param array $conditions Tab condition.
455 * @param array $condition Tab condition.
456 * @return array
457 */
458 public function start_tab_group( $conditions = [], $condition = [] ) {
459 return [
460 'mode' => 'tabs_start',
461 'conditions' => $conditions,
462 'condition' => $condition,
463 ];
464 }
465
466 /**
467 * Ends an Elementor tab group.
468 *
469 * @param array $conditions Tab condition.
470 * @param array $condition Tab condition.
471 * @return array
472 */
473 public function end_tab_group( $conditions = [], $condition = [] ) {
474 return [
475 'mode' => 'tabs_end',
476 'conditions' => $conditions,
477 'condition' => $condition,
478 ];
479 }
480
481 /**
482 * Starts an Elementor tab
483 *
484 * @param string $label Section label.
485 * @param array $conditions Tab condition.
486 * @param array $condition Tab condition.
487 * @return array
488 */
489 public function start_tab( $label, $conditions = [], $condition = [] ) {
490 return [
491 'mode' => 'tab_start',
492 'label' => $label,
493 'conditions' => $conditions,
494 'condition' => $condition,
495 ];
496 }
497
498 /**
499 * Ends an Elementor tab.
500 *
501 * @param array $conditions Tab condition.
502 * @param array $condition Tab condition.
503 * @return array
504 */
505 public function end_tab( $conditions = [], $condition = [] ) {
506 return [
507 'mode' => 'tab_end',
508 'conditions' => $conditions,
509 'condition' => $condition,
510 ];
511 }
512
513 /**
514 * Starts an Elementor Section Heading
515 *
516 * @param string $label Heading label.
517 * @param string $separator Section separator.
518 * @param array $conditions Section Condition.
519 * @param array $condition Section Conditions.
520 * @return array
521 */
522 public function el_heading( $label, $separator = null, $conditions = [], $condition = [] ) {
523 return [
524 'type' => 'html',
525 'raw' => sprintf(
526 '<h3 class="rtsb-elementor-group-heading">%s</h3>',
527 $label
528 ),
529 'separator' => $separator,
530 'content_classes' => 'elementor-panel-heading-title',
531 'conditions' => $conditions,
532 'condition' => $condition,
533 ];
534 }
535
536 /**
537 * Prints a control notification.
538 *
539 * @param string $label Field label.
540 * @return string
541 */
542 public function is_pro_control( $label ) {
543 if ( rtsb()->has_pro() ) {
544 return $label;
545 }
546
547 return $label . $this->pro_label;
548 }
549
550 /**
551 * Adds a class.
552 *
553 * @return string
554 */
555 public function pro_class() {
556 return ! rtsb()->has_pro() ? 'rtsb-pro-field' : '';
557 }
558
559 /**
560 * Elementor Fields.
561 *
562 * @param string $type Control type.
563 *
564 * @return string
565 */
566 private static function el_fields( $type ) {
567
568 $controls = Controls_Manager::class;
569
570 switch ( $type ) {
571
572 case 'link':
573 $type = $controls::URL;
574 break;
575
576 case 'image-dimensions':
577 $type = $controls::IMAGE_DIMENSIONS;
578 break;
579
580 case 'html':
581 $type = $controls::RAW_HTML;
582 break;
583
584 case 'switch':
585 $type = $controls::SWITCHER;
586 break;
587
588 case 'rtsb-image-selector':
589 $type = \RadiusTheme\SB\Elementor\Controls\ImageSelectorControl::$controlName;
590 break;
591
592 case 'typography':
593 $type = Group_Control_Typography::get_type();
594 break;
595
596 case 'border':
597 $type = Group_Control_Border::get_type();
598 break;
599
600 case 'background':
601 $type = Group_Control_Background::get_type();
602 break;
603
604 case 'box-shadow':
605 $type = Group_Control_Box_Shadow::get_type();
606 break;
607
608 case 'text-shadow':
609 $type = Group_Control_Text_Shadow::get_type();
610 break;
611
612 case 'text-stroke':
613 $type = Group_Control_Text_Stroke::get_type();
614 break;
615 default:
616 $type = constant( 'Elementor\Controls_Manager::' . strtoupper( $type ) );
617
618 }
619
620 return $type;
621 }
622 /**
623 * Elementor Fields.
624 *
625 * @param string $type Control type.
626 *
627 * @return string
628 */
629 private static function el_tabs( $tab ) {
630 return constant( 'Elementor\Controls_Manager::TAB_' . strtoupper( $tab ) );
631 }
632
633
634
635
636 }
637