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: