PluginProbe
ShopBuilder – WooCommerce Builder For Elementor / 2.6.4
ShopBuilder – WooCommerce Builder For Elementor v2.6.4
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 / Elementor / Render / GeneralAddons.php

GeneralAddons.php in ShopBuilder – WooCommerce Builder For Elementor 2.6.4, at app/Elementor/Render/GeneralAddons.php

636 lines 17.9 KB
No matching file
Up and down to move Enter to open Esc to close
Raw Download Zip
1 <?php
2 /**
3 * Elementor GeneralAddons Class.
4 *
5 * This class contains render logics & output for general addons.
6 *
7 * @package RadiusTheme\SB
8 */
9
10 namespace RadiusTheme\SB\Elementor\Render;
11
12 use RadiusTheme\SB\Elementor\Helper\RenderHelpers;
13 use RadiusTheme\SB\Helpers\Fns;
14
15 // Do not allow directly accessing this file.
16 if ( ! defined( 'ABSPATH' ) ) {
17 exit( 'This script cannot be accessed directly.' );
18 }
19
20 /**
21 * Elementor Render Class.
22 */
23 class GeneralAddons extends Render {
24 /**
25 * HTML.
26 *
27 * @var string
28 */
29 private $addon_html = null;
30
31 /**
32 * Element ID.
33 *
34 * @var string
35 */
36 private $id = null;
37
38 /**
39 * Unique name.
40 *
41 * @var string
42 */
43 public $unique_name = '';
44
45 /**
46 * Template name.
47 *
48 * @var string
49 */
50 public $template_name = '';
51
52 /**
53 * Settings.
54 *
55 * @var array
56 */
57 public $settings = [];
58
59 /**
60 * Carousel check.
61 *
62 * @var bool
63 */
64 public $is_carousel = false;
65
66 /**
67 * Blog Post check.
68 *
69 * @var bool
70 */
71 public $is_post_query = false;
72
73 /**
74 * Blog Post Pagination.
75 *
76 * @var bool
77 */
78 public $is_post_pagination = false;
79
80 /**
81 * Grid check.
82 *
83 * @var bool
84 */
85 public $is_grid = false;
86
87 /**
88 * Content classes.
89 *
90 * @var bool
91 */
92 public $content_classes = [
93 'rtsb-col-grid',
94 ];
95
96 /**
97 * Renders the addon view.
98 *
99 * @param array $data The addon data.
100 * @param array $settings The addon settings.
101 *
102 * @return string
103 */
104 public function addon_view( $data, $settings = [] ) {
105 $this->id = $data['id'];
106 $this->unique_name = $data['unique_name'];
107 $this->template_name = $data['template'];
108 $this->settings = $settings;
109 $this->is_carousel = $data['is_carousel'] ?? false;
110 $this->is_post_query = $data['is_post_query'] ?? false;
111 $this->is_grid = $data['is_grid'] ?? false;
112 $this->is_post_pagination = $data['is_post_pagination'] ?? false;
113 $content = $data['content'];
114
115 if ( ! ( $this->is_grid || empty( $data['content_class'] ) ) ) {
116 $this->content_classes[] = $data['content_class'];
117 $this->content_classes = implode( ' ', $this->content_classes );
118 }
119
120 // Container.
121 $this->addon_container( $content, $data );
122
123 return $this->addon_html;
124 }
125
126 /**
127 * Generates the container HTML.
128 *
129 * @param string $content The content inside the container.
130 * @param array $args Additional arguments for the container.
131 *
132 * @return string
133 */
134 public function addon_container( $content, $args = [] ) {
135 $container_id = 'rtsb-container-' . $this->id;
136 $container_classes = $this->get_container_classes( $args['container_class'] ?? '' );
137 $raw_layout = $args['layout'] ?? '';
138 $template = $args['template'];
139 $layout = RenderHelpers::filter_layout( $raw_layout, $template );
140 $style_attr = '--rtsb-default-columns: ' . esc_attr( RenderHelpers::default_columns( $layout ) );
141 $container_attributes = [
142 'id' => $container_id,
143 'class' => $container_classes,
144 'data-layout' => $layout,
145 ];
146 if ( $this->is_grid ) {
147 $container_attributes['style'] = apply_filters( 'rtsb/general_widget/container/attr', $style_attr, $this->settings );
148 }
149
150 if ( ! empty( $args['container_attr'] ) ) {
151 $container_attributes = array_merge( $container_attributes, $args['container_attr'] );
152 }
153
154 $row_args = wp_parse_args(
155 $this->get_row_args(),
156 [
157 'layout' => $raw_layout,
158 'template' => $template,
159 'content_class' => $args['content_class'] ?? '',
160 'post_query' => $args['post_query'] ?? '',
161 ]
162 );
163
164 // Adding render attributes.
165 $this->add_attribute( 'rtsb_addon_container_attr_' . $this->id, $container_attributes );
166
167 // Generate HTML for the container.
168 $this->addon_html = '<div ' . $this->get_attribute_string( 'rtsb_addon_container_attr_' . $this->id ) . '>';
169 $this->addon_row( $content, $row_args );
170 $this->addon_html .= '</div><!-- .rtsb-container -->';
171
172 return $this->addon_html;
173 }
174
175 /**
176 * Generates the row HTML.
177 *
178 * @param string $content The content inside the row.
179 * @param array $args Additional arguments for the row.
180 *
181 * @return string
182 */
183 public function addon_row( $content, $args = [] ) {
184 $layout = RenderHelpers::filter_layout( $args['layout'] ?? '' );
185 $row_classes = $this->get_row_classes( $layout );
186
187 // Adding render attributes.
188 $this->add_attribute( 'rtsb_addon_row_attr_' . $this->id, 'class', $row_classes );
189
190 // Start rendering the row.
191 $this->addon_html .= '<div ' . $this->get_attribute_string( 'rtsb_addon_row_attr_' . $this->id ) . '>';
192 if ( $this->is_carousel ) {
193 $this->slider_wrapper_start();
194 }
195
196 // Rendering the content.
197 $this->get_content( $content, $args );
198
199 if ( $this->is_carousel ) {
200 $this->slider_wrapper_end();
201 }
202 $this->addon_html .= '</div><!-- .rtsb-row -->';
203
204 if ( $this->is_post_query && $this->is_post_pagination && ! empty( $args['post_query'] ) ) {
205 $this->addon_html .= $this->render_posts_pagination( $args );
206 }
207 // Preloader.
208
209 $this->addon_html .= $this->pre_loader();
210
211 return $this->addon_html;
212 }
213
214 /**
215 * Renders the content inside the row.
216 *
217 * @param string $content The content.
218 * @param array $args Additional arguments for the content.
219 *
220 * @return void
221 */
222 protected function get_content( $content, $args = [] ) {
223 // Adding render attributes.
224 $this->add_attribute( 'rtsb_addon_content_attr_' . $this->id, 'class', $this->content_classes );
225
226 // Render content HTML.
227 $this->addon_html .= ! $this->is_grid ? '<div ' . $this->get_attribute_string( 'rtsb_addon_content_attr_' . $this->id ) . '>' : '';
228 $this->addon_html .= $content;
229 $this->addon_html .= ! $this->is_grid ? '</div><!-- .rtsb-col-grid -->' : '';
230 }
231
232 /**
233 * Gets container classes.
234 *
235 * @param string $custom Optional custom classes.
236 *
237 * @return string
238 */
239 protected function get_container_classes( $custom = '' ) {
240 $classes = [
241 'rtsb-elementor-container',
242 'rtsb-pos-r',
243 $this->unique_name,
244 ];
245
246 if ( ! empty( $custom ) ) {
247 $classes[] = $custom;
248 }
249 if ( ! empty( $this->settings['slider_slide_animation'] ) ) {
250 $classes[] = 'has-slide-animation';
251 }
252 $classes = implode( ' ', $classes );
253
254 return apply_filters( 'rtsb/general/addon_container/class', $classes, $this->settings );
255 }
256
257 /**
258 * Gets row classes.
259 *
260 * @param string $layout Optional layout name.
261 *
262 * @return string
263 */
264 protected function get_row_classes( $layout = '' ) {
265 $classes = [
266 'rtsb-row',
267 'rtsb-content-loader',
268 ];
269
270 if ( ! empty( $layout ) ) {
271 $classes[] = $layout;
272 }
273
274 if ( $this->is_carousel ) {
275 $classes[] = 'rtsb-slider-layout';
276 }
277 if ( $this->is_carousel && ! empty( $this->settings['always_show_nav'] ) ) {
278 $classes[] = 'always-show-nav';
279 }
280 if ( ! empty( $this->settings['cols_mobile'] ) && '1' == $this->settings['cols_mobile'] ) {
281 $classes[] = ' rtsb-mobile-flex-row';
282 }
283 $classes = implode( ' ', $classes );
284
285 return apply_filters( 'rtsb/general/addon_row/class', $classes, $this->settings );
286 }
287
288 /**
289 * Gets row arguments.
290 *
291 * @return array Row arguments.
292 */
293 protected function get_row_args() {
294 return [];
295 }
296
297 /**
298 * Starts the carousel slider wrapper.
299 *
300 * @return void
301 */
302 private function slider_wrapper_start() {
303 if ( 'rtsb-hero-slider' === $this->unique_name ) {
304 $slider_data = self::get_hero_slider_data( $this->settings );
305 } else {
306 $slider_data = $this->get_slider_data();
307 $slider_options = $slider_data['data'] ?? '';
308 $slider_classes = $slider_data['class'] ?? '';
309 $slider_data = [
310 'class' => 'rtsb-carousel-slider swiper ' . $slider_classes,
311 'data' => $slider_options,
312 ];
313 }
314
315 // Adding slider attributes.
316 $this->add_attribute(
317 'rtsb_slider_attr_' . $this->id,
318 [
319 'class' => 'rtsb-col-grid ' . $slider_data['class'],
320 'data-options' => $slider_data['data'],
321 ]
322 );
323
324 // Render slider wrapper.
325 $this->addon_html .= '<div ' . $this->get_attribute_string( 'rtsb_slider_attr_' . $this->id ) . '>';
326 $this->addon_html .= '<div class="swiper-wrapper">';
327 }
328
329 /**
330 * Ends the carousel slider wrapper.
331 *
332 * @return void
333 */
334 private function slider_wrapper_end() {
335 $this->addon_html .= '</div><!-- .swiper-wrapper -->';
336 $this->addon_html .= $this->slider_buttons( $this->settings );
337 $this->addon_html .= '</div><!-- .rtsb-carousel-slider -->';
338 }
339
340 /**
341 * Gets slider data for the carousel.
342 *
343 * @return array
344 */
345 protected function get_slider_data() {
346 $metas = $this->get_slider_meta_dataset( $this->settings, $this->template_name, $this->settings );
347
348 return RenderHelpers::slider_data( (array) $metas, $this->settings );
349 }
350 /**
351 * Gets slider data for the carousel.
352 *
353 * @return string
354 */
355 protected function get_slider_meta_dataset( array $meta, $template = '', $raw_settings = [] ) {
356 $data = [
357 'widget' => 'custom',
358 'widget_name' => $this->unique_name,
359 'template' => RenderHelpers::get_data( $template, '', '' ),
360 'raw_settings' => $raw_settings,
361 'd_cols' => RenderHelpers::get_data( $meta, 'cols', 0 ),
362 't_cols' => RenderHelpers::get_data( $meta, 'cols_tablet', 2 ),
363 'm_cols' => RenderHelpers::get_data( $meta, 'cols_mobile', 1 ),
364 'd_group' => RenderHelpers::get_data( $meta, 'cols_group', 1 ),
365 't_group' => RenderHelpers::get_data( $meta, 'cols_group_tablet', 1 ),
366 'm_group' => RenderHelpers::get_data( $meta, 'cols_group_mobile', 1 ),
367 'layout' => RenderHelpers::get_data( $meta, 'layout_style', 'layout1' ),
368 'auto_play' => ! empty( $meta['slide_autoplay'] ),
369 'stop_on_hover' => ! empty( $meta['pause_hover'] ),
370 'slider_nav' => ! empty( $meta['slider_nav'] ),
371 'slider_dot' => ! empty( $meta['slider_pagi'] ),
372 'slider_dynamic_dot' => ! empty( $meta['slider_dynamic_pagi'] ),
373 'loop' => ! empty( $meta['slider_loop'] ),
374 'lazy_load' => ! empty( $meta['slider_lazy_load'] ),
375 'auto_height' => ! empty( $meta['slider_auto_height'] ),
376 'speed' => RenderHelpers::get_data( $meta, 'slide_speed', 2000 ),
377 'space_between' => isset( $meta['grid_gap']['size'] ) && strlen( $meta['grid_gap']['size'] ) ? $meta['grid_gap']['size'] : 30,
378 'auto_play_timeout' => RenderHelpers::get_data( $meta, 'autoplay_timeout', 5000 ),
379 'nav_position' => RenderHelpers::get_data( $meta, 'slider_nav_position', 'top' ),
380 'left_arrow_icon' => RenderHelpers::get_data( $meta, 'slider_left_arrow_icon', [] ),
381 'right_arrow_icon' => RenderHelpers::get_data( $meta, 'slider_right_arrow_icon', [] ),
382 ];
383 if ( ! empty( $meta['cols_widescreen'] ) ) {
384 $data['w_cols'] = $meta['cols_widescreen'];
385 }
386
387 if ( ! empty( $meta['cols_laptop'] ) ) {
388 $data['l_cols'] = $meta['cols_laptop'];
389 }
390
391 if ( ! empty( $meta['cols_tablet_extra'] ) ) {
392 $data['te_cols'] = $meta['cols_tablet_extra'];
393 }
394
395 if ( ! empty( $meta['cols_mobile_extra'] ) ) {
396 $data['me_cols'] = $meta['cols_mobile_extra'];
397 }
398
399 return apply_filters( 'rtsb/elementor/render/slider_dataset_final', $data, $meta, $raw_settings );
400 }
401
402 /**
403 * Gets hero slider data for the carousel.
404 *
405 * @return array
406 */
407 protected function get_hero_slider_data( array $meta ) {
408 $has_dots = $meta['slider_pagi'] ? ' has-dot' : ' no-dot';
409 $has_dots .= $meta['slider_nav'] ? ' has-nav' : ' no-nav';
410 $has_dynamic_dots = $meta['slider_dynamic_pagi'] ? true : false;
411 $breakpoints = [
412 0 => [
413 'slidesPerView' => 1,
414 'slidesPerGroup' => 1,
415 'pagination' => [
416 'dynamicBullets' => $has_dynamic_dots,
417 'type' => RenderHelpers::get_data( $meta, 'slider_pagi_type', 'bullet' ),
418 ],
419 ],
420 768 => [
421 'slidesPerView' => 1,
422 'slidesPerGroup' => 1,
423 'pagination' => [
424 'dynamicBullets' => $has_dynamic_dots,
425 'type' => RenderHelpers::get_data( $meta, 'slider_pagi_type', 'bullet' ),
426 ],
427 ],
428 1025 => [
429 'slidesPerView' => 1,
430 'slidesPerGroup' => 1,
431 'pagination' => [
432 'dynamicBullets' => $has_dynamic_dots,
433 'type' => RenderHelpers::get_data( $meta, 'slider_pagi_type', 'bullet' ),
434 ],
435 ],
436 ];
437 $slider_options = [
438 'slidesPerView' => 1,
439 'slidesPerGroup' => 1,
440 'speed' => absint( RenderHelpers::get_data( $meta, 'slide_speed', 2000 ) ),
441 'loop' => ! empty( $meta['slider_loop'] ),
442 'autoHeight' => ! empty( $meta['slider_auto_height'] ),
443 'preloadImages' => ! empty( $meta['slider_lazy_load'] ),
444 'lazy' => ! empty( $meta['slider_lazy_load'] ),
445 'breakpoints' => $breakpoints,
446 ];
447 if ( $meta['slide_autoplay'] ) {
448 $slider_options['autoplay'] = [
449 'delay' => absint( RenderHelpers::get_data( $meta, 'autoplay_timeout', 5000 ) ),
450 'pauseOnMouseEnter' => ! empty( $meta['pause_hover'] ),
451 'disableOnInteraction' => false,
452 ];
453 }
454 if ( 'fraction' === $meta['slider_pagi_type'] ) {
455 unset( $slider_options['pagination']['dynamicBullets'] );
456 }
457 if ( 'parallax' === $meta['slider_effect'] ) {
458 $slider_options['parallax'] = true;
459 } else {
460 $slider_options['effect'] = $meta['slider_effect'];
461 }
462 if ( 'fade' === $meta['slider_effect'] ) {
463 $slider_options['crossFade'] = true;
464 }
465
466 $slider_options = apply_filters( 'rtsb/elementor/render/hero_slider_dataset', $slider_options, $this->settings );
467 $carouselClass = 'rtsb-hero-carousel-slider slider-loading rtsb-pos-s ' . $has_dots;
468 return [
469 'data' => esc_js( wp_json_encode( $slider_options ) ),
470 'class' => $carouselClass,
471 ];
472 }
473
474
475 /**
476 * Renders the carousel slider buttons.
477 *
478 * @return string
479 */
480 protected function slider_buttons( $settings ) {
481 $html = '';
482 $pagination_type = '';
483 $left_icon = $settings['slider_left_arrow_icon'] ?? '';
484 $right_icon = $settings['slider_right_arrow_icon'] ?? '';
485 $is_hero_carousel = 'rtsb-hero-slider' === $this->unique_name;
486 if ( $is_hero_carousel && ! empty( $settings['slider_pagi_type'] ) ) {
487 $pagination_type = $settings['slider_pagi_type'];
488 }
489 if ( ! empty( $settings['slider_nav'] ) ) {
490 $html .=
491 '<div class="swiper-nav">
492 <div class="swiper-arrow swiper-button-next">
493 ' . Fns::icons_manager( $right_icon ) . '
494 </div>
495 <div class="swiper-arrow swiper-button-prev">
496 ' . Fns::icons_manager( $left_icon ) . '
497 </div>
498 </div>';
499 }
500
501 $html .= ! empty( $settings['slider_pagi'] ) ? '<div class="swiper-pagination rtsb-pos-s ' . esc_attr( $pagination_type ) . '"></div>' : '';
502
503 return $html;
504 }
505 /**
506 * Preloader.
507 *
508 * @return string
509 */
510 public function pre_loader() {
511 if ( $this->is_carousel ) {
512 return '<div class="rtsb-elements-loading rtsb-ball-clip-rotate"><div></div></div>';
513 }
514 return '';
515 }
516 /**
517 * No posts message.
518 *
519 * @return string
520 */
521 public function no_posts_msg() {
522 return '<div class="rtsb-notice">
523 <div class="woocommerce-info">' . esc_html__( 'No posts were found matching your selection.', 'shopbuilder' ) . '</div>
524 </div>';
525 }
526 /**
527 * Renders posts pagination
528 *
529 * @param array $args Pagination args.
530 *
531 * @return string
532 */
533 public function render_posts_pagination( $args ) {
534 list(
535 'post_query' => $query,
536 'posts_limit' => $limit,
537 'posts_per_page' => $per_page
538 ) = $args;
539 $html_utility = null;
540 $html = null;
541 $posts_per_page = $query->query_vars['posts_per_page'];
542 $found_posts = $query->found_posts;
543 $total_page = $query->max_num_pages;
544 if ( $limit ) {
545 if ( ( empty( $wp_query->query['tax_query'] ) ) ) {
546 $found_posts = $query->found_posts;
547 }
548
549 if ( $per_page && $found_posts > $per_page ) {
550 $found_posts = $limit;
551 $total_page = ceil( $found_posts / $per_page );
552 }
553 }
554
555 $total_page = absint( $total_page );
556
557 $html_utility .= Fns::custom_pagination(
558 $total_page,
559 $posts_per_page
560 );
561
562 if ( $html_utility ) {
563 $rand = wp_rand();
564
565 // Adding pagination render attributes.
566 $this->add_attribute(
567 'rtsb_pagination_attr_' . $rand,
568 [
569 'class' => 'rtsb-pagination-wrap element-loading',
570 'data-total-pages' => $total_page,
571 'data-posts-per-page' => $posts_per_page,
572 'data-type' => 'pagination',
573 ]
574 );
575
576 // Start rendering.
577 $html = '<div ' . $this->get_attribute_string( 'rtsb_pagination_attr_' . $rand ) . '>';
578 $html .= $html_utility;
579 $html .= '</div><!-- .rtsb-pagination-wrap -->';
580 }
581
582 return $html;
583 }
584
585 /**
586 * Function to render buttom html.
587 *
588 * @param array $args Button Arguments.
589 *
590 * @return void
591 */
592 public static function render_buttom_html( $args ) {
593 $default_args = [
594 'button_attributes' => '',
595 'sb_button_icon' => '',
596 'sb_button_icon_position' => 'right',
597 'sb_button_content' => esc_html__( 'ShopBuilder Button', 'shopbuilder' ),
598 ];
599 $args = wp_parse_args( $args, $default_args );
600 ?>
601 <a <?php Fns::print_html( $args['button_attributes'] ); ?>>
602 <span class="text-wrap <?php echo esc_attr( 'icon-' . $args['sb_button_icon_position'] ); ?>">
603 <?php
604 Fns::print_html( self::render_button_icon( 'left', $args['sb_button_icon'], $args['sb_button_icon_position'] ) );
605 Fns::print_html( '<span class="text">' );
606 Fns::print_html( $args['sb_button_content'] );
607 Fns::print_html( '</span>' );
608 Fns::print_html( '<span class="hover-text">' );
609 Fns::print_html( $args['sb_button_content'] );
610 Fns::print_html( '</span>' );
611 Fns::print_html( self::render_button_icon( 'right', $args['sb_button_icon'], $args['sb_button_icon_position'] ) );
612 ?>
613 </span>
614 </a>
615 <?php
616 }
617 /**
618 * Function to render icon.
619 *
620 * @param string $position icon position ('left' or 'right').
621 * @param array $icon Position of the separator in settings.
622 *
623 * @return string
624 */
625 public static function render_button_icon( $position, $icon, $icon_position ) {
626 $html = '';
627
628 // Render the left icon.
629 if ( $position === $icon_position ) {
630 $html .= '<span class="icon">' . Fns::icons_manager( $icon ) . '</span>';
631 }
632
633 return $html;
634 }
635 }
636