PluginProbe
Elementor Website Builder – more than just a page builder / 3.27.4
Elementor Website Builder – more than just a page builder v3.27.4
4.3.0-beta3 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 All 452 releases
elementor / core / base / elements-iteration-actions / assets.php

assets.php in Elementor Website Builder – more than just a page builder 3.27.4, at core/base/elements-iteration-actions/assets.php

198 lines 5.4 KB
No matching file
Up and down to move Enter to open Esc to close
Raw Download Zip
1 <?php
2 namespace Elementor\Core\Base\Elements_Iteration_Actions;
3
4 use Elementor\Conditions;
5 use Elementor\Element_Base;
6 use Elementor\Plugin;
7
8 if ( ! defined( 'ABSPATH' ) ) {
9 exit; // Exit if accessed directly
10 }
11
12 class Assets extends Base {
13 const ASSETS_META_KEY = '_elementor_page_assets';
14
15 // Default value must be empty.
16 private $page_assets;
17
18 // Default value must be empty.
19 private $saved_page_assets;
20
21 public function element_action( Element_Base $element_data ) {
22 $settings = $element_data->get_active_settings();
23 $controls = $element_data->get_controls();
24
25 $element_assets = $this->get_assets( $settings, $controls );
26
27 $element_assets_depend = [
28 'styles' => $element_data->get_style_depends(),
29 'scripts' => $element_data->get_script_depends(),
30 ];
31
32 if ( $element_assets_depend ) {
33 foreach ( $element_assets_depend as $assets_type => $assets ) {
34 if ( empty( $assets ) ) {
35 continue;
36 }
37
38 if ( ! isset( $element_assets[ $assets_type ] ) ) {
39 $element_assets[ $assets_type ] = [];
40 }
41
42 foreach ( $assets as $asset_name ) {
43 if ( ! in_array( $asset_name, $element_assets[ $assets_type ], true ) ) {
44 $element_assets[ $assets_type ][] = $asset_name;
45 }
46 }
47 }
48 }
49
50 if ( $element_assets ) {
51 $this->update_page_assets( $element_assets );
52 }
53 }
54
55 public function is_action_needed() {
56 // No need to evaluate in preview mode, will be made in the saving process.
57 if ( Plugin::$instance->preview->is_preview_mode() ) {
58 return false;
59 }
60
61 $page_assets = $this->get_saved_page_assets();
62
63 // When $page_assets is array it means that the assets registration has already been made at least once.
64 if ( is_array( $page_assets ) ) {
65 return false;
66 }
67
68 return true;
69 }
70
71 public function after_elements_iteration() {
72 // In case that the page assets value is empty, it should still be saved as an empty array as an indication that at lease one iteration has occurred.
73 if ( ! is_array( $this->page_assets ) ) {
74 $this->page_assets = [];
75 }
76
77 $this->get_document_assets();
78
79 // Saving the page assets data.
80 $this->document->update_meta( self::ASSETS_META_KEY, $this->page_assets );
81
82 if ( 'render' === $this->mode && $this->page_assets ) {
83 Plugin::$instance->assets_loader->enable_assets( $this->page_assets );
84 }
85 }
86
87 private function get_saved_page_assets( $force_meta_fetch = false ) {
88 if ( ! is_array( $this->saved_page_assets ) || $force_meta_fetch ) {
89 $this->saved_page_assets = $this->document->get_meta( self::ASSETS_META_KEY );
90 }
91
92 return $this->saved_page_assets;
93 }
94
95 private function update_page_assets( $new_assets ) {
96 if ( ! is_array( $this->page_assets ) ) {
97 $this->page_assets = [];
98 }
99
100 foreach ( $new_assets as $assets_type => $assets_type_data ) {
101 if ( ! isset( $this->page_assets[ $assets_type ] ) ) {
102 $this->page_assets[ $assets_type ] = [];
103 }
104
105 foreach ( $assets_type_data as $asset_name ) {
106 if ( ! in_array( $asset_name, $this->page_assets[ $assets_type ], true ) ) {
107 $this->page_assets[ $assets_type ][] = $asset_name;
108 }
109 }
110 }
111 }
112
113 private function get_assets( $settings, $controls ) {
114 $assets = [];
115
116 foreach ( $settings as $setting_key => $setting ) {
117 if ( ! isset( $controls[ $setting_key ] ) ) {
118 continue;
119 }
120
121 $control = $controls[ $setting_key ];
122
123 // Enabling assets loading from the registered control fields.
124 if ( ! empty( $control['assets'] ) ) {
125 foreach ( $control['assets'] as $assets_type => $dependencies ) {
126 foreach ( $dependencies as $dependency ) {
127 if ( ! empty( $dependency['conditions'] ) ) {
128 $is_condition_fulfilled = Conditions::check( $dependency['conditions'], $settings );
129
130 if ( ! $is_condition_fulfilled ) {
131 continue;
132 }
133 }
134
135 if ( ! isset( $assets[ $assets_type ] ) ) {
136 $assets[ $assets_type ] = [];
137 }
138
139 $assets[ $assets_type ][] = $dependency['name'];
140 }
141 }
142 }
143
144 // Enabling assets loading from the control object.
145 $control_obj = Plugin::$instance->controls_manager->get_control( $control['type'] );
146
147 $control_conditional_assets = $control_obj::get_assets( $setting );
148
149 if ( $control_conditional_assets ) {
150 foreach ( $control_conditional_assets as $assets_type => $dependencies ) {
151 foreach ( $dependencies as $dependency ) {
152 if ( ! isset( $assets[ $assets_type ] ) ) {
153 $assets[ $assets_type ] = [];
154 }
155
156 $assets[ $assets_type ][] = $dependency;
157 }
158 }
159 }
160 }
161
162 return $assets;
163 }
164
165 private function get_document_assets() {
166 $document_id = $this->document->get_post()->ID;
167
168 // Getting the document instance in order to get the most updated settings.
169 $updated_document = Plugin::$instance->documents->get( $document_id, false );
170
171 $document_settings = $updated_document->get_settings();
172
173 $document_controls = $this->document->get_controls();
174
175 $document_assets = $this->get_assets( $document_settings, $document_controls );
176
177 if ( $document_assets ) {
178 $this->update_page_assets( $document_assets );
179 }
180 }
181
182 public function __construct( $document ) {
183 parent::__construct( $document );
184
185 // No need to enable assets in preview mode, all assets will be loaded by default by the assets loader.
186 if ( Plugin::$instance->preview->is_preview_mode() ) {
187 return;
188 }
189
190 $page_assets = $this->get_saved_page_assets();
191
192 // If $page_assets is not empty then enabling the assets for loading.
193 if ( $page_assets ) {
194 Plugin::$instance->assets_loader->enable_assets( $page_assets );
195 }
196 }
197 }
198