PluginProbe
CSS & JavaScript Toolbox / 8.3.1
CSS & JavaScript Toolbox v8.3.1
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.3.1, 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 = 'cjte-,css-javascript-toolbox-';
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::getText('Extension is required CJT Framework Version higher than currently installed, CJT need to get updated!!!');
291 $extension['incompatibleMessage']['flag'] = cssJSToolbox::getText('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::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!!!');
299 $extension['incompatibleMessage']['flag'] = cssJSToolbox::getText('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::getText('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));