今天算是仔細學習ecshop 的第一天,實話說,若是不是任務緊,確定不用這個東西。2013年以後都再也不維護了。使用起來萬一出什麼BUG 就很差了。並且不是純粹的MVC ,看代碼也是怪怪的呢。可是都已經選擇了,用一用吧。
1. ecshop的 MVC
雖然ecshop 不是純粹的MVC ,可是人家仍是使用 smarty 模板技術的。模板技術的出現就是爲了更好的分離後臺php代碼和前臺html 代碼。在 ecshop 裏面,cls_template.php 是核心文件,是一個精簡的 smarty 模板引擎。對應的咱們能夠看到根目錄下面有許多.php 文件:
根據名字就能夠很清晰的知道這個 php 文件的做用,實際上就至關於咱們其餘框架裏面的controller 部分了。咱們隨便打開幾個文件看看怎麼使用的:
index.php :
user.php:
能夠看到,在 user.php 裏面沒有一個方法,通篇就是各類 if 判斷,而後 各類 assign 和各類 display 給前臺傳遞數據。一樣的前面的 index.php 裏面也是同樣的:
通篇一共就這麼幾個函數,而後就是大段的代碼,給前臺傳遞數據(中間可能用些邏輯須要重複使用,就封到幾個小函數裏面了)。咱不能說這種結構很差,畢竟這是近十年前的項目了嘛。總之這裏 controller 向 view 層傳遞數據的邏輯就是這個樣子,沒有什麼特別的。至於 controller 層怎麼跟數據庫打交道呢? 咱們就不詳細談了,ecshop 沒有使用ORM 技術,代碼裏面各類大段大段的 sql 語句。讓我想到萬一未來某一天須要在表裏添加什麼字段是否是要大段大段的找sql 語句改呢?算了,先搞定手頭,先無論那麼多了。
2. view 層的組織方式
其實對於這種相對成熟的開源項目,改controller 的機會不多的,也就是改哪些.php 的機會不多,大多數時候,所謂的二次開發都是針對前臺頁面,改改樣式罷了。那麼這裏就須要咱們去探究一下究竟ec 的前臺是怎麼組織的。
首先介紹一下,ec 裏面,跟前臺view相關的有兩種文件,一種是.dwt 文件,一種是.lib 文件:
搞明白前臺結構的第一點,就是搞清楚這兩種文件的聯繫。
玩過discuz的同窗都知道 discuz 有個 diy 功能,
diy 至關於一個獨立的塊。咱們能夠本身寫.htm 文件,而後在 .htm 裏面加入 diy 區塊,而後本身經過點點點傻瓜式操做把後臺數據讀取出來:
像上面這樣,這裏我要說的是,其實ec 也有這樣的功能,自定義的 diy 區塊就至關於 .lib 文件,這個區塊能夠被其餘地方使用,舉個例子,好比你有好幾個頁面須要用到歷史瀏覽。你總不能在每一個頁面都寫一樣的邏輯吧? 那麼咱們就能夠把歷史瀏覽定義成一個.lib 文件,並且數據也已經準備好了。當咱們在寫不一樣頁面的時候,咱們直接使用:
如上,在
BeginLibraryItem 和
EndLibraryItem
之間的就是一個區塊
<!-- TemplateBeginEditable name="首頁公告下廣告" --><!-- #BeginLibraryItem "/library/ad_position.lbi" --> .lib文件 裏面的東東<!-- #EndLibraryItem -->
也就是說 .dwt 文件 是搭架子,具體某個地方須要用一些小部件的話,能夠直接調用 .lib 文件。其實,.dwt 和 .lib 文件裏面的內容很像,畢竟都是前臺哪些東西嘛:
如上,其實你也分不清那種文件是.dwt ,那種是.lib 。都同樣的。按照功能不一樣分這麼兩種東西,而後.dwt 能夠調用.lib 區塊內容。
下面該說一個重點,重點,重點。重要話說三遍,你要記住.dwt 文件並非全部地方都是能夠編輯的。通常一個地方若是引用了.lib 文件,你再進行編輯是不起做用的。示例以下:
<div class="mod1con shop_notice"> <!-- TemplateBeginEditable name="商店公告" --> <!-- #BeginLibraryItem "/library/cat_articles.lbi" --> <h1 class="mod2tit" style="height:0"><a href="{$articles_cat.url}" class="more" style="margin-top:3px;">更多</a></h1> <div class="mod2con clearfix"> <ul> {foreach from=$new_articles item=article_item} <li style="width:250px; margin-right:20px; display:inline; height:25px; line-height:25px;" class="fl"><a href="{$article_item.url}" title="{$article_item.title|escape:html}" class="txtdot">{$article_item.short_title}</a></li> {/foreach} <ul> </div> <script type="text/javascript">divheight("catArticles");</script> <!-- #EndLibraryItem --> <!-- TemplateEndEditable --> </div>
看上面代碼,在.lib 控制範圍內,又寫了一些代碼,很明顯是執行不了的(我爲這個問題糾結了半個小時呢)。這是看別人模板的寫法,也執行不出來,結果是各類糾結啊。算了,不說了。總之 view 層就是這個狀況。看着辦就行。
總結:後臺查數據庫,寫sql 語句;後臺往前臺傳數據使用smarty 模板; 前臺使用這些數據直接{$value} 就好了,會點框架嘗試的應該都明白。 就這麼點知識,繼續改代碼了,寫日記又廢了半個多小時了。。。