/**
  * Dispatches the frontend of a redirect node
  * @param integer $node Id of the node
  * @return null
  */
 public function indexAction(Cms $cms, I18n $i18n, $site, $node, $locale = null)
 {
     if (!$cms->resolveNode($site, null, $node, RedirectNodeType::NAME)) {
         return;
     }
     if ($locale === null) {
         $locale = $i18n->getLocale()->getCode();
     } else {
         $i18n->setCurrentLocale($locale);
     }
     $path = $this->request->getBasePath(true);
     if (!$path || $path !== $node->getRoute($locale)) {
         return $this->chainWebRequest();
     }
     $url = $node->getRedirectUrl($locale);
     $url = $node->resolveUrl($locale, $this->request->getBaseScript(), $url);
     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 (!$cms->resolveNode($site, $revision, $node)) {
         return;
     }
     $redirectUrl = $this->request->getBaseScript() . $node->getRoute($locale);
     $this->response->setRedirect($redirectUrl);
 }
 /**
  * Sets a cookie for the current locale when offering a HTML view
  * @param \ride\library\event\Event $event
  * @param \ride\library\i18n\I18n $i18n
  * @return null
  */
 public function handleLocaleCookie(Event $event, I18n $i18n)
 {
     $web = $event->getArgument('web');
     $request = $web->getRequest();
     $response = $web->getResponse();
     $view = $response->getView();
     if (!$view instanceof HtmlView) {
         return;
     }
     $cookieName = $this->getCookieName();
     $locale = $i18n->getLocale()->getCode();
     $domain = $request->getHeader(Header::HEADER_HOST);
     $cookie = new Cookie($cookieName, $locale, 0, $domain, '/', $request->isSecure());
     $response->setCookie($cookie);
 }
 /**
  * Action to show an overview of a folder
  * @param \ride\library\i18n\I18n $i18n Instance of I18n
  * @param \ride\library\orm\OrmManager $orm Instance of the ORM
  * @param string $locale Code of the content locale
  * @param string $folder Id of the folder to show, null for root folder
  * @return null
  */
 public function indexAction(I18n $i18n, OrmManager $orm, $locale = null, $folder = null)
 {
     // force a locale
     if (!$locale) {
         $url = $this->getUrl('assets.overview.locale', array('locale' => $this->getContentLocale()));
         $this->response->setRedirect($url);
         return;
     }
     // check locale
     try {
         $locale = $i18n->getLocale($locale)->getCode();
     } catch (LocaleNotFoundException $exception) {
         $this->response->setNotFound();
         return;
     }
     $this->setContentLocale($locale);
     $folderModel = $orm->getAssetFolderModel();
     $assetModel = $orm->getAssetModel();
     // process arguments
     $embed = $this->request->getQueryParameter('embed', false);
     $selected = $this->request->getQueryParameter('selected');
     $views = array('grid', 'list');
     $view = $this->request->getQueryParameter('view', 'grid');
     if (!in_array($view, $views)) {
         $view = 'grid';
     }
     $limit = $this->request->getQueryParameter('limit', 24);
     $limit = $this->request->getBodyParameter('limit', $limit);
     if (!is_numeric($limit) || $limit < 1) {
         $limit = 24;
     }
     $limit = (int) $limit;
     $page = $this->request->getQueryParameter('page', 1);
     if (!is_numeric($page) || $page < 1) {
         $page = 1;
     }
     $page = (int) $page;
     $filter = array('type' => $this->request->getQueryParameter('type', 'all'), 'date' => $this->request->getQueryParameter('date', 'all'), 'query' => $this->request->getQueryParameter('query'));
     $isFiltered = $filter['type'] != 'all' || $filter['date'] != 'all' || $filter['query'];
     // create the form
     $translator = $this->getTranslator();
     $types = $assetModel->getTypes($translator);
     $types = array('all' => $translator->translate('label.types.all'), 'folder' => $translator->translate('label.folder')) + $types;
     $months = $assetModel->getMonths();
     $months = array('all' => $translator->translate('label.dates.all'), 'today' => $translator->translate('label.today')) + $months;
     $form = $this->createFormBuilder($filter);
     $form->setId('form-filter');
     $form->addRow('type', 'select', array('options' => $types));
     $form->addRow('date', 'select', array('options' => $months));
     $form->addRow('query', 'string', array('attributes' => array('placeholder' => $translator->translate('label.search'))));
     $form->addRow('action', 'hidden', array());
     $form->addRow('order', 'hidden', array());
     $form->addRow('limit', 'hidden', array());
     $form->addRow('assets', 'hidden', array('multiple' => true));
     $form->addRow('folders', 'hidden', array('multiple' => true));
     $form->addRow('submit', 'hidden', array());
     $form = $form->build();
     // handle form
     if ($form->isSubmitted()) {
         $url = $this->request->getUrl();
         $data = $form->getData();
         switch ($data['submit']) {
             case 'limit':
                 $limit = $data['limit'];
             case 'filter':
                 if ($folder) {
                     $url = $this->getUrl('assets.folder.overview', array('locale' => $locale, 'folder' => $folder));
                 } else {
                     $url = $this->getUrl('assets.overview.locale', array('locale' => $locale));
                 }
                 $url .= '?view=' . $view . '&type=' . urlencode($data['type']) . '&date=' . urlencode($data['date']) . '&embed=' . ($embed ? 1 : 0) . '&limit=' . $limit . '&page=1';
                 if ($selected) {
                     $url .= '&selected=' . $selected;
                 }
                 if ($data['query']) {
                     $url .= '&query=' . urlencode($data['query']);
                 }
                 break;
             case 'bulk-action':
                 if (!$this->processBulkAction($orm, $locale, $folder, $data)) {
                     return;
                 }
                 break;
             case 'order':
                 if (!$this->processSort($orm, $locale, $folder, $data)) {
                     return;
                 }
                 break;
         }
         $this->response->setRedirect($url);
         return;
     }
     // fetch folder
     $folder = $folderModel->getFolder($folder, $locale, true);
     if (!$folder) {
         $this->response->setNotFound();
         return;
     }
     $numFolders = $folderModel->countFolders($folder, $locale, true, $filter);
     $numAssets = $assetModel->countByFolder($folder, $locale, true, $filter);
     $numItems = $numFolders + $numAssets;
     $folders = $folderModel->getFolders($folder, $locale, true, $filter, $limit, $page);
     if (count($folders) < $limit) {
         $assetLimit = $limit;
         $assetPage = $page;
         $offset = 0;
         if ($folders) {
             $assetLimit -= count($folders);
             $assetPage = 1;
         } else {
             if ($numFolders) {
                 $assetPage -= ceil($numFolders / $limit);
             }
             if ($page != 1 && $numFolders) {
                 $offset = $limit - $numFolders % $limit;
             }
         }
         $assets = $assetModel->getByFolder($folder, $locale, true, $filter, (int) $assetLimit, (int) $assetPage, $offset);
     } else {
         $assets = array();
     }
     $urlSuffix = '?view=' . $view . '&type=' . $filter['type'] . '&date=' . $filter['date'] . '&embed=' . ($embed ? 1 : 0) . '&limit=' . $limit . '&page=%page%';
     if ($filter['query']) {
         $urlSuffix .= '&query=' . urlencode($filter['query']);
     }
     if ($selected) {
         $urlSuffix .= '&selected=' . $selected;
     }
     $urlPagination = $this->getUrl('assets.folder.overview', array('locale' => $locale, 'folder' => $folder->getId())) . $urlSuffix;
     $pages = ceil($numItems / $limit);
     $pagination = new Pagination($pages, $page);
     $pagination->setHref($urlPagination);
     $urlSuffix = str_replace('%page%', $page, $urlSuffix);
     // assign everything to view
     $view = $this->setTemplateView('assets/overview', array('form' => $form->getView(), 'folder' => $folder, 'folders' => $folders, 'assets' => $assets, 'numFolders' => $numFolders, 'numAssets' => $numAssets, 'numItems' => $numItems, 'limit' => $limit, 'pagination' => $pagination, 'page' => $page, 'pages' => $pages, 'breadcrumbs' => $folderModel->getBreadcrumbs($folder), 'view' => $view, 'filter' => $filter, 'isFiltered' => $isFiltered, 'embed' => $embed, 'selected' => $selected, 'urlSuffix' => $urlSuffix, 'locales' => $i18n->getLocaleCodeList(), 'locale' => $locale));
 }
 /**
  * Sets a error view to the response if a status code above 399 is set
  * @return null
  */
 public function handleHttpError(Event $event, I18n $i18n)
 {
     $web = $event->getArgument('web');
     $request = $web->getRequest();
     $response = $web->getResponse();
     $route = $request->getRoute();
     if (!$route) {
         return;
     }
     $routeId = $route->getId();
     if ($routeId && substr($routeId, 0, 10) !== 'cms.front.') {
         // don't act on non cms pages
         return;
     }
     $statusCode = $response->getStatusCode();
     if ($statusCode != Response::STATUS_CODE_FORBIDDEN && $statusCode != Response::STATUS_CODE_NOT_FOUND || $request->isXmlHttpRequest() && $response->getView() instanceof JsonView) {
         // js request or not a forbidden or not a not found status
         return;
     }
     $locale = $i18n->getLocale()->getCode();
     // lookup site with the current base URL
     $baseUrl = $request->getBaseUrl();
     $site = null;
     $defaultSite = null;
     $sites = $this->cms->getSites();
     foreach ($sites as $site) {
         if ($site->getBaseUrl($locale) == $baseUrl) {
             break;
         }
         $defaultSite = $site;
         $site = null;
     }
     if (!$site) {
         if (!$defaultSite) {
             return;
         }
         $site = $defaultSite;
     }
     // get the error node
     $node = $site->get('error.' . $statusCode);
     if (!$node) {
         // no node setup for this error
         return;
     }
     // resolve the locale
     $locales = $site->getAvailableLocales();
     if ($locales != Node::LOCALES_ALL && !isset($locales[$locale])) {
         $locale = array_pop($locales);
         $i18n->setCurrentLocale($locale);
     }
     // dispatch the error page
     $routeContainer = $web->getRouter()->getRouteContainer();
     $route = $routeContainer->getRouteById('cms.front.' . $site->getId() . '.' . $node . '.' . $locale);
     if (!$route) {
         $route = $routeContainer->getRouteById('cms.node.frontend.locale');
         $route->setArguments(array('node' => $node, 'locale' => $locale));
     } else {
         $route->setArguments();
     }
     $loginRequest = $web->createRequest($route->getPath());
     $loginRequest->setRoute($route);
     $loginRequest->getHeaders()->setHeader(Header::HEADER_REFERER, $request->getUrl());
     if ($request->hasSession()) {
         $loginRequest->setSession($request->getSession());
     }
     $response->getMessageContainer()->removeAll();
     $response->setView(null);
     $response->setStatusCode(Response::STATUS_CODE_OK);
     $response->removeHeader(Header::HEADER_CONTENT_TYPE);
     $response->clearRedirect();
     try {
         $dispatcher = $web->getDispatcher();
         $dispatcher->dispatch($loginRequest, $response);
     } catch (UnauthorizedException $exception) {
         if ($statusCode === Response::STATUS_CODE_FORBIDDEN) {
             $response->setRedirect($request->getBaseUrl());
             return;
         } else {
             throw $exception;
         }
     }
     $response->setStatusCode($statusCode);
     if ($loginRequest->hasSession()) {
         $request->setSession($loginRequest->getSession());
     }
     if ($statusCode === Response::STATUS_CODE_FORBIDDEN) {
         $response->addMessage(new Message($i18n->getTranslator()->translate('error.unauthorized'), Message::TYPE_ERROR));
     }
 }
