Jawaban:
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 ().
Inti dari melakukan perubahan (radikal) semacam ini adalah sebagai berikut:
Beberapa kode sampel untuk model pesanan penjualan ditulis ulang:
Kode berikut akan tergantung pada keberadaan tabel yang dipanggil yourmodule_sales_email_queue
dan 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!