10分鐘學會OpenCart主題修改vQmod

10分鐘學會OpenCart主題修改vQmod

成名每在窮苦日,敗事多於得意時


第1步 創建空白的OpenCart主題

1.在catalog/view/theme/下創建一個mytheme文件夾,目錄架構該是這個樣子的:

1
2
3
catalog/view/theme/
|-> default
|-> mytheme

2.來到OpenCart後台:

Admin -> System -> Setting – > Edit Store ->Tab Store -> template ->mytheme

修改主題為自定義主題mytheme(將default替換為mytheme)


第2步 創建基礎的OpenCart主題

1.創建一些文件夾,並複製默認主題的一些文件,不是複製全部哦:

1
2
3
4
5
6
7
8
catalog/view/theme/
|-> default
|-> mytheme
|-> image – 複製全部圖片
|-> stylesheet – 複製全部樣式表文件
|-> template
|-> common
|-> header.tpl - 複製這個模板文件

樣式表需要圖片,所以複製全部圖片過來;
樣式表文件是header.tpl需要的;
slideshow.csscarousel.css是OpenCart模塊需要的;
要改變外觀(如顏色配置)可以修改mytheme/stylesheet/stylesheet.css


第3步 修改OpenCart主題:理解Controller

模板如何成為主題

修改的tpl文件都在新建的mytheme的子文件夾下,不要修改默認主題的文件。繼續複製默認主題下的文件到mytheme文件夾及其子文件夾,需要複製的基本文件如下

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
catalog/view/theme/
|-> default
|-> mytheme
|-> image
|-> stylesheet
|-> template
|-> common
|-> header.tpl
|-> footer.tpl
|-> information
|-> information.tpl
|-> product
|-> product.tpl
|-> category.tpl
|-> manufacturer_list.tpl

如果你的mytheme下沒有如上對應的文件夾,請自行創建。

理解OpenCart使用的MVC模型

  • 對於鏈接route=product/category,OpenCart會調用controller/product/category.php文件;

  • 這個Controller(這個例子中是category.php)將決定載入哪一個/種MVC-L:模型、視圖(也就是tpl後綴的模板)、語言。具體來說會載入:

1
2
3
4
5
3個模型 (category, product, image): $this->load->model();

2個視圖 (category.tpl & not_found.tpl): $this->template = ;

1種語言 $this->language->load()
  • 這個Controller會決定如何將數據推送到模板以及如何處理用戶的輸入數據。
1
2
3
4
5
例如:數據庫數據的推送
`$this->$this->data[『text_price'] = $this->language->get(『text_price');`

將會生成可供模板調用的價格字段:
`<?php echo $text_price; ?>`

Controller是沒有回調函數的,如果手工修改了Controller文件,在升級你的OpenCart的時候,會被官方文件替換掉,為了能手工修改控制器,可以使用vQmod做一個虛擬修改,後面將進行介紹。


第4步 修改OpenCart主題:理解Model

