一直很困惑於論壇的緩存更新中的extend_common.css和extend_module.css是如何被加載到模板緩存文件中的,看了看更新緩存的程序終於恍然大悟。呵呵,下面咱們就來看看更新緩存的updatecache函數到底爲咱們作了些什麼:php
- function updatecache($cachename = '') {
-
- $updatelist = empty($cachename) ? array() : (is_array($cachename) ? $cachename : array($cachename));
-
- if(!$updatelist) {
- @include_once libfile('cache/setting', 'function');
- build_cache_setting();
- $cachedir = DISCUZ_ROOT.'./source/function/cache';
- $cachedirhandle = dir($cachedir);
- while($entry = $cachedirhandle->read()) {
- if(!in_array($entry, array('.', '..')) && preg_match("/^cache\_([\_\w]+)\.php$/", $entry, $entryr) && $entryr[1] != 'setting' && substr($entry, -4) == '.php' && is_file($cachedir.'/'.$entry)) {
- @include_once libfile('cache/'.$entryr[1], 'function');
- call_user_func('build_cache_'.$entryr[1]);
- }
- }
- } else {
- foreach($updatelist as $entry) {
- @include_once libfile('cache/'.$entry, 'function');
- call_user_func('build_cache_'.$entry);
- }
- }
- }
複製代碼
這段代碼中清晰的表達了緩存的更新流程。當咱們執行updatecache
函數的時候,若是你沒有傳給函數你要更新的模塊就會更新全部的模板緩存。即./source/function/cache
下全部的執行更新的函數文件都會被注意調用,並更新到緩存中。若是你只想單獨更新一個模塊的緩存,只須要把相應的參數傳遞給updatecache
(module
)便可。
下面咱們來看看,風格的css究竟是以怎樣的方式來加載的。下面咱們打開風格的緩存生成文件,cache_styles.php下面咱們來看看這個文件到底幹了啥?css
- $stylevars = $styledata = array();
- $defaultstyleid = $_G['setting']['styleid'];
- $query = DB::query("SELECT sv.* FROM ".DB::table('common_stylevar')." sv LEFT JOIN ".DB::table('common_style')." s ON s.styleid = sv.styleid AND (s.available=1 OR s.styleid='$defaultstyleid')");
- while($var = DB::fetch($query)) {
- $stylevars[$var['styleid']][$var['variable']] = $var['substitute'];
- }
複製代碼
這一段代碼根據你當前設定的模板,讀取你當前模板的默認設置的值。並根據模板的id
保存到$stylevars
數組變量中。
- $query = DB::query("SELECT s.*, t.directory AS tpldir FROM ".DB::table('common_style')." s LEFT JOIN ".DB::table('common_template')." t ON s.templateid=t.templateid");
複製代碼
取出每套模板的基本目錄信息。而後下面開始對每套模板的變量數據進行逐一處理。
- $data = array_merge($data, $stylevars[$data['styleid']]);
- $datanew = array();
- $data['imgdir'] = $data['imgdir'] ? $data['imgdir'] : STATICURL.'p_w_picpath/common';
- $data['styleimgdir'] = $data['styleimgdir'] ? $data['styleimgdir'] : $data['imgdir'];
- foreach($data as $k => $v) {
- if(substr($k, -7, 7) == 'bgcolor') {
- $newkey = substr($k, 0, -7).'bgcode';
- $datanew[$newkey] = setcssbackground($data, $k);
- }
- }
- $data = array_merge($data, $datanew);
複製代碼
對模板變量中背景屬性標識bgcolor的變量拼合成css識別的background的css樣式。
html
- if(strstr($data['boardimg'], ',')) {
- $flash = explode(",", $data['boardimg']);
- $flash[0] = trim($flash[0]);
- $flash[0] = preg_match('/^http:\/\//i', $flash[0]) ? $flash[0] : $data['styleimgdir'].'/'.$flash[0];
- $data['boardlogo'] = "<embed src=\"".$flash[0]."\" width=\"".trim($flash[1])."\" height=\"".trim($flash[2])."\" type=\"application/x-shockwave-flash\" wmode=\"transparent\"></embed>";
- } else {
- $data['boardimg'] = preg_match('/^http:\/\//i', $data['boardimg']) ? $data['boardimg'] : $data['styleimgdir'].'/'.$data['boardimg'];
- $data['boardlogo'] = "<img src=\"$data[boardimg]\" alt=\"".$_G['setting']['bbname']."\" border=\"0\" />";
- }
複製代碼
對前臺logo的斷定,分flash和圖片的形式作相應的代碼處理。數組
- if($data['extstyle']) {
- list($data['extstyle'], $data['defaultextstyle']) = explode('|', $data['extstyle']);
- $extstyle = explode("\t", $data['extstyle']);
- $data['extstyle'] = array();
- foreach($extstyle as $dir) {
- if(file_exists($extstylefile = DISCUZ_ROOT.$data['tpldir'].'/style/'.$dir.'/style.css')) {
- if($data['defaultextstyle'] == $dir) {
- $data['defaultextstyle'] = $data['tpldir'].'/style/'.$dir;
- }
- $content = file_get_contents($extstylefile);
- if(preg_match('/\[name\](.+?)\[\/name\]/i', $content, $r1) && preg_match('/\[iconbgcolor](.+?)\[\/iconbgcolor]/i', $content, $r2)) {
- $data['extstyle'][] = array($data['tpldir'].'/style/'.$dir, $r1[1], $r2[1]);
- }
- }
- }
- }
複製代碼
自定義風格信息的組裝。緩存
- foreach($styledata as $data) {
- save_syscache('style_'.$data['styleid'], $data);
- if($defaultstyleid == $data['styleid']) {
- save_syscache('style_default', $data);
- }
- writetocsscache($data);
- }
複製代碼
這裏便開始對每套模板和默認模板分別作緩存。而後經過writetocsscache($data);
此函數將全部模板的css
作文件緩存。
下面來看看writetocsscache
到底作了啥!
$dir =DISCUZ_ROOT.'./template/default/common/';
$dh= opendir($dir);
$data['staticurl']= STATICURL;
首先讀取默認default
套系模板中的css
樣式文件名,
看看在當前模板中是否有同名的css
文件,若是有就加載,若是沒有則,加載默認的default
文件夾下對應的css
文件。而後加載當前模板是否有以extend_
開頭的擴展css
樣式,若是有加載到對應的css
文件中。而後讀取插件(plugin
)模板中用的css
。
我打個比方:若是你當前有default
,和teststyle
兩套風格。若是你teststyle
中有common.css
那麼他就會加載你的這個common.css
,可是很顯然你不可能這麼作,這是沒有必要也是極其錯誤的方法。咱們只會在原來的模板基礎上添加咱們擴展的css,
即你的teststyle
中只要加上extend_common.css
,他就會追加到default/common/
下的common.css
這樣咱們就不會破壞原來整個論壇的風格樣式了。
- $cssdata = preg_replace("/\{([A-Z0-9]+)\}/e", '\$data[strtolower(\'\1\')]', $cssdata);
- $cssdata = preg_replace("/<\?.+?\?>\s*/", '', $cssdata);
- $cssdata = !preg_match('/^http:\/\//i', $data['styleimgdir']) ? preg_replace("/url\(([\"'])?".preg_quote($data['styleimgdir'], '/')."/i", "url(\\1../../$data[styleimgdir]", $cssdata) : $cssdata;
- $cssdata = !preg_match('/^http:\/\//i', $data['imgdir']) ? preg_replace("/url\(([\"'])?".preg_quote($data['imgdir'], '/')."/i", "url(\\1../../$data[imgdir]", $cssdata) : $cssdata;
- $cssdata = !preg_match('/^http:\/\//i', $data['staticurl']) ? preg_replace("/url\(([\"'])?".preg_quote($data['staticurl'], '/')."/i", "url(\\1../../$data[staticurl]", $cssdata) : $cssdata;
- if($entry == 'module.css') {
- $cssdata = preg_replace('/\/\*\*\s*(.+?)\s*\*\*\//', '[\\1]', $cssdata);
- }
- $cssdata = preg_replace(array('/\s*([,;:\{\}])\s*/', '/[\t\n\r]/', '/\/\*.+?\*\//'), array('\\1', '',''), $cssdata);
- if(@$fp = fopen(DISCUZ_ROOT.'./data/cache/style_'.$data['styleid'].'_'.$entry, 'w')) {
- fwrite($fp, $cssdata);
- fclose($fp);
複製代碼
這段代碼經過正則對,模板css,
中的一些形如{IMGDIR}
的一些變量作了解析,替換成標準的css.
另外最後要提到的一點是module.css
這個文件支持模塊化。這裏只是對module
統一的作解析。並無將各個模塊分裝到不一樣的文件中去。
好了這裏就基本上是css
模板緩存的加載和解析機制。有興趣的同窗能夠研究一下這些代碼。