給100分
最近研究discuz,看到官方包中很多htm模板中沒有調用資料庫的語句,幾乎清一色的全是loop迴圈,這我就有點不明白了, 在調用前沒有sql語句出現,迴圈什麼呢?
但是事實正好相反,它是能調出來的,所以不明白它的調用機制是怎麼回事!
為了更好的說明舉一個例子吧!
比如下面這個loop迴圈:
¥ $trade[price]{lang additional} $trade[credit] {$_G[setting][extcredits][$_G['setting']['creditstransextra'][5]][unit]}{$_G[setting][extcredits][$_G['setting']['creditstransextra'][5]][title]}$trade[subject]
loop文法是這樣的:If(is_array($abc)) {
Foreach($abc AS $key => $val) {
}
}
所以上面那段代碼中$trades[$tid]肯定是一個數組了,即然是數組,他就是一個資料表的集合,,那麼這個表php檔案是如何調取的呢,還有就是這個 htm模板怎麼知道它用的是哪個php裡面調取的資料表 呢?
當然有人會說了:discuz的預設包,官方自己寫的判斷,也許是這樣的,可是別忘了,程式要擴充的,如果使用者自己寫一個表加進去,那怎麼辦呢?當然了,在htm中寫一個sql也是可以的,但是即然官方不這麼寫,我想它肯定有一個規律在裡面,只是官方沒有說明罷了!那麼這個機制是啥呢?
希望回答時關鍵地方要說明,不要清描淡寫!
回複討論(解決方案)
資料庫是在model中串連讀取的,$trades[$tid]已經是一個數組了,當然能直接loop迴圈。
例如forum.php 就是擷取資料的, forum.html就是view。
php裡面是沒有loop迴圈,loop是discuz的代碼,模版是預先編輯好的,你可以在discuz根目錄/data/template下看見很多編譯好的檔案,裡面就變成了foreach
htm模板怎麼知道它用的是哪個php裡面調取的資料表呢?
這個你可以根據連結來找
如:forum.php?mod=viewthread&tid=1
forum.php就是根目錄下的入口檔案(還有home.php)
mod=viewthread,最後一句引入了另外一個檔案(根據mod可知引入的檔案是/source/module/forum/forum_viewthread.php)
forum_viewthread.php這個檔案就是邏輯處理的php頁面,查詢資料庫,組織變數...都是在這個檔案中完成的
組織好資料後用include template引入htm檔案,在裡面執行loop迴圈之類的
你可以根據上面的方法來追蹤discuz的代碼執行順序
你也知道你在看的是html模板而不是php指令碼
百度搜搜DZ的簡單手冊吧,瞭解一下大概部署