取消 OpenCart 後台訂單編輯後的客戶 Email 通知

OpenCart 後台的訂單編輯功能,有一部分,其實也是呼叫與前台正常購物的訂單處理機制相同的程式,所以在後台編輯訂單之後,一樣會發送一封訂單成立的 email 通知給客戶,但並不是每位商家都想要在這時候發 email 通知客戶,可是 OpenCart 並沒有提供取消後台訂單編輯後的 email 通知,如果要取消,必須修改程式。

OpenCart 的系統架構是屬於 MVC 的架構,C 是 Controller 指控制器,主導程式的流程,M 是 Model 指模型,負責處理資料庫的存取含觸發 Email 的發送,前端客戶下單與後台訂單編輯,使用的是 2 組不同的 Controller 程式,但是要寫入訂單資料到資料庫時,叫用的是同一組 Model 程式,所以要讓 Model 對不同來源的 Controller 做不同的控制(後端呼叫時不發 email),必須先讓 Model 有能力辨別是來自前端還是後端的呼叫。

未修改前的程式,是無法在 Model 辨識呼叫的是前端還是後端,所以我們首先要修改的是後端編輯訂單的 Controller,想辦法在呼叫 Model 時的參數動手腳,程式片段如下 :

$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 的動作了。