Файл: 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);
}
}
}
?>