जवाबों:
मैं निष्क्रिय कर दूंगा System > Configuration > Sales Email > Order > Enabled
यह सुनिश्चित करता है कि सामान्य निष्पादन के दौरान इसे नहीं भेजा जाए
public function sendNewOrderEmail()
{
$storeId = $this->getStore()->getId();
if (!Mage::helper('sales')->canSendNewOrderEmail($storeId)) {
return $this;
}
फिर अपने कस्टम मॉड्यूल में कुछ ऐसा शामिल है
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();
}
रनटाइम पर अक्षम कॉन्फ़िगरेशन मान को ओवरराइड करने का मुख्य विचार। कोड का परीक्षण नहीं किया गया है लेकिन आपको एक प्रारंभिक बिंदु देना चाहिए। एलन के ब्लॉग से आगे पढ़ने की सिफारिश की गई: http://alanstorm.com/magento_loading_config_variables http://alanstorm.com/magento_config_a_critique_and_caching
एक मुद्दा जो आपके सामने आ सकता है, वह उपरोक्त के लिए कैश्ड मान है।
दूसरा विकल्प sendNewOrderEmail () से कोड को डुप्लिकेट करना होगा।
इस तरह के (कट्टरपंथी) परिवर्तन करने का सार निम्नलिखित है:
बिक्री आदेश मॉडल के लिए कुछ नमूना कोड फिर से लिखना:
निम्न कोड नामक तालिका की उपस्थिति पर निर्भर करेगा yourmodule_sales_email_queue
और मैं जादू पाने वालों के साथ कुछ स्तंभों को संदर्भित करूंगा। मैं एक स्कीमा प्रदान नहीं करने जा रहा हूँ क्योंकि यह पूरी तरह कार्यात्मक कोड नहीं है और अवधारणा के प्रमाण की तरह है; काम करने वाला मॉड्यूल नहीं।
इसे अपने मॉड्यूल इत्यादि में जोड़ें / 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>
एप्लिकेशन / कोड / स्थानीय / आपकी कंपनी / YourModule / मॉडल / 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');
}
}
वहां से आपको एक संसाधन मॉडल, एक संग्रह और एक क्रोन कार्यकर्ता को परिभाषित करने की आवश्यकता है।
Etc / config.xml में क्रोन परिभाषा कुछ इस तरह दिखाई देगी:
<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>
जो कक्षा से एक विधि का आह्वान करता है YourCompany_YourModule_Model_Observer
। हम कतार से अंतिम 24 घंटे के ईमेल लोड करेंगे, संबंधित ऑर्डर को लोड करेंगे और ईमेल भेजने की अनुमति देने के लिए ध्वज सेट करेंगे। फिर हम ईमेल भेजने की विधि लागू करेंगे:
<?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();
}
}
}
अस्वीकरण:
ध्यान दें कि उपरोक्त कोड का परीक्षण नहीं किया गया है और यह अपने आप काम नहीं करेगा । यह बहुत अधिक कार्यक्षमता (जैसे संग्रह) मौजूद होने की उम्मीद करता है। मैंने इसे टॉप-ऑफ़-माइंड भी लिखा है और इसमें असंगतताएं हो सकती हैं , जैसा कि मैंने इस जवाब को शुरू करने के बाद एक या दो बार इसे कैसे हैंडल किया है, इस पर मैंने अपना दिमाग बदल दिया है।
यह आपको किक-स्टार्ट करने के लिए है और यह सोचने के लिए कि आप इसे कैसे पूरा करेंगे। मैं आपके किसी भी प्रश्न का उत्तर देने के लिए तैयार हूं। मैं इस प्रकार के मॉड्यूल के ओपन-सोर्स संस्करण में जीथब पर योगदान करने के लिए भी तैयार हूं।
शुभकामनाएँ!