Commit | Line | Data |
---|---|---|
2aa91ff2 S |
1 | <?php |
2 | namespace dns\system; | |
ff49a0be | 3 | use dns\system\cache\builder\ControllerCacheBuilder; |
2aa91ff2 S |
4 | |
5 | /** | |
6 | * @author Jan Altensen (Stricted) | |
7 | * @license GNU Lesser General Public License <http://opensource.org/licenses/lgpl-license.php> | |
8 | * @copyright 2013-2015 Jan Altensen (Stricted) | |
9 | */ | |
10 | class RequestHandler { | |
ff49a0be S |
11 | protected $pattern = ""; |
12 | protected $routeData = array(); | |
13 | protected $controllers = array(); | |
14 | ||
2aa91ff2 S |
15 | /** |
16 | * init RequestHandler | |
17 | */ | |
2f234923 | 18 | public function __construct ($module = '') { |
ff49a0be S |
19 | $this->pattern = '~/?(?:(?P<controller>[A-Za-z0-9\-]+)(?:/(?P<id>\d+)(?:-(?P<title>[^/]+))?)?)?~x'; |
20 | $this->getControllers($module); | |
21 | ||
22 | if (DNS::getSession()->username !== null) { | |
23 | DNS::getTPL()->assign(array("username" => DNS::getSession()->username)); | |
2aa91ff2 S |
24 | } |
25 | else { | |
ff49a0be | 26 | DNS::getTPL()->assign(array("username" => '')); |
2aa91ff2 S |
27 | } |
28 | ||
ff49a0be S |
29 | $className = ""; |
30 | if (!empty($_SERVER['QUERY_STRING'])) { | |
31 | $this->matches($_SERVER['QUERY_STRING']); | |
32 | $this->registerRouteData(); | |
33 | } | |
34 | else { | |
35 | $className = '\\dns'.(empty($module) ? '' : '\\'.$module).'\\page\\IndexPage'; | |
2aa91ff2 S |
36 | } |
37 | ||
ff49a0be S |
38 | if (isset($this->routeData['controller']) && !empty($this->routeData['controller'])) { |
39 | $controller = strtolower($this->routeData['controller']); | |
40 | if (isset($this->controllers[$controller]) && !empty($this->controllers[$controller])) { | |
41 | $className = $this->controllers[$controller]; | |
42 | } | |
43 | else { | |
44 | @header('HTTP/1.0 404 Not Found'); | |
45 | DNS::getTPL()->assign(array("activeMenuItem" => '', "error" => 'The link you are trying to reach is no longer available or invalid.')); | |
46 | DNS::getTPL()->display('error.tpl'); | |
47 | exit; | |
48 | } | |
2aa91ff2 S |
49 | } |
50 | ||
ff49a0be S |
51 | if (!User::isLoggedIn() && $className != '\dns\page\LoginPage' && $className != '\dns\page\ApiPage') { |
52 | DNS::getTPL()->display('login.tpl'); | |
2aa91ff2 S |
53 | exit; |
54 | } | |
55 | ||
56 | // handle offline mode | |
57 | if (defined('OFFLINE') && OFFLINE) { | |
58 | $admin = User::isAdmin(); | |
59 | $available = false; | |
60 | ||
61 | if (defined($className . '::AVAILABLE_DURING_OFFLINE_MODE') && constant($className . '::AVAILABLE_DURING_OFFLINE_MODE')) { | |
62 | $available = true; | |
63 | } | |
64 | ||
65 | if (!$admin && !$available) { | |
66 | @header('HTTP/1.1 503 Service Unavailable'); | |
67 | DNS::getTPL()->display('offline.tpl'); | |
68 | exit; | |
69 | } | |
70 | } | |
71 | ||
72 | try { | |
73 | new $className(); | |
74 | } | |
75 | catch (\Exception $e) { | |
76 | if ($e->getCode() == 404) { | |
77 | @header('HTTP/1.0 404 Not Found'); | |
78 | } | |
79 | else if ($e->getCode() == 403) { | |
80 | @header('HTTP/1.0 403 Forbidden'); | |
81 | } | |
82 | ||
83 | /* show error page */ | |
84 | DNS::getTPL()->assign(array("activeMenuItem" => '', "error" => $e->getMessage())); | |
85 | DNS::getTPL()->display('error.tpl'); | |
86 | exit; | |
87 | } | |
88 | } | |
ff49a0be S |
89 | |
90 | /** | |
91 | * Registers route data within $_GET and $_REQUEST. | |
92 | */ | |
93 | protected function registerRouteData() { | |
94 | foreach ($this->routeData as $key => $value) { | |
95 | $_GET[$key] = $value; | |
96 | $_REQUEST[$key] = $value; | |
97 | } | |
98 | } | |
99 | ||
100 | public function getControllers ($module) { | |
101 | ||
102 | $this->controllers = ControllerCacheBuilder::getInstance()->getData(array('module' => $module)); | |
103 | /* | |
104 | $pages = glob(DNS_DIR.'/lib/'.(empty($module) ? '' : $module.'/').'page/*Page.class.php'); | |
105 | ||
106 | foreach ($pages as $page) { | |
107 | $page = str_replace('Page.class.php', '', basename($page)); | |
108 | ||
109 | $class = "\\dns".(empty($module) ? '' : "\\".$module)."\\page\\".$page."Page"; | |
110 | if (class_exists($class) && is_subclass_of($class, '\\dns\\page\\AbstractPage')) { | |
111 | $this->controllers[strtolower($page)] = $class; | |
112 | } | |
113 | } | |
114 | */ | |
115 | } | |
116 | ||
117 | public function matches($requestURL) { | |
118 | if (preg_match($this->pattern, $requestURL, $matches)) { | |
119 | foreach ($matches as $key => $value) { | |
120 | if (!is_numeric($key)) { | |
121 | $this->routeData[$key] = $value; | |
122 | } | |
123 | } | |
124 | ||
125 | return true; | |
126 | } | |
127 | ||
128 | return false; | |
129 | } | |
2aa91ff2 | 130 | } |