OpenCart 後台的訂單編輯功能,其實也是呼叫與前台正常購物的訂單處理機制相同的程式,所以在後台編輯訂單之後,一樣會發送一封訂單成立的 email 通知給客戶,但 OpenCart 並沒有提供取消後台訂單編輯後的 email 通知,如果要取消,必須修改程式。
OpenCart 的系統架構是屬於 MVC 的架構,C 是 Controller,主導程式的流程,M 是 Model,負責處理資料庫的存取含觸發 Email 的發送,前端客戶下單與後台訂單編輯,使用的是 2 組不同的 Controller 程式,但是要寫入訂單資料到資料庫時,叫用的是同一組 Model 程式,所以要讓 Model 對不同來源的 Controller 做不同的控制(後端呼叫時不發 email),必須先讓 Model 有能力辨別是來自前端還是後端的呼叫。
未修改前的程式,是無法在 Model 辨識呼叫的是前端還是後端,所以我們首先要修改的是後端編輯訂單的 Controller,想辦法在呼叫 Model 時的參數動手腳,要修改程式的程式片段如下 (order.php):
$this->model_checkout_order->addOrderHistory($order_id, $order_status_id);
在這裡呼叫 addOrderHistory 所帶的參數只有 2 個參數,但其實 addOrderHistory 這支 Model 是可以接收 4 個參數的,包括第 3 個參數 $comment,與第 4 個參數 $notify,因為在後台編輯訂單時不會用到後面 2 個參數,所以這裡的程式只有帶 2 個參數,讓其他後 2 個參數使用 Model 的預設值。
只要確定沒有其他的 extension 也會在這裡額外利用了這 2 個參數,我們就可以透過第 3 或第 4 個參數,帶入一個特別的標示,然後再到 addOrderHistory 所觸發的 Mail Event 去判斷是否含有這個 特別的標示,就能決定是否取消發送 Email 的動作了。
參考資源
電商系統工程筆記 https://24cc.com/
台灣電商社團 https://www.twec.org/
台灣電商 FB 社團 https://www.facebook.com/groups/opencart.taiwan/
OpenCart 網站代管、客製、維護 https://www.osec.tw/
OpenCart 台灣電商技術支援粉絲頁 https://www.facebook.com/ntcart/
OpenCart 台灣優化版專頁 https://www.osec.tw/opencart.html
OpenCart 台灣中文用戶討論區 https://www.ntcart.com/
不建議後台改訂單
直接幫客戶重新下單
舊單取消作廢
這樣好一點
有些情境,不能隨便刪除已存在的訂單,例如已線上支付、或串接美安。
我的意思是 .... 訂單狀態改成取消 (等同作廢)