Magento: chỉ gửi Email đơn hàng mới với cronjobs


11

Làm cách nào tôi có thể gửi Email mới bằng cách sử dụng:

$order->sendNewOrderEmail();

chỉ từ một cronjob được sử dụng trong Mô-đun tùy chỉnh của tôi.

Cảm ơn vì sự giúp đỡ.

Câu trả lời:


8

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 ().


Thiên tài. Tinh khiết, không pha trộn, thiên tài.
philwinkle

1
nịnh hót sẽ đưa bạn đến mọi nơi ;-)
Kristof tại Fooman

3

Bản chất của việc thực hiện loại thay đổi (triệt để) này là như sau:

  • Viết lại sendNewOrderEmail để hoạt động như một hàng đợi và gửi / không gửi một cách có điều kiện dựa trên chế độ hàng đợi (xem một số mã giả bên dưới)
  • Dựa trên chế độ hàng đợi của mô hình đơn hàng, chúng tôi gửi email từ hàng đợi bằng cách tải đơn hàng từ công việc định kỳ và gửi email theo cách thủ công.

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_queuevà 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!


Điều này được đánh giá quá cao so với giải pháp của @ fooman và tôi thích anh ấy hơn tôi :)
philwinkle
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.