* $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); } ?>