PluginProbe
CSS & JavaScript Toolbox / 7.2
CSS & JavaScript Toolbox v7.2
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 7.2, at framework/extensions/extensions.class.php

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