| @@ -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 ), |
| @@ -208,8 +210,12 @@ | ||
| 208 | 210 | ], |
| 209 | 211 | $meta |
| 210 | 212 | ); |
| 211 | 213 | |
| 214 | + if ( ! empty( $meta['active_cat_slider'] ) ) { | |
| 215 | + $data['active_cat_slider'] = true; | |
| 216 | + } | |
| 217 | + | |
| 212 | 218 | if ( ! empty( $meta['cols_widescreen'] ) ) { |
| 213 | 219 | $data['w_cols'] = $meta['cols_widescreen']; |
| 214 | 220 | } |
| 215 | 221 | |
| @@ -411,8 +417,9 @@ | ||
| 411 | 417 | |
| 412 | 418 | case 'list-layout1': |
| 413 | 419 | case 'list-layout2': |
| 414 | 420 | case 'list-layout3': |
| 421 | + case 'list-layout7': | |
| 415 | 422 | case 'list-layout5': |
| 416 | 423 | $columns = 1; |
| 417 | 424 | break; |
| 418 | 425 | |
| @@ -449,9 +456,9 @@ | ||
| 449 | 456 | */ |
| 450 | 457 | public static function pagination_data( $metas, $template ) { |
| 451 | 458 | $el_data = self::meta_dataset( $metas, $template ); |
| 452 | 459 | |
| 453 | - return esc_js( wp_json_encode( $el_data ) ); | |
| 460 | + return esc_js( wp_json_encode( $el_data, JSON_UNESCAPED_UNICODE ) ); | |
| 454 | 461 | } |
| 455 | 462 | |
| 456 | 463 | /** |
| 457 | 464 | * Container classes |
| @@ -465,9 +472,10 @@ | ||
| 465 | 472 | public static function prepare_container_classes( $metas = [], $settings = [], $custom_class = '' ) { |
| 466 | 473 | $classes = 'rtsb-elementor-container products rtsb-pos-r '; |
| 467 | 474 | $classes .= $custom_class; |
| 468 | 475 | |
| 469 | - $layout = $metas['layout']; | |
| 476 | + $raw_layout = esc_html( $metas['layout'] ); | |
| 477 | + $layout = self::filter_layout( $raw_layout ); | |
| 470 | 478 | $is_cat = preg_match( '/category/', $layout ); |
| 471 | 479 | $cart_txt_class = ''; |
| 472 | 480 | |
| 473 | 481 | $animation = $metas['hover_animation']; |
| @@ -519,13 +527,59 @@ | ||
| 519 | 527 | if ( rtsb()->has_pro() && ! empty( $settings['custom_ordering'] ) ) { |
| 520 | 528 | $classes .= ' has-custom-ordering'; |
| 521 | 529 | } |
| 522 | 530 | } |
| 531 | + if ( rtsb()->has_pro() && ! empty( $settings['slider_slide_animation'] ) ) { | |
| 532 | + $classes .= ' has-slide-animation'; | |
| 533 | + } | |
| 523 | 534 | |
| 524 | 535 | return apply_filters( 'rtsb/product/container/class', $classes, $settings ); |
| 525 | 536 | } |
| 526 | 537 | |
| 527 | 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 | + /** | |
| 528 | 582 | * Row classes |
| 529 | 583 | * |
| 530 | 584 | * @param array $settings Settings array. |
| 531 | 585 | * |
| @@ -535,12 +589,17 @@ | ||
| 535 | 589 | $masonry_class = null; |
| 536 | 590 | $classes = 'rtsb-row rtsb-content-loader element-loading'; |
| 537 | 591 | $loader_class = ' rtsb-pre-loader'; |
| 538 | 592 | |
| 539 | - $layout = $settings['layout']; | |
| 593 | + $raw_layout = esc_html( $settings['layout'] ); | |
| 594 | + $layout = self::filter_layout( $raw_layout ); | |
| 540 | 595 | $grid_type = $settings['grid_type']; |
| 541 | 596 | $is_carousel = preg_match( '/slider/', $layout ); |
| 542 | 597 | |
| 598 | + if ( preg_match( '/category/', $layout ) && ! empty( $settings['active_cat_slider'] ) ) { | |
| 599 | + $classes .= ' rtsb-slider-layout'; | |
| 600 | + } | |
| 601 | + | |
| 543 | 602 | if ( 'even' === $grid_type ) { |
| 544 | 603 | $masonry_class = ' rtsb-even'; |
| 545 | 604 | } elseif ( 'masonry' === $grid_type ) { |
| 546 | 605 | $masonry_class = ' rtsb-masonry'; |
| @@ -548,8 +607,14 @@ | ||
| 548 | 607 | |
| 549 | 608 | if ( ! rtsb()->has_pro() || $is_carousel ) { |
| 550 | 609 | $masonry_class = ' rtsb-even'; |
| 551 | 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 | + } | |
| 552 | 617 | |
| 553 | 618 | $classes .= ' rtsb-' . $layout . $masonry_class . $loader_class; |
| 554 | 619 | |
| 555 | 620 | return apply_filters( 'rtsb/elementor/row/classes', $classes, $settings ); |
| @@ -557,13 +622,13 @@ | ||
| 557 | 622 | |
| 558 | 623 | /** |
| 559 | 624 | * Prepare pagination attributes. |
| 560 | 625 | * |
| 561 | - * @param string $layout The layout type. | |
| 626 | + * @param string $layout The layout type. | |
| 562 | 627 | * @param bool $has_filters Whether the widget has filters. |
| 563 | - * @param string $template The template name. | |
| 564 | - * @param array $settings The widget settings. | |
| 565 | - * @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. | |
| 566 | 631 | * |
| 567 | 632 | * @return string |
| 568 | 633 | */ |
| 569 | 634 | public static function prepare_pagination_attr( $layout, $has_filters, $template, $settings, $ajax ) { |
| @@ -575,9 +640,9 @@ | ||
| 575 | 640 | } elseif ( $is_cat ) { |
| 576 | 641 | return ''; |
| 577 | 642 | } else { |
| 578 | 643 | $ajax_pagination = ! empty( $settings['show_pagination'] ) && 'pagination' !== $settings['pagination_type']; |
| 579 | - $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', '' ) ); | |
| 580 | 645 | $condition = rtsb()->has_pro() && $ajax && ( $ajax_pagination || $has_filters || $page ); |
| 581 | 646 | |
| 582 | 647 | return $condition ? self::pagination_data( $settings, $template ) : ''; |
| 583 | 648 | } |
| @@ -605,13 +670,14 @@ | ||
| 605 | 670 | * |
| 606 | 671 | * @return array |
| 607 | 672 | */ |
| 608 | 673 | public static function slider_data( array $meta, $settings = [] ) { |
| 609 | - $has_dots = $meta['slider_dot'] ? ' has-dot' : ' no-dot'; | |
| 610 | - $has_dots .= $meta['slider_nav'] ? ' has-nav' : ' no-nav'; | |
| 611 | - $d_col = 0 === $meta['d_cols'] ? self::default_columns( $meta['layout'] ) : $meta['d_cols']; | |
| 612 | - $t_col = 0 === $meta['t_cols'] ? 2 : $meta['t_cols']; | |
| 613 | - $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']; | |
| 614 | 680 | |
| 615 | 681 | if ( \Elementor\Plugin::$instance->breakpoints->has_custom_breakpoints() ) { |
| 616 | 682 | // Widescreen. |
| 617 | 683 | $w_col = self::get_data( $settings, 'cols_widescreen' ); |
| @@ -645,9 +711,9 @@ | ||
| 645 | 711 | 0 => [ |
| 646 | 712 | 'slidesPerView' => absint( $m_col ), |
| 647 | 713 | 'slidesPerGroup' => absint( $meta['m_group'] ), |
| 648 | 714 | 'pagination' => [ |
| 649 | - 'dynamicBullets' => true, | |
| 715 | + 'dynamicBullets' => $has_dynamic_dots, | |
| 650 | 716 | ], |
| 651 | 717 | ], |
| 652 | 718 | ]; |
| 653 | 719 | |
| @@ -672,16 +738,16 @@ | ||
| 672 | 738 | } |
| 673 | 739 | |
| 674 | 740 | foreach ( $el_breakpoints as $el_breakpoint => $value ) { |
| 675 | 741 | $breakpoint_value = ! empty( $value['value'] ) ? $value['value'] : $value['default_value']; |
| 676 | - $dynamic_bullets = false; | |
| 742 | + $dynamic_bullets = $has_dynamic_dots; | |
| 677 | 743 | $slides_per_view = $d_col; |
| 678 | 744 | $slides_per_group = $meta['d_group']; |
| 679 | 745 | |
| 680 | 746 | switch ( $el_breakpoint ) { |
| 681 | 747 | case 'widescreen': |
| 682 | - $slides_per_view = $w_col; | |
| 683 | - $slides_per_group = $w_group; | |
| 748 | + $slides_per_view = $w_col; | |
| 749 | + $slides_per_group = $w_group; | |
| 684 | 750 | |
| 685 | 751 | break; |
| 686 | 752 | |
| 687 | 753 | case 'laptop': |
| @@ -690,10 +756,10 @@ | ||
| 690 | 756 | |
| 691 | 757 | break; |
| 692 | 758 | |
| 693 | 759 | case 'tablet_extra': |
| 694 | - $slides_per_view = $l_col; | |
| 695 | - $slides_per_group = $l_group; | |
| 760 | + $slides_per_view = $l_col; | |
| 761 | + $slides_per_group = $l_group; | |
| 696 | 762 | |
| 697 | 763 | if ( empty( $el_breakpoints['laptop'] ) ) { |
| 698 | 764 | $slides_per_view = $d_col; |
| 699 | 765 | $slides_per_group = $meta['d_group']; |
| @@ -718,11 +784,11 @@ | ||
| 718 | 784 | |
| 719 | 785 | break; |
| 720 | 786 | |
| 721 | 787 | case 'mobile_extra': |
| 722 | - $slides_per_view = $t_col; | |
| 723 | - $slides_per_group = $meta['t_group']; | |
| 724 | - $dynamic_bullets = true; | |
| 788 | + $slides_per_view = $t_col; | |
| 789 | + $slides_per_group = $meta['t_group']; | |
| 790 | + $dynamic_bullets = $has_dynamic_dots; | |
| 725 | 791 | |
| 726 | 792 | break; |
| 727 | 793 | |
| 728 | 794 | case 'mobile': |
| @@ -727,9 +793,9 @@ | ||
| 727 | 793 | |
| 728 | 794 | case 'mobile': |
| 729 | 795 | $slides_per_view = $t_col; |
| 730 | 796 | $slides_per_group = $meta['t_group']; |
| 731 | - $dynamic_bullets = true; | |
| 797 | + $dynamic_bullets = $has_dynamic_dots; | |
| 732 | 798 | |
| 733 | 799 | if ( ! empty( $el_breakpoints['mobile_extra'] ) ) { |
| 734 | 800 | $slides_per_view = $me_col; |
| 735 | 801 | $slides_per_group = $me_group; |
| @@ -755,9 +821,9 @@ | ||
| 755 | 821 | 0 => [ |
| 756 | 822 | 'slidesPerView' => absint( $m_col ), |
| 757 | 823 | 'slidesPerGroup' => absint( $meta['m_group'] ), |
| 758 | 824 | 'pagination' => [ |
| 759 | - 'dynamicBullets' => true, | |
| 825 | + 'dynamicBullets' => $has_dynamic_dots, | |
| 760 | 826 | ], |
| 761 | 827 | ], |
| 762 | 828 | 768 => [ |
| 763 | 829 | 'slidesPerView' => absint( $t_col ), |
| @@ -762,9 +828,9 @@ | ||
| 762 | 828 | 768 => [ |
| 763 | 829 | 'slidesPerView' => absint( $t_col ), |
| 764 | 830 | 'slidesPerGroup' => absint( $meta['t_group'] ), |
| 765 | 831 | 'pagination' => [ |
| 766 | - 'dynamicBullets' => false, | |
| 832 | + 'dynamicBullets' => $has_dynamic_dots, | |
| 767 | 833 | ], |
| 768 | 834 | ], |
| 769 | 835 | 1025 => [ |
| 770 | 836 | 'slidesPerView' => absint( $d_col ), |
| @@ -769,9 +835,9 @@ | ||
| 769 | 835 | 1025 => [ |
| 770 | 836 | 'slidesPerView' => absint( $d_col ), |
| 771 | 837 | 'slidesPerGroup' => absint( $meta['d_group'] ), |
| 772 | 838 | 'pagination' => [ |
| 773 | - 'dynamicBullets' => false, | |
| 839 | + 'dynamicBullets' => $has_dynamic_dots, | |
| 774 | 840 | ], |
| 775 | 841 | ], |
| 776 | 842 | ]; |
| 777 | 843 | } |
| @@ -786,8 +852,11 @@ | ||
| 786 | 852 | 'lazy' => $meta['lazy_load'], |
| 787 | 853 | 'breakpoints' => $breakpoints, |
| 788 | 854 | ]; |
| 789 | 855 | |
| 856 | + if ( ! empty( $meta['raw_settings']['slider_slide_animation'] ) ) { | |
| 857 | + $slider_options['watchSlidesProgress'] = true; | |
| 858 | + } | |
| 790 | 859 | if ( $meta['auto_play'] ) { |
| 791 | 860 | $slider_options['autoplay'] = [ |
| 792 | 861 | 'delay' => absint( $meta['auto_play_timeout'] ), |
| 793 | 862 | 'pauseOnMouseEnter' => $meta['stop_on_hover'], |