|
|
@@ -40,6 +40,16 @@ class Router
|
|
|
**/
|
|
|
private $context;
|
|
|
|
|
|
+ /**
|
|
|
+ * @var array RouteParams
|
|
|
+ * Contains route parameter
|
|
|
+ * ex: /product/:id will contains {
|
|
|
+ * 0 => product
|
|
|
+ * 1 => [ID]
|
|
|
+ * ':id' => [ID]
|
|
|
+ **/
|
|
|
+ private $routeParams;
|
|
|
+
|
|
|
/**
|
|
|
* @var string $modulePath
|
|
|
* Contains the module directory
|
|
|
@@ -97,23 +107,84 @@ class Router
|
|
|
**/
|
|
|
public function serveUrl()
|
|
|
{
|
|
|
+ //TODO trigger hook GET, POST
|
|
|
$this->prepareUrl();
|
|
|
$requestParams = explode("/", $this->requestUrl);
|
|
|
foreach ($this->routes as $i)
|
|
|
{
|
|
|
$routeParams = explode("/", $i[0]);
|
|
|
+ $p = $this->routeMatch($requestParams, $routeParams);
|
|
|
+ if (!$p)
|
|
|
+ continue;
|
|
|
+ $controller = $this->createController($i[1], $p);
|
|
|
+ if ($controller)
|
|
|
+ return $controller;
|
|
|
}
|
|
|
- //TODO@2
|
|
|
+ return false;
|
|
|
}
|
|
|
|
|
|
+ /**
|
|
|
+ * Create and return Controller for the given route
|
|
|
+ * @param $className
|
|
|
+ * @param array $routeParameters
|
|
|
+ * @return \Tools\AController on succes, false otherwise
|
|
|
+ **/
|
|
|
+ private function createController($className, $params)
|
|
|
+ {
|
|
|
+ if (!class_exists($className))
|
|
|
+ return false;
|
|
|
+ try
|
|
|
+ {
|
|
|
+ $this->routeParams = $params;
|
|
|
+ $result = new $className($this->context, $params);
|
|
|
+ }
|
|
|
+ catch (\Exception\Error404 $e)
|
|
|
+ {
|
|
|
+ return false;
|
|
|
+ }
|
|
|
+ if (!($result instanceof \Tools\AController))
|
|
|
+ return false;
|
|
|
+ return $result;
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * Check if the request match route
|
|
|
+ * @param array $request User request
|
|
|
+ * @param array $route Route to check
|
|
|
+ * @return array on success, false on failure
|
|
|
+ **/
|
|
|
+ private function routeMatch($request, $route)
|
|
|
+ {
|
|
|
+ $i = count($request);
|
|
|
+ $params = array();
|
|
|
+ if ($i != count($route))
|
|
|
+ return false;
|
|
|
+ while ($i)
|
|
|
+ {
|
|
|
+ $i--;
|
|
|
+ if ($route[$i] == '' && $request[$i] == '')
|
|
|
+ continue;
|
|
|
+ if ($route[$i] == '' || $request[$i] == '')
|
|
|
+ return false;
|
|
|
+ if ($route[$i][0] != ':' && ($route[$i] != $request[$i]))
|
|
|
+ return false;
|
|
|
+ if ($route[$i][0] == ':')
|
|
|
+ $params[$route[$i]] = $request[$i];
|
|
|
+ $params[$i -1] = $request[$i];
|
|
|
+ }
|
|
|
+ return array_reverse($params);
|
|
|
+ }
|
|
|
+
|
|
|
/**
|
|
|
* Append local routes to router
|
|
|
* Will load CMS pages, categories page, products page, cart pages, etc.
|
|
|
**/
|
|
|
private function prepareUrl()
|
|
|
{
|
|
|
- $this->doRouteAdd("/:item", "\Controller\Product");
|
|
|
- $this->doRouteAdd("/:category/:item", "\Controller\Product");
|
|
|
+ $fetcher = new \Entity\Cms();
|
|
|
+ $pages = $fetcher->selects(null, array("order"));
|
|
|
+ foreach ($pages as $i)
|
|
|
+ $this->doRouteAdd($i->shurl, $i->controller);
|
|
|
}
|
|
|
|
|
|
/**
|
|
|
@@ -142,6 +213,9 @@ class Router
|
|
|
$this->doRouteAdd($route, $controller);
|
|
|
}
|
|
|
|
|
|
+ /**
|
|
|
+ * Getter
|
|
|
+ **/
|
|
|
public function __get($key)
|
|
|
{
|
|
|
switch ($key)
|