Вход Регистрация
Файл: oc-includes/osclass/classes/Plugins.php
Строк: 494
<?php if ( ! defined('ABS_PATH')) exit('ABS_PATH is not loaded. Direct access is not allowed.');

/*
 * Copyright 2014 Osclass
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *     http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

    
class Plugins
    
{
        private static 
$hooks;

        function 
__construct() {}

        static function 
runHook($hook)
        {
            
$args func_get_args();
            
array_shift($args);
            if(isset(
self::$hooks[$hook])) {
                for(
$priority 0;$priority<=10;$priority++) {
                    if(isset(
self::$hooks[$hook][$priority]) && is_array(self::$hooks[$hook][$priority])) {
                        foreach(
self::$hooks[$hook][$priority] as $fxName) {
                            if(
is_callable($fxName)) {
                                
call_user_func_array($fxName$args);
                            }
                        }
                    }
                }
            }
        }

        static function 
applyFilter($hook)
        {
            
$args   func_get_args();
            
$hook   array_shift($args);
            if(isset(
$args[0])) {
                
$content $args[0];
            } else {
                
$content '';
            }

            if(isset(
self::$hooks[$hook])) {
                for(
$priority 0;$priority<=10;$priority++) {
                    if(isset(
self::$hooks[$hook][$priority]) && is_array(self::$hooks[$hook][$priority])) {
                        foreach(
self::$hooks[$hook][$priority] as $fxName) {
                            if(
is_callable($fxName)) {
                                
$content call_user_func_array($fxName$args);
                                
$args[0] = $content;
                            }
                        }
                    }
                }
            }
            return 
$content;
        }

        static function 
isInstalled($plugin)
        {
            if( 
in_array($pluginself::listInstalled()) ) {
                return 
true;
            }

            return 
false;
        }

        static function 
isEnabled($plugin)
        {
            if( 
in_array($pluginself::listEnabled()) ) {
                return 
true;
            }

            return 
false;
        }

        static function 
listAll($sort true)
        {
            
$plugins = array();
            
$pluginsPath osc_plugins_path();
            
$dir opendir($pluginsPath);
            while(
$file readdir($dir)) {
                if(
preg_match('/^[a-zA-Z0-9-_]+$/'$file$matches)) {
                    
// This has to change in order to catch any .php file
                    
$pluginPath $pluginsPath "$file/index.php";
                    if(
file_exists($pluginPath)) {
                        
$plugins[] = $file."/index.php";
                    } else {
                        
trigger_error(sprintf(__('Plugin %s is missing the index.php file %s'), $file$pluginPath));
                    }
                }
            }
            
closedir($dir);

            if(
$sort) {
                
$enabled self::listEnabled();
                
$installed self::listInstalled();
                
$extended_list = array();
                foreach(
$plugins as $p) {
                    
$extended_list[$p] = self::getInfo($p);
                }
                
uasort($extended_list, array("self""strnatcmpCustom"));
                
$plugins = array();
                
// Enabled
                
foreach($extended_list as $k => $v) {
                    if(
in_array($k$enabled)) {
                        
$plugins[] = $k;
                        unset(
$extended_list[$k]);
                    }
                }
                
// Installed but disabled
                
foreach($extended_list as $k => $v) {
                    if(
in_array($k$installed)) {
                        
$plugins[] = $k;
                        unset(
$extended_list[$k]);
                    }
                }
                
// Not installed
                
foreach($extended_list as $k => $v) {
                    
$plugins[] = $k;
                }
            }

            return 
$plugins;
        }

        static function 
strnatcmpCustom($a$b) {
            return 
strnatcasecmp($a['plugin_name'], $b['plugin_name']);
        }

        static function 
loadActive()
        {
            
$data['s_value'] = osc_active_plugins();
            
$plugins_list unserialize($data['s_value']);
            if(
is_array($plugins_list)) {
                foreach(
$plugins_list as $plugin_name) {
                    
$pluginPath osc_plugins_path() . $plugin_name;
                    if(
file_exists($pluginPath)) {
                        
//This should include the file and adds the hooks
                        
include_once $pluginPath;
                    }
                }
            }
        }

        static function 
listInstalled()
        {
            
$p_array = array();

            
$data['s_value'] = osc_installed_plugins();
            
$plugins_list    unserialize($data['s_value']);
            if( 
is_array($plugins_list) ) {
                foreach(
$plugins_list as $plugin_name) {
                    
$p_array[] = $plugin_name;
                }
            }

            return 
$p_array;
        }

        static function 
listEnabled()
        {
            
$p_array = array();

            
$data['s_value'] = osc_active_plugins();
            
$plugins_list unserialize($data['s_value']);
            if( 
is_array($plugins_list) ) {
                foreach(
$plugins_list as $plugin_name) {
                    
$p_array[] = $plugin_name;
                }
            }

            return 
$p_array;
        }

        static function 
findByUpdateURI($uri) {
            
$plugins Plugins::listAll();
            foreach(
$plugins as $p) {
                
$info Plugins::getInfo($p);
                if(
$info['plugin_update_uri']==$uri) {
                    return 
$p;
                }
            }
            return 
false;
        }

        static function 
resource($path)
        {
            
$fullPath osc_plugins_path() . $path;
            return 
file_exists($fullPath) ? $fullPath false;
        }

        static function 
register($path$function)
        {
            
$path str_replace(osc_plugins_path(), ''$path);
            
self::addHook('install_' $path$function);
        }

        static function 
install($path)
        {
            
$data['s_value'] = osc_installed_plugins();
            
$plugins_list    unserialize($data['s_value']);

            if( 
is_array($plugins_list) ) {
                
// check if the plugin is already installed
                
if( in_array($path$plugins_list) ) {
                    return array(
'error_code' => 'error_installed');
                }
            }

            if( !
file_exists(osc_plugins_path() . $path) ) {
                return array(
'error_code' => 'error_file');
            }

            try {
                include_once( 
osc_plugins_path() . $path );
                
                
self::runHook('install_' $path);
            } catch(
Exception $e) {
                return array(
'error_code' => 'custom_error' ,'msg' => $e->getMessage());
            }

            if( !
self::activate($path) ) {
                return array(
'error_code' => '');
            }

            
$plugins_list[]  = $path;
            
osc_set_preference('installed_plugins'serialize($plugins_list));

            
// Check if something failed
            
if ( ob_get_length() > ) {
                return array(
'error_code' => 'error_output''output' => ob_get_clean());
            }

            return 
true;
        }

        static function 
uninstall($path)
        {
            
$data['s_value'] = osc_installed_plugins();
            
$plugins_list    unserialize($data['s_value']);

            
$path str_replace(osc_plugins_path(), ''$path);
            if( !
is_array($plugins_list) ) {
                return 
false;
            }

            include_once( 
osc_plugins_path() . $path );

            
self::deactivate($path);
            
/*if( !self::deactivate($path) ) {
                return false;
            }*/

            
