PluginProbe
FluentSnippets – High-Performance Code Snippets, Header & Footer Code, Custom CSS & PHP Code Manager / 9.4
FluentSnippets – High-Performance Code Snippets, Header & Footer Code, Custom CSS & PHP Code Manager v9.4
10.56 1.2.1 10 10.1 10.2 10.3 10.31 10.32 10.33 10.34 10.50 10.51 10.52 10.53 10.55 9.0 9.0.1 9.4 trunk 1.0.0 1.1 1.2
easy-code-manager / framework / extensions / extensions.class.php

extensions.class.php in FluentSnippets – High-Performance Code Snippets, Header & Footer Code, Custom CSS & PHP Code Manager 9.4, at framework/extensions/extensions.class.php

391 lines 11.6 KB
No matching file
Up and down to move Enter to open Esc to close
Raw Download Zip
1 <?php
2 /**
3 *
4 */
5
6 // Disallow direct access.
7 defined('ABSPATH') or die("Access denied");
8
9 /**
10 *
11 */
12 class CJTExtensions extends CJTHookableClass {
13
14 /**
15 *
16 */
17 const CACHE_OPTION_NAME = 'cjt_extensions';
18
19 /**
20 *
21 */
22 const LOAD_METHOD = 'getInvolved';
23
24 /**
25 *
26 */
27 const PREFIXS = 'ecme-,easy-code-manager-';
28
29 /**
30 * put your comment there...
31 *
32 * @var mixed
33 */
34 protected $defDocs;
35
36 /**
37 * put your comment there...
38 *
39 * @var mixed
40 */
41 protected $extensions;
42
43 /**
44 * put your comment there...
45 *
46 * @var mixed
47 */
48 protected $file2Classmap;
49
50 /**
51 * put your comment there...
52 *
53 * @var mixed
54 */
55 protected $incompatibilies;
56
57 /**
58 * put your comment there...
59 *
60 * @var mixed
61 */
62 protected $loadMethod;
63
64 /**
65 * put your comment there...
66 *
67 * @var mixed
68 */
69 protected $onautoload = array('parameters' => array('file', 'class'));
70
71 /**
72 * put your comment there...
73 *
74 * @var mixed
75 */
76 protected $onbindevent = array('parameters' => array('event', 'callback'));
77
78 /**
79 * put your comment there...
80 *
81 * @var mixed
82 */
83 protected $ondetectextension = array('parameters' => array('extension'));
84
85 /**
86 * put your comment there...
87 *
88 * @var mixed
89 */
90 protected $ongetactiveplugins = array('parameters' => array('plugins'));
91
92 /**
93 * put your comment there...
94 *
95 * @var mixed
96 */
97 protected $onload = array('parameters' => array('params'));
98
99 /**
100 * put your comment there...
101 *
102 * @var mixed
103 */
104 protected $onloadcallback = array('parameters' => array('callback'));
105
106 /**
107 * put your comment there...
108 *
109 * @var mixed
110 */
111 protected $onloaddefinition = array('parameters' => array('definition'));
112
113 /***
114 * put your comment there...
115 *
116 * @var mixed
117 */
118 protected $ontregisterautoload = array('parameters' => array('callback'));
119
120 /**
121 * put your comment there...
122 *
123 * @var mixed
124 */
125 protected $onreloadcacheparameters = array('parameters' => array('params'));
126
127 /**
128 * put your comment there...
129 *
130 * @var mixed
131 */
132 protected $onloaded = array(
133 'hookType' => CJTWordpressEvents::HOOK_ACTION,
134 'parameters' => array('class', 'extension', 'definition', 'result')
135 );
136
137 /**
138 * put your comment there...
139 *
140 * @var mixed
141 */
142 protected $prefix;
143
144 /**
145 * put your comment there...
146 *
147 * @param mixed $className
148 */
149 public function __autoload($className) {
150 // Load only classed defined on the list!
151 if (isset($this->extensions[$className])) {
152 $classFile = $this->onautoload($this->extensions[$className]['runtime']['classFile'], $className);
153 // Import class file!
154 require_once $classFile;
155 }
156 }
157
158 /**
159 * put your comment there...
160 *
161 * @param mixed $prefix
162 * @param mixed $loadMethod
163 * @return CJTExtensions
164 */
165 public function __construct($prefix = self::PREFIXS, $loadMethod = self::LOAD_METHOD) {
166 // Hookable!
167 parent::__construct();
168 // Initializing!
169 $this->prefix = explode( ',', $prefix );
170 $this->loadMethod = $loadMethod;
171 }
172
173 /**
174 * put your comment there...
175 *
176 */
177 public function __destruct() {
178 spl_autoload_unregister(array($this, '__autoload'));
179 }
180
181 /**
182 * put your comment there...
183 *
184 * @param mixed $reload
185 * @return CJTExtensions
186 */
187 public function & getExtensions($reload = false) {
188 // Get cached extensions or cache then if not yest cached!
189 extract($this->onreloadcacheparameters(compact('reload')));
190 if ($reload || (!($extensions = $this->extensions) && !($extensions = get_option(self::CACHE_OPTION_NAME, array())))) {
191 //Resting!
192 $this->file2Classmap = array();
193 $extensions = array();
194 # Get all active plugins
195 $activePlugins = wp_get_active_and_valid_plugins();
196 # Get Network plugins
197 if (is_multisite()) {
198 $activePlugins = array_merge(wp_get_active_network_plugins(), $activePlugins);
199 }
200 // filter all installed Plugins to fetch all out Extensions!
201 $activePlugins = $this->ongetactiveplugins($activePlugins);
202 foreach ($activePlugins as $file) {
203 $pluginDir = dirname($file);
204 $pluginName = basename($pluginDir);
205 // Any plugin with our prefix is a CJT extension!
206 if ( ( strpos( $pluginName, $this->prefix[0] ) === 0 ) ||
207 ( strpos( $pluginName, $this->prefix[1] ) === 0 ) ) {
208 // CJT Extsnsion must has the definition XML file!
209 // First try for Edition-Specific file
210 // if not exists try the generic one.
211 $xmlFile = "{$pluginDir}/{$pluginName}.xml";
212 if (file_exists($xmlFile)) {
213 // Get Plugin primary data!
214 $extension = array();
215 $extension['pluginFile'] = $file;
216 $extension['file'] = basename($file);
217 $extension['defFile'] = basename($pluginDir) . DIRECTORY_SEPARATOR . basename($xmlFile);
218 // Its useful to use ABS path only at runtime as it might changed as host might get moved.
219 $extension['dir'] = basename($pluginDir);
220 $extension['name'] = $pluginName;
221 // Cache XML file.
222 $extension['definition']['raw'] = file_get_contents($xmlFile);
223 // Filer!
224 $extension = $this->ondetectextension($extension);
225 // Read Basic XML Definition!
226 $definitionXML = $this->onloaddefinition(new SimpleXMLElement($extension['definition']['raw']));
227 $attrs = $definitionXML->attributes();
228 $extension['defDoc'] = $definitionXML;
229 $extension['definition']['primary']['loadMethod'] = (string) $attrs->loadMethod;
230 $extension['definition']['primary']['requiredLicense'] = (string) $definitionXML->license;
231 $className = ((string) $attrs->class);
232 // Add to list!
233 $extensions[$className] = $extension;
234 // Map Plugin FILE-2-CLASS name!
235 $this->file2Classmap["{$extension['dir']}/{$extension['file']}"] = $className;
236 }
237 }
238 }
239 }
240 $this->extensions = $this->onload($extensions);
241 // Chaining
242 return $this->extensions;
243 }
244
245 /**
246 * put your comment there...
247 *
248 */
249 public function load() {
250 // Initialize.
251 $frameworkVersion = new CJT_Framework_Version_Version(CJTPlugin::FW_Version);
252 // Auto load CJT extensions files when requested.
253 spl_autoload_register($this->ontregisterautoload(array($this, '__autoload')));
254 // Load all CJT extensions!
255 foreach ($this->getExtensions() as $class => $extension) {
256 // Filters!
257 extract($this->onload($extension, compact('class', 'extension')));
258 // Build Extension plugin path
259 $pluginPath = ABSPATH . PLUGINDIR . "/{$extension['name']}";
260 // Set runtime variables.
261 $this->extensions[$class]['runtime']['classFile'] = "{$pluginPath}/{$extension['name']}.class.php";
262 // Load definition.
263 $definitionXML = $extension['defDoc'];
264 // Extensions below version 1.0 use static classes
265 // while version 1.0 and up use objects
266 if (((string) $definitionXML->attributes()->version) == '1.0') {
267 // Instantiate extension object
268 $extensionObject = new $class($extension);
269 // Hold extension object
270 $extension['exObject'] = $extensionObject;
271 // Obejct callback
272 $callback = array($extensionObject, $this->loadMethod);
273 }
274 else {
275 # Static callback
276 $callback = array($class, $this->loadMethod);
277 }
278 // Callback filter
279 $callback = $this->onloadcallback($callback);
280 // If auto load is speicifd then import class file and bind events.
281 if ($extension['definition']['primary']['loadMethod'] == 'auto') {
282 // If frameworkVersion is not provided assume its 0 (Older version)
283 // before frameworkversion chech even supported.
284 // otherwise compare it with current frameworkversion
285 // If the version MAJOR is different current
286 // then its incompatible.
287 $extensionVer = new CJT_Framework_Version_Version((int) ((string) $definitionXML->attributes()->requireFrameworkVersion));
288 if ($frameworkVersion->getMajor() < $extensionVer->getMajor()) {
289 // Detects which requird updates CJT or the Extension itself.
290 $extension['incompatibleMessage']['msg'] = cssJSToolbox::__('Extension is required CJT Framework Version higher than currently installed, CJT need to get updated!!!');
291 $extension['incompatibleMessage']['flag'] = cssJSToolbox::__('Aborted');
292 // Add to incomaptibility list.
293 $this->incompatibilies[$pluginPath] = $extension;
294 }
295 else {
296 # Detect extensions required old Framework
297 if ($frameworkVersion->getMajor() > $extensionVer->getMajor()) {
298 $extension['incompatibleMessage']['msg'] = cssJSToolbox::__('Extension is required old CJT Framework Version than the installed. This extension might need to get update. Please check if this extension is currently behaving correctly!!!');
299 $extension['incompatibleMessage']['flag'] = cssJSToolbox::__('Ignored');
300 // Add to incomaptibility list.
301 $this->incompatibilies[$pluginPath] = $extension;
302 }
303 // Bind events for compatible extensions.
304 foreach ($definitionXML->getInvolved->event as $event) {
305 // filter!
306 extract($this->onbindevent(compact('event', 'callback')));
307 // Bind!
308 CJTPlugin::on((string) $event->attributes()->type, $callback);
309 }
310 }
311 }
312 else { // If manual load specified just
313 if (class_exists($class)) { // Make sure the class is loaded!
314 $this->onloaded($class, $extension, $definitionXML, call_user_func($callback));
315 }
316 }
317 }
318 if (!empty($this->incompatibilies)) {
319 // Hook for processing incomaptible extensions.
320 add_action('admin_notices', array(& $this, 'processIncompatibles'));
321 }
322 }
323
324 /**
325 * put your comment there...
326 *
327 * @param mixed $pluginName
328 */
329 public function & getDefDoc($pluginName) {
330 # Find if cached or create it
331 if (!isset($this->defDocs[$pluginName])) {
332 // Add CJT Def doc to def docs list
333 $pluginXMLFile = WP_PLUGIN_DIR . DIRECTORY_SEPARATOR . $pluginName . DIRECTORY_SEPARATOR . "{$pluginName}.xml";
334 // Extension might removed while its license key still in the database
335 // Make sure the extension still exists
336 if (file_exists($pluginXMLFile)) {
337 $this->defDocs[$pluginName] = new SimpleXMLElement(file_get_contents($pluginXMLFile));
338 }
339 else {
340 # Return null when extension is absent!
341 $this->defDocs[$pluginName] = null;
342 }
343 }
344 return $this->defDocs[$pluginName];
345 }
346
347 /**
348 * put your comment there...
349 *
350 */
351 public function & getFiles2ClassesMap() {
352 return $this->file2Classmap;
353 }
354
355 /**
356 * put your comment there...
357 *
358 * @TODO: REMOVE HTML-MARKUP. CJT PLUGIN NEVER WRITE MARKUP IMIXED WITH HTML. ITS VERY BAD PROGRAMMING PRACTICE. THIS WILL BE REMOVED NEXT TIME AS WE IN RUSH!!!
359 */
360 public function processIncompatibles() {
361 // Proces only if in CJT page.
362 if (!preg_match('/\/plugins\.php|page\=cjtoolbox/', $_SERVER['REQUEST_URI'])) {
363 return;
364 }
365 // INitialize.
366 $message = cssJSToolbox::__('CJT detects incompatible installed extensions, listed below with status message for every extension:');
367 $list = '';
368 // For every compatible extension add
369 // an list item with details
370 // if there is an update available or provide
371 // a direct link to CJT website if no upgrade is available.
372 // Upgrade wont be available in case no license key is activated!
373 foreach ($this->incompatibilies as $class => $extension) {
374 // Show details.
375 $pluginInfo = get_plugin_data($extension['pluginFile']);
376 // List item Markup
377 $list .= "<li><a target='_blank' href='{$pluginInfo['PluginURI']}'>{$pluginInfo['Name']}</a> (Status: {$extension['incompatibleMessage']['flag']}, Message: {$extension['incompatibleMessage']['msg']})</li>\n";
378 }
379 // Output full message.
380 // TODO: BAD PRACTICE1!!!!! NEVER MIX HTML WITH PHP, JUST TEMPORARY1!!!
381 echo "<div class='cjt-incomaptible-extensions-notice updated' style='font-size:14px;font-weight:bold;padding-top:11px'>
382 <span>{$message}</span>
383 <ul style='list-style-type: circle;padding-left: 27px;font-size: 12px;'>{$list}</ul>
384 </div>";
385 }
386
387 } // End class.
388
389
390 // Hookable!
391 CJTExtensions::define('CJTExtensions', array('hookType' => CJTWordpressEvents::HOOK_FILTER));