Add switch support to smarty via plugin
This commit is contained in:
@@ -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'));
|
||||
|
||||
292
source/smarty/plugins/compiler.switch.php
Normal file
292
source/smarty/plugins/compiler.switch.php
Normal file
@@ -0,0 +1,292 @@
|
||||
<?php
|
||||
/**
|
||||
* Switch statement plugin for smarty.
|
||||
* This smarty plugin provides php switch statement functionality in smarty tags.
|
||||
* To install this plugin drop it into your smarty plugins folder. You will also need to manually
|
||||
* load the plugin sot hat all the hooks are registered properly. Add the following line after
|
||||
* you load smarty and create an instance of it in your source code.
|
||||
*
|
||||
* <code>
|
||||
* $this->smartyObj->loadPlugin('smarty_compiler_switch');
|
||||
* </code>
|
||||
*
|
||||
* @author Jeremy Pyne <jeremy.pyne@gmail.com>
|
||||
* - 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:
|
||||
* <code>
|
||||
* {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}
|
||||
* </code>
|
||||
*
|
||||
* 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:
|
||||
* <code>
|
||||
* {case 1 break}
|
||||
* Code 1
|
||||
* {case 2}
|
||||
* Code 2
|
||||
* {default break}
|
||||
* Code 3
|
||||
* </code>
|
||||
*
|
||||
* <code>
|
||||
* {case 1}
|
||||
* Code 1
|
||||
* {break}
|
||||
* {case 2}
|
||||
* Code 2
|
||||
* {default}
|
||||
* Code 3
|
||||
* {break}
|
||||
* </code>
|
||||
*
|
||||
* Finally, there is an alternate long hand style for the switch statments that you may need to use in some cases.
|
||||
*
|
||||
* <code>
|
||||
* {switch var=$type}
|
||||
* {case value="box" break}
|
||||
* {case value="line"}
|
||||
* {break}
|
||||
* {default}
|
||||
* {/switch}
|
||||
* </code>
|
||||
*/
|
||||
|
||||
//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 .= "<?php if (!isset(\$_smarty_tpl->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 .= '<?php switch (' . $attr['var'] . '){?>';
|
||||
}
|
||||
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 .= '<?php break;?>';
|
||||
}
|
||||
$this->_open_tag('case', array(isset($attr['break']) ? $attr['break'] : false, $compiler->tag_nocache));
|
||||
|
||||
if (is_array($attr['value'])) {
|
||||
$_output .= "<?php if (!isset(\$_smarty_tpl->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 .= '<?php case ' . $attr['value'] . ':?>';
|
||||
}
|
||||
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 .= '<?php break;?>';
|
||||
}
|
||||
$this->_open_tag('case', array(isset($attr['break']) ? $attr['break'] : false, $compiler->tag_nocache));
|
||||
|
||||
$_output .= '<?php default:?>';
|
||||
|
||||
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 '<?php break;?>';
|
||||
}
|
||||
}
|
||||
|
||||
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 '<?php break;?>';
|
||||
}
|
||||
}
|
||||
|
||||
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 '<?php }?>';
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* 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);
|
||||
}
|
||||
?>
|
||||
Reference in New Issue
Block a user