self::runHook($path '_uninstall');

            foreach(
$plugins_list as $k => $v) {
                if(
$v == $path) {
                    unset(
$plugins_list[$k]);
                }
            }

            
osc_set_preference('installed_plugins'serialize($plugins_list));

            
$plugin self::getInfo($path);
            
self::cleanCategoryFromPlugin($plugin['short_name']);
            return 
true;
        }

        static function 
activate($path)
        {
            
$data = array();
            
$data['s_value'] = osc_active_plugins();
            
$plugins_list    unserialize($data['s_value']);

            if( 
is_array($plugins_list) ) {
                
// check if the plugin is already active
                
if( in_array($path$plugins_list) ) {
                    return 
false;
                }
            }

            
$plugins_list[]  = $path;
            
osc_set_preference('active_plugins'serialize($plugins_list));

            
self::reload();

            
self::runHook($path '_enable');

            return 
true;
        }

        static function 
deactivate($path)
        {
            
$data['s_value'] = osc_active_plugins();
            
$plugins_list unserialize($data['s_value']);

            
$path str_replace(osc_plugins_path(), ''$path);
            
// check if there is some plugin enabled
            
if( !is_array($plugins_list) ) {
                return 
false;
            }

            
// remove $path from the active plugins list
            
foreach($plugins_list as $k => $v) {
                if(
$v == $path) {
                    unset(
$plugins_list[$k]);
                }
            }

            
self::runHook($path '_disable');

            
// update t_preference field for active plugins
            
osc_set_preference('active_plugins'serialize($plugins_list));

            
self::reload();
            return 
true;
        }

        static function 
isThisCategory($name$id)
        {
            return 
PluginCategory::newInstance()->isThisCategory($name$id);
        }

        static function 
