在根目錄的 index.php 文件中,有一個函數(shù)很重要的函數(shù) ViewIndex(); 它的作用是顯示前臺的頁面.該函數(shù)位于c_system_event.php 事件相關(guān)函數(shù)文件中.首頁,搜索頁和feed頁面都是調(diào)用的這個顯示函數(shù).
這個函數(shù)首先設(shè)置全局變量 $zbp 和 $action, $zbp 對于 zblogphp 來說是一個很重要的全局對象,基本上系統(tǒng)的大部分?jǐn)?shù)據(jù)都可以通過這個對象來獲取.
例如:$zbp->option['ZC_BLOG_NAME'] 獲得的是網(wǎng)站博客的名稱
然后 foreach 循環(huán)輸出插件函數(shù),(只輸出位于 Filter_Plugin_ViewIndex_Begin 接口的,看位置應(yīng)該是模板之前的位置,index 和 view 的入口位置是不同的,也就是說 index 位置的插件函數(shù)比view位置的插件函數(shù)先執(zhí)行).
插件注冊的時候是把方法名賦值給插件名的,所以 return $fpname() 會直接執(zhí)行插件的函數(shù)
在插件掛載的時候是把中斷方式賦值給執(zhí)行函數(shù)名的,所以 $fpname => &$fpsignal 獲得插件的中斷方式
不過這里不管是什么中斷方式都會設(shè)置成無.保證頁面能順利執(zhí)行下去.
然后 $zbp->template->hasTemplate('404') 執(zhí)行模板類對象的 hasTemplate 方法,得到當(dāng)前使用模版的404.php內(nèi)容? 路徑:\zb_users\cache\compiled\default\404.php
如果主題有這個404文件,則在該文件掛載過濾接口 函數(shù) Include_ShowError404,這個是怎么掛載的?是在zblogphp.php文件初始化是調(diào)用的 ShowError 函數(shù),里面會有 foreach 輸出插件函數(shù).,這里的作用是判斷如果有錯誤頁則將插件掛載到這里,主要做特色化錯誤頁面的.默認(rèn)錯誤也是騰訊的公益404.
然后 switch 判斷 $action 的值是否為 feed 和 search ,這兩個操作有對應(yīng)的入口文件,默認(rèn)入口 index 是沒有這個參數(shù)的,所以會執(zhí)行 default 部分的代碼塊.
該代碼首先判斷 請求的路徑 和 保存在cookie的路徑是否相同,如果相同則調(diào)用 ViewList 函數(shù) 且所有參數(shù)為 null 以默認(rèn)方式顯示首頁列表頁面
如果不一樣的話則判斷
偽靜態(tài)模式是否為 ACTIVE 或是否 GET rewrite 且 GET 了 id 或者 alias
如果是的話說明請求的是文章內(nèi)容頁,調(diào)用 ViewPost 顯示頁面
如果也不是請求的文章內(nèi)容頁的話,則調(diào)用 ViewList 以 對應(yīng)參數(shù)請求結(jié)果列表,這包括page,cate,auth,date,tags,詳細(xì)實現(xiàn)過程這里略過不寫.
如果還不是的話,最后會調(diào)用 ViewAuto 函數(shù)來根據(jù) 偽靜態(tài)規(guī)則顯示頁面
附加內(nèi)容: ViewList函數(shù)分析
ViewList函數(shù)是顯示列表頁面的函數(shù),默認(rèn) ViewList(null, null, null, null, null) 輸出首頁列表內(nèi)容,偽靜態(tài)參數(shù)默認(rèn)為false
函數(shù)首頁 global 全局對象 $zbp
然后 foreach 輸出 掛在列表開始的插件函數(shù),設(shè)定類型為 index
然后判斷第2-5個參數(shù),根據(jù)對應(yīng)參數(shù)來設(shè)置類型(非null),后者覆蓋前者.
定義4個變量值為 null ,(分離,作者,日期,標(biāo)簽),定義w數(shù)組,看起來是原來匹配文章是否置頂?shù)?
$w = array();
$w[] = array('=', 'log_IsTop', 0);
$w[] = array('=', 'log_Status', 0);
獲取參數(shù)1的內(nèi)容,得到分頁值,設(shè)置文章列表結(jié)果數(shù)組和文章置頂列表結(jié)果數(shù)組
執(zhí)行 switch ,根據(jù) 類型不同執(zhí)行不同的代碼,默認(rèn) index 執(zhí)行第一個 case
首先以偽靜態(tài)正則 'ZC_INDEX_REGEX' => '{%host%}?page={%page%}', 為參數(shù)實例化 Pagebar分頁類
將$zbp 的緩存對象的文章總數(shù)設(shè)置為分頁類 count 的值,文章總數(shù)是通過 CountNormalArticleNums 函數(shù)獲取的
然后獲得首頁(列表)默認(rèn)模板(index),內(nèi)容(頁面)的默認(rèn)是(single)
如果頁面是第一個,則 設(shè)置 $zbp->title 為 網(wǎng)站副標(biāo)題,否則 $zbp->title 為 第xx頁
也就是說,如果不是第一頁的列表是不會顯示網(wǎng)站副標(biāo)題的!
之后 break 來到
$pagebar->PageCount = $zbp->displaycount;
$pagebar->PageNow = $page;
$pagebar->PageBarCount = $zbp->pagebarcount;
$pagebar->UrlRule->Rules['{%page%}'] = $page;
依次設(shè)置每頁顯示數(shù)量,當(dāng)前頁,一共有多少頁,URL規(guī)則類 Rules {%page%} 的值設(shè)置為 當(dāng)前頁數(shù)
輸出 Filter_Plugin_ViewList_Core 的插件函數(shù),看參數(shù)應(yīng)該是在輸出內(nèi)容前執(zhí)行的,官方WIKI也沒有寫出這個接口的說明
接下來判斷如果頂部列表關(guān)閉(ZC_LISTONTOP_TURNOFF)是否等于false,也就是如果打開了置頂功能的話則獲取全部置頂文章,還說了優(yōu)先從緩存的數(shù)組里獲取.(不過我還沒看到對應(yīng)的實現(xiàn)代碼,反正 $zbp->GetTopArticle() 之后就獲取到了置頂?shù)臄?shù)據(jù)了),然后依次 foreach 得到全局置頂?shù)?首頁置頂?shù)暮头诸愔庙數(shù)奈恼骂愋偷臄?shù)組待用
循環(huán)輸出 Filter_Plugin_LargeData_Aritcle 的插件函數(shù),看情況是在查詢數(shù)據(jù)庫之前(獲取數(shù)據(jù)之前)的插件接口,官方WIKI依然沒有這個接口的說明.
然后就是執(zhí)行 $zbp->GetArticleList 函數(shù)查詢獲得文章列表了.
獲取主題標(biāo)簽中的網(wǎng)站標(biāo)題,中的文章
如果總頁數(shù)等于0,則將分頁類對象刪除?(不知道,反正他是把對象 pagebar 設(shè)置為了 null)
一長串的 SetTags 設(shè)置主題標(biāo)簽和對應(yīng)的值,有什么用?不知道,反正在這個函數(shù)內(nèi)沒看到他用這個!
之后使用 hasTemplate 判斷對應(yīng)的主題文件是否存在,如果存在則 SetTemplate設(shè)置主題類中的 entryPage 的值為對應(yīng)的主題文件的名稱,如果不存在則設(shè)置為 index (如果 index 也不存在呢?哈哈)
這里有循環(huán)輸出 Filter_Plugin_ViewList_Template 位置接口的插件函數(shù),官方WIKI終于有說明了,是 處理列表頁模板接口 ,然后呢?我還是沒有理解能在這里做什么啊,不過可以知道的是這個位置肯定在顯示模板文件之前的,因為后面 $zbp->template->Display(); 就是顯示模板頁面的函數(shù).