Вход Регистрация
Файл: 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($file01) != '.' && (!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;
    }
}
Онлайн: 1
Реклама