Opal-Estate-Pro/inc/vendors/elementor/class-opalestate-elementor-widget-base.php
2019-12-13 11:25:29 +07:00

473 lines
12 KiB
PHP
Executable File

<?php
use Elementor\Widget_Base;
use Elementor\Controls_Manager;
/**
* Class Opalestate_Widget_Base
*/
abstract class Opalestate_Elementor_Widget_Base extends Widget_Base {
/**
* Get widget categories.
*
* Retrieve the list of categories the widget belongs to.
*
* @access public
*
* @return array Widget categories.
*/
public function get_categories() {
return [ 'opalestate-pro' ];
}
/**
* Render widget output on the frontend.
*
* Written in PHP and used to generate the final HTML.
*
* @access protected
*/
protected function render() {
$settings = $this->get_settings_for_display();
$located = $this->locate_template( $this->get_name() . '.php' );
if ( ! file_exists( $located ) ) {
return;
}
if ( ! empty( $located ) && file_exists( $located ) ) {
@ include apply_filters( 'opalestate_elementor_render_widget_templates', $located, $settings, $this );
}
}
/**
* Render widget output in the editor.
*
* Written as a Backbone JavaScript template and used to generate the live preview.
*
* @access protected
*/
protected function _content_template() {
$located = $this->locate_template( $this->get_name() . '-preview.php' );
if ( ! file_exists( $located ) ) {
return;
}
if ( ! empty( $located ) && file_exists( $located ) ) {
@ include apply_filters( 'opalestate_elementor_preview_widget_templates', $located, $this );
}
}
/**
* Locate template.
*
* @param string $template_name Template name.
*
* @return string
*/
protected function locate_template( $template_name ) {
// Locate in your {theme}/opalestate-elementor.
$template = locate_template( [
trailingslashit( 'opalestate/elementor-templates/' ) . $template_name,
] );
// Fallback to default template in the plugin.
if ( ! $template ) {
$template = OPALESTATE_PLUGIN_DIR . 'templates/elementor-templates/' . $template_name;
}
// Return what we found.
return apply_filters( 'abrs_elementor_locate_template', $template, $template_name );
}
/**
* Register image carousel widget controls.
*
* Adds different input fields to allow the user to change and customize the widget settings.
*
* @since 1.0.0
* @access protected
*/
public function get_settings_json( $settings ) {
$data = [
"slides_to_show" => $settings['slides_to_show'],
"slides_to_scroll" => $settings['slides_to_scroll'],
"navigation" => $settings['navigation'],
"pause_on_hover" => $settings['pause_on_hover'],
"autoplay" => $settings['autoplay'],
"autoplay_speed" => $settings['autoplay_speed'],
"infinite" => $settings['infinite'],
"speed" => $settings['speed'],
"direction" => $settings['direction'],
];
return wp_json_encode( $data );
}
public function render_content() {
$settings = $this->get_settings_for_display();
if ( ! isset( $settings['enable_carousel'] ) ) {
return parent::render_content();
}
if ( $settings['enable_carousel'] === 'yes' ) {
$arrows_position_class = isset( $settings['arrows_position'] ) && $settings['arrows_position'] ? 'slick-arrows-' . $settings['arrows_position'] : '';
$this->add_render_attribute( 'wrapper-style', 'class', 'elementor-slick-slider-row row-items ' . $arrows_position_class );
$data = $this->get_settings_json( $settings );
$this->add_render_attribute( 'wrapper', 'data-settings', $data );
echo '<div class="elementor-opal-slick-slider elementor-slick-slider" ' . $this->get_render_attribute_string( 'wrapper' ) . '>';
} else {
$this->add_render_attribute( 'wrapper-style', 'class', 'elementor-grid row-items elementor-items-container' );
}
parent::render_content();
if ( $settings['enable_carousel'] === 'yes' ) {
echo '</div>';
}
}
/**
* Register image carousel widget controls.
*
* Adds different input fields to allow the user to change and customize the widget settings.
*
* @since 1.0.0
* @access protected
*/
public function add_slick_controls( $condition, $slick_class ) {
$slick_class = ' .elementor-opal-slick-slider ';
$this->start_controls_section(
'section_carousel_options',
[
'label' => esc_html__( 'Carousel Options', 'opalestate-pro' ),
'type' => Controls_Manager::SECTION,
'condition' => $condition,
]
);
$slides_to_show = range( 1, 10 );
$slides_to_show = array_combine( $slides_to_show, $slides_to_show );
$this->add_responsive_control(
'slides_to_show',
[
'label' => esc_html__( 'Slides to Show', 'opalestate-pro' ),
'type' => Controls_Manager::SELECT,
'options' => [
'' => esc_html__( 'Default', 'opalestate-pro' ),
] + $slides_to_show,
'frontend_available' => true,
]
);
$this->add_control(
'slides_to_scroll',
[
'label' => esc_html__( 'Slides to Scroll', 'opalestate-pro' ),
'type' => Controls_Manager::SELECT,
'description' => esc_html__( 'Set how many slides are scrolled per swipe.', 'opalestate-pro' ),
'default' => '2',
'options' => $slides_to_show,
'condition' => [
'slides_to_show!' => '1',
],
'frontend_available' => true,
]
);
$this->add_control(
'navigation',
[
'label' => esc_html__( 'Navigation', 'opalestate-pro' ),
'type' => Controls_Manager::SELECT,
'default' => 'both',
'options' => [
'both' => esc_html__( 'Arrows and Dots', 'opalestate-pro' ),
'arrows' => esc_html__( 'Arrows', 'opalestate-pro' ),
'dots' => esc_html__( 'Dots', 'opalestate-pro' ),
'none' => esc_html__( 'None', 'opalestate-pro' ),
],
'frontend_available' => true,
]
);
$this->add_control(
'view',
[
'label' => esc_html__( 'View', 'opalestate-pro' ),
'type' => Controls_Manager::HIDDEN,
'default' => 'traditional',
]
);
$this->end_controls_section();
$this->start_controls_section(
'section_additional_options',
[
'label' => esc_html__( 'Carousel Additional Options', 'opalestate-pro' ),
'condition' => $condition,
]
);
$this->add_control(
'pause_on_hover',
[
'label' => esc_html__( 'Pause on Hover', 'opalestate-pro' ),
'type' => Controls_Manager::SELECT,
'default' => 'yes',
'options' => [
'yes' => esc_html__( 'Yes', 'opalestate-pro' ),
'no' => esc_html__( 'No', 'opalestate-pro' ),
],
'frontend_available' => true,
]
);
$this->add_control(
'autoplay',
[
'label' => esc_html__( 'Autoplay', 'opalestate-pro' ),
'type' => Controls_Manager::SELECT,
'default' => 'yes',
'options' => [
'yes' => esc_html__( 'Yes', 'opalestate-pro' ),
'no' => esc_html__( 'No', 'opalestate-pro' ),
],
'frontend_available' => true,
]
);
$this->add_control(
'autoplay_speed',
[
'label' => esc_html__( 'Autoplay Speed', 'opalestate-pro' ),
'type' => Controls_Manager::NUMBER,
'default' => 5000,
'frontend_available' => true,
]
);
$this->add_control(
'infinite',
[
'label' => esc_html__( 'Infinite Loop', 'opalestate-pro' ),
'type' => Controls_Manager::SELECT,
'default' => 'yes',
'options' => [
'yes' => esc_html__( 'Yes', 'opalestate-pro' ),
'no' => esc_html__( 'No', 'opalestate-pro' ),
],
'frontend_available' => true,
]
);
$this->add_control(
'effect',
[
'label' => esc_html__( 'Effect', 'opalestate-pro' ),
'type' => Controls_Manager::SELECT,
'default' => 'slide',
'options' => [
'slide' => esc_html__( 'Slide', 'opalestate-pro' ),
'fade' => esc_html__( 'Fade', 'opalestate-pro' ),
],
'condition' => [
'slides_to_show' => '1',
],
'frontend_available' => true,
]
);
$this->add_control(
'speed',
[
'label' => esc_html__( 'Animation Speed', 'opalestate-pro' ),
'type' => Controls_Manager::NUMBER,
'default' => 500,
'frontend_available' => true,
]
);
$this->add_control(
'direction',
[
'label' => esc_html__( 'Direction', 'opalestate-pro' ),
'type' => Controls_Manager::SELECT,
'default' => 'ltr',
'options' => [
'ltr' => esc_html__( 'Left', 'opalestate-pro' ),
'rtl' => esc_html__( 'Right', 'opalestate-pro' ),
],
'frontend_available' => true,
]
);
$this->end_controls_section();
$a = array_merge( $condition, [
'navigation' => [
'arrows',
'dots',
'both',
],
] );
$this->start_controls_section(
'section_style_navigation',
[
'label' => esc_html__( 'Navigation', 'opalestate-pro' ),
'tab' => Controls_Manager::TAB_STYLE,
'condition' => $a,
]
);
$this->add_control(
'heading_style_arrows',
[
'label' => esc_html__( 'Arrows', 'opalestate-pro' ),
'type' => Controls_Manager::HEADING,
'separator' => 'before',
'condition' => [
'navigation' => [ 'arrows', 'both' ],
],
]
);
$this->add_control(
'arrows_position',
[
'label' => esc_html__( 'Position', 'opalestate-pro' ),
'type' => Controls_Manager::SELECT,
'default' => 'inside',
'options' => [
'default' => esc_html__( 'Default', 'opalestate-pro' ),
'inside' => esc_html__( 'Inside', 'opalestate-pro' ),
'outside' => esc_html__( 'Outside', 'opalestate-pro' ),
],
'condition' => [
'navigation' => [ 'arrows', 'both' ],
],
]
);
$this->add_control(
'arrows_size',
[
'label' => esc_html__( 'Size', 'opalestate-pro' ),
'type' => Controls_Manager::SLIDER,
'range' => [
'px' => [
'min' => 20,
'max' => 60,
],
],
'selectors' => [
'{{WRAPPER}} ' . $slick_class . '.slick-slider .slick-prev:before, {{WRAPPER}} ' . $slick_class . '.slick-slider .slick-next:before' => 'font-size: {{SIZE}}{{UNIT}};',
],
'condition' => [
'navigation' => [ 'arrows', 'both' ],
],
]
);
$this->add_control(
'arrows_color',
[
'label' => esc_html__( 'Color', 'opalestate-pro' ),
'type' => Controls_Manager::COLOR,
'selectors' => [
'{{WRAPPER}} ' . $slick_class . '.slick-slider .slick-prev:before, {{WRAPPER}} ' . $slick_class . '.slick-slider .slick-next:before' => 'color: {{VALUE}};',
],
'condition' => [
'navigation' => [ 'arrows', 'both' ],
],
]
);
$this->add_control(
'heading_style_dots',
[
'label' => esc_html__( 'Dots', 'opalestate-pro' ),
'type' => Controls_Manager::HEADING,
'separator' => 'before',
'condition' => [
'navigation' => [ 'dots', 'both' ],
],
]
);
$this->add_control(
'dots_position',
[
'label' => esc_html__( 'Position', 'opalestate-pro' ),
'type' => Controls_Manager::SELECT,
'default' => 'outside',
'options' => [
'outside' => esc_html__( 'Outside', 'opalestate-pro' ),
'inside' => esc_html__( 'Inside', 'opalestate-pro' ),
],
'condition' => [
'navigation' => [ 'dots', 'both' ],
],
]
);
$this->add_control(
'dots_size',
[
'label' => esc_html__( 'Size', 'opalestate-pro' ),
'type' => Controls_Manager::SLIDER,
'range' => [
'px' => [
'min' => 5,
'max' => 10,
],
],
'selectors' => [
'{{WRAPPER}} ' . $slick_class . ' .slick-dots li button:before' => 'font-size: {{SIZE}}{{UNIT}};',
],
'condition' => [
'navigation' => [ 'dots', 'both' ],
],
]
);
$this->add_control(
'dots_color',
[
'label' => esc_html__( 'Color', 'opalestate-pro' ),
'type' => Controls_Manager::COLOR,
'selectors' => [
'{{WRAPPER}} ' . $slick_class . ' .slick-dots li button:before' => 'color: {{VALUE}};',
],
'condition' => [
'navigation' => [ 'dots', 'both' ],
],
]
);
$this->end_controls_section();
// if( $this->image_control ){
// $this->add_image_control( $condition, $slick_class );
// }
}
}