ecom
E-commerce cms
 All Data Structures Namespaces Files Functions Variables
Router.php
Go to the documentation of this file.
1 <?php
2 
3 namespace Tools;
4 
9 class Router
10 {
16  private $rootPath;
17 
23  private $rootUrl;
24 
29  private $requestUrl;
30 
34  private $routes;
35 
41  private $context;
42 
51  private $routeParams;
52 
57  private $overridden;
58 
82  public function __construct($server, $context)
83  {
84  $pos = strrpos($server["SCRIPT_NAME"], "/");
85  $relativePath = (($pos === FALSE) ? "" : substr($server["SCRIPT_NAME"], 0, $pos));
86  $this->rootPath = $server["DOCUMENT_ROOT"] . $relativePath . "/";
87  $this->rootUrl = $server["REQUEST_SCHEME"] . "://" . $server["HTTP_HOST"] . $relativePath ."/";
88  $this->requestUrl = substr($server["REQUEST_URI"], count($this->rootUrl) -1);
89  $this->context = $context;
90  $this->routes = array();
91  $this->overridden = null;
92  }
93 
99  public function init($server)
100  {
101  $siteUrl = \Entity\Config::getConfig(null, "siteUrl");
102  // @codeCoverageIgnoreStart
103  // This code is tested under another process
104  if ($siteUrl != $server["HTTP_HOST"] && $siteUrl !== null)
105  {
106  header("location: http://{$siteUrl}{$server['REQUEST_URI']}");
107  die;
108  }
109  // @codeCoverageIgnoreEnd
110  }
111 
118  public function serveUrl()
119  {
120  $this->prepareUrl();
121  $requestParams = explode("/", $this->requestUrl);
122  foreach ($this->routes as $i)
123  {
124  $routeParams = explode("/", $i[0]);
125  $p = $this->routeMatch($requestParams, $routeParams);
126  if ($p === false)
127  continue;
128  $controller = $this->createController($i[1], $p);
129  if ($controller)
130  return $controller;
131  }
132  return false;
133  }
134 
141  private function createController($className, $params)
142  {
143  if (!class_exists($className))
144  return false;
145  $this->routeParams = $params;
146  $result = null;
147  try
148  {
149  $result = new $className($this->context, $params);
150  if (!($result instanceof \Tools\AController))
151  return false;
152  }
153  catch (\Exception\Error404 $e)
154  {
155  return false;
156  }
157  return $result;
158  }
159 
166  private function routeMatch($request, $route)
167  {
168  $i = count($request);
169  $params = array();
170  if ($i != count($route))
171  return false;
172  while ($i)
173  {
174  $i--;
175  if ($route[$i] == '' && $request[$i] == '')
176  continue;
177  if ($route[$i] == '' || $request[$i] == '')
178  return false;
179  if ($route[$i][0] != ':' && ($route[$i] != $request[$i]))
180  return false;
181  if ($route[$i][0] == ':')
182  $params[$route[$i]] = $request[$i];
183  $params[$i -1] = $request[$i];
184  }
185  return array_reverse($params);
186  }
187 
192  private function prepareUrl()
193  {
194  $fetcher = new \Entity\Cms();
195  $pages = $fetcher->selects(null, array("order"));
196  foreach ($pages as $i)
197  $this->doRouteAdd($i->shurl, $i->controller);
198  }
199 
204  private function doRouteAdd($route, $controller)
205  {
206  $this->routes[] = array($route, $controller);
207  }
208 
219  public function routeAdd($route, $controller)
220  {
221  if (!$this->context->hookManager->isInHook("routerSetup"))
222  throw new \Exception("You can only add routes from `routerSetup' hook");
223  $this->doRouteAdd($route, $controller);
224  }
225 
234  public function overrideUrl($type, $value)
235  {
236  if (!$this->context->isTestingEnvironment())
237  return false;
238  $this->overridden[$type] = $value;
239  return true;
240  }
241 
245  public function __get($key)
246  {
247  if (isset($this->overridden) && in_array($key, array("modulesPath")))
248  return $this->overridden[$key];
249  switch ($key)
250  {
251  case "rootPath": return $this->rootPath; break;
252  case "rootUrl": return $this->rootUrl; break;
253  case "modulesPath": return $this->rootPath."content/modules/"; break;
254  case "modulesUrl": return $this->rootUrl."content/modules/"; break;
255  case "themesPath": return $this->rootPath."content/theme/"; break;
256  case "themesUrl": return $this->rootUrl."content/theme/"; break;
257  }
258  throw new \Exception("Cannot access attribute {$key}");
259  }
260 }
261 
doRouteAdd($route, $controller)
Definition: Router.php:204
__get($key)
Definition: Router.php:245
overrideUrl($type, $value)
Definition: Router.php:234
static getConfig($lang=null, $key=null, $defaultValue=null)
Definition: Config.php:44
__construct($server, $context)
Definition: Router.php:82
createController($className, $params)
Definition: Router.php:141
init($server)
Definition: Router.php:99
routeAdd($route, $controller)
Definition: Router.php:219
routeMatch($request, $route)
Definition: Router.php:166