Вход Регистрация
Файл: upload/module/theme/include/service/template/template.class.php
Строк: 183
<?php
/**
 * [PHPFOX_HEADER]
 */

defined('PHPFOX') or exit('NO DICE!');

/**
 * 
 * 
 * @copyright        [PHPFOX_COPYRIGHT]
 * @author          Raymond Benc
 * @package          Module_Theme
 * @version         $Id: template.class.php 2125 2010-11-11 10:16:49Z Raymond_Benc $
 */
class Theme_Service_Template_Template extends Phpfox_Service 
{
    private 
$_aFiles = array();
    
    private 
$_aModified = null;
    
    
/**
     * Class constructor
     */    
    
public function __construct()
    {    
        
$this->_sTable = Phpfox::getT('theme_template');
    }
    
    public function 
get($sFolder, $bFullPath = false, $bIncludeParent = true)
    {    
        
$this->_buildFiles($sFolder, $bFullPath);
        
        
$aTheme = $this->database()->select('t.parent_id AS theme_parent_id, pt.folder AS parent_theme_folder')
            ->
from(Phpfox::getT('theme'), 't')
            ->
leftJoin(Phpfox::getT('theme'), 'pt', 'pt.theme_id = t.parent_id')
            ->
where('t.folder = '' . $this->database()->escape($sFolder) . ''')
            ->
execute('getRow');
            
        if (
$bIncludeParent === true && $aTheme['theme_parent_id'] > 0)
        {
            
$this->_buildFiles($aTheme['parent_theme_folder'], $bFullPath);
        }
        
        if (
$bFullPath === false)
        {
            
$this->_buildFiles('default', $bFullPath);
        }
        
        
$aTemplates = $this->database()->select('folder, type_id, module_id, name, time_stamp_update')
            ->
from(Phpfox::getT('theme_template'))
            ->
where('is_custom = 1 AND folder = '' . $this->database()->escape($sFolder) . ''')
            ->
execute('getRows');        
        foreach (
$aTemplates as $aTemplate)
        {
            if (empty(
$aTemplate['module_id']))
            {
                
$this->_aFiles['layout']['files'][] = ($aTemplate['time_stamp_update'] ? array($aTemplate['name']) : $aTemplate['name']);                
                if (
$aTemplate['time_stamp_update'])
                {
                    
$this->_aModified['layout'][null][$aTemplate['name']] = true;
                }
            }
            else 
            {
                
$this->_aFiles[$aTemplate['module_id']][$aTemplate['type_id']][] = ($aTemplate['time_stamp_update'] ? array($aTemplate['name']) : $aTemplate['name']);    
                if (
$aTemplate['time_stamp_update'])
                {
                    
$this->_aModified[$aTemplate['type_id']][$aTemplate['module_id']][$aTemplate['name']] = true;
                }
            }
        }        
        
        
ksort($this->_aFiles);        
        
        if (isset(
$this->_aFiles['layout']))
        {
            
$aCache = $this->_aFiles['layout'];                
            
            unset(
$this->_aFiles['layout']);
            
            
$this->_aFiles = array_merge(array('layout' => $aCache), $this->_aFiles);        
        }
        
        foreach (
$this->_aFiles as $mKey => $mValues)
        {            
            if (
$mKey == 'layout' && isset($this->_aModified['layout']) && count($this->_aModified['layout'][null]) > 0)
            {                
                
$this->_aFiles[$mKey]['modified'] = true;
            }
            else 
            {
                if (isset(
$this->_aModified['block'][$mKey]) && count($this->_aModified['block'][$mKey]) > 0)
                {
                    
$this->_aFiles[$mKey]['modified'] = true;
                }
                
                if (isset(
$this->_aModified['controller'][$mKey]) && count($this->_aModified['controller'][$mKey]) > 0)
                {
                    
$this->_aFiles[$mKey]['modified'] = true;
                }                
            }
        }    
        
        return 
$this->_aFiles;
    }
    
