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