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