1: <?php
2:
3: 4: 5: 6: 7: 8: 9: 10:
11:
12: namespace Nette\Application;
13:
14: use Nette;
15:
16:
17:
18: 19: 20: 21: 22:
23: class SimpleRouter extends Nette\Object implements IRouter
24: {
25: const PRESENTER_KEY = 'presenter';
26: const MODULE_KEY = 'module';
27:
28:
29: private $module = '';
30:
31:
32: private $defaults;
33:
34:
35: private $flags;
36:
37:
38:
39: 40: 41: 42:
43: public function __construct($defaults = array(), $flags = 0)
44: {
45: if (is_string($defaults)) {
46: $a = strrpos($defaults, ':');
47: $defaults = array(
48: self::PRESENTER_KEY => substr($defaults, 0, $a),
49: 'action' => substr($defaults, $a + 1),
50: );
51: }
52:
53: if (isset($defaults[self::MODULE_KEY])) {
54: $this->module = $defaults[self::MODULE_KEY] . ':';
55: unset($defaults[self::MODULE_KEY]);
56: }
57:
58: $this->defaults = $defaults;
59: $this->flags = $flags;
60: }
61:
62:
63:
64: 65: 66: 67: 68:
69: public function match(Nette\Web\IHttpRequest $httpRequest)
70: {
71: 72: $params = $httpRequest->getQuery();
73: $params += $this->defaults;
74:
75: if (!isset($params[self::PRESENTER_KEY])) {
76: throw new \InvalidStateException('Missing presenter.');
77: }
78:
79: $presenter = $this->module . $params[self::PRESENTER_KEY];
80: unset($params[self::PRESENTER_KEY]);
81:
82: return new PresenterRequest(
83: $presenter,
84: $httpRequest->getMethod(),
85: $params,
86: $httpRequest->getPost(),
87: $httpRequest->getFiles(),
88: array(PresenterRequest::SECURED => $httpRequest->isSecured())
89: );
90: }
91:
92:
93:
94: 95: 96: 97: 98: 99:
100: public function constructUrl(PresenterRequest $appRequest, Nette\Web\IHttpRequest $httpRequest)
101: {
102: $params = $appRequest->getParams();
103:
104: 105: $presenter = $appRequest->getPresenterName();
106: if (strncasecmp($presenter, $this->module, strlen($this->module)) === 0) {
107: $params[self::PRESENTER_KEY] = substr($presenter, strlen($this->module));
108: } else {
109: return NULL;
110: }
111:
112: 113: foreach ($this->defaults as $key => $value) {
114: if (isset($params[$key]) && $params[$key] == $value) { 115: unset($params[$key]);
116: }
117: }
118:
119: $uri = $httpRequest->getUri();
120: $uri = ($this->flags & self::SECURED ? 'https://' : 'http://') . $uri->getAuthority() . $uri->getScriptPath();
121: $sep = ini_get('arg_separator.input');
122: $query = http_build_query($params, '', $sep ? $sep[0] : '&');
123: if ($query != '') { 124: $uri .= '?' . $query;
125: }
126: return $uri;
127: }
128:
129:
130:
131: 132: 133: 134:
135: public function getDefaults()
136: {
137: return $this->defaults;
138: }
139:
140: }