getInfo($plugin)
        {
            
$s_info file_get_contents(osc_plugins_path() . $plugin);
            
$info   = array();
            if( 
preg_match('|Plugin Name:([^\r\t\n]*)|i'$s_info$match) ) {
                
$info['plugin_name'] = trim($match[1]);
            } else {
                
$info['plugin_name'] = $plugin;
            }

            if( 
preg_match('|Plugin URI:([^\r\t\n]*)|i'$s_info$match) ) {
                
$info['plugin_uri'] = trim($match[1]);
            } else {
                
$info['plugin_uri'] = "";
            }

            if( 
preg_match('|Plugin update URI:([^\r\t\n]*)|i'$s_info$match) ) {
                
$info['plugin_update_uri'] = trim($match[1]);
            } else {
                
$info['plugin_update_uri'] = "";
            }

            if( 
preg_match('|Support URI:([^\r\t\n]*)|i'$s_info$match) ) {
                
$info['support_uri'] = trim($match[1]);
            } else {
                
$info['support_uri'] = "";
            }

            if( 
preg_match('|Description:([^\r\t\n]*)|i'$s_info$match) ) {
                
$info['description'] = trim($match[1]);
            } else {
                
$info['description'] = "";
            }

            if( 
preg_match('|Version:([^\r\t\n]*)|i'$s_info$match) ) {
                
$info['version'] = trim($match[1]);
            } else {
                
$info['version'] = "";
            }

            if( 
preg_match('|Author:([^\r\t\n]*)|i'$s_info$match) ) {
                
$info['author'] = trim($match[1]);
            } else {
                
$info['author'] = "";
            }

            if( 
preg_match('|Author URI:([^\r\t\n]*)|i'$s_info$match) ) {
                
$info['author_uri'] = trim($match[1]);
            } else {
                
$info['author_uri'] = "";
            }

            if( 
preg_match('|Short Name:([^\r\t\n]*)|i'$s_info$match) ) {
                
$info['short_name'] = trim($match[1]);
            } else {
                
$info['short_name'] = $info['plugin_name'];
            }

            
$info['filename'] = $plugin;

            return 
$info;
        }

        static function 
checkUpdate($plugin) {
            
$info Plugins::getInfo($plugin);
            return 
osc_check_plugin_update($info['plugin_update_uri'], $info['version']);
        }


        static function 
configureView($path)
        {
            
$plugin str_replace(osc_plugins_path(), ''$path);
            if(
stripos($plugin".php")===FALSE) {
                
$plugins_list unserialize(osc_active_plugins());
                if(
is_array($plugins_list)) {
                    foreach(
$plugins_list as $p){
                        
$data self::getInfo($p);
                        if(
$plugin == $data['plugin_name']) {
                            
$plugin $p;
                            break;
                        }
                    }
                }
            }
            
osc_redirect_to(osc_plugin_configure_url($plugin));
        }

        static function 
cleanCategoryFromPlugin($plugin)
        {
            
$dao_pluginCategory = new PluginCategory();
            
$dao_pluginCategory->delete(array('s_plugin_name' => $plugin));
            unset(
$dao_pluginCategory);
        }

        static function 
addToCategoryPlugin($categories$plugin)
        {
            
$dao_pluginCategory = new PluginCategory();
            
$dao_category = new Category();
            if(!empty(
$categories)) {
                foreach(
$categories as $catId)
                {
                    
$result $dao_pluginCategory->isThisCategory($plugin$catId);
                    if(
$result==0) {
                        
$fields = array();
                        
$fields['s_plugin_name'] = $plugin;
                        
$fields['fk_i_category_id'] = $catId;
                        
$dao_pluginCategory->insert($fields);

                        
$subs $dao_category->findSubcategories($catId);
                        if(
is_array($subs) && count($subs)>0) {
                            
$cats = array();
                            foreach( 
$subs as $sub) {
                                
$cats[] = $sub['pk_i_id'];
                            }
                            
self::addToCategoryPlugin($cats$plugin);
                        }
                    }
                }
            }
            unset(
$dao_pluginCategory);
            unset(
$dao_category);
        }

        
// Add a hook
        
static function addHook($hook$function$priority 5)
        {
            
$hook         preg_replace('|/+|''/'str_replace('\', '/', $hook));
            $plugin_path  = str_replace('
\', '/', osc_plugins_path());
            $hook         = str_replace($plugin_path, '', $hook);
            $found_plugin = false;
            if(isset(self::$hooks[$hook])) {
                for($_priority = 0;$_priority<=10;$_priority++) {
                    if(isset(self::$hooks[$hook][$_priority])) {
                        foreach(self::$hooks[$hook][$_priority] as $fxName) {
                            if($fxName==$function) {
                                $found_plugin = true;
                                break;
                            }
                        }
                    }
                }
            }
            if(!$found_plugin) { self::$hooks[$hook][$priority][] = $function; }
        }

        static function removeHook($hook, $function)
        {
            for($priority = 0;$priority<=10;$priority++) {
                if(isset(self::$hooks[$hook][$priority])) {
                    foreach(self::$hooks[$hook][$priority] as $k => $v) {
                        if($v==$function) {
                            unset(self::$hooks[$hook][$priority][$k]);
                        }
                    }
                }
            }
        }

        static function getActive()
        {
            return self::$hooks;
        }

        static function reload()
        {
            osc_reset_preferences();
            self::init();
        }

        static function init()
        {
            self::loadActive();
        }
    }

?>
Онлайн: 2
Реклама