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 的動作了。
MarTech 行銷科技洞察社團 - GA4、SEO、GTM、Search Console、Looker Studio、社群、內容、廣告
OpenCart 台灣技術支援 - OpenCart 網站代管、客製、維護
OpenCart 台灣電商社團 - 台灣 OpenCart 使用者交流
=====================================================