public function getEdit($pageId, $versionId = 0) { // get page data if (!($page = Page::find($pageId))) { return 'Page Not Found'; } PageVersionSchedule::checkPageVersionIds(); $publishingOn = config('coaster::admin.publishing') > 0; $auth = ['can_publish' => $publishingOn && Auth::action('pages.version-publish', ['page_id' => $pageId]) || !$publishingOn && Auth::action('pages.edit', ['page_id' => $pageId]), 'can_duplicate' => $page->canDuplicate()]; // get page lang data if (!($page_lang = $page->pageCurrentLang)) { if (!($page_lang = $page->pageDefaultLang)) { return 'Page Lang Data Not Found'; } $page_lang = $page_lang->replicate(); $page_lang->language_id = Language::current(); $page_lang->save(); } $page_lang->url = ltrim($page_lang->url, '/'); // get version data $versionData = []; $versionData['latest'] = PageVersion::latest_version($pageId); $versionData['editing'] = $versionId == 0 || $versionId > $versionData['latest'] ? $versionData['latest'] : $versionId; $versionData['live'] = $page_lang->live_version; // get frontend link (preview or direct link if document) $frontendLink = Path::getFullUrl($pageId); if (!$page->is_live() && $page->link == 0) { $live_page_version = PageVersion::where('page_id', '=', $pageId)->where('version_id', '=', $versionData['live'])->first(); if (!empty($live_page_version)) { $frontendLink .= '?preview=' . $live_page_version->preview_key; } } // if loading a non live version get version template rather than current page template if ($versionData['live'] != $versionData['editing']) { if ($page_version = PageVersion::where('version_id', '=', $versionData['editing'])->where('page_id', '=', $pageId)->first()) { $page->template = $page_version->template; } else { return 'Page Version Data Not Found'; } } // load blocks content if ($page->link == 0) { $blocks = Template::template_blocks(config('coaster::frontend.theme'), $page->template); $blocks_content = PageBlock::preloadPage($pageId, $versionData['editing']); list($tab_headers, $tab_contents) = Block::getTabs($blocks, $blocks_content, $page->id); } else { $tab_headers = []; $tab_contents = []; } // load page info and order so page info is first and block categories are in order list($tab_headers[0], $tab_contents[0]) = $page->tabInfo(); ksort($tab_headers); // load version / publish requests if ($publishingOn && count($tab_headers) > 1) { $tab_headers[-1] = 'Versions'; $tab_contents[-1] = View::make('coaster::partials.tabs.versions.main', ['content' => PageVersion::version_table($page->id)])->render(); list($tab_headers[-2], $tab_contents[-2]) = $page->tabRequests(); } // remove empty tabs $tab_headers = array_filter($tab_headers); // get item name, or default to page $item_name = $page->groupItemsNames() ?: 'Page'; $tab_data = ['headers' => View::make('coaster::partials.tabs.header', ['tabs' => $tab_headers])->render(), 'contents' => View::make('coaster::partials.tabs.content', ['tabs' => $tab_contents, 'item' => $item_name, 'new_page' => false, 'publishing' => $publishingOn, 'can_publish' => $auth['can_publish'], 'page' => $page])->render()]; // add required modals if ($publishingOn) { $intervals = PageVersionSchedule::selectOptions(); $this->layoutData['modals'] = View::make('coaster::modals.pages.publish')->render() . View::make('coaster::modals.pages.publish_schedule', ['intervals' => $intervals, 'live_version' => $versionData['live']])->render() . View::make('coaster::modals.pages.request_publish')->render() . View::make('coaster::modals.pages.rename_version')->render(); } $this->layoutData['content'] = View::make('coaster::pages.pages.edit', ['page' => $page, 'page_lang' => $page_lang, 'item_name' => $item_name, 'publishingOn' => $publishingOn, 'tab' => $tab_data, 'frontendLink' => $frontendLink, 'version' => $versionData, 'auth' => $auth]); return null; }
/** * @return \Symfony\Component\HttpFoundation\Response */ public function generatePage() { // update scheduled versions PageVersionSchedule::checkPageVersionIds(); $pageLoader = ['class' => PageLoader::class, 'args' => []]; $pageBuilder = ['class' => PageBuilderInstance::class, 'args' => []]; // try to load cms page for current request event(new InitializePageBuilder($pageLoader, $pageBuilder)); PageBuilder::setClass($pageBuilder['class'], $pageBuilder['args'], $pageLoader['class'], $pageLoader['args']); try { // check for forced redirects $redirect = PageRedirect::uriHasRedirect(); if (!empty($redirect) && $redirect->force == 1) { throw new CmsPageException('forced redirect', 0, null, redirect($redirect->to, $redirect->type)); } // check for unforced redirects if (PageBuilder::getData('is404') && !empty($redirect)) { throw new CmsPageException('redirect', 0, null, redirect($redirect->to, $redirect->type)); } // 404, no cms page for current request if (PageBuilder::getData('is404')) { throw new Exception('cms page not found', 404); } // 404, hidden page if (!PageBuilder::getData('previewVersion') && !PageBuilder::getData('isLive')) { throw new Exception('cms page not live', 404); } // check for form submissions if (!empty($_POST)) { $formData = PageBuilder::getData('externalTemplate') ? Request::input(config('coaster::frontend.external_form_input')) : Request::all(); if (!empty($formData['block_id']) && empty($formData['coaster_check'])) { // honeypot option if (!($block = Block::find($formData['block_id']))) { throw new Exception('no block handler for this form data', 500); } else { $pageId = !empty($formData['page_id']) ? $formData['page_id'] : 0; unset($formData['_token']); unset($formData['block_id']); unset($formData['page_id']); unset($formData['coaster_check']); if ($formSubmitResponse = $block->setPageId($pageId)->setVersionId(PageBuilder::pageLiveVersionId())->getTypeObject()->submission($formData)) { throw new CmsPageException('form submission response', 0, null, $formSubmitResponse); } } } } // load page with template $templatePath = PageBuilder::templatePath(); event(new LoadPageTemplate($templatePath)); if (View::exists($templatePath)) { $this->_setHeader('Content-Type', PageBuilder::getData('contentType')); $this->responseContent = View::make($templatePath)->render(); } else { throw new Exception('cms page found with non existent template - ' . $templatePath, 500); } // if declared as a search page, must have search block if (Search::searchBlockRequired() && !Search::searchBlockExists()) { throw new Exception('cms page found without search function', 404); } } catch (CmsPageException $e) { $this->responseContent = $e->getAlternateResponse(); } catch (Exception $e) { $this->_setErrorContent($e); } $response = $this->_createResponse(); event(new LoadedPageResponse($response)); // if response content is html, run modifications if (!empty($response->headers->get('content-type')) && stripos($response->headers->get('content-type'), 'html') !== false) { $domDocument = new DOMDocument(); $domDocument->loadHTML($response->getContent()); $domDocument->addMetaTag('generator', 'Coaster CMS ' . config('coaster::site.version')); if (config('coaster::frontend.strong_tags') == 1) { $keywords = explode(", ", str_replace(" and ", ", ", PageBuilder::block('meta_keywords'))); $domDocument->addStrongTags($keywords); } // save page content if (PageBuilder::getData('externalTemplate')) { $domDocument->appendInputFieldNames(config('coaster::frontend.external_form_input')); $response->setContent($this->responseContent = $domDocument->saveBodyHMTL()); } else { $response->setContent($domDocument->saveHTML($domDocument)); } } return $response; }