Magento: kirim Email Orde Baru hanya dengan cronjobs

11

Bagaimana saya bisa mengirim Email pesanan baru menggunakan:

$order->sendNewOrderEmail();

hanya dari cronjob yang digunakan dalam Modul khusus saya.

Terimakasih atas bantuannya.

Bizboss
sumber

Jawaban:

8

Saya akan menonaktifkan System > Configuration > Sales Email > Order > Enabled

ini memastikan bahwa selama eksekusi normal itu tidak terkirim

public function sendNewOrderEmail()
{
    $storeId = $this->getStore()->getId();

    if (!Mage::helper('sales')->canSendNewOrderEmail($storeId)) {
        return $this;
    }

Kemudian di modul khusus Anda sertakan sesuatu seperti

    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();
    }

Gagasan utamanya adalah mengganti nilai konfigurasi yang dinonaktifkan pada saat runtime. Kode tidak diuji tetapi harus memberi Anda titik awal. Bacaan lebih lanjut disarankan dari blog Alan: http://alanstorm.com/magento_loading_config_variables http://alanstorm.com/magento_config_a_critique_and_caching

Satu masalah yang mungkin Anda temui adalah nilai cache untuk di atas.

Opsi kedua adalah menggandakan kode dari sendNewOrderEmail ().

Kristof di Fooman
sumber
Jenius. Murni, tidak tercemar, jenius.
philwinkle
1
sanjungan akan membuat Anda ke mana-mana ;-)
Kristof di Fooman
3

Inti dari melakukan perubahan (radikal) semacam ini adalah sebagai berikut:

  • Tulis ulang sendNewOrderEmail untuk bertindak sebagai antrian dan mengirim / tidak mengirim dengan syarat berdasarkan mode antrian (lihat beberapa kode semu di bawah ini)
  • Berdasarkan mode antrian dari model pesanan penjualan, kami mengirim email dari antrian dengan memuat pesanan dari pekerjaan cron dan mengirimkan email secara manual.

Beberapa kode sampel untuk model pesanan penjualan ditulis ulang:

Kode berikut akan tergantung pada keberadaan tabel yang dipanggil yourmodule_sales_email_queuedan saya akan merujuk beberapa kolom dengan pengambil sihir. Saya tidak akan memberikan skema karena ini bukan kode yang berfungsi penuh dan merupakan semacam bukti konsep; bukan modul kerja.

Tambahkan ini ke modul Anda etc / config.xml :

<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>

app / code / local / 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');
    }


}

Dari sana Anda perlu mendefinisikan model sumber daya, koleksi, dan pekerja cron.

Definisi cron di etc / config.xml akan terlihat seperti ini:

<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>

Yang memanggil metode dari kelas YourCompany_YourModule_Model_Observer. Kami akan memuat 24 jam email terakhir dari antrian, memuat pesanan yang terkait, dan mengatur tanda untuk mengizinkannya mengirim email. Kemudian kami akan meminta metode pengiriman 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();
        }

    }
}

Penolakan:

Perhatikan bahwa kode di atas tidak diuji dan tidak akan bekerja sendiri. Itu mengharapkan banyak fungsi (seperti koleksi) ada. Saya juga menulisnya dengan top-of-mind dan mungkin ada inkonsistensi , karena saya telah berubah pikiran tentang bagaimana saya akan menangani ini satu atau dua kali sejak memulai jawaban ini.

Ini dimaksudkan untuk membantu Anda memulai dan berpikir tentang bagaimana Anda akan mencapai ini. Saya bersedia menjawab pertanyaan yang mungkin Anda miliki. Saya juga bersedia berkontribusi pada Github ke versi open-source dari modul jenis ini.

Semoga berhasil!

Philwinkle
sumber
Ini overengineered dibandingkan dengan solusi @ fooman dan saya lebih suka dia daripada saya :)
philwinkle