    public function 
getTemplate($sTheme, $sType, $sName, $sModule = null, $bIncludeParent = true)
    {
        if (
$sType == 'layout')
        {
            
$aTemplate = $this->database()->select('*')
                ->
from($this->_sTable)
                ->
where("folder = '" . $this->database()->escape($sTheme) . "' AND type_id = 'layout' AND name = '" . $this->database()->escape($sName) . "'")
                ->
execute('getSlaveRow');    
        }
        else 
        {
            
$aTemplate = $this->database()->select('*')
                ->
from($this->_sTable)
                ->
where("folder = '" . $this->database()->escape($sTheme) . "' AND type_id = '" . $this->database()->escape($sType) . "' AND module_id = '" . $this->database()->escape($sModule) . "' AND name = '" . $this->database()->escape($sName) . "'")
                ->
execute('getSlaveRow');    
        }        
        
        if (isset(
$aTemplate['template_id']))
        {
            
$aTemplate['html_data'] = str_replace("rn", "n", $aTemplate['html_data']);
            
            return array(
$aTemplate['html_data'], ($aTemplate['is_custom'] ? $aTemplate['time_stamp_update'] : $aTemplate['time_stamp']), $aTemplate['full_name'], $aTemplate['product_id'], $aTemplate['is_custom']);
        }    
        
        if (
$sType == 'layout')
        {
            
$sFile = PHPFOX_DIR_THEME . 'frontend' . PHPFOX_DS . $sTheme . PHPFOX_DS . 'template' . PHPFOX_DS . $sName;
        }
        elseif (
$sType == 'controller')
        {
            
$sFile = PHPFOX_DIR_MODULE . $sModule . PHPFOX_DS . 'template' . PHPFOX_DS . $sTheme . PHPFOX_DS . 'controller' . PHPFOX_DS . $sName;
        }
        else 
        {
            
$sFile = PHPFOX_DIR_MODULE . $sModule . PHPFOX_DS . 'template' . PHPFOX_DS . $sTheme . PHPFOX_DS . 'block' . PHPFOX_DS . $sName;
        }
        
        
$aTheme = $this->database()->select('t.parent_id AS theme_parent_id, pt.folder AS parent_theme_folder')
            ->
from(Phpfox::getT('theme'), 't')
            ->
leftJoin(Phpfox::getT('theme'), 'pt', 'pt.theme_id = t.parent_id')
            ->
where('t.folder = '' . $this->database()->escape($sTheme) . ''')
            ->
execute('getRow');        
            
        if (
$bIncludeParent === true && $aTheme['theme_parent_id'] > 0)
        {
            if (!
file_exists($sFile))
            {
                
$sTheme = $aTheme['parent_theme_folder'];                
                if (
$sType == 'layout')
                {
                    
$sFile = PHPFOX_DIR_THEME . 'frontend' . PHPFOX_DS . $sTheme . PHPFOX_DS . 'template' . PHPFOX_DS . $sName;
                }
                elseif (
$sType == 'controller')
                {
                    
$sFile = PHPFOX_DIR_MODULE . $sModule . PHPFOX_DS . 'template' . PHPFOX_DS . $sTheme . PHPFOX_DS . 'controller' . PHPFOX_DS . $sName;
                }
                else 
                {
                    
$sFile = PHPFOX_DIR_MODULE . $sModule . PHPFOX_DS . 'template' . PHPFOX_DS . $sTheme . PHPFOX_DS . 'block' . PHPFOX_DS . $sName;
                }                
            }
        }
        
        if (!
file_exists($sFile))
        {            
            if (
$sType == 'layout')
            {
                
$sFile = PHPFOX_DIR_THEME . 'frontend' . PHPFOX_DS . 'default' . PHPFOX_DS . 'template' . PHPFOX_DS . $sName;
            }
            elseif (
$sType == 'controller')
            {
                
$sFile = PHPFOX_DIR_MODULE . $sModule . PHPFOX_DS . 'template' . PHPFOX_DS . 'default' . PHPFOX_DS . 'controller' . PHPFOX_DS . $sName;
            }
            else 
            {
                
$sFile = PHPFOX_DIR_MODULE . $sModule . PHPFOX_DS . 'template' . PHPFOX_DS . 'default' . PHPFOX_DS . 'block' . PHPFOX_DS . $sName;
            }
        }
        
        
$sContent = file_get_contents($sFile);
        
$sContent = str_replace("rn", "n", $sContent);
        
        
$aParts = explode('?>', $sContent);        
        if (isset(
$aParts[1]) && preg_match('/PHPFOX/', $aParts[0]))
        {        
            
$sContent = ltrim($aParts[1]);
        }
        
        return 
$sContent;
    }    
    
    
/**
     * If a call is made to an unknown method attempt to connect
     * it to a specific plug-in with the same name thus allowing 
     * plug-in developers the ability to extend classes.
     *
     * @param string $sMethod is the name of the method
     * @param array $aArguments is the array of arguments of being passed
     */
    
public function __call($sMethod, $aArguments)
    {
        
/**
         * Check if such a plug-in exists and if it does call it.
         */
        
if ($sPlugin = Phpfox_Plugin::get('theme.service_template_template__call'))
        {
            return eval(
$sPlugin);
        }
            
        
/**
         * No method or plug-in found we must throw a error.
         */
        
Phpfox_Error::trigger('Call to undefined method ' . __CLASS__ . '::' . $sMethod . '()', E_USER_ERROR);
    }

