1: <?php
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24: namespace Thelia\Tpex\Element;
25:
26: use Thelia\Tpex\Exception\TokenSyntaxException;
27: use Symfony\Component\HttpFoundation\Request;
28:
29: class VariablesTemplate
30: {
31: 32: 33:
34: private static $instance = false;
35:
36: private $symboles = array();
37:
38: protected $filters = array();
39:
40: protected $init = false;
41:
42: protected $tokens = array();
43:
44: protected $sessionPrefix = "thelia_";
45:
46: 47: 48:
49: protected $request;
50:
51: public static function init(array $filters, Request $request)
52: {
53: if(self::$instance === false) self::$instance = new VariablesTemplate();
54:
55: self::$instance->request = $request;
56: self::$instance->filters = $filters;
57: }
58:
59: 60: 61: 62: 63:
64: public static function analyser($text)
65: {
66: if(self::$instance === false) throw new \RuntimeException("VariableInstance must be init with init static
67: method before using it");
68:
69: return self::$instance->start($text);
70: }
71:
72: protected function start($text)
73: {
74: $this->tokens = preg_split('/(\#|\{|\}|,)/', $text, -1, PREG_SPLIT_NO_EMPTY | PREG_SPLIT_DELIM_CAPTURE);
75: array_unshift($this->tokens, '');
76:
77: return $this->analyse();
78: }
79:
80: protected function analyse($endChar = '')
81: {
82: $content = '';
83:
84: while (($tok = next($this->tokens)) !== false) {
85: if ($tok == "#") {
86: $tok = next($this->tokens);
87: if ($tok == "SET" || $tok == "SESSION_SET") {
88: $this->analyseSet($tok);
89: } elseif ($tok == "GET" || $tok == "ENV" || $tok == "SESSION") {
90: $content .= $this->analyseGet($tok);
91: } elseif (strpos($tok, "FILTER_") === 0) {
92: $content .= $this->analyseFilter($tok);
93: } else {
94: $content .= "#".$tok;
95: }
96: } elseif ($endChar != '' && $tok == $endChar) {
97: break;
98: } else {
99: $content .= $tok;
100: }
101: }
102:
103: return $content;
104: }
105:
106: protected function analyseFilter($token)
107: {
108: 109: 110:
111: }
112:
113: protected function analyseGet($token)
114: {
115: if (($tok = next($this->tokens)) == "{") {
116: $var = $this->analyseVarName();
117:
118: if (($tok = next($this->tokens)) == ",") {
119: $default = $this->analyse("}");
120:
121: return $this->filterGetVar($token, $var, $default);
122: } elseif ($tok == "}") {
123: return $this->filterGetVar($token, $var);
124: } else {
125: throw new TokenSyntaxException(sprintf("%s %s : need ',' or '}', %s found", $token, $var, $tok));
126: }
127: } else {
128: return $tok;
129: }
130: }
131:
132: protected function filterGetVar($type, $var, $default = null)
133: {
134: switch ($type) {
135: case "ENV":
136: return $this->request->get($var, $default);
137: break;
138: case "GET":
139: return (isset($this->symboles[$var]) && $this->symboles[$var] != '')? $this->symboles[$var] : $default;
140: break;
141: case "SESSION":
142: return $this->request->getSession()->get($this->sessionPrefix.$var, $default);
143: }
144: }
145:
146: protected function analyseSet($token)
147: {
148: $tok = next($this->tokens);
149:
150: if ($tok == "{") {
151: $var = $this->analyseVarName();
152:
153: if (next($this->tokens) == ",") {
154: $val = $this->analyse('}');
155:
156: if (current($this->tokens) == '}') {
157: switch ($token) {
158: case "SET":
159: $this->symboles[$var] = $val;
160: break;
161: case "SESSION_SET":
162: $this->request->getSession()->set($this->sessionPrefix.$var, $val);
163: break;
164: }
165:
166: return '';
167: } else {
168: throw new TokenSyntaxException(sprintf("%s %s needed, %s found",$token, $var, $tok));
169: }
170: } elseif (current($this->tokens) == "}") {
171: switch ($token) {
172: case "SET":
173: unset($this->symboles[$var]);
174: break;
175: case "SESSION_SET":
176: $this->request->getSession()->remove($this->sessionPrefix.$var);
177: break;
178: }
179:
180: return '';
181: }
182: } else {
183: return $tok;
184: }
185: }
186:
187: protected function analyseVarName()
188: {
189: $var = trim(next($this->tokens));
190:
191: if (! preg_match('/^[\w\:]+$/', $var)) {
192: throw new TokenSyntaxException(sprintf("Invalid var name : %s", $var));
193: }
194:
195: return $var;
196: }
197: }
198: