/**
  * 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;
 }