diff --git a/source/lib/StatusBoard/Main.class.php b/source/lib/StatusBoard/Main.class.php index 35d63bc..8286831 100644 --- a/source/lib/StatusBoard/Main.class.php +++ b/source/lib/StatusBoard/Main.class.php @@ -32,7 +32,7 @@ class StatusBoard_Main extends SihnonFramework_Main { $this->smarty->compile_dir = static::makeAbsolutePath($smarty_tmp . '/templates'); $this->smarty->cache_dir = static::makeAbsolutePath($smarty_tmp . '/cache'); $this->smarty->config_dir = static::makeAbsolutePath($smarty_tmp . '/config'); - $this->smarty->plugins_dir[]= static::makeAbsolutePath('../source/webui/smarty/plugins'); + $this->smarty->plugins_dir[]= static::makeAbsolutePath('../source/smarty/plugins'); $this->smarty->registerPlugin('modifier', 'formatDuration', array('StatusBoard_Main', 'formatDuration')); $this->smarty->registerPlugin('modifier', 'formatFilesize', array('StatusBoard_Main', 'formatFilesize')); diff --git a/source/smarty/plugins/compiler.switch.php b/source/smarty/plugins/compiler.switch.php new file mode 100644 index 0000000..bf1cd55 --- /dev/null +++ b/source/smarty/plugins/compiler.switch.php @@ -0,0 +1,292 @@ + + * $this->smartyObj->loadPlugin('smarty_compiler_switch'); + * + * + * @author Jeremy Pyne + * - Donations: Accepted via PayPal at the above address. + * - Updated: 02/10/2010 - Version 3.2 + * - File: smarty/plugins/compiler.switch.php + * - Licence: CC:BY/NC/SA http://creativecommons.org/licenses/by-nc-sa/3.0/ + * + * - Updates + * Version 2: + * Changed the break attribute to cause a break to be printed before the next case, instead of before this + * case. This way makes more sense and simplifies the code. This change in incompatible with code in + * from version one. This is written to support nested switches and will work as expected. + * Version 2.1: + * Added {/case} tag, this is identical to {break}. + * Version 3: + * Updated switch statment to support Smarty 3. This update is NOT backwards compatible but the old version is still maintained. + * Version 3.1: + * Added a prefilter to re-enable the shorthand {switch $myvar} support. To use the shorthand form you will need to add the following line to your code. + * $smarty->loadPlugin('smarty_compiler_switch'); + * Version 3.2: + * Fixed a bug when chaining multiple {case} statements without a {break}. + * Version 3.5: + * Updated to work with Smarty 3.0 release. (Tested and working with 3.0.5, no longer compatible with 3.0rcx releases.) + * + * - Bugs/Notes: + * + * @package Smarty + * @subpackage plugins + * + * Sample usage: + * + * {foreach item=$debugItem from=$debugData} + * // Switch on $debugItem.type + * {switch $debugItem.type} + * {case 1} + * {case "invalid_field"} + * // Case checks for string and numbers. + * {/case} + * {case $postError} + * {case $getError|cat:"_ajax"|lower} + * // Case checks can also use variables and modifiers. + * {break} + * {default} + * // Default case is supported. + * {/switch} + * {/foreach} + * + * + * Note in the above example that the break statements work exactly as expected. Also the switch and default + * tags can take the break attribute. If set they will break automatically before the next case is printed. + * + * Both blocks produce the same switch logic: + * + * {case 1 break} + * Code 1 + * {case 2} + * Code 2 + * {default break} + * Code 3 + * + * + * + * {case 1} + * Code 1 + * {break} + * {case 2} + * Code 2 + * {default} + * Code 3 + * {break} + * + * + * Finally, there is an alternate long hand style for the switch statments that you may need to use in some cases. + * + * + * {switch var=$type} + * {case value="box" break} + * {case value="line"} + * {break} + * {default} + * {/switch} + * + */ + +//Register the post and pre filters as they are not auto-registered. +$this->registerFilter('post', 'smarty_postfilter_switch'); + +class Smarty_Compiler_Switch extends Smarty_Internal_CompileBase { + public $required_attributes = array('var'); + public $optional_attributes = array(); + public $shorttag_order = array('var'); + +/** + * Start a new switch statement. + * A variable must be passed to switch on. + * Also, the switch can only directly contain {case} and {default} tags. + * + * @param string $tag_arg + * @param Smarty_Compiler $smarty + * @return string + */ + public function compile($args, $compiler){ + $this->compiler = $compiler; + $attr = $this->_get_attributes($args); + $_output = ''; + + $this->_open_tag('switch',array($compiler->tag_nocache)); + + if (is_array($attr['var'])) { + $_output .= "tpl_vars[".$attr['var']['var']."])) \$_smarty_tpl->tpl_vars[".$attr['var']['var']."] = new Smarty_Variable;"; + $_output .= "switch (\$_smarty_tpl->tpl_vars[".$attr['var']['var']."]->value = ".$attr['var']['value']."){?>"; + } else { + $_output .= ''; + } + return $_output; + } +} + +class Smarty_Compiler_Case extends Smarty_Internal_CompileBase { + public $required_attributes = array('value'); + public $optional_attributes = array('break'); + public $shorttag_order = array('value', 'break'); + +/** + * Print out a case line for this switch. + * A condition must be passed to match on. + * This can only go in {switch} tags. + * If break is passed, a {break} will be rendered before the next case. + * + * @param string $tag_arg + * @param Smarty_Compiler $smarty + * @return string + */ + public function compile($args, $compiler){ + $this->compiler = $compiler; + $attr = $this->_get_attributes($args); + $_output = ''; + + list($last_tag, $last_attr) = $this->compiler->_tag_stack[count($this->compiler->_tag_stack) - 1]; + + if($last_tag == 'case') + { + list($break, $compiler->tag_nocache) = $this->_close_tag(array('case')); + if($last_attr[0]) + $_output .= ''; + } + $this->_open_tag('case', array(isset($attr['break']) ? $attr['break'] : false, $compiler->tag_nocache)); + + if (is_array($attr['value'])) { + $_output .= "tpl_vars[".$attr['value']['var']."])) \$_smarty_tpl->tpl_vars[".$attr['value']['var']."] = new Smarty_Variable;"; + $_output .= "case \$_smarty_tpl->tpl_vars[".$attr['value']['var']."]->value = ".$attr['value']['value'].":?>"; + } else { + $_output .= ''; + } + return $_output; + } +} + +class Smarty_Compiler_Default extends Smarty_Internal_CompileBase { + public $required_attributes = array(); + public $optional_attributes = array('break'); + public $shorttag_order = array('break'); + +/** + * Print out a default line for this switch. + * This can only go in {switch} tags. + * If break is passed, a {break} will be rendered before the next case. + * + * @param string $tag_arg + * @param Smarty_Compiler $smarty + * @return string + */ + public function compile($args, $compiler){ + $this->compiler = $compiler; + $attr = $this->_get_attributes($args); + $_output = ''; + + list($last_tag, $last_attr) = $this->compiler->_tag_stack[count($this->compiler->_tag_stack) - 1]; + if($last_tag == 'case') + { + list($break, $compiler->tag_nocache) = $this->_close_tag(array('case')); + if($last_attr[0]) + $_output .= ''; + } + $this->_open_tag('case', array(isset($attr['break']) ? $attr['break'] : false, $compiler->tag_nocache)); + + $_output .= ''; + + return $_output; + } +} + + +class Smarty_Compiler_Break extends Smarty_Internal_CompileBase { + public $required_attributes = array(); + public $optional_attributes = array(); + public $shorttag_order = array(); + +/** + * Print out a break command for the switch. + * This can only go inside of {case} tags. + * + * @param string $tag_arg + * @param Smarty_Compiler $smarty + * @return string + */ + + public function compile($args, $compiler){ + $this->compiler = $compiler; + $attr = $this->_get_attributes($args); + + list($break, $compiler->tag_nocache) = $this->_close_tag(array('case')); + + return ''; + } +} + +class Smarty_Compiler_Caseclose extends Smarty_Internal_CompileBase { + public $required_attributes = array(); + public $optional_attributes = array(); + public $shorttag_order = array(); + +/** + * Print out a break command for the switch. + * This can only go inside of {case} tags. + * + * @param string $tag_arg + * @param Smarty_Compiler $smarty + * @return string + */ + + public function compile($args, $compiler){ + $this->compiler = $compiler; + $attr = $this->_get_attributes($args); + + list($break, $compiler->tag_nocache) = $this->_close_tag(array('case')); + + return ''; + } +} + +class Smarty_Compiler_Switchclose extends Smarty_Internal_CompileBase { + public $required_attributes = array(); + public $optional_attributes = array(); + public $shorttag_order = array(); + +/** + * End a switch statement. + * + * @param string $tag_arg + * @param Smarty_Compiler $smarty + * @return string + */ + + public function compile($args, $compiler){ + $this->compiler = $compiler; + $attr = $this->_get_attributes($args); + + list($last_tag, $last_attr) = $this->compiler->_tag_stack[count($this->compiler->_tag_stack) - 1]; + if(($last_tag == 'case' || $last_tag == 'default')) + list($break, $compiler->tag_nocache) = $this->_close_tag(array('case')); + list($compiler->tag_nocache) = $this->_close_tag(array('switch')); + + return ''; + } +} + +/** + * Filter the template after it is generated to fix switch bugs. + * Remove any spaces after the 'switch () {' code and before the first case. Any tabs or spaces + * for layout would cause php errors witch this reged will fix. + * + * @param string $compiled + * @param Smarty_Compiler $smarty + * @return string + */ +function smarty_postfilter_switch($compiled, &$smarty) { + // Remove the extra spaces after the start of the switch tag and before the first case statement. + return preg_replace('/({ ?\?>)\s+(<\?php case)/', "$1\n$2", $compiled); +} +?> \ No newline at end of file