| @@ -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 ), |
| @@ -471,9 +472,10 @@ | ||
| 471 | 472 | public static function prepare_container_classes( $metas = [], $settings = [], $custom_class = '' ) { |
| 472 | 473 | $classes = 'rtsb-elementor-container products rtsb-pos-r '; |
| 473 | 474 | $classes .= $custom_class; |
| 474 | 475 | |
| 475 | - $layout = $metas['layout']; | |
| 476 | + $raw_layout = esc_html( $metas['layout'] ); | |
| 477 | + $layout = self::filter_layout( $raw_layout ); | |
| 476 | 478 | $is_cat = preg_match( '/category/', $layout ); |
| 477 | 479 | $cart_txt_class = ''; |
| 478 | 480 | |
| 479 | 481 | $animation = $metas['hover_animation']; |
| @@ -533,8 +535,51 @@ | ||
| 533 | 535 | return apply_filters( 'rtsb/product/container/class', $classes, $settings ); |
| 534 | 536 | } |
| 535 | 537 | |
| 536 | 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 | + /** | |
| 537 | 582 | * Row classes |
| 538 | 583 | * |
| 539 | 584 | * @param array $settings Settings array. |
| 540 | 585 | * |
| @@ -544,9 +589,10 @@ | ||
| 544 | 589 | $masonry_class = null; |
| 545 | 590 | $classes = 'rtsb-row rtsb-content-loader element-loading'; |
| 546 | 591 | $loader_class = ' rtsb-pre-loader'; |
| 547 | 592 | |
| 548 | - $layout = $settings['layout']; | |
| 593 | + $raw_layout = esc_html( $settings['layout'] ); | |
| 594 | + $layout = self::filter_layout( $raw_layout ); | |
| 549 | 595 | $grid_type = $settings['grid_type']; |
| 550 | 596 | $is_carousel = preg_match( '/slider/', $layout ); |
| 551 | 597 | |
| 552 | 598 | if ( preg_match( '/category/', $layout ) && ! empty( $settings['active_cat_slider'] ) ) { |
| @@ -576,13 +622,13 @@ | ||
| 576 | 622 | |
| 577 | 623 | /** |
| 578 | 624 | * Prepare pagination attributes. |
| 579 | 625 | * |
| 580 | - * @param string $layout The layout type. | |
| 626 | + * @param string $layout The layout type. | |
| 581 | 627 | * @param bool $has_filters Whether the widget has filters. |
| 582 | - * @param string $template The template name. | |
| 583 | - * @param array $settings The widget settings. | |
| 584 | - * @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. | |
| 585 | 631 | * |
| 586 | 632 | * @return string |
| 587 | 633 | */ |
| 588 | 634 | public static function prepare_pagination_attr( $layout, $has_filters, $template, $settings, $ajax ) { |
| @@ -594,9 +640,9 @@ | ||
| 594 | 640 | } elseif ( $is_cat ) { |
| 595 | 641 | return ''; |
| 596 | 642 | } else { |
| 597 | 643 | $ajax_pagination = ! empty( $settings['show_pagination'] ) && 'pagination' !== $settings['pagination_type']; |
| 598 | - $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', '' ) ); | |
| 599 | 645 | $condition = rtsb()->has_pro() && $ajax && ( $ajax_pagination || $has_filters || $page ); |
| 600 | 646 | |
| 601 | 647 | return $condition ? self::pagination_data( $settings, $template ) : ''; |
| 602 | 648 | } |
| @@ -624,13 +670,14 @@ | ||
| 624 | 670 | * |
| 625 | 671 | * @return array |
| 626 | 672 | */ |
| 627 | 673 | public static function slider_data( array $meta, $settings = [] ) { |
| 628 | - $has_dots = $meta['slider_dot'] ? ' has-dot' : ' no-dot'; | |
| 629 | - $has_dots .= $meta['slider_nav'] ? ' has-nav' : ' no-nav'; | |
| 630 | - $d_col = 0 === $meta['d_cols'] ? self::default_columns( $meta['layout'] ) : $meta['d_cols']; | |
| 631 | - $t_col = 0 === $meta['t_cols'] ? 2 : $meta['t_cols']; | |
| 632 | - $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']; | |
| 633 | 680 | |
| 634 | 681 | if ( \Elementor\Plugin::$instance->breakpoints->has_custom_breakpoints() ) { |
| 635 | 682 | // Widescreen. |
| 636 | 683 | $w_col = self::get_data( $settings, 'cols_widescreen' ); |
| @@ -664,9 +711,9 @@ | ||
| 664 | 711 | 0 => [ |
| 665 | 712 | 'slidesPerView' => absint( $m_col ), |
| 666 | 713 | 'slidesPerGroup' => absint( $meta['m_group'] ), |
| 667 | 714 | 'pagination' => [ |
| 668 | - 'dynamicBullets' => true, | |
| 715 | + 'dynamicBullets' => $has_dynamic_dots, | |
| 669 | 716 | ], |
| 670 | 717 | ], |
| 671 | 718 | ]; |
| 672 | 719 | |
| @@ -691,16 +738,16 @@ | ||
| 691 | 738 | } |
| 692 | 739 | |
| 693 | 740 | foreach ( $el_breakpoints as $el_breakpoint => $value ) { |
| 694 | 741 | $breakpoint_value = ! empty( $value['value'] ) ? $value['value'] : $value['default_value']; |
| 695 | - $dynamic_bullets = false; | |
| 742 | + $dynamic_bullets = $has_dynamic_dots; | |
| 696 | 743 | $slides_per_view = $d_col; |
| 697 | 744 | $slides_per_group = $meta['d_group']; |
| 698 | 745 | |
| 699 | 746 | switch ( $el_breakpoint ) { |
| 700 | 747 | case 'widescreen': |
| 701 | - $slides_per_view = $w_col; | |
| 702 | - $slides_per_group = $w_group; | |
| 748 | + $slides_per_view = $w_col; | |
| 749 | + $slides_per_group = $w_group; | |
| 703 | 750 | |
| 704 | 751 | break; |
| 705 | 752 | |
| 706 | 753 | case 'laptop': |
| @@ -709,10 +756,10 @@ | ||
| 709 | 756 | |
| 710 | 757 | break; |
| 711 | 758 | |
| 712 | 759 | case 'tablet_extra': |
| 713 | - $slides_per_view = $l_col; | |
| 714 | - $slides_per_group = $l_group; | |
| 760 | + $slides_per_view = $l_col; | |
| 761 | + $slides_per_group = $l_group; | |
| 715 | 762 | |
| 716 | 763 | if ( empty( $el_breakpoints['laptop'] ) ) { |
| 717 | 764 | $slides_per_view = $d_col; |
| 718 | 765 | $slides_per_group = $meta['d_group']; |
| @@ -737,11 +784,11 @@ | ||
| 737 | 784 | |
| 738 | 785 | break; |
| 739 | 786 | |
| 740 | 787 | case 'mobile_extra': |
| 741 | - $slides_per_view = $t_col; | |
| 742 | - $slides_per_group = $meta['t_group']; | |
| 743 | - $dynamic_bullets = true; | |
| 788 | + $slides_per_view = $t_col; | |
| 789 | + $slides_per_group = $meta['t_group']; | |
| 790 | + $dynamic_bullets = $has_dynamic_dots; | |
| 744 | 791 | |
| 745 | 792 | break; |
| 746 | 793 | |
| 747 | 794 | case 'mobile': |
| @@ -746,9 +793,9 @@ | ||
| 746 | 793 | |
| 747 | 794 | case 'mobile': |
| 748 | 795 | $slides_per_view = $t_col; |
| 749 | 796 | $slides_per_group = $meta['t_group']; |
| 750 | - $dynamic_bullets = true; | |
| 797 | + $dynamic_bullets = $has_dynamic_dots; | |
| 751 | 798 | |
| 752 | 799 | if ( ! empty( $el_breakpoints['mobile_extra'] ) ) { |
| 753 | 800 | $slides_per_view = $me_col; |
| 754 | 801 | $slides_per_group = $me_group; |
| @@ -774,9 +821,9 @@ | ||
| 774 | 821 | 0 => [ |
| 775 | 822 | 'slidesPerView' => absint( $m_col ), |
| 776 | 823 | 'slidesPerGroup' => absint( $meta['m_group'] ), |
| 777 | 824 | 'pagination' => [ |
| 778 | - 'dynamicBullets' => true, | |
| 825 | + 'dynamicBullets' => $has_dynamic_dots, | |
| 779 | 826 | ], |
| 780 | 827 | ], |
| 781 | 828 | 768 => [ |
| 782 | 829 | 'slidesPerView' => absint( $t_col ), |
| @@ -781,9 +828,9 @@ | ||
| 781 | 828 | 768 => [ |
| 782 | 829 | 'slidesPerView' => absint( $t_col ), |
| 783 | 830 | 'slidesPerGroup' => absint( $meta['t_group'] ), |
| 784 | 831 | 'pagination' => [ |
| 785 | - 'dynamicBullets' => false, | |
| 832 | + 'dynamicBullets' => $has_dynamic_dots, | |
| 786 | 833 | ], |
| 787 | 834 | ], |
| 788 | 835 | 1025 => [ |
| 789 | 836 | 'slidesPerView' => absint( $d_col ), |
| @@ -788,9 +835,9 @@ | ||
| 788 | 835 | 1025 => [ |
| 789 | 836 | 'slidesPerView' => absint( $d_col ), |
| 790 | 837 | 'slidesPerGroup' => absint( $meta['d_group'] ), |
| 791 | 838 | 'pagination' => [ |
| 792 | - 'dynamicBullets' => false, | |
| 839 | + 'dynamicBullets' => $has_dynamic_dots, | |
| 793 | 840 | ], |
| 794 | 841 | ], |
| 795 | 842 | ]; |
| 796 | 843 | } |