Câu trả lời:
Tôi sẽ vô hiệu hóa System > Configuration > Sales Email > Order > Enabled
điều này đảm bảo rằng trong quá trình thực thi bình thường, nó không được gửi
public function sendNewOrderEmail()
{
$storeId = $this->getStore()->getId();
if (!Mage::helper('sales')->canSendNewOrderEmail($storeId)) {
return $this;
}
Sau đó, trong mô-đun tùy chỉnh của bạn bao gồm một cái gì đó như
Mage::getConfig()->setNode(
'default/'.Mage_Sales_Model_Order::XML_PATH_EMAIL_ENABLED, true
);
foreach(Mage::app()->getStores() as $storeCode=>$store){
Mage::getConfig()->setNode(
"stores/{$storeCode}/".Mage_Sales_Model_Order::XML_PATH_EMAIL_ENABLED, true
);
}
$collection = Mage::getModel('sales/order')->getCollection()->addAttributeToFilter('email_sent', 0);
foreach ($collection as $order){
$order->sendNewOrderEmail();
}
Ý tưởng chính là ghi đè giá trị cấu hình bị vô hiệu hóa trong thời gian chạy. Mã không được kiểm tra nhưng sẽ cung cấp cho bạn một điểm khởi đầu. Khuyến nghị đọc thêm từ blog của Alan: http://alanstorm.com/magento_loading_config_variables http://alanstorm.com/magento_config_a_critique_and_caching
Một vấn đề mà bạn có thể gặp phải là giá trị được lưu trong bộ nhớ cache ở trên.
Tùy chọn thứ hai sẽ là sao chép mã từ sendNewOrderEmail ().
Bản chất của việc thực hiện loại thay đổi (triệt để) này là như sau:
Một số mã mẫu cho mô hình đặt hàng bán lại viết lại:
Đoạn mã sau sẽ phụ thuộc vào sự hiện diện của một bảng được gọi yourmodule_sales_email_queue
và tôi sẽ tham khảo một số cột có ma thuật. Tôi sẽ không cung cấp một lược đồ vì đây không phải là mã đầy đủ chức năng và là loại bằng chứng của khái niệm; không phải là một mô-đun làm việc.
Thêm phần này vào etc / config.xml của mô-đun của bạn :
<global>
<model>
<emailqueue>
<class>YourCompany_YourModule_Model</class>
<resourceModel>emailqueue_resource</resourceModel>
</emailqueue>
<emailqueue_resource>
<class>YourCompany_YourModule_Model_Resource</class>
<entities>
<queue>
<table>yourmodule_sales_email_queue</table>
</queue>
</entities>
</emailqueue_resource>
<sales>
<rewrite>
<order>YourCompany_YourModule_Model_Order</order>
</rewrite>
</sales>
</model>
</global>
ứng dụng / mã / cục bộ / YourCompany / YourModule / Model / Order.php
<?php
class YourCompany_YourModule_Model_Order extends Mage_Sales_Model_Order
{
protected $_isQueueMode = false;
public function sendNewOrderEmail()
{
//send order email if our custom queue mode is set
if($this->_isQueueMode){
parent::sendNewOrderEmail();
return;
}
//not running from queue, let's shove stuff into the queue
$this->getEmailQueue()->load($this)->save();
}
public function getEmailQueue()
{
if(!isset($this->queue)){
$this->queue = $this->_getEmailQueue();
}
return $this->queue;
}
protected function _getEmailQueue()
{
return Mage::getResourceModel('emailqueue/queue');
}
}
Từ đó bạn cần xác định một mô hình tài nguyên, một bộ sưu tập và một nhân viên cron.
Định nghĩa cron trong etc / config.xml sẽ trông giống như thế này:
<crontab>
<jobs>
<emailqueue_send_order_emails>
<schedule>
<cron_expr>0 0 * * *</cron_expr>
</schedule>
<run>
<model>emailqueue/observer::sendEmailsFromQueue</model>
</run>
</emailqueue_send_order_emails>
</jobs>
</crontab>
Mà gọi một phương thức từ lớp YourCompany_YourModule_Model_Observer
. Chúng tôi sẽ tải 24 giờ cuối cùng của email từ hàng đợi, tải lên thứ tự liên quan và đặt cờ để cho phép nó gửi email. Sau đó, chúng tôi sẽ gọi phương thức gửi email:
<?php
class YourCompany_YourModule_Model_Observer
{
public function sendEmailsFromQueue($observer)
{
//load queue and define the run window
$queue = Mage::getModel('emailqueue/queue')->getCollection()->getSelect()
->where('created_at',array('lt'=>Zend_Db_Expr('NOW()')))
->where('created_at',array('gt'=>Zend_Db_Expr('NOW() - INTERVAL 24 HOUR')));
foreach($queue as $worker){
//logic to send the email e.g.:
$order = Mage::getModel('sales/order')->loadByIncrementId($worker->getOrderIncrementId());
$order->_isQueueMode = true;
$order->sendNewOrderEmail();
}
}
}
Tuyên bố từ chối trách nhiệm:
Lưu ý rằng đoạn mã trên không được kiểm tra và sẽ không tự hoạt động . Nó hy vọng rất nhiều chức năng (như bộ sưu tập) tồn tại. Tôi cũng đã viết nó trên đầu và có thể có sự không nhất quán , vì tôi đã thay đổi suy nghĩ về cách tôi sẽ xử lý việc này một hoặc hai lần kể từ khi bắt đầu câu trả lời này.
Điều này có nghĩa là để giúp bạn khởi động và suy nghĩ về cách bạn sẽ thực hiện điều này. Tôi sẵn sàng trả lời bất kỳ câu hỏi nào bạn có thể có. Tôi cũng sẵn sàng đóng góp trên Github cho phiên bản nguồn mở của loại mô-đun này.
May mắn nhất!