PluginProbe
Elementor Website Builder – more than just a page builder / 3.6.4
Elementor Website Builder – more than just a page builder v3.6.4
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 / base / module.php

module.php in Elementor Website Builder – more than just a page builder 3.6.4, at core/base/module.php

333 lines 6.6 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;
3
4 use Elementor\Plugin;
5
6 if ( ! defined( 'ABSPATH' ) ) {
7 exit; // Exit if accessed directly.
8 }
9
10 /**
11 * Elementor module.
12 *
13 * An abstract class that provides the needed properties and methods to
14 * manage and handle modules in inheriting classes.
15 *
16 * @since 1.7.0
17 * @abstract
18 */
19 abstract class Module extends Base_Object {
20
21 /**
22 * Module class reflection.
23 *
24 * Holds the information about a class.
25 *
26 * @since 1.7.0
27 * @access private
28 *
29 * @var \ReflectionClass
30 */
31 private $reflection;
32
33 /**
34 * Module components.
35 *
36 * Holds the module components.
37 *
38 * @since 1.7.0
39 * @access private
40 *
41 * @var array
42 */
43 private $components = [];
44
45 /**
46 * Module instance.
47 *
48 * Holds the module instance.
49 *
50 * @since 1.7.0
51 * @access protected
52 *
53 * @var Module
54 */
55 protected static $_instances = [];
56
57 /**
58 * Get module name.
59 *
60 * Retrieve the module name.
61 *
62 * @since 1.7.0
63 * @access public
64 * @abstract
65 *
66 * @return string Module name.
67 */
68 abstract public function get_name();
69
70 /**
71 * Instance.
72 *
73 * Ensures only one instance of the module class is loaded or can be loaded.
74 *
75 * @since 1.7.0
76 * @access public
77 * @static
78 *
79 * @return Module An instance of the class.
80 */
81 public static function instance() {
82 $class_name = static::class_name();
83
84 if ( empty( static::$_instances[ $class_name ] ) ) {
85 static::$_instances[ $class_name ] = new static();
86 }
87
88 return static::$_instances[ $class_name ];
89 }
90
91 /**
92 * @since 2.0.0
93 * @access public
94 * @static
95 */
96 public static function is_active() {
97 return true;
98 }
99
100 /**
101 * Class name.
102 *
103 * Retrieve the name of the class.
104 *
105 * @since 1.7.0
106 * @access public
107 * @static
108 */
109 public static function class_name() {
110 return get_called_class();
111 }
112
113 public static function get_experimental_data() {
114 return [];
115 }
116
117 /**
118 * Clone.
119 *
120 * Disable class cloning and throw an error on object clone.
121 *
122 * The whole idea of the singleton design pattern is that there is a single
123 * object. Therefore, we don't want the object to be cloned.
124 *
125 * @since 1.7.0
126 * @access public
127 */
128 public function __clone() {
129 // Cloning instances of the class is forbidden
130 _doing_it_wrong( __FUNCTION__, esc_html__( 'Something went wrong.', 'elementor' ), '1.0.0' );
131 }
132
133 /**
134 * Wakeup.
135 *
136 * Disable unserializing of the class.
137 *
138 * @since 1.7.0
139 * @access public
140 */
141 public function __wakeup() {
142 // Unserializing instances of the class is forbidden
143 _doing_it_wrong( __FUNCTION__, esc_html__( 'Something went wrong.', 'elementor' ), '1.0.0' );
144 }
145
146 /**
147 * @since 2.0.0
148 * @access public
149 */
150 public function get_reflection() {
151 if ( null === $this->reflection ) {
152 $this->reflection = new \ReflectionClass( $this );
153 }
154
155 return $this->reflection;
156 }
157
158 /**
159 * Add module component.
160 *
161 * Add new component to the current module.
162 *
163 * @since 1.7.0
164 * @access public
165 *
166 * @param string $id Component ID.
167 * @param mixed $instance An instance of the component.
168 */
169 public function add_component( $id, $instance ) {
170 $this->components[ $id ] = $instance;
171 }
172
173 /**
174 * @since 2.3.0
175 * @access public
176 * @return Module[]
177 */
178 public function get_components() {
179 return $this->components;
180 }
181
182 /**
183 * Get module component.
184 *
185 * Retrieve the module component.
186 *
187 * @since 1.7.0
188 * @access public
189 *
190 * @param string $id Component ID.
191 *
192 * @return mixed An instance of the component, or `false` if the component
193 * doesn't exist.
194 */
195 public function get_component( $id ) {
196 if ( isset( $this->components[ $id ] ) ) {
197 return $this->components[ $id ];
198 }
199
200 return false;
201 }
202
203 /**
204 * Get assets url.
205 *
206 * @since 2.3.0
207 * @access protected
208 *
209 * @param string $file_name
210 * @param string $file_extension
211 * @param string $relative_url Optional. Default is null.
212 * @param string $add_min_suffix Optional. Default is 'default'.
213 *
214 * @return string
215 */
216 final protected function get_assets_url( $file_name, $file_extension, $relative_url = null, $add_min_suffix = 'default' ) {
217 static $is_test_mode = null;
218
219 if ( null === $is_test_mode ) {
220 $is_test_mode = defined( 'SCRIPT_DEBUG' ) && SCRIPT_DEBUG || defined( 'ELEMENTOR_TESTS' ) && ELEMENTOR_TESTS;
221 }
222
223 if ( ! $relative_url ) {
224 $relative_url = $this->get_assets_relative_url() . $file_extension . '/';
225 }
226
227 $url = $this->get_assets_base_url() . $relative_url . $file_name;
228
229 if ( 'default' === $add_min_suffix ) {
230 $add_min_suffix = ! $is_test_mode;
231 }
232
233 if ( $add_min_suffix ) {
234 $url .= '.min';
235 }
236
237 return $url . '.' . $file_extension;
238 }
239
240 /**
241 * Get js assets url
242 *
243 * @since 2.3.0
244 * @access protected
245 *
246 * @param string $file_name
247 * @param string $relative_url Optional. Default is null.
248 * @param string $add_min_suffix Optional. Default is 'default'.
249 *
250 * @return string
251 */
252 final protected function get_js_assets_url( $file_name, $relative_url = null, $add_min_suffix = 'default' ) {
253 return $this->get_assets_url( $file_name, 'js', $relative_url, $add_min_suffix );
254 }
255
256 /**
257 * Get css assets url
258 *
259 * @since 2.3.0
260 * @access protected
261 *
262 * @param string $file_name
263 * @param string $relative_url Optional. Default is null.
264 * @param string $add_min_suffix Optional. Default is 'default'.
265 * @param bool $add_direction_suffix Optional. Default is `false`
266 *
267 * @return string
268 */
269 final protected function get_css_assets_url( $file_name, $relative_url = null, $add_min_suffix = 'default', $add_direction_suffix = false ) {
270 static $direction_suffix = null;
271
272 if ( ! $direction_suffix ) {
273 $direction_suffix = is_rtl() ? '-rtl' : '';
274 }
275
276 if ( $add_direction_suffix ) {
277 $file_name .= $direction_suffix;
278 }
279
280 return $this->get_assets_url( $file_name, 'css', $relative_url, $add_min_suffix );
281 }
282
283 /**
284 * Get assets base url
285 *
286 * @since 2.6.0
287 * @access protected
288 *
289 * @return string
290 */
291 protected function get_assets_base_url() {
292 return ELEMENTOR_URL;
293 }
294
295 /**
296 * Get assets relative url
297 *
298 * @since 2.3.0
299 * @access protected
300 *
301 * @return string
302 */
303 protected function get_assets_relative_url() {
304 return 'assets/';
305 }
306
307 /**
308 * Get the module's associated widgets.
309 *
310 * @return string[]
311 */
312 protected function get_widgets() {
313 return [];
314 }
315
316 /**
317 * Initialize the module related widgets.
318 */
319 public function init_widgets() {
320 $widget_manager = Plugin::instance()->widgets_manager;
321
322 foreach ( $this->get_widgets() as $widget ) {
323 $class_name = $this->get_reflection()->getNamespaceName() . '\Widgets\\' . $widget;
324
325 $widget_manager->register( new $class_name() );
326 }
327 }
328
329 public function __construct() {
330 add_action( 'elementor/widgets/register', [ $this, 'init_widgets' ] );
331 }
332 }
333