[Back] <?php
class OsElementorHelper {
private static ?OsElementorHelper $_instance = null;
public static string $category = "latepoint_builder";
private string $min_elementor_version = '3.5.0';
private string $min_php_version = '7.0';
private array $widgets = [
'book_button',
'list_of_resources',
'customer_login',
'customer_dashboard',
'calendar',
'book_form',
];
/**
* Instance
* Ensures only one instance of the class is loaded or can be loaded.
*/
public static function init(): OsElementorHelper {
if ( is_null(self::$_instance)) {
self::$_instance = new self();
}
return self::$_instance;
}
public function __construct() {
if ( $this->check_requirements() ) {
add_action( 'elementor/elements/categories_registered', [ $this, 'register_widgets_category' ] );
add_action( 'elementor/widgets/register', [ $this, 'register_widgets' ] );
}
}
/**
* Check requirements for php and elementor
* @return bool
*/
private function check_requirements(): bool {
// Check if Elementor installed and activated
if ( ! did_action( 'elementor/loaded' ) ) {
return false;
}
if ( ! $this->check_php_version() ) {
add_action( 'admin_notices', [ $this, 'php_version_error' ] );
return false;
}
if ( ! $this->check_elementor_version() ) {
add_action( 'admin_notices', [ $this, 'elementor_version_error' ] );
return false;
}
return true;
}
private function check_php_version(): bool {
return version_compare( PHP_VERSION, $this->min_php_version, '>=' );
}
private function check_elementor_version(): bool {
if ( ! defined( 'ELEMENTOR_VERSION' ) ) {
return false;
}
return version_compare( ELEMENTOR_VERSION, $this->min_elementor_version, '>=' );
}
private function php_version_error(): void {
$message = esc_html__( 'Theme requires PHP version', 'latepoint' ) . ' <strong>' . $this->min_php_version . '</strong> ' . esc_html__( 'or greater.', 'latepoint' );
printf( '<div class="notice notice-warning is-dismissible"><p>%1$s</p></div>', $message );
}
private function elementor_version_error(): void {
$message = esc_html__( 'Theme requires Elementor version', 'latepoint' ) . ' <strong>' . $this->min_elementor_version . '</strong> ' . esc_html__( 'or greater.', 'latepoint' );
printf( '<div class="notice notice-warning is-dismissible"><p>%1$s</p></div>', $message );
}
/**
* @return array
*/
private function get_data_for_blocks(): array {
$result = [];
$localized_vars = OsBlockHelper::localized_vars_for_blocks();
$result['selected_agents_options'] = $this->prepare_data_for_select($localized_vars['selected_agents_options']);
$result['selected_services_options'] = $this->prepare_data_for_select($localized_vars['selected_services_options']);
$result['selected_service_categories_options'] = $this->prepare_data_for_select($localized_vars['selected_service_categories_options']);
$result['selected_locations_options'] = $this->prepare_data_for_select($localized_vars['selected_locations_options']);
$result['selected_bundles_options'] = $this->prepare_data_for_select($localized_vars['selected_bundles_options']);
$result['services'] = array_column($localized_vars['services'], 'name', 'id');
$result['agents'] = array_column($localized_vars['agents'], 'name', 'id');;
$result['locations'] = array_column($localized_vars['locations'], 'name', 'id');
$result['location_categories'] = OsLocationHelper::get_location_categories();
$result['service_categories'] = array_column($localized_vars['service_categories'], 'name', 'id');
$result['bundles'] = array_column($localized_vars['bundles'], 'name', 'id');
return $result;
}
private function prepare_data_for_select( array $options ): array {
return array_column($options, 'label', 'value');
}
/**
* Init Widgets - Include widgets files and register them
*/
public function register_widgets(): void {
$data_for_blocks = $this->get_data_for_blocks();
foreach ( $this->widgets as $widget ) {
$path = LATEPOINT_ABSPATH . 'blocks/elementor/elementor_widget_' . $widget . '.php';
if ( file_exists( $path ) ) {
include_once( $path );
# class name should be in format: Latepoint_Elementor_Widget_Book_Button
$class_name = 'Latepoint_Elementor_Widget_' . str_replace( [ '-', ' ' ], [ '_', '_' ], ucfirst( $widget ) );
if ( class_exists( $class_name ) ) {
\Elementor\Plugin::instance()->widgets_manager->register( new $class_name([], $data_for_blocks) );
}
}
}
}
/**
* Register Widgets Category
*
* @param $elements_manager
*
* @return void
*/
public function register_widgets_category( $elements_manager ): void {
$elements_manager->add_category(
self::$category, [
'title' => __( 'Latepoint', 'latepoint' ),
'icon' => 'fa fa-plug',
]
);
}
}