array( * 'href' => $_SERVER['PHP_SELF'] . '?view=true', * 'dynamic' => true, * 'active' => !$this->isEditable, * ), * _t('_Edit') => array( * 'href' => $_SERVER['PHP_SELF'] . '?edit=true', * 'dynamicPopup' => true, * 'active' => $this->isEditable, * ) * ) * ); * } * } * * $_page['name_index'] = 0; // choose your own index of template or leave if in doubt * $_page['header'] = 'Example page'; * $_ni = $_page['name_index']; * * $oEPV = new BxExamplePageView(); * $_page_cont[$_ni]['page_main_code'] = $oEPV->getCode(); * * PageCode(); * * ?> * * 2. Insert into your sys_page_compose_pages table one line. * Name - Unique identification name of the page. Used for association page with its blocks. * We recommend use only latin symbols and digits. (In our example use "example") * Title - Title of your page, it is shown in the Page Builder. ("Example page") * Order - Just the order in list of pages in the Page Builder. * * 3. Insert into sys_page_compose lines for each block. * ID - ID of the block. System field. Leave it by default (0). Will be passed to the function as first argument. * Page - ID name of page which you inserted to sys_page_compose_pages ("example"). * PageWidth - System field. Leave it by default ("960px"). Customized later. * Desc - Few words about this block. Description. * Caption - Title of this block. ("Block One", "Block Two") * Column - System field. Leave it by default (0). Customized later. * Order - System field. Leave it by default (0). Customized later. * Func - Name of function in your class (without prefix) which will be called to generate the block. ("BlockOne", "BlockTwo") * Content - Optional argument. Rarely used. Passed as the second argument to the function. * DesignBox - Number of Design Box (container). Leave it by default if in doubt (1). * ColWidth - System field. Leave it by default (0). Customized later. * Visible - System field. Leave it by default (0). Customized later. * MinWidth - Minimum recommended width of the block. * * 4. Now go to the Page Builder, select your page in the list of pages and customize it (width, columns and blocks order). Then customize every block (caption, visibility, etc.). * * 5. Open http://yoursite.com/example.php in your browser and you will see your new customized columned page. * */ class BxDolPageView { var $sPageName; var $aPage; // cache of this page var $sCode = ''; var $sWhoViews = 'non'; var $iMemberID = 0; var $bAjaxMode = false; var $aColumnsWidth = array (); var $sTableName = 'sys_page_compose'; var $sCacheFile ; var $oCacher = null; function BxDolPageView( $sPageName ) { $this -> sCacheFile = 'sys_page_compose.inc'; $this -> sPageName = $sPageName; if( !$this -> load() ) return false; $this -> getViewerInfo(); $this -> checkAjaxMode(); } function checkAjaxMode() { if( isset( $_SERVER['HTTP_X_REQUESTED_WITH'] ) and $_SERVER['HTTP_X_REQUESTED_WITH'] == 'XMLHttpRequest' ) $this -> bAjaxMode = true; } function createCache() { if ($this->oCacher == null) $this->oCacher = new BxDolPageViewCacher($this->sTableName, $this->sCacheFile); return $this->oCacher->createCache(); } function load() { $oCache = $GLOBALS['MySQL']->getDbCacheObject(); $aCache = $oCache->getData($GLOBALS['MySQL']->genDbCacheKey($this->sCacheFile)); if (null === $aCache) { if (!$this->createCache() ) { echo '
Warning PageView cache not found'; return false; } $aCache = $oCache->getData($GLOBALS['MySQL']->genDbCacheKey($this->sCacheFile)); } if( !$aCache ) { echo '
Warning! PageView cache cannot be evaluated. Please recompile.'; return false; } if( !array_key_exists( $this -> sPageName, $aCache ) ) { //echo '
Warning! The page not found in PageView cache.'; return false; } $this -> aPage = $aCache[ $this->sPageName ]; if (BxDolRequest::serviceExists('pageac', 'page_blocks_filter')) { BxDolService::call('pageac', 'page_blocks_filter', array(&$this)); } return true; } function isLoaded() { return (isset($this->aPage) && !empty($this->aPage)); } function getPageTitle() { return $this->aPage['Title']; } function getViewerInfo() { if (isMember()) { $this -> sWhoViews = 'memb'; $this -> iMemberID = (int)$_COOKIE['memberID']; } } function gen() { global $_page_cont, $_ni, $_page, $oSysTemplate; if( !$this -> aPage ) return false; $this -> genColumnsHeader(); $oSysTemplate->setPageWidth($this -> aPage['Width']); $oSysTemplate->addJs('view_edit.js'); if (isset($this -> aPage['Columns']) && !empty($this -> aPage['Columns'])){ foreach( array_keys( $this -> aPage['Columns'] ) as $iColumn ) $this -> genColumn( $iColumn ); } else { $this->genPageEmpty(); } $this -> genColumnsFooter(); } function genPageEmpty() { $this->genColumnsHeader(); $this->genColumnHeader(1, 100); $this->sCode .= MsgBox(_t('_Empty')); $this->genColumnFooter(1); $this->genColumnsFooter(); } function genOnlyBlock( $iBlockID, $sDynamicType = 'tab' ) { if( !$iBlockID ) return false; // search block foreach( array_keys( $this -> aPage['Columns'] ) as $iColumn ) { $aColumn = $this -> aPage['Columns'][ $iColumn ]; if( !$aColumn ) return false; if (isset($aColumn['Blocks'][$iBlockID])) { $this -> genBlock( $iBlockID, $aColumn['Blocks'][$iBlockID], false, $sDynamicType ); return true; } } return false; } function getCode() { if( !($this -> bAjaxMode and (int)$_REQUEST['pageBlock']) ) $this -> gen(); else { $this -> genOnlyBlock( (int)$_REQUEST['pageBlock'], $_REQUEST['dynamic'] ); header( 'Content-type:text/html;charset=utf-8' ); echo $this -> sCode; exit; } return $this -> sCode; } //for customizability function genColumnsHeader() { } //for customizability function genColumnsFooter() { } function genColumn( $iColumn ) { $aColumn = $this -> aPage['Columns'][ $iColumn ]; if( !$aColumn ) return false; $bShowDebugBlockInfo = !empty($_REQUEST['debug_mode']); $this -> genColumnHeader( $iColumn, $aColumn['Width'] ); foreach( $aColumn['Blocks'] as $iBlockID => $aBlock ) { if ($bShowDebugBlockInfo) $iCurTime = getmicrotime(); $this -> genBlock( $iBlockID, $aBlock ); if ($bShowDebugBlockInfo) { $iCurTime2 = getmicrotime(); $iGenTime = $iCurTime2 - $iCurTime; $this -> sCode .= ""; } } $this -> genColumnFooter( $iColumn ); } function getBlockCode_Topest($iColumn) { return ''; } function genColumnHeader( $iColumn, $fColumnWidth ) { $iColumnsCount = count($this -> aPage['Columns']); if(count($this -> aPage['Columns']) == 1) $sAddClass = ' page_column_single'; else if($iColumn == 1) $sAddClass = ' page_column_first'; else if($iColumn == $iColumnsCount) $sAddClass = ' page_column_last'; else $sAddClass = ''; switch (preg_replace('/\d+/', '', $this->aPage['Width'])) { case 'px': // calc width in pixels if ('px' == $GLOBALS['oTemplConfig']->PageComposeColumnCalculation) { if ($iColumn == $iColumnsCount) // sum of all columns must not be more/less than page width $sColumnWidth = ($this -> aPage['Width'] - array_sum($this->aColumnsWidth)) . 'px'; else $sColumnWidth = round(($fColumnWidth * $this -> aPage['Width']) / 100) . 'px'; $this->aColumnsWidth[$iColumn] = (int)$sColumnWidth; break; } // else calculate in percentages below case '%': $sColumnWidth = $fColumnWidth . '%'; break; } $this -> sCode .= '
'; $sBlockFunction = 'getBlockCode_Topest'; $this -> sCode .= $this -> $sBlockFunction($iColumn); } function genColumnFooter( $iColumn ) { $this -> sCode .= '
'; } /* Note: if bStatic == false, it is popup */ function genBlock( $iBlockID, $aBlock, $bStatic = true, $sDynamicType = 'tab' ) { if( !$this -> isBlockVisible( $aBlock['Visible'] ) ) return false; if (isset($GLOBALS['bx_profiler'])) $GLOBALS['bx_profiler']->beginPageBlock(_t($aBlock['Caption']), $iBlockID); if ($aBlock['Cache'] > 0 && getParam('sys_pb_cache_enable') == 'on') { $oCache = $this->getBlocksCacheObject (); $sBlock = $oCache->getData($this->genBlocksCacheKey ($iBlockID.$bStatic.$sDynamicType.isMember()), $aBlock['Cache']); if ($sBlock !== null) { if (isset($GLOBALS['bx_profiler'])) $GLOBALS['bx_profiler']->endPageBlock($iBlockID, $sBlock ? false : true, true); $this->sCode .= $sBlock; return; } } $sBlockFunction = 'getBlockCode_' . $aBlock['Func']; $mBlockCode = ''; if( method_exists( $this, $sBlockFunction ) ) { $mBlockCode = $this -> $sBlockFunction( $iBlockID, $aBlock['Content'] ); } // $sBlockFunction can return simple string or array with few values: // 0 - content, 1 - array of caption links, 2 - bottom links, 3 - caption addon (array or string) $sTopCode = ''; $sBottomCode = ''; if( is_array( $mBlockCode ) ) { $sCaptionCode = $this->_getBlockCaptionCode($iBlockID, $aBlock, $mBlockCode, $bStatic, $sDynamicType); $sTopCode = $this->_getBlockTopCode($iBlockID, $aBlock, $mBlockCode, $bStatic, $sDynamicType); $sBlockCode = !isset($mBlockCode[3]) || (isset($mBlockCode[3]) && $mBlockCode[3] === false) ? '
' . $mBlockCode[0] . '
' : $mBlockCode[0]; $sBottomCode = $this->_getBlockBottomCode($iBlockID, $aBlock, $mBlockCode, $bStatic, $sDynamicType); } else if(is_string($mBlockCode)) { $sCaptionCode = $this->_getBlockCaptionCode($iBlockID, $aBlock, $mBlockCode, $bStatic, $sDynamicType); $sBlockCode = $mBlockCode; } else $sBlockCode = false; $sBlock = ''; if ($sBlockCode) { $sCodeDB = DesignBoxContent( $sCaptionCode, $sBlockCode, $aBlock['DesignBox'], $sTopCode, $sBottomCode); if ($bStatic) { $sBlock .= '
' . $sCodeDB . '
'; } else { if ($sDynamicType == 'tab') $sBlock .= $sCodeDB; elseif ($sDynamicType == 'popup') $sBlock .= $GLOBALS['oFunctions']->transBox($sCodeDB, true); } } $this->sCode .= $sBlock; if ($aBlock['Cache'] > 0 && getParam('sys_pb_cache_enable') == 'on') { $oCache = $this->getBlocksCacheObject (); $oCache->setData($this->genBlocksCacheKey ($iBlockID.$bStatic.$sDynamicType.isMember()), $sBlock, $aBlock['Cache']); } if (isset($GLOBALS['bx_profiler'])) $GLOBALS['bx_profiler']->endPageBlock($iBlockID, $sBlockCode ? false : true, false ); if (!$sBlockCode) return false; } function _getBlockCaptionCode($iBlockID, $aBlock, $aBlockCode, $bStatic = true, $sDynamicType = 'tab') { $sCode = ""; if(is_array($aBlockCode) && isset($aBlockCode[3]) && (is_array($aBlockCode[3]) || (is_string($aBlockCode[3]) && $aBlockCode[3]))) { // if array is passed, pass it to the original caption translation if(is_array($aBlockCode[3])) $sCode = _t($aBlock['Caption'], $aBlockCode[3][0], $aBlockCode[3][1], $aBlockCode[3][2]); // if string is passed, replace the caption else if(is_string($aBlockCode[3]) && $aBlockCode[3]) $sCode = _t($aBlockCode[3]); } // else pass the original caption else $sCode = _t($aBlock['Caption']); return $sCode; } function _getBlockTopCode($iBlockID, $aBlock, $aBlockCode, $bStatic = true, $sDynamicType = 'tab') { $sCaptionMenuFunc = !isset($aBlockCode[4]) ? 'getBlockCaptionItemCode' : $aBlockCode[4]; $sCode = ""; if(!$bStatic && $sDynamicType == 'popup') $sCode = '
'; else if( is_array($aBlockCode[1])) $sCode = $this -> $sCaptionMenuFunc($iBlockID, $aBlockCode[1]); return $sCode; } function _getBlockBottomCode($iBlockID, $aBlock, $aBlockCode, $bStatic = true, $sDynamicType = 'tab') { $sCode = ""; if(!empty($aBlockCode[2]) && is_array($aBlockCode[2])) $sCode = $this->getBlockBottomCode($iBlockID, $aBlockCode[2]); else $sCode = empty($aBlockCode[2]) ? '' : $aBlockCode[2]; return str_replace('{id}', $iBlockID, $sCode); } function isBlockVisible( $sVisible ) { if( strpos( $sVisible, $this -> sWhoViews ) === false ) return false; else return true; } function getBlockCaptionItemCode( $iBlockID, $aLinks ) { $aItems = array(); foreach( $aLinks as $sTitle => $aLink ) { $sTitle = htmlspecialchars_adv(_t( $sTitle )); $sClass = !empty($aLink['class']) ? $aLink['class'] : 'top_members_menu'; $sClass .= isset($aLink['icon']) ? ' with_icon' : ''; if(!empty($aLink['onclick'])) $sOnclick = 'onclick="' . $aLink['onclick'] . '"'; else if($aLink['dynamic']) $sOnclick = 'onclick="return !loadDynamicBlock(' . $iBlockID . ', this.href);"'; else if($aLink['dynamicPopup']) $sOnclick = 'onclick="loadDynamicPopupBlock(' . $iBlockID . ', this.href); return false;"'; else $sOnclick = ''; $aItems[] = array( 'bx_if:item_act' => array( 'condition' => (bool)$aLink['active'], 'content' => array( 'bx_if:icon_act' => array( 'condition' => isset($aLink['icon']), 'content' => array( 'class' => $sClass, 'src' => empty($aLink['icon']) ? '' : $aLink['icon'] ) ), 'title' => $sTitle ) ), 'bx_if:item_pas' => array( 'condition' => !(bool)$aLink['active'], 'content' => array( 'bx_if:icon_pas' => array( 'condition' => isset($aLink['icon']), 'content' => array( 'class' => $sClass, 'src' => empty($aLink['icon']) ? '' : $aLink['icon'] ) ), 'id' => (!empty($aLink['id']) ? 'id="' . $aLink['id'] . '"' : ''), 'href' => htmlspecialchars_adv($aLink['href']), 'class' => $sClass, 'target' => (!empty($aLink['target']) ? ' target="' . $aLink['target'] . '"' : ''), 'on_click' => $sOnclick, 'title' => $sTitle ) ) ); } return $GLOBALS['oSysTemplate']->parseHtmlByName('designbox_menu_1.html', array( 'id' => '' . $iBlockID, 'bx_repeat:items' => $aItems )); } function getBlockCaptionMenu( $iBlockID, $aLinks ) { $aItems = array(); foreach( $aLinks as $sId => $aLink ) { if(isset($aLink['icon'])) $aLink['class'] = isset($aLink['class']) ? $aLink['class'] . ' with_icon' : 'with_icon'; $sHidden = ' style="display:none"'; $bActive = isset($aLink['active']) && $aLink['active'] == 1; $sClass = isset($aLink['class']) ? ' class="' . $aLink['class'] . '"' : ''; $aItems[] = array( 'id' => $sId, 'show_active' => !$bActive ? $sHidden : '', 'show_passive' => $bActive ? $sHidden : '', 'bx_if:icon_act' => array( 'condition' => isset($aLink['icon']), 'content' => array( 'class' => $sClass, 'src' => $aLink['icon'] ) ), 'bx_if:icon_pas' => array( 'condition' => isset($aLink['icon']), 'content' => array( 'class' => $sClass, 'src' => $aLink['icon'] ) ), 'class' => $sClass, 'title' => htmlspecialchars_adv(_t($aLink['title'])), 'href' => (isset($aLink['href']) ? 'href="' . htmlspecialchars_adv($aLink['href']) . '"' : ''), 'target' => (isset($aLink['target']) ? 'target="' . $aLink['target'] . '"' : ''), 'on_click' => (isset($aLink['onclick']) ? 'onclick="' . $aLink['onclick'] . '"' : '') ); } return $GLOBALS['oSysTemplate']->parseHtmlByName('designbox_menu_2.html', array( 'id' => '' . $iBlockID, 'bx_repeat:items' => $aItems )); } function getBlockBottomCode( $iBlockID, $aLinks ) { if (empty($aLinks)) return; $sCode = '
'; foreach( $aLinks as $sTitle => $aLink ) { $sTitle = htmlspecialchars_adv( $sTitle ); $sClass = $aLink['class'] ? $aLink['class'] : 'moreMembers'; $sPossibleIconClass = (isset($aLink['icon_class']) && $aLink['icon_class']=='left') ? 'left' : 'right'; $sPossibleIcon = (isset($aLink['icon'])==false) ? '' : << EOF; if( $aLink['active'] ) { $sCode .= <<{$sTitle} BLAH; } else { $sTarget = $aLink['target'] ? ( 'target="' . $aLink['target'] . '"' ) : ''; $sOnclick = $aLink['dynamic'] ? ( 'onclick="return !loadDynamicBlock(' . $iBlockID . ', '. (isset($aLink['static']) && false == $aLink['static'] ? "'{$aLink['href']}'" : 'this.href') . ');"' ) : ''; $sHref = isset($aLink['static']) && false == $aLink['static'] ? 'javascript:void(0);' : $aLink['href']; $sCode .= <<{$sTitle} BLAH; } } $sCode .= '
'; return $sCode; } /* * * * Page Blocks * * * */ /** * members statistic block */ function getBlockCode_MemberStat() { return getSiteStatUser(); } function getBlockCode_Echo( $iBlockID, $sContent ) { // Deano - Page Block Keys Mod Start. if (BxDolRequest::serviceExists('block_keys', 'process_html')) { $sContent = BxDolService::call('block_keys', 'process_html', array($sContent, $iBlockID)); } // Deano - Page Block Keys Mod End. return '
' . $sContent . '
'; } function getBlockCode_XML( $iBlockID, $sContent ) { $sApplication = BxDolService::call('open_social', 'gen_application', array($sContent)); return <<
{$sApplication}
EOF; } function getBlockCode_PHP( $iBlockID, $sContent ) { ob_start(); $aResult = eval($sContent); $sContent = ob_get_clean(); return !empty($aResult) ? $aResult : $sContent; } function getBlockCode_RSS( $iBlockID, $sContent ) { list( $sUrl, $iNum ) = explode( '#', $sContent ); $iNum = (int)$iNum; $iAddID = 0; if (isset( $this -> oProfileGen -> _iProfileID)) $iAddID = $this -> oProfileGen -> _iProfileID; elseif (isMember()) $iAddID = $_COOKIE['memberID']; return '
Loading...
'; } function getBlockCode_LoginSection($iBlockID, $sParams = '') { $sDolUrl = BX_DOL_URL_ROOT; $sAdminUrl = BX_DOL_URL_ADMIN; $sAdminPanelC = _t('_Admin Panel'); $sLogoutC = _t('_Log Out'); $sControlPanelC = _t('_Control Panel'); $sHelloMemberC = _t( '_Hello member', getNickName( $this -> iMemberID ) ); $ret = ''; if (isAdmin()) { $ret .= << {$sAdminPanelC} | | {$sLogoutC} EOF; /*} elseif (isModerator()) { $ret .= '
'; $ret .= ''; $ret .= 'Moderator Panel'; $ret .= ''; $ret .= ''; $ret .= '| |'; $ret .= ''; $ret .= ''; $ret .= '{$sLogoutC}'; $ret .= ''; $ret .= '
'; } elseif (isAffiliate()) { $ret .= '
'; $ret .= ''; $ret .= 'Affiliate Panel'; $ret .= ''; $ret .= ''; $ret .= '| |'; $ret .= ''; $ret .= ''; $ret .= '{$sLogoutC}'; $ret .= ''; $ret .= '
';*/ } elseif (isMember()) { $sMemberIcon = get_member_icon( $memberID, 'none' ); $ret .= << {$sMemberIcon}
{$sHelloMemberC}
{$sControlPanelC}  {$sLogoutC}
EOF; } else { return getMemberLoginFormCode('login_box_form', $sParams); } return '
'.$ret.'
'; } function GenFormWrap($sMainContent, $sPage, $sFunctionName, $iMaxThumbWidth, $iThumbsCnt) { $sBlockWidthSQL = "SELECT `PageWidth`, `ColWidth` FROM `sys_page_compose` WHERE `Page`='{$sPage}' AND (`Func`='{$sFunctionName}' OR `Caption`='{$sFunctionName}')"; $aBlockWidthInfo = db_arr($sBlockWidthSQL); $aBlockWidth = (int)((int)($aBlockWidthInfo['PageWidth'] - 20) * (int)$aBlockWidthInfo['ColWidth'] / 100) - 14; $iDestWidth = $iThumbsCnt * $iMaxThumbWidth; $iDestWidth = getBlockWidth($aBlockWidth, $iMaxThumbWidth, $iThumbsCnt); $sWidthCent = ($iDestWidth>0) ? "width:{$iDestWidth}px;" : ''; return <<
{$sMainContent}
EOF; } function getBlocksCacheObject () { if ($this->oCacher == null) $this->oCacher = new BxDolPageViewCacher($this->sTableName, $this->sCacheFile); return $this->oCacher->getBlocksCacheObject (); } function genBlocksCacheKey ($sId) { if ($this->oCacher == null) $this->oCacher = new BxDolPageViewCacher($this->sTableName, $this->sCacheFile); return $this->oCacher->genBlocksCacheKey ($sId); } } ?>