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 }