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