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