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