262 lines
9.0 KiB
PHP
262 lines
9.0 KiB
PHP
<?php
|
|
|
|
namespace mphbe\widgets;
|
|
|
|
use Elementor\Controls_Manager;
|
|
use Elementor\Group_Control_Image_Size;
|
|
use Elementor\Plugin;
|
|
use MPHB\Views\LoopRoomTypeView;
|
|
use MPHB\Views\SingleRoomTypeView;
|
|
|
|
class AccommodationGalleryWidget extends AbstractAccommodationWidget
|
|
{
|
|
private $gallery_params;
|
|
private $is_slider = false;
|
|
|
|
public function get_name()
|
|
{
|
|
return 'mphbe-accommodation-gallery';
|
|
}
|
|
|
|
public function get_title()
|
|
{
|
|
return __('Accommodation Type Gallery', 'mphb-elementor');
|
|
}
|
|
|
|
public function get_icon()
|
|
{
|
|
return 'eicon-gallery-group';
|
|
}
|
|
|
|
/**
|
|
* Adds different input fields to allow the user to change and customize the
|
|
* widget settings.
|
|
*/
|
|
protected function register_controls()
|
|
{
|
|
$this->start_controls_section('section_parameters', array(
|
|
'label' => __('Parameters', 'mphb-elementor')
|
|
));
|
|
|
|
$this->add_accommodation_control();
|
|
|
|
$this->add_group_control(
|
|
Group_Control_Image_Size::get_type(),
|
|
[
|
|
'name' => 'image',
|
|
'exclude' => ['custom'],
|
|
'include' => [],
|
|
'default' => '',
|
|
]
|
|
);
|
|
|
|
$this->add_control(
|
|
'is_slider',
|
|
[
|
|
'label' => esc_html__('Display as slider', 'mphb-elementor'),
|
|
'type' => Controls_Manager::SWITCHER,
|
|
'return_value' => 'yes',
|
|
'default' => '',
|
|
'description' => esc_html__('Check it out on the frontend once applied.', 'mphb-elementor')
|
|
]
|
|
);
|
|
|
|
$this->add_control(
|
|
'columns',
|
|
[
|
|
'label' => esc_html__('Columns', 'mphb-elementor'),
|
|
'type' => Controls_Manager::NUMBER,
|
|
'min' => 1,
|
|
'max' => 10,
|
|
'step' => 1,
|
|
'default' => 4,
|
|
]
|
|
);
|
|
|
|
$this->add_control(
|
|
'link_to',
|
|
[
|
|
'label' => esc_html__('Link to', 'mphb-elementor'),
|
|
'type' => \Elementor\Controls_Manager::SELECT,
|
|
'default' => '',
|
|
'options' => [
|
|
'' => esc_html__('Default', 'mphb-elementor'),
|
|
'none' => esc_html__('None', 'mphb-elementor'),
|
|
'file' => esc_html__('File', 'mphb-elementor'),
|
|
],
|
|
]
|
|
);
|
|
|
|
$this->add_control(
|
|
'is_lightbox',
|
|
[
|
|
'label' => esc_html__('Open in lightbox', 'mphb-elementor'),
|
|
'type' => Controls_Manager::SWITCHER,
|
|
'return_value' => 'yes',
|
|
'default' => '',
|
|
'condition' => [
|
|
'is_slider!' => 'yes'
|
|
]
|
|
]
|
|
);
|
|
|
|
$this->end_controls_section();
|
|
}
|
|
|
|
/**
|
|
* Render the widget output on the frontend.
|
|
*
|
|
* Written in PHP and used to generate the final HTML.
|
|
*/
|
|
protected function mphb_render($settings)
|
|
{
|
|
|
|
$this->gallery_params = array(
|
|
'link' => $settings['link_to'],
|
|
'columns' => $settings['columns'],
|
|
'size' => $settings['image_size'],
|
|
'lightbox' => $settings['is_lightbox']
|
|
);
|
|
|
|
$this->is_slider = 'yes' == $settings['is_slider'] && !Plugin::$instance->editor->is_edit_mode();
|
|
|
|
$current_room_type = MPHB()->getCurrentRoomType();
|
|
|
|
MPHB()->setCurrentRoomType($this->accommodation_id);
|
|
$this->apply_gallery_params();
|
|
|
|
if ($this->is_slider) {
|
|
LoopRoomTypeView::renderGallery();
|
|
} else {
|
|
SingleRoomTypeView::renderGallery();
|
|
}
|
|
|
|
$this->restore_gallery_params();
|
|
MPHB()->setCurrentRoomType($current_room_type ? $current_room_type->getId() : get_the_ID());
|
|
}
|
|
|
|
|
|
private function apply_gallery_params()
|
|
{
|
|
if ($this->is_slider) {
|
|
add_filter('mphb_loop_room_type_gallery_main_slider_image_link', array($this, 'filter_gallery_link'));
|
|
add_filter('mphb_loop_room_type_gallery_main_slider_columns', array($this, 'filter_gallery_columns'));
|
|
add_filter('mphb_loop_room_type_gallery_main_slider_image_size', array($this, 'filter_gallery_image_size'));
|
|
add_filter('mphb_loop_room_type_gallery_use_nav_slider', array($this, 'filter_gallery_nav_slider'));
|
|
|
|
add_action('mphb_render_loop_room_type_before_gallery', array($this, 'remove_default_slider_wrapper'), 1);
|
|
add_action('mphb_render_loop_room_type_before_gallery', array($this, 'render_slider_wrapper_open'));
|
|
add_action('mphb_render_loop_room_type_after_gallery', array($this, 'render_slider_wrapper_close'));
|
|
add_filter('mphb_loop_room_type_gallery_main_slider_wrapper_class', array($this, 'filter_slider_classes'));
|
|
add_filter('mphb_loop_room_type_gallery_main_slider_flexslider_options', array($this, 'filter_slider_attributes'));
|
|
} else {
|
|
add_filter('mphb_single_room_type_gallery_image_link', array($this, 'filter_gallery_link'));
|
|
add_filter('mphb_single_room_type_gallery_columns', array($this, 'filter_gallery_columns'));
|
|
add_filter('mphb_single_room_type_gallery_image_size', array($this, 'filter_gallery_image_size'));
|
|
add_filter('mphb_single_room_type_gallery_use_magnific', array($this, 'filter_gallery_lightbox'));
|
|
}
|
|
}
|
|
|
|
private function restore_gallery_params()
|
|
{
|
|
if ($this->is_slider) {
|
|
remove_filter('mphb_loop_room_type_gallery_main_slider_image_link', array($this, 'filter_gallery_link'));
|
|
remove_filter('mphb_loop_room_type_gallery_main_slider_columns', array($this, 'filter_gallery_columns'));
|
|
remove_filter('mphb_loop_room_type_gallery_main_slider_image_size', array($this, 'filter_gallery_image_size'));
|
|
remove_filter('mphb_loop_room_type_gallery_use_nav_slider', array($this, 'filter_gallery_nav_slider'));
|
|
|
|
remove_action('mphb_render_loop_room_type_before_gallery', array($this, 'remove_default_slider_wrapper'), 1);
|
|
remove_action('mphb_render_loop_room_type_before_gallery', array($this, 'render_slider_wrapper_open'));
|
|
remove_action('mphb_render_loop_room_type_after_gallery', array($this, 'render_slider_wrapper_close'));
|
|
remove_filter('mphb_loop_room_type_gallery_main_slider_wrapper_class', array($this, 'filter_slider_classes'));
|
|
remove_filter('mphb_loop_room_type_gallery_main_slider_flexslider_options', array($this, 'filter_slider_attributes'));
|
|
} else {
|
|
remove_filter('mphb_single_room_type_gallery_image_link', array($this, 'filter_gallery_link'));
|
|
remove_filter('mphb_single_room_type_gallery_columns', array($this, 'filter_gallery_columns'));
|
|
remove_filter('mphb_single_room_type_gallery_image_size', array($this, 'filter_gallery_image_size'));
|
|
remove_filter('mphb_single_room_type_gallery_use_magnific', array($this, 'filter_gallery_lightbox'));
|
|
}
|
|
}
|
|
|
|
public function filter_gallery_link($link)
|
|
{
|
|
if ($this->gallery_params['link']) {
|
|
$link = $this->gallery_params['link'];
|
|
}
|
|
|
|
if ($this->is_slider) {
|
|
$link = 'none';
|
|
}
|
|
|
|
return $link;
|
|
}
|
|
|
|
public function filter_gallery_columns($columns)
|
|
{
|
|
if ($this->gallery_params['columns']) {
|
|
$columns = $this->gallery_params['columns'];
|
|
}
|
|
|
|
return $columns;
|
|
}
|
|
|
|
public function filter_gallery_image_size($size)
|
|
{
|
|
if ($this->gallery_params['size']) {
|
|
return $this->gallery_params['size'];
|
|
}
|
|
|
|
return $size;
|
|
}
|
|
|
|
public function filter_gallery_lightbox($lightbox)
|
|
{
|
|
if ($this->gallery_params['lightbox']) {
|
|
return $this->gallery_params['lightbox'] == 'yes';
|
|
}
|
|
|
|
return $lightbox;
|
|
}
|
|
|
|
public function filter_gallery_nav_slider()
|
|
{
|
|
return false;
|
|
}
|
|
|
|
public function remove_default_slider_wrapper()
|
|
{
|
|
remove_action('mphb_render_loop_room_type_before_gallery', array('\MPHB\Views\LoopRoomTypeView', '_renderImagesWrapperOpen'), 10);
|
|
remove_action('mphb_render_loop_room_type_after_gallery', array('\MPHB\Views\LoopRoomTypeView', '_renderImagesWrapperClose'), 20);
|
|
}
|
|
|
|
public function filter_slider_classes($class)
|
|
{
|
|
return 'mphb-flexslider-gallery-wrapper';
|
|
}
|
|
|
|
public function render_slider_wrapper_open()
|
|
{
|
|
?>
|
|
<div class="mphb-room-type-gallery-wrapper mphb-single-room-type-gallery-wrapper">
|
|
<?php
|
|
}
|
|
|
|
public function render_slider_wrapper_close()
|
|
{
|
|
?>
|
|
</div>
|
|
<?php
|
|
}
|
|
|
|
public function filter_slider_attributes($atts)
|
|
{
|
|
$atts['minItems'] = 1;
|
|
$atts['maxItems'] = (int)$this->gallery_params['columns'] ? (int)$this->gallery_params['columns'] : 1;
|
|
$atts['move'] = 1;
|
|
|
|
$atts['itemWidth'] = floor(100 / $atts['maxItems']);
|
|
|
|
return $atts;
|
|
}
|
|
}
|