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