1: <?php
2: 3: 4: 5: 6: 7: 8: 9:
10:
11: 12: 13: 14: 15: 16:
17: class Smarty_Internal_Compile_Break extends Smarty_Internal_CompileBase
18: {
19: 20: 21: 22: 23: 24:
25: public $optional_attributes = array('levels');
26: 27: 28: 29: 30: 31:
32: public $shorttag_order = array('levels');
33:
34: 35: 36: 37: 38: 39: 40: 41: 42:
43: public function compile($args, $compiler, $parameter)
44: {
45: static $_is_loopy = array('for' => true, 'foreach' => true, 'while' => true, 'section' => true);
46:
47: $_attr = $this->getAttributes($compiler, $args);
48:
49: if ($_attr['nocache'] === true) {
50: $compiler->trigger_template_error('nocache option not allowed', $compiler->lex->taglineno);
51: }
52:
53: if (isset($_attr['levels'])) {
54: if (!is_numeric($_attr['levels'])) {
55: $compiler->trigger_template_error('level attribute must be a numeric constant', $compiler->lex->taglineno);
56: }
57: $_levels = $_attr['levels'];
58: } else {
59: $_levels = 1;
60: }
61: $level_count = $_levels;
62: $stack_count = count($compiler->_tag_stack) - 1;
63: while ($level_count > 0 && $stack_count >= 0) {
64: if (isset($_is_loopy[$compiler->_tag_stack[$stack_count][0]])) {
65: $level_count --;
66: }
67: $stack_count --;
68: }
69: if ($level_count != 0) {
70: $compiler->trigger_template_error("cannot break {$_levels} level(s)", $compiler->lex->taglineno);
71: }
72:
73: return "<?php break {$_levels};?>";
74: }
75: }
76: