/** * Filter the `core.request` event to decorated the action. * * @param GetResponseEvent $event * * @throws InternalErrorException * @throws PageNotFoundException */ public function onCoreRequest(GetResponseEvent $event) { $request = $event->getRequest(); $cms = $this->cmsSelector->retrieve(); if (!$cms) { throw new InternalErrorException('No CMS Manager available'); } // true cms page if ($request->get('_route') == PageInterface::PAGE_ROUTE_CMS_NAME) { return; } if (!$this->decoratorStrategy->isRequestDecorable($request)) { return; } $site = $this->siteSelector->retrieve(); if (!$site) { throw new InternalErrorException('No site available for the current request with uri ' . htmlspecialchars($request->getUri(), ENT_QUOTES)); } if ($site->getLocale() && $site->getLocale() != $request->get('_locale')) { throw new PageNotFoundException(sprintf('Invalid locale - site.locale=%s - request._locale=%s', $site->getLocale(), $request->get('_locale'))); } try { $page = $cms->getPageByRouteName($site, $request->get('_route')); if (!$page->getEnabled() && !$this->cmsSelector->isEditor()) { throw new PageNotFoundException(sprintf('The page is not enabled : id=%s', $page->getId())); } $cms->setCurrentPage($page); } catch (PageNotFoundException $e) { return; } }
/** * @param PageBlockInterface $block * @param array $options * * @return string */ public function renderBlock(PageBlockInterface $block, array $options = array()) { if ($block->getEnabled() === false && !$this->cmsManagerSelector->isEditor()) { return ''; } // defined extra default key for the cache $pageCacheKeys = array('manager' => $block->getPage() instanceof SnapshotPageProxy ? 'snapshot' : 'page', 'page_id' => $block->getPage()->getId()); // build the parameters array $options = array_merge(array('use_cache' => isset($options['use_cache']) ? $options['use_cache'] : true, 'extra_cache_keys' => array()), $pageCacheKeys, $options); // make sure the parameters array contains all valid keys $options['extra_cache_keys'] = array_merge($options['extra_cache_keys'], $pageCacheKeys); return $this->blockHelper->render($block, $options); }
/** * Filter the `core.response` event to decorate the action. * * @param FilterResponseEvent $event * * @throws InternalErrorException */ public function onCoreResponse(FilterResponseEvent $event) { $cms = $this->cmsSelector->retrieve(); $response = $event->getResponse(); $request = $event->getRequest(); if ($this->cmsSelector->isEditor()) { $response->setPrivate(); if (!$request->cookies->has('sonata_page_is_editor')) { $response->headers->setCookie(new Cookie('sonata_page_is_editor', 1)); } } $page = $cms->getCurrentPage(); // display a validation page before redirecting, so the editor can edit the current page if ($page && $response->isRedirection() && $this->cmsSelector->isEditor() && !$request->get('_sonata_page_skip')) { $response = new Response($this->templating->render('SonataPageBundle:Page:redirect.html.twig', array('response' => $response, 'page' => $page))); $response->setPrivate(); $event->setResponse($response); return; } if (!$this->decoratorStrategy->isDecorable($event->getRequest(), $event->getRequestType(), $response)) { return; } if (!$this->cmsSelector->isEditor() && $request->cookies->has('sonata_page_is_editor')) { $response->headers->clearCookie('sonata_page_is_editor'); } if (!$page) { throw new InternalErrorException('No page instance available for the url, run the sonata:page:update-core-routes and sonata:page:create-snapshots commands'); } // only decorate hybrid page or page with decorate = true if (!$page->isHybrid() || !$page->getDecorate()) { return; } $parameters = array('content' => $response->getContent()); $response = $this->pageServiceManager->execute($page, $request, $parameters, $response); if (!$this->cmsSelector->isEditor() && $page->isCms()) { $response->setTtl($page->getTtl()); } $event->setResponse($response); }
/** * Handles a kernel exception. * * @param GetResponseForExceptionEvent $event * * @throws \Exception */ public function onKernelException(GetResponseForExceptionEvent $event) { if ($event->getException() instanceof NotFoundHttpException && $this->cmsManagerSelector->isEditor()) { $pathInfo = $event->getRequest()->getPathInfo(); // can only create a CMS page, so the '_route' must be null $creatable = !$event->getRequest()->get('_route') && $this->decoratorStrategy->isRouteUriDecorable($pathInfo); if ($creatable) { $response = new Response($this->templating->render('SonataPageBundle:Page:create.html.twig', array('pathInfo' => $pathInfo, 'site' => $this->siteSelector->retrieve(), 'creatable' => $creatable)), 404); $event->setResponse($response); $event->stopPropagation(); return; } } if ($event->getException() instanceof InternalErrorException) { $this->handleInternalError($event); } else { $this->handleNativeError($event); } }
/** * {@inheritdoc} */ public function match($pathinfo) { $cms = $this->cmsSelector->retrieve(); $site = $this->siteSelector->retrieve(); if (!$cms instanceof CmsManagerInterface) { throw new ResourceNotFoundException('No CmsManager defined'); } if (!$site instanceof SiteInterface) { throw new ResourceNotFoundException('No site defined'); } try { $page = $cms->getPageByUrl($site, $pathinfo); } catch (PageNotFoundException $e) { throw new ResourceNotFoundException($pathinfo, 0, $e); } if (!$page || !$page->isCms()) { throw new ResourceNotFoundException($pathinfo); } if (!$page->getEnabled() && !$this->cmsSelector->isEditor()) { throw new ResourceNotFoundException($pathinfo); } $cms->setCurrentPage($page); return array('_controller' => 'sonata.page.page_service_manager:execute', '_route' => PageInterface::PAGE_ROUTE_CMS_NAME, 'page' => $page, 'path' => $pathinfo, 'params' => array()); }