discuz模块更新使用流程解析
2013-02-26 13:57
239 查看
模板文件中的模块调用<!--{block/977}-->
控制文件调用模板文件,解析模板文件,取出页面上调用的模块,在模板解析文件头部添加
<?phpblock_get(‘977’),模板文件模块所在处替换为:<?phpblock_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代码(重新获取模块数据,如果有推送数据,则优先选择模块推送数据)
门户管理模块数据列表,更新模块数据是否固定和位置
./source/include/portalcp/portalcp_block.php
控制文件调用模板文件,解析模板文件,取出页面上调用的模块,在模板解析文件头部添加
<?phpblock_get(‘977’),模板文件模块所在处替换为:<?phpblock_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代码(重新获取模块数据,如果有推送数据,则优先选择模块推送数据)
/** *获取模块配置信息,模块数据 */ functionblock_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($cachedataas$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)))){ returntrue; } } } $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); } }
/** *更新模块数据,获取指定条数数据 *@globaltype$_G *@paramtype$bid模块BID *@paramtype$items模块规则,推送(优先)获取的数据 *@returntype$showlist最终模块显示的数据列表 */ functionblock_updateitem($bid,$items=array()){ global$_G; $block=$_G['block'][$bid]; if(!$block){ if(!($block=C::t('common_block')->fetch($bid))){ returnfalse; } $_G['block'][$bid]=$block; } $block['shownum']=max($block['shownum'],1); $showlist=array(); $archivelist=array(); $prelist=array(); $oldvalue=$fixedvalue=$fixedkeys=array(); /** *获取原模块数据,取出固定的数据,固定位置可能有多条数据,预订,使用,过期2013-2-20added */ 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($oldvalueas$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; } }elseif(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($itemsas$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 *更新模块数据itemtypelocked?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($itemsas$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($itemlistas$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']:''; }
相关文章推荐
- React 使用fromidable 模块进行文件上传出现First argument must be a string 的解析错误的原因
- Python_使用csv模块解析csv文件
- python 模块-使用HTMLParser 解析html
- 零基础自学用Python 3开发网络爬虫(五): 使用第三方模块快速抓取与解析
- Magento(社区版)自带模块解析以及在国内的使用建议一
- seajs中模块的解析规则详解和模块使用总结
- GitHub使用流程- Git Shell 的一些命令总结(二) 创建代码库并学会更新
- 关于项目在Xcode更新8.3.2 (使用子模块引入ReactiveCocoa报错)
- magento - 安装新的支付模块却导致onepage支付流程无法使用
- IOS-使用framework实现功能模块动态更新
- 关于BeautifulSoup(HTML字符解析模块)的使用
- discuz登录流程解析(版本X3.2)
- Discuz!NT代码阅读笔记(3)--网站安装也能自动化:DNT安装时使用到的几个函数解析 (转)
- iOS开发必收藏】详解iOS应用程序内使用IAP/StoreKit付费、沙盒(SandBox)测试、创建测试账号流程!【2012-6-25日更新iap恢复详解】
- 建议13:使用Python模块re实现解析小工具
- Python命令行参数解析模块getopt使用实例
- 使用Python中HTTPParser模块进行简单的html解析
- 【UGF】(三)Resource模块的使用及资源热更新
- Magento(社区版)自带模块解析以及在国内的使用建议三
- 【iOS开发必收藏】详解iOS应用程序内使用IAP/StoreKit付费、沙盒(SandBox)测试、创建测试账号流程!【2012-12-11日更新获取”产品付费数量等于0的问题”】