1
2
3
$this->load->model(『catalog/product'); - 載入模型
$this->model_catalog_product->getTotalProducts(); - 獲取數據
$this->model_catalog_product->editProduct() - 處理數據
  1. Model在MVC中的作用是處理與數據庫有關的數據推送和讀取,在Controller推拉數據之前,需要載入特定的Model。

  2. 載入模型:告訴OpenCart在前台或者管理員界面載入model/catalog/product.phpgetTotalProducts(),editProduct()model/catalog/product.php的內置函數。

  3. 打開model/catalog/product.php,找到public function getProduct,找到return array

getProduct()列出了產品的所有信息,而顯示哪些是由Controller決定的!
打開controller/product/category.php,找到$this->data[『products'][] = array就可以知道這個Controller調用了哪些數據了!


第5步 修改OpenCart主題:理解vQmod

「vQmod™」(虛擬快速修改),這是一個免費開源的程序組件,可以理解為一個模塊,作用是在不修改程序核心文件的前提下,對程序進行虛擬的修改。
它的原理很簡單:創建xml搜索/替換腳本文件,而不是去直接修改核心文件。在頁面加載解析為每個源核心文件使用php函數includerequire_once來載入腳本文件。
當源核心文件需要修改時,會生成一個臨時文件。該臨時文件在執行過程中取代了原來的核心文件,原來的核心文件是永遠不會改變的。

vQmod可以對OpenCart的無回調的ControllerModel進行虛擬的修改。
請先下載vQmod!將下載到的壓縮包解壓,然後將vqmod文件夾複製到Opencart的根目錄,示例如下:

1
2
3
4
5
6
7
OpenCart的根目錄
|-> admin
|-> catalog
|-> download
|-> image
|-> system
|-> vqmod

自動安裝vQmod

在你的瀏覽器打開http://我的域名/vqmod/install
會看到安裝成功的信息:vQmod has been installed on your system!


手動安裝vQmod

1.在上傳vqmod文件夾到前文所述位置後,打開OpenCart網站根目錄下的index.php,將其中的

1
2
3
4
5
6
7
8
9
10
11
// Startup
require_once(DIR_SYSTEM . 『startup.php');

// Application Classes
require_once(DIR_SYSTEM . 『library/customer.php');
require_once(DIR_SYSTEM . 『library/currency.php');
require_once(DIR_SYSTEM . 『library/tax.php');
require_once(DIR_SYSTEM . 『library/weight.php');
require_once(DIR_SYSTEM . 『library/length.php');
require_once(DIR_SYSTEM . 『library/cart.php');
require_once(DIR_SYSTEM . 『library/affiliate.php');

替換為:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
// vQmod
require_once(『./vqmod/vqmod.php');
VQMod::bootup();

// VQMODDED Startup
require_once(VQMod::modCheck(DIR_SYSTEM . 『startup.php'));

// Application Classes
require_once(VQMod::modCheck(DIR_SYSTEM . 『library/customer.php'));
require_once(VQMod::modCheck(DIR_SYSTEM . 『library/currency.php'));
require_once(VQMod::modCheck(DIR_SYSTEM . 『library/tax.php'));
require_once(VQMod::modCheck(DIR_SYSTEM . 『library/weight.php'));
require_once(VQMod::modCheck(DIR_SYSTEM . 『library/length.php'));
require_once(VQMod::modCheck(DIR_SYSTEM . 『library/cart.php'));
require_once(VQMod::modCheck(DIR_SYSTEM . 『library/affiliate.php'));

2.打開網站根目錄下的admin/index.php,將其中的:

1
2
3
4
5
6
7
8
// Startup
require_once(DIR_SYSTEM . 『startup.php');

// Application Classes
require_once(DIR_SYSTEM . 『library/currency.php');
require_once(DIR_SYSTEM . 『library/user.php'));
require_once(DIR_SYSTEM . 『library/weight.php');
require_once(DIR_SYSTEM . 『library/length.php');

替換為:

1
2
3
4
5
6
7
8
9
10
11
12
// vQmod
require_once(『../vqmod/vqmod.php');
VQMod::bootup();

// VQMODDED Startup
require_once(VQMod::modCheck(DIR_SYSTEM . 『startup.php'));

// Application Classes
require_once(VQMod::modCheck(DIR_SYSTEM . 『library/currency.php'));
require_once(VQMod::modCheck(DIR_SYSTEM . 『library/user.php'));
require_once(VQMod::modCheck(DIR_SYSTEM . 『library/weight.php'));
require_once(VQMod::modCheck(DIR_SYSTEM . 『library/length.php'));

3.打開網站根目錄下的vqmod/vqcache,如果這個目錄已經有了幾個vq開頭的php文件,那就說明vqmod已經在工作了!

4.前面已經說過了vqmod腳本文件是xml格式的,位於OpenCart網站根目錄下的vqmod\xml文件夾,被vqmod修改後的文件緩存在vqmod\vqcache文件夾。
一個vqmod腳本可以有多個修改規則,也可以修改程序核心的多個文件。


vqmod腳本的示例

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
<?xml version=「1.0」 encoding=「UTF-8?>
<modification>
<id>vQmod File ID</id>
<version>1.0.0</version> —> vQmod 腳本的版本聲明
<vqmver required=「true」>1.0.8</vqmver> —> 最低的vQmod 版本要求
<author>Suoling.net</author>—> vQmod 腳本的作者

<file name=「catalog/controller/product/category.php 「> —> 聲明要修改的文件

<operation>
<search position=「replace」><![CDATA[
搜索OpenCart核心程序中要修改的文件中的原代碼
]]></search>
<add><![CDATA[
替換代碼
]]></add>
</operation>

<operation>
<search position=「after」><![CDATA[
搜索OpenCart核心程序中要添加代碼的文件中的原代碼
]]></search>
<add><![CDATA[
附加在:搜索OpenCart核心程序中要添加代碼的文件中的原代碼之後的代碼(添加在原代碼之後)
]]></add>
</operation>

<operation>
<search position=「before」><![CDATA[
搜索OpenCart核心程序中要添加代碼的文件中的原代碼
]]></search>
<add><![CDATA[
附加在:搜索OpenCart核心程序中要添加代碼的文件中的原代碼之後的代碼(添加在原代碼之前)
]]></add>
</operation>

</file>
</modification>