iT邦幫忙

2018 iT 邦幫忙鐵人賽
DAY 3
1
Software Development

一天介紹1個,開源購物車系統OPENCART的擴充插件系列 第 4

第3天-OCMOD寫法和教學

OCMOD 是 opencart 系統的程式碼修改系統,遵循GPL3協議免費使用。

如果 OCMOD 外掛開發正確,那麼使用者就可以在不更改系統核心程式碼的情況下增刪相關程式功能,這也代表如果移除了某 OCMOD 外掛,則 opencart 的原始程式是不需要恢復或修復的。

OCMOD 是基於 Qphoria 的 VQMOD 系統。
OCMOD 是簡化版的 VQMOD. 主要區別:
保留了 Replace, Before, After, Regex, Offset, Limit, ignoreif, error
去掉了 Attributes top, bottom, ibefore, iafter

OCMOD 檔案可以透過 opencart 網站管理後台的[擴充功能]上傳:
若要上傳 OCMOD 檔案,則該檔案的附檔名必須為 .ocmod.zip 或者 .ocmod.xml。
這是為了避免非 ocmod 的檔案上傳到網站後台。

https://github.com/opencart/opencart/wiki/Modification-System 官方說明

我們可以發現 官方說明寫得非常爛

然後谷歌完全查不到相關文章

以下我寫的就是谷歌大神查不到的東西

#OCMOD 的xml檔上傳之後 資料是存到資料庫 modification

運作的流程,是你不按下更新的話,它是不會產生任何檔案,也就是沒有任何效果的,第1次使用OPENCART的人都會以為檔案上傳就有用了,其實上傳之後你不按下更新的話,他是沒有任何效果的。

然後無論VQMOD或OCMOD都是會產生實體暫存檔案的(只要你按下更新,就會產生暫存檔案)

VQMOD 看 修改後的檔案 源碼 /vqmod/vqcache 目錄下有暫存檔
OCMOD 看 修改後的檔案 源碼 /system/storage/modification 目錄下有暫存檔

(因為谷歌大神完全查不到相關文章,可是事後我查到了,自己一行一行看原碼發現的。)

注意系統讀取檔案順序:
有暫存檔在的時候,就不會讀取原檔。
那,暫存檔怎樣刪?你點清除就刪了。

主要語法非常簡單 就3句而已

<file path="catalog/controller/common/home.php"> 目標檔案
<add position="replace">
after : 在尋找到的字符串後面增加;     注意部要寫錯成Ater
before:在尋找到的字符串前面增加;
replace:替換尋找到的字符串
<add position="replace"><![CDATA[
test123
]]></add>

#以下為寫法範例

<?xml version="1.0" encoding="utf-8"?>
<modification>
  <name>test 01</name>
  <code>test 01</code>
  <version>1.0</version>
  <author><![CDATA[作者suffixbig suffixbig@gmail.com]]></author>
  <link>http://www.opencart.com</link>
  <file path="catalog/controller/common/home.php">
    <operation>
      <search>
        <![CDATA[
        $data['column_left'] = $this->load->controller('common/column_left');
        ]]>
      </search>
      <add position="replace">
        <![CDATA[
        echo 'test123';
        ]]>
      </add>
    </operation>
  </file>
</modification>

後台檔案也能是修改目標

    <file path="admin/controller/sale/return.php">
        <operation>
            <search><![CDATA[
                protected function getList() {
                ]]>
            </search>
            <add position="before" offset="6">
                <![CDATA[
                if(isset($this->request->get['next']) && $this->request->get['next'] == 'guest/guestreturn') {
                    $next = $this->request->get['next'];
                    $this->response->redirect($this->url->link($next, 'token=' . $this->session->data['token'], true));
                }
                ]]>
            </add>
        </operation>
    </file>

找到字之後的下幾行 offset=偏移量 偏移量的原則就是自己那行是第0行

top 和 bottom 不能用因為被去掉了

position=」top「 (位置為頂部)和偏移為3行。找到【$var = 『123』;】的位置從頂部向下偏移3行的頂部
position=」bottom「 (位置為底部)和偏移為3行。找到【$var = 『123』;】的位置從底部上方3行文件的底部

找到3個相同怎辦

可選index屬性為搜尋標籤的例項將要指定動作標示
若搜尋字串為”echo”,在文件中有5個echo值,而只想取代第1和第3的值,可使用index=”0,2″來標示

index='2' 改找到的第3個
0的結果是 只改第1個找到的

同一檔改2段要這樣寫,你只寫一個的話,第2段不會執行

<?xml version="1.0" encoding="utf-8"?>
<modification>
    <name>自寫關閉預設會員註冊功能</name>
    <version>2.4</version>
    <link> </link>
    <author><![CDATA[SuffixBig suffixbig@gmail.com]]></author>
    <code>shutdown_accountregister2</code>
    <!--註解:修改檔案-->
    <file path="catalog/view/theme/*/template/account/register.tpl">
        <operation>
            <search><![CDATA[<h1><?php echo $heading_title; ?></h1>]]></search>
            <add position="replace"><![CDATA[
            <!--<h1><?php echo $heading_title; ?></h1>
            ]]></add>
        </operation>
        <operation>           
            <search><![CDATA[<?php echo $content_bottom; ?></div>]]></search>
            <add position="replace"><![CDATA[
      <?php echo $content_bottom; ?>--></div>
            ]]></add>
        </operation>
    </file>
</modification>

加到檔案頭或檔案尾端 怎加

VQMOD 很簡單 OCMOD 沒有 top, bottom 指令可用

position=」top「 (位置為頂部)和偏移為3行。找到【$var = 『123』;】的位置從頂部向下偏移3行的頂部
position=」bottom「 (位置為底部)和偏移為3行。找到【$var = 『123』;】的位置從底部上方3行文件的底部

        <search position="top">
        <![CDATA[
        
        ]]>
        </search>
        <add>

OCMOD 是簡化版的 VQMOD. 主要區別:
保留了 Replace, Before, After, Regex, Offset, Limit, ignoreif, error
去掉了 Attributes top, bottom, ibefore, iafter
所以沒有 top, bottom 可用,那怎麼辦.....作者確實就是把 這2個指令刪了,所以我也沒辦法,也只好用找字串取代方法。

另外,我一直查不到這套OCMOD搜尋系統的換行要怎樣打, 試過 \r\n 和\n 都不對,如果有高手知道,麻煩請告訴我。

還有OCMOD 不支援此種寫法,修改我選擇的-部分檔案修改

<file error="skip" path="admin/controller/*/" path="product.php,category.php,filter.php,information.php,option.php,recurring.php,attribute.php,attribute_group.php,download.php,weight_class.php,length_class.php,custom_field.php,customer_group.php,voucher_theme.php,custom_field.php,customer_group.php">

讓人很頭痛,有解的高手 可以 告訴我該怎辦

2017-12-25 結果又是我自己查出來該怎麼寫的,改成以下寫法就好了。

<file path="admin/controller/*/{product,category,filter,information,option,recurring,attribute,attribute_group,download,weight_class,length_class,custom_field,customer_group,voucher_theme,custom_field,customer_group}*.php">

上一篇
第2天-OpenCart_131張資料表數據字典
下一篇
第4天-WordPress Captcha外掛遭爆有後門,我們來談OC系統有無後門
系列文
一天介紹1個,開源購物車系統OPENCART的擴充插件33
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言