| @@ -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 | } |