Файл: upload/include/library/phpfox/template/cache.class.php
Строк: 1609
<?php
/**
* [PHPFOX_HEADER]
*/
defined('PHPFOX') or exit('NO DICE!');
/**
* Template Cache
* Class handles the caching of a template file and converts any
* custom code into PHP code. Class is only loaded if the template
* cache file does not exist.
*
* @copyright [PHPFOX_COPYRIGHT]
* @author Raymond Benc
* @package Phpfox
* @subpackage Template
* @version $Id: cache.class.php 4448 2012-07-02 12:59:29Z Miguel_Espinoza $
*/
class Phpfox_Template_Cache extends Phpfox_Template
{
/**
* Foreach stack.
*
* @var array
*/
private $_aForeachElseStack = array();
/**
* Require stack.
*
* @var array
*/
private $_aRequireStack = array();
/**
* PHP blocks. {php}{/php}
*
* @var array
*/
private $_aPhpBlocks = array();
/**
* Section blocks. {section}{/section}
*
* @var array
*/
private $_aSectionelseStack = array();
/**
* Module blocks.
*
* @var array
*/
private $_aModuleBlocks = array();
/**
* Literal blocks. {literal}{/literal}
*
* @var array
*/
private $_aLiterals = array();
/**
* String regex.
*
* @var string
*/
private $_sDbQstrRegexp = '"[^"\\]*(?:\\.[^"\\]*)*"';
/**
* String regex.
*
* @var string
*/
private $_sSiQstrRegexp = ''[^'\\]*(?:\\.[^'\\]*)*'';
/**
* Bracket regex.
*
* @var string
*/
private $_sVarBracketRegexp = '[[$|#]?w+#?]';
/**
* Variable regex.
*
* @var string
*/
private $_sSvarRegexp = '%w+.w+%';
/**
* Function regex.
*
* @var string
*/
private $_sFuncRegexp = '[a-zA-Z_]+';
/**
* Class constructor. Build all the regex we will be using
* with this class.
*/
public function __construct()
{
$this->_sQstrRegexp = '(?:' . $this->_sDbQstrRegexp . '|' . $this->_sSiQstrRegexp . ')';
$this->_sDvarRegexp = '$[a-zA-Z0-9_]{1,}(?:' . $this->_sVarBracketRegexp . ')*(?:.$?w+(?:' . $this->_sVarBracketRegexp . ')*)*';
$this->_sCvarRegexp = '#[a-zA-Z0-9_]{1,}(?:' . $this->_sVarBracketRegexp . ')*(?:' . $this->_sVarBracketRegexp . ')*#';
$this->_sVarRegexp = '(?:(?:' . $this->_sDvarRegexp . '|' . $this->_sCvarRegexp . ')|' . $this->_sQstrRegexp . ')';
$this->_sModRegexp = '(?:|@?[0-9a-zA-Z_]+(?::(?>-?w+|' . $this->_sDvarRegexp . '|' . $this->_sQstrRegexp .'))*)';
}
/**
* Compile a template file and cache it to a PHP flat file.
*
* @param string $sName Name of the template.
* @param string $sData Contents of the template.
* @param bool $bRemoveHeader TRUE to remove the time stamp we added to the header of each cache file.
* @param bool $bSkipDbCheck TRUE to skip checks on the database to see if the cache file exists there as well.
* @return mixed We only return the templates content if the installer does not have a writable directory.
*/
public function compile($sName, $sData = null, $bRemoveHeader = false, $bSkipDbCheck = false)
{
if (!defined('PHPFOX_INSTALLER') && !defined('PHPFOX_LIVE_TEMPLATES'))
{
$sNewName = str_replace('_ajax.php', '.php', $sName);
if (preg_match("/(.*?)template_(.*?)_(.*?)_template_(.*?).php$/i", str_replace('template/', 'template_', $sNewName), $aMatches) && isset($aMatches) && $aMatches[2] == 'frontend')
{
$oDb = Phpfox::getLib('database');
$aTemplate = $oDb->select('html_data')
->from(Phpfox::getT('theme_template'))
->where("folder = '" . parent::$_sStaticThemeFolder . "' AND type_id = 'layout' AND name = '" . $oDb->escape($aMatches[4]) . "'")
->execute('getSlaveRow');
}
elseif ($bSkipDbCheck === false && preg_match("/(.*?)template_(.*?)_template_(.*?)_(.*?)_(.*?).php$/i", str_replace('template/', 'template_', $sNewName), $aMatches) && isset($aMatches[5]) && !preg_match("/admincp_(.*?)/", $aMatches[4]))
{
$oDb = Phpfox::getLib('database');
$aTemplate = $oDb->select('html_data')
->from(Phpfox::getT('theme_template'))
->where("folder = '" . parent::$_sStaticThemeFolder . "' AND type_id = '" . $oDb->escape($aMatches[4]) . "' AND module_id = '" . $oDb->escape($aMatches[2]) . "' AND name = '" . $oDb->escape(str_replace('_', '/', $aMatches[5])) . "'")
->execute('getSlaveRow');
}
}
$sData = $this->_parse((isset($aTemplate['html_data']) ? $aTemplate['html_data'] : $sData), $bRemoveHeader);
if (defined('PHPFOX_INSTALLER_NO_TMP'))
{
return $sData;
}
$sContent = '';
$aLines = explode("n", $sData);
foreach ($aLines as $sLine)
{
if (preg_match("/<?php(.*?)?>/i", $sLine))
{
if (substr(trim($sLine), 0, 5) == '<?php')
{
$sContent .= trim($sLine) . "n";
}
else
{
$sContent .= $sLine . "n";
}
}
else
{
$sContent .= $sLine . "n";
}
}
$sContent = preg_replace("/defined('PHPFOX') or exit('NO DICE!');/is", "", $sContent);
$sContent = "<?php defined('PHPFOX') or exit('NO DICE!'); ?>n" . $sContent;
if ($rFile = @fopen($sName, 'w+'))
{
fwrite($rFile, $sContent);
fclose($rFile);
if (!defined('PHPFOX_INSTALLER'))
{
Phpfox::getLib('cache')->saveInfo($sName, 'template', $sContent, filesize($sName));
}
}
else
{
return Phpfox_Error::trigger('Unable to cache template file: ' . $sName, E_USER_NOTICE);
}
}
/**
* Get all the template files that have been cached.
*
* @return array List of cached files.
*/
public function getAll()
{
if ($hDir = @opendir(PHPFOX_DIR_CACHE))
{
$aFiles = array();
while ($sFile = readdir($hDir))
{
if (substr($sFile, 0, 9) != 'template_')
{
continue;
}
$aFiles[] = array(
'id' => md5($sFile),
'name' => $sFile,
'size' => filesize(PHPFOX_DIR_CACHE . $sFile),
'date' => filemtime((PHPFOX_DIR_CACHE . $sFile)),
'type' => 'Template'
);
}
closedir($hDir);
return $aFiles;
}
return array();
}
/**
* Remove a cache file or the entire directory.
*
* @param mixed $sName Pass nothing to remove all cached files, or the STRING name of the file to just remove that file.
* @return bool TRUE if removed, FALSE if not.
*/
public function remove($sName = null)
{
if ($sName === null)
{
foreach ($this->getAll() as $aFile)
{
@unlink(PHPFOX_DIR_CACHE . $aFile['name']);
}
return true;
}
if (file_exists(PHPFOX_DIR_CACHE . $sName))
{
@unlink(PHPFOX_DIR_CACHE . $sName);
return true;
}
return false;
}
/**
* Parse a templates content and convert it into PHP.
*
* @see self::_parse()
* @param string $sData Content of the template.
* @param bool $bRemoveHeader TRUE to remove cache headers in the template.
* @return string Parsed and converted content.
*/
public function parse($sData, $bRemoveHeader = false)
{
$sData = $this->_parse($sData, $bRemoveHeader);
return $sData;
}
/**
* Parse a templates content and convert it into PHP.
*
* @param string $sData Content of the template.
* @param bool $bRemoveHeader TRUE to remove cache headers in the template.
* @return string Parsed and converted content.
*/
private function _parse($sData, $bRemoveHeader = false)
{
$sLdq = preg_quote($this->sLeftDelim);
$sRdq = preg_quote($this->sRightDelim);
$aText = array();
$sCompiledText = '';
// Remove phpFox SVN headers
$sData = preg_replace("/<!phpfox(.*?)>/is", "", $sData);
// Add a security token in a form
// $sData = preg_replace("/<form(.*?)>(.*?)</form>/ise", "'' . $this->_parseForm('$1', '$2') .''", $sData);
$sData = preg_replace_callback("/<form(.*?)>(.*?)</form>/is", array($this, '_parseForm'), $sData);
// remove all comments
$sData = preg_replace("/{$sLdq}*(.*?)*{$sRdq}/se", "", $sData);
// remove literal blocks
preg_match_all("!{$sLdq}s*literals*{$sRdq}(.*?){$sLdq}s*/literals*{$sRdq}!s", $sData, $aMatches);
$this->_aLiterals = $aMatches[1];
$sData = preg_replace("!{$sLdq}s*literals*{$sRdq}(.*?){$sLdq}s*/literals*{$sRdq}!s", stripslashes($sLdq . "literal" . $sRdq), $sData);
// remove php blocks
preg_match_all("!{$sLdq}s*phps*{$sRdq}(.*?){$sLdq}s*/phps*{$sRdq}!s", $sData, $aMatches);
$this->_aPhpBlocks = $aMatches[1];
$sData = preg_replace("!{$sLdq}s*phps*{$sRdq}(.*?){$sLdq}s*/phps*{$sRdq}!s", stripslashes($sLdq . "php" . $sRdq), $sData);
$aText = preg_split("!{$sLdq}.*?{$sRdq}!s", $sData);
preg_match_all("!{$sLdq}s*(.*?)s*{$sRdq}!s", $sData, $aMatches);
$aTags = $aMatches[1];
$aCompiledTags = array();
$iCompiledTags = count($aTags);
for ($i = 0, $iForMax = $iCompiledTags; $i < $iForMax; $i++)
{
$aCompiledTags[] = $this->_compileTag($aTags[$i]);
}
$iCountCompiledTags = count($aCompiledTags);
for ($i = 0, $iForMax = $iCountCompiledTags; $i < $iForMax; $i++)
{
if ($aCompiledTags[$i] == '')
{
$aText[$i+1] = preg_replace('~^(rn|r|n)~', '', $aText[$i+1]);
}
$sCompiledText .= $aText[$i].$aCompiledTags[$i];
}
$sCompiledText .= $aText[$i];
foreach ($this->_aRequireStack as $mKey => $mValue)
{
$sCompiledText = '<?php require_once(''. PHPFOX_DIR_TPL_PLUGIN . $mKey . ''); $this->_register("' . $mValue[0] . '", "' . $mValue[1] . '", "' . $mValue[2] . '"); ?>' . $sCompiledText;
}
$sCompiledText = preg_replace('!?>n?<?php!', '', $sCompiledText);
$sCompiledText = '<?php /* Cached: ' . date("F j, Y, g:i a", time()) . ' */ ?>' . "n" . $sCompiledText;
return $sCompiledText;
}
/**
* Parse HTML forms. This is where we automatically add our security token.
*
* @param string $aMatches ARRAY of regex matches
* @return string Converted form.
*/
private function _parseForm($aMatches)
{
$sForm = $aMatches[1];
$sData = $aMatches[2];
$sForm = '<form' . stripslashes($sForm) . ">";
if (!strpos($sData, '{token}'))
{
$sForm .= "n" . '<?php echo '<div><input type="hidden" name="' . Phpfox::getTokenName() . '[security_token]" value="' . Phpfox::getService('log.session')->getToken() . '" /></div>'; ?>';
}
$sForm .= stripslashes($sData) . "n";
$sForm .= '</form>' . "n";
return $sForm;
}
/**
* Compile custom tags. (eg. {literal})
*
* @param string $sTag Name of the tag to parse.
* @return string Converted block of code based on the tag.
*/
private function _compileTag($sTag)
{
preg_match_all('/(?:(' . $this->_sVarRegexp . '|' . $this->_sSvarRegexp . '|/?' . $this->_sFuncRegexp . ')(' . $this->_sModRegexp . '*)(?:s*[,.]s*)?)(?:s+(.*))?/xs', $sTag, $aMatches);
if ($aMatches[1][0]{0} == '$' || $aMatches[1][0]{0} == "'" || $aMatches[1][0]{0} == '"')
{
return "<?php echo " . $this->_parseVariables($aMatches[1], $aMatches[2]) . "; ?>";
}
$sTagCommand = $aMatches[1][0];
$sTagModifiers = !empty($aMatches[2][0]) ? $aMatches[2][0] : null;
$sTagArguments = !empty($aMatches[3][0]) ? $aMatches[3][0] : null;
return $this->_parseFunction($sTagCommand, $sTagModifiers, $sTagArguments);
}
/**
* Parse all the custom tags used within templates. In templates we
* do not use conventional PHP code as we seperate PHP logic from the
* template. The tags we use work similar to that off SMARTY.
*
* @param string $sFunction Name of the function.
* @param string $sModifiers Modifiers.
* @param string $sArguments Any arguments we are passing.
* @return string Converted PHP value of the function.
*/
private function _parseFunction($sFunction, $sModifiers, $sArguments)
{
switch ($sFunction)
{
/**
* SMARTY
*/
case 'ldelim':
return $this->sLeftDelim;
break;
case 'rdelim':
return $this->sRightDelim;
break;
case 'php':
list (,$sPhpBlock) = each($this->_aPhpBlocks);
return '<?php ' . $sPhpBlock . ' ?>';
break;
case 'for':
$sArguments = preg_replace("/\$([A-Za-z0-9]+)/ise", "'' . $this->_parseVariable('$$1') . ''", $sArguments);
return '<?php for (' . $sArguments . '): ?>';
break;
case '/for':
return "<?php endfor; ?>";
break;
case 'left_curly':
return '{';
break;
case 'right_curly':
return '}';
break;
case 'l':
return '{';
break;
case 'r':
return '}';
break;
case 'assign':
$aArgs = $this->_parseArgs($sArguments);
if (!isset($aArgs['var']))
{
return '';
}
if (!isset($aArgs['value']))
{
return '';
}
return '<?php $this->assign('' . $this->_removeQuote($aArgs['var']) . '', ' . $aArgs['value'] . '); ?>';
break;
case 'literal':
list (,$sLiteral) = each($this->_aLiterals);
return "<?php echo '" . str_replace("'", "'", $sLiteral) . "'; ?>n";
break;
case 'foreach':
array_push($this->_aForeachElseStack, false);
$aArgs = $this->_parseArgs($sArguments);
if (!isset($aArgs['from']))
{
return '';
}
if (!isset($aArgs['value']) && !isset($aArgs['item']))
{
return '';
}
if (isset($aArgs['value']))
{
$aArgs['value'] = $this->_removeQuote($aArgs['value']);
}
elseif (isset($aArgs['item']))
{
$aArgs['value'] = $this->_removeQuote($aArgs['item']);
}
(isset($aArgs['key']) ? $aArgs['key'] = "$this->_aVars['".$this->_removeQuote($aArgs['key'])."'] => " : $aArgs['key'] = '');
$bIteration = (isset($aArgs['name']) ? true : false);
$sResult = '<?php if (count((array)' . $aArgs['from'] . ')): ?>' . "n";
if ($bIteration)
{
$sResult .= '<?php $this->_aPhpfoxVars['iteration']['' . $aArgs['name'] . ''] = 0; ?>' . "n";
}
$sResult .= '<?php foreach ((array) ' . $aArgs['from'] . ' as ' . $aArgs['key'] . '$this->_aVars['' . $aArgs['value'] . '']): ?>';
if ($bIteration)
{
$sResult .= '<?php $this->_aPhpfoxVars['iteration']['' . $aArgs['name'] . '']++; ?>' . "n";
}
return $sResult;
break;
case 'foreachelse':
$this->_aForeachElseStack[count($this->_aForeachElseStack)-1] = true;
return "<?php endforeach; else: ?>";
break;
case '/foreach':
if (array_pop($this->_aForeachElseStack))
{
return "<?php endif; ?>";
}
else
{
return "<?php endforeach; endif; ?>";
}
break;
case 'if':
return $this->_compileIf($sArguments);
break;
case 'else':
return "<?php else: ?>";
break;
case 'elseif':
return $this->_compileIf($sArguments, true);
break;
case '/if':
return "<?php endif; ?>";
break;
case 'section':
array_push($this->_aSectionelseStack, false);
return $this->_compileSectionStart($sArguments);
break;
case 'sectionelse':
$this->_aSectionelseStack[count($this->_aSectionelseStack)-1] = true;
return "<?php endfor; else: ?>";
break;
case '/section':
if (array_pop($this->_aSectionelseStack))
{
return "<?php endif; ?>";
}
else
{
return "<?php endfor; endif; ?>";
}
break;
/**
* phpFox
*/
case 'title':
return '<?php echo $this->getTitle(); ?>';
break;
case 'header':
return '<?php echo $this->getHeader(); ?>';
break;
case 'block':
$aArgs = $this->_parseArgs($sArguments);
$sContent = '';
$sContent .= '<?php if ($this->bIsSample): ?>';
$sContent .= '<?php if (defined('PHPFOX_NO_WINDOW_CLICK')): ?>';
$sContent .= '<?php if (defined('PHPFOX_IS_AD_SAMPLE')): Phpfox::getBlock('ad.sample', array('block_id' => ' . $this->_removeQuote($aArgs['location']) . ')); endif; ?>';
$sContent .= '<?php else: ?>';
$sContent .= '<div class="sample"<?php echo (!defined('PHPFOX_NO_WINDOW_CLICK') ? " onclick="window.parent.$('#location').val(' . $aArgs['location'] . '); window.parent.tb_remove();"" : ' style="cursor:default;"'); ?>><?php echo Phpfox::getPhrase('core.block') ; ?> ' . $this->_removeQuote($aArgs['location']) . '<?php if (defined('PHPFOX_IS_AD_SAMPLE')): echo Phpfox::getService('ad')->getSizeForBlock("' . $this->_removeQuote($aArgs['location']) . '"); endif; ?>';
$sContent .= '<?php if (defined('PHPFOX_IS_AD_SAMPLE')): Phpfox::getBlock('ad.sample', array('block_id' => ' . $this->_removeQuote($aArgs['location']) . ')); endif; ?>';
$sContent .= '</div>';
$sContent .= '<?php endif; ?>';
$sContent .= '<?php else: ?>';
$sContent .= '<?php $aBlocks = Phpfox::getLib('phpfox.module')->getModuleBlocks(' . $aArgs['location'] . '); ?>';
/* if user is designing the profile or the dashboard showing the block containers is needed */
$sContent .= '<?php $aUrl = Phpfox::getLib('url')->getParams(); ?>';
$sContent .= '<?php $bDesigning = Phpfox::getService("theme")->isInDnDMode(); ?>';
$sContent .= '<?php if (!Phpfox::isAdminPanel() && (PHPFOX_DESIGN_DND || $bDesigning || (defined("PHPFOX_IN_DESIGN_MODE") && PHPFOX_IN_DESIGN_MODE && in_array(' . $aArgs['location'] . ', array(1, 2, 3))))):?> <div class="js_can_move_blocks js_sortable_empty" id="js_can_move_blocks_'. str_replace("'",'',$aArgs['location']).'"> <div class="block js_sortable dnd_block_info">Position '. $aArgs['location'] .'</div></div><?php endif; ?>';
$sContent .= '<?php foreach ((array)$aBlocks as $sBlock): ?>' . "n";
$sContent .= '<?php if (!Phpfox::isAdminPanel() && (PHPFOX_DESIGN_DND || $bDesigning || (defined("PHPFOX_IN_DESIGN_MODE") && PHPFOX_IN_DESIGN_MODE && in_array(' . $aArgs['location'] . ', array(1, 2, 3))))):?>';
$sContent .= '<div class="js_can_move_blocks" id="js_can_move_blocks_'. str_replace("'",'',$aArgs['location']).'">';
$sContent .= '<?php endif; ?>' . "n";
$sContent .= '<?php if (is_array($sBlock) && (!defined('PHPFOX_CAN_MOVE_BLOCKS') || !in_array(' . $aArgs['location'] . ', array(1, 2, 3, 4)))): ?>';
$sContent .= '<?php eval(' ?>' . $sBlock[0] . '<?php '); ?>';
$sContent .= '<?php else: ?>';
$sContent .= '<?php Phpfox::getBlock($sBlock); ?>';
$sContent .= '<?php endif; ?>' . "n";
$sContent .= '<?php if (!Phpfox::isAdminPanel() && (PHPFOX_DESIGN_DND || $bDesigning || (defined("PHPFOX_IN_DESIGN_MODE") && PHPFOX_IN_DESIGN_MODE && in_array(' . $aArgs['location'] . ', array(1, 2, 3))))):?>';
$sContent .= '</div>';
$sContent .= '<?php endif; ?>' . "n";
$sContent .= '<?php endforeach; ?>';
$sContent .= '<?php if (!Phpfox::isAdminPanel()): ?>';
$sContent .= '<?php Phpfox::getBlock('ad.display', array('block_id' => ' . $this->_removeQuote($aArgs['location']) . ')); ?>';
$sContent .= '<?php endif; ?>';
$sContent .= '<?php endif; ?>';
return $sContent;
break;
case 'branding':
$sContent = '
<?php if (!Phpfox::getParam('core.branding')): ?>
<?php echo PhpFox::link(); ?>
<div>
phpFox © <?php echo date('Y', PHPFOX_TIME); ?>
<?php if (Phpfox::getParam('core.site_copyright') != ''): ?><br /><?php echo Phpfox::getParam('core.site_copyright'); ?><?php endif; ?>
</div>
<?php else: ?>
<?php echo Phpfox::getParam('core.site_copyright'); ?>
<?php endif; ?>
';
return $sContent;
break;
case 'product_branding':
$sContent = '<?php if(!Phpfox::getParam('core.branding')) { echo PhpFox::link(); } ?>';
return $sContent;
break;
case 'image_path':
return '<?php echo $this->getStyle('image'); ?>';
break;
case 'module_path':
return '<?php echo Phpfox::getParam('core.url_module'); ?>';
break;
case 'permalink':
$aArgs = $this->_parseArgs($sArguments);
$aExtra = $aArgs;
unset($aExtra['module'], $aExtra['id'], $aExtra['title']);
return '<?php echo Phpfox::permalink(' . $aArgs['module'] . ', ' . $this->_removeQuote($aArgs['id']) . '' . (empty($aArgs['title']) ? ', null' : ', ' . $this->_removeQuote($aArgs['title'])) . ', false, null, (array) ' . var_export($aExtra, true) . '); ?>';
break;
case 'url':
$aArgs = $this->_parseArgs($sArguments);
if (!isset($aArgs['link']))
{
return '';
}
$sLink = $aArgs['link'];
unset($aArgs['link']);
$sArray = '';
if (count($aArgs))
{
$sArray = ', array(';
foreach ($aArgs as $sKey => $sValue)
{
$sArray .= ''' . $sKey . '' => ' . $sValue . ',';
}
$sArray = rtrim($sArray, ',') . ')';
}
return '<?php echo Phpfox::getLib('phpfox.url')->makeUrl(' . $sLink . $sArray . '); ?>';
break;
case 'phrase':
$aArgs = $this->_parseArgs($sArguments);
if (!isset($aArgs['var']))
{
return '';
}
$sVar = $aArgs['var'];
unset($aArgs['var']);
$sArray = '';
$sLanguage = '';
if (count($aArgs))
{
$sArray = ', array(';
foreach ($aArgs as $sKey => $sValue)
{
if ($sKey == 'language')
{
$sLanguage = $sValue;
}
$sArray .= ''' . $sKey . '' => ' . $sValue . ',';
}
$sArray = rtrim($sArray, ',') . ')';
}
return '<?php echo Phpfox::getPhrase(' . $sVar . '' . $sArray . ($sLanguage != '' ? ',false,null,'.$sLanguage : '') .'); ?>';
break;
case 'error':
$sContent = '<?php if (!$this->bIsSample): ?>';
$sContent .= '<?php $this->getLayout('error'); ?>';
$sContent .= '<?php endif; ?>';
return $sContent;
break;
case 'breadcrumb':
$sContent = '<?php if (!$this->bIsSample): ?>';
$sContent .= '<?php $this->getLayout('breadcrumb'); ?>';
$sContent .= '<?php endif; ?>';
return $sContent;
break;
case 'search':
$sContent = '<?php if (!$this->bIsSample): ?>';
$sContent .= '<?php $this->getLayout('search'); ?>';
$sContent .= '<?php endif; ?>';
return $sContent;
break;
case 'content':
$sContent = '<?php if (!$this->bIsSample): ?><div id="site_content">';
$sContent .= '<?php if (isset($this->_aVars['bSearchFailed'])): ?>';
$sContent .= '<div class="message">Unable to find anything with your search criteria.</div>';
$sContent .= '<?php else: ?>';
$sContent .= '<?php Phpfox::getLib('phpfox.module')->getControllerTemplate(); ?>';
$sContent .= '<?php endif; ?></div>';
$sContent .= '<?php endif; ?>';
return $sContent;
break;
case 'layout':
$aArgs = $this->_parseArgs($sArguments);
return '<?php $this->getLayout(' . $aArgs['file'] . '); ?>';
return $sContent;
break;
case 'pager':
$sReturn = '<?php if (!isset($this->_aVars['aPager'])): Phpfox::getLib('pager')->set(array('page' => Phpfox::getLib('request')->getInt('page'), 'size' => Phpfox::getLib('search')->getDisplay(), 'count' => Phpfox::getLib('search')->getCount())); endif; ?>';
$sReturn .= '<?php $this->getLayout('pager'); ?>';
return $sReturn;
break;
case 'unset':
$aArgs = $this->_parseArgs($sArguments);
return '<?php unset(' . implode(', ', $aArgs) . '); ?>';
break;
case 'token':
return '<?php echo '<div><input type="hidden" name="' . Phpfox::getTokenName() . '[security_token]" value="' . Phpfox::getService('log.session')->getToken() . '" /></div>'; ?>';
break;
case 'img':
$aArgs = $this->_parseArgs($sArguments);
$sArray = '';
foreach ($aArgs as $sKey => $sValue)
{
$sArray .= ''' . $sKey . '' => ' . $sValue . ',';
}
return '<?php echo Phpfox::getLib('phpfox.image.helper')->display(array(' . rtrim($sArray, ',') . ')); ?>';
break;
case 'plugin':
$aArgs = $this->_parseArgs($sArguments);
if (!isset($aArgs['call']))
{
return '';
}
return '<?php (($sPlugin = Phpfox_Plugin::get('' . $this->_removeQuote($aArgs['call']) . '')) ? eval($sPlugin) : false); ?>';
break;
case 'template':
$aArgs = $this->_parseArgs($sArguments);
$mContent = Phpfox::getLib('template')->getTemplateFile($this->_removeQuote($aArgs['file']), true);
if (is_array($mContent))
{
$mContent = $mContent[0];
}
else
{
$mContent = file_get_contents($mContent);
}
$mContent = $this->_parse($mContent, true);
if (count($aArgs) > 1)
{
$sAssign = 'array(';
$sClear = 'array(';
foreach ($aArgs as $sKey => $mValue)
{
if ($sKey == 'file')
{
continue;
}
$sAssign .= ''' . $sKey . '' => ' . $mValue . ',';
$sClear .= ''' . $sKey . '',';
}
$sAssign = rtrim($sAssign, ',');
$sAssign .= ')';
$sClear = rtrim($sClear, ',');
$sClear .= ')';
return '<?php $this->assign(' . $sAssign . '); ?>' . $mContent . '<?php $this->clean(' . $sClear . '); ?>';
}
else
{
return $mContent;
}
break;
case 'parse_image':
$aArgs = $this->_parseArgs($sArguments);
$sArray = '';
foreach ($aArgs as $sKey => $sValue)
{
$sArray .= ''' . $sKey . '' => ' . $sValue . ',';
}
return '<?php Phpfox::getLib('parse.output')->setImageParser(array(' . rtrim($sArray, ',') . ')); ?>';
break;
case 'module':
$aArgs = $this->_parseArgs($sArguments);
$sModule = $aArgs['name'];
unset($aArgs['name']);
$sArray = '';
foreach ($aArgs as $sKey => $sValue)
{
if (substr($sValue, 0, 1) != '$' && $sValue !== 'true' && $sValue !== 'false')
{
$sValue = ''' . $this->_removeQuote($sValue) . ''';
}
$sArray .= ''' . $sKey . '' => ' . $sValue . ',';
}
return '<?php Phpfox::getBlock(' . $sModule . ', array(' . rtrim($sArray, ',') . ')); ?>';
break;
case 'editor':
$aArgs = $this->_parseArgs($sArguments);
$aParams = array();
foreach ($aArgs as $sKey => $mParam)
{
$aParams[$sKey] = $this->_removeQuote($mParam);
}
$sReturn = '<?php Phpfox::getBlock('attachment.share'); ?>';
$sReturn .= '<?php echo Phpfox::getLib('phpfox.editor')->get(' . $aArgs['id'] . ', ' . var_export($aParams, true) . '); ?>';
return $sReturn;
break;
case 'nomoreie':
return '<!--[if lt IE 7]><div style="border: 1px solid #F7941D; background: #FEEFDA; text-align: center; clear: both; height: 75px; position: relative; margin:0px 10px 10px 10px;">
<div style="width: 640px; margin: 0 auto; text-align: left; padding: 0; overflow: hidden; color: black;">
<div style="width: 75px; float: left;"><img src="http://www.ie6nomore.com/files/theme/ie6nomore-warning.jpg" alt="' . Phpfox::getPhrase('core.warning') . '" /></div>
<div style="width: 275px; float: left; font-family: Arial, sans-serif;">
<div style="font-size: 14px; font-weight: bold; margin-top: 12px;">' . Phpfox::getPhrase('core.you_are_using_an_outdated_browser') . '</div>
<div style="font-size: 12px; margin-top: 6px; line-height: 12px;">' . Phpfox::getPhrase('core.for_a_better_experience_using_this_site_please_upgrade_to_a_modern_web_browser') . '</div>
</div>
<div style="width: 75px; float: left;"><a href="http://www.firefox.com" target="_blank"><img src="http://www.ie6nomore.com/files/theme/ie6nomore-firefox.jpg" style="border: none;" alt="' . Phpfox::getPhrase('core.get_firefox') . '"/></a></div>
<div style="width: 75px; float: left;"><a href="http://www.browserforthebetter.com/download.html" target="_blank"><img src="http://www.ie6nomore.com/files/theme/ie6nomore-ie8.jpg" style="border: none;" alt="' . Phpfox::getPhrase('core.get_internet_explorer') . '" /></a></div>
<div style="width: 73px; float: left;"><a href="http://www.apple.com/safari/download/" target="_blank"><img src="http://www.ie6nomore.com/files/theme/ie6nomore-safari.jpg" style="border: none;" alt="' . Phpfox::getPhrase('core.get_safari') . '" /></a></div>
<div style="float: left;"><a href="http://www.google.com/chrome" target="_blank"><img src="http://www.ie6nomore.com/files/theme/ie6nomore-chrome.jpg" style="border: none;" alt="' . Phpfox::getPhrase('core.get_google_chrome') . '" /></a></div>
</div>
</div><![endif]-->';
break;
case 'value':
$aArgs = $this->_parseArgs($sArguments);
$aArgs = array_map(array($this, '_removeQuote'), $aArgs);
switch($aArgs['type'])
{
case 'input':
$sContent = '<?php $aParams = (isset($aParams) ? $aParams : Phpfox::getLib('phpfox.request')->getArray('val')); echo (isset($aParams['' . $aArgs['id'] . '']) ? Phpfox::getLib('phpfox.parse.output')->clean($aParams['' . $aArgs['id'] . '']) : (isset($this->_aVars['aForms']['' . $aArgs['id'] . '']) ? Phpfox::getLib('phpfox.parse.output')->clean($this->_aVars['aForms']['' . $aArgs['id'] . '']) : ' . (isset($aArgs['default']) ? ''' . $aArgs['default'] . ''' : '''' ) . ')); ?>' . "n";
break;
case 'radio':
$sContent = '<?php $aParams = (isset($aParams) ? $aParams : Phpfox::getLib('phpfox.request')->getArray('val'));';
$sContent .= "n".'if (isset($this->_aVars['aForms']) && is_numeric(''.$aArgs["id"].'') && in_array(''.$aArgs["id"].'', $this->_aVars['aForms']) ){echo ' checked="checked"';}';
$sContent .= "n".'if ((isset($aParams['' . $aArgs['id'] . '']) && $aParams['' . $aArgs['id'] . ''] == '' . $aArgs['default'] . ''))';
$sContent .= "n".'{echo ' checked="checked" ';}';
$sContent .= "n".'else';
$sContent .= "n".'{';
$sContent .= "n".' if (isset($this->_aVars['aForms']) && isset($this->_aVars['aForms']['' . $aArgs['id'] . '']) && !isset($aParams['' . $aArgs['id'] . '']) && $this->_aVars['aForms']['' . $aArgs['id'] . ''] == '' . $aArgs['default'] . '')';
$sContent .= "n".' {';
$sContent .= "n".' echo ' checked="checked" ';}';
$sContent .= "n".' else';
$sContent .= "n".' {';
if (isset($aArgs['selected']))
{
$sContent .= "n".' if (!isset($this->_aVars['aForms']) || ((isset($this->_aVars['aForms']) && !isset($this->_aVars['aForms']['' . $aArgs['id'] . '']) && !isset($aParams['' . $aArgs['id'] . '']))))';
$sContent .= "n".'{';
$sContent .= "n".' echo ' checked="checked"';';
$sContent .= "n".'}';
}
$sContent .= "n".' }';
$sContent .= "n".'}';
$sContent .= "n".'?>' . " n";
break;
case 'checkbox':
case 'multiselect':
case 'select':
$bIsCheckbox = ($aArgs['type'] == 'checkbox' ? 'checked="checked"' : 'selected="selected"');
$aArgs['default'] = $this->_removeQuote($aArgs['default']);
if (substr($aArgs['default'], 0, 1) == '$')
{
$sDefault = $aArgs['default'];
}
elseif (substr($aArgs['default'], 0, 2) == ".$")
{
$sDefault = trim($aArgs['default'], '.');
}
else
{
$sDefault = "'{$aArgs['default']}'";
}
$sContent = '<?php $aParams = (isset($aParams) ? $aParams : Phpfox::getLib('phpfox.request')->getArray('val'));'.
"n" . '';
$sContent .= "nn".'if (isset($this->_aVars['aField']) && isset($this->_aVars['aForms'][$this->_aVars['aField']['field_id']]) && !is_array($this->_aVars['aForms'][$this->_aVars['aField']['field_id']]))
{
$this->_aVars['aForms'][$this->_aVars['aField']['field_id']] = array($this->_aVars['aForms'][$this->_aVars['aField']['field_id']]);
}';
$sContent .= "nn".'if (isset($this->_aVars['aForms']'. (isset($aArgs['parent']) ? '[''.$aArgs["parent"].'']' : '') .')';
$sContent .= "n".' && is_numeric(''.$aArgs["id"].'') && in_array(''.$aArgs["id"].'', $this->_aVars['aForms']'. (isset($aArgs['parent']) ? '[''.$aArgs["parent"].'']' : '') .'))
'."n".'{
echo ' ' . $bIsCheckbox . ' ';
}'."n".'
if (isset($aParams['' . $aArgs['id'] . ''])
&& $aParams['' . $aArgs['id'] . ''] == ' . $sDefault . ')'."n".'
{'."n".'
echo ' ' . $bIsCheckbox . ' ';'."n".'
}'."n".'
else'."n".'
{'."n".'
if (isset($this->_aVars['aForms']['' . $aArgs['id'] . ''])
&& !isset($aParams['' . $aArgs['id'] . ''])
&& $this->_aVars['aForms']['' . $aArgs['id'] . ''] == ' . $sDefault . ')
{
echo ' ' . $bIsCheckbox . ' ';
}
else
{
echo ' . (isset($aArgs['selected']) ? '" ' . str_replace('"', '"', $bIsCheckbox) . '"' : '""') . ';
}
}
?>' . "n";
break;
case 'wysiwyg':
case 'textarea':
$sContent = '<?php $aParams = (isset($aParams) ? $aParams : Phpfox::getLib('phpfox.request')->getArray('val')); echo (isset($aParams['' . $aArgs['id'] . '']) ? Phpfox::getLib('phpfox.parse.output')->clean($aParams['' . $aArgs['id'] . '']) : (isset($this->_aVars['aForms']['' . $aArgs['id'] . '']) ? Phpfox::getLib('phpfox.parse.output')->clean($this->_aVars['aForms']['' . $aArgs['id'] . '']) : '')); ?>' . "n";
break;
}
return $sContent;
break;
case 'translate':
$aArgs = $this->_parseArgs($sArguments);
$sPrefix = (isset($aArgs['prefix']) ? ', ' . $aArgs['prefix'] : '');
return '<?php echo Phpfox::getLib('phpfox.locale')->translate(' . $aArgs['var'] . $sPrefix . '); ?>';
break;
case 'help':
$aArgs = $this->_parseArgs($sArguments);
return '<?php Phpfox::getBlock('help.popup', array('phrase' => ' . $aArgs['var'] . ')); ?>';
break;
case 'param':
$aArgs = $this->_parseArgs($sArguments);
return '<?php echo Phpfox::getParam('' . $this->_removeQuote($aArgs['var']) . ''); ?>';
break;
case 'request':
$aArgs = $this->_parseArgs($sArguments);
return '<?php echo Phpfox::getLib('request')->get('' . $this->_removeQuote($aArgs['var']) . ''); ?>';
break;
case 'required':
return '<?php if (Phpfox::getParam('core.display_required')): ?><span class="required"><?php echo Phpfox::getParam('core.required_symbol'); ?></span><?php endif; ?>';
break;
case 'select_date':
/*
* @param string $aArgs['time_separator'] the variable for the language phrase
*/
$aArgs = $this->_parseArgs($sArguments);
$sPrefix = '';
if (isset($aArgs['prefix']))
{
$sPrefix = $this->_removeQuote($aArgs['prefix']);
}
$bUseJquery = Phpfox::getParam('core.use_jquery_datepicker');
if (isset($aArgs['bUseDatepicker']) && $aArgs['bUseDatepicker'] == 'false')
{
$bUseJquery = false;
}
$sMonth = '<select name="val[' . $sPrefix . 'month]" id="' . $sPrefix . 'month" class="js_datepicker_month">' . "n";
if (!isset($aArgs['default_all']))
{
$sMonth .= "tt" . '<option value=""><?php echo Phpfox::getPhrase('core.month'); ?>:</option>' . "n";
}
$aMonths = array(
'January',
'February',
'March',
'April',
'May',
'June',
'July',
'August',
'September',
'October',
'November',
'December'
);
$i = 0;
foreach ($aMonths as $sNewMonth)
{
$i++;
$sMonth .= "ttt" . '<option value="' . $i . '"' . $this->_parseFunction('value', '', "type='select' id='{$sPrefix}month' default='{$i}'") . (isset($aArgs['default_all']) ? '<?php echo (!isset($this->_aVars['aForms']['' . $sPrefix . 'month']) ? ('' . $i . '' == Phpfox::getTime('n') ? ' selected="selected"' : '') : ''); ?>' : '') . '><?php echo (defined('PHPFOX_INSTALLER') ? '' . str_replace("'", "'", $sNewMonth) . '' : Phpfox::getPhrase('core.' . strtolower($sNewMonth) . '')); ?></option>' . "n";
}
$sMonth .= "tt" . '</select>' . "n";
$sDay = "tt" . '<select name="val[' . $sPrefix . 'day]" id="' . $sPrefix . 'day" class="js_datepicker_day">' . "n";
if (!isset($aArgs['default_all']))
{
$sDay .= "tt" . '<option value=""><?php echo Phpfox::getPhrase('core.day'); ?>:</option>' . "n";
}
for ($i = 1; $i <= 31; $i++)
{
$sDay .= "ttt" . '<option value="' . $i . '"' . $this->_parseFunction('value', '', "type='select' id='{$sPrefix}day' default='{$i}'") . (isset($aArgs['default_all']) ? '<?php echo (!isset($this->_aVars['aForms']['' . $sPrefix . 'day']) ? ('' . $i . '' == ' . (isset($aArgs['start_hour']) ? '((Phpfox::getTime('H') == 23 && (Phpfox::getTime('H') + ' . $aArgs['start_hour'] . ') >= 00) ? (Phpfox::getTime('j') + 1) : Phpfox::getTime('j'))' : 'Phpfox::getTime('j')') . ' ? ' selected="selected"' : '') : ''); ?>' : '') . '>' . $i . '</option>' . "n";
}
$sDay .= "tt" . '</select>' . "n";
if ($this->_removeQuote($aArgs['start_year']) == 'current_year')
{
$aArgs['start_year'] = date('Y');
}
else if (preg_match('/[a-z]+.{1}[a-z0-9_]+/', $this->_removeQuote($aArgs['start_year']), $aMatch) > 0)
{
$aArgs['start_year'] = Phpfox::getParam($aMatch[0]);
}
if (substr($this->_removeQuote($aArgs['end_year']), 0, 1) == '+')
{
$aArgs['end_year'] = (date('Y') + substr_replace($this->_removeQuote($aArgs['end_year']), '', 0, 1));
}
else if (preg_match('/[a-z]+.{1}[a-z0-9_]+/', $this->_removeQuote($aArgs['end_year']), $aMatch) > 0)
{
$aArgs['end_year'] = Phpfox::getParam($aMatch[0]);
}
if (isset($aArgs['sort_years']) && $aArgs['sort_years'] == ''DESC'')
{
$sTemp = $aArgs['start_year'];
$aArgs['start_year'] = $aArgs['end_year'];
$aArgs['end_year'] = $sTemp;
}
$sYear = '<?php $aYears = range(' . $aArgs['start_year'] . ', ' . $aArgs['end_year'] . '); ?>';
$sYear .= '<?php $aParams = (isset($aParams) ? $aParams : Phpfox::getLib('phpfox.request')->getArray('val')); ?>';
$sYear .= "tt" . '<select name="val[' . $sPrefix . 'year]" id="' . $sPrefix . 'year" class="js_datepicker_year">' . "n";
if (!isset($aArgs['default_all']))
{
$sYear .= "tt" . '<option value=""><?php echo Phpfox::getPhrase('core.year'); ?>:</option>' . "n";
}
$sYear .= '<?php foreach ($aYears as $iYear): ?>';
$sYear .= "ttt" . '<option value="<?php echo $iYear; ?>"<?php echo ((isset($aParams['' . $sPrefix . 'year']) && $aParams['' . $sPrefix . 'year'] == $iYear) ? ' selected="selected"' : (!isset($this->_aVars['aForms']['' . $sPrefix . 'year']) ? ($iYear == Phpfox::getTime('Y') ? ' selected="selected"' : '') : ($this->_aVars['aForms']['' . $sPrefix . 'year'] == $iYear ? ' selected="selected"' : ''))); ?>><?php echo $iYear; ?></option>' . "n";
$sYear .= '<?php endforeach; ?>';
$sYear .= "tt" . '</select>' . "n";
$aSep = $this->_removeQuote($aArgs['field_separator']);
$sReturn = '';
switch (Phpfox::getParam('core.date_field_order'))
{
case 'DMY':
$sReturn = $sDay . $aSep . $sMonth . $aSep . $sYear;
break;
case 'YMD':
$sReturn = $sYear . $aSep . $sMonth . $aSep . $sDay;
break;
// MDY
default:
$sReturn = $sMonth . $aSep . $sDay . $aSep . $sYear;
break;
}
if ($bUseJquery)
{
$sValue = '';
$sValue .= '<?php if (isset($aParams['' . $sPrefix . 'month'])): ?>';
$sValue .= '<?php echo $aParams['' . $sPrefix . 'month'] . '/'; ?>';
$sValue .= '<?php echo $aParams['' . $sPrefix . 'day'] . '/'; ?>';
$sValue .= '<?php echo $aParams['' . $sPrefix . 'year']; ?>';
$sValue .= '<?php elseif (isset($this->_aVars['aForms'])): ?>';
$sValue .= '<?php if (isset($this->_aVars['aForms']['' . $sPrefix . 'month'])): ?>';
$sValue .= '<?php switch(Phpfox::getParam("core.date_field_order")){ ?>';
$sValue .= '<?php case "DMY": ?>';
$sValue .= '<?php echo $this->_aVars['aForms']['' . $sPrefix . 'day'] . '/'; ?>';
$sValue .= '<?php echo $this->_aVars['aForms']['' . $sPrefix . 'month'] . '/'; ?>';
$sValue .= '<?php echo $this->_aVars['aForms']['' . $sPrefix . 'year']; ?>';
$sValue .= '<?php break; ?>';
$sValue .= '<?php case "MDY": ?>';
$sValue .= '<?php echo $this->_aVars['aForms']['' . $sPrefix . 'month'] . '/'; ?>';
$sValue .= '<?php echo $this->_aVars['aForms']['' . $sPrefix . 'day'] . '/'; ?>';
$sValue .= '<?php echo $this->_aVars['aForms']['' . $sPrefix . 'year']; ?>';
$sValue .= '<?php break; ?>';
$sValue .= '<?php case "YMD": ?>';
$sValue .= '<?php echo $this->_aVars['aForms']['' . $sPrefix . 'year'] . '/'; ?>';
$sValue .= '<?php echo $this->_aVars['aForms']['' . $sPrefix . 'month'] . '/'; ?>';
$sValue .= '<?php echo $this->_aVars['aForms']['' . $sPrefix . 'day']; ?>';
$sValue .= '<?php break; ?>';
$sValue .= '<?php } ?>';
$sValue .= '<?php endif; ?>';
$sValue .= '<?php else: ?>';
$sValue .= '<?php switch(Phpfox::getParam("core.date_field_order")){';
$sValue .= ' case "DMY": echo Phpfox::getTime('j') . '/' . Phpfox::getTime('n') . '/' . Phpfox::getTime('Y'); break;';
$sValue .= ' case "MDY": echo Phpfox::getTime('n') . '/' . Phpfox::getTime('j') . '/' . Phpfox::getTime('Y'); break;';
$sValue .= ' case "YMD": echo Phpfox::getTime('Y') . '/' . Phpfox::getTime('n') . '/' . Phpfox::getTime('j'); break;';
$sValue .= '}?>';
/*$sValue .= '<?php echo Phpfox::getTime('n') . '/'; ?>';
$sValue .= '<?php echo Phpfox::getTime('j') . '/'; ?>';
$sValue .= '<?php echo Phpfox::getTime('Y'); ?>'; */
$sValue .= '<?php endif; ?>';
$sReturn = '<div class="js_datepicker_core'. (isset($aArgs['id']) ? str_replace(array('"',"'"),'',$aArgs['id']) : '') .'"><div class="js_datepicker_image"></div><span class="js_datepicker_holder"><div style="display:none;">' . $sReturn . '</div><input type="text" name="js_' . $sPrefix . '_datepicker" value="' . $sValue . '" class="js_date_picker" /></span> ';
}
if (isset($aArgs['add_time']))
{
$sCustomPhrase = $this->_removeQuote($aArgs['time_separator']);
$aCustomPhraseParts = explode('.', $sCustomPhrase);
if (Phpfox::isModule($aCustomPhraseParts[0]))
{
$sReturn .= Phpfox::getPhrase($sCustomPhrase);
}
$aHours = range(0, 23);
$sReturn .= "tt" . '<select name="val[' . $sPrefix . 'hour]" id="' . $sPrefix . 'hour">' . "n";
foreach ($aHours as $iHour)
{
if (isset($aArgs['start_hour']))
{
if (substr($this->_removeQuote($aArgs['start_hour']), 0, 1) == '+')
{
$aArgs['start_hour'] = substr_replace($this->_removeQuote($aArgs['start_hour']), '', 0, 1);
}
}
if (strlen($iHour) < 2)
{
$iHour = '0' . $iHour;
}
$sReturn .= "ttt" . '<option value="' . $iHour . '"' . $this->_parseFunction('value', '', "type='select' id='{$sPrefix}hour' default='{$iHour}'") . (isset($aArgs['default_all']) ? '<?php echo (!isset($this->_aVars['aForms']['' . $sPrefix . 'hour']) ? ('' . $iHour . '' == ' . (isset($aArgs['start_hour']) ? '(Phpfox::getLib('date')->modifyHours('+' . $aArgs['start_hour'] . ''))' : 'Phpfox::getTime('H')') . ' ? ' selected="selected"' : '') : ''); ?>' : '') . '>' . $iHour . '</option>' . "n";
}
$sReturn .= "tt" . '</select> : ' . "n";
$aMinutes = range(0, 59);
$sReturn .= "tt" . '<select name="val[' . $sPrefix . 'minute]" id="' . $sPrefix . 'minute">' . "n";
foreach ($aMinutes as $iMinute)
{
if (strlen($iMinute) < 2)
{
$iMinute = '0' . $iMinute;
}
$sReturn .= "ttt" . '<option value="' . $iMinute . '"' . $this->_parseFunction('value', '', "type='select' id='{$sPrefix}minute' default='{$iMinute}'") . (isset($aArgs['default_all']) ? '<?php echo (!isset($this->_aVars['aForms']['' . $sPrefix . 'minute']) ? ('' . $iMinute . '' == Phpfox::getTime('i') ? ' selected="selected"' : '') : ''); ?>' : '') . '>' . $iMinute . '</option>' . "n";
}
$sReturn .= "tt" . '</select>' . "n";
}
if ($bUseJquery)
{
$sReturn .= '</div>';
}
return $sReturn;
break;
case 'select_location':
$aArgs = $this->_parseArgs($sArguments);
if (isset($aArgs['value_title']) && strpos($aArgs['value_title'], 'phrase var=') !== false)
{
$aArgs['value_title'] = Phpfox::getPhrase(str_replace(array('phrase var=','"',"'"),'',$aArgs['value_title']));
}
$bIsMultiple = isset($aArgs['multiple']) && !empty($aArgs['multiple']);
$sContries = '<select '. ( $bIsMultiple ? 'multiple="multiple" ' : '') .'name="val[' . (isset($aArgs['name']) ? $this->_removeQuote($aArgs['name']) : 'country_iso') . ']'. ($bIsMultiple ? '[]':'') .'" id="' . (isset($aArgs['name']) ? $this->_removeQuote($aArgs['name']) : 'country_iso') . '"' . (isset($aArgs['style']) ? ' style=' . $aArgs['style'] . '' : '') . '>' . "n";
$sContries .= "tt" . '<option value="">' . (isset($aArgs['value_title']) ? $this->_removeQuote($aArgs['value_title']) : '<?php echo Phpfox::getPhrase('core.select'); ?>:') . '</option>' . "n";
foreach (Phpfox::getService('core.country')->get() as $sIso => $sCountry)
{
$sContries .= "ttt" . '<option class="js_country_option" id="js_country_iso_option_' . $sIso . '" value="' . $sIso . '"' . $this->_parseFunction('value', '', "type='select' id='" . (isset($aArgs['name']) ? $this->_removeQuote($aArgs['name']) : 'country_iso') . "' default='{$sIso}'") . '><?php echo (Phpfox::getLib('locale')->isPhrase('core.translate_country_iso_' . strtolower($sIso) . '') ? Phpfox::getPhrase('core.translate_country_iso_' . strtolower($sIso) . '') : '' . str_replace("'", "'", $sCountry) . ''); ?></option>' . "n";
}
$sContries .= "tt" . '</select>';
return $sContries;
break;
case 'select_gender':
$aArgs = $this->_parseArgs($sArguments);
if (isset($aArgs['value_title']) && strpos($aArgs['value_title'], 'phrase var=') !== false)
{
$aArgs['value_title'] = Phpfox::getPhrase(str_replace(array('phrase var=','"',"'"),'',$aArgs['value_title']));
}
$sGenders = '<select name="val[gender]" id="gender">' . "n";
$sGenders .= "tt" . '<option value="">' . (isset($aArgs['value_title']) ? $this->_removeQuote($aArgs['value_title']) : '<?php echo Phpfox::getPhrase('core.select'); ?>:') . '</option>' . "n";
foreach (Phpfox::getService('core')->getGenders(true) as $iKey => $sGender)
{
$sGenders .= "ttt" . '<option value="' . $iKey . '"' . $this->_parseFunction('value', '', "type='select' id='gender' default='{$iKey}'") . '><?php echo Phpfox::getPhrase('' . $sGender . ''); ?></option>' . "n";
}
$sGenders .= "tt" . '</select>';
return $sGenders;
break;
case 'inline_search':
$aArgs = $this->_parseArgs($sArguments);
$aParams = array();
foreach ($aArgs as $sKey => $mParam)
{
$aParams[$sKey] = $this->_removeQuote($mParam);
}
return '<?php echo Phpfox::getLib('phpfox.search.inline')->get(' . var_export($aParams, true) . '); ?>';
break;
case 'application':
$aArgs = $this->_parseArgs($sArguments);
return '<?php echo Phpfox::getService('application')->getForProfile(' . $aArgs['user_id'] . ', ' . $aArgs['location'] . '); ?>';
break;
case 'filter':
$aArgs = $this->_parseArgs($sArguments);
return '<?php echo $this->_aVars['aFilters'][' . $aArgs['key'] . ']; ?>';
break;
case 'jscript':
$aArgs = $this->_parseArgs($sArguments);
return '<?php echo $this->getStyle('static_script', ' . $aArgs['file'] . '' . (isset($aArgs['module']) ? ', ' . $aArgs['module'] . '' : '') . '); ?>';
break;
case 'css':
$aArgs = $this->_parseArgs($sArguments);
return '<?php echo $this->getStyle('css', ' . $aArgs['file'] . '' . (isset($aArgs['module']) ? ', ' . $aArgs['module'] . '' : '') . '); ?>';
break;
case 'moderation':
return '<?php Phpfox::getBlock('core.moderation'); ?>';
break;
case 'section_menu_js':
return '<?php echo Phpfox::getLib('template')->getSectionMenuJavaScript(); ?>';
break;
case 'body':
return '<?php Phpfox::getBlock('core.template-body'); ?>';
break;
case 'notification':
return '<?php Phpfox::getBlock('core.template-notification'); ?>';
break;
case 'menu_account':
return '<?php Phpfox::getBlock('core.template-menuaccount'); ?>';
break;
case 'menu':
return '<?php Phpfox::getBlock('core.template-menu'); ?>';
break;
case 'menu_sub':
return '<?php Phpfox::getBlock('core.template-menusub'); ?>';
break;
case 'menu_footer':
return '<?php Phpfox::getBlock('core.template-menufooter'); ?>';
break;
case 'copyright':
return '<?php Phpfox::getBlock('core.template-copyright'); ?>';
break;
case 'footer':
return '<?php Phpfox::getBlock('core.template-footer'); ?>';
break;
case 'holder_name':
return '<?php Phpfox::getBlock('core.template-holdername'); ?>';
break;
case 'logo':
return '<?php Phpfox::getBlock('core.template-logo'); ?>';
break;
case 'breadcrumb_list':
return '<?php Phpfox::getBlock('core.template-breadcrumblist'); ?>';
break;
case 'breadcrumb_menu':
return '<?php Phpfox::getBlock('core.template-breadcrumbmenu'); ?>';
break;
case 'content_class':
return '<?php Phpfox::getBlock('core.template-contentclass'); ?>';
break;
case 'is_page_view':
return '<?php echo (defined('PHPFOX_IS_PAGES_VIEW') ? 'id="js_is_page"' : ''); ?>';
break;
default:
if ($this->_compileCustomFunction($sFunction, $sModifiers, $sArguments, $sResult))
{
return $sResult;
}
else
{
Phpfox_Error::trigger('Invalid function: ' . $sFunction);
}
return $sResult;
}
}
/**
* Parse arguments. (eg. {for bar1=sample1 bar2=sample2}
*
* @param string $sArguments Arguments to parse.
* @return array ARRAY of all the arguments.
*/
private function _parseArgs($sArguments)
{
$aResult = array();
preg_match_all('/(?:' . $this->_sQstrRegexp . ' | (?>[^"'=s]+))+|[=]/x', $sArguments, $aMatches);
$iState = 0;
foreach($aMatches[0] as $mValue)
{
switch($iState)
{
case 0:
if (is_string($mValue))
{
$sName = $mValue;
$iState = 1;
}
else
{
Phpfox_Error::trigger("Invalid Attribute Name", E_USER_ERROR);
}
break;
case 1:
if ($mValue == '=')
{
$iState = 2;
}
else
{
Phpfox_Error::trigger("Expecting '=' After '{$sLastValue}'", E_USER_ERROR);
}
break;
case 2:
if ($mValue != '=')
{
if(!preg_match_all('/(?:(' . $this->_sVarRegexp . '|' . $this->_sSvarRegexp . ')(' . $this->_sModRegexp . '*))(?:s+(.*))?/xs', $mValue, $aVariables))
{
$aResult[$sName] = $mValue;
}
else
{
$aResult[$sName] = $this->_parseVariables($aVariables[1], $aVariables[2]);
}
$iState = 0;
}
else
{
Phpfox_Error::trigger("'=' cannot be an attribute value", E_USER_ERROR);
}
break;
}
$sLastValue = $mValue;
}
if($iState != 0)
{
if($iState == 1)
{
Phpfox_Error::trigger("expecting '=' after attribute name '{$sLastValue}'", E_USER_ERROR);
}
else
{
Phpfox_Error::trigger("missing attribute value", E_USER_ERROR);
}
}
return $aResult;
}
/**
* Parse variables.
*
* @param array $aVariables ARRAY of variables.
* @param array $aModifiers ARRAY of modifiers.
* @return string Converted variable.
*/
private function _parseVariables($aVariables, $aModifiers)
{
$sResult = "";
foreach($aVariables as $mKey => $mValue)
{
if (empty($aModifiers[$mKey]))
{
$sResult .= $this->_parseVariable(trim($aVariables[$mKey])).'.';
}
else
{
$sResult .= $this->_parseModifier($this->_parseVariable(trim($aVariables[$mKey])), $aModifiers[$mKey]).'.';
}
}
return substr($sResult, 0, -1);
}
/**
* Parse a specific variable.
*
* @param string $sVariable Name of the variable we are parsing.
* @return string Converted variable.
*/
private function _parseVariable($sVariable)
{
if ($sVariable{0} == "$")
{
return $this->_compileVariable($sVariable);
}
else
{
return $sVariable;
}
}
/**
* Compile all variables.
*
* @param string $sVariable Variable name.
* @return string Converted variable.
*/
private function _compileVariable($sVariable)
{
$sResult = '';
$sVariable = substr($sVariable, 1);
preg_match_all('!(?:^w+)|(?:' . $this->_sVarBracketRegexp . ')|.$?w+|S+!', $sVariable, $aMatches);
$aVariables = $aMatches[0];
$sVarName = array_shift($aVariables);
if ($sVarName == $this->sReservedVarname)
{
if ($aVariables[0]{0} == '[' || $aVariables[0]{0} == '.')
{
$aFind = array("[", "]", ".");
switch(strtoupper(str_replace($aFind, "", $aVariables[0])))
{
case 'GET':
$sResult = "$_GET";
break;
case 'POST':
$sResult = "$_POST";
break;
case 'COOKIE':
$sResult = "$_COOKIE";
break;
case 'ENV':
$sResult = "$_ENV";
break;
case 'SERVER':
$sResult = "$_SERVER";
break;
case 'SESSION':
$sResult = "$_SESSION";
break;
default:
$sVar = str_replace($aFind, "", $aVariables[0]);
$sResult = "$this->_aPhpfoxVars['$sVar']";
break;
}
array_shift($aVariables);
}
else
{
Phpfox_Error::trigger('$' . $sVarName.implode('', $aVariables) . ' is an invalid $phpfox reference', E_USER_ERROR);
}
}
else
{
$sResult = "$this->_aVars['$sVarName']";
}
foreach ($aVariables as $sVar)
{
if ($sVar{0} == '[')
{
$sVar = substr($sVar, 1, -1);
if (is_numeric($sVar))
{
$sResult .= "[$sVar]";
}
elseif ($sVar{0} == '$')
{
$sResult .= "[" . $this->_compileVariable($sVar) . "]";
}
else
{
$parts = explode('.', $sVar);
$section = $parts[0];
$section_prop = isset($parts[1]) ? $parts[1] : 'index';
$sResult .= "[$this->_aSections['$section']['$section_prop']]";
}
}
elseif ($sVar{0} == '.')
{
$sResult .= "['" . substr($sVar, 1) . "']";
}
elseif (substr($sVar,0,2) == '->')
{
Phpfox_Error::trigger('Call to object members is not allowed', E_USER_ERROR);
}
else
{
Phpfox_Error::trigger('$' . $sVarName.implode('', $aVariables) . ' is an invalid reference', E_USER_ERROR);
}
}
return $sResult;
}
/**
* Parse modifiers.
*
* @param string $sVariable Variable name.
* @param string $sModifiers Modifiers.
* @return string Converted modifier.
*/
private function _parseModifier($sVariable, $sModifiers)
{
$aMods = array();
$aArgs = array();
$aMods = explode('|', $sModifiers);
unset($aMods[0]);
foreach ($aMods as $sMod)
{
$aArgs = array();
if (strpos($sMod, ':'))
{
$aParts = explode(':', $sMod);
$iCnt = 0;
foreach ($aParts as $iKey => $sPart)
{
if ($iKey == 0)
{
continue;
}
if ($iKey > 1)
{
$iCnt++;
}
$aArgs[$iCnt] = $this->_parseVariable($sPart);
}
$sMod = $aParts[0];
}
if ($sMod{0} == '@')
{
$sMod = substr($sMod, 1);
$bMapArray = false;
}
else
{
$bMapArray = true;
}
$sArg = ((count($aArgs) > 0) ? ', '.implode(', ', $aArgs) : '');
if ($this->_plugin($sMod, 'modifier'))
{
$sVariable = "$this->_runModifier($sVariable, '$sMod', 'plugin', $sArg)";
}
else
{
switch ($sMod)
{
case 'htmlspecialchars':
$sVariable = "Phpfox::getLib('parse.output')->htmlspecialchars({$sVariable})";
break;
case 'filesize':
$sVariable = 'Phpfox::getLib('phpfox.file')->filesize(' . $sVariable . ')';
break;
case 'clean':
$sVariable = 'Phpfox::getLib('phpfox.parse.output')->clean(' . $sVariable . ')';
break;
case 'clean_phrase':
$sVariable = 'md5('.$sVariable . ')';
break;
case 'parse':
$sVariable = 'Phpfox::getLib('phpfox.parse.output')->parse(' . $sVariable . ')';
break;
case 'sprintf':
$sVariable = 'sprintf(' . $sVariable . '' . $sArg . ')';
break;
case 'date':
$sVariable = 'Phpfox::getTime(Phpfox::getParam('' . (empty($aArgs[0]) ? 'core.global_update_time' : $this->_removeQuote($aArgs[0])) . ''), ' . $sVariable . ')';
break;
case 'highlight':
$sVariable = 'Phpfox::getLib('phpfox.search')->highlight(' . $aArgs[0] . ', ' . $sVariable . ')';
break;
case 'feed_strip':
$sVariable = 'Phpfox::getLib('parse.output')->feedStrip(' . $sVariable . ')';
break;
case 'translate':
$sPrefix = (isset($aArgs[0]) ? ', ' . $aArgs[0] : '');
$sVariable = 'Phpfox::getLib('phpfox.locale')->translate(' . $sVariable . $sPrefix . ')';
break;
case 'eval':
$sVariable = 'eval(' ?>' . ' . $sVariable . ' . '<?php ')';
break;
case 'tag_search':
$sVariable = 'str_replace(' . $aArgs[0] . ', '<u>' . ' . $aArgs[0] . ' . '</u>', ' . $sVariable . ')';
break;
case 'shorten':
if (!empty($aArgs[0]) && is_string($aArgs[0]) && preg_match('/[a-z]+.{1}[a-z_]+/', $aArgs[0], $aMatches) > 0)
{
$sArg = $this->_removeQuote(trim(ltrim($aArgs[0], ', ')));
$sArg = ',' . Phpfox::getParam($sArg);
}
$sVariable = 'Phpfox::getLib('phpfox.parse.output')->shorten(' . $sVariable . $sArg . ')';
break;
case 'split':
$sVariable = 'Phpfox::getLib('phpfox.parse.output')->split(' . $sVariable . ', ' . $aArgs[0] . ')';
break;
case 'first_name':
$sVariable = 'Phpfox::getService('user')->getFirstname(' . $sVariable . ')';
break;
case 'location':
$sVariable = 'Phpfox::getService('core.country')->getCountry(' . $sVariable . ')';
break;
case 'location_child':
$sVariable = 'Phpfox::getService('core.country')->getChild(' . $sVariable . ')';
break;
case 'stripbb':
$sVariable = 'Phpfox::getLib('phpfox.parse.bbcode')->stripCode(' . $sVariable . ')';
break;
case 'cleanbb':
$sVariable = 'Phpfox::getLib('phpfox.parse.bbcode')->cleanCode(' . $sVariable . ')';
break;
case 'convert_time':
$sVariable = 'Phpfox::getLib('date')->convertTime(' . $sVariable . '' . $sArg . ')';
break;
case 'convert':
$sVariable = 'Phpfox::getLib('locale')->convert(' . $sVariable . ')';
break;
case 'user':
$sSuffix = '';
$sExtra = '';
if (count($aArgs))
{
if (!empty($aArgs[0]))
{
$sSuffix = $this->_removeQuote($aArgs[0]);
}
}
$sValue = '' . Phpfox::getLib('phpfox.parse.output')->shorten(' . $sVariable . '['' . $sSuffix . 'full_name'], Phpfox::getParam('user.maximum_length_for_full_name')) . '';
if (count($aArgs))
{
if (!empty($aArgs[1]))
{
$sExtra .= $this->_removeQuote($aArgs[1]);
}
if (!empty($aArgs[2]))
{
if (preg_match('/[a-z]+.{1}[a-z_]+/', $aArgs[2], $aMatches) > 0)
{
$aArgs[2] = Phpfox::getParam($this->_removeQuote($aArgs[2]));
}
$sValue = '' . Phpfox::getLib('phpfox.parse.output')->shorten(' . $sVariable . '['' . $sSuffix . 'full_name'], ' . $this->_removeQuote($aArgs[2]) . ', '...') . '';
}
if (!empty($aArgs[3]))
{
$sValue = '' . Phpfox::getLib('phpfox.parse.output')->shorten(Phpfox::getLib('phpfox.parse.output')->split(' . $sVariable . '['' . $sSuffix . 'full_name'], ' . $this->_removeQuote($aArgs[3]) . '' . (empty($aArgs[3]) ? '' : ', true') . '), Phpfox::getParam('user.maximum_length_for_full_name')) . '';
}
}
$sVariable = ''<span class="user_profile_link_span" id="js_user_name_link_' . ' . $sVariable . '['' . $sSuffix . 'user_name'] . '"><a href="' . Phpfox::getLib('phpfox.url')->makeUrl('profile', array(' . $sVariable . '['' . $sSuffix . 'user_name'], ((empty(' . $sVariable . '['' . $sSuffix . 'user_name']) && isset(' . $sVariable . '['' . $sSuffix . 'profile_page_id'])) ? ' . $sVariable . '['' . $sSuffix . 'profile_page_id'] : null))) . '"' . $sExtra . '>' . $sValue . '</a></span>'';
break;
case 'gender':
$sVariable = 'Phpfox::getService('user')->gender(' . $sVariable . $sArg . ')';
break;
case 'age':
$sVariable = 'Phpfox::getService('user')->age(' . $sVariable . ')';
break;
case 'currency_symbol':
$sVariable = 'Phpfox::getService('core.currency')->getSymbol(' . $sVariable . ')';
break;
case 'currency':
$sVariable = 'Phpfox::getService('core.currency')->getCurrency(' . $sVariable . $sArg . ')';
break;
case 'hide_email':
$sVariable = 'Phpfox::getLib('phpfox.parse.format')->hideEmail(' . $sVariable . ')';
break;
case 'privacy_phrase':
$sVariable = 'Phpfox::getService('privacy')->getPhrase(' . $sVariable . ')';
break;
case 'category_display':
$sVariable = 'Phpfox::getService('core.category')->displayView(' . $sVariable . $sArg . ')';
break;
case 'emoticon':
$sVariable = '(Phpfox::isModule('emoticon') ? Phpfox::getService('emoticon')->parse(' . $sVariable . ') : ' . $sVariable . ')';
break;
default:
if (function_exists($sMod))
{
$sVariable = '' . $sMod . '(' . $sVariable . $sArg . ')';
}
else
{
$sVariable = "Phpfox_Error::trigger("'" . $sMod . "' modifier does not exist", E_USER_ERROR)";
}
}
}
}
return $sVariable;
}
/**
* Load custom plug-ins.
* NOTE: This is not in use yet.
*
* @param string $sFunction Custom function name.
* @param string $sType Type of function.
* @return string Returns function to load.
*/
private function _plugin($sFunction, $sType)
{
if (isset($this->_aPlugins[$sType][$sFunction]) && is_array($this->_aPlugins[$sType][$sFunction]) && is_object($this->_aPlugins[$sType][$sFunction][0]) && method_exists($this->_aPlugins[$sType][$sFunction][0], $this->_aPlugins[$sType][$sFunction][1]))
{
return '$this->_aPlugins['' . $sType . '']['' . $sFunction . ''][0]->' . $this->_aPlugins[$sType][$sFunction][1];
}
if (isset($this->_aPlugins[$sType][$sFunction]) && function_exists($this->_aPlugins[$sType][$sFunction]))
{
return $this->_aPlugins[$sType][$sFunction];
}
if (function_exists('phpfox_' . $sType . '_' . $sFunction))
{
$this->_aRequireStack[$sType . '.' . $sFunction . '.php'] = array($sType, $sFunction, 'phpfox_' . $sType . '_' . $sFunction);
return 'phpfox_' . $sType . '_' . $sFunction;
}
if (file_exists(PHPFOX_DIR_TPL_PLUGIN . $sType . '.' . $sFunction . '.php'))
{
require_once(PHPFOX_DIR_TPL_PLUGIN . $sType . '.' . $sFunction . '.php');
if (function_exists('phpfox_' . $sType . '_' . $sFunction))
{
$this->_aRequireStack[$sType . '.' . $sFunction . '.php'] = array($sType, $sFunction, 'phpfox_' . $sType . '_' . $sFunction);
return 'phpfox_' . $sType . '_' . $sFunction;
}
}
return false;
}
/**
* Compile custom function into the template it is loaded in.
*
* @param string $sFunction Name of the function.
* @param string $sModifiers Modifier to load.
* @param string $sArguments Arguments of the function.
* @param string $sResult Converted string of the PHP function.
* @return bool TRUE function converted, FALSE if it didn't convert.
*/
private function _compileCustomFunction($sFunction, $sModifiers, $sArguments, &$sResult)
{
if ($sFunction = $this->_plugin($sFunction, "function"))
{
$aArgs = $this->_parseArgs($sArguments);
foreach($aArgs as $mKey => $mValue)
{
if (is_bool($mValue))
{
$mValue = $mValue ? 'true' : 'false';
}
if (is_null($mValue))
{
$mValue = 'null';
}
$aArgs[$mKey] = "'$mKey' => $mValue";
}
$sResult = '<?php echo ';
if (!empty($sModifiers))
{
$sResult .= $this->_parseModifier($sFunction . '(array(' . implode(',', (array)$aArgs) . '), $this)', $sModifiers) . '; ';
}
else
{
$sResult .= $sFunction . '(array(' . implode(',', (array)$aArgs) . '), $this);';
}
$sResult .= '?>';
return true;
}
else
{
return false;
}
}
/**
* Compile IF statments.
*
* @param string $sArguments If statment arguments.
* @param bool $bElseif TRUE if this is an ELSEIF.
* @param bool $bWhile TRUE of this is a WHILE loop.
* @return string Returns the converted PHP if statment code.
*/
private function _compileIf($sArguments, $bElseif = false, $bWhile = false)
{
$sResult = "";
$aArgs = array();
$aArgStack = array();
preg_match_all('/(?>(' . $this->_sVarRegexp . '|/?' . $this->_sSvarRegexp . '|/?' . $this->_sFuncRegexp . ')(?:' . $this->_sModRegexp . '*)?|-?0[xX][0-9a-fA-F]+|-?d+(?:.d+)?|.d+|!==|===|==|!=|<>|<<|>>|<=|>=|&&||||(|)|,|!|^|=|&|~|<|>|%|+|-|/|*|@|bw+b|S+)/x', $sArguments, $aMatches);
$aArgs = $aMatches[0];
$iCountArgs = count($aArgs);
for ($i = 0, $iForMax = $iCountArgs; $i < $iForMax; $i++)
{
$sArg = &$aArgs[$i];
switch (strtolower($sArg))
{
case '!':
case '%':
case '!==':
case '==':
case '===':
case '>':
case '<':
case '!=':
case '<>':
case '<<':
case '>>':
case '<=':
case '>=':
case '&&':
case '||':
case '^':
case '&':
case '~':
case ')':
case ',':
case '+':
case '-':
case '*':
case '/':
case '@':
break;
case 'eq':
$sArg = '==';
break;
case 'ne':
case 'neq':
$sArg = '!=';
break;
case 'lt':
$sArg = '<';
break;
case 'le':
case 'lte':
$sArg = '<=';
break;
case 'gt':
$sArg = '>';
break;
case 'ge':
case 'gte':
$sArg = '>=';
break;
case 'and':
$sArg = '&&';
break;
case 'or':
$sArg = '||';
break;
case 'not':
$sArg = '!';
break;
case 'mod':
$sArg = '%';
break;
case '(':
array_push($aArgStack, $i);
break;
case 'is':
$iIsArgCount = count($aArgs);
$sIsArg = implode(' ', array_slice($aArgs, 0, $i - 0));
$aArgTokens = $this->_compileParseIsExpr($sIsArg, array_slice($aArgs, $i+1));
array_splice($aArgs, 0, count($aArgs), $aArgTokens);
$i = $iIsArgCount - count($aArgs);
break;
default:
preg_match('/(?:(' . $this->_sVarRegexp . '|' . $this->_sSvarRegexp . '|' . $this->_sFuncRegexp . ')(' . $this->_sModRegexp . '*)(?:s*[,.]s*)?)(?:s+(.*))?/xs', $sArg, $aMatches);
if (isset($aMatches[0]{0}) && ($aMatches[0]{0} == '$' || $aMatches[0]{0} == "'" || $aMatches[0]{0} == '"'))
{
$sArg = $this->_parseVariables(array($aMatches[1]), array($aMatches[2]));
}
break;
}
}
if($bWhile)
{
return implode(' ', $aArgs);
}
else
{
if ($bElseif)
{
return '<?php elseif ('.implode(' ', $aArgs).'): ?>';
}
else
{
return '<?php if ('.implode(' ', $aArgs).'): ?>';
}
}
return $sResult;
}
/**
* Compile IF statment expressions.
*
* @param string $sIsArg If expression arguments.
* @param string $aArgs Arguments.
* @return string Converted PHP code.
*/
private function _compileParseIsExpr($sIsArg, $aArgs)
{
$iExprEnd = 0;
$bNegateExpr = false;
if (($first_arg = array_shift($aArgs)) == 'not')
{
$bNegateExpr = true;
$sExprType = array_shift($aArgs);
}
else
{
$sExprType = $first_arg;
}
switch ($sExprType)
{
case 'even':
if (isset($aArgs[$iExprEnd]) && $aArgs[$iExprEnd] == 'by')
{
$iExprEnd++;
$eExprArg = $aArgs[$iExprEnd++];
$sExpr = "!(1 & ($sIsArg / " . $this->_parseVariable($eExprArg) . "))";
}
else
{
$sExpr = "!(1 & $sIsArg)";
}
break;
case 'odd':
if (isset($aArgs[$iExprEnd]) && $aArgs[$iExprEnd] == 'by')
{
$iExprEnd++;
$eExprArg = $aArgs[$iExprEnd++];
$sExpr = "(1 & ($sIsArg / " . $this->_parseVariable($eExprArg) . "))";
}
else
{
$sExpr = "(1 & $sIsArg)";
}
break;
case 'div':
if (@$aArgs[$iExprEnd] == 'by')
{
$iExprEnd++;
$eExprArg = $aArgs[$iExprEnd++];
$sExpr = "!($sIsArg % " . $this->_parseVariable($eExprArg) . ")";
}
else
{
Phpfox_Error::trigger("expecting 'by' after 'div'", E_USER_ERROR);
}
break;
default:
Phpfox_Error::trigger("unknown 'is' expression - '$sExprType'", E_USER_ERROR);
break;
}
if ($bNegateExpr)
{
$sExpr = "!($sExpr)";
}
array_splice($aArgs, 0, $iExprEnd, $sExpr);
return $aArgs;
}
/**
* Complie sections {section}{/section}
*
* @param string $sArguments Section arguments.
* @return string Converted PHP foreach().
*/
private function _compileSectionStart($sArguments)
{
$aAttrs = $this->_parseArgs($sArguments);
$sOutput = '<?php ';
$sSectionName = $aAttrs['name'];
if (empty($sSectionName))
{
Phpfox_Error::trigger("missing section name", E_USER_ERROR);
}
$sOutput .= "if (isset($this->_aSections['$sSectionName'])) unset($this->_aSections['$sSectionName']);n";
$sSectionProps = "$this->_aSections['$sSectionName']";
foreach ($aAttrs as $sAttrName => $sAttrValue)
{
switch ($sAttrName)
{
case 'loop':
$sOutput .= "{$sSectionProps}['loop'] = is_array($sAttrValue) ? count($sAttrValue) : max(0, (int)$sAttrValue);n";
break;
case 'show':
if (is_bool($sAttrValue))
{
$bShowAttrValue = $sAttrValue ? 'true' : 'false';
}
else
{
$bShowAttrValue = "(bool)$sAttrValue";
}
$sOutput .= "{$sSectionProps}['show'] = $bShowAttrValue;n";
break;
case 'name':
$sOutput .= "{$sSectionProps}['$sAttrName'] = '$sAttrValue';n";
break;
case 'max':
case 'start':
$sOutput .= "{$sSectionProps}['$sAttrName'] = (int)$sAttrValue;n";
break;
case 'step':
$sOutput .= "{$sSectionProps}['$sAttrName'] = ((int)$sAttrValue) == 0 ? 1 : (int)$sAttrValue;n";
break;
default:
Phpfox_Error::trigger("unknown section attribute - '$sAttrName'", E_USER_ERROR);
break;
}
}
if (!isset($aAttrs['show']))
{
$sOutput .= "{$sSectionProps}['show'] = true;n";
}
if (!isset($aAttrs['loop']))
{
$sOutput .= "{$sSectionProps}['loop'] = 1;n";
}
if (!isset($aAttrs['max']))
{
$sOutput .= "{$sSectionProps}['max'] = {$sSectionProps}['loop'];n";
}
else
{
$sOutput .= "if ({$sSectionProps}['max'] < 0)n" .
" {$sSectionProps}['max'] = {$sSectionProps}['loop'];n";
}
if (!isset($aAttrs['step']))
{
$sOutput .= "{$sSectionProps}['step'] = 1;n";
}
if (!isset($aAttrs['start']))
{
$sOutput .= "{$sSectionProps}['start'] = {$sSectionProps}['step'] > 0 ? 0 : {$sSectionProps}['loop']-1;n";
}
else
{
$sOutput .= "if ({$sSectionProps}['start'] < 0)n" .
" {$sSectionProps}['start'] = max({$sSectionProps}['step'] > 0 ? 0 : -1, {$sSectionProps}['loop'] + {$sSectionProps}['start']);n" .
"elsen" .
" {$sSectionProps}['start'] = min({$sSectionProps}['start'], {$sSectionProps}['step'] > 0 ? {$sSectionProps}['loop'] : {$sSectionProps}['loop']-1);n";
}
$sOutput .= "if ({$sSectionProps}['show']) {n";
if (!isset($aAttrs['start']) && !isset($aAttrs['step']) && !isset($aAttrs['max']))
{
$sOutput .= " {$sSectionProps}['total'] = {$sSectionProps}['loop'];n";
}
else
{
$sOutput .= " {$sSectionProps}['total'] = min(ceil(({$sSectionProps}['step'] > 0 ? {$sSectionProps}['loop'] - {$sSectionProps}['start'] : {$sSectionProps}['start']+1)/abs({$sSectionProps}['step'])), {$sSectionProps}['max']);n";
}
$sOutput .= " if ({$sSectionProps}['total'] == 0)n" .
" {$sSectionProps}['show'] = false;n" .
"} elsen" .
" {$sSectionProps}['total'] = 0;n";
$sOutput .= "if ({$sSectionProps}['show']):n";
$sOutput .= "
for ({$sSectionProps}['index'] = {$sSectionProps}['start'], {$sSectionProps}['iteration'] = 1;
{$sSectionProps}['iteration'] <= {$sSectionProps}['total'];
{$sSectionProps}['index'] += {$sSectionProps}['step'], {$sSectionProps}['iteration']++):n";
$sOutput .= "{$sSectionProps}['rownum'] = {$sSectionProps}['iteration'];n";
$sOutput .= "{$sSectionProps}['index_prev'] = {$sSectionProps}['index'] - {$sSectionProps}['step'];n";
$sOutput .= "{$sSectionProps}['index_next'] = {$sSectionProps}['index'] + {$sSectionProps}['step'];n";
$sOutput .= "{$sSectionProps}['first'] = ({$sSectionProps}['iteration'] == 1);n";
$sOutput .= "{$sSectionProps}['last'] = ({$sSectionProps}['iteration'] == {$sSectionProps}['total']);n";
$sOutput .= "?>";
return $sOutput;
}
/**
* Remove quotes from PHP variables.
*
* @param string $string PHP variable to work with.
* @return string Converted PHP variable.
*/
private function _removeQuote($string)
{
if (($string{0} == "'" || $string{0} == '"') && $string{strlen($string)-1} == $string{0})
{
return substr($string, 1, -1);
}
else
{
return $string;
}
}
}
?>