示例#1
0
 /**
  * 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;
         }
     }
 }