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