PluginProbe
Elementor Website Builder – more than just a page builder / 4.3.0-beta1
Elementor Website Builder – more than just a page builder v4.3.0-beta1
4.3.0-beta2 4.3.0-beta1 4.2.4 4.2.3 4.2.2 4.2.1 4.2.0 4.1.5 4.2.0-beta2 4.2.0-dev2 4.2.0-beta1 4.1.4 4.1.3 4.1.2 4.1.1 4.1.0 4.1.0-beta3 4.1.0-dev3 4.0.9 4.1.0-beta2 4.1.0-dev2 4.0.8 4.1.0-beta1 4.1.0-dev1 4.0.7 All 451 releases
elementor / core / editor / loader / editor-loader.php

editor-loader.php in Elementor Website Builder – more than just a page builder 4.3.0-beta1, at core/editor/loader/editor-loader.php

526 lines 11.9 KB
No matching file
Up and down to move Enter to open Esc to close
Raw Download Zip
1 <?php
2 namespace Elementor\Core\Editor\Loader;
3
4 use Elementor\Core\Utils\Assets_Config_Provider;
5 use Elementor\Core\Utils\Assets_Translation_Loader;
6 use Elementor\Core\Utils\Collection;
7 use Elementor\Modules\AtomicWidgets\Utils\Image\Placeholder_Image;
8 use Elementor\Plugin;
9 use Elementor\Utils;
10
11 if ( ! defined( 'ABSPATH' ) ) {
12 exit; // Exit if accessed directly.
13 }
14
15 final class Editor_Loader {
16 const APP_PACKAGE = 'editor';
17 const ENV_PACKAGE = 'env';
18
19 const LIBS = [
20 'editor-modal-shell',
21 'editor-responsive',
22 'editor-ui',
23 'editor-v1-adapters',
24 self::ENV_PACKAGE,
25 'http-client',
26 'icons',
27 'locations',
28 'menus',
29 'query',
30 'schema',
31 'store',
32 'session',
33 'twing',
34 'ui',
35 'utils',
36 'wp-media',
37 'editor-current-user',
38 'editor-elements-panel-notice',
39 'elementor-mcp-common',
40 'editor-embedded-documents-manager',
41 ];
42
43 const EXTENSIONS = [
44 'events',
45 'editor-documents',
46 'editor-notifications',
47 'editor-panels',
48 'editor-elements-panel',
49 'unlock-v4-promo',
50 'editor-mcp',
51 'elementor-v3-mcp',
52 'elementor-kit-mcp',
53 ];
54
55 const ADDITIONAL_DEPS = [
56 'editor-v1-adapters' => [
57 'elementor-web-cli',
58 ],
59 'wp-media' => [
60 'media-models',
61 ],
62 ];
63
64 /**
65 * @var Collection
66 */
67 private $config;
68
69 /**
70 * @var Assets_Config_Provider
71 */
72 private $assets_config_provider;
73
74 public function __construct( Collection $config, Assets_Config_Provider $assets_config_provider ) {
75 $this->config = $config;
76 $this->assets_config_provider = $assets_config_provider;
77 }
78
79 public function init() {
80 $packages = array_merge( $this->get_packages_to_enqueue(), self::LIBS );
81 $packages_with_app = array_merge( $packages, [ self::APP_PACKAGE ] );
82
83 foreach ( $packages_with_app as $package ) {
84 $this->assets_config_provider->load( $package );
85 }
86
87 $this->do_editor_action( 'init' );
88 }
89
90 public function register_scripts() {
91 $this->register_base_scripts();
92
93 $assets_url = $this->config->get( 'assets_url' );
94 $min_suffix = $this->config->get( 'min_suffix' );
95
96 foreach ( $this->assets_config_provider->all() as $package => $config ) {
97 if ( self::ENV_PACKAGE === $package ) {
98 wp_register_script(
99 'elementor-editor-environment',
100 "{$assets_url}js/editor-environment{$min_suffix}.js",
101 [ $config['handle'] ],
102 ELEMENTOR_VERSION,
103 true
104 );
105 }
106
107 if ( self::APP_PACKAGE === $package ) {
108 wp_register_script(
109 'elementor-editor-loader',
110 "{$assets_url}js/editor-loader{$min_suffix}.js",
111 [ 'elementor-editor', $config['handle'] ],
112 ELEMENTOR_VERSION,
113 true
114 );
115 }
116
117 $additional_deps = self::ADDITIONAL_DEPS[ $package ] ?? [];
118 $deps = array_merge( $config['deps'], $additional_deps );
119
120 wp_register_script(
121 $config['handle'],
122 "{$assets_url}js/packages/{$package}/{$package}{$min_suffix}.js",
123 $deps,
124 ELEMENTOR_VERSION,
125 true
126 );
127 }
128
129 $packages_handles = $this->assets_config_provider->pluck( 'handle' )->all();
130
131 Assets_Translation_Loader::for_handles( $packages_handles, 'elementor' );
132
133 $this->do_editor_action( 'scripts/register' );
134 }
135
136 public function enqueue_scripts() {
137 $this->do_editor_action( 'scripts/enqueue/before' );
138
139 wp_enqueue_script( 'elementor-responsive-bar' );
140
141 wp_enqueue_script( 'elementor-editor-environment' );
142
143 $env_config = $this->assets_config_provider->get( self::ENV_PACKAGE );
144
145 if ( $env_config ) {
146 $client_env = $this->apply_editor_filter( 'scripts/env', [
147 '@elementor/http-client' => [
148 'base_url' => rest_url(),
149 'headers' => [
150 'X-WP-Nonce' => wp_create_nonce( 'wp_rest' ),
151 ],
152 ],
153 '@elementor/editor-controls' => [
154 'background_placeholder_image' => Placeholder_Image::get_background_placeholder_image(),
155 ],
156 ] );
157
158 Utils::print_js_config(
159 $env_config['handle'],
160 'elementorEditorEnv',
161 $client_env
162 );
163 }
164
165 $packages_with_app = array_merge( $this->get_packages_to_enqueue(), [ self::APP_PACKAGE ] );
166
167 foreach ( $this->assets_config_provider->only( $packages_with_app ) as $config ) {
168 wp_enqueue_script( $config['handle'] );
169 }
170
171 $this->do_editor_action( 'scripts/enqueue' );
172
173 Utils::print_js_config(
174 'elementor-editor',
175 'ElementorConfig',
176 Editor_Scripts_Settings::get()
177 );
178
179 wp_enqueue_script( 'elementor-editor-loader' );
180
181 $this->do_editor_action( 'scripts/enqueue/after' );
182 }
183
184 public function register_styles() {
185 $this->register_base_styles();
186
187 $assets_url = $this->config->get( 'assets_url' );
188 $min_suffix = $this->config->get( 'min_suffix' );
189
190 foreach ( $this->get_styles() as $style ) {
191 wp_register_style(
192 "elementor-{$style}",
193 "{$assets_url}css/{$style}{$min_suffix}.css",
194 [ 'elementor-editor' ],
195 ELEMENTOR_VERSION
196 );
197 }
198
199 $this->do_editor_action( 'styles/register' );
200 }
201
202 public function enqueue_styles() {
203 wp_enqueue_style( 'elementor-editor' );
204 wp_enqueue_style( 'elementor-responsive-bar' );
205
206 foreach ( $this->get_styles() as $style ) {
207 wp_enqueue_style( "elementor-{$style}" );
208 }
209
210 $this->do_editor_action( 'styles/enqueue' );
211 }
212
213 public function print_root_template() {
214 $body_file_path = __DIR__ . '/templates/editor-body-view.php';
215
216 include ELEMENTOR_PATH . 'includes/editor-templates/editor-wrapper.php';
217 }
218
219 public function register_additional_templates() {
220 $templates = [
221 'global',
222 'panel',
223 'panel-elements',
224 'repeater',
225 'templates',
226 'navigator',
227 'hotkeys',
228 'responsive-bar',
229 ];
230
231 $templates = apply_filters( 'elementor/editor/templates', $templates );
232
233 foreach ( $templates as $template ) {
234 Plugin::$instance->common->add_template( ELEMENTOR_PATH . "includes/editor-templates/{$template}.php" );
235 }
236 }
237
238 private function get_packages_to_enqueue(): array {
239 return $this->apply_editor_filter( 'packages', self::EXTENSIONS );
240 }
241
242 private function get_styles(): array {
243 $styles = $this->apply_editor_filter( 'styles', [] );
244
245 return Collection::make( $styles )
246 ->unique()
247 ->all();
248 }
249
250 private function do_editor_action( string $hook_suffix ): void {
251 if ( 'init' !== $hook_suffix ) {
252 do_action( 'elementor/editor/' . $hook_suffix );
253 }
254
255 do_action( 'elementor/editor/v1/' . $hook_suffix );
256 do_action( 'elementor/editor/v2/' . $hook_suffix );
257 }
258
259 private function apply_editor_filter( string $hook_suffix, $value ) {
260 $value = apply_filters( 'elementor/editor/' . $hook_suffix, $value );
261 $value = apply_filters( 'elementor/editor/v1/' . $hook_suffix, $value );
262
263 return apply_filters( 'elementor/editor/v2/' . $hook_suffix, $value );
264 }
265
266 private function scripts_source_map() {
267 $assets_url = $this->config->get( 'assets_url' );
268 $min_suffix = $this->config->get( 'min_suffix' );
269
270 return [
271 'ace' => [
272 'src' => 'https://cdn.jsdelivr.net/npm/ace-builds@1.43.2/src-min-noconflict/ace.min.js',
273 'deps' => [],
274 'ver' => '1.43.2',
275 ],
276
277 'ace-language-tools' => [
278 'src' => 'https://cdn.jsdelivr.net/npm/ace-builds@1.43.2/src-min-noconflict/ext-language_tools.js',
279 'deps' => [ 'ace' ],
280 'ver' => '1.43.2',
281 ],
282
283 'pickr' => [
284 'src' => "{$assets_url}lib/pickr/pickr.min.js",
285 'deps' => [],
286 'ver' => '1.8.2',
287 ],
288
289 'flatpickr' => [
290 'src' => "{$assets_url}lib/flatpickr/flatpickr{$min_suffix}.js",
291 'deps' => [ 'jquery' ],
292 'ver' => '4.6.13',
293 ],
294 ];
295 }
296
297 private function styles_source_map() {
298 $assets_url = $this->config->get( 'assets_url' );
299 $min_suffix = $this->config->get( 'min_suffix' );
300
301 return [
302 'font-awesome' => [
303 'src' => "{$assets_url}lib/font-awesome/css/font-awesome{$min_suffix}.css",
304 'deps' => [],
305 'ver' => '4.7.0',
306 ],
307
308 'elementor-select2' => [
309 'src' => "{$assets_url}lib/e-select2/css/e-select2{$min_suffix}.css",
310 'deps' => [],
311 'ver' => '4.0.6-rc.1',
312 ],
313
314 'pickr' => [
315 'src' => "{$assets_url}lib/pickr/themes/monolith.min.css",
316 'deps' => [],
317 'ver' => '1.8.2',
318 ],
319
320 'flatpickr' => [
321 'src' => "{$assets_url}lib/flatpickr/flatpickr{$min_suffix}.css",
322 'deps' => [],
323 'ver' => '4.6.13',
324 ],
325 ];
326 }
327
328 private function register_base_scripts() {
329 $assets_url = $this->config->get( 'assets_url' );
330 $min_suffix = $this->config->get( 'min_suffix' );
331
332 wp_register_script(
333 'elementor-editor-modules',
334 "{$assets_url}js/editor-modules{$min_suffix}.js",
335 [ 'elementor-common-modules' ],
336 ELEMENTOR_VERSION,
337 true
338 );
339
340 wp_register_script(
341 'elementor-editor-document',
342 "{$assets_url}js/editor-document{$min_suffix}.js",
343 [ 'elementor-common-modules' ],
344 ELEMENTOR_VERSION,
345 true
346 );
347
348 wp_register_script(
349 'perfect-scrollbar',
350 "{$assets_url}lib/perfect-scrollbar/js/perfect-scrollbar{$min_suffix}.js",
351 [],
352 '1.4.0',
353 true
354 );
355
356 wp_register_script(
357 'jquery-easing',
358 "{$assets_url}lib/jquery-easing/jquery-easing{$min_suffix}.js",
359 [ 'jquery' ],
360 '1.3.2',
361 true
362 );
363
364 wp_register_script(
365 'nprogress',
366 "{$assets_url}lib/nprogress/nprogress{$min_suffix}.js",
367 [],
368 '0.2.0',
369 true
370 );
371
372 wp_register_script(
373 'tipsy',
374 "{$assets_url}lib/tipsy/tipsy{$min_suffix}.js",
375 [ 'jquery' ],
376 '1.0.0',
377 true
378 );
379
380 wp_register_script(
381 'jquery-elementor-select2',
382 "{$assets_url}lib/e-select2/js/e-select2.full{$min_suffix}.js",
383 [ 'jquery' ],
384 '4.0.6-rc.1',
385 true
386 );
387
388 wp_register_script(
389 'jquery-hover-intent',
390 "{$assets_url}lib/jquery-hover-intent/jquery-hover-intent{$min_suffix}.js",
391 [],
392 '1.0.0',
393 true
394 );
395
396 wp_register_script(
397 'nouislider',
398 "{$assets_url}lib/nouislider/nouislider{$min_suffix}.js",
399 [],
400 '13.0.0',
401 true
402 );
403
404 $source_map = $this->scripts_source_map();
405
406 foreach ( $source_map as $handle => $script ) {
407 wp_register_script(
408 $handle,
409 $script['src'],
410 $script['deps'],
411 $script['ver'],
412 true
413 );
414 }
415
416 add_action( 'elementor/assets-manager/register_scripts', function( $assets ) use ( $source_map ) {
417 foreach ( $source_map as $handle => $script ) {
418 $assets->append(
419 $handle,
420 $script['src'],
421 $script['deps'],
422 $script['ver']
423 );
424 }
425 } );
426
427 wp_register_script(
428 'elementor-editor',
429 "{$assets_url}js/editor{$min_suffix}.js",
430 [
431 'elementor-common',
432 'elementor-editor-modules',
433 'elementor-editor-document',
434 'wp-auth-check',
435 'jquery-ui-sortable',
436 'jquery-ui-resizable',
437 'perfect-scrollbar',
438 'nprogress',
439 'tipsy',
440 'imagesloaded',
441 'heartbeat',
442 'jquery-elementor-select2',
443 'flatpickr',
444 'ace',
445 'ace-language-tools',
446 'jquery-hover-intent',
447 'nouislider',
448 'pickr',
449 'react',
450 'react-dom',
451 ],
452 ELEMENTOR_VERSION,
453 true
454 );
455
456 wp_set_script_translations( 'elementor-editor', 'elementor' );
457
458 wp_register_script(
459 'elementor-responsive-bar',
460 "{$assets_url}js/responsive-bar{$min_suffix}.js",
461 [ 'elementor-editor' ],
462 ELEMENTOR_VERSION,
463 true
464 );
465
466 wp_set_script_translations( 'elementor-responsive-bar', 'elementor' );
467 }
468
469 private function register_base_styles() {
470 $assets_url = $this->config->get( 'assets_url' );
471 $min_suffix = $this->config->get( 'min_suffix' );
472 $direction_suffix = $this->config->get( 'direction_suffix' );
473
474 wp_register_style(
475 'google-font-roboto',
476 'https://fonts.googleapis.com/css?family=Roboto:300,400,500,700',
477 [],
478 ELEMENTOR_VERSION
479 );
480
481 $source_map = $this->styles_source_map();
482
483 foreach ( $source_map as $handle => $style ) {
484 wp_register_style(
485 $handle,
486 $style['src'],
487 $style['deps'],
488 $style['ver']
489 );
490 }
491
492 add_action( 'elementor/assets-manager/register_styles', function( $assets ) use ( $source_map ) {
493 foreach ( $source_map as $handle => $style ) {
494 $assets->append(
495 $handle,
496 $style['src'],
497 $style['deps'],
498 $style['ver']
499 );
500 }
501 } );
502
503 wp_register_style(
504 'elementor-editor',
505 "{$assets_url}css/editor{$direction_suffix}{$min_suffix}.css",
506 [
507 'elementor-common',
508 'elementor-select2',
509 'elementor-icons',
510 'wp-auth-check',
511 'google-font-roboto',
512 'flatpickr',
513 'pickr',
514 ],
515 ELEMENTOR_VERSION
516 );
517
518 wp_register_style(
519 'elementor-responsive-bar',
520 "{$assets_url}css/responsive-bar{$min_suffix}.css",
521 [],
522 ELEMENTOR_VERSION
523 );
524 }
525 }
526