balmet.com

Unnamed repository; edit this file 'description' to name the repository.
Log | Files | Refs

autoloader.php (9399B)


      1 <?php
      2 namespace Elementor;
      3 
      4 if ( ! defined( 'ABSPATH' ) ) {
      5 	exit; // Exit if accessed directly.
      6 }
      7 
      8 /**
      9  * Elementor autoloader.
     10  *
     11  * Elementor autoloader handler class is responsible for loading the different
     12  * classes needed to run the plugin.
     13  *
     14  * @since 1.6.0
     15  */
     16 class Autoloader {
     17 
     18 	/**
     19 	 * Classes map.
     20 	 *
     21 	 * Maps Elementor classes to file names.
     22 	 *
     23 	 * @since 1.6.0
     24 	 * @access private
     25 	 * @static
     26 	 *
     27 	 * @var array Classes used by elementor.
     28 	 */
     29 	private static $classes_map;
     30 
     31 	/**
     32 	 * Classes aliases.
     33 	 *
     34 	 * Maps Elementor classes to aliases.
     35 	 *
     36 	 * @since 1.6.0
     37 	 * @access private
     38 	 * @static
     39 	 *
     40 	 * @var array Classes aliases.
     41 	 */
     42 	private static $classes_aliases;
     43 
     44 	/**
     45 	 * Default path for autoloader.
     46 	 *
     47 	 * @var string
     48 	 */
     49 	private static $default_path;
     50 
     51 	/**
     52 	 * Default namespace for autoloader.
     53 	 *
     54 	 * @var string
     55 	 */
     56 	private static $default_namespace;
     57 
     58 	/**
     59 	 * Run autoloader.
     60 	 *
     61 	 * Register a function as `__autoload()` implementation.
     62 	 *
     63 	 * @param string $default_path
     64 	 * @param string $default_namespace
     65 	 *
     66 	 * @since 1.6.0
     67 	 * @access public
     68 	 * @static
     69 	 */
     70 	public static function run( $default_path = '', $default_namespace = '' ) {
     71 		if ( '' === $default_path ) {
     72 			$default_path = ELEMENTOR_PATH;
     73 		}
     74 
     75 		if ( '' === $default_namespace ) {
     76 			$default_namespace = __NAMESPACE__;
     77 		}
     78 
     79 		self::$default_path = $default_path;
     80 		self::$default_namespace = $default_namespace;
     81 
     82 		spl_autoload_register( [ __CLASS__, 'autoload' ] );
     83 	}
     84 
     85 	/**
     86 	 * Get classes aliases.
     87 	 *
     88 	 * Retrieve the classes aliases names.
     89 	 *
     90 	 * @since 1.6.0
     91 	 * @access public
     92 	 * @static
     93 	 *
     94 	 * @return array Classes aliases.
     95 	 */
     96 	public static function get_classes_aliases() {
     97 		if ( ! self::$classes_aliases ) {
     98 			self::init_classes_aliases();
     99 		}
    100 
    101 		return self::$classes_aliases;
    102 	}
    103 
    104 	public static function get_classes_map() {
    105 		if ( ! self::$classes_map ) {
    106 			self::init_classes_map();
    107 		}
    108 
    109 		return self::$classes_map;
    110 	}
    111 
    112 	private static function init_classes_map() {
    113 		self::$classes_map = [
    114 			'Api' => 'includes/api.php',
    115 			'Base_Control' => 'includes/controls/base.php',
    116 			'Base_Data_Control' => 'includes/controls/base-data.php',
    117 			'Base_UI_Control' => 'includes/controls/base-ui.php',
    118 			'Beta_Testers' => 'includes/beta-testers.php',
    119 			'Compatibility' => 'includes/compatibility.php',
    120 			'Conditions' => 'includes/conditions.php',
    121 			'Controls_Manager' => 'includes/managers/controls.php',
    122 			'Controls_Stack' => 'includes/base/controls-stack.php',
    123 			'Sub_Controls_Stack' => 'includes/base/sub-controls-stack.php',
    124 			'DB' => 'includes/db.php',
    125 			'Elements_Manager' => 'includes/managers/elements.php',
    126 			'Embed' => 'includes/embed.php',
    127 			'Fonts' => 'includes/fonts.php',
    128 			'Frontend' => 'includes/frontend.php',
    129 			'Group_Control_Base' => 'includes/controls/groups/base.php',
    130 			'Group_Control_Interface' => 'includes/interfaces/group-control.php',
    131 			'Heartbeat' => 'includes/heartbeat.php',
    132 			'Images_Manager' => 'includes/managers/image.php',
    133 			'Maintenance' => 'includes/maintenance.php',
    134 			'Maintenance_Mode' => 'includes/maintenance-mode.php',
    135 			'Preview' => 'includes/preview.php',
    136 			'Rollback' => 'includes/rollback.php',
    137 			'Settings' => 'includes/settings/settings.php',
    138 			'Settings_Controls' => 'includes/settings/controls.php',
    139 			'Settings_Validations' => 'includes/settings/validations.php',
    140 			'Settings_Page' => 'includes/settings/settings-page.php',
    141 			'Shapes' => 'includes/shapes.php',
    142 			'Skins_Manager' => 'includes/managers/skins.php',
    143 			'Icons_Manager' => 'includes/managers/icons.php',
    144 			'Stylesheet' => 'includes/stylesheet.php',
    145 			'System_Info\Main' => 'includes/settings/system-info/main.php',
    146 			'TemplateLibrary\Classes\Import_Images' => 'includes/template-library/classes/class-import-images.php',
    147 			'TemplateLibrary\Manager' => 'includes/template-library/manager.php',
    148 			'TemplateLibrary\Source_Base' => 'includes/template-library/sources/base.php',
    149 			'TemplateLibrary\Source_Local' => 'includes/template-library/sources/local.php',
    150 			'TemplateLibrary\Source_Remote' => 'includes/template-library/sources/remote.php',
    151 			'Tools' => 'includes/settings/tools.php',
    152 			'Tracker' => 'includes/tracker.php',
    153 			'User' => 'includes/user.php',
    154 			'Utils' => 'includes/utils.php',
    155 			'Widget_WordPress' => 'includes/widgets/wordpress.php',
    156 			'Widgets_Manager' => 'includes/managers/widgets.php',
    157 			'WordPress_Widgets_Manager' => 'includes/managers/wordpress-widgets.php',
    158 		];
    159 
    160 		$controls_names = Controls_Manager::get_controls_names();
    161 
    162 		$controls_names = array_merge( $controls_names, [
    163 			'base_multiple',
    164 			'base_units',
    165 		] );
    166 
    167 		foreach ( $controls_names as $control_name ) {
    168 			$class_name = 'Control_' . self::normalize_class_name( $control_name, '_' );
    169 
    170 			self::$classes_map[ $class_name ] = 'includes/controls/' . str_replace( '_', '-', $control_name ) . '.php';
    171 		}
    172 
    173 		$controls_groups_names = Controls_Manager::get_groups_names();
    174 
    175 		foreach ( $controls_groups_names as $group_name ) {
    176 			$class_name = 'Group_Control_' . self::normalize_class_name( $group_name, '_' );
    177 
    178 			self::$classes_map[ $class_name ] = 'includes/controls/groups/' . $group_name . '.php';
    179 		}
    180 	}
    181 
    182 	/**
    183 	 * Normalize Class Name
    184 	 *
    185 	 * Used to convert control names to class names.
    186 	 *
    187 	 * @param $string
    188 	 * @param string $delimiter
    189 	 *
    190 	 * @return mixed
    191 	 */
    192 	private static function normalize_class_name( $string, $delimiter = ' ' ) {
    193 		return ucwords( str_replace( '-', '_', $string ), $delimiter );
    194 	}
    195 
    196 	private static function init_classes_aliases() {
    197 		self::$classes_aliases = [
    198 			'Core\Ajax' => [
    199 				'replacement' => 'Core\Common\Modules\Ajax\Module',
    200 				'version' => '2.3.0',
    201 			],
    202 			'Editor' => [
    203 				'replacement' => 'Core\Editor\Editor',
    204 				'version' => '2.6.0',
    205 			],
    206 			'Scheme_Base' => [
    207 				'replacement' => 'Core\Schemes\Base',
    208 				'version' => '2.8.0',
    209 			],
    210 			'Scheme_Color' => [
    211 				'replacement' => 'Core\Schemes\Color',
    212 				'version' => '2.8.0',
    213 			],
    214 			'Scheme_Color_Picker' => [
    215 				'replacement' => 'Core\Schemes\Color_Picker',
    216 				'version' => '2.8.0',
    217 			],
    218 			'Schemes_Manager' => [
    219 				'replacement' => 'Core\Schemes\Manager',
    220 				'version' => '2.8.0',
    221 			],
    222 			'Scheme_Typography' => [
    223 				'replacement' => 'Core\Schemes\Typography',
    224 				'version' => '2.8.0',
    225 			],
    226 			'System_Info\Main' => [
    227 				'replacement' => 'Modules\System_Info\Module',
    228 				'version' => '2.9.0',
    229 			],
    230 			'System_Info\Classes\Abstracts\Base_Reporter' => [
    231 				'replacement' => 'Modules\System_Info\Reporters\Base',
    232 				'version' => '2.9.0',
    233 			],
    234 			'System_Info\Classes\Server_Reporter' => [
    235 				'replacement' => 'Modules\System_Info\Reporters\Server',
    236 				'version' => '2.9.0',
    237 			],
    238 			'System_Info\Classes\MU_Plugins_Reporter' => [
    239 				'replacement' => 'Modules\System_Info\Reporters\MU_Plugins',
    240 				'version' => '2.9.0',
    241 			],
    242 			'System_Info\Classes\Network_Plugins_Reporter' => [
    243 				'replacement' => 'Modules\System_Info\Reporters\Network_Plugins',
    244 				'version' => '2.9.0',
    245 			],
    246 			'System_Info\Classes\Plugins_Reporter' => [
    247 				'replacement' => 'Modules\System_Info\Reporters\Plugins',
    248 				'version' => '2.9.0',
    249 			],
    250 			'System_Info\Classes\Theme_Reporter' => [
    251 				'replacement' => 'Modules\System_Info\Reporters\Theme',
    252 				'version' => '2.9.0',
    253 			],
    254 			'System_Info\Classes\User_Reporter' => [
    255 				'replacement' => 'Modules\System_Info\Reporters\User',
    256 				'version' => '2.9.0',
    257 			],
    258 			'System_Info\Helpers\Model_Helper' => [
    259 				'replacement' => 'Modules\System_Info\Helpers\Model_Helper',
    260 				'version' => '2.9.0',
    261 			],
    262 		];
    263 	}
    264 
    265 	/**
    266 	 * Load class.
    267 	 *
    268 	 * For a given class name, require the class file.
    269 	 *
    270 	 * @since 1.6.0
    271 	 * @access private
    272 	 * @static
    273 	 *
    274 	 * @param string $relative_class_name Class name.
    275 	 */
    276 	private static function load_class( $relative_class_name ) {
    277 		$classes_map = self::get_classes_map();
    278 
    279 		if ( isset( $classes_map[ $relative_class_name ] ) ) {
    280 			$filename = self::$default_path . '/' . $classes_map[ $relative_class_name ];
    281 		} else {
    282 			$filename = strtolower(
    283 				preg_replace(
    284 					[ '/([a-z])([A-Z])/', '/_/', '/\\\/' ],
    285 					[ '$1-$2', '-', DIRECTORY_SEPARATOR ],
    286 					$relative_class_name
    287 				)
    288 			);
    289 
    290 			$filename = self::$default_path . $filename . '.php';
    291 		}
    292 
    293 		if ( is_readable( $filename ) ) {
    294 			require $filename;
    295 		}
    296 	}
    297 
    298 	/**
    299 	 * Autoload.
    300 	 *
    301 	 * For a given class, check if it exist and load it.
    302 	 *
    303 	 * @since 1.6.0
    304 	 * @access private
    305 	 * @static
    306 	 *
    307 	 * @param string $class Class name.
    308 	 */
    309 	private static function autoload( $class ) {
    310 		if ( 0 !== strpos( $class, self::$default_namespace . '\\' ) ) {
    311 			return;
    312 		}
    313 
    314 		$relative_class_name = preg_replace( '/^' . self::$default_namespace . '\\\/', '', $class );
    315 
    316 		$classes_aliases = self::get_classes_aliases();
    317 
    318 		$has_class_alias = isset( $classes_aliases[ $relative_class_name ] );
    319 
    320 		// Backward Compatibility: Save old class name for set an alias after the new class is loaded
    321 		if ( $has_class_alias ) {
    322 			$alias_data = $classes_aliases[ $relative_class_name ];
    323 
    324 			$relative_class_name = $alias_data['replacement'];
    325 		}
    326 
    327 		$final_class_name = self::$default_namespace . '\\' . $relative_class_name;
    328 
    329 		if ( ! class_exists( $final_class_name ) ) {
    330 			self::load_class( $relative_class_name );
    331 		}
    332 
    333 		if ( $has_class_alias ) {
    334 			class_alias( $final_class_name, $class );
    335 
    336 			Utils::handle_deprecation( $class, $alias_data['version'], $final_class_name );
    337 		}
    338 	}
    339 }