discuz模块更新使用流程解析
- 模板文件中的模块调用<!--{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