PluginProbe
ShopBuilder – WooCommerce Builder For Elementor / 2.1.13
ShopBuilder – WooCommerce Builder For Elementor v2.1.13
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
← All changes | app/Elementor/Helper/RenderHelpers.php +79 -25 2.1.32.1.13 View file →
@@ -178,8 +178,9 @@
178 178 'out_of_stock_badge_text' => self::get_data( $meta, 'stock_badges_text', esc_html__( 'Out of Stock', 'shopbuilder' ) ),
179 179 'badge_position' => self::get_data( $meta, 'badges_position', 'top' ),
180 180 'badge_alignment' => self::get_data( $meta, 'badges_alignment', 'left' ),
181 181 'badge_preset' => self::get_data( $meta, 'custom_badge_preset', 'preset-1' ),
182 + 'enable_badges_module' => self::get_data( $meta, 'enable_badges_module', '' ),
182 183
183 184 // Link.
184 185 'image_link' => ! empty( $meta['image_link'] ),
185 186 'title_link' => ! empty( $meta['title_link'] ),
@@ -195,8 +196,9 @@
195 196 'auto_play' => ! empty( $meta['slide_autoplay'] ),
196 197 'stop_on_hover' => ! empty( $meta['pause_hover'] ),
197 198 'slider_nav' => ! empty( $meta['slider_nav'] ),
198 199 'slider_dot' => ! empty( $meta['slider_pagi'] ),
200 + 'slider_dynamic_dot' => ! empty( $meta['slider_dynamic_pagi'] ),
199 201 'loop' => ! empty( $meta['slider_loop'] ),
200 202 'lazy_load' => ! empty( $meta['slider_lazy_load'] ),
201 203 'auto_height' => ! empty( $meta['slider_auto_height'] ),
202 204 'speed' => self::get_data( $meta, 'slide_speed', 2000 ),
@@ -470,9 +472,10 @@
470 472 public static function prepare_container_classes( $metas = [], $settings = [], $custom_class = '' ) {
471 473 $classes = 'rtsb-elementor-container products rtsb-pos-r ';
472 474 $classes .= $custom_class;
473 475
474 - $layout = $metas['layout'];
476 + $raw_layout = esc_html( $metas['layout'] );
477 + $layout = self::filter_layout( $raw_layout );
475 478 $is_cat = preg_match( '/category/', $layout );
476 479 $cart_txt_class = '';
477 480
478 481 $animation = $metas['hover_animation'];
@@ -532,8 +535,51 @@
532 535 return apply_filters( 'rtsb/product/container/class', $classes, $settings );
533 536 }
534 537
535 538 /**
539 + * Function to filter and validate the layout against allowed patterns.
540 + *
541 + * @param string $layout The layout string to be filtered.
542 + * @param string $template The template to be checked.
543 + *
544 + * @return string
545 + */
546 + public static function filter_layout( $layout, $template = '' ) {
547 + $allowed_patterns = [ 'grid', 'list', 'slider', 'category' ];
548 + $layout_part = explode( '-', $layout );
549 + $default = 'grid-layout1';
550 +
551 + if ( empty( $layout_part[0] ) ) {
552 + return $default;
553 + }
554 +
555 + if ( in_array( $layout_part[0], $allowed_patterns, true ) ) {
556 + return $layout;
557 + } else {
558 + if ( ! empty( $template ) ) {
559 + $grid = preg_match( '/grid/', $template );
560 + $list = preg_match( '/list/', $template );
561 + $slider = preg_match( '/slider/', $template );
562 + $category = preg_match( '/category/', $template );
563 +
564 + if ( $grid ) {
565 + return $default;
566 + } elseif ( $list ) {
567 + return 'list-layout1';
568 + } elseif ( $slider ) {
569 + return 'slider-layout1';
570 + } elseif ( $category ) {
571 + return 'category-layout1';
572 + } else {
573 + return $default;
574 + }
575 + } else {
576 + return $default;
577 + }
578 + }
579 + }
580 +
581 + /**
536 582 * Row classes
537 583 *
538 584 * @param array $settings Settings array.
539 585 *
@@ -543,9 +589,10 @@
543 589 $masonry_class = null;
544 590 $classes = 'rtsb-row rtsb-content-loader element-loading';
545 591 $loader_class = ' rtsb-pre-loader';
546 592
547 - $layout = $settings['layout'];
593 + $raw_layout = esc_html( $settings['layout'] );
594 + $layout = self::filter_layout( $raw_layout );
548 595 $grid_type = $settings['grid_type'];
549 596 $is_carousel = preg_match( '/slider/', $layout );
550 597
551 598 if ( preg_match( '/category/', $layout ) && ! empty( $settings['active_cat_slider'] ) ) {
@@ -560,8 +607,14 @@
560 607
561 608 if ( ! rtsb()->has_pro() || $is_carousel ) {
562 609 $masonry_class = ' rtsb-even';
563 610 }
611 + if ( $is_carousel && ! empty( $settings['raw_settings']['always_show_nav'] ) ) {
612 + $classes .= ' always-show-nav';
613 + }
614 + if ( ! empty( $settings['raw_settings']['inner_slider_always_show_nav'] ) ) {
615 + $classes .= ' inner-slider-always-show-nav';
616 + }
564 617
565 618 $classes .= ' rtsb-' . $layout . $masonry_class . $loader_class;
566 619
567 620 return apply_filters( 'rtsb/elementor/row/classes', $classes, $settings );
@@ -569,13 +622,13 @@
569 622
570 623 /**
571 624 * Prepare pagination attributes.
572 625 *
573 - * @param string $layout The layout type.
626 + * @param string $layout The layout type.
574 627 * @param bool $has_filters Whether the widget has filters.
575 - * @param string $template The template name.
576 - * @param array $settings The widget settings.
577 - * @param bool $ajax Whether to enable AJAX pagination.
628 + * @param string $template The template name.
629 + * @param array $settings The widget settings.
630 + * @param bool $ajax Whether to enable AJAX pagination.
578 631 *
579 632 * @return string
580 633 */
581 634 public static function prepare_pagination_attr( $layout, $has_filters, $template, $settings, $ajax ) {
@@ -587,9 +640,9 @@
587 640 } elseif ( $is_cat ) {
588 641 return '';
589 642 } else {
590 643 $ajax_pagination = ! empty( $settings['show_pagination'] ) && 'pagination' !== $settings['pagination_type'];
591 - $page = Fns::product_filters_has_ajax( 'shop' ) || Fns::product_filters_has_ajax( 'archive' );
644 + $page = Fns::product_filters_has_ajax( apply_filters( 'rtsb/builder/set/current/page/type', '' ) );
592 645 $condition = rtsb()->has_pro() && $ajax && ( $ajax_pagination || $has_filters || $page );
593 646
594 647 return $condition ? self::pagination_data( $settings, $template ) : '';
595 648 }
@@ -617,13 +670,14 @@
617 670 *
618 671 * @return array
619 672 */
620 673 public static function slider_data( array $meta, $settings = [] ) {
621 - $has_dots = $meta['slider_dot'] ? ' has-dot' : ' no-dot';
622 - $has_dots .= $meta['slider_nav'] ? ' has-nav' : ' no-nav';
623 - $d_col = 0 === $meta['d_cols'] ? self::default_columns( $meta['layout'] ) : $meta['d_cols'];
624 - $t_col = 0 === $meta['t_cols'] ? 2 : $meta['t_cols'];
625 - $m_col = 0 === $meta['m_cols'] ? 1 : $meta['m_cols'];
674 + $has_dots = $meta['slider_dot'] ? ' has-dot' : ' no-dot';
675 + $has_dots .= $meta['slider_nav'] ? ' has-nav' : ' no-nav';
676 + $has_dynamic_dots = $meta['slider_dynamic_dot'] ? true : false;
677 + $d_col = 0 === $meta['d_cols'] ? self::default_columns( $meta['layout'] ) : $meta['d_cols'];
678 + $t_col = 0 === $meta['t_cols'] ? 2 : $meta['t_cols'];
679 + $m_col = 0 === $meta['m_cols'] ? 1 : $meta['m_cols'];
626 680
627 681 if ( \Elementor\Plugin::$instance->breakpoints->has_custom_breakpoints() ) {
628 682 // Widescreen.
629 683 $w_col = self::get_data( $settings, 'cols_widescreen' );
@@ -657,9 +711,9 @@
657 711 0 => [
658 712 'slidesPerView' => absint( $m_col ),
659 713 'slidesPerGroup' => absint( $meta['m_group'] ),
660 714 'pagination' => [
661 - 'dynamicBullets' => true,
715 + 'dynamicBullets' => $has_dynamic_dots,
662 716 ],
663 717 ],
664 718 ];
665 719
@@ -684,16 +738,16 @@
684 738 }
685 739
686 740 foreach ( $el_breakpoints as $el_breakpoint => $value ) {
687 741 $breakpoint_value = ! empty( $value['value'] ) ? $value['value'] : $value['default_value'];
688 - $dynamic_bullets = false;
742 + $dynamic_bullets = $has_dynamic_dots;
689 743 $slides_per_view = $d_col;
690 744 $slides_per_group = $meta['d_group'];
691 745
692 746 switch ( $el_breakpoint ) {
693 747 case 'widescreen':
694 - $slides_per_view = $w_col;
695 - $slides_per_group = $w_group;
748 + $slides_per_view = $w_col;
749 + $slides_per_group = $w_group;
696 750
697 751 break;
698 752
699 753 case 'laptop':
@@ -702,10 +756,10 @@
702 756
703 757 break;
704 758
705 759 case 'tablet_extra':
706 - $slides_per_view = $l_col;
707 - $slides_per_group = $l_group;
760 + $slides_per_view = $l_col;
761 + $slides_per_group = $l_group;
708 762
709 763 if ( empty( $el_breakpoints['laptop'] ) ) {
710 764 $slides_per_view = $d_col;
711 765 $slides_per_group = $meta['d_group'];
@@ -730,11 +784,11 @@
730 784
731 785 break;
732 786
733 787 case 'mobile_extra':
734 - $slides_per_view = $t_col;
735 - $slides_per_group = $meta['t_group'];
736 - $dynamic_bullets = true;
788 + $slides_per_view = $t_col;
789 + $slides_per_group = $meta['t_group'];
790 + $dynamic_bullets = $has_dynamic_dots;
737 791
738 792 break;
739 793
740 794 case 'mobile':
@@ -739,9 +793,9 @@
739 793
740 794 case 'mobile':
741 795 $slides_per_view = $t_col;
742 796 $slides_per_group = $meta['t_group'];
743 - $dynamic_bullets = true;
797 + $dynamic_bullets = $has_dynamic_dots;
744 798
745 799 if ( ! empty( $el_breakpoints['mobile_extra'] ) ) {
746 800 $slides_per_view = $me_col;
747 801 $slides_per_group = $me_group;
@@ -767,9 +821,9 @@
767 821 0 => [
768 822 'slidesPerView' => absint( $m_col ),
769 823 'slidesPerGroup' => absint( $meta['m_group'] ),
770 824 'pagination' => [
771 - 'dynamicBullets' => true,
825 + 'dynamicBullets' => $has_dynamic_dots,
772 826 ],
773 827 ],
774 828 768 => [
775 829 'slidesPerView' => absint( $t_col ),
@@ -774,9 +828,9 @@
774 828 768 => [
775 829 'slidesPerView' => absint( $t_col ),
776 830 'slidesPerGroup' => absint( $meta['t_group'] ),
777 831 'pagination' => [
778 - 'dynamicBullets' => false,
832 + 'dynamicBullets' => $has_dynamic_dots,
779 833 ],
780 834 ],
781 835 1025 => [
782 836 'slidesPerView' => absint( $d_col ),
@@ -781,9 +835,9 @@
781 835 1025 => [
782 836 'slidesPerView' => absint( $d_col ),
783 837 'slidesPerGroup' => absint( $meta['d_group'] ),
784 838 'pagination' => [
785 - 'dynamicBullets' => false,
839 + 'dynamicBullets' => $has_dynamic_dots,
786 840 ],
787 841 ],
788 842 ];
789 843 }