/** * Frontend display for the block * @param string $content * @param array $options * @return string */ public function display($content, $options = []) { if (!empty($options['meta']) || !empty($options['pageBuilder'])) { $content = preg_replace_callback('/{{\\s*\\$(?P<block>\\w*)\\s*}}/', function ($matches) { return str_replace('"', "'", strip_tags(PageBuilder::block($matches['block']))); }, $content); $content = str_replace('%page_name%', PageBuilder::pageName(), $content); $content = str_replace('%site_name%', config('coaster::site.name'), $content); } if (!empty($options['meta'])) { $content = trim(str_replace(PHP_EOL, ' ', $content)); $content = preg_replace('/\\s+/', ' ', $content); $content = htmlentities(strip_tags(html_entity_decode($content, ENT_QUOTES, 'UTF-8'))); $content = StringHelper::cutString($content); } return $content; }
/** * @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; }
private static function _processFileBlocks() { self::$_fileBlocks = []; self::$_fileGlobalBlocks = []; $blockCounter = []; $templateCount = 0; foreach (self::$_fileTemplateBlocks as $template => $blocks) { if (strpos($template, '__core_') !== 0) { $templateCount++; } else { // move non template specific blocks (repeater blocks) to end of array unset(self::$_fileTemplateBlocks[$template]); self::$_fileTemplateBlocks[$template] = $blocks; } } $blockOrders = []; foreach (self::$_allBlocks as $block => $details) { $blockOrders[$block] = $details->order; } // force template adds from overwrite file if (!empty(self::$_blockSettings)) { foreach (self::$_blockSettings as $block => $fields) { if (!empty($fields['templates'])) { if ($fields['templates'] == '*') { foreach (self::$_fileTemplateBlocks as $template => $blocks) { if (!in_array($block, self::$_fileTemplateBlocks[$template]) && strpos($template, '__core_') !== 0) { self::$_fileTemplateBlocks[$template][] = $block; PageBuilder::setData('template', $template); PageBuilder::block($block); } } } else { $templates = explode(',', $fields['templates']); if (!empty($templates)) { foreach ($templates as $template) { if (isset(self::$_fileTemplateBlocks[$template])) { if (!in_array($block, self::$_fileTemplateBlocks[$template])) { self::$_fileTemplateBlocks[$template][] = $block; PageBuilder::setData('template', $template); PageBuilder::block($block); } } } } } } } } // create fileBlockTemplates array self::$_fileBlockTemplates = []; self::$_fileCoreBlockTemplates = []; foreach (self::$_fileTemplateBlocks as $template => $blocks) { if (strpos($template, '__core_') !== 0) { foreach ($blocks as $block) { if (!isset(self::$_fileBlockTemplates[$block])) { self::$_fileBlockTemplates[$block] = []; } self::$_fileBlockTemplates[$block][] = $template; } } foreach ($blocks as $block) { if (!isset(self::$_fileCoreBlockTemplates[$block])) { self::$_fileCoreBlockTemplates[$block] = []; } self::$_fileCoreBlockTemplates[$block][] = $template; } } // get full block list and details in one array foreach (self::$_fileTemplateBlocks as $template => $blocks) { $order = 10; foreach ($blocks as $k => $block) { if (!isset(self::$_fileBlocks[$block])) { if (!empty(self::$_blockSettings[$block]['order'])) { $blockOrders[$block] = self::$_blockSettings[$block]['order']; } else { if (isset($blocks[$k - 1]) && !empty($blockOrders[$blocks[$k - 1]])) { $order = $blockOrders[$blocks[$k - 1]] + 10; } else { $order += 10; } $blockOrders[$block] = $order; } $blockCounter[$block] = 0; self::$_fileBlocks[$block] = ['order' => $blockOrders[$block]]; self::$_fileBlocks[$block] = ['order' => $blockOrders[$block]]; if (in_array($block, self::$_repeaterBlocks)) { self::$_fileBlocks[$block]['type'] = 'repeater'; } } if (strpos($template, '__core_') !== 0) { $blockCounter[$block]++; } } } foreach ($blockCounter as $block => $count) { if ($count / $templateCount >= 0.7) { self::$_fileGlobalBlocks[$block] = 1; } } }