_oTemplate = $oTemplate; else $this->_oTemplate = BxDolTemplate::getInstance(); $this->_sStorage = 'sys_images'; $this->_sJsClassName = 'BxDolPage'; $this->_sJsObjectName = 'oBxDolPage'; $this->_bStickyColumns = isset($this->_aObject['sticky_columns']) && $this->_aObject['sticky_columns'] == 1; $sHtmlId = str_replace(array('_' , ' '), array('-', '-'), $this->_sObject); $this->_aHtmlIds = array( 'help_popup' => $sHtmlId . '-help-popup-', ); $this->addMarkers(array('site_title' => getParam('site_title'))); if (isLogged() && $oProfile = BxDolProfile::getInstance()) { $this->addMarkers([ 'logged_profile_id' => $oProfile->id(), 'logged_account_id' => $oProfile->getAccountId(), 'logged_profile_module' => $oProfile->getModule(), 'logged_display_name' => $oProfile->getDisplayName(), 'logged_profile_url' => $oProfile->getUrl(), ]); } if (isset($GLOBALS['bxReplaceableMarkersPages'])) { $this->addMarkers($GLOBALS['bxReplaceableMarkersPages']); } } public function performActionGetHelp () { $iBlockId = (int)bx_get('block_id'); if(empty($iBlockId)) return; $aBlock = $this->_oQuery->getPageBlock($iBlockId); if(empty($aBlock) || !is_array($aBlock) || empty($aBlock['help'])) return; echo $this->_oTemplate->parseHtmlByName('designbox_help_popup.html', array( 'content' => _t($aBlock['help']) )); } public function performActionGetShare () { $aEmbedData = BxDolPage::getEmbedData(bx_get('url')); if(!isset($aEmbedData['url'])) return; $sMenu = ''; if(getParam('sys_a2a_enable') != 'on') { if(($oMenu = BxDolMenu::getObjectInstance('sys_social_sharing')) !== false) { $oMenu->addMarkers([ 'url' => $aEmbedData['url'], 'img_url_encoded' => '', 'title_encoded' => '' ]); $sMenu = $oMenu->getCode(); } } else $sMenu = getParam('sys_a2a_code'); echo PopupBox('sys_share_popup', _t('_sys_txt_share_popup_header'), $this->_oTemplate->parseHtmlByName('designbox_share_popup.html', [ 'url' => bx_process_output($aEmbedData['url']), 'menu' => $sMenu, 'code' => htmlspecialchars($aEmbedData['html']), ]), true); } public function performActionEmbed () { $aCover = $this->getPageCoverImage(); $sTitle = $this->_getPageTitle(); $this->_oTemplate->getEmbed($this->_oTemplate->parseHtmlByName('embed_card.html', [ 'title' => $sTitle, 'url' => BxDolPermalinks::getInstance()->permalink($this->_aObject['url']), 'bx_if:thumb' => [ 'condition' => $this->isPageCover() && count($aCover) > 0, 'content' => [ 'title' => $sTitle, 'url' => BxDolPermalinks::getInstance()->permalink($this->_aObject['url']), 'background' => BxDolCover::getInstance(BxDolTemplate::getInstance())->getCoverImageUrl($aCover) ], ], 'bx_if:no_thumb' => [ 'condition' => count($aCover) == 0 || !$this->isPageCover(), 'content' => [ 'title' => $sTitle, 'url' => BxDolPermalinks::getInstance()->permalink($this->_aObject['url']), ] ] ] )); } public function performActionCreativeSave() { if(!$this->isAllowedCreativeManage()) return echoJson(['code' => 1]); $iId = 0; $sContent = ''; if(($iId = bx_get('b')) === false || ($sContent = bx_get('c')) === false) return echoJson(['code' => 2]); $iId = bx_process_input($iId, BX_DATA_INT); $sContent = bx_process_input($sContent, BX_DATA_HTML); if(!$this->_oQuery->setPageBlockContent($iId, $sContent)) return echoJson(['code' => 3]); return echoJson(['code' => 0]); } public function isAllowedCreativeManage() { return isAdmin(); } /** * Very similar to BxBasePage::getCode * but adds css and js files which are needed for the corect page display */ public function getCodeDynamic () { // TODO: remake to use use collect* template methods $oTemplate = BxDolTemplate::getInstance(); // get js&css before the page code is generated $aCssBefore = $oTemplate->getCss(); $aJsBefore = $oTemplate->getJs(); // generate page code $sContent = $this->getCode(); // get js&css after the page code is generated $aCssAfter = $oTemplate->getCss(); $aJsAfter = $oTemplate->getJs(); // compare files which were added before and after page code is generated $f = function ($a1, $a2) { return strcasecmp($a1['url'], $a2['url']); }; $aCssNew = array_udiff($aCssAfter, $aCssBefore, $f); $aJsNew = array_udiff($aJsAfter, $aJsBefore, $f); // add newly added js&css files in static mode $sCss = $sJs = ''; foreach ($aCssNew as $a) $sCss .= $oTemplate->addCss($a['url'], true); foreach ($aJsNew as $a) $sJs .= $oTemplate->addJs($a['url'], true); return $sJs . $sCss . $sContent; } public function getIncludes () { $oTemplate = BxDolTemplate::getInstance(); // generate page code $this->getCode(); // get js&css after the page code is generated $aCss = $oTemplate->getCss(); $aJs = $oTemplate->getJs(); // add js&css files in static mode $sResult = ''; foreach ($aCss as $a) $sResult .= $oTemplate->addCss($a['url'], true); foreach ($aJs as $a) $sResult .= $oTemplate->addJs($a['url'], true); // add js translations $sResult .= $oTemplate->getJsTranslation(true); return $sResult; } /** * 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 (self::isLockedFromUnauthenticated($this->_aObject['uri']) || !$this->_isVisiblePage($this->_aObject)) { header('HTTP/1.0 403 Forbidden'); exit; } /** * @hooks * @hookdef hook-system-page_output_block 'system', 'page_output_block' - hook with page block data to be output * - $unit_name - equals `system` * - $action - equals `page_output_block` * - $object_id - not used * - $sender_id - not used * - $extra_params - array of additional params with the following array keys: * - `page_name` - [string] page object name * - `page_object` - [object] an instance of page class, @see BxDolPage * - `page_query` - [object] an instance of page related query class * - `block_id` - [int] block id * @hook @ref hook-system-page_output_block */ bx_alert('system', 'page_output_block', 0, false, [ 'page_name' => $this->_sObject, 'page_object' => $this, 'page_query' => $this->_oQuery, 'block_id' => (int)$iBlockId, ]); header( 'Content-type:text/html;charset=utf-8' ); BxDolTemplate::getInstance()->collectingStart(); $s = $this->_getBlockOnlyCode($iBlockId); $sCss = bx_get('includedCss'); $sJs = bx_get('includedJs'); echo BxDolTemplate::getInstance()->collectingEndGetCode($sCss ? @json_decode($sCss) : [], $sJs ? @json_decode($sJs) : []); echo $s; exit; } if (($mixedAvailable = $this->_isAvailablePage($this->_aObject)) !== true) return $this->_getPageNotFoundMsg($mixedAvailable); if (($mixedVisible = $this->_isVisiblePage($this->_aObject)) !== true) return $this->_getPageAccessDeniedMsg($mixedVisible); $this->_addJsCss(); if (!$this->_bSubPage) { $this->_addSysTemplateVars(); $this->_selectMenu(); $this->_setSubmenu(array()); } if (bx_is_dbg() || !getParam('sys_page_cache_enable') || !$this->_aObject['cache_lifetime'] || (isset($_SERVER['REQUEST_METHOD']) && $_SERVER['REQUEST_METHOD'] === 'POST')) { $sPageCode = $this->_getPageCode(); } else { $oCache = $this->_getPageCacheObject(); $sKey = $this->_getPageCacheKey(); $sKeyCssJs = 'cssjs_' . $sKey; $mixedRet = $oCache->getData($sKey, $this->_aObject['cache_lifetime']); $aRetCssJs = $oCache->getData($sKeyCssJs, $this->_aObject['cache_lifetime']); if ($mixedRet !== null && $aRetCssJs !== null) { BxDolTemplate::getInstance()->collectingStart(); BxDolTemplate::getInstance()->collectingInject($aRetCssJs['css'], $aRetCssJs['js']); $sPageCode = BxDolTemplate::getInstance()->collectingEndGetCode(); $sPageCode .= $mixedRet; } else { BxDolTemplate::getInstance()->collectingStart(); $sPageCode = $this->_getPageCode(); $aPageCssJs = BxDolTemplate::getInstance()->collectingEndGetCode(array(), array(), 'array'); $oCache->setData($sKey, $sPageCode, $this->_aObject['cache_lifetime']); $oCache->setData($sKeyCssJs, $aPageCssJs, $this->_aObject['cache_lifetime']); } } /** * @hooks * @hookdef hook-system-page_output 'system', 'page_output' - hook with page data to be output * - $unit_name - equals `system` * - $action - equals `page_output` * - $object_id - not used * - $sender_id - not used * - $extra_params - array of additional params with the following array keys: * - `page_name` - [string] page object name * - `page_object` - [object] an instance of page class, @see BxDolPage * - `page_query` - [object] an instance of page related query class * - `page_code` - [string] by ref, final page code to be output, can be overridden in hook processing * - `sub_page` - [boolean] if the page is used as subpage of some parent page * @hook @ref hook-system-page_output */ bx_alert('system', 'page_output', 0, false, [ 'page_name' => $this->_sObject, 'page_object' => $this, 'page_query' => $this->_oQuery, 'page_code' => &$sPageCode, 'sub_page' => $this->_bSubPage, ]); if (!$this->_bSubPage) $sPageCode .= $this->getJsScript(); return $sPageCode; } public function getJsClassName() { return $this->_sJsClassName; } public function getJsObjectName() { return $this->_sJsObjectName; } function _wrapInTagJsCode($sCode) { return ""; } public function getJsScript() { $sJsObjName = $this->getJsObjectName(); $sJsObjClass = $this->getJsClassName(); $sCode = "if(window['" . $sJsObjName . "'] == undefined) var " . $sJsObjName . " = new " . $sJsObjClass . "(" . json_encode(array( 'sObjName' => $sJsObjName, 'sObject' => $this->_sObject, 'sRootUrl' => BX_DOL_URL_ROOT, 'aHtmlIds' => $this->_aHtmlIds, 'isStickyColumns' => $this->_bStickyColumns )) . ");"; return $this->_wrapInTagJsCode($sCode); } /** * Is page cover enabled. * @return string */ public function isPageCover() { $bResult = false; switch((int)$this->_aObject['cover']) { case 1: //--- Enabled for all $bResult = true; break; case 2: //--- Enabled for visitors only $bResult = !isLogged(); break; case 3: //--- Enabled for members only $bResult = isLogged(); break; } return $bResult; } public function setSubPage($b = true) { $this->_bSubPage = $b; } public function setPageCover($bCover = true) { $this->_aObject['cover'] = (bool)$bCover; } public function getPageCoverImage($bTranscoder = true) { $iId = (int)$this->_aObject['cover_image']; if(empty($iId)) { $iId = (int)getParam('sys_site_cover_common'); if(empty($iId)) return array(); } $aResult = array( 'id' => $iId ); if($bTranscoder) $aResult['transcoder'] = BX_DOL_TRANSCODER_OBJ_COVER; else $aResult['object'] = $this->_sStorage; return $aResult; } public function getPageCoverParams() { $aParams = [ 'title' => $this->_getPageTitle(), 'actions' => '', 'bx_if:image' => [ 'condition' => false, 'content' => [] ], 'bx_if:icon' => [ 'condition' => false, 'content' => [] ], ]; if(($oMenuSubmenu = BxDolMenu::getObjectInstance('sys_site_submenu')) !== false) { $aCoverParams = $oMenuSubmenu->getPageCoverParams(); if(!empty($aCoverParams) && is_array($aCoverParams)) $aParams = $aCoverParams; } if(!empty($this->_aObject['cover_title'])) { $sCoverTitle = _t($this->_aObject['cover_title']); if($sCoverTitle && strcmp($sCoverTitle, $this->_aObject['cover_title']) != 0) $aParams['title'] = $sCoverTitle; } return $aParams; } /** * Get block title. * @return string */ public function getBlockTitle ($aBlock) { return $this->_replaceMarkers(_t($aBlock['title']), array('block_id' => $aBlock['id'])); } /** * Get help control if help is available for the block. * @return string */ public function getBlockHelp ($aBlock) { if(empty($aBlock['help']) || empty(strip_tags(_t($aBlock['help'])))) return ''; return $this->_oTemplate->parseHtmlByName('designbox_help.html', array( 'js_object' => $this->_sJsObjectName, 'block_id' => $aBlock['id'] )); } /** * Get code to load block asyncroniously * @param $aBlock block code * @param $iAsync if greater than 0 the it defines loading indicator for the block * @return HTML code string */ public function getBlockAsyncCode($aBlock, $iAsync) { $aContentPlaceholder = $this->_oQuery->getPageBlockContentPlaceholder($iAsync); if (!$aContentPlaceholder) return _t('_sys_txt_error_occured'); $oTemplate = $this->_oTemplate; if ('system' != $aContentPlaceholder['module']) { $oModule = BxDolModule::getInstance($aContentPlaceholder['module']); if (!$oModule) return _t('_sys_txt_error_occured'); $oTemplate = $oModule->_oTemplate; } return $oTemplate->parseHtmlByName($aContentPlaceholder['template'], $aBlock); } /** * Get page array with all cells and blocks */ public function getPageAPI ($aBlocks = []) { define('BX_API_PAGE', true); $aGetParams = bx_get('params'); $bGetParams = $aGetParams !== false; $sQueryString = ''; if($bGetParams && !empty($aGetParams[2]) && ($_aGetParams = json_decode($aGetParams[2], true)) && is_array($_aGetParams)) { $sQueryString = http_build_query($_aGetParams); parse_str($sQueryString, $aQueryString); $_GET = array_merge($_GET, $aQueryString); } $bIsAvailable = $this->_isAvailablePage($this->_aObject); $bIsVisible = $this->_isVisiblePage($this->_aObject); //TODO: If page isn't Available or isn't Visible then we should exit with related Error Codes immediately. $sMetaTitle = $this->_getPageMetaTitle(); $sName = $this->_getPageTitle(); $sModule = $this->getModule(); $a = [ 'id' => $this->_aObject['id'], 'title' => $sMetaTitle ? $sMetaTitle : $sName, 'name' => $sName, 'description' => $this->_getPageMetaDesc(), 'keywords' => $this->_getPageMetaKeywords(), 'image' => '', 'uri' => $this->_aObject['uri'], 'url' => ($bGetParams && !empty($aGetParams[0]) ? $aGetParams[0] : $this->_aObject['uri']) . ($sQueryString != '' ? '?' . $sQueryString : ''), 'author' => $this->_aObject['author'], 'added' => $this->_aObject['added'], 'module' => $sModule, 'type' => $this->getType (), 'layout' => str_replace('.html', '', $this->_aObject['template']), 'cover_block' => '', 'menu_top' => '', 'menu' => '', 'menu_bottom' => '', 'menu_add' => '', 'config' => $this->_aObject['config_api'], 'elements' => $this->getPageBlocksAPI($aBlocks), ]; $sMenuTop = getParam('sys_api_menu_top'); if (!empty($sMenuTop) && ($oMenuTop = BxDolMenu::getObjectInstance($sMenuTop)) !== false) $a['menu_top'] = $oMenuTop->getCodeAPI(); if (($oMenuSubmenu = BxDolMenu::getObjectInstance('sys_site_submenu')) !== false) { if(($sSubmenu = $this->getSubMenu()) !== '') $oMenuSubmenu->setObjectSubmenu($sSubmenu, []); $a['menu'] = $oMenuSubmenu->getCodeAPI(); if($sModule && $sModule != 'system' && ($oModule = BxDolModule::getInstance($sModule))) { $CNF = &$oModule->_oConfig->CNF; $sUrlAdd = ''; if(($sKey = 'URI_ADD_ENTRY') && !empty($CNF[$sKey])) $sUrlAdd = $CNF[$sKey]; if(!$sUrlAdd && ($sKey = 'URI_EDIT_ENTRY') && !empty($CNF[$sKey])) $sUrlAdd = str_replace('edit-', 'create-', $CNF[$sKey]); $a['menu'] = array_merge($a['menu'], [ 'name' => $oModule->getName(), 'title' => BxDolModule::getTitle($oModule->_oConfig->getUri()), 'icon' => !empty($CNF['ICON']) ? $CNF['ICON'] : '', 'add_url' => $sUrlAdd ]); } } /** * Profile/Context view page. */ if(isset($this->_aProfileInfo)) { $oProfileModule = BxDolModule::getInstance($this->_aProfileInfo['type']); if($oProfileModule !== null) $aProfileContentInfo = $oProfileModule->_oDb->getContentInfoById($this->_aProfileInfo['content_id']); if(!empty($aProfileContentInfo) && is_array($aProfileContentInfo)) { $CNF = &$oProfileModule->_oConfig->CNF; /** * Process page cover with related menus and lists. */ if(BxDolCover::getInstance($this)->isCover()) { $aProfileInfo = BxDolProfile::getData($this->_aProfileInfo['id'], [ 'get_avatar' => 'getAvatarBig', 'with_info' => true ]); $oProfile = BxDolProfile::getInstance($this->_aProfileInfo['id']); $aProfileInfo['online'] = $oProfile->isOnline(); unset($aProfileInfo['info']['profile_email']); unset($aProfileInfo['info']['profile_last_active']); unset($aProfileInfo['info']['profile_ip']); $a['cover_block'] = [ 'profile' => $aProfileInfo, 'actions_menu' => '', 'meta_menu' => '', 'badges' => $oProfile->getBadges(), 'cover' => $oProfileModule->serviceGetCover($this->_aProfileInfo['content_id']), 'allow_edit' => $oProfileModule->checkAllowedChangeCover($aProfileContentInfo) === CHECK_ACTION_RESULT_ALLOWED ]; if(!empty($CNF['OBJECT_MENU_VIEW_ENTRY_META']) && ($oMetaMenu = BxTemplMenu::getObjectInstance($CNF['OBJECT_MENU_VIEW_ENTRY_META'])) !== false) $a['cover_block']['meta_menu'] = $oMetaMenu->getCodeAPI(); if(!empty($CNF['OBJECT_CONNECTIONS']) && ($oConnection = BxDolConnection::getObjectInstance($CNF['OBJECT_CONNECTIONS'])) !== false) $a['cover_block']['members_list'] = $oConnection->getConnectedListAPI($this->_aProfileInfo['id'], false, BX_CONNECTIONS_CONTENT_TYPE_INITIATORS, 10); if(!empty($CNF['OBJECT_MENU_ACTIONS_VIEW_ENTRY_ALL']) && ($oActionMenu = BxTemplMenu::getObjectInstance($CNF['OBJECT_MENU_ACTIONS_VIEW_ENTRY_ALL'])) !== false) $a['cover_block']['actions_menu'] = $oActionMenu->getCodeAPI(); } /** * Process page mange menu. */ if(($oMenuManage = BxDolMenu::getObjectInstance('sys_site_manage')) !== false) { if(!empty($CNF['FIELD_ID'])) $oMenuManage->setContentId($aProfileContentInfo[$CNF['FIELD_ID']]); $aObjectManage = []; if(!empty($CNF['OBJECT_MENU_MANAGE_VIEW_ENTRY'])) $aObjectManage = [$CNF['OBJECT_MENU_MANAGE_VIEW_ENTRY']]; else if(!empty($CNF['OBJECT_MENU_ACTIONS_VIEW_ENTRY_MORE'])) $aObjectManage = [$CNF['OBJECT_MENU_ACTIONS_VIEW_ENTRY_MORE'], true]; call_user_func_array([$oMenuManage, 'setObjectManage'], $aObjectManage); $aMenuManage = $oMenuManage->getCodeAPI(); if(!empty($aMenuManage) && is_array($aMenuManage)) { if(isset($a['cover_block'], $a['cover_block']['actions_menu']) && is_array($a['cover_block']['actions_menu'])) $a['cover_block']['actions_menu']['items'] = array_merge($a['cover_block']['actions_menu']['items'], $aMenuManage['items']); else $a['cover_block']['actions_menu'] = $aMenuManage; } } } } if(isLogged() && ($o = BxDolProfile::getInstance()) !== false) { $iLogged = $o->id(); $a['user'] = BxDolProfile::getDataForPage($o); if(($sContextSwitcher = getParam('sys_api_context_switcher')) && ($sContextConnection = getParam('sys_api_context_connection'))) { $aCpIds = bx_srv($sContextSwitcher, 'get_participating_profiles', [$iLogged, ($sContextConnection != 'participants' ? $sContextConnection : false)]); $aContexts = []; foreach($aCpIds as $iCpId) $aContexts[] = BxDolProfile::getData($iCpId); $aInvitedTo = []; $aInvitations = bx_srv($sContextSwitcher, 'invitations', [$iLogged, true]); foreach($aInvitations as $aInvitation) $aInvitedTo[] = BxDolProfile::getData($aInvitation['group_profile_id']); $aInfo = []; if(($iId = bx_get('id')) !== false) { $aInfo = bx_srv($sModule, 'get_info', [(int)$iId, false]); } else if(($iPid = bx_get('profile_id')) !== false) { $aInfo = bx_srv($sModule, 'get_content_info_by_profile_id', [(int)$iPid]); } $aCurrent = []; if($aInfo && ((($sKey = 'allow_view_to') && isset($aInfo[$sKey]) && ($iValue = (int)$aInfo[$sKey])) || (($sKey = 'object_privacy_view') && isset($aInfo[$sKey]) && ($iValue = (int)$aInfo[$sKey])))) { $mixedContext = false; if($iValue < 0) { $aContext = BxDolProfileQuery::getInstance()->getInfoById(abs($iValue)); if($aContext && $aContext['type'] == $sContextSwitcher) $mixedContext = (int)$aContext['id']; } else if($sModule == $sContextSwitcher) $mixedContext = BxDolProfile::getInstanceByContentAndType((int)$aInfo['id'], $sModule); if($mixedContext !== false) $aCurrent = BxDolProfile::getData($mixedContext); } $_sSample = '_' . $sContextSwitcher . '_txt_sample_single'; $sSample = _t($_sSample); if(strcmp($_sSample, $sSample) == 0) $sSample = _t('_Context'); $a['context'] = [ 'list' => $aContexts, 'invitations' => $aInvitedTo, 'current' => $aCurrent, 'links' => [] ]; if(bx_srv($sContextSwitcher, 'check_allowed', ['add']) === CHECK_ACTION_RESULT_ALLOWED) $a['context']['links'][] = [ 'title' => _t('_api_create_context', $sSample), 'icon' => 'Plus', 'url' => bx_api_get_relative_url(bx_srv($sContextSwitcher, 'get_link_add')) ]; } } if(!$bIsAvailable) $a['page_status'] = 404; else if(!$bIsVisible) $a['page_status'] = 403; return $a; } public function getPageBlocksAPI($aBlocks = []) { $bBlocks = !empty($aBlocks) && is_array($aBlocks); $aFieldsUnset = ['object', 'cell_id', 'title_system', 'class', 'submenu', 'tabs', 'async', 'visible_for_levels', 'hidden_on', 'type', 'text', 'text_updated', 'help', 'cache_lifetime', 'active', 'active_api', 'copyable', 'deletable', 'order']; $aCells = $this->_oQuery->getPageBlocks(true); foreach($aCells as $sKey => &$aCell) { foreach($aCell as $i => $aBlock) { if(!$this->_isVisibleBlock($aBlock)) { unset($aCells[$sKey][$i]); continue; } $this->processPageBlock($aCells[$sKey][$i], true); $aBlock = $aCells[$sKey][$i]; $sSource = ''; if($aBlock['type'] == 'service') { $aContent = @unserialize($aBlock['content']); if(isset($aContent['module'], $aContent['method'])) $sSource = $aContent['module'] . ':' . $aContent['method']; } else $sSource = 'system:block_' . $aBlock['id']; if($bBlocks && !in_array($sSource, $aBlocks)) { unset($aCells[$sKey][$i]); continue; } $mBlock = $aBlock['content']; if(($sFunc = '_getBlock' . bx_gen_method_name($aBlock['type'])) && method_exists($this, $sFunc)) $mBlock = $this->$sFunc($aBlock); if(empty($mBlock)) { unset($aCells[$sKey][$i]); continue; } $aCells[$sKey][$i] = array_merge($aCells[$sKey][$i], [ 'title' => isset($mBlock['title']) ? $mBlock['title'] : $this->getBlockTitle($aBlock), 'content' => isset($mBlock['content']) ? $mBlock['content'] : $mBlock, 'menu' => isset($mBlock['menu']) ? $mBlock['menu'] : '', 'source' => $sSource ]); $aCells[$sKey][$i] = array_diff_key($aCells[$sKey][$i], array_flip($aFieldsUnset)); } } return array_map('array_values', $aCells); } /** * Get page code vars * @return string */ protected function _getPageCodeVars () { $aHiddenOn = array( pow(2, BX_DB_HIDDEN_PHONE - 1) => 'bx-def-media-phone-hide', pow(2, BX_DB_HIDDEN_TABLET - 1) => 'bx-def-media-tablet-hide', pow(2, BX_DB_HIDDEN_DESKTOP - 1) => 'bx-def-media-desktop-hide', pow(2, BX_DB_HIDDEN_MOBILE - 1) => 'bx-def-mobile-app-hide' ); $aVars = array ( 'page_id' => 'bx-page-' . $this->_aObject['uri'], 'bx_if:show_layout_row_dump' => array( 'condition' => false, 'content' => array() ) ); $aBlocks = $this->_oQuery->getPageBlocks(); foreach ($aBlocks as $sKey => $aCell) { $sCell = ''; foreach ($aCell as $aBlock) { $this->processPageBlock($aBlock, false); $sContentWithBox = $this->_getBlockCodeWithCache($aBlock, $aBlock['async']); $sClassAdd = ''; if(!empty($aBlock['class'])) $sClassAdd .= ' ' . $aBlock['class']; if(!empty($aBlock['hidden_on'])) foreach($aHiddenOn as $iHiddenOn => $sHiddenOnClass) if((int)$aBlock['hidden_on'] & $iHiddenOn) $sClassAdd .= ' ' . $sHiddenOnClass; if ($sContentWithBox) $sCell .= $this->_oTemplate->parseHtmlByName('designbox_container.html', array( 'class_add' => $sClassAdd, 'bx_if:show_html_id' => array( 'condition' => true, 'content' => array( 'html_id' => 'bx-page-block-' . $aBlock['id'] ), ), 'content' => $sContentWithBox )); } $aVars[$sKey] = $sCell; } return $aVars; } /** * Process block values, especially if someting need to be overrided */ protected function processPageBlock(&$aBlock, $bApi = false) { } /** * Get page code only. * @return string */ protected function _getPageCode () { $aVars = $this->_getPageCodeVars (); return $this->_oTemplate->parseHtmlByName($this->_aObject['template'], $aVars); } /** * Get one block code only. * @return string */ protected function _getBlockOnlyCode ($iBlockId) { if (!($aBlock = $this->_oQuery->getPageBlock((int)$iBlockId))) return ''; return $this->_getBlockCodeWithCache($aBlock, 0); } protected function _getBlockCodeWithCache(&$aBlock, $iAsync = 0) { if (bx_is_dbg() || !getParam('sys_pb_cache_enable') || !$aBlock['cache_lifetime'] || $iAsync || (isset($_SERVER['REQUEST_METHOD']) && $_SERVER['REQUEST_METHOD'] === 'POST')) { $sBlockCode = $this->_getBlockCode($aBlock, $iAsync); } else { $oCache = $this->_getBlockCacheObject(); $sKey = $this->_getBlockCacheKey(false, $aBlock); $sKeyCssJs = 'cssjs_' . $sKey; $mixedRet = $oCache->getData($sKey, $aBlock['cache_lifetime']); $aRetCssJs = $oCache->getData($sKeyCssJs, $aBlock['cache_lifetime']); if ($mixedRet !== null && $aRetCssJs !== null) { BxDolTemplate::getInstance()->collectingStart(); BxDolTemplate::getInstance()->collectingInject($aRetCssJs['css'], $aRetCssJs['js']); $sBlockCode = BxDolTemplate::getInstance()->collectingEndGetCode(); $sBlockCode .= $mixedRet; } else { BxDolTemplate::getInstance()->collectingStart(); $sBlockCode = $this->_getBlockCode($aBlock, $iAsync); $aBlockCssJs = BxDolTemplate::getInstance()->collectingEndGetCode(array(), array(), 'array'); $oCache->setData($sKey, $sBlockCode, $aBlock['cache_lifetime']); $oCache->setData($sKeyCssJs, $aBlockCssJs, $aBlock['cache_lifetime']); } } return $sBlockCode; } /** * Get block code. * @return string */ protected function _getBlockCode(&$aBlock, $iAsync = 0) { $sContentWithBox = ''; $oFunctions = $this->_oTemplate->getTemplateFunctions(); if (isset($GLOBALS['bx_profiler'])) $GLOBALS['bx_profiler']->beginPageBlock(_t($aBlock['title']), $aBlock['id']); $aDbNoTitle = [BX_DB_CONTENT_ONLY, BX_DB_PADDING_CONTENT_ONLY, BX_DB_NO_CAPTION, BX_DB_PADDING_NO_CAPTION]; $sTitle = $this->getBlockTitle($aBlock); $sHelp = $this->getBlockHelp($aBlock); $sFunc = '_getBlock' . ucfirst($aBlock['type']); $bBlockVisible = $this->_isVisibleBlock($aBlock); if ($iAsync && $bBlockVisible) { $iDesignboxId = $aBlock['designbox_id']; $sHelpTitle = $sHelpContent = ''; if(!in_array($iDesignboxId, $aDbNoTitle)) $sHelpTitle = $sHelp; else $sHelpContent = $sHelp; $sContent = $this->getBlockAsyncCode($aBlock, $iAsync); $aParams = array( $sTitle . $sHelpTitle, $sContent . $sHelpContent, $iDesignboxId ); $sContentWithBox = call_user_func_array(array($oFunctions, 'designBoxContent'), $aParams); } elseif ($bBlockVisible && method_exists($this, $sFunc)) { $mixedContent = $this->$sFunc($aBlock); if(!empty($aBlock['content_empty'])) { $sEmpty = _t($aBlock['content_empty']); $sRegExp = '/(<[A-Za-z0-9]+\b.[^<]*[\pPi\pPf]bx\-msg\-box\b.*[\pPi\pPf][^>]*>)(' . _t('_Empty') . ')(<\/[A-Za-z0-9]+>)/su'; if(is_string($mixedContent)) $mixedContent = preg_replace($sRegExp, "\${1}" . $sEmpty . "\${3}", $mixedContent); else if(is_array($mixedContent) && !empty($mixedContent['content'])) $mixedContent['content'] = preg_replace($sRegExp, "\${1}" . $sEmpty . "\${3}", $mixedContent['content']); } $this->_oQuery->setReadOnlyMode(true); if(is_array($mixedContent) && !empty($mixedContent['content'])) { $iDesignboxId = isset($mixedContent['designbox_id']) ? $mixedContent['designbox_id'] : $aBlock['designbox_id']; if(!empty($mixedContent['markers']) && is_array($mixedContent['markers'])) { $this->addMarkers($mixedContent['markers']); $sTitle = $this->getBlockTitle($aBlock); } $sHelpTitle = $sHelpContent = ''; if(!in_array($iDesignboxId, $aDbNoTitle)) $sHelpTitle = $sHelp; else $sHelpContent = $sHelp; $aParams = array( (isset($mixedContent['title']) ? $mixedContent['title'] : $sTitle) . $sHelpTitle, $mixedContent['content'] . $sHelpContent, $iDesignboxId ); $mixedMenu = false; if(isset($mixedContent['menu'])) $mixedMenu = $mixedContent['menu']; else if(!empty($aBlock['submenu'])) $mixedMenu = $aBlock['submenu']; $aParams[] = $mixedMenu; if(isset($mixedContent['buttons'])) $aParams[] = $mixedContent['buttons']; else if($mixedMenu) $aParams[] = (int)$aBlock['tabs'] == 1 ? true : array(); if(isset($mixedContent['class'])) $aBlock['class'] = $mixedContent['class']; } else if(is_string($mixedContent) && !empty($mixedContent)) { $iDesignboxId = $aBlock['designbox_id']; $sHelpTitle = $sHelpContent = ''; if(!in_array($iDesignboxId, $aDbNoTitle)) $sHelpTitle = $sHelp; else $sHelpContent = $sHelp; $aParams = array( $sTitle . $sHelpTitle, $mixedContent . $sHelpContent, $iDesignboxId ); $mixedMenu = !empty($aBlock['submenu']) ? $aBlock['submenu'] : false; $aParams[] = $mixedMenu; if($mixedMenu) $aParams[] = (int)$aBlock['tabs'] == 1 ? true : array(); } if(!empty($aParams)) $sContentWithBox = call_user_func_array(array($oFunctions, 'designBoxContent'), $aParams); } 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->addJs(array('BxDolPage.js', 'theia-sticky-sidebar/theia-sticky-sidebar.min.js', 'theia-sticky-sidebar/ResizeSensor.min.js')); $this->_oTemplate->addCss('page_layouts.css'); } /** * Set system template variables, like page title, meta description, meta keywords and meta robots. */ protected function _addSysTemplateVars () { $oTemplate = BxDolTemplate::getInstance(); $sPageTitle = $this->_getPageTitle(); if ($sPageTitle) $oTemplate->setPageHeader ($sPageTitle); $sMetaTitle = $this->_getPageMetaTitle(); if ($sMetaTitle) $oTemplate->setPageMetaTitle ($sMetaTitle); $sMetaDesc = $this->_getPageMetaDesc(); if ($sMetaDesc) $oTemplate->setPageDescription ($sMetaDesc); $sMetaRobots = $this->_getPageMetaRobots(); if ($sMetaRobots) $oTemplate->setPageMetaRobots ($sMetaRobots); $sMetaImage = $this->_getPageMetaImage(); if ($sMetaImage) $oTemplate->addPageMetaImage($sMetaImage); $sMetaKeywords = $this->_getPageMetaKeywords(); if ($sMetaKeywords) $oTemplate->addPageKeywords ($sMetaKeywords); } /** * Select menu from page properties. */ protected function _selectMenu () { BxDolMenu::setSelectedGlobal ($this->_aObject['module'], $this->_aObject['uri']); } /** * Set page submenu if it's specified */ protected function _setSubmenu ($aParams) { if(empty($this->_aObject['submenu']) || $this->_aObject['submenu'] == 'disabled') return; $oMenuSubmenu = BxDolMenu::getObjectInstance('sys_site_submenu'); if(!$oMenuSubmenu) return; $oMenuSubmenu->setObjectSubmenu($this->_aObject['submenu'], $aParams); } /** * Get content for 'raw' block type. * @return string */ protected function _getBlockRaw ($aBlock) { if (bx_is_api()){ return [bx_api_get_block('raw', ['title' => _t($aBlock['title']), 'content' => BxDolTemplate::getInstance()->parseHtmlByContent($aBlock['content'], array())])]; } $s = '