    private function 
_buildFiles($sFolder, $bFullPath = false)
    {
        static 
$aCache = array();        
        
        if (
$this->_aModified === null)
        {
            
$this->_aModified = array();
            
$aTemplates = $this->database()->select('folder, type_id, module_id, name')
                ->
from($this->_sTable)
                ->
where('is_custom = 0 AND folder = '' . $this->database()->escape($sFolder) . ''')
                ->
execute('getSlaveRows');
            foreach (
$aTemplates as $aTemplate)
            {
                
$this->_aModified[$aTemplate['type_id']][($aTemplate['type_id'] == 'layout' ? null : $aTemplate['module_id'])][$aTemplate['name']] = true;
                if (
$bFullPath === true)
                {
                    if (empty(
$aTemplate['module_id']))
                    {
                        
$this->_aFiles['layout']['files'][] = $aTemplate['name'];
                    }
                    else 
                    {
                        
$this->_aFiles[$aTemplate['module_id']][$aTemplate['type_id']][] = $aTemplate['name'];
                    }
                }
            }            
        }
        
        if (
is_dir(PHPFOX_DIR_THEME . 'frontend' . PHPFOX_DS . $sFolder . PHPFOX_DS . 'template'))
        {
            
$hDir = opendir(PHPFOX_DIR_THEME . 'frontend' . PHPFOX_DS . $sFolder . PHPFOX_DS . 'template');
            while (
$sFile = readdir($hDir))
            {
                if (
substr($sFile, -9) != '.html.php')
                {
                    continue;
                }
                
                if (isset(
$aCache['layout'][null][$sFile]))
                {
                    continue;
                }
                
                if (
$bFullPath === false && isset($this->_aModified['layout'][null][$sFile]))
                {
                    
$this->_aFiles['layout']['files'][] = array($sFile);
                }
                else 
                {
                    
$this->_aFiles['layout']['files'][] = $sFile;
                }
                
                
$aCache['layout'][null][$sFile] = true;
            }
            
closedir($hDir);
        }
        
        
$hDir = opendir(PHPFOX_DIR_MODULE);
        while (
$sDir = readdir($hDir))
        {
            if (
$sDir == 'admincp')
            {
                continue;
            }
            
            
$this->_readDir(PHPFOX_DIR_MODULE . $sDir . PHPFOX_DS . 'template' . PHPFOX_DS . $sFolder . PHPFOX_DS . 'controller', $sDir, 'controller', $bFullPath);
            
$this->_readDir(PHPFOX_DIR_MODULE . $sDir . PHPFOX_DS . 'template' . PHPFOX_DS . $sFolder . PHPFOX_DS . 'block', $sDir, 'block', $bFullPath);
        }
        
closedir($hDir);                
    }
    
    private function 
_readDir($sDir, $sModule, $sType, $bFullPath = false, $sExtra = null)
    {
        static 
$aCache = array();
        
            if (
is_dir($sDir))
            {
                
$hControllerDir = opendir($sDir);
                while (
$sControllerFiles = readdir($hControllerDir))
                {
                    if (
$sControllerFiles == 'admincp')
                    {
                        continue;
                    }                    
                    
                    if (
$sControllerFiles == '.' || $sControllerFiles == '..' || $sControllerFiles == '.svn')
                    {
                        continue;
                    }
                    
                    if (
is_dir($sDir . PHPFOX_DS . $sControllerFiles))
                    {
                        
$this->_readDir($sDir . PHPFOX_DS . $sControllerFiles, $sModule, $sType, $bFullPath, ($sExtra === null ? '' : $sExtra . '/') . $sControllerFiles);
                        
                        continue;
                    }
                    
                    if (
substr($sControllerFiles, -9) != '.html.php')
                    {
                        continue;
                    }                            
                    
                    if (
$sExtra !== null)
                    {
                        
$sControllerFiles = $sExtra . '/' . $sControllerFiles;
                    }
                
                    if (isset(
$aCache[$sModule][$sType][$sControllerFiles]))
                    {
                        continue;
                    }                    
                    
                    if (
$bFullPath === false && isset($this->_aModified[$sType][$sModule][$sControllerFiles]))
                    {
                        
$this->_aFiles[$sModule][$sType][] = array($sControllerFiles);
                    }
                    else 
                    {
                        
$this->_aFiles[$sModule][$sType][] = $sControllerFiles;
                    }
                    
                    
$aCache[$sModule][$sType][$sControllerFiles] = true;
                }
                
closedir($hControllerDir);
            }        
    }
}

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