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