Вход Регистрация
Файл: concrete5.7.5.6/concrete/src/Foundation/Environment.php
Строк: 255
<?php

namespace ConcreteCoreFoundation;

use 
Config;

/**
 * Useful functions for getting paths for concrete5 items.
 * @package Core
 * @author Andrew Embler <andrew@concrete5.org>
 * @copyright  Copyright (c) 2003-2012 Concrete5. (http://www.concrete5.org)
 * @license    http://www.concrete5.org/license/     MIT License
 */
class Environment
{
    protected 
$coreOverrides = array();
    protected 
$corePackages = array();
    protected 
$coreOverridesByPackage = array();
    protected 
$overridesScanned = false;
    protected 
$cachedOverrides = array();
    protected 
$autoLoaded = false;

    public static function 
get()
    {
        static 
$env;
        if (!isset(
$env)) {
            if (
file_exists(Config::get('concrete.cache.directory').'/'.Config::get('concrete.cache.environment.file'))) {
                
$r = @file_get_contents(Config::get('concrete.cache.directory').'/'.Config::get('concrete.cache.environment.file'));
                if (
$r) {
                    
$en = @unserialize($r);
                    if (
$en instanceof Environment) {
                        
$env = $en;
                        
$env->autoLoaded = true;

                        return 
$env;
                    }
                }
            }
            
$env = new Environment();
        }

        return 
$env;
    }

    public static function 
saveCachedEnvironmentObject()
    {
        if (!
file_exists(Config::get('concrete.cache.directory').'/'.Config::get('concrete.cache.environment.file'))) {
            
$env = new Environment();
            
$env->getOverrides();
            @
file_put_contents(Config::get('concrete.cache.directory').'/'.Config::get('concrete.cache.environment.file'), serialize($env));
        }
    }

    public function 
clearOverrideCache()
    {
        
$cacheFile = Config::get('concrete.cache.directory').'/'.Config::get('concrete.cache.environment.file');
        if (
is_file($cacheFile)) {
            @
unlink($cacheFile);
        }
        
$this->overridesScanned = false;
        
$this->cachedOverrides = array();
    }

    
/**
     * @access private
     */
    
protected $ignoreFiles = array('__MACOSX');

    public function 
reset()
    {
        
$this->ignoreFiles = array('__MACOSX');
    }

    
/**
     * Builds a list of all overrides.
     */
    
protected function getOverrides()
    {
        
$check = array(
            
DIR_FILES_BLOCK_TYPES,
            
DIR_FILES_CONTROLLERS,
            
DIR_FILES_ELEMENTS,
            
DIR_APPLICATION.'/'.DIRNAME_ATTRIBUTES,
            
DIR_APPLICATION.'/'.DIRNAME_AUTHENTICATION,
            
DIR_FILES_JOBS,
            
DIR_APPLICATION.'/'.DIRNAME_CSS,
            
DIR_APPLICATION.'/'.DIRNAME_JAVASCRIPT,
            
DIR_APPLICATION.'/'.DIRNAME_LANGUAGES,
            
DIR_FILES_EMAIL_TEMPLATES,
            
DIR_FILES_CONTENT,
            
DIR_FILES_THEMES,
            
DIR_FILES_TOOLS,
            
DIR_APPLICATION.'/'.DIRNAME_PAGE_TEMPLATES,
            
DIR_APPLICATION.'/'.DIRNAME_VIEWS,
            
DIR_APPLICATION.'/'.DIRNAME_CLASSES,
            
DIR_APPLICATION.'/'.DIRNAME_MENU_ITEMS,
        );
        foreach (
$check as $loc) {
            if (
is_dir($loc)) {
                
$contents = $this->getDirectoryContents($loc, array(), true);
                foreach (
$contents as $f) {
                    
$item = str_replace(DIR_APPLICATION.'/', '', $f);
                    
$item = str_replace(DIR_BASE.'/', '', $item);
                    
$this->coreOverrides[] = $item;
                }
            }
        }

        if (
is_dir(DIR_PACKAGES_CORE)) {
            
$this->corePackages = $this->getDirectoryContents(DIR_PACKAGES_CORE);
        }

        
$this->overridesScanned = true;
    }

    public function 
getDirectoryContents($dir, $ignoreFilesArray = array(), $recursive = false)
    {
        
$ignoreFiles = array_merge($this->ignoreFiles, $ignoreFilesArray);
        
$aDir = array();
        if (
is_dir($dir)) {
            
$handle = opendir($dir);
            while ((
$file = readdir($handle)) !== false) {
                if (
substr($file, 0, 1) != '.' && (!in_array($file, $ignoreFiles))) {
                    if (
is_dir($dir.'/'.$file)) {
                        if (
$recursive) {
                            
$aDir = array_merge($aDir, $this->getDirectoryContents($dir.'/'.$file, $ignoreFiles, $recursive));
                            
$file = $dir.'/'.$file;
                        }
                        
$aDir[] = preg_replace("////si", '/', $file);
                    } else {
                        if (
$recursive) {
                            
$file = $dir.'/'.$file;
                        }
                        
$aDir[] = preg_replace("////si", '/', $file);
                    }
                }
            }
            
closedir($handle);
        }

        return 
$aDir;
    }

