File "attributes-widget.php"

Full Path: /home/romayxjt/public_html/wp-content/plugins/mphb-elementor/widgets/accommodation/attributes-widget.php
File size: 4.53 KB
MIME-type: text/x-php
Charset: utf-8

<?php

namespace mphbe\widgets;

use Elementor\Controls_Manager;
use MPHB\Views\SingleRoomTypeView;

class AccommodationAttributesWidget extends AbstractAccommodationWidget
{
    private $hidden_attributes = [];
    private $removed_actions = [];
    private $setting_to_action = [
        'capacity' => [
            'renderTotalCapacity',
            'renderAdults',
            'renderChildren',
        ],
        'amenities' => [ 'renderFacilities' ],
        'view' => [ 'renderView' ],
        'size' => [ 'renderSize' ],
        'bed-types' => [ 'renderBedType' ],
        'categories' => [ 'renderCategories' ]
    ];

    public function get_name()
    {
        return 'mphbe-accommodation-attributes';
    }

    public function get_title()
    {
        return __('Accommodation Type Attributes', 'mphb-elementor');
    }

    public function get_icon()
    {
        return 'eicon-bullet-list';
    }

    /**
     * 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();

        $attributes = $this->get_accommodation_attributes_to_select();

        $this->add_control(
            'selected_attributes',
            [
                'label' => esc_html__('Attributes', 'mphb-elementor'),
                'type' => Controls_Manager::SELECT2,
                'label_block' => true,
                'multiple' => true,
                'options' => $attributes,
                'default' => array_keys($attributes)
            ]
        );

        $this->end_controls_section();
    }

    protected function mphb_render($settings)
    {

        $selected_attributes = $settings['selected_attributes'];

        $this->hidden_attributes = array_diff(array_keys($this->get_accommodation_attributes_to_select()), $selected_attributes);

        $current_accommodation = MPHB()->getCurrentRoomType();

        MPHB()->setCurrentRoomType($this->accommodation_id);
        $this->apply_attributes_params();

        SingleRoomTypeView::renderAttributes();

        $this->restore_attributes_params();
        MPHB()->setCurrentRoomType($current_accommodation ? $current_accommodation->getId() : get_the_ID());
    }

    private function apply_attributes_params()
    {
        add_action('mphb_render_single_room_type_before_attributes', array($this, 'removeAttributesTitle'), 0);
        add_action('mphb_render_single_room_type_before_attributes', array($this, 'filter_attributes'));

        global $mphbAttributes;
        foreach ($this->custom_attributes as $slug => $attribute) {
            if ($this->should_hide_attr($slug)) {
                $mphbAttributes[$slug]['visible'] = false;
            }
        }
    }

    private function restore_attributes_params()
    {
        remove_action('mphb_render_single_room_type_before_attributes', array($this, 'removeAttributesTitle'), 0);
        remove_action('mphb_render_single_room_type_before_attributes', array($this, 'filter_attributes'));

        foreach ($this->removed_actions as $action => $priority) {
            add_action('mphb_render_single_room_type_attributes', array('\MPHB\Views\SingleRoomTypeView', $action), $priority);
        }

        global $mphbAttributes;
        $mphbAttributes = $this->custom_attributes;
    }

    public function removeAttributesTitle()
    {
        remove_action('mphb_render_single_room_type_before_attributes', array('\MPHB\Views\SingleRoomTypeView', '_renderAttributesTitle'), 10);
    }

    public function filter_attributes()
    {
        foreach ($this->setting_to_action as $setting => $actions) {
            if ($this->should_hide_attr($setting)) {
                foreach ($actions as $action) {
                    $priority = has_action('mphb_render_single_room_type_attributes', array('\MPHB\Views\SingleRoomTypeView', $action));

                    if ($priority) {
                        remove_action( 'mphb_render_single_room_type_attributes', array( '\MPHB\Views\SingleRoomTypeView', $action ), $priority );
                        $this->removed_actions[ $action ] = $priority;
                    }
                }
            }
        }
    }

    private function should_hide_attr($attr)
    {
        return in_array($attr, $this->hidden_attributes);
    }
}