/**
  * Dynamic action to preview a node
  * @param \ride\web\cms\node\dispatcher\NodeDispatcherFactory $nodeDispatcherFactory
  * @param \ride\library\template\TemplateFacade $templateFacade
  * @param string $site Id of the site
  * @param string $revision Name of the revision
  * @param string $locale Code of the locale
  * @return null
  */
 public function previewAction(NodeDispatcherFactory $nodeDispatcherFactory, TemplateFacade $templateFacade, $site, $revision, $locale)
 {
     $node = $site;
     if (!$this->cms->resolveNode($site, $revision, $node, null, true)) {
         return;
     }
     $cache = null;
     $i18n = $this->getI18n();
     $i18n->setCurrentLocale($locale);
     $requestUrl = $this->request->getUrl();
     $routeUrl = $this->request->getRoute()->getUrl($this->request->getBaseScript(), array('locale' => $locale, 'site' => $site->getId(), 'revision' => $revision));
     $path = str_replace($routeUrl, '', $requestUrl);
     $node = $site->getChildByRoute($path, $locale, $this->cms->getLocales());
     if (!$node) {
         $this->response->setStatusCode(Response::STATUS_CODE_NOT_FOUND);
         return;
     }
     $nodeDispatcher = $nodeDispatcherFactory->createNodeDispatcher($site, $node->getId(), $routeUrl, $locale);
     if (!$nodeDispatcher) {
         $this->response->setStatusCode(Response::STATUS_CODE_NOT_FOUND);
         return;
     }
     $node = $nodeDispatcher->getNode();
     if (!$node->isAvailableInLocale($locale)) {
         $this->response->setStatusCode(Response::STATUS_CODE_NOT_FOUND);
         return;
     }
     if (!$node->isAllowed($this->getSecurityManager())) {
         throw new UnauthorizedException();
     }
     $this->request->setBaseScript($routeUrl);
     if ($node->getType() == RedirectNodeType::NAME) {
         $url = $node->getRedirectUrl($locale);
         if ($url) {
             $this->response->setRedirect($url);
             return;
         }
         $node = $node->getRedirectNode($locale);
         if (!$node) {
             throw new CmsException('No redirect properties set to this node for locale "' . $locale . '".');
         }
         $revision = $site->getRevision();
         $site = $site->getId();
         if (!$this->cms->resolveNode($site, $revision, $node)) {
             return;
         }
         $redirectUrl = $this->request->getBaseScript() . $node->getRoute($locale);
         $this->response->setRedirect($redirectUrl);
         return;
     }
     $nodeView = $nodeDispatcher->getView();
     $nodeView->setLayouts($this->cms->getLayouts());
     $nodeView->setTemplateFacade($templateFacade);
     $templateFacade->setThemeModel($this->cms->getThemeModel());
     $templateFacade->setDefaultTheme($nodeView->getTemplate()->getTheme());
     $textParser = $this->dependencyInjector->get('ride\\library\\cms\\content\\text\\TextParser', 'chain');
     $textParser->setBaseUrl($this->request->getBaseUrl());
     $textParser->setSiteUrl($routeUrl);
     $nodeDispatcher->dispatch($this->request, $this->response, $this->getUser(), $cache);
 }
 /**
  * Dispatches the frontend of a node
  * @return null
  */
 public function indexAction(Cms $cms, CmsCacheControl $cacheControl, NodeDispatcherFactory $nodeDispatcherFactory, TemplateFacade $templateFacade, $node, $locale = null)
 {
     $cache = null;
     if ($cacheControl->isEnabled()) {
         $cache = $this->dependencyInjector->get('ride\\library\\cache\\pool\\CachePool', 'cms');
     }
     $i18n = $this->getI18n();
     $siteLocale = null;
     try {
         $site = $cms->getCurrentSite($this->request->getBaseUrl(), $siteLocale);
     } catch (NodeNotFoundException $exception) {
         // not found, try the public web controller
         return $this->chainWebRequest();
     }
     if ($siteLocale && $locale && $siteLocale != $locale) {
         // locale inconsistency, not found, try the public web controller
         return $this->chainWebRequest();
     } elseif ($siteLocale) {
         // set the locale of the site
         $i18n->setCurrentLocale($siteLocale);
     } elseif ($locale) {
         // set the requested locale
         $i18n->setCurrentLocale($locale);
     } else {
         // fallback locale
         $locale = $i18n->getLocale()->getCode();
     }
     $nodeDispatcher = $nodeDispatcherFactory->createNodeDispatcher($site, $node, $this->request->getBaseScript(), $locale);
     if ($nodeDispatcher) {
         $node = $nodeDispatcher->getNode();
         if ($node->isPublished() && $node->isAvailableInLocale($locale)) {
             $securityManager = $this->getSecurityManager();
             if (!$node->isAllowed($securityManager)) {
                 throw new UnauthorizedException();
             }
             $nodeView = $nodeDispatcher->getView();
             $nodeView->setTemplateFacade($templateFacade);
             $nodeView->setLayouts($cms->getLayouts());
             $textParser = $this->dependencyInjector->get('ride\\library\\cms\\content\\text\\TextParser', 'chain');
             $textParser->setBaseUrl($this->request->getBaseUrl());
             $textParser->setSiteUrl($this->request->getBaseScript());
             $templateFacade->setThemeModel($cms->getThemeModel());
             $templateFacade->setDefaultTheme($nodeView->getTemplate()->getTheme());
             $nodeDispatcher->dispatch($this->request, $this->response, $securityManager, $cache);
             if ($this->response->getStatusCode() != Response::STATUS_CODE_NOT_FOUND) {
                 $headers = $node->getHeader($locale);
                 foreach ($headers as $name => $value) {
                     $this->response->setHeader($name, $value);
                 }
                 return;
             }
         }
     }
     // not found, try the public web controller
     return $this->chainWebRequest();
 }
 /**
  * Perform the template node action
  */
 public function indexAction(TemplateFacade $templateFacade, FileBrowser $fileBrowser, $locale, $site, $revision, $node)
 {
     if (!$this->cms->resolveNode($site, $revision, $node)) {
         return;
     }
     $this->setContentLocale($locale);
     $this->cms->setLastAction(self::NAME);
     $referer = $this->request->getQueryParameter('referer');
     $templateFacade->setThemeModel($this->cms->getThemeModel());
     $templates = array('index' => 'cms/frontend/index');
     if ($node->getId() == $site->getId()) {
         $id = null;
     } else {
         $id = $node->getId();
     }
     $component = new TemplatesComponent();
     $data = $component->createData($templateFacade, $templates, $node->getTheme(), $id);
     $form = $this->buildForm($component, $data);
     if ($form->isSubmitted()) {
         try {
             $form->validate();
             $data = $form->getData();
             $applicationDirectory = $fileBrowser->getApplicationDirectory();
             foreach ($templates as $name => $template) {
                 $file = $applicationDirectory->getChild($data['path'][$name]);
                 $file->getParent()->create();
                 $file->write($data['content'][$name]);
             }
             $this->addSuccess('success.node.saved', array('node' => $node->getName($locale)));
             $url = $this->getUrl(self::ROUTE, array('site' => $site->getId(), 'revision' => $node->getRevision(), 'locale' => $locale, 'node' => $node->getId()));
             if ($referer) {
                 $url .= '?referer=' . urlencode($referer);
             }
             $this->response->setRedirect($url);
             return;
         } catch (ValidationException $validationException) {
             $this->setValidationException($validationException, $form);
         }
     }
     $this->setTemplateView('cms/backend/node.templates', array('site' => $site, 'node' => $node, 'templates' => $templates, 'form' => $form->getView(), 'referer' => $referer, 'locale' => $locale, 'locales' => $this->cms->getLocales()));
 }
 /**
  * Action to edit the templates of the widget
  * @param Cms $cms
  * @param TemplateFacade $templateFacade
  * @param FileBrowser $fileBrowser
  * @param string $locale
  * @param string $site
  * @param string $revision
  * @param string $node
  * @param string $region
  * @param string $widget
  * @return null
  */
 public function indexAction(Cms $cms, TemplateFacade $templateFacade, FileBrowser $fileBrowser, $locale, $site, $revision, $node, $region, $widget)
 {
     if (!$cms->resolveNode($site, $revision, $node) || !$cms->resolveRegion($node, $locale, $region)) {
         return;
     }
     $templateFacade->setThemeModel($cms->getThemeModel());
     $widgetId = $widget;
     $widget = $site->getWidget($widgetId);
     $widget = clone $cms->getWidget($widget);
     $widget->setRequest($this->request);
     $widget->setResponse($this->response);
     $widget->setProperties($node->getWidgetProperties($widgetId));
     $widget->setLocale($locale);
     $widget->setRegion($region);
     if ($widget instanceof AbstractController) {
         $widget->setConfig($this->config);
         $widget->setDependencyInjector($this->dependencyInjector);
     }
     $templates = $widget->getTemplates();
     foreach ($templates as $index => $template) {
         $tokens = explode('/', $template);
         $name = array_pop($tokens);
         unset($templates[$index]);
         $templates[$name] = $template;
     }
     $component = new TemplatesComponent();
     $data = $component->createData($templateFacade, $templates, $node->getTheme(), $widgetId);
     $form = $this->buildForm($component, $data);
     if ($form->isSubmitted()) {
         try {
             $form->validate();
             $data = $form->getData();
             $applicationDirectory = $fileBrowser->getApplicationDirectory();
             foreach ($templates as $name => $template) {
                 $file = $applicationDirectory->getChild($data['path'][$name]);
                 $file->getParent()->create();
                 $file->write($data['content'][$name]);
             }
             $this->addSuccess('success.widget.saved', array('widget' => $this->getTranslator()->translate('widget.' . $widget->getName())));
             $this->response->setRedirect($this->getUrl('cms.node.content.region', array('locale' => $locale, 'site' => $site->getId(), 'revision' => $node->getRevision(), 'node' => $node->getId(), 'region' => $region)));
             return;
         } catch (ValidationException $validationException) {
             $this->setValidationException($validationException, $form);
         }
     }
     $referer = $this->request->getQueryParameter('referer');
     $this->setTemplateView('cms/backend/widget.templates', array('site' => $site, 'node' => $node, 'referer' => $referer, 'locale' => $locale, 'locales' => $cms->getLocales(), 'region' => $region, 'widget' => $widget, 'widgetId' => $widgetId, 'widgetName' => $this->getTranslator()->translate('widget.' . $widget->getName()), 'templates' => $templates, 'form' => $form->getView()));
 }