    public function 
overrideCoreByPackage($segment, $pkgOrHandle)
    {
        
$pkgHandle = is_object($pkgOrHandle) ? $pkgOrHandle->getPackageHandle() : $pkgOrHandle;
        
$this->coreOverridesByPackage[$segment] = $pkgHandle;
    }

    public function 
getRecord($segment, $pkgHandle = false)
    {
        if (
is_object($pkgHandle)) {
            
$pkgHandle = $pkgHandle->getPackageHandle();
        } else {
            
$pkgHandle = (string) $pkgHandle;
        }

        if (!
$this->overridesScanned) {
            
$this->getOverrides();
        }

        if (isset(
$this->cachedOverrides[$segment][$pkgHandle])) {
            return 
$this->cachedOverrides[$segment][$pkgHandle];
        }

        
$obj = new EnvironmentRecord();
        
$obj->pkgHandle = null;

        if (!
in_array($segment, $this->coreOverrides) && !$pkgHandle && !array_key_exists($segment, $this->coreOverridesByPackage)) {
            
$obj->file = DIR_BASE_CORE.'/'.$segment;
            
$obj->url = ASSETS_URL.'/'.$segment;
            
$obj->override = false;
            
$this->cachedOverrides[$segment][''] = $obj;

            return 
$obj;
        }

        if (
in_array($segment, $this->coreOverrides)) {
            
$obj->file = DIR_APPLICATION.'/'.$segment;
            
$obj->url = REL_DIR_APPLICATION.'/'.$segment;
            
$obj->override = true;
            
$this->cachedOverrides[$segment][''] = $obj;

            return 
$obj;
        }

        if (
array_key_exists($segment, $this->coreOverridesByPackage)) {
            
$pkgHandle = $this->coreOverridesByPackage[$segment];
            
$obj->pkgHandle = $pkgHandle;
        }

        if (!
in_array($pkgHandle, $this->corePackages)) {
            
$dirp = DIR_PACKAGES.'/'.$pkgHandle;
            
$obj->url = DIR_REL.'/'.DIRNAME_PACKAGES.'/'.$pkgHandle.'/'.$segment;
        } else {
            
$dirp = DIR_PACKAGES_CORE.'/'.$pkgHandle;
            
$obj->url = ASSETS_URL.'/'.DIRNAME_PACKAGES.'/'.$pkgHandle.'/'.$segment;
        }
        
$obj->file = $dirp.'/'.$segment;
        
$obj->override = false;
        
$this->cachedOverrides[$segment][$pkgHandle] = $obj;

        return 
$obj;
    }

    
/**
     * Bypasses overrides cache to get record.
     */
    
public function getUncachedRecord($segment, $pkgHandle = false)
    {
        
$obj = new EnvironmentRecord();
        if (
is_object($pkgHandle)) {
            
$pkgHandle = $pkgHandle->getPackageHandle();
        }
        
$obj->override = false;
        if (
file_exists(DIR_APPLICATION.'/'.$segment)) {
            
$obj->file = DIR_APPLICATION.'/'.$segment;
            
$obj->override = true;
            
$obj->url = REL_DIR_APPLICATION.'/'.$segment;
        } elseif (
$pkgHandle) {
            
$dirp1 = DIR_PACKAGES.'/'.$pkgHandle.'/'.$segment;
            
$dirp2 = DIR_PACKAGES_CORE.'/'.$pkgHandle.'/'.$segment;
            if (
file_exists($dirp2)) {
                
$obj->file = $dirp2;
                
$obj->url = ASSETS_URL.'/'.DIRNAME_PACKAGES.'/'.$pkgHandle.'/'.$segment;
            } elseif (
file_exists($dirp1)) {
                
$obj->file = $dirp1;
                
$obj->url = DIR_REL.'/'.DIRNAME_PACKAGES.'/'.$pkgHandle.'/'.$segment;
            }
        } else {
            
$obj->file = DIR_BASE_CORE.'/'.$segment;
            
$obj->url = ASSETS_URL.'/'.$segment;
        }

        return 
$obj;
    }

    
/**
     * Returns a full path to the subpath segment. Returns false if not found.
     */
    
public function getPath($subpath, $pkgIdentifier = false)
    {
        
$r = $this->getRecord($subpath, $pkgIdentifier);

        return 
$r->file;
    }

    
/**
     * Returns  a public URL to the subpath item. Returns false if not found.
     */
    
public function getURL($subpath, $pkgIdentifier = false)
    {
        
$r = $this->getRecord($subpath, $pkgIdentifier);

        return 
$r->url;
    }

    public function 
getOverrideList()
    {
        
$this->getOverrides();
        return 
$this->coreOverrides;
    }
}
Онлайн: 3
Реклама