state = false;
}
public function toArray(){
return array(
'id' => $this->id,
'name' => $this->name,
'author' => $this->author,
'link' => $this->link,
'licence' => $this->licence,
'folder' => $this->folder,
'description' => $this->description,
'version' => $this->version,
'state' => $this->state,
'type' => $this->type,
'require' => $this->require,
'firms' => $this->firms,
'color' => $this->color,
'icon' => $this->icon
);
}
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(){
global $myFirm;
$validFirm = is_object($myFirm) && is_numeric($myFirm->id) && $myFirm->id!=-1;
foreach(self::getAll() as $plugin) {
if(!$plugin->state) continue;
if($validFirm && !in_array($myFirm->id, $plugin->firms)) continue;
$main = $plugin->path().SLASH.$plugin->folder.'.plugin.php';
if(file_exists($main)) require_once($main);
}
}
public static function getAll($enableOnly = false,$includeCore = false){
$plugins = array();
foreach(glob(__ROOT__.PLUGIN_PATH.'*'.SLASH.'app.json') as $file){
$plugin = self::parseManifest($file);
if($enableOnly && !$plugin->state) continue;
$plugins[] = $plugin;
}
if($includeCore) $plugins[] = self::parseManifest('.');
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){
//si on cible le coeur
if($file=='.' || basename(dirname($file)) == 'class'){
$plugin = new Plugin();
$plugin->name = 'Coeur logiciel';
$plugin->id = 'fr.core.core';
$plugin->folder = '.';
$plugin->state = true;
$plugin->firms = array(0);
$plugin->require = array();
$plugin->author = 'god';
$plugin->url = '';
$plugin->licence = 'copyright';
$plugin->description = 'Coeur de l\'application';
$plugin->version = '1.0.0';
$plugin->core = true;
$plugin->color ='#222222';
$plugin->icon = 'fas fa-bullseye';
//si c'est un plugin classique
}else{
$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']) ) return;
$plugin->name = $manifest['name'];
$plugin->id = $manifest['id'];
$plugin->folder = basename(dirname($file));
if(isset($enabled[$plugin->id])){
$plugin->state = true;
$plugin->firms = $enabled[$plugin->id];
}
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['color'])) $plugin->color = $manifest['color'];
if(isset($manifest['icon'])) $plugin->icon = $manifest['icon'];
if(isset($manifest['require'])) $plugin->require = isset($manifest['require'])? $manifest['require']: array();
}
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){
unset($enabled[$plugin->id]);
Plugin::callHook('uninstall',array($plugin->id));
} else {
if(!isset($enabled[$plugin->id]))
$enabled[$plugin->id] = array();
Plugin::callHook('install',array($plugin->id));
}
self::states($enabled);
}
public static function states($states = false){
$enabledFile = File::core().SLASH.'plugin.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 static function is_active($id){
$enabled = self::states();
return isset($enabled[$id]);
}
public function path(){
if($this->folder=='.') return __ROOT__.SLASH.'class';
return __ROOT__.PLUGIN_PATH.$this->folder;
}
public static function folder($path){
return str_replace(__ROOT__,'',$path).SLASH;
}
public static function url(){
$bt = debug_backtrace();
return ROOT_URL.'/'.str_replace(SLASH, '/', PLUGIN_PATH).basename(dirname($bt[0]['file']));
}
public static function addCss($css,$options = array('forcePath'=>false)) {
if(!$options['forcePath']){
$bt = debug_backtrace();
if(substr($css, 0,4) != 'http') $css = str_replace(array(__ROOT__,'\\'),array('','/'),dirname($bt[0]['file'])).$css;
}
$GLOBALS['hooks']['css_files'][] = $css;
}
public static function callCss($root = null,$cacheVersion = ''){
if(!isset($GLOBALS['hooks']['css_files'])) return '';
$stream = '';
foreach($GLOBALS['hooks']['css_files'] as $css_file){
$url = $css_file;
if(isset($root) && substr($css_file,0, 4) != 'http') $url = $root.'/'.$url;
$stream .=''."\n";
}
return $stream;
}
public static function addJs($js){
global $_;
$bt = debug_backtrace();
if(substr($js, 0,4) != 'http') $js = str_replace(array(__ROOT__,'\\'),array('','/'),dirname($bt[0]['file'])).$js;
$GLOBALS['hooks']['js_files'][] = $js;
}
public static function callJs($root = null,$cacheVersion = ''){
if(!isset($GLOBALS['hooks']['js_files'])) return '';
$stream = '';
foreach($GLOBALS['hooks']['js_files'] as $js_file){
$url = $js_file;
if(isset($root) && substr($js_file,0, 4) != 'http') $url = $root.'/'.$url;
$stream .=''."\n";
}
return $stream;
}
/*
* Aide à l'inclusion de classes de plugin, ex:
* require_once('..'.SLASH.'plugin'.SLASH.'issue'.SLASH.'Event.class.php');
* devient :
* Plugin::need('issue/Event');
* Il est possible de faires des inclusions mulitples, ex :
* Plugin::need('issue/Event, client/Client, client/ClientContact');
*/
public static function need($selectors){
foreach(explode(',',$selectors) as $selector){
list($plugin,$class) = explode('/',trim($selector));
require_once(__ROOT__.PLUGIN_PATH.$plugin.SLASH.$class.'.class.php');
}
}
}