id = $data['id'];
$this->unique_name = $data['unique_name'];
$this->template_name = $data['template'];
$this->settings = $settings;
$this->is_carousel = $data['is_carousel'] ?? false;
$this->is_post_query = $data['is_post_query'] ?? false;
$this->is_grid = $data['is_grid'] ?? false;
$this->is_post_pagination = $data['is_post_pagination'] ?? false;
$content = $data['content'];
if ( ! ( $this->is_grid || empty( $data['content_class'] ) ) ) {
$this->content_classes[] = $data['content_class'];
$this->content_classes = implode( ' ', $this->content_classes );
}
// Container.
$this->addon_container( $content, $data );
return $this->addon_html;
}
/**
* Generates the container HTML.
*
* @param string $content The content inside the container.
* @param array $args Additional arguments for the container.
*
* @return string
*/
public function addon_container( $content, $args = [] ) {
$container_id = 'rtsb-container-' . $this->id;
$container_classes = $this->get_container_classes( $args['container_class'] ?? '' );
$raw_layout = $args['layout'] ?? '';
$template = $args['template'];
$layout = RenderHelpers::filter_layout( $raw_layout, $template );
$style_attr = '--rtsb-default-columns: ' . esc_attr( RenderHelpers::default_columns( $layout ) );
$container_attributes = [
'id' => $container_id,
'class' => $container_classes,
'data-layout' => $layout,
];
if ( $this->is_grid ) {
$container_attributes['style'] = apply_filters( 'rtsb/general_widget/container/attr', $style_attr, $this->settings );
}
if ( ! empty( $args['container_attr'] ) ) {
$container_attributes = array_merge( $container_attributes, $args['container_attr'] );
}
$row_args = wp_parse_args(
$this->get_row_args(),
[
'layout' => $raw_layout,
'template' => $template,
'content_class' => $args['content_class'] ?? '',
'post_query' => $args['post_query'] ?? '',
]
);
// Adding render attributes.
$this->add_attribute( 'rtsb_addon_container_attr_' . $this->id, $container_attributes );
// Generate HTML for the container.
$this->addon_html = '
get_attribute_string( 'rtsb_addon_container_attr_' . $this->id ) . '>';
$this->addon_row( $content, $row_args );
$this->addon_html .= '
';
return $this->addon_html;
}
/**
* Generates the row HTML.
*
* @param string $content The content inside the row.
* @param array $args Additional arguments for the row.
*
* @return string
*/
public function addon_row( $content, $args = [] ) {
$layout = RenderHelpers::filter_layout( $args['layout'] ?? '' );
$row_classes = $this->get_row_classes( $layout );
// Adding render attributes.
$this->add_attribute( 'rtsb_addon_row_attr_' . $this->id, 'class', $row_classes );
// Start rendering the row.
$this->addon_html .= 'get_attribute_string( 'rtsb_addon_row_attr_' . $this->id ) . '>';
if ( $this->is_carousel ) {
$this->slider_wrapper_start();
}
// Rendering the content.
$this->get_content( $content, $args );
if ( $this->is_carousel ) {
$this->slider_wrapper_end();
}
$this->addon_html .= '
';
if ( $this->is_post_query && $this->is_post_pagination && ! empty( $args['post_query'] ) ) {
$this->addon_html .= $this->render_posts_pagination( $args );
}
// Preloader.
$this->addon_html .= $this->pre_loader();
return $this->addon_html;
}
/**
* Renders the content inside the row.
*
* @param string $content The content.
* @param array $args Additional arguments for the content.
*
* @return void
*/
protected function get_content( $content, $args = [] ) {
// Adding render attributes.
$this->add_attribute( 'rtsb_addon_content_attr_' . $this->id, 'class', $this->content_classes );
// Render content HTML.
$this->addon_html .= ! $this->is_grid ? 'get_attribute_string( 'rtsb_addon_content_attr_' . $this->id ) . '>' : '';
$this->addon_html .= $content;
$this->addon_html .= ! $this->is_grid ? '
' : '';
}
/**
* Gets container classes.
*
* @param string $custom Optional custom classes.
*
* @return string
*/
protected function get_container_classes( $custom = '' ) {
$classes = [
'rtsb-elementor-container',
'rtsb-pos-r',
$this->unique_name,
];
if ( ! empty( $custom ) ) {
$classes[] = $custom;
}
if ( ! empty( $this->settings['slider_slide_animation'] ) ) {
$classes[] = 'has-slide-animation';
}
$classes = implode( ' ', $classes );
return apply_filters( 'rtsb/general/addon_container/class', $classes, $this->settings );
}
/**
* Gets row classes.
*
* @param string $layout Optional layout name.
*
* @return string
*/
protected function get_row_classes( $layout = '' ) {
$classes = [
'rtsb-row',
'rtsb-content-loader',
];
if ( ! empty( $layout ) ) {
$classes[] = $layout;
}
if ( $this->is_carousel ) {
$classes[] = 'rtsb-slider-layout';
}
if ( $this->is_carousel && ! empty( $this->settings['always_show_nav'] ) ) {
$classes[] = 'always-show-nav';
}
if ( ! empty( $this->settings['cols_mobile'] ) && '1' == $this->settings['cols_mobile'] ) {
$classes[] = ' rtsb-mobile-flex-row';
}
$classes = implode( ' ', $classes );
return apply_filters( 'rtsb/general/addon_row/class', $classes, $this->settings );
}
/**
* Gets row arguments.
*
* @return array Row arguments.
*/
protected function get_row_args() {
return [];
}
/**
* Starts the carousel slider wrapper.
*
* @return void
*/
private function slider_wrapper_start() {
$slider_data = $this->get_slider_data();
$slider_options = $slider_data['data'] ?? '';
$slider_classes = $slider_data['class'] ?? '';
$slider_data = [
'class' => 'rtsb-carousel-slider swiper ' . $slider_classes,
'data' => $slider_options,
];
// Adding slider attributes.
$this->add_attribute(
'rtsb_slider_attr_' . $this->id,
[
'class' => 'rtsb-col-grid ' . $slider_data['class'],
'data-options' => $slider_data['data'],
]
);
// Render slider wrapper.
$this->addon_html .= 'get_attribute_string( 'rtsb_slider_attr_' . $this->id ) . '>';
$this->addon_html .= '
';
}
/**
* Ends the carousel slider wrapper.
*
* @return void
*/
private function slider_wrapper_end() {
$this->addon_html .= '
';
$this->addon_html .= $this->slider_buttons( $this->settings );
$this->addon_html .= '
';
}
/**
* Gets slider data for the carousel.
*
* @return array
*/
protected function get_slider_data() {
$metas = $this->get_slider_meta_dataset( $this->settings, $this->template_name, $this->settings );
return RenderHelpers::slider_data( (array) $metas, $this->settings );
}
/**
* Gets slider data for the carousel.
*
* @return string
*/
protected function get_slider_meta_dataset( array $meta, $template = '', $raw_settings = [] ) {
$data = [
'widget' => 'custom',
'template' => RenderHelpers::get_data( $template, '', '' ),
'raw_settings' => $raw_settings,
'd_cols' => RenderHelpers::get_data( $meta, 'cols', 0 ),
't_cols' => RenderHelpers::get_data( $meta, 'cols_tablet', 2 ),
'm_cols' => RenderHelpers::get_data( $meta, 'cols_mobile', 1 ),
'd_group' => RenderHelpers::get_data( $meta, 'cols_group', 1 ),
't_group' => RenderHelpers::get_data( $meta, 'cols_group_tablet', 1 ),
'm_group' => RenderHelpers::get_data( $meta, 'cols_group_mobile', 1 ),
'layout' => RenderHelpers::get_data( $meta, 'layout_style', 'layout1' ),
'auto_play' => ! empty( $meta['slide_autoplay'] ),
'stop_on_hover' => ! empty( $meta['pause_hover'] ),
'slider_nav' => ! empty( $meta['slider_nav'] ),
'slider_dot' => ! empty( $meta['slider_pagi'] ),
'slider_dynamic_dot' => ! empty( $meta['slider_dynamic_pagi'] ),
'loop' => ! empty( $meta['slider_loop'] ),
'lazy_load' => ! empty( $meta['slider_lazy_load'] ),
'auto_height' => ! empty( $meta['slider_auto_height'] ),
'speed' => RenderHelpers::get_data( $meta, 'slide_speed', 2000 ),
'space_between' => isset( $meta['grid_gap']['size'] ) && strlen( $meta['grid_gap']['size'] ) ? $meta['grid_gap']['size'] : 30,
'auto_play_timeout' => RenderHelpers::get_data( $meta, 'autoplay_timeout', 5000 ),
'nav_position' => RenderHelpers::get_data( $meta, 'slider_nav_position', 'top' ),
'left_arrow_icon' => RenderHelpers::get_data( $meta, 'slider_left_arrow_icon', [] ),
'right_arrow_icon' => RenderHelpers::get_data( $meta, 'slider_right_arrow_icon', [] ),
];
if ( ! empty( $meta['cols_widescreen'] ) ) {
$data['w_cols'] = $meta['cols_widescreen'];
}
if ( ! empty( $meta['cols_laptop'] ) ) {
$data['l_cols'] = $meta['cols_laptop'];
}
if ( ! empty( $meta['cols_tablet_extra'] ) ) {
$data['te_cols'] = $meta['cols_tablet_extra'];
}
if ( ! empty( $meta['cols_mobile_extra'] ) ) {
$data['me_cols'] = $meta['cols_mobile_extra'];
}
return apply_filters( 'rtsb/elementor/render/slider_dataset_final', $data, $meta, $raw_settings );
}
/**
* Renders the carousel slider buttons.
*
* @return string
*/
protected function slider_buttons( $settings ) {
$html = '';
$left_icon = $settings['slider_left_arrow_icon'];
$right_icon = $settings['slider_right_arrow_icon'];
if ( ! empty( $settings['slider_nav'] ) ) {
$html .=
'
' . Fns::icons_manager( $right_icon ) . '
' . Fns::icons_manager( $left_icon ) . '
';
}
$html .= ! empty( $settings['slider_pagi'] ) ? '' : '';
return $html;
}
/**
* Preloader.
*
* @return string
*/
public function pre_loader() {
if ( $this->is_carousel ) {
return '';
}
return '';
}
/**
* No posts message.
*
* @return string
*/
public function no_posts_msg() {
return '
' . esc_html__( 'No posts were found matching your selection.', 'shopbuilder' ) . '
';
}
/**
* Renders posts pagination
*
* @param array $args Pagination args.
*
* @return string
*/
public function render_posts_pagination( $args ) {
list(
'post_query' => $query,
'posts_limit' => $limit,
'posts_per_page' => $per_page
) = $args;
$html_utility = null;
$html = null;
$posts_per_page = $query->query_vars['posts_per_page'];
$found_posts = $query->found_posts;
$total_page = $query->max_num_pages;
if ( $limit ) {
if ( ( empty( $wp_query->query['tax_query'] ) ) ) {
$found_posts = $query->found_posts;
}
if ( $per_page && $found_posts > $per_page ) {
$found_posts = $limit;
$total_page = ceil( $found_posts / $per_page );
}
}
$total_page = absint( $total_page );
$html_utility .= Fns::custom_pagination(
$total_page,
$posts_per_page
);
if ( $html_utility ) {
$rand = wp_rand();
// Adding pagination render attributes.
$this->add_attribute(
'rtsb_pagination_attr_' . $rand,
[
'class' => 'rtsb-pagination-wrap element-loading',
'data-total-pages' => $total_page,
'data-posts-per-page' => $posts_per_page,
'data-type' => 'pagination',
]
);
// Start rendering.
$html = 'get_attribute_string( 'rtsb_pagination_attr_' . $rand ) . '>';
$html .= $html_utility;
$html .= '
';
}
return $html;
}
/**
* Function to render buttom html.
*
* @param array $args Button Arguments.
*
* @return void
*/
public static function render_buttom_html( $args ) {
$default_args = [
'button_attributes' => '',
'sb_button_icon' => '',
'sb_button_icon_position' => 'right',
'sb_button_content' => esc_html__( 'ShopBuilder Button', 'shopbuilder' ),
];
$args = wp_parse_args( $args, $default_args );
?>
>
' );
Fns::print_html( $args['sb_button_content'] );
Fns::print_html( '' );
Fns::print_html( '' );
Fns::print_html( $args['sb_button_content'] );
Fns::print_html( '' );
Fns::print_html( self::render_button_icon( 'right', $args['sb_button_icon'], $args['sb_button_icon_position'] ) );
?>
' . Fns::icons_manager( $icon ) . '';
}
return $html;
}
}