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