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