1: <?php
2:
3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21:
22:
23: namespace picon;
24:
25: 26: 27: 28: 29: 30:
31: class PageRequestResolver implements RequestResolver
32: {
33: public function resolve(Request $request)
34: {
35: if($this->isHomePage($request))
36: {
37: $homepage = PiconApplication::get()->getHomePage();
38: return new PageRequestTarget($homepage::getIdentifier());
39: }
40: else
41: {
42: return new PageRequestTarget($this->getPageClassForPath($request));
43: }
44: }
45:
46: public function matches(Request $request)
47: {
48: return ($this->isHomePage($request) || $this->getPageClassForPath($request)!=false) && $request->getParameter('picon-resource')==null && $request->getParameter('listener')==null && $request->getParameter('pageid')==null;
49: }
50:
51: 52: 53: 54: 55: 56:
57: private function isHomePage(Request $request)
58: {
59: return preg_match("/^".$this->prepare($request->getRootPath())."\/{1}([?|&]{1}\\S+={1}\\S+)*$/", $request->getPath());
60: }
61:
62: 63: 64: 65: 66:
67: private function getPageClassForPath(Request $request)
68: {
69: $mapEntry = PageMap::getPageMap();
70:
71: foreach($mapEntry as $path => $pageClass)
72: {
73: if(preg_match("/^".$this->prepare($request->getRootPath())."\/".str_replace("/", "\\/", $path)."{1}([?|&]{1}\\S+={1}\\S+)*$/", urldecode($request->getPath())))
74: {
75: return $pageClass::getIdentifier();
76: }
77: }
78: return false;
79: }
80:
81: 82: 83: 84: 85: 86: 87:
88: public function generateUrl(RequestTarget $target)
89: {
90: if($target instanceof PageRequestWithListenerTarget)
91: {
92: $trail = "";
93: if($target->getPageClass()->namespace!=null)
94: {
95: $trail = '/';
96: }
97: $behaviourApped = null;
98: if($target->getBehaviour()!=null)
99: {
100: $behaviourApped = '&behaviour='.$target->getBehaviour();
101: }
102:
103: return $target->getPageClass()->namespace.$trail.$target->getPageClass()->className.'?listener='.$target->getComponentPath().$behaviourApped;
104: }
105: else if($target instanceof ListenerRequestTarget)
106: {
107: $ident = $target->getPage()->getIdentifier();
108: $trail = "";
109: if($ident->namespace!=null)
110: {
111: $trail = '/';
112: }
113:
114: $behaviourApped = null;
115: if($target->getBehaviour()!=null)
116: {
117: $behaviourApped = '&behaviour='.$target->getBehaviour();
118: }
119:
120: return $ident->namespace.$trail.$ident->className.'?pageid='.$target->getPage()->getId().'&listener='.$target->getComponentPath().$behaviourApped;
121: }
122: else
123: {
124: $trail = "";
125: if($target->getPageClass()->namespace!=null)
126: {
127: $trail = '/';
128: }
129: return $target->getPageClass()->namespace.$trail.$target->getPageClass()->className;
130: }
131: }
132:
133: public function handles(RequestTarget $target)
134: {
135: return $target instanceof PageRequestTarget || $target instanceof ListenerRequestTarget;
136: }
137:
138: private function prepare($value)
139: {
140: return str_replace('/', "\\/", $value);
141: }
142: }
143:
144: ?>
145: