PluginProbe
CSS & JavaScript Toolbox / 8.0.3
CSS & JavaScript Toolbox v8.0.3
trunk 0.3 0.8 10 10.1 11 11.2 11.3 11.4 11.5 11.6 11.7 11.8 11.9 11.9.1 12 12.0 12.0.1 12.0.3 12.0.4 12.0.5 12.0.6 12.0.7 6.0 6.0.11 All 60 releases
css-javascript-toolbox / framework / extensions / extensions.class.php

extensions.class.php in CSS & JavaScript Toolbox 8.0.3, at framework/extensions/extensions.class.php

390 lines 11.5 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 PREFIX = 'cjte-';
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::PREFIX, $loadMethod = self::LOAD_METHOD) {
166 // Hookable!
167 parent::__construct();
168 // Initializing!
169 $this->prefix = $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) {
207 // CJT Extsnsion must has the definition XML file!
208 // First try for Edition-Specific file
209 // if not exists try the generic one.
210 $xmlFile = "{$pluginDir}/{$pluginName}.xml";
211 if (file_exists($xmlFile)) {
212 // Get Plugin primary data!
213 $extension = array();
214 $extension['pluginFile'] = $file;
215 $extension['file'] = basename($file);
216 $extension['defFile'] = basename($pluginDir) . DIRECTORY_SEPARATOR . basename($xmlFile);
217 // Its useful to use ABS path only at runtime as it might changed as host might get moved.
218 $extension['dir'] = basename($pluginDir);
219 $extension['name'] = $pluginName;
220 // Cache XML file.
221 $extension['definition']['raw'] = file_get_contents($xmlFile);
222 // Filer!
223 $extension = $this->ondetectextension($extension);
224 // Read Basic XML Definition!
225 $definitionXML = $this->onloaddefinition(new SimpleXMLElement($extension['definition']['raw']));
226 $attrs = $definitionXML->attributes();
227 $extension['defDoc'] = $definitionXML;
228 $extension['definition']['primary']['loadMethod'] = (string) $attrs->loadMethod;
229 $extension['definition']['primary']['requiredLicense'] = (string) $definitionXML->license;
230 $className = ((string) $attrs->class);
231 // Add to list!
232 $extensions[$className] = $extension;
233 // Map Plugin FILE-2-CLASS name!
234 $this->file2Classmap["{$extension['dir']}/{$extension['file']}"] = $className;
235 }
236 }
237 }
238 }
239 $this->extensions = $this->onload($extensions);
240 // Chaining
241 return $this->extensions;
242 }
243
244 /**
245 * put your comment there...
246 *
247 */
248 public function load() {
249 // Initialize.
250 $frameworkVersion = new CJT_Framework_Version_Version(CJTPlugin::FW_Version);
251 // Auto load CJT extensions files when requested.
252 spl_autoload_register($this->ontregisterautoload(array($this, '__autoload')));
253 // Load all CJT extensions!
254 foreach ($this->getExtensions() as $class => $extension) {
255 // Filters!
256 extract($this->onload($extension, compact('class', 'extension')));
257 // Build Extension plugin path
258 $pluginPath = ABSPATH . PLUGINDIR . "/{$extension['name']}";
259 // Set runtime variables.
260 $this->extensions[$class]['runtime']['classFile'] = "{$pluginPath}/{$extension['name']}.class.php";
261 // Load definition.
262 $definitionXML = $extension['defDoc'];
263 // Extensions below version 1.0 use static classes
264 // while version 1.0 and up use objects
265 if (((string) $definitionXML->attributes()->version) == '1.0') {
266 // Instantiate extension object
267 $extensionObject = new $class($extension);
268 // Hold extension object
269 $extension['exObject'] = $extensionObject;
270 // Obejct callback
271 $callback = array($extensionObject, $this->loadMethod);
272 }
273 else {
274 # Static callback
275 $callback = array($class, $this->loadMethod);
276 }
277 // Callback filter
278 $callback = $this->onloadcallback($callback);
279 // If auto load is speicifd then import class file and bind events.
280 if ($extension['definition']['primary']['loadMethod'] == 'auto') {
281 // If frameworkVersion is not provided assume its 0 (Older version)
282 // before frameworkversion chech even supported.
283 // otherwise compare it with current frameworkversion
284 // If the version MAJOR is different current
285 // then its incompatible.
286 $extensionVer = new CJT_Framework_Version_Version((int) ((string) $definitionXML->attributes()->requireFrameworkVersion));
287 if ($frameworkVersion->getMajor() < $extensionVer->getMajor()) {
288 // Detects which requird updates CJT or the Extension itself.
289 $extension['incompatibleMessage']['msg'] = cssJSToolbox::getText('Extension is required CJT Framework Version higher than currently installed, CJT need to get updated!!!');
290 $extension['incompatibleMessage']['flag'] = cssJSToolbox::getText('Aborted');
291 // Add to incomaptibility list.
292 $this->incompatibilies[$pluginPath] = $extension;
293 }
294 else {
295 # Detect extensions required old Framework
296 if ($frameworkVersion->getMajor() > $extensionVer->getMajor()) {
297 $extension['incompatibleMessage']['msg'] = cssJSToolbox::getText('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!!!');
298 $extension['incompatibleMessage']['flag'] = cssJSToolbox::getText('Ignored');
299 // Add to incomaptibility list.
300 $this->incompatibilies[$pluginPath] = $extension;
301 }
302 // Bind events for compatible extensions.
303 foreach ($definitionXML->getInvolved->event as $event) {
304 // filter!
305 extract($this->onbindevent(compact('event', 'callback')));
306 // Bind!
307 CJTPlugin::on((string) $event->attributes()->type, $callback);
308 }
309 }
310 }
311 else { // If manual load specified just
312 if (class_exists($class)) { // Make sure the class is loaded!
313 $this->onloaded($class, $extension, $definitionXML, call_user_func($callback));
314 }
315 }
316 }
317 if (!empty($this->incompatibilies)) {
318 // Hook for processing incomaptible extensions.
319 add_action('admin_notices', array(& $this, 'processIncompatibles'));
320 }
321 }
322
323 /**
324 * put your comment there...
325 *
326 * @param mixed $pluginName
327 */
328 public function & getDefDoc($pluginName) {
329 # Find if cached or create it
330 if (!isset($this->defDocs[$pluginName])) {
331 // Add CJT Def doc to def docs list
332 $pluginXMLFile = WP_PLUGIN_DIR . DIRECTORY_SEPARATOR . $pluginName . DIRECTORY_SEPARATOR . "{$pluginName}.xml";
333 // Extension might removed while its license key still in the database
334 // Make sure the extension still exists
335 if (file_exists($pluginXMLFile)) {
336 $this->defDocs[$pluginName] = new SimpleXMLElement(file_get_contents($pluginXMLFile));
337 }
338 else {
339 # Return null when extension is absent!
340 $this->defDocs[$pluginName] = null;
341 }
342 }
343 return $this->defDocs[$pluginName];
344 }
345
346 /**
347 * put your comment there...
348 *
349 */
350 public function & getFiles2ClassesMap() {
351 return $this->file2Classmap;
352 }
353
354 /**
355 * put your comment there...
356 *
357 * @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!!!
358 */
359 public function processIncompatibles() {
360 // Proces only if in CJT page.
361 if (!preg_match('/\/plugins\.php|page\=cjtoolbox/', $_SERVER['REQUEST_URI'])) {
362 return;
363 }
364 // INitialize.
365 $message = cssJSToolbox::getText('CJT detects incompatible installed extensions, listed below with status message for every extension:');
366 $list = '';
367 // For every compatible extension add
368 // an list item with details
369 // if there is an update available or provide
370 // a direct link to CJT website if no upgrade is available.
371 // Upgrade wont be available in case no license key is activated!
372 foreach ($this->incompatibilies as $class => $extension) {
373 // Show details.
374 $pluginInfo = get_plugin_data($extension['pluginFile']);
375 // List item Markup
376 $list .= "<li><a target='_blank' href='{$pluginInfo['PluginURI']}'>{$pluginInfo['Name']}</a> (Status: {$extension['incompatibleMessage']['flag']}, Message: {$extension['incompatibleMessage']['msg']})</li>\n";
377 }
378 // Output full message.
379 // TODO: BAD PRACTICE1!!!!! NEVER MIX HTML WITH PHP, JUST TEMPORARY1!!!
380 echo "<div class='cjt-incomaptible-extensions-notice updated' style='font-size:14px;font-weight:bold;padding-top:11px'>
381 <span>{$message}</span>
382 <ul style='list-style-type: circle;padding-left: 27px;font-size: 12px;'>{$list}</ul>
383 </div>";
384 }
385
386 } // End class.
387
388
389 // Hookable!
390 CJTExtensions::define('CJTExtensions', array('hookType' => CJTWordpressEvents::HOOK_FILTER));