_oTemplate = $oTemplate; else $this->_oTemplate = BxDolTemplate::getInstance(); } /** * Get page code with automatic caching, adding necessary css/js files and system template vars. * @return string. */ public function getCode () { if (bx_get('dynamic') && ($iBlockId = (int)bx_get('pageBlock'))) { if (!$this->_isVisiblePage($this->_aObject)) { header('HTTP/1.0 403 Forbidden'); exit; } header( 'Content-type:text/html;charset=utf-8' ); echo $this->_getBlockOnlyCode($iBlockId); exit; } if (!$this->_isVisiblePage($this->_aObject)) return $this->_getPageAccessDeniedMsg (); $this->_addJsCss(); $this->_addSysTemplateVars(); $this->_selectMenu(); if (!getParam('sys_page_cache_enable') || !$this->_aObject['cache_lifetime']) return $this->_getPageCode(); $oCache = $this->_getPageCacheObject(); $sKey = $this->_getPageCacheKey(); $mixedRet = $oCache->getData($sKey, $this->_aObject['cache_lifetime']); if ($mixedRet !== null) { return $mixedRet; } else { $sPageCode = $this->_getPageCode(); $oCache->setData($sKey, $sPageCode, $this->_aObject['cache_lifetime']); } return $sPageCode; } /** * Get block title. * @return string */ public function getBlockTitle ($aBlock) { return $this->_replaceMarkers(_t($aBlock['title'])); } /** * Get page code only. * @return string */ protected function _getPageCode () { $aVars = array (); $aBlocks = $this->_oQuery->getPageBlocks(); foreach ($aBlocks as $sKey => $aCell) { $sCell = ''; foreach ($aCell as $aBlock) { $sContentWithBox = $this->_getBlockCode($aBlock); if ($sContentWithBox) $sCell .= '
' . $sContentWithBox . '
'; } $aVars[$sKey] = $sCell; } return $this->_oTemplate->parseHtmlByName($this->_aObject['template'], $aVars); } /** * Get one block code only. * @return string */ protected function _getBlockOnlyCode ($iBlockId) { $aBlock = $this->_oQuery->getPageBlock((int)$iBlockId); return $this->_getBlockCode($aBlock); } /** * Get block code. * @return string */ protected function _getBlockCode($aBlock) { $sContentWithBox = ''; if (isset($GLOBALS['bx_profiler'])) $GLOBALS['bx_profiler']->beginPageBlock(_t($aBlock['title']), $aBlock['id']); if ($this->_isVisibleBlock($aBlock)) { $sFunc = '_getBlock' . ucfirst($aBlock['type']); $mixedContent = $this->$sFunc($aBlock); $sTitle = $this->getBlockTitle($aBlock); if (is_array($mixedContent)) { if (isset($mixedContent['content'])) $sContentWithBox = DesignBoxContent( isset($mixedContent['title']) ? $mixedContent['title'] : $sTitle, $mixedContent['content'], isset($mixedContent['designbox_id']) ? $mixedContent['designbox_id'] : $aBlock['designbox_id'], isset($mixedContent['menu']) ? $mixedContent['menu'] : false ); } elseif (is_string($mixedContent)) { $sContentWithBox = DesignBoxContent($sTitle, $mixedContent, $aBlock['designbox_id']); } else { $sContentWithBox = false; } } if (isset($GLOBALS['bx_profiler'])) $GLOBALS['bx_profiler']->endPageBlock($aBlock['id'], $sContentWithBox ? false : true, false ); return $sContentWithBox; } /** * Add necessary js and css files. */ protected function _addJsCss() { $this->_oTemplate->addCss('page_layouts.css'); } /** * Set system template variables, like page title, meta description, meta keywords and meta robots. */ protected function _addSysTemplateVars () { $sPageTitle = $this->_getPageTitle(); if ($sPageTitle) $this->_oTemplate->setPageHeader ($sPageTitle); $sMetaDesc = $this->_getPageMetaDesc(); if ($sMetaDesc) $this->_oTemplate->setPageDescription ($sMetaDesc); $sMetaKeywords = $this->_getPageMetaKeywords(); if ($sMetaKeywords) $this->_oTemplate->addPageKeywords ($sMetaKeywords); $sMetaRobots = $this->_getPageMetaRobots(); if ($sMetaRobots) $this->_oTemplate->setPageMetaRobots ($sMetaRobots); } /** * Select menu from page properties. */ protected function _selectMenu () { bx_import('BxDolMenu'); BxDolMenu::setSelectedGlobal ($this->_aObject['module'], $this->_aObject['uri']); } /** * Get content for 'raw' block type. * @return string */ protected function _getBlockRaw ($aBlock) { return '
' . $this->_replaceMarkers($aBlock['content']) . '
'; } /** * Get content for 'html' block type. * @return string */ protected function _getBlockHtml ($aBlock) { return '
' . $this->_replaceMarkers($aBlock['content']) . '
'; } /** * Get content for 'lang' block type. * @return string */ protected function _getBlockLang ($aBlock) { return '
' . $this->_replaceMarkers(_t(trim($aBlock['content']))) . '
'; } /** * Get content for 'image' block type. * @return string */ protected function _getBlockImage ($aBlock) { if (empty($aBlock['content'])) return false; list($iFileId, $sAlign ) = explode('#', $aBlock['content']); $iFileId = (int)$iFileId; if (!$iFileId) return false; bx_import('BxDolStorage'); $oStorage = BxDolStorage::getObjectInstance(BX_DOL_STORAGE_OBJ_IMAGES); if (!$oStorage) return false; $sUrl = $oStorage->getFileUrlById($iFileId); if (!$sUrl) return false; $sStyleAdd = ''; if ('center' == $sAlign || 'left' == $sAlign || 'right' == $sAlign) $sStyleAdd = 'style="text-align:' . $sAlign . '"'; return '
'; } /** * Get content for 'rss' block type. * @return string */ protected function _getBlockRss ($aBlock) { if (empty($aBlock['content'])) return false; list( $sUrl, $iNum ) = explode('#', $aBlock['content']); $iNum = (int)$iNum; bx_import('BxDolRss'); return BxDolRss::getObjectInstance('sys_page_block')->getHolder($aBlock['id'], $iNum); } /** * Get content for 'menu' block type. * @return string */ protected function _getBlockMenu ($aBlock) { bx_import('BxTemplMenu'); $oMenu = BxTemplMenu::getObjectInstance($aBlock['content']); return $oMenu ? $oMenu->getCode () : ''; } /** * Get content for 'service' block type. * @return string */ protected function _getBlockService ($aBlock) { return BxDolService::callSerialized($aBlock['content'], $this->_aMarkers); } /** * Get page title. * @return string */ protected function _getPageTitle() { return $this->_replaceMarkers(_t($this->_aObject['title'])); } /** * Get page meta description. * @return string */ protected function _getPageMetaDesc() { return $this->_replaceMarkers(_t($this->_aObject['meta_description'])); } /** * Get page meta keywords. * @return string */ protected function _getPageMetaKeywords() { return $this->_replaceMarkers(_t($this->_aObject['meta_keywords'])); } /** * Get page meta robots. * @return string */ protected function _getPageMetaRobots() { return _t($this->_aObject['meta_robots']); } /** * Get access denied message HTML. * @return string */ protected function _getPageAccessDeniedMsg () { return MsgBox(_t('_Access denied')); } /** * Get page cache object. * @return cache object instance */ protected function _getPageCacheObject () { if ($this->_oPageCacheObject != null) { return $this->_oPageCacheObject; } else { $sEngine = getParam('sys_page_cache_engine'); $this->_oPageCacheObject = bx_instance ('BxDolCache' . $sEngine); if (!$this->_oPageCacheObject->isAvailable()) $this->_oPageCacheObject = bx_instance ('BxDolCacheFile'); return $this->_oPageCacheObject; } } /** * Get page cache key. * @param $isPrefixOnly return key prefix only. * @return string */ protected function _getPageCacheKey ($isPrefixOnly = false) { $s = 'page_' . $this->_aObject['object'] . '_'; if ($isPrefixOnly) return $s; $s .= $this->_getPageCacheParams (); $s .= bx_site_hash() . '.php'; return $s; } /** * Additional cache key. In the case of dynamic page. * For example - profile page, where each profile has own page. * @return string */ protected function _getPageCacheParams () { return ''; } /** * Clean page cache. * @param $isDelAllWithPagePrefix delete cache by prefix, it can be used for dynamic pages, like profile view, where for each profile separate cache is generated. * @return string */ protected function cleanCache ($isDelAllWithPagePrefix = false) { $oCache = $this->_getPageCacheObject (); $sKey = $this->_getPageCacheKey($isDelAllWithPagePrefix); if ($isDelAllWithPagePrefix) return $oCache->removeAllByPrefix($sKey); else return $oCache->delData($sKey); } } /** @} */