Ejemplo n.º 5
0
 /**
  * Action to add or edit a question
  * @param \ride\library\i18n\I18n $i18n
  * @param string $locale Locale code of the data
  * @param string $survey Id of the survey
  * @param string $id Id of the question
  * @return null
  */
 public function questionFormAction(I18n $i18n, $locale, WebApplication $web, ReflectionHelper $reflectionHelper, $survey, $id = null)
 {
     // resolve locale
     $this->locale = $i18n->getLocale($locale)->getCode();
     $this->orm->setLocale($this->locale);
     // resolve event
     if (!$this->isReadable($survey)) {
         throw new UnauthorizedException();
     }
     $survey = $this->getEntry($survey);
     if (!$survey) {
         $this->response->setStatusCode(Response::STATUS_CODE_NOT_FOUND);
         return;
     }
     // resolve performance
     $this->model = $this->orm->getSurveyQuestionModel();
     if ($id) {
         $question = $this->getEntry($id);
         if (!$question || $question->getSurvey()->getId() !== $survey->getId()) {
             $this->response->setStatusCode(Response::STATUS_CODE_NOT_FOUND);
             return;
         }
     } else {
         $question = $this->createEntry();
         $question->setSurvey($survey);
     }
     // create form
     $translator = $this->getTranslator();
     $likertModel = $this->orm->getSurveyLikertModel();
     $answerComponent = new QuestionAnswerComponent();
     $answerComponent->setLikertScales($likertModel->find());
     $form = $this->createFormBuilder($question);
     $form->setId('form-survey-question');
     $form->addRow('question', 'text', array('label' => $translator->translate('label.question'), 'validators' => array('required' => array())));
     $form->addRow('description', 'wysiwyg', array('label' => $translator->translate('label.description')));
     $form->addRow('isOpen', 'option', array('label' => $translator->translate('label.question.open'), 'description' => $translator->translate('label.question.open.description')));
     $form->addRow('isMultiple', 'option', array('label' => $translator->translate('label.question.multiple'), 'description' => $translator->translate('label.question.multiple.description')));
     $form->addRow('answers', 'collection', array('label' => $translator->translate('label.answers'), 'type' => 'component', 'order' => true, 'options' => array('component' => $answerComponent)));
     $form = $form->build();
     // handle form
     if ($form->isSubmitted()) {
         try {
             $form->validate();
             // obtain performance from form
             $question = $form->getData();
             $question->setLocale($locale);
             foreach ($question->getAnswers() as $answer) {
                 $answer->setLocale($locale);
             }
             $this->model->save($question);
             $this->addSuccess('success.data.saved', array('data' => $question->getQuestion()));
             $this->response->setRedirect($this->getAction(self::ACTION_DETAIL, array('id' => $survey->getId())));
             return;
         } catch (ValidationException $exception) {
             $this->setValidationException($exception, $form);
         }
     }
     $referer = $this->request->getQueryParameter('referer');
     $this->templateForm = 'orm/scaffold/form';
     if ($question && $question->getId()) {
         $localizeUrl = $this->getUrl('survey.question.edit', array('locale' => '%locale%', 'survey' => $survey->getId(), 'id' => $question->getId()));
     } else {
         $localizeUrl = $this->getUrl('survey.question.add', array('locale' => '%locale%', 'survey' => $survey->getId()));
     }
     $localizeUrl .= '?referer=' . urlencode($this->request->getUrl());
     $view = $this->setFormView($form, $referer, $i18n->getLocaleCodeList(), $locale, $survey);
     $view->getTemplate()->set('localizeUrl', $localizeUrl);
 }