ecshop源碼分析-ecshop二次開發

ecshop源碼分析-ecshop二次開發

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下存放這驗證碼的背景圖片。

Theme文件夾:

頁面的顯示是有theme這個文件夾全權負責的。而這些準備的數據是怎麼在theme下的.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前臺顯示的主要文件,如果你能很好理解theme下模板文件和樣式表文件,對於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需要調用哪些庫文件,那麼就對應上面這個寫就是了,相信大家都有這個水平。好的,到目前爲止一個模板文件添加成功了,那麼它在瀏覽器中的顯示就要通過後臺的設置模板來確定了。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章