/** * Gets the route container from a data source * @return \ride\library\router\RouteContainer */ public function getRouteContainer() { $container = new RouteContainer(); $nodeTypeManager = $this->nodeModel->getNodeTypeManager(); $nodeTypes = $nodeTypeManager->getNodeTypes(); $defaultRevision = $this->nodeModel->getDefaultRevision(); $registeredPaths = array(); $expiredCallback = array('ride\\web\\cms\\controller\\frontend\\ExpiredController', 'indexAction'); $sites = $this->nodeModel->getSites(); foreach ($sites as $siteId => $site) { $nodes = $this->nodeModel->getNodes($siteId, $defaultRevision); foreach ($this->locales as $locale) { $baseUrl = $site->getBaseUrl($locale); foreach ($nodes as $nodeId => $node) { if (!$node->getParent()) { continue; } $nodeType = $nodeTypes[$node->getType()]; $callback = $nodeType->getFrontendCallback(); if (!$callback) { continue; } if (!$node->isAvailableInLocale($locale)) { continue; } $path = $node->getRoute($locale); $route = new Route($path, $callback, 'cms.front.' . $siteId . '.' . $nodeId . '.' . $locale); $route->setIsDynamic(true); $route->setPredefinedArguments(array('site' => $siteId, 'node' => $nodeId)); $route->setLocale($locale); if ($baseUrl) { $route->setBaseUrl($baseUrl); } $container->addRoute($route); $registeredPaths[$path] = true; } } $expiredRoutes = $this->expiredRouteModel->getExpiredRoutes($siteId); foreach ($expiredRoutes as $expiredRoute) { $path = $expiredRoute->getPath(); if (isset($registeredPaths[$path]) || $path == '/') { continue; } $route = new Route($path, $expiredCallback); $route->setIsDynamic(true); $route->setPredefinedArguments(array('site' => $siteId, 'node' => $expiredRoute->getNode())); $route->setLocale($expiredRoute->getLocale()); $baseUrl = $expiredRoute->getBaseUrl(); if ($baseUrl) { $route->setBaseUrl($baseUrl); } $container->addRoute($route); } } return $container; }
/** * Dispatches a widget * @param \ride\library\mvc\Request $request * @param \ride\library\mvc\Response $response * @param integer $widgetId Id of the widget instance * @param \ride\library\cms\widget\Widget $widget Instance of the widget * @return null */ protected function dispatchWidget(Request $request, Response $response, $widgetId, Widget $widget) { $routeArgumentsMatched = false; $callback = null; $widget->setIdentifier($widgetId); $widget->setLocale($this->locale); $widget->setRegion($this->region); $widget->setSection($this->section); $widget->setBlock($this->block); $route = $request->getRoute(); $route->setIsDynamic(false); $widgetRoutes = $widget->getRoutes(); if ($widgetRoutes && $this->routeArguments) { $widgetRouteContainer = new RouteContainer(); foreach ($widgetRoutes as $widgetRoute) { $widgetRouteContainer->addRoute($widgetRoute); } $path = '/' . implode('/', $this->routeArguments); $this->router->setRouteContainer($widgetRouteContainer); $routeResult = $this->router->route($request->getMethod(), $path, $widgetRoutes); $widgetRoute = $routeResult->getRoute(); if ($widgetRoute) { $callback = $widgetRoute->getCallback(); $route->setArguments($widgetRoute->getArguments()); $route->setIsDynamic($widgetRoute->isDynamic()); $routeArgumentsMatched = true; } } else { $route->setArguments(array()); $route->setIsDynamic(false); } if (!$callback) { $callback = $widget->getCallback(); } $route->setCallback($callback); $this->dispatcher->dispatch($request, $response); return $routeArgumentsMatched; }