PluginProbe
Sky Addons for Elementor / trunk
Sky Addons for Elementor vtrunk
3.8.5 3.8.4 3.8.3 3.8.2 3.8.0 3.8.1 3.3.3 3.3.2 trunk 1.0.0 1.0.10 1.0.2 1.0.6 1.0.7 1.0.8 1.0.9 1.5.0 2.0.0 2.0.8 2.5.10 2.5.11 2.5.12 2.5.13 2.5.15 2.5.16 All 52 releases
sky-elementor-addons / includes / modules-manager.php

modules-manager.php in Sky Addons for Elementor trunk, at includes/modules-manager.php

276 lines 8.3 KB
No matching file
Up and down to move Enter to open Esc to close
Raw Download Zip
1 <?php
2
3 namespace Sky_Addons;
4
5 use Elementor\Element_Base;
6
7 if ( ! defined( 'ABSPATH' ) ) {
8 exit;
9 }
10
11 final class Managers {
12
13 private $_modules = null;
14
15 const WIDGETS_DB_KEY = 'sky_addons_inactive_widgets';
16 const EXTENSIONS_DB_KEY = 'sky_addons_inactive_extensions';
17
18 public static function get_inactive_widgets() {
19 return get_option( self::WIDGETS_DB_KEY, [] );
20 }
21 public static function get_inactive_extensions() {
22 return get_option( self::EXTENSIONS_DB_KEY, [] );
23 }
24
25 /**
26 * Whether an extension is active.
27 *
28 * Memoized — the inactive list is fetched once per request and reused
29 * for subsequent calls. Default behaviour: when the option is empty
30 * (fresh install, never saved) all extensions are considered ACTIVE.
31 *
32 * @param string $slug Extension slug (e.g. 'equal-height', 'simple-parallax').
33 * @return bool
34 */
35 public static function is_extension_active( $slug ) {
36 static $inactive = null;
37 if ( null === $inactive ) {
38 $inactive = (array) self::get_inactive_extensions();
39 }
40 return ! in_array( $slug, $inactive, true );
41 }
42
43 /**
44 * Whether a widget is active.
45 *
46 * Memoized — the inactive list is fetched once per request and reused
47 * for subsequent calls. Default behaviour: when the option is empty
48 * (fresh install, never saved) all widgets are considered ACTIVE.
49 *
50 * @param string $slug Widget slug (e.g. 'logo-carousel', 'logo-grid').
51 * @return bool
52 */
53 public static function is_widget_active( $slug ) {
54 static $inactive = null;
55 if ( null === $inactive ) {
56 $inactive = (array) self::get_inactive_widgets();
57 }
58 return ! in_array( $slug, $inactive, true );
59 }
60
61 private function is_module_active( $module_id ) {
62 $module_data = $this->get_module_data( $module_id );
63 $inactive_widgets = self::get_inactive_widgets();
64
65 if ( ! $inactive_widgets ) {
66 return $module_data['default_activation'] ?? true;
67 } elseif ( ! in_array( $module_id, $inactive_widgets ) ) {
68 return true;
69 } else {
70 return false;
71 }
72 }
73
74 private function has_module_style( $module_id ) {
75 $module_data = $this->get_module_data( $module_id );
76 return isset( $module_data['has_style'] ) ? (bool) $module_data['has_style'] : false;
77 }
78
79 private function has_module_script( $module_id ) {
80 $module_data = $this->get_module_data( $module_id );
81 return isset( $module_data['has_script'] ) ? (bool) $module_data['has_script'] : false;
82 }
83
84 private function get_module_data( $module_id ) {
85 return isset( $this->_modules[ $module_id ] ) ? $this->_modules[ $module_id ] : false;
86 }
87
88 private function is_extension( $module_id ) {
89 $extensions = [
90 'animated-gradient-bg',
91 'backdrop-filter',
92 'custom-clip-path',
93 'equal-height',
94 'floating-effects',
95 'gradient-text',
96 'reveal-effects',
97 'ripples-effect',
98 'simple-parallax',
99 'wrapper-link',
100 ];
101 return in_array( $module_id, $extensions );
102 }
103
104 public function __construct() {
105 $modules = [];
106 $modules[] = 'advanced-accordion';
107 $modules[] = 'advanced-skill-bars';
108 $modules[] = 'advanced-slider';
109 $modules[] = 'animated-heading';
110 $modules[] = 'audio-player';
111 $modules[] = 'card';
112 $modules[] = 'changelog';
113 $modules[] = 'content-switcher';
114 $modules[] = 'dual-button';
115 $modules[] = 'glory-slider';
116 $modules[] = 'info-box';
117 $modules[] = 'image-compare';
118 $modules[] = 'list-group';
119 $modules[] = 'logo-grid';
120 $modules[] = 'logo-carousel';
121 $modules[] = 'momentum-slider';
122 $modules[] = 'panel-slider';
123 $modules[] = 'pdf-viewer';
124 $modules[] = 'portion-effect';
125 $modules[] = 'reading-progress';
126 $modules[] = 'review';
127 $modules[] = 'review-carousel';
128 $modules[] = 'slinky-menu';
129 $modules[] = 'social-icons';
130 $modules[] = 'stellar-slider';
131 $modules[] = 'step-flow';
132 $modules[] = 'table-of-contents';
133 $modules[] = 'team-member';
134 $modules[] = 'team-member-carousel';
135 $modules[] = 'testimonial';
136 $modules[] = 'testimonial-carousel';
137 $modules[] = 'tidy-list';
138
139 /**
140 * All Post Widgets
141 */
142
143 $modules[] = 'fellow-slider';
144 $modules[] = 'generic-grid';
145 $modules[] = 'generic-carousel';
146 $modules[] = 'luster-grid';
147 $modules[] = 'luster-carousel';
148 $modules[] = 'mate-list';
149 $modules[] = 'mate-slider';
150 $modules[] = 'mate-carousel';
151 $modules[] = 'naive-list';
152 $modules[] = 'naive-carousel';
153 $modules[] = 'post-list';
154 $modules[] = 'sapling-grid';
155 $modules[] = 'sapling-carousel';
156 $modules[] = 'ultra-grid';
157 $modules[] = 'ultra-carousel';
158
159 /**
160 * All Post Modules of Theme Builder
161 */
162
163 $modules[] = 'post-comments';
164
165 /**
166 * 3rd Party Modules
167 */
168 $modules[] = 'cf7';
169 $modules[] = 'fluent-form';
170 $modules[] = 'gravity-forms';
171 $modules[] = 'ninja-forms';
172 $modules[] = 'we-forms';
173 $modules[] = 'wp-forms';
174
175 /**
176 * All Extensions
177 */
178
179 if ( ! in_array( 'animated-gradient-bg', self::get_inactive_extensions() ) ) {
180 $modules[] = 'animated-gradient-bg';
181 }
182 if ( ! in_array( 'backdrop-filter', self::get_inactive_extensions() ) ) {
183 $modules[] = 'backdrop-filter';
184 }
185 if ( ! in_array( 'custom-clip-path', self::get_inactive_extensions() ) ) {
186 $modules[] = 'custom-clip-path';
187 }
188 if ( ! in_array( 'equal-height', self::get_inactive_extensions() ) ) {
189 $modules[] = 'equal-height';
190 }
191 if ( ! in_array( 'floating-effects', self::get_inactive_extensions() ) ) {
192 $modules[] = 'floating-effects';
193 }
194 if ( ! in_array( 'gradient-text', self::get_inactive_extensions() ) ) {
195 $modules[] = 'gradient-text';
196 }
197 if ( ! in_array( 'reveal-effects', self::get_inactive_extensions() ) ) {
198 $modules[] = 'reveal-effects';
199 }
200 if ( ! in_array( 'ripples-effect', self::get_inactive_extensions() ) ) {
201 $modules[] = 'ripples-effect';
202 }
203 if ( ! in_array( 'simple-parallax', self::get_inactive_extensions() ) ) {
204 $modules[] = 'simple-parallax';
205 }
206 if ( ! in_array( 'wrapper-link', self::get_inactive_extensions() ) ) {
207 $modules[] = 'wrapper-link';
208 }
209
210 // Fetch all modules data
211 foreach ( $modules as $module ) {
212 $module_info = SKY_ADDONS_MODULES_PATH . $module . '/module.info.php';
213
214 if ( ! file_exists( $module_info ) ) {
215 continue;
216 }
217
218 $this->_modules[ $module ] = require $module_info;
219 }
220
221 $direction_suffix = is_rtl() ? '.rtl' : '';
222
223 // Inside the Elementor editor/preview the Optimizer always enqueues the combined
224 // bundle (sa-scripts/sa-styles), so per-widget handles must alias to it — otherwise
225 // each widget's get_script_depends() pulls its individual sa-{id} file too, loading
226 // it twice and throwing init errors. Force virtual handles in that context.
227 $in_editor = false;
228 if ( class_exists( '\Elementor\Plugin' ) ) {
229 $elementor = \Elementor\Plugin::$instance;
230 $in_editor = ( isset( $elementor->editor ) && $elementor->editor->is_edit_mode() )
231 || ( isset( $elementor->preview ) && $elementor->preview->is_preview_mode() );
232 }
233
234 // Use virtual handles (aliases to sa-styles/sa-scripts) whenever Asset Manager is ON
235 // or we are in the editor/preview.
236 // Optimizer::enqueue_bundle() decides whether to serve Tier 1 (uploads) or Tier 2 (plugin combined).
237 $optimized = $in_editor
238 || ( function_exists( 'sky_addons_is_asset_optimization_enabled' )
239 && sky_addons_is_asset_optimization_enabled() );
240
241 foreach ( $this->_modules as $module_id => $module_data ) {
242
243 if ( ! $this->is_module_active( $module_id ) ) {
244 continue;
245 }
246
247 $class_name = str_replace( '-', ' ', $module_id );
248 $class_name = str_replace( ' ', '', ucwords( $class_name ) );
249 $class_name = __NAMESPACE__ . '\\Modules\\' . $class_name . '\Module';
250
251 $sub_dir = $this->is_extension( $module_id ) ? 'extensions/' : 'modules/';
252
253 if ( $this->has_module_style( $module_id ) ) {
254 if ( $optimized ) {
255 wp_register_style( 'sa-' . $module_id, false, [], SKY_ADDONS_VERSION );
256 } else {
257 wp_register_style( 'sa-' . $module_id, SKY_ADDONS_ASSETS_URL . 'css/' . $sub_dir . 'sa-' . $module_id . $direction_suffix . '.css', [ 'sky-addons-base' ], SKY_ADDONS_VERSION );
258 }
259 }
260
261 if ( $this->has_module_script( $module_id ) ) {
262 if ( $optimized ) {
263 wp_register_script( 'sa-' . $module_id, false, [], SKY_ADDONS_VERSION, true );
264 } else {
265 $script_suffix = defined( 'SCRIPT_DEBUG' ) && SCRIPT_DEBUG ? '' : '.min';
266 wp_register_script( 'sa-' . $module_id, SKY_ADDONS_ASSETS_URL . 'js/' . $sub_dir . 'sa-' . $module_id . $script_suffix . '.js', [ 'jquery', 'elementor-frontend', 'sky-addons-base' ], SKY_ADDONS_VERSION, true );
267 }
268 }
269
270 $class_name::instance();
271 }
272 }
273 }
274
275 // Managers::init();
276