ecshop 二次開發,原始碼分析

lampsunny發表於2012-03-21
Ecshop包括的資料夾有admin、api、cert、data、images、includes、js、languages、plugins、temp、theme、wap、widget這些資料夾,和根目錄下的所有.php檔案。這些檔案和資料夾組成了整個ecshop。如果從軟體工程角度分析ecshop的話,ecshop的二級可以看成admin和前臺兩個部分。admin主要是面向服務端的,而前臺是面向客戶端的,這是這兩個部分的最明顯的差別。下面給出ecshop的二級流程圖:



此二級流程圖給出了admin模組、前臺顯示模組和資料庫模組之間的一個關係。從上面的圖示可以看出,admin模組要對資料庫進行讀和寫,這裡的讀和寫組成了整個的後臺的管理,包括商品的增加和刪減、留言的管理、訂單的處理等等。前臺模組也要對資料庫進行讀和寫,它的讀寫主要是完成交易的過程,寫的內容基本都是和商品數量、點選數量這些在商品交易中一定要改變的數字。在admin模組也可以對前臺顯示部分進行寫,這個寫的過程主要是完成前臺顯示方式的改變,比如admin模組可以選擇模板;同樣也可以改變每個小模組在某個頁面中是否顯示,以及顯示的位置(如果顯示)。


Images資料夾:

這個資料夾下有子資料夾,在這些子資料夾下面存放著當前網站商品的原始圖片和縮圖。這些子資料夾命名有規律的,它們的檔名是它們目錄下商品加入的年月份。也就是說在同一個月份加入的商品,它們的圖片是在同一個資料夾下的,且這個資料夾的名字就是當前的年月份。後臺每新增一個帶圖片的商品,這邊都會在某個資料夾下出現提交圖片的副本。

Data資料夾:

這個資料夾是包括一些固定的資料,比如固定的配置、圖片等等。在data這個資料夾下的config.php記錄了資料庫的一些固定的資訊,afficheimg資料夾下存放這首頁最中間的flash的圖片源。實現將afficheimg資料夾下的圖片載入到首頁的flash中是通過資料夾flashdata下面資料夾dynfocus中的javascript來實現的。資料夾brandlogo下存放這有品牌商品的公司的logo,另外資料夾captcha下存放這驗證碼的背景圖片。

Themes資料夾:

頁面的顯示是由themes這個資料夾全權負責的。而這些準備的資料是怎麼在themes下的.dwt中顯示的呢?資料是通過smarty載入進去的。在根目錄下每個.php檔案中都會有類似$smarty->assign(’page_title’, $position['title']);這樣的句子,這樣page_title在對應的dwt檔案中就可以作為一個變數使用了。這樣就將php檔案和dwt檔案很好的結合了。

下面稍微說一下dwt這個檔案。這個檔案中大部分的資訊是自動生成的。在dwt檔案中都會看到這樣的塊,這個快就是用來確定每個模組顯示的位置的,如果在後臺將某個模組選擇顯示在“左邊區域”,那麼這個模組的程式碼會在上面的這個區域生成。當然在dwt檔案中我們也會到處看到這裡面的程式碼全都是自動生成的,要改也只能該.lbi檔案。還有就是在出現之前,這兩個標誌之間不能直接編輯程式碼,要加入自己的程式碼必須要在和下一個BeginLibraryItem之前插入。

程式:

程式主要是包括(這裡說的是關於前臺的)根目錄下的所有的php指令碼、includes,js資料夾,這些所有的指令碼完成了前臺顯示的資料準備。所以它們在整個ecshop的結構中佔著相當重要的地位,對ecshop的修改也主要集中在這些指令碼中,這些指令碼的具體分析會在後期中一一給出。
在上一篇中給大家帶來了ecshop的總體的框架。從總體上看ecshop,相信大家的思路應該很清楚。作為一個對開源專案修改者你來說,能對ecshop有個初步的瞭解就行了,下面我會給大家帶來我在修改ecshop的過程中的一些體會。

記得在上一篇中我們聊到了Adobe的模板。下面我們來根據ecshop跟大家討論一下模板。說到模板,這就是ecshop前臺顯示的主要檔案,如果你能很好理解themes下的模板檔案和樣式表檔案,對於ecshop前臺顯示應該沒有任何問題了。Ecshop中頁面到底是怎麼顯示的呢?這個問題我們先放在一邊,我們先研究一下ecshop是怎麼將一系列資料從資料庫中讀取出來,然後傳到顯示頁面中的。要解決這個問題我們要用根目錄下的index.php和theme/default下的index.dwt來作為用例。之所以用對應的兩個資料夾,是因為在index.dwt中要顯示的資料是通過smarty從index.php中載入進來的。在index.php中有如下程式碼:

