public function registerPluginRoutes(Node $page) { $domain = $this->pageStack->getDomain($page->getDomainId()); $this->stopwatch->start('Register Plugin Routes'); //add all router to current router and fire sub-request $cacheKey = 'core/node/plugins-' . $page->getId(); $plugins = $this->cacher->getDistributedCache($cacheKey); if (null === $plugins) { $plugins = ContentQuery::create()->filterByNodeId($page->getId())->filterByType('plugin')->find(); $this->cacher->setDistributedCache($cacheKey, serialize($plugins)); } else { $plugins = unserialize($plugins); } /** @var $plugins Content[] */ foreach ($plugins as $plugin) { if (!$plugin->getContent()) { continue; } $data = json_decode($plugin->getContent(), true); if (!$data) { $this->logger->alert(sprintf('On page `%s` [%d] is a invalid plugin `%d`.', $page->getTitle(), $page->getId(), $plugin->getId())); continue; } $bundleName = isset($data['module']) ? $data['module'] : @$data['bundle']; $config = $this->jarves->getConfig($bundleName); if (!$config) { $this->logger->alert(sprintf('Bundle `%s` for plugin `%s` on page `%s` [%d] does not not exist.', $bundleName, @$data['plugin'], $page->getTitle(), $page->getId())); continue; } $pluginDefinition = $config->getPlugin(@$data['plugin']); if (!$pluginDefinition) { $this->logger->alert(sprintf('In bundle `%s` the plugin `%s` on page `%s` [%d] does not not exist.', $bundleName, @$data['plugin'], $page->getTitle(), $page->getId())); continue; } if ($pluginRoutes = $pluginDefinition->getRoutes()) { foreach ($pluginRoutes as $idx => $route) { $controller = $pluginDefinition->getController(); $defaults = array('_controller' => $route->getController() ?: $controller, '_jarves_is_plugin' => true, '_content' => $plugin, '_title' => sprintf('%s: %s', $bundleName, $pluginDefinition->getLabel()), 'options' => isset($data['options']) && is_array($data['options']) ? $data['options'] : [], 'jarvesFrontend' => true, 'nodeId' => $page->getId()); if ($route->getDefaults()) { $defaults = array_merge($defaults, $route->getArrayDefaults()); } $url = $this->pageStack->getRouteUrl($page->getId()); $this->routes->add('jarves_frontend_plugin_' . ($route->getId() ?: $plugin->getId()) . '_' . $idx, new SyRoute($url . '/' . $route->getPattern(), $defaults, $route->getArrayRequirements() ?: array(), [], '', [], $route->getMethods() ?: [])); } } } $this->stopwatch->stop('Register Plugin Routes'); }
/** * @ApiDoc( * section="Administration", * description="Returns a renderer content element as preview for Jarves page editor" * ) * * @Rest\QueryParam(name="template", requirements=".+", strict=true, * description="The template/view to be used for this content") * * @Rest\QueryParam(name="type", requirements=".+", strict=true, description="The content type") * * @Rest\QueryParam(name="nodeId", requirements="[0-9]+", * description="The node id in which context this content should be rendered") * @Rest\QueryParam(name="domainId", requirements="[0-9]+", * description="The domain id in which context this content should be rendered") * @Rest\RequestParam(name="content", requirements=".*", description="The actual content") * * @Rest\Post("/admin/content/preview") * * @param ParamFetcher $paramFetcher * * @return array */ public function getContentPreviewAction(ParamFetcher $paramFetcher) { $template = $paramFetcher->get('template'); $type = $paramFetcher->get('type'); $content = $paramFetcher->get('content'); $nodeId = $paramFetcher->get('nodeId'); $domainId = $paramFetcher->get('domainId'); //todo, check if $template is defined as content template $contentObject = new Content(); $contentObject->setType($type); $contentObject->setTemplate($template); $contentObject->setContent($content); if ($domainId) { $domain = $this->pageStack->getDomain($domainId); $this->pageStack->setCurrentDomain($domain); } if ($nodeId) { $page = $this->pageStack->getPage($nodeId); $this->pageStack->setCurrentPage($page); } return $this->contentRender->renderContent($contentObject, ['preview' => true]); }
public function onKernelRequest(GetResponseEvent $event) { $request = $event->getRequest(); if (HttpKernelInterface::MASTER_REQUEST === $event->getRequestType()) { //we need to reset all routes. They will anyway replaced by FrontendRouter::loadRoutes, //but to prevent caching conflicts, when a user removes a plugin for example //from a page, we need to know that without using actual caching. $this->routes = new RouteCollection(); $this->urlMatcher->__construct($this->routes, $this->requestContext); //prepare for new master request: clear the PageResponse object $this->pageStack->setCurrentPage(null); $this->pageStack->setCurrentDomain(null); $this->pageStack->setPageResponse($this->pageResponseFactory->create()); $this->frontendRouter->setRequest($request); $editorNodeId = (int) $this->pageStack->getRequest()->get('_jarves_editor_node'); $editorDomainId = (int) $this->pageStack->getRequest()->get('_jarves_editor_domain'); $domain = null; if ($editorDomainId) { $domain = $this->pageStack->getDomain($editorDomainId); if (!$domain) { //we haven't found any domain that is responsible for this request return; } $this->pageStack->setCurrentDomain($domain); } if ($editorNodeId) { //handle jarves content editor stuff //access is later checked if (!$editorNodeId && $domain) { $editorNodeId = $domain->getStartnodeId(); } $page = $this->pageStack->getPage($editorNodeId); if (!$page || !$page->isRenderable()) { //we haven't found any page that is responsible for this request return; } if (!$domain) { $domain = $this->pageStack->getDomain($page->getDomainId()); } $this->pageStack->setCurrentPage($page); $this->pageStack->setCurrentDomain($domain); $request->attributes->set('_controller', 'jarves.page_controller:handleAction'); } else { //regular frontend route search //search domain if (!$domain) { $domain = $this->frontendRouter->searchDomain(); if (!$domain) { //we haven't found any domain that is responsible for this request return; } $this->pageStack->setCurrentDomain($domain); } //search page $page = $this->frontendRouter->searchPage(); if (!$page || !$page->isRenderable()) { //we haven't found any page that is responsible for this request return; } $this->pageStack->setCurrentPage($page); if ($response = $this->frontendRouter->loadRoutes($this->routes, $page)) { //loadRoutes return in case of redirects and permissions a redirect or 404 response. $event->setResponse($response); return; } try { //check routes in $this->route parent::onKernelRequest($event); } catch (MethodNotAllowedException $e) { } catch (NotFoundHttpException $e) { } } } }