state = false;
}
public static function exist($id){
foreach(self::getAll() as $plugin)
if($plugin->id==$id) return true;
return false;
}
public static function addHook($hookName, $functionName){
$GLOBALS['hooks'][$hookName][] = $functionName;
}
public static function callHook($hookName, $hookArguments = array()) {
if(!isset($GLOBALS['hooks'][$hookName])) return;
foreach($GLOBALS['hooks'][$hookName] as $functionName)
call_user_func_array($functionName, $hookArguments);
}
public static function includeAll(){
foreach(self::getAll() as $plugin):
if(!$plugin->state) continue;
$main = $plugin->path().SLASH.$plugin->folder.'.plugin.php';
if(file_exists($main))
require_once($main);
endforeach;
}
public static function getAll(){
$enabled = self::states();
$plugins = array();
foreach(glob(__ROOT__.PLUGIN_PATH.'*'.SLASH.'app.json') as $file)
$plugins[] = self::parseManifest($file);
usort($plugins, function($a, $b){
if ($a->name == $b->name)
$result = 0;
if($a->name < $b->name){
$result = -1;
} else{
$result = 1;
}
return $result;
});
return $plugins;
}
public static function getById($id){
$plugin = false;
foreach(self::getAll() as $onePlugin)
if($onePlugin->id==$id) $plugin = $onePlugin;
return $plugin;
}
public static function parseManifest($file){
$enabled = self::states();
$plugin = new self();
$manifest = json_decode(file_get_contents($file),true);
if(!$manifest) return $plugin;
if(!isset($manifest['id']) || !isset($manifest['name']) ) continue;
$plugin->name = $manifest['name'];
$plugin->id = $manifest['id'];
$plugin->folder = basename(dirname($file));
if(in_array($plugin->id,$enabled)) $plugin->state = true;
if(isset($manifest['author'])) $plugin->author = $manifest['author'];
if(isset($manifest['url'])) $plugin->url = $manifest['url'];
if(isset($manifest['licence'])) $plugin->licence = $manifest['licence'];
if(isset($manifest['description'])) $plugin->description = $manifest['description'];
if(isset($manifest['version'])) $plugin->version = $manifest['version'];
if(isset($manifest['core'])) $plugin->core = $manifest['core'];
if(isset($manifest['require'])) $plugin->require = $manifest['require'];
return $plugin;
}
public static function state($id,$state){
$enabled = self::states();
$plugin = self::getById($id);
$main = $plugin->path().SLASH.$plugin->folder.'.plugin.php';
if(file_exists($main))
require_once($main);
if($state==0){
$key = array_search($plugin->id, $enabled);
if($key !== false)
unset($enabled[$key]);
plugin::callHook('uninstall',array($plugin->id));
}else{
if(!in_array($plugin->id,$enabled))
$enabled[] = $plugin->id;
plugin::callHook('install',array($plugin->id));
}
self::states($enabled);
}
public static function states($states = false){
$enabledFile = __ROOT__.PLUGIN_PATH.'enabled.json';
if(!file_exists($enabledFile)) touch($enabledFile);
if(!is_array($states)){
$enabled = json_decode(file_get_contents($enabledFile),true);
return !is_array($enabled)?array():$enabled;
}
file_put_contents($enabledFile,json_encode($states));
}
public function path(){
return __ROOT__.PLUGIN_PATH.$this->folder;
}
public static function url(){
$bt = debug_backtrace();
return ROOT_URL.SLASH.PLUGIN_PATH.basename(dirname($bt[0]['file']));
}
public static function addCss($css) {
$bt = debug_backtrace();
$GLOBALS['hooks']['css_files'][] = str_replace(__ROOT__,'',dirname($bt[0]['file'])).$css;
}
public static function callCss(){
if(!isset($GLOBALS['hooks']['css_files'])) return '';
$stream = '';
foreach($GLOBALS['hooks']['css_files'] as $css_file)
$stream .=''."\n";
return $stream;
}
public static function addJs($js){
global $_;
$bt = debug_backtrace();
$GLOBALS['hooks']['js_files'][] = str_replace(__ROOT__,'',dirname($bt[0]['file'])).$js;
}
public static function callJs(){
if(!isset($GLOBALS['hooks']['js_files'])) return '';
$stream = '';
foreach($GLOBALS['hooks']['js_files'] as $js_file)
$stream .=''."\n";
return $stream;
}
}
?>