$position = assign_ur_here();$smarty->assign('page_title', $position['title']); // 頁面標題$smarty->assign('ur_here', $position['ur_here']); // 當前位置 

首先它是呼叫函式assign_ur_here,這樣得到了變數$position,在變數$position中有title和ur_here這兩個變數。在index.dwt中會有如下程式碼:



<title>{$page_title}<title>


是的,一旦$smarty->assign(’page_title’, $position['title'])執行完,$page_title就會在index.dwt中成為一個可以使用的變數。那麼到目前為止我們知道如何從php指令碼中往dwt檔案中傳我們需要的變數了。smarty就是通過這種機制將需要顯示的內容傳到對應的dwt檔案中,這樣就實現了頁面與內容的分離。Php指令碼中的資料我們已經有辦法在dwt檔案中得到了,下面就是要解決如何顯示這些資料。凡是通過smarty載入到dwt檔案中的變數,在顯示的時候都是加上{}來顯示的。如果載入過來的是陣列那麼就要通過smarty的迴圈來顯示,如果我傳進來一個陣列是 $school並且陣列的每個條目中有name,那麼下面的程式碼就是實現在頁面中顯示陣列的每個條目的name。

Foreach($school as $k){echo $k[‘name’] . ‘ ’;}

這樣就會在頁面中將陣列的內容全部列印出來了。

下面我們來舉個例子來說明一下dwt到底是怎麼顯示的。

在index.php中的某個地方寫上 smarty->assign(‘test’, ‘This is just a test!’);

然後在index.dwt中某個地方寫上{$test},然後在首頁中就會有“This is a test!”。當然它顯示的地方跟你把{$test}放在哪裡有關係。當然這個位置是有規定的,dwt中不是任何的地方都可以編輯的,有些地方是不能動的,這些我們會在後面一一給出講解。這個時候如果在你的首頁中沒有出現“This is a test!”這個內容,那麼你也不要擔心,因為ecshop中預設的cache是開著的,不能顯示肯定是cache的問題,這個我們在後面也會給出講解。今天就到這裡,今天我們討論瞭如何往dwt中傳引數和引數的顯示。下一次會給出上面遺留問題的講解,Thanks。
大家好,今天我們來解決上次遺留下的問題。上次我們談到了如何從php指令碼中往dwt模板中傳引數,同時我們留下了兩個問題,第一是dwt中有的地方是不可以編輯的;第二是往dwt中傳引數並且讓它顯示,它不一定顯示出來。

首先我們來討論一下第一個問題——為什麼有的地方不可以編輯。我們通過討論index.dwt來分析一下這個問題的原因。在index.dwt中我們會看到好多形如



這樣的語句。如果對ecshop的後臺的管理有點了解的朋友們對“左邊區域”這幾個字應該很熟悉吧!不錯,在後臺的模板管理->設定模板中你會看到如下的圖片


從表面上看,大家都應該知道,比如“商品分類樹”是在整個頁面的中間區域顯示。那麼為什麼在後臺這邊重新選擇一下並且確定,在頁面顯示就會按照你的選擇來顯示呢了?它的實質是這樣的,上面每個模組是對應一個庫檔案(就是theme下library下的lbi檔案),當你把上面的這些按照你的佈局設定好後點選確定,程式就會按照你的佈局的選擇將每個lbi檔案的內容寫入到index.dwt中,那麼lbi檔案中的內容往哪裡寫呢,這個時候上面的




這句話就起到作用了,比如上面“銷售排行”是選擇的右邊區域,那麼當你確定以後,程式會對index.dwt重寫一邊,其中“銷售排行”對應的lbi(就是top10.lbi)中的內容會被完全的讀取並且寫到index.dwt中和之間。那麼這個時候大家可能有一個疑問,如果有很多的內容要往右邊區域寫,那哪個先寫呢?上面的圖中有個“序號”,這個就是決定寫的順序的。下面是寫之後index.dwt檔案中和之間的一段程式碼:

<div class="box"> <div class="box_2"> <div class="top10Tit">div> <div class="top10List"> <ul>  <li><img src="../images/top_{$smarty.foreach.top_goods.iteration}.gif"> <a title="{$goods.name|escape:html}" href="{$goods.url}">{$goods.short_name}a>  li>ul> div> div>div><div class="blank5">div>  

