discuz模組更新使用流程解析

2021-09-24 10:50:31 字數 4517 閱讀 3750

模板檔案中的模組呼叫

控制檔案呼叫模板檔案,解析模板檔案,取出頁面上呼叫的模組,在模板解析檔案頭部新增

<?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)

}if($styleids)

if(!($bids = array_diff($bids, array_keys($cachedata)))) }}

$items = $prelist = array();

//獲取模組資料,去除過期資料,取出固定當前可用資料,全部可用資料(除過期的

foreach(c::t('common_block_item')->fetch_all_by_bid($bids) as $item) elseif($item['itemtype'] == '1' && (!$item['startdate'] || $item['startdate'] <= timestamp))

$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($items[$bid]))

} else else

} else }}

}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) }}

if($styleids)

}

/**

* 更新模組資料,獲取指定條數資料

* @global type $_g

* @param type $bid 模組bid

* @param type $items 模組規則,推送(優先)獲取的資料

* @return type $showlist 最終模組顯示的資料列表

*/function block_updateitem($bid, $items=array())

$_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) elseif(!isset($oldvalue[$key])) else

}/**

* 處理 重新獲取的資料

* key:原資料中已有指定key的固定資料,重新獲取資料刪除此條記錄

* 原資料中已有指定key的非固定資料,如果修改,則使用原資料中的key值,否 更新重新獲取的資料的itemid為原key資料的itemid

*/$processkeys = array();

$itemcount = count($items);

for($k = 0; $k < $itemcount; $k++) elseif(isset($oldvalue[$key]) && !isset($processkeys[$key])) else

unset($oldvalue[$key]);

$processkeys[$key] = 1;

} elseif(isset($processkeys[$key]))

}$items = array_filter($items);

foreach($oldvalue as $value)

/*** 重新獲取模組資料

* 如有指定位置固定的原資料,預訂:保留,重新獲取資料;有效:顯示;過期:刪除,重新獲取資料

* $jump == false 重新獲取指定位置的資料

*/for($i = 1; $i <= $block['shownum']; $i++) elseif((!$value['startdate'] || $value['startdate'] <= timestamp)

&& (!$value['enddate'] || $value['enddate'] > timestamp)) else }}

if(!$jump)

$curitem['displayorder'] = $i;

$curitem['makethumb'] = 0;

if($block['picwidth'] && $block['picheight'] && $curitem['picflag'])

if($ftp->ftp_size($thumbpath) > 0)

} else if(file_exists($_g['setting']['attachdir'].$thumbpath))

$curitem['thumbpath'] = $thumbpath;

}if(is_array($curitem['fields']))

$showlist = $curitem;}}

foreach($items as $value)

}/**

* 刪除無效的,多出的資料

*/if($archivelist)

/*** 模組資料最終儲存的資料是 有效的資料和預存的資料,資料條數之和為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(submitcheck('updatesubmit'))

$items = array();

foreach(c::t('common_block_item')->fetch_all($ids) as $value)

}foreach($items as $key=>$value) }}

showmessage('do_success', 'portal.php?mod=portalcp&ac=block&op=data&bid='.$bid, array('bid'=>$bid, 'eleid'=> $_get['eleid']));

}$itemlist = array();

if($bid)

$value['ispreorder'] = false;

if($value['itemtype']==1) else

}$value['itemtypename'] = lang('portalcp', 'itemtypename'.$value['itemtype']);

$itemlist[$value['itemid']] = $value;

}if($preorders) }}

}$block['param']['bannedids'] = !empty($block['param']['bannedids']) ? $block['param']['bannedids'] : '';

}

使用LUA 熱更新模組

最近準備在手機專案客戶端中使用lua,以前一直在伺服器使用luabind.另外,tolua 也體驗過,luaplus也在早年用過.以下是本人對這些繫結庫的個人感覺 luabind 利用boost機制把繫結做到極致,比較適合主c 弱lua的指令碼框架.作者已經停止更新,在windows linux編譯...

Python中使用dateutil模組解析時間

最近剛接觸專案組內的python專案,發現所有的時間格式都是用的iso8601,同事美其名曰說是為了專案的國際化 其實使用者量最多幾百人吧,還都集中在公司內部,哪來的國際化,哈哈哈哈!所以決定對該時間格式深入研究下,發現了python中的dateutil模組。datetime轉iso8601格式,直...

列舉 反射 解耦業務多流程,實現模組化

1.列舉 列舉是乙個被命名的整型常數的集合,用於宣告一組帶識別符號的常數.宣告列舉 author yangyang version 1.0 date 2020 9 30 9 11 describe 支付列舉 data tostring public enum payserviceenum retur...