您的位置:首页 > 其它

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代码(重新获取模块数据,如果有推送数据,则优先选择模块推送数据)

/**
*获取模块配置信息,模块数据
*/
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']:'';

}





                                            
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