css_admin[] = self::$current['code_folder_part'].'/'.ltrim($file,'/');
return self::$current['code_folder_part'].'/'.ltrim($file,'/');
}
//less file
$ext = \gp\tool::Ext($file);
if( $ext === 'less' || $ext === 'scss' ){
$full_path = self::$current['code_folder_full'].'/'.ltrim($file,'/');
$path = \gp\tool\Output\Css::Cache($full_path,$ext);
}else{
$path = self::$current['code_folder_part'].'/'.ltrim($file,'/');
}
if( $path !== false ){
$page->head .= "\n".'';
}
return $path;
}
/**
* Add a js file to the page
* @since 4.0
* @param string $file The path of the js file relative to the addon folder
* @param bool $combine Set to false to keep the file from being combined with other js files
*/
public static function js($file, $combine = true ){
global $page;
$file = \gp\tool::WinPath( $file );
if( $combine ){
$page->head_js[] = self::$current['code_folder_part'].'/'.ltrim($file,'/');
}else{
$url = self::$current['code_folder_rel'].'/'.ltrim($file,'/');
$page->head .= "\n".'';
}
}
public static function GetDir($path='',$ampersands = false){
$path = self::$current['code_folder_part'].'/'.ltrim($path,'/');
return \gp\tool::GetDir($path, $ampersands);
}
/**
* Similar to php's register_shutdown_function()
* Will keep track of the active plugin and make sure global path variables are set properly before callting $function
* Example: \gp\tool\Plugins::RegisterShutdown(array('class_name','method_name')); or \gp\tool\Plugins::RegisterShutdown(array('class_name','method_name'),'argument1'....);
*
*/
public static function RegisterShutdown(){
global $addonFolderName;
if( gp_safe_mode ) return;
$args = func_get_args();
register_shutdown_function(array('\\gp\\tool\\Plugins','ShutdownFunction'),$addonFolderName,$args);
}
/**
* Handle functions passed to \gp\tool\Plugins::RegisterShutdown()
* This function should not be called directly.
*/
public static function ShutdownFunction($addonFolderName,$args){
if( gp_safe_mode ) return;
if( !is_array($args) || count($args) < 1 ){
return false;
}
self::SetDataFolder($addonFolderName);
$function = array_shift($args);
if( count($args) > 0 ){
call_user_func_array( $function , $args );
}else{
call_user_func( $function );
}
self::ClearDataFolder();
}
/**
* Similar to wordpress apply_filters_ref_array()
*
*/
public static function Filter($hook, $args = array() ){
global $gp_hooks;
if( !self::HasHook($hook) ){
if( isset($args[0]) ){
return $args[0];
}
return false;
}
foreach($gp_hooks[$hook] as $hook_info){
$args[0] = self::ExecHook($hook,$hook_info,$args);
}
if( isset($args[0]) ){
return $args[0];
}
return false;
}
public static function OneFilter( $hook, $args=array(), $addon = false ){
global $gp_hooks;
if( !self::HasHook($hook) ){
return false;
}
if( $addon === false ){
$hook_info = end($gp_hooks[$hook]);
return self::ExecHook($hook,$hook_info,$args);
}
foreach($gp_hooks[$hook] as $addon_key => $hook_info){
if( $addon_key === $addon ){
return self::ExecHook($hook,$hook_info,$args);
}
}
return false;
}
public static function Action($hook, $args = array() ){
global $gp_hooks;
if( !self::HasHook($hook) ){
return;
}
foreach($gp_hooks[$hook] as $hook_info){
self::ExecHook($hook,$hook_info,$args);
}
}
/**
* Check to see if there area any hooks matching $hook
* @param string $hook The name of the hook
* @return bool
*
*/
public static function HasHook($hook){
global $gp_hooks;
if( empty($gp_hooks) || empty($gp_hooks[$hook]) ){
return false;
}
return true;
}
public static function ArgReturn($args){
if( is_array($args) && isset($args[0]) ){
return $args[0];
}
}
/**
* Execute the php code associated with a $hook
* @param string $hook
* @param array $hook_info
* @param array $args
*
*/
public static function ExecHook($hook,$info,$args = array()){
global $dataDir, $gp_current_hook;
if( gp_safe_mode ){
if( isset($args[0]) ){
return $args[0];
}
return;
}
if( !is_array($args) ){
$args = array($args);
}
$gp_current_hook[] = $hook;
//value
if( !empty($info['value']) ){
$args[0] = $info['value'];
}
$args = \gp\tool\Output::ExecInfo($info,$args);
array_pop( $gp_current_hook );
if( isset($args[0]) ){
return $args[0];
}
return false;
}
/**
* Set global path variables for the current addon
* @param string $addon_key Key used to identify a plugin uniquely in the configuration
*
*/
public static function SetDataFolder($addon_key){
global $dataDir, $config;
global $addonDataFolder,$addonCodeFolder; //deprecated
global $addonRelativeCode,$addonRelativeData,$addonPathData,$addonPathCode,$addonFolderName,$addon_current_id,$addon_current_version;
if( !isset($config['addons'][$addon_key]) ){
return;
}
self::StackPush();
self::$current = self::GetAddonConfig($addon_key);
$addonFolderName = $addon_key;
$addon_current_id = self::$current['id'];
$addon_current_version = self::$current['version'];
$addonPathCode = $addonCodeFolder = self::$current['code_folder_full'];
$addonPathData = $addonDataFolder = self::$current['data_folder_full'];
$addonRelativeCode = self::$current['code_folder_rel'];
$addonRelativeData = self::$current['data_folder_rel'];
}
/**
* Return settings of addon defined by $addon_key
*
*/
public static function GetAddonConfig($addon_key){
global $config, $dataDir;
if( !array_key_exists($addon_key,$config['addons']) ){
return false;
}
$addon_config = $config['addons'][$addon_key];
if( !is_array($addon_config) ){
trigger_error('Corrupted configuration for addon: '.$addon_key); //.pre($config['addons']));
return false;
}
$addon_config += array( 'version'=>false, 'id'=>false, 'data_folder'=>$addon_key, 'order'=>false, 'code_folder_part'=>'/data/_addoncode/'.$addon_key,'name'=>$addon_key );
//data folder
$addon_config['data_folder_part'] = '/data/_addondata/'.$addon_config['data_folder'];
$addon_config['data_folder_full'] = $dataDir.$addon_config['data_folder_part'];
$addon_config['data_folder_rel'] = \gp\tool::GetDir($addon_config['data_folder_part']);
// Code folder
//$addon_config['code_folder_part'] = $addon_config['code_folder'].'/'.$addon_key;
$addon_config['code_folder_full'] = $dataDir.$addon_config['code_folder_part'];
$addon_config['code_folder_rel'] = \gp\tool::GetDir($addon_config['code_folder_part']);
return $addon_config;
}
/**
* If there's a current addon folder or addon id, push it onto the stack
*
*/
public static function StackPush(){
global $addonFolderName, $addon_current_id;
if( !$addon_current_id && !$addonFolderName ){
return;
}
self::$stack[] = array('folder'=>$addonFolderName,'id'=>$addon_current_id);
}
/**
* Reset global path variables
*/
public static function ClearDataFolder(){
global $addonDataFolder,$addonCodeFolder; //deprecated
global $addonRelativeCode,$addonRelativeData,$addonPathData,$addonPathCode,$addonFolderName,$addon_current_id,$addon_current_version;
self::$current = array();
$addonFolderName = false;
$addonDataFolder = false;
$addonCodeFolder = false;
$addonRelativeCode = $addonRelativeData = $addonPathData = $addonPathCode = $addon_current_id = $addon_current_version = false;
//Make the most recent addon folder or addon id in the stack the current addon
if( count(self::$stack) > 0 ){
$info = array_pop(self::$stack);
if( $info['folder'] ){
self::SetDataFolder($info['folder']);
}elseif( $info['id'] ){
$addon_current_id = $info['id'];
}
}
}
/**
* Get the addon_key of an addon by it's id
* @static
* @param int $addon_id
* @return mixed Returns addon_key string if found, false otherwise
*
*/
public static function AddonFromId($addon_id){
global $config;
if( empty($config['addons']) ){
return false;
}
foreach($config['addons'] as $addon_key => $addon_info){
if( isset($addon_info['id']) && $addon_info['id'] == $addon_id ){
return $addon_key;
}
}
return false;
}
/**
* Get plugin configuration values
* @since 3.6
*
*/
public static function GetConfig(){
$file = self::$current['data_folder_full'].'/_config.php';
return \gp\tool\Files::Get($file,'config');
}
/**
* Get plugin configuration values
* @since 3.6
*
*/
function SaveConfig($config){
$file = self::$current['data_folder_full'].'/_config.php';
if( \gp\tool\Files::SaveData($file,'config',$config) ){
return true;
}
return false;
}
}
}
namespace{
/**
* Include a file in the current plugin directory
* @param string $file File to include relative to the current plugin directory
* @since 3.5.3
*/
function gpPlugin_incl($file){
global $addonPathCode, $dataDir;
if( gp_safe_mode ){
return;
}
return IncludeScript($addonPathCode.'/'.$file); // return added in 5.0b3
}
class gpPlugin extends \gp\tool\Plugins{}
}