- 模板文件中的模块调用<!--{block/977}-->
- 控制文件调用模板文件,解析模板文件,取出页面上调用的模块,在模板解析文件头部添加
<?php block_get(‘977’),模板文件模块所在处替换为:<?php block_display('977');?>
处理函数说明:
function_core.php --- function_block.php
block_get -> block_get_batch
block_display->block_display_batch
block_get_batch 取得模块数据items
block_display_batch 数据+模板=数据的html代码(重新获取模块数据,如果有推送数据,则优先选择模块推送数据)
/** * 获取模块配置信息,模块数据 */ function block_get_batch($parameter) { global $_G; $bids = $parameter && is_array($parameter) ? $parameter : ($parameter ? explode(',', $parameter) : array()); $bids = array_map('intval', $bids); $bids = array_unique($bids); $styleids = array(); if($bids) { if(C::t('common_block')->allowmem) { if(($cachedata = memory('get', $bids, 'blockcache_')) !== false) { foreach ($cachedata as $bid => $block) { $_G['block'][$bid] = $block; if($block['styleid']) { $styleids[$block['styleid']] = $block['styleid']; } } if($styleids) { block_getstyle($styleids); } if(!($bids = array_diff($bids, array_keys($cachedata)))) { return true; } } } $items = $prelist = array(); //获取模块数据,去除过期数据,取出固定当前可用数据,全部可用数据(除过期的 foreach(C::t('common_block_item')->fetch_all_by_bid($bids) as $item) { //数据过期 if($item['itemtype'] == '1' && $item['enddate'] && $item['enddate'] < TIMESTAMP) { continue; //数据固定,在可用范围内 } elseif($item['itemtype'] == '1' && (!$item['startdate'] || $item['startdate'] <= TIMESTAMP)) { //如果指定位置处已经存在,则覆盖 if (!empty($items[$item['bid']][$item['displayorder']])) { $prelist[$item['bid']] = array(); } $prelist[$item['bid']][$item['displayorder']] = $item; } $items[$item['bid']][$item['displayorder']] = $item; } foreach(C::t('common_block')->fetch_all($bids) as $bid => $block) { if(!empty($block['styleid']) && $block['styleid'] > 0) { $styleids[] = intval($block['styleid']); } if(!empty($items[$bid])) { ksort($items[$bid]); $newitem = array(); //模块有固定数据 if(!empty($prelist[$bid])) { $countpre = 0; foreach($items[$bid] as $position => $item) { //当前位置没有固定数据 if(empty($prelist[$bid][$position])) { if(isset($items[$bid][$position+$countpre])) {//模块数据指定位置有数据,则新的模块数据当前位置才有数据 $newitem[$position+$countpre] = $item; } } else { if ($item['itemtype']=='1') {//数据固定,取开始时间较晚的那条数据 if ($prelist[$bid][$position]['startdate'] >= $item['startdate']) { $newitem[$position] = $prelist[$bid][$position]; } else { $newitem[$position] = $item; } } else {//数据不固定 (什么情况会有?) $newitem[$position] = $prelist[$bid][$position]; $countpre++; if(isset($items[$bid][$position+$countpre])) { $newitem[$position+$countpre] = $item; } } } } ksort($newitem); } $block['itemlist'] = empty($newitem) ? $items[$bid] : $newitem; } $block['param'] = $block['param'] ? dunserialize($block['param']) : array(); $_G['block'][$bid] = $block; if(C::t('common_block')->allowmem) { memory('set', 'blockcache_'.$bid, $_G['block'][$bid], C::t('common_block')->cache_ttl); } } } if($styleids) { block_getstyle($styleids); } }
/** * 更新模块数据,获取指定条数数据 * @global type $_G * @param type $bid 模块BID * @param type $items 模块规则,推送(优先)获取的数据 * @return type $showlist 最终模块显示的数据列表 */ function block_updateitem($bid, $items=array()) { global $_G; $block = $_G['block'][$bid]; if(!$block) { if(!($block = C::t('common_block')->fetch($bid))) { return false; } $_G['block'][$bid] = $block; } $block['shownum'] = max($block['shownum'], 1); $showlist = array(); $archivelist = array(); $prelist = array(); $oldvalue = $fixedvalue = $fixedkeys = array(); /** * 获取原模块数据,取出固定的数据,固定位置可能有多条数据,预订,使用,过期 2013-2-20 added */ foreach(C::t('common_block_item')->fetch_all_by_bid($bid, true) as $value) { $key = $value['idtype'].'_'.$value['id']; if($value['itemtype'] == '1') { $fixedvalue[$value['displayorder']][] = $value; $fixedkeys[$key] = 1; continue; } elseif(!isset($oldvalue[$key])) { $oldvalue[$key] = $value; } else { $archivelist[$value['itemid']] = 1; } } /** * 处理 重新获取的数据 * key:原数据中已有指定key的固定数据,重新获取数据删除此条记录 * 原数据中已有指定key的非固定数据,如果修改,则使用原数据中的key值,否 更新重新获取的数据的itemid为原key数据的itemid */ $processkeys = array(); $itemcount = count($items); for($k = 0; $k < $itemcount; $k++) { $v = $items[$k]; $key = $v['idtype'].'_'.$v['id']; if(isset($fixedkeys[$key])) { $items[$k] = null; } elseif(isset($oldvalue[$key]) && !isset($processkeys[$key])) { if($oldvalue[$key]['itemtype'] == '2') { $items[$k] = $oldvalue[$key]; } else { $items[$k]['itemid'] = $oldvalue[$key]['itemid']; } unset($oldvalue[$key]); $processkeys[$key] = 1; } elseif(isset($processkeys[$key])) { unset($items[$k]); } } $items = array_filter($items); foreach($oldvalue as $value) { $archivelist[$value['itemid']] = 1; } /** * 重新获取模块数据 * 如有指定位置固定的原数据,预订:保留,重新获取数据;有效:显示;过期:删除,重新获取数据 * $jump == false 重新获取指定位置的数据 */ for($i = 1; $i <= $block['shownum']; $i++) { $jump = false; if(isset($fixedvalue[$i])) { foreach($fixedvalue[$i] as $value) { if($value['startdate'] > TIMESTAMP) { $prelist[] = $value; } elseif((!$value['startdate'] || $value['startdate'] <= TIMESTAMP) && (!$value['enddate'] || $value['enddate'] > TIMESTAMP)) { $showlist[] = $value; $jump = true; } else { $archivelist[$value['itemid']] = 1; } } } if(!$jump) { $curitem = array(); if(!($curitem = array_shift($items))) { break; } $curitem['displayorder'] = $i; $curitem['makethumb'] = 0; if($block['picwidth'] && $block['picheight'] && $curitem['picflag']) { //picflag=0为url地址 $thumbpath = empty($curitem['thumbpath']) ? block_thumbpath($block, $curitem) : $curitem['thumbpath']; if($_G['setting']['ftp']['on']) { if(empty($ftp) || empty($ftp->connectid)) { $ftp = & discuz_ftp::instance(); $ftp->connect(); } if($ftp->ftp_size($thumbpath) > 0) { $curitem['makethumb'] = 1; $curitem['picflag'] = 2; } } else if(file_exists($_G['setting']['attachdir'].$thumbpath)) { $curitem['makethumb'] = 1; $curitem['picflag'] = 1; } $curitem['thumbpath'] = $thumbpath; } if(is_array($curitem['fields'])) { $curitem['fields'] = serialize($curitem['fields']); } $showlist[] = $curitem; } } foreach($items as $value) { if(!empty($value['itemid'])) { $archivelist[$value['itemid']] = 1; } } /** * 删除无效的,多出的数据 */ if($archivelist) { $delids = array_keys($archivelist); C::t('common_block_item')->delete_by_itemid_bid($delids, $bid); block_delete_pic($bid, $delids); } /** * 模块数据最终存储的数据是 有效的数据和预存的数据,数据条数之和为shownum */ $inserts = $itemlist = array(); $itemlist = array_merge($showlist, $prelist); C::t('common_block_item')->insert_batch($bid, $itemlist); $showlist = array_filter($showlist); return $showlist; }
门户管理模块数据列表,更新模块数据是否固定和位置
./source/include/portalcp/portalcp_block.php
elseif($op == 'data') { if(!$bid || (!$allowmanage && !$allowdata)) { showmessage('block_edit_nopermission'); } if(submitcheck('updatesubmit')) { /** * 只有在有效时间范围内的数据有displayorder, locked * 更新模块数据itemtype locked? 1 : 0 ,非固定模块数据更新标识itemtype=2取消,重新获取idtype_id此模块数据值 * 如果是预订数据,则无,只是显示,没做任何操作 */ if($_POST['displayorder']) { asort($_POST['displayorder']); $orders = $ids = array(); $order = 1; foreach($_POST['displayorder'] as $k=>$v) { $k = intval($k); $ids[] = $k; $orders[$k] = $order; $order++; } $items = array(); foreach(C::t('common_block_item')->fetch_all($ids) as $value) { if($value['bid'] == $bid) { $items[$value['itemid']] = $value; } } foreach($items as $key=>$value) { $itemtype = !empty($_POST['locked'][$key]) ? '1' : '0'; if($orders[$key] != $value['displayorder'] || $itemtype != $value['itemtype']) { C::t('common_block_item')->update($key, array('displayorder'=>$orders[$key], 'itemtype'=>$itemtype)); } } } showmessage('do_success', 'portal.php?mod=portalcp&ac=block&op=data&bid='.$bid, array('bid'=>$bid, 'eleid'=> $_GET['eleid'])); } $itemlist = array(); if($bid) { $preorders = array(); foreach(C::t('common_block_item')->fetch_all_by_bid($bid, true) as $value) { if($value['itemtype']==1 && $value['enddate'] && $value['enddate'] <= TIMESTAMP) { continue; } $value['ispreorder'] = false; if($value['itemtype']==1) { if($value['startdate'] > TIMESTAMP) { $value['ispreorder'] = true; //数据是预存数据 } else { $preorders[$value['displayorder']] = $value['itemid']; //固定位置数据 } } $value['itemtypename'] = lang('portalcp', 'itemtypename'.$value['itemtype']); $itemlist[$value['itemid']] = $value; } if($preorders) { foreach($itemlist as $key=>$value) { //如果固定位置数据和数据列表指定位置数据(修改的,预订的,未修改的)itemid不同,取固定数据,销毁此数据 if(isset($preorders[$value['displayorder']]) && $value['itemid'] != $preorders[$value['displayorder']]) { unset($itemlist[$key]); } } } } $block['param']['bannedids'] = !empty($block['param']['bannedids']) ? $block['param']['bannedids'] : ''; }