好的,到了這裡相信大家應該清楚很多了,那麼到底是為什麼index.dwt中有些的地方是不可以編輯的。大家想一想上面這段程式碼是從哪邊而來的,對的,是從top10.lbi中讀取出來的,然後寫到這裡的,如果你編輯這裡,然後下次再重新佈局後,這邊的內容不是要被重寫掉了嘛!所以在index.dwt中類似和之間的內容是動態生成的,是不可編輯的,如果真的想編輯這邊的內容,就就編輯對應的lbi檔案。

相信大家已經清楚,為什麼dwt檔案中部分地方是不可編輯的。那麼今天就和大家談到這裡,下次我們來研究一下cache的問題。我感覺這個很是頭疼(如果你自己新增了session)。
上次我們主要討論了關於模板的問題,最後我們留下了一個問題——cache的問題。我覺得這個問題到目前位置先不要討論好,再往後一點我們再來分析這個問題。到現在我們知道了模板的一些操作了,但是我們還是很鬱悶,因為我們只是在ecshop的前臺框架的控制之下。那麼我們如何能夠脫離出來呢?如果我們能做到自己新增屬於自己或者可以放自己想要放的東西的模板,那麼應該算是到了一個更高的臺階來看ecshop了。

要做到新增一個模板就必須做到前臺可以顯示這個模板,後臺可以編輯這個模板。下面我們一步一步教大家怎麼新增一個屬於自己的模板。在新增之前我們先稍微分析一下,對於一個模板,在前臺一定有一個php檔案和它對應(很顯然這個php檔案就是實現給這個模板檔案傳送資料的)。並且在後臺可以編輯這個模板對應的模組,也就是在模板管理——設定模板中有你加的模板的選項。下面我們來新增一個home模板。首先在根目錄下新建home.dwt和home.php。然後將index.dwt和index.php中的內容分別拷貝到home.dwt和home.php中。對於這個模板的內容完全由你自己決定,你的內容就會決定你要怎麼修改home.dwt和home.php。當然這個模板的內容是受限制的,首先要home這個模板的候選的庫檔案是存在的。這個是什麼意思呢?這句話的意思就是對於每個模板檔案,可以呼叫的庫檔案是固定的,並且這些可以呼叫的庫檔案在檔案admin/includes/lib_templete.php中定義的。首先要在後臺將home這個模板放入到可設定內容的模板中,部分程式碼如下:


/* 可以設定內容的模板 */$template_files = array('home.dwt','index.dwt','zhiku.dwt','article.dwt','article_cat.dwt','brand.dwt','category.dwt','user_clips.dwt','compare.dwt','gallery.dwt',

在上面的程式碼中就將home.dwt加入到後臺的可編輯模板中,這個時候你就可以在後臺的模板管理->設定模板中編輯home模板了。但是到這裡我們發現一個很小的問題,那就是這個home模板在後臺是顯示成什麼名字。其實這個很簡單,只要在檔案language/zh_cn/admin/template.php中新增$_LANG['template_files']['home'] = ‘home模板’;這樣的語句,那麼在後臺看到的home模板的名稱就是“home模板”,當然這裡也可以設定成其他的名稱。在上面我們有說到每個模板可以呼叫的庫檔案是固定的,既然說是固定的,那應該是哪些呢?就拿index來說吧,在檔案admin/includes/lib_templete.php中有下面這樣的程式碼:

'index' => array('/library/ur_here.lbi' => 0,'/library/search_form.lbi' => 0,'/library/member.lbi' => 0,'/library/new_articles.lbi' => 0,'/library/success_article.lbi' => 0,'/library/dynamic_article.lbi' => 0,'/library/school_article.lbi' => 0,'/library/category_tree.lbi' => 0,'/library/top10.lbi' => 0,'/library/invoice_query.lbi' => 0,'/library/recommend_best.lbi' => 3,'/library/recommend_new.lbi' => 3,'/library/recommend_hot.lbi' => 3,'/library/recommend_promotion.lbi' => 4,'/library/group_buy.lbi' => 3,'/library/auction.lbi' => 3,'/library/brands.lbi' => 0,'/library/promotion_info.lbi' => 0,'/library/cart.lbi' => 0,'/library/order_query.lbi' => 0,'/library/email_list.lbi' => 0,'/library/vote_list.lbi' => 0),

那麼這邊列舉到的庫檔案,對於index.dwt都可以呼叫的。依葫蘆畫瓢,home.dwt需要呼叫哪些庫檔案,那麼就對應上面這個寫就是了,相信大家都有這個水平。好的,到目前為止一個模板檔案新增成功了,那麼它在瀏覽器中的顯示就要通過後臺的設定模板來確定了。好的,新增一個自己的模板我就說到這裡,我們下期繼續討論ecshop。Thanks!!!

相關文章