1: <?php
2:
3: 4: 5: 6: 7: 8: 9: 10:
11:
12: namespace Nette\Application\Routers;
13:
14: use Nette;
15:
16:
17:
18: 19: 20: 21: 22: 23:
24: class RouteList extends Nette\ArrayList implements Nette\Application\IRouter
25: {
26:
27: private $cachedRoutes;
28:
29:
30: private $module;
31:
32:
33:
34: public function __construct($module = NULL)
35: {
36: $this->module = $module ? $module . ':' : '';
37: }
38:
39:
40:
41: 42: 43: 44: 45:
46: public function match(Nette\Http\IRequest $httpRequest)
47: {
48: foreach ($this as $route) {
49: $appRequest = $route->match($httpRequest);
50: if ($appRequest !== NULL) {
51: $appRequest->setPresenterName($this->module . $appRequest->getPresenterName());
52: return $appRequest;
53: }
54: }
55: return NULL;
56: }
57:
58:
59:
60: 61: 62: 63: 64: 65:
66: public function constructUrl(Nette\Application\Request $appRequest, Nette\Http\Url $refUrl)
67: {
68: if ($this->cachedRoutes === NULL) {
69: $routes = array();
70: $routes['*'] = array();
71:
72: foreach ($this as $route) {
73: $presenter = $route instanceof Route ? $route->getTargetPresenter() : NULL;
74:
75: if ($presenter === FALSE) {
76: continue;
77: }
78:
79: if (is_string($presenter)) {
80: $presenter = strtolower($presenter);
81: if (!isset($routes[$presenter])) {
82: $routes[$presenter] = $routes['*'];
83: }
84: $routes[$presenter][] = $route;
85:
86: } else {
87: foreach ($routes as $id => $foo) {
88: $routes[$id][] = $route;
89: }
90: }
91: }
92:
93: $this->cachedRoutes = $routes;
94: }
95:
96: if ($this->module) {
97: if (strncasecmp($tmp = $appRequest->getPresenterName(), $this->module, strlen($this->module)) === 0) {
98: $appRequest = clone $appRequest;
99: $appRequest->setPresenterName(substr($tmp, strlen($this->module)));
100: } else {
101: return NULL;
102: }
103: }
104:
105: $presenter = strtolower($appRequest->getPresenterName());
106: if (!isset($this->cachedRoutes[$presenter])) {
107: $presenter = '*';
108: }
109:
110: foreach ($this->cachedRoutes[$presenter] as $route) {
111: $url = $route->constructUrl($appRequest, $refUrl);
112: if ($url !== NULL) {
113: return $url;
114: }
115: }
116:
117: return NULL;
118: }
119:
120:
121:
122: 123: 124: 125: 126: 127:
128: public function offsetSet($index, $route)
129: {
130: if (!$route instanceof Nette\Application\IRouter) {
131: throw new Nette\InvalidArgumentException("Argument must be IRouter descendant.");
132: }
133: parent::offsetSet($index, $route);
134: }
135:
136:
137:
138: 139: 140:
141: public function getModule()
142: {
143: return $this->module;
144: }
145